Skip to content

Commit ffddc59

Browse files
committed
Move some of the mappings to be used in the pydantic model
1 parent 0cd5a68 commit ffddc59

File tree

2 files changed

+106
-87
lines changed

2 files changed

+106
-87
lines changed

exasol/toolbox/util/dependencies/licenses.py

Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,62 @@
55
from inspect import cleandoc
66
from json import loads
77

8+
from pydantic import field_validator
9+
810
from exasol.toolbox.util.dependencies.poetry_dependencies import (
911
PoetryDependency,
1012
)
1113
from 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

1440
class 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

2059
def _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

7492
def _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

103105
def 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

121122
def 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

test/unit/util/dependencies/licenses_test.py

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
)
66

77
from exasol.toolbox.util.dependencies.licenses import (
8+
LICENSE_MAPPING_TO_URL,
89
PackageLicense,
910
_normalize,
1011
_packages_from_json,
@@ -15,6 +16,29 @@
1516
DEV_GROUP = PoetryGroup(name="dev", toml_section="tool.poetry.group.dev.dependencies")
1617

1718

19+
class TestPackageLicense:
20+
@staticmethod
21+
def test_package_link_map_unknown_to_none():
22+
result = PackageLicense(
23+
name="dummy", version="dummy", package_link="UNKNOWN", license="dummy"
24+
)
25+
assert result.package_link is None
26+
27+
@staticmethod
28+
@pytest.mark.parametrize(
29+
"license,expected",
30+
[
31+
("GPLv1", LICENSE_MAPPING_TO_URL["GPLv1"]),
32+
("DUMMY", None),
33+
],
34+
)
35+
def test_license_link(license, expected):
36+
result = PackageLicense(
37+
name="dummy", version="dummy", package_link="dummy", license=license
38+
)
39+
assert result.license_link == expected
40+
41+
1842
@pytest.mark.parametrize(
1943
"licenses,expected",
2044
[
@@ -45,35 +69,33 @@ def test_normalize(licenses, expected):
4569
[
4670
(
4771
"""
48-
[
49-
{
50-
"License": "license1",
51-
"Name": "name1",
52-
"URL": "link1",
53-
"Version": "version1"
54-
},
55-
{
56-
"License": "license2",
57-
"Name": "name2",
58-
"URL": "UNKNOWN",
59-
"Version": "version2"
60-
}
61-
]
62-
""",
72+
[
73+
{
74+
"License": "license1",
75+
"Name": "name1",
76+
"URL": "link1",
77+
"Version": "version1"
78+
},
79+
{
80+
"License": "license2",
81+
"Name": "name2",
82+
"URL": "UNKNOWN",
83+
"Version": "version2"
84+
}
85+
]
86+
""",
6387
[
6488
PackageLicense(
6589
name="name1",
6690
version="version1",
6791
package_link="link1",
6892
license="license1",
69-
license_link="",
7093
),
7194
PackageLicense(
7295
name="name2",
7396
version="version2",
74-
package_link="",
97+
package_link=None,
7598
license="license2",
76-
license_link="",
7799
),
78100
],
79101
)
@@ -108,22 +130,19 @@ def test_packages_from_json(json, expected):
108130
name="package1",
109131
package_link="package_link1",
110132
version="version1",
111-
license="license1",
112-
license_link="license_link1",
133+
license="GPLv1",
113134
),
114135
PackageLicense(
115136
name="package2",
116137
package_link="package_link2",
117138
version="version2",
118-
license="license2",
119-
license_link="license_link2",
139+
license="GPLv2",
120140
),
121141
PackageLicense(
122142
name="package3",
123-
package_link="package_link3",
143+
package_link="UNKNOWN",
124144
version="version3",
125145
license="license3",
126-
license_link="",
127146
),
128147
],
129148
)
@@ -135,15 +154,15 @@ def test_packages_to_markdown(dependencies, packages):
135154
actual
136155
== """# Dependencies
137156
## Main Dependencies
138-
|Package|version|Licence|
157+
|Package|Version|License|
139158
|---|---|---|
140-
|[package1](package_link1)|version1|[license1](license_link1)|
141-
|[package3](package_link3)|version3|license3|
159+
|[package1](package_link1)|version1|[GPLv1](https://www.gnu.org/licenses/old-licenses/gpl-1.0.html)|
160+
|package3|version3|license3|
142161
143162
## Dev Dependencies
144-
|Package|version|Licence|
163+
|Package|Version|License|
145164
|---|---|---|
146-
|[package2](package_link2)|version2|[license2](license_link2)|
165+
|[package2](package_link2)|version2|[GPLv2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html)|
147166
148167
"""
149168
)

0 commit comments

Comments
 (0)