|
3 | 3 | from pathlib import Path |
4 | 4 | import nox |
5 | 5 | from nox import Session |
| 6 | +from noxconfig import PROJECT_CONFIG |
| 7 | +from typing import List |
6 | 8 |
|
7 | 9 |
|
8 | 10 | FILTERS = ['url', 'git', 'path'] |
9 | 11 |
|
10 | 12 |
|
11 | 13 | @nox.session(name="dependencies-check", python=False) |
12 | | -def dependency_check(session: Session): |
13 | | - file = Path("pyproject.toml") |
14 | | - sys.exit(_dependencies_check(file.read_text())) |
| 14 | +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) |
15 | 19 |
|
16 | 20 |
|
17 | | -def _source_filter(version, filters): |
18 | | - output = None |
19 | | - if isinstance(version, dict): |
20 | | - for key in version.keys(): |
21 | | - if key in filters: |
22 | | - output = key |
23 | | - return output |
| 21 | +def _source_filter(version, filters) -> bool: |
| 22 | + for f in filters: |
| 23 | + if f in version: |
| 24 | + return True |
| 25 | + return False |
24 | 26 |
|
25 | 27 |
|
26 | | -def _dependencies_check(string: str): |
| 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: |
27 | 37 | toml = tomlkit.loads(string) |
28 | | - dependencies: list = [] |
29 | | - dev_dependencies: list = [] |
30 | | - group_dependencies: dict = {} |
31 | | - if "tool" in toml: |
32 | | - if "poetry" in toml["tool"].unwrap(): |
33 | | - if "dependencies" in toml["tool"].unwrap()["poetry"]: |
34 | | - for name, version in toml["tool"].unwrap()["poetry"]["dependencies"].items(): |
35 | | - key = _source_filter(version, FILTERS) |
36 | | - if key: |
37 | | - dependencies.append(f"{name} = {version}") |
38 | | - |
39 | | - if "dev" in toml["tool"].unwrap()["poetry"]: |
40 | | - if "dependencies" in toml["tool"].unwrap()["poetry"]["dev"]: |
41 | | - for name, version in toml["tool"].unwrap()["poetry"]["dev"]["dependencies"].items(): |
42 | | - key = _source_filter(version, FILTERS) |
43 | | - if key: |
44 | | - dev_dependencies.append(f"{name} = {version}") |
45 | | - |
46 | | - if "group" in toml["tool"].unwrap()["poetry"]: |
47 | | - for group in toml["tool"].unwrap()["poetry"]["group"]: |
48 | | - if "dependencies" in toml["tool"].unwrap()["poetry"]["group"][group]: |
49 | | - for name, version in toml["tool"].unwrap()["poetry"]["group"][group]["dependencies"].items(): |
50 | | - key = _source_filter(version, FILTERS) |
51 | | - if key: |
52 | | - if f'[tool.poetry.group.{group}.dependencies]' not in group_dependencies: |
53 | | - group_dependencies[f'[tool.poetry.group.{group}.dependencies]'] = [] |
54 | | - group_dependencies[f'[tool.poetry.group.{group}.dependencies]'].append(f"{name} = {version}") |
55 | | - |
56 | | - if dependencies or dev_dependencies or group_dependencies: |
57 | | - l = len(dependencies) |
58 | | - m = len(dev_dependencies) |
59 | | - n = 0 |
60 | | - for _, dependency in group_dependencies.items(): |
61 | | - n += len(dependency) |
62 | | - suffix = "y" if l+m+n == 1 else "ies" |
63 | | - output = f"{l+m+n} illegal dependenc{suffix}:{chr(10)}" |
64 | | - output += ("\n[tool.poetry.dependencies]\n"+"\n".join(dependencies)+"\n") if l > 0 else "" |
65 | | - output += ("\n[tool.poetry.dev.dependencies]\n"+"\n".join(dev_dependencies)+"\n") if m > 0 else "" |
66 | | - output += ("\n".join(f"{chr(10)}{key}{chr(10)}{chr(10).join(value)}"for key, value in group_dependencies.items())) if n > 0 else "" |
67 | | - output += "\n" |
68 | | - return output |
69 | | - return 0 |
| 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 | + |
| 68 | + return "" |
| 69 | + |
| 70 | + |
| 71 | +if __name__ == "__main__": |
| 72 | + print(_dependencies_check(Path("pyproject.toml").read_text())) |
0 commit comments