44import json
55import subprocess
66import tempfile
7- from dataclasses import dataclass
87from inspect import cleandoc
98from json import loads
109from pathlib import Path
1110
1211import nox
13- import tomlkit
1412from 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-
4728def _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
148129def _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 )
277258def 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
0 commit comments