blob: 58525a5d7ea7ff030abc809101bde7805ff7917d [file] [log] [blame]
# 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)])