55from inspect import cleandoc
66from json import loads
77
8+ from pydantic import field_validator
9+
810from exasol .toolbox .util .dependencies .poetry_dependencies import (
911 PoetryDependency ,
1012)
1113from exasol .toolbox .util .dependencies .shared_models import Package
1214
15+ LICENSE_MAPPING_TO_ABBREVIATION = {
16+ "BSD License" : "BSD" ,
17+ "MIT License" : "MIT" ,
18+ "The Unlicensed (Unlicensed)" : "Unlicensed" ,
19+ "Mozilla Public License 2.0 (MPL 2.0)" : "MPLv2" ,
20+ "GNU General Public License (GPL)" : "GPL" ,
21+ "GNU Lesser General Public License v2 (LGPLv2)" : "LGPLv2" ,
22+ "GNU General Public License v2 (GPLv2)" : "GPLv2" ,
23+ "GNU General Public License v2 or later (GPLv2+)" : "GPLv2+" ,
24+ "GNU General Public License v3 (GPLv3)" : "GPLv3" ,
25+ "Apache Software License" : "Apache" ,
26+ }
27+
28+ LICENSE_MAPPING_TO_URL = {
29+ "GPLv1" : "https://www.gnu.org/licenses/old-licenses/gpl-1.0.html" ,
30+ "GPLv2" : "https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" ,
31+ "LGPLv2" : "https://www.gnu.org/licenses/old-licenses/lgpl-2.0.html" ,
32+ "GPLv3" : "https://www.gnu.org/licenses/gpl-3.0.html" ,
33+ "LGPLv3" : "https://www.gnu.org/licenses/lgpl-3.0.html" ,
34+ "Apache" : "https://www.apache.org/licenses/LICENSE-2.0" ,
35+ "MIT" : "https://mit-license.org/" ,
36+ "BSD" : "https://opensource.org/license/bsd-3-clause" ,
37+ }
38+
1339
1440class PackageLicense (Package ):
15- package_link : str
41+ package_link : str | None
1642 license : str
17- license_link : str
43+
44+ @field_validator ("package_link" , mode = "before" )
45+ def map_unknown_to_none (cls , v ) -> str | None :
46+ if v == "UNKNOWN" :
47+ return None
48+ return v
49+
50+ @field_validator ("license" , mode = "before" )
51+ def map_to_normalized_values (cls , v ) -> str | None :
52+ return _normalize (v )
53+
54+ @property
55+ def license_link (self ) -> str | None :
56+ return LICENSE_MAPPING_TO_URL .get (self .license , None )
1857
1958
2059def _normalize (_license : str ) -> str :
21- def is_multi_license (l ):
60+ def is_multi_license (l ) -> bool :
2261 return ";" in l
2362
2463 def select_most_restrictive (licenses : list ) -> str :
25- _max = 0
2664 lic = "Unknown"
2765 _mapping = {
2866 "Unknown" : - 1 ,
@@ -35,69 +73,33 @@ def select_most_restrictive(licenses: list) -> str:
3573 "GPLv3" : 6 ,
3674 }
3775 for l in licenses :
38- if l in _mapping :
39- if _mapping [l ] > _mapping [lic ]:
40- lic = l
41- else :
76+ if l not in _mapping :
4277 return "<br>" .join (licenses )
78+ if _mapping [l ] > _mapping [lic ]:
79+ lic = l
4380 return lic
4481
45- mapping = {
46- "BSD License" : "BSD" ,
47- "MIT License" : "MIT" ,
48- "The Unlicensed (Unlicensed)" : "Unlicensed" ,
49- "Mozilla Public License 2.0 (MPL 2.0)" : "MPLv2" ,
50- "GNU General Public License (GPL)" : "GPL" ,
51- "GNU Lesser General Public License v2 (LGPLv2)" : "LGPLv2" ,
52- "GNU General Public License v2 (GPLv2)" : "GPLv2" ,
53- "GNU General Public License v2 or later (GPLv2+)" : "GPLv2+" ,
54- "GNU General Public License v3 (GPLv3)" : "GPLv3" ,
55- "Apache Software License" : "Apache" ,
56- }
57-
5882 if is_multi_license (_license ):
5983 items = []
6084 for item in _license .split (";" ):
6185 item = str (item ).strip ()
62- if item in mapping :
63- items .append (mapping [item ])
64- else :
65- items .append (item )
86+ items .append (LICENSE_MAPPING_TO_ABBREVIATION .get (item , item ))
6687 return select_most_restrictive (items )
6788
68- if _license not in mapping :
69- return _license
70-
71- return mapping [_license ]
89+ return LICENSE_MAPPING_TO_ABBREVIATION .get (_license , _license )
7290
7391
7492def _packages_from_json (json : str ) -> list [PackageLicense ]:
7593 packages = loads (json )
76- packages_list = []
77- mapping = {
78- "GPLv1" : "https://www.gnu.org/licenses/old-licenses/gpl-1.0.html" ,
79- "GPLv2" : "https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" ,
80- "LGPLv2" : "https://www.gnu.org/licenses/old-licenses/lgpl-2.0.html" ,
81- "GPLv3" : "https://www.gnu.org/licenses/gpl-3.0.html" ,
82- "LGPLv3" : "https://www.gnu.org/licenses/lgpl-3.0.html" ,
83- "Apache" : "https://www.apache.org/licenses/LICENSE-2.0" ,
84- "MIT" : "https://mit-license.org/" ,
85- "BSD" : "https://opensource.org/license/bsd-3-clause" ,
86- }
87- for package in packages :
88- package_license = _normalize (package ["License" ])
89- packages_list .append (
90- PackageLicense (
91- name = package ["Name" ],
92- package_link = "" if package ["URL" ] == "UNKNOWN" else package ["URL" ],
93- version = package ["Version" ],
94- license = package_license ,
95- license_link = (
96- "" if package_license not in mapping else mapping [package_license ]
97- ),
98- )
94+ return [
95+ PackageLicense (
96+ name = package ["Name" ],
97+ package_link = package ["URL" ],
98+ version = package ["Version" ],
99+ license = package ["License" ],
99100 )
100- return packages_list
101+ for package in packages
102+ ]
101103
102104
103105def licenses () -> list [PackageLicense ]:
@@ -114,16 +116,14 @@ def licenses() -> list[PackageLicense]:
114116 ],
115117 capture_output = True ,
116118 )
117- result = _packages_from_json (file .read ().decode ())
118- return result
119+ return _packages_from_json (file .read ().decode ())
119120
120121
121122def packages_to_markdown (
122123 dependencies : dict [str , list ], packages : list [PackageLicense ]
123124) -> str :
124125 def heading ():
125- text = "# Dependencies\n "
126- return text
126+ return "# Dependencies\n "
127127
128128 def dependency (
129129 group : str ,
@@ -133,7 +133,7 @@ def dependency(
133133 def _header (_group : str ):
134134 _group = "" .join ([word .capitalize () for word in _group .strip ().split ()])
135135 text = f"## { _group } Dependencies\n "
136- text += "|Package|version|Licence |\n "
136+ text += "|Package|Version|License |\n "
137137 text += "|---|---|---|\n "
138138 return text
139139
0 commit comments