91 lines
3.2 KiB
Python
91 lines
3.2 KiB
Python
# Copyright 2020 Google LLC
|
|
#
|
|
# 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.
|
|
|
|
"""License compliance checking at analysis time."""
|
|
|
|
load(
|
|
"@rules_license//examples/policy_checker:license_policy_provider.bzl",
|
|
"LicensePolicyInfo",
|
|
)
|
|
load(
|
|
"@rules_license//rules:gather_licenses_info.bzl",
|
|
"gather_licenses_info",
|
|
)
|
|
load("@rules_license//rules:providers.bzl", "LicenseInfo")
|
|
load("@rules_license//rules/private:gathering_providers.bzl", "TransitiveLicensesInfo")
|
|
|
|
# This is a crude example of the kind of thing which can be done.
|
|
def _license_policy_check_impl(ctx):
|
|
policy = ctx.attr.policy[LicensePolicyInfo]
|
|
allowed_conditions = policy.conditions
|
|
if TransitiveLicensesInfo in ctx.attr.target:
|
|
for license in ctx.attr.target[TransitiveLicensesInfo].licenses.to_list():
|
|
for kind in license.license_kinds:
|
|
# print(kind.conditions)
|
|
for condition in kind.conditions:
|
|
if condition not in allowed_conditions:
|
|
fail("Condition %s violates policy %s" % (
|
|
condition,
|
|
policy.label,
|
|
))
|
|
|
|
if LicenseInfo in ctx.attr.target:
|
|
for license in ctx.attr.target[LicenseInfo].licenses.to_list():
|
|
for kind in license.license_kinds:
|
|
# print(kind.conditions)
|
|
for condition in kind.conditions:
|
|
if condition not in allowed_conditions:
|
|
fail("Condition %s violates policy %s" % (
|
|
condition,
|
|
policy.label,
|
|
))
|
|
return [DefaultInfo()]
|
|
|
|
_license_policy_check = rule(
|
|
implementation = _license_policy_check_impl,
|
|
doc = """Internal implementation method for license_policy_check().""",
|
|
attrs = {
|
|
"policy": attr.label(
|
|
doc = """Policy definition.""",
|
|
mandatory = True,
|
|
providers = [LicensePolicyInfo],
|
|
),
|
|
"target": attr.label(
|
|
doc = """Target to collect LicenseInfo for.""",
|
|
aspects = [gather_licenses_info],
|
|
mandatory = True,
|
|
allow_single_file = True,
|
|
),
|
|
},
|
|
)
|
|
|
|
def license_policy_check(name, target, policy, **kwargs):
|
|
"""Checks a target against a policy.
|
|
|
|
Args:
|
|
name: The target.
|
|
target: A target to test for compliance with a policy
|
|
policy: A rule providing LicensePolicyInfo.
|
|
**kwargs: other args.
|
|
|
|
Usage:
|
|
|
|
license_policy_check(
|
|
name = "license_info",
|
|
target = ":my_app",
|
|
policy = "//my_org/compliance/policies:mobile_application",
|
|
)
|
|
"""
|
|
_license_policy_check(name = name, target = target, policy = policy, **kwargs)
|