1*f578df4fSJingwen Chen# Copyright 2022 Google LLC 2*f578df4fSJingwen Chen# 3*f578df4fSJingwen Chen# Licensed under the Apache License, Version 2.0 (the "License"); 4*f578df4fSJingwen Chen# you may not use this file except in compliance with the License. 5*f578df4fSJingwen Chen# You may obtain a copy of the License at 6*f578df4fSJingwen Chen# 7*f578df4fSJingwen Chen# https://www.apache.org/licenses/LICENSE-2.0 8*f578df4fSJingwen Chen# 9*f578df4fSJingwen Chen# Unless required by applicable law or agreed to in writing, software 10*f578df4fSJingwen Chen# distributed under the License is distributed on an "AS IS" BASIS, 11*f578df4fSJingwen Chen# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*f578df4fSJingwen Chen# See the License for the specific language governing permissions and 13*f578df4fSJingwen Chen# limitations under the License. 14*f578df4fSJingwen Chen"""Rules for declaring metadata about a package.""" 15*f578df4fSJingwen Chen 16*f578df4fSJingwen Chenload( 17*f578df4fSJingwen Chen "@rules_license//rules:providers.bzl", 18*f578df4fSJingwen Chen "ExperimentalMetadataInfo", 19*f578df4fSJingwen Chen "PackageInfo", 20*f578df4fSJingwen Chen) 21*f578df4fSJingwen Chen 22*f578df4fSJingwen Chen# 23*f578df4fSJingwen Chen# package_info() 24*f578df4fSJingwen Chen# 25*f578df4fSJingwen Chen 26*f578df4fSJingwen Chendef _package_info_impl(ctx): 27*f578df4fSJingwen Chen provider = PackageInfo( 28*f578df4fSJingwen Chen # Metadata providers must include a type discriminator. We don't need it 29*f578df4fSJingwen Chen # to collect the providers, but we do need it to write the JSON. We 30*f578df4fSJingwen Chen # key on the type field to look up the correct block of code to pull 31*f578df4fSJingwen Chen # data out and format it. We can't to the lookup on the provider class. 32*f578df4fSJingwen Chen type = "package_info", 33*f578df4fSJingwen Chen label = ctx.label, 34*f578df4fSJingwen Chen package_name = ctx.attr.package_name or ctx.build_file_path.rstrip("/BUILD"), 35*f578df4fSJingwen Chen package_url = ctx.attr.package_url, 36*f578df4fSJingwen Chen package_version = ctx.attr.package_version, 37*f578df4fSJingwen Chen ) 38*f578df4fSJingwen Chen # Experimental alternate design, using a generic 'data' back to hold things 39*f578df4fSJingwen Chen generic_provider = ExperimentalMetadataInfo( 40*f578df4fSJingwen Chen type = "package_info_alt", 41*f578df4fSJingwen Chen label = ctx.label, 42*f578df4fSJingwen Chen data = { 43*f578df4fSJingwen Chen "package_name": ctx.attr.package_name or ctx.build_file_path.rstrip("/BUILD"), 44*f578df4fSJingwen Chen "package_url": ctx.attr.package_url, 45*f578df4fSJingwen Chen "package_version": ctx.attr.package_version 46*f578df4fSJingwen Chen } 47*f578df4fSJingwen Chen ) 48*f578df4fSJingwen Chen return [provider, generic_provider] 49*f578df4fSJingwen Chen 50*f578df4fSJingwen Chen_package_info = rule( 51*f578df4fSJingwen Chen implementation = _package_info_impl, 52*f578df4fSJingwen Chen attrs = { 53*f578df4fSJingwen Chen "package_name": attr.string( 54*f578df4fSJingwen Chen doc = "A human readable name identifying this package." + 55*f578df4fSJingwen Chen " This may be used to produce an index of OSS packages used by" + 56*f578df4fSJingwen Chen " an applicatation.", 57*f578df4fSJingwen Chen ), 58*f578df4fSJingwen Chen "package_url": attr.string( 59*f578df4fSJingwen Chen doc = "The URL this instance of the package was download from." + 60*f578df4fSJingwen Chen " This may be used to produce an index of OSS packages used by" + 61*f578df4fSJingwen Chen " an applicatation.", 62*f578df4fSJingwen Chen ), 63*f578df4fSJingwen Chen "package_version": attr.string( 64*f578df4fSJingwen Chen doc = "A human readable version string identifying this package." + 65*f578df4fSJingwen Chen " This may be used to produce an index of OSS packages used" + 66*f578df4fSJingwen Chen " by an applicatation. It should be a value that" + 67*f578df4fSJingwen Chen " increases over time, rather than a commit hash." 68*f578df4fSJingwen Chen ), 69*f578df4fSJingwen Chen }, 70*f578df4fSJingwen Chen) 71*f578df4fSJingwen Chen 72*f578df4fSJingwen Chen# buildifier: disable=function-docstring-args 73*f578df4fSJingwen Chendef package_info( 74*f578df4fSJingwen Chen name, 75*f578df4fSJingwen Chen package_name = None, 76*f578df4fSJingwen Chen package_url = None, 77*f578df4fSJingwen Chen package_version = None, 78*f578df4fSJingwen Chen **kwargs): 79*f578df4fSJingwen Chen """Wrapper for package_info rule. 80*f578df4fSJingwen Chen 81*f578df4fSJingwen Chen @wraps(_package_info) 82*f578df4fSJingwen Chen 83*f578df4fSJingwen Chen Args: 84*f578df4fSJingwen Chen name: str target name. 85*f578df4fSJingwen Chen package_name: str A human readable name identifying this package. This 86*f578df4fSJingwen Chen may be used to produce an index of OSS packages used by 87*f578df4fSJingwen Chen an application. 88*f578df4fSJingwen Chen package_url: str The canoncial URL this package distribution was retrieved from. 89*f578df4fSJingwen Chen Note that, because of local mirroring, that might not be the 90*f578df4fSJingwen Chen physical URL it was retrieved from. 91*f578df4fSJingwen Chen package_version: str A human readable name identifying version of this package. 92*f578df4fSJingwen Chen kwargs: other args. Most are ignored. 93*f578df4fSJingwen Chen """ 94*f578df4fSJingwen Chen visibility = kwargs.get("visibility") or ["//visibility:public"] 95*f578df4fSJingwen Chen _package_info( 96*f578df4fSJingwen Chen name = name, 97*f578df4fSJingwen Chen package_name = package_name, 98*f578df4fSJingwen Chen package_url = package_url, 99*f578df4fSJingwen Chen package_version = package_version, 100*f578df4fSJingwen Chen applicable_licenses = [], 101*f578df4fSJingwen Chen visibility = visibility, 102*f578df4fSJingwen Chen tags = [], 103*f578df4fSJingwen Chen testonly = 0, 104*f578df4fSJingwen Chen ) 105