|  | # Copyright 2023 The Bazel Authors. All rights reserved. | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | # https://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  | """Utility methods for turning package metadata to JSON. | 
|  |  | 
|  | These should eventually be part of rules_license. | 
|  | """ | 
|  |  | 
|  | def _strip_null_repo(label): | 
|  | """Removes the null repo name (e.g. @//) from a string. | 
|  |  | 
|  | The is to make str(label) compatible between bazel 5.x and 6.x | 
|  | """ | 
|  | s = str(label) | 
|  | if s.startswith("@//"): | 
|  | return s[1:] | 
|  | elif s.startswith("@@//"): | 
|  | return s[2:] | 
|  | return s | 
|  |  | 
|  | def _bazel_package(label): | 
|  | """Returns the package containing a label.""" | 
|  | clean_label = _strip_null_repo(label) | 
|  | return clean_label[0:-(len(label.name) + 1)] | 
|  |  | 
|  | _license_template = """{{ | 
|  | "label": "{label}", | 
|  | "bazel_package": "{bazel_package}", | 
|  | "license_kinds": [{kinds}], | 
|  | "copyright_notice": "{copyright_notice}", | 
|  | "package_name": "{package_name}", | 
|  | "package_url": "{package_url}", | 
|  | "package_version": "{package_version}", | 
|  | "license_text": "{license_text}" | 
|  | }}""" | 
|  |  | 
|  | _kind_template = """{{ | 
|  | "target": "{kind_path}", | 
|  | "name": "{kind_name}", | 
|  | "conditions": {kind_conditions} | 
|  | }}""" | 
|  |  | 
|  | def license_info_to_json(license): | 
|  | """Converts a LicenseInfo to JSON. | 
|  |  | 
|  | Args: | 
|  | license: a LicenseInfo | 
|  | Returns: | 
|  | JSON representation of license. | 
|  | """ | 
|  | kinds = [] | 
|  | for kind in sorted(license.license_kinds, key = lambda x: x.name): | 
|  | kinds.append(_kind_template.format( | 
|  | kind_name = kind.name, | 
|  | kind_path = kind.label, | 
|  | kind_conditions = kind.conditions, | 
|  | )) | 
|  |  | 
|  | return _license_template.format( | 
|  | copyright_notice = license.copyright_notice, | 
|  | kinds = ",".join(kinds), | 
|  | license_text = license.license_text.path, | 
|  | package_name = license.package_name, | 
|  | package_url = license.package_url, | 
|  | package_version = license.package_version, | 
|  | label = _strip_null_repo(license.label), | 
|  | bazel_package = _bazel_package(license.label), | 
|  | ) | 
|  |  | 
|  | def licenses_to_json(licenses): | 
|  | """Converts a list of LicenseInfo to JSON. | 
|  |  | 
|  | This list is sorted by label for stability. | 
|  |  | 
|  | Args: | 
|  | licenses: list(LicenseInfo) | 
|  | Returns: | 
|  | JSON representation of licenses | 
|  | """ | 
|  | all_licenses = [] | 
|  | for license in sorted(licenses.to_list(), key = lambda x: x.label): | 
|  | all_licenses.append(license_info_to_json(license)) | 
|  | return "[" + ",".join(all_licenses) + "]" | 
|  |  | 
|  | _package_info_template = """{{ | 
|  | "target": "{label}", | 
|  | "bazel_package": "{bazel_package}", | 
|  | "package_name": "{package_name}", | 
|  | "package_url": "{package_url}", | 
|  | "package_version": "{package_version}" | 
|  | }}""" | 
|  |  | 
|  | def package_info_to_json(package_info): | 
|  | """Converts a PackageInfo to json. | 
|  |  | 
|  | Args: | 
|  | package_info: a PackageInfo | 
|  | Returns: | 
|  | JSON representation of package_info. | 
|  | """ | 
|  | return _package_info_template.format( | 
|  | label = _strip_null_repo(package_info.label), | 
|  | bazel_package = _bazel_package(package_info.label), | 
|  | package_name = package_info.package_name, | 
|  | package_url = package_info.package_url, | 
|  | package_version = package_info.package_version, | 
|  | ) | 
|  |  | 
|  | def package_infos_to_json(packages): | 
|  | """Converts a list of PackageInfo to JSON. | 
|  |  | 
|  | This list is sorted by label for stability. | 
|  |  | 
|  | Args: | 
|  | packages: list(PackageInfo) | 
|  | Returns: | 
|  | JSON representation of packages. | 
|  | """ | 
|  | all_packages = [] | 
|  | for package in sorted(packages.to_list(), key = lambda x: x.label): | 
|  | all_packages.append(package_info_to_json(package)) | 
|  | return "[" + ",".join(all_packages) + "]" | 
|  |  | 
|  | def labels_to_json(labels): | 
|  | """Converts a list of Labels to JSON. | 
|  |  | 
|  | This list is sorted for stability. | 
|  |  | 
|  | Args: | 
|  | labels: list(Label) | 
|  | Returns: | 
|  | JSON representation of the labels. | 
|  | """ | 
|  | return "[%s]" % ",".join(['"%s"' % _strip_null_repo(label) for label in sorted(labels)]) |