Skip to content

Commit 5f41253

Browse files
resolves the conversations
1 parent 7b88101 commit 5f41253

File tree

2 files changed

+202
-100
lines changed

2 files changed

+202
-100
lines changed

exasol/toolbox/nox/_dependencies_check.py

Lines changed: 74 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,68 +4,81 @@
44
import nox
55
from nox import Session
66
from noxconfig import PROJECT_CONFIG
7-
from typing import List
8-
9-
10-
FILTERS = ['url', 'git', 'path']
7+
from typing import (
8+
List,
9+
Dict
10+
)
11+
import rich.console
1112

1213

1314
@nox.session(name="dependencies-check", python=False)
1415
def dependency_check(session: Session) -> None:
15-
file = Path(PROJECT_CONFIG.root, "pyproject.toml")
16-
output = _dependencies_check(file.read_text())
17-
print("\033[31m"+output) if output else print("\033[32m"+"Success: no wrong dependencies found")
18-
sys.exit(0 if not output else 1)
19-
20-
21-
def _source_filter(version, filters) -> bool:
22-
for f in filters:
23-
if f in version:
24-
return True
25-
return False
26-
27-
28-
def extract_dependencies(section, filters) -> List[str]:
29-
dependencies = []
30-
for name, version in section.items():
31-
if _source_filter(version, filters):
32-
dependencies.append(f"{name} = {version}")
33-
return dependencies
34-
35-
36-
def _dependencies_check(string: str) -> str:
37-
toml = tomlkit.loads(string)
38-
group_dependencies = {}
39-
40-
poetry = toml.get("tool", {}).get("poetry", {})
41-
42-
dependencies = extract_dependencies(poetry.get("dependencies", {}), FILTERS)
43-
44-
dev_section = poetry.get("dev", {}).get("dependencies", {})
45-
dev_dependencies = extract_dependencies(dev_section, FILTERS)
46-
47-
group_section = poetry.get("group", {})
48-
for group, content in group_section.items():
49-
group_deps = extract_dependencies(content.get("dependencies", {}), FILTERS)
50-
if group_deps:
51-
group_key = f'[tool.poetry.group.{group}.dependencies]'
52-
group_dependencies[group_key] = group_deps
53-
54-
total_count = len(dependencies) + len(dev_dependencies) + sum(len(deps) for deps in group_dependencies.values())
55-
if total_count > 0:
56-
suffix = "y" if total_count == 1 else "ies"
57-
output = [f"{total_count} illegal dependenc{suffix}:\n"]
58-
59-
if dependencies:
60-
output.append(f"\n[tool.poetry.dependencies]\n" + "\n".join(dependencies) + "\n")
61-
if dev_dependencies:
62-
output.append(f"\n[tool.poetry.dev.dependencies]\n" + "\n".join(dev_dependencies) + "\n")
63-
for key, value in group_dependencies.items():
64-
output.append(f"\n{key}\n" + "\n".join(value) + "\n")
65-
66-
return "".join(output)
67-
return ""
68-
69-
70-
if __name__ == "__main__":
71-
print(_dependencies_check(Path("pyproject.toml").read_text()))
16+
content = Path(PROJECT_CONFIG.root, "pyproject.toml").read_text()
17+
dependencies = DependenciesCheck(content).parse()
18+
console = rich.console.Console()
19+
if dependencies.illegal():
20+
dependencies.report_illegal(console)
21+
sys.exit(1)
22+
dependencies.report_illegal(console)
23+
sys.exit(0)
24+
25+
26+
class DependenciesCheck:
27+
ILLEGAL_DEPENDENCIES = ['url', 'git', 'path']
28+
29+
def __init__(self, pyproject_toml: str):
30+
self.illegal_dict: Dict[str, List[str]] | None = None
31+
self.content = pyproject_toml
32+
33+
def parse(self) -> "DependenciesCheck":
34+
def source_filter(version, filters) -> bool:
35+
for f in filters:
36+
if f in version:
37+
return True
38+
return False
39+
40+
def extract_dependencies(section, filters) -> List[str]:
41+
dependencies = []
42+
for name, version in section.items():
43+
if source_filter(version, filters):
44+
dependencies.append(f"{name} = {version}")
45+
return dependencies
46+
47+
illegal: Dict[str, List[str]] = {}
48+
toml = tomlkit.loads(self.content)
49+
poetry = toml.get("tool", {}).get("poetry", {})
50+
51+
part = poetry.get("dependencies", {})
52+
dependencies_list = extract_dependencies(part, self.ILLEGAL_DEPENDENCIES)
53+
if dependencies_list:
54+
illegal["tool.poetry.dependencies"] = dependencies_list
55+
56+
part = poetry.get("dev", {}).get("dependencies", {})
57+
dependencies_list = extract_dependencies(part, self.ILLEGAL_DEPENDENCIES)
58+
if dependencies_list:
59+
illegal["tool.poetry.dev.dependencies"] = dependencies_list
60+
61+
part = poetry.get("group", {})
62+
for group, content in part.items():
63+
dependencies_list = extract_dependencies(content.get("dependencies", {}), self.ILLEGAL_DEPENDENCIES)
64+
if dependencies_list:
65+
illegal[f"tool.poetry.group.{group}.dependencies"] = dependencies_list
66+
67+
self.illegal_dict = illegal
68+
return self
69+
70+
def report_illegal(self, console: rich.console.Console):
71+
if self.illegal_dict:
72+
count = sum(len(deps) for deps in self.illegal_dict.values())
73+
suffix = "y" if count == 1 else "ies"
74+
console.print(f"{count} illegal dependenc{suffix}\n", style="red")
75+
for section, dependencies in self.illegal_dict.items():
76+
console.print(f"\\[{section}]", style="red")
77+
for dependency in dependencies:
78+
console.print(dependency, style="red")
79+
console.print("")
80+
else:
81+
console.print("Success: All dependencies refer to explicit pipy releases.", style="green")
82+
83+
def illegal(self) -> Dict[str, List[str]] | None:
84+
return self.illegal_dict
Lines changed: 128 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,114 @@
1-
from tomlkit import loads
21
import pytest
3-
from exasol.toolbox.nox._dependencies_check import (
4-
_source_filter,
5-
_dependencies_check
6-
)
2+
from exasol.toolbox.nox._dependencies_check import DependenciesCheck
73

84

95
@pytest.mark.parametrize(
10-
"filters,source,expected",
6+
"toml,expected",
117
[
128
(
13-
['url', 'git', 'path'],
14-
"""example-url = {url = "https://example.com/my-package-0.1.0.tar.gz"}""",
15-
'url'),
16-
(
17-
['url', 'git', 'path'],
18-
"""example-git = {git = "[email protected]:requests/requests.git"}""",
19-
'git'),
9+
"""
10+
""",
11+
{}
12+
),
2013
(
21-
['url', 'git', 'path'],
22-
"""example-path = {path = "../my-package/dist/my-package-0.1.0.tar.gz"}""",
23-
'path'),
14+
"""
15+
[tool.poetry.dependencies]
16+
python = "^3.8"
17+
example-url1 = {url = "https://example.com/my-package-0.1.0.tar.gz"}
18+
19+
[tool.poetry.dev.dependencies]
20+
nox = ">=2022.8.7"
21+
example-url2 = {url = "https://example.com/my-package-0.2.0.tar.gz"}
22+
23+
[tool.poetry.group.test.dependencies]
24+
sphinx = ">=5.3,<8"
25+
example-git = {git = "[email protected]:requests/requests.git"}
26+
27+
[tool.poetry.group.dev.dependencies]
28+
pytest = ">=7.2.2,<9"
29+
example-path1 = {path = "../my-package/dist/my-package-0.1.0.tar.gz"}
30+
""",
31+
{
32+
"tool.poetry.dependencies": ["example-url1 = {'url': 'https://example.com/my-package-0.1.0.tar.gz'}"],
33+
"tool.poetry.dev.dependencies": ["example-url2 = {'url': 'https://example.com/my-package-0.2.0.tar.gz'}"],
34+
"tool.poetry.group.test.dependencies": ["example-git = {'git': '[email protected]:requests/requests.git'}"],
35+
"tool.poetry.group.dev.dependencies": ["example-path1 = {'path': '../my-package/dist/my-package-0.1.0.tar.gz'}"],
36+
}
37+
),
2438
(
25-
['url', 'git', 'path'],
26-
"""example-url = {platform = "darwin", url = "https://example.com/my-package-0.1.0.tar.gz"}""",
27-
'url'),
39+
"""
40+
[tool.poetry.dev.dependencies]
41+
nox = ">=2022.8.7"
42+
example-url2 = {url = "https://example.com/my-package-0.2.0.tar.gz"}
43+
44+
[tool.poetry.group.test.dependencies]
45+
sphinx = ">=5.3,<8"
46+
example-git = {git = "[email protected]:requests/requests.git"}
47+
48+
[tool.poetry.group.dev.dependencies]
49+
pytest = ">=7.2.2,<9"
50+
example-path1 = {path = "../my-package/dist/my-package-0.1.0.tar.gz"}
51+
""",
52+
{
53+
"tool.poetry.dev.dependencies": ["example-url2 = {'url': 'https://example.com/my-package-0.2.0.tar.gz'}"],
54+
"tool.poetry.group.test.dependencies": ["example-git = {'git': '[email protected]:requests/requests.git'}"],
55+
"tool.poetry.group.dev.dependencies": ["example-path1 = {'path': '../my-package/dist/my-package-0.1.0.tar.gz'}"],
56+
}
57+
),
2858
(
29-
['url', 'git', 'path'],
30-
"""example = "^2.31.0.6" """,
31-
None),
59+
"""
60+
[tool.poetry.dependencies]
61+
python = "^3.8"
62+
example-url1 = {url = "https://example.com/my-package-0.1.0.tar.gz"}
63+
64+
[tool.poetry.group.test.dependencies]
65+
sphinx = ">=5.3,<8"
66+
example-git = {git = "[email protected]:requests/requests.git"}
67+
68+
[tool.poetry.group.dev.dependencies]
69+
pytest = ">=7.2.2,<9"
70+
example-path1 = {path = "../my-package/dist/my-package-0.1.0.tar.gz"}
71+
""",
72+
{
73+
"tool.poetry.dependencies": ["example-url1 = {'url': 'https://example.com/my-package-0.1.0.tar.gz'}"],
74+
"tool.poetry.group.test.dependencies": ["example-git = {'git': '[email protected]:requests/requests.git'}"],
75+
"tool.poetry.group.dev.dependencies": ["example-path1 = {'path': '../my-package/dist/my-package-0.1.0.tar.gz'}"],
76+
}
77+
),
3278
(
33-
['url', 'git', 'path'],
34-
"""python = ">=3.8.0,<4.0" """,
35-
None
79+
"""
80+
[tool.poetry.dependencies]
81+
python = "^3.8"
82+
example-url1 = {url = "https://example.com/my-package-0.1.0.tar.gz"}
83+
84+
[tool.poetry.dev.dependencies]
85+
nox = ">=2022.8.7"
86+
example-url2 = {url = "https://example.com/my-package-0.2.0.tar.gz"}
87+
""",
88+
{
89+
"tool.poetry.dependencies": ["example-url1 = {'url': 'https://example.com/my-package-0.1.0.tar.gz'}"],
90+
"tool.poetry.dev.dependencies": ["example-url2 = {'url': 'https://example.com/my-package-0.2.0.tar.gz'}"],
91+
}
3692
)
3793
]
3894
)
39-
def test_dependencies_check(filters, source, expected):
40-
for _, version in loads(source).items():
41-
assert _source_filter(version, filter) == expected
95+
def test_dependency_check_parse(toml, expected):
96+
dependencies = DependenciesCheck(toml).parse()
97+
assert dependencies.illegal() == expected
4298

4399

44100
@pytest.mark.parametrize(
45-
"toml, expected",
101+
"toml,expected",
46102
[
47103
(
48-
"""[tool.poetry.dependencies]
104+
"""
105+
[tool.poetry.dependencies]
49106
python = "^3.8"
50-
example-url = {url = "https://example.com/my-package-0.1.0.tar.gz"}
107+
example-url1 = {url = "https://example.com/my-package-0.1.0.tar.gz"}
51108
52109
[tool.poetry.dev.dependencies]
53110
nox = ">=2022.8.7"
111+
example-url2 = {url = "https://example.com/my-package-0.2.0.tar.gz"}
54112
55113
[tool.poetry.group.test.dependencies]
56114
sphinx = ">=5.3,<8"
@@ -60,21 +118,52 @@ def test_dependencies_check(filters, source, expected):
60118
pytest = ">=7.2.2,<9"
61119
example-path1 = {path = "../my-package/dist/my-package-0.1.0.tar.gz"}
62120
example-path2 = {path = "../my-package/dist/my-package-0.2.0.tar.gz"}
63-
""",
64-
"""4 illegal dependencies:
121+
""",
122+
"""5 illegal dependencies
65123
66-
[tool.poetry.dependencies]
67-
example-url = {'url': 'https://example.com/my-package-0.1.0.tar.gz'}
124+
\\[tool.poetry.dependencies]
125+
example-url1 = {'url': 'https://example.com/my-package-0.1.0.tar.gz'}
68126
69-
[tool.poetry.group.test.dependencies]
127+
\\[tool.poetry.dev.dependencies]
128+
example-url2 = {'url': 'https://example.com/my-package-0.2.0.tar.gz'}
129+
130+
\\[tool.poetry.group.test.dependencies]
70131
example-git = {'git': '[email protected]:requests/requests.git'}
71132
72-
[tool.poetry.group.dev.dependencies]
133+
\\[tool.poetry.group.dev.dependencies]
73134
example-path1 = {'path': '../my-package/dist/my-package-0.1.0.tar.gz'}
74135
example-path2 = {'path': '../my-package/dist/my-package-0.2.0.tar.gz'}
136+
137+
"""
138+
),
139+
(
140+
"""
141+
[tool.poetry.dependencies]
142+
python = "^3.8"
143+
144+
[tool.poetry.dev.dependencies]
145+
nox = ">=2022.8.7"
146+
147+
[tool.poetry.group.test.dependencies]
148+
sphinx = ">=5.3,<8"
149+
150+
[tool.poetry.group.dev.dependencies]
151+
pytest = ">=7.2.2,<9"
152+
""",
153+
"""Success: All dependencies refer to explicit pipy releases.
75154
"""
76155
),
77156
]
78157
)
79-
def test_dependencies_check(toml, expected):
80-
assert _dependencies_check(toml) == expected
158+
def test_dependencies_check_report(toml, expected):
159+
class Console:
160+
def __init__(self):
161+
self.output = ""
162+
163+
def print(self, output: str, style: str = None):
164+
self.output += output + "\n"
165+
166+
console = Console()
167+
dependencies = DependenciesCheck(toml).parse()
168+
dependencies.report_illegal(console)
169+
assert console.output == expected

0 commit comments

Comments
 (0)