Skip to content

Commit dc25568

Browse files
committed
Use updated pydantic models in license code
1 parent 0e046b4 commit dc25568

File tree

2 files changed

+81
-88
lines changed

2 files changed

+81
-88
lines changed

exasol/toolbox/nox/_dependencies.py

Lines changed: 26 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,46 +4,27 @@
44
import json
55
import subprocess
66
import tempfile
7-
from dataclasses import dataclass
87
from inspect import cleandoc
98
from json import loads
109
from pathlib import Path
1110

1211
import nox
13-
import tomlkit
1412
from nox import Session
1513

14+
from exasol.toolbox.util.dependencies.poetry_dependencies import (
15+
Package,
16+
PoetryDependencies,
17+
PoetryDependency,
18+
PoetryToml,
19+
)
1620

17-
@dataclass(frozen=True)
18-
class Package:
19-
name: str
21+
22+
class PackageLicense(Package):
2023
package_link: str
21-
version: str
2224
license: str
2325
license_link: str
2426

2527

26-
def _dependencies(toml_str: str) -> dict[str, list]:
27-
toml = tomlkit.loads(toml_str)
28-
poetry = toml.get("tool", {}).get("poetry", {})
29-
dependencies: dict[str, list] = {}
30-
31-
packages = poetry.get("dependencies", {})
32-
if packages:
33-
dependencies["project"] = []
34-
for package in packages:
35-
dependencies["project"].append(package)
36-
37-
groups = poetry.get("group", {})
38-
for group in groups:
39-
packages = groups.get(group, {}).get("dependencies")
40-
if packages and not dependencies.get(group, {}):
41-
dependencies[group] = []
42-
for package in packages:
43-
dependencies[group].append(package)
44-
return dependencies
45-
46-
4728
def _normalize(_license: str) -> str:
4829
def is_multi_license(l):
4930
return ";" in l
@@ -98,7 +79,7 @@ def select_most_restrictive(licenses: list) -> str:
9879
return mapping[_license]
9980

10081

101-
def _packages_from_json(json: str) -> list[Package]:
82+
def _packages_from_json(json: str) -> list[PackageLicense]:
10283
packages = loads(json)
10384
packages_list = []
10485
mapping = {
@@ -114,7 +95,7 @@ def _packages_from_json(json: str) -> list[Package]:
11495
for package in packages:
11596
package_license = _normalize(package["License"])
11697
packages_list.append(
117-
Package(
98+
PackageLicense(
11899
name=package["Name"],
119100
package_link="" if package["URL"] == "UNKNOWN" else package["URL"],
120101
version=package["Version"],
@@ -127,7 +108,7 @@ def _packages_from_json(json: str) -> list[Package]:
127108
return packages_list
128109

129110

130-
def _licenses() -> list[Package]:
111+
def _licenses() -> list[PackageLicense]:
131112
with tempfile.NamedTemporaryFile() as file:
132113
subprocess.run(
133114
[
@@ -146,31 +127,31 @@ def _licenses() -> list[Package]:
146127

147128

148129
def _packages_to_markdown(
149-
dependencies: dict[str, list], packages: list[Package]
130+
dependencies: dict[str, list], packages: list[PackageLicense]
150131
) -> str:
151132
def heading():
152133
text = "# Dependencies\n"
153134
return text
154135

155-
def dependency(group: str, group_packages: list, packages: list[Package]) -> str:
136+
def dependency(
137+
group: str,
138+
group_packages: list[PoetryDependency],
139+
packages: list[PackageLicense],
140+
) -> str:
156141
def _header(_group: str):
157142
_group = "".join([word.capitalize() for word in _group.strip().split()])
158143
text = f"## {_group} Dependencies\n"
159144
text += "|Package|version|Licence|\n"
160145
text += "|---|---|---|\n"
161146
return text
162147

163-
def _rows(_group_packages: list, _packages: list[Package]) -> str:
164-
def _normalize_package_name(name: str) -> str:
165-
_name = name.lower()
166-
while "_" in _name:
167-
_name = _name.replace("_", "-")
168-
return _name
169-
148+
def _rows(
149+
_group_packages: list[PoetryDependency], _packages: list[PackageLicense]
150+
) -> str:
170151
text = ""
171152
for package in _group_packages:
172153
consistent = filter(
173-
lambda elem: (_normalize_package_name(elem.name) == package),
154+
lambda elem: elem.normalized_name == package.normalized_name,
174155
_packages,
175156
)
176157
for content in consistent:
@@ -276,8 +257,11 @@ def run(self, session: Session) -> None:
276257
@nox.session(name="dependency:licenses", python=False)
277258
def dependency_licenses(session: Session) -> None:
278259
"""returns the packages and their licenses"""
279-
toml = Path("pyproject.toml")
280-
dependencies = _dependencies(toml.read_text())
260+
working_directory = Path()
261+
groups = PoetryToml(working_directory=working_directory).groups
262+
dependencies = PoetryDependencies(
263+
groups=groups, working_directory=working_directory
264+
).direct_dependencies
281265
package_infos = _licenses()
282266
print(_packages_to_markdown(dependencies=dependencies, packages=package_infos))
283267

test/unit/dependencies_test.py

Lines changed: 55 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,22 @@
11
import json
2+
from inspect import cleandoc
23

34
import pytest
5+
from toolbox.util.dependencies.poetry_dependencies import (
6+
PoetryDependency,
7+
PoetryGroup,
8+
)
49

510
from exasol.toolbox.nox._dependencies import (
611
Audit,
7-
Package,
8-
_dependencies,
12+
PackageLicense,
913
_normalize,
1014
_packages_from_json,
1115
_packages_to_markdown,
1216
)
1317

14-
15-
def test_dependencies():
16-
toml = """
17-
[tool.poetry.dependencies]
18-
pytest = ">=7.2.2,<9"
19-
python = "^3.9"
20-
21-
[tool.poetry.group.dev.dependencies]
22-
autoimport = "^1.4.0"
23-
"""
24-
25-
actual = _dependencies(toml)
26-
assert actual == {"project": ["pytest", "python"], "dev": ["autoimport"]}
18+
MAIN_GROUP = PoetryGroup(name="main", toml_section="project.dependencies")
19+
DEV_GROUP = PoetryGroup(name="dev", toml_section="tool.poetry.group.dev.dependencies")
2720

2821

2922
@pytest.mark.parametrize(
@@ -56,30 +49,30 @@ def test_normalize(licenses, expected):
5649
[
5750
(
5851
"""
59-
[
60-
{
61-
"License": "license1",
62-
"Name": "name1",
63-
"URL": "link1",
64-
"Version": "version1"
65-
},
66-
{
67-
"License": "license2",
68-
"Name": "name2",
69-
"URL": "UNKNOWN",
70-
"Version": "version2"
71-
}
72-
]
73-
""",
52+
[
53+
{
54+
"License": "license1",
55+
"Name": "name1",
56+
"URL": "link1",
57+
"Version": "version1"
58+
},
59+
{
60+
"License": "license2",
61+
"Name": "name2",
62+
"URL": "UNKNOWN",
63+
"Version": "version2"
64+
}
65+
]
66+
""",
7467
[
75-
Package(
68+
PackageLicense(
7669
name="name1",
7770
version="version1",
7871
package_link="link1",
7972
license="license1",
8073
license_link="",
8174
),
82-
Package(
75+
PackageLicense(
8376
name="name2",
8477
version="version2",
8578
package_link="",
@@ -96,35 +89,56 @@ def test_packages_from_json(json, expected):
9689

9790

9891
@pytest.mark.parametrize(
99-
"dependencies,packages,expected",
92+
"dependencies,packages",
10093
[
10194
(
102-
{"project": ["package1", "package3"], "dev": ["package2"]},
95+
{
96+
MAIN_GROUP.name: [
97+
PoetryDependency(
98+
name="package1", version="version1", group=MAIN_GROUP
99+
),
100+
PoetryDependency(
101+
name="package3", version="version3", group=MAIN_GROUP
102+
),
103+
],
104+
DEV_GROUP.name: [
105+
PoetryDependency(
106+
name="package2", version="version2", group=DEV_GROUP
107+
)
108+
],
109+
},
103110
[
104-
Package(
111+
PackageLicense(
105112
name="package1",
106113
package_link="package_link1",
107114
version="version1",
108115
license="license1",
109116
license_link="license_link1",
110117
),
111-
Package(
118+
PackageLicense(
112119
name="package2",
113120
package_link="package_link2",
114121
version="version2",
115122
license="license2",
116123
license_link="license_link2",
117124
),
118-
Package(
125+
PackageLicense(
119126
name="package3",
120127
package_link="package_link3",
121128
version="version3",
122129
license="license3",
123130
license_link="",
124131
),
125132
],
126-
"""# Dependencies
127-
## Project Dependencies
133+
)
134+
],
135+
)
136+
def test_packages_to_markdown(dependencies, packages):
137+
actual = _packages_to_markdown(dependencies, packages)
138+
assert (
139+
actual
140+
== """# Dependencies
141+
## Main Dependencies
128142
|Package|version|Licence|
129143
|---|---|---|
130144
|[package1](package_link1)|version1|[license1](license_link1)|
@@ -135,13 +149,8 @@ def test_packages_from_json(json, expected):
135149
|---|---|---|
136150
|[package2](package_link2)|version2|[license2](license_link2)|
137151
138-
""",
139-
)
140-
],
141-
)
142-
def test_packages_to_markdown(dependencies, packages, expected):
143-
actual = _packages_to_markdown(dependencies, packages)
144-
assert actual == expected
152+
"""
153+
)
145154

146155

147156
class TestFilterJsonForVulnerabilities:

0 commit comments

Comments
 (0)