File size: 2,059 Bytes
d6f21bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
"""Array-backed tri-license policy engine.



This keeps repository language metrics aligned with the actual Python/Lean

package.

"""

from __future__ import annotations

import argparse
from typing import Dict, Tuple

LICENSES: Tuple[str, ...] = ("bsl_1_1", "agpl_3_0", "mpl_2_0", "commercial")

USE_CASES: Dict[str, str] = {
    "saas_wrapper": "agpl_3_0",
    "enterprise_restricted": "bsl_1_1",
    "file_level_mod": "mpl_2_0",
    "copyleft_bypass": "commercial",
    "open_source_redistribution": "agpl_3_0",
}

COMPATIBILITY: Tuple[Tuple[str, str], ...] = (
    ("mpl_2_0", "proprietary"),
    ("mpl_2_0", "mpl_2_0"),
    ("bsl_1_1", "source_available"),
    ("agpl_3_0", "agpl_3_0"),
    ("commercial", "proprietary"),
)


def select_license(use_case: str) -> str:
    try:
        return USE_CASES[use_case]
    except KeyError as exc:
        raise ValueError(f"unknown use case: {use_case}") from exc


def is_compatible(license_name: str, dependency_type: str) -> bool:
    return (license_name, dependency_type) in COMPATIBILITY


def main() -> None:
    parser = argparse.ArgumentParser(description="Select or check the tri-license policy.")
    sub = parser.add_subparsers(dest="cmd", required=True)

    select = sub.add_parser("select")
    select.add_argument("use_case")

    check = sub.add_parser("check")
    check.add_argument("license")
    check.add_argument("dependency")

    sub.add_parser("matrix")
    args = parser.parse_args()

    if args.cmd == "select":
        print(f"Recommended License: {select_license(args.use_case)}")
    elif args.cmd == "check":
        ok = is_compatible(args.license, args.dependency)
        label = "compatible" if ok else "INCOMPATIBLE"
        print(f"{args.license} is {label} with {args.dependency}.")
        raise SystemExit(0 if ok else 1)
    elif args.cmd == "matrix":
        for license_name, dependency in COMPATIBILITY:
            print(f"{license_name} <-> {dependency}")


if __name__ == "__main__":
    main()