11from __future__ import annotations
22
3- import json
43from collections import defaultdict
54from dataclasses import dataclass
65from inspect import cleandoc
6+ from json import loads
77from pathlib import Path
88
99import nox
1515class Package :
1616 name : str
1717 package_link : str
18- license : str
1918 version : str
19+ license : str
2020 license_link : str
2121
2222
@@ -26,31 +26,34 @@ def _dependencies(toml_str: str) -> dict[str, list]:
2626 dependencies : dict [str , list ] = {}
2727
2828 packages = poetry .get ("dependencies" , {})
29- dependencies ["project" ] = []
29+ if packages :
30+ dependencies ["project" ] = []
3031 for package in packages :
3132 dependencies ["project" ].append (package )
3233
3334 packages = poetry .get ("dev" , {}).get ("dependencies" , {})
34- dependencies ["dev" ] = []
35+ if packages :
36+ dependencies ["dev" ] = []
3537 for package in packages :
36- dependencies ["dependencies " ].append (package )
38+ dependencies ["dev " ].append (package )
3739
3840 groups = poetry .get ("group" , {})
3941 for group in groups :
4042 packages = groups .get (group , {}).get ("dependencies" )
41- dependencies [group ] = []
43+ if packages and not dependencies .get (group , {}):
44+ dependencies [group ] = []
4245 for package in packages :
4346 dependencies [group ].append (package )
4447 return dependencies
4548
4649
47- def _licenses (session : Session ) -> None :
50+ def _licenses (session : Session , filename : str ) -> None :
4851 session .run (
4952 "poetry" ,
5053 "run" ,
5154 "pip-licenses" ,
5255 "--format=json" ,
53- "--output-file=packages.json" ,
56+ "--output-file=" + filename ,
5457 "--with-system" ,
5558 "--with-urls" ,
5659 )
@@ -71,7 +74,6 @@ def select_most_permissive(l: str) -> str:
7174 "MPLv2" : 3 ,
7275 "LGPLv2" : 4 ,
7376 "GPLv2" : 5 ,
74- "GPLv3" : 6 ,
7577 },
7678 )
7779 priority_to_license = defaultdict (
@@ -99,8 +101,8 @@ def select_most_permissive(l: str) -> str:
99101 return mapping [_license ]
100102
101103
102- def _packages_from_json (file : Path ) -> list [Package ]:
103- packages = json . loads (file . read_text () )
104+ def _packages_from_json (json : str ) -> list [Package ]:
105+ packages = loads (json )
104106 packages_list = []
105107 for package in packages :
106108 packages_list .append (
@@ -115,58 +117,62 @@ def _packages_from_json(file: Path) -> list[Package]:
115117 return packages_list
116118
117119
118- def dependency (group : str , group_packages : list , packages : list [Package ]) -> str :
119- def header (group : str ):
120- group = "" .join ([word .capitalize () for word in group .strip ().split ()])
121- text = f"## { group } Dependencies\n "
122- text += "---\n "
123- text += "|Package|version|Licence|\n "
124- text += "|---|---|---|\n "
125- return text
126-
127- def rows (group_packages : list , packages : list [Package ]) -> str :
128- def _normalize_package_name (name : str ) -> str :
129- _name = name .lower ()
130- while "_" in _name :
131- _name = _name .replace ("_" , "-" )
132- return _name
133-
134- text = ""
135- for package in group_packages :
136- consistent = filter (
137- lambda elem : (_normalize_package_name (elem .name ) == package ),
138- packages ,
139- )
140- for content in consistent :
141- text += f"|[{ content .name } ]({ content .package_link } )"
142- text += f"|{ content .version } "
143- text += f"|[{ content .license } ]({ content .license_link } )|\n "
144- text += "\n "
145- return text
146-
147- _template = cleandoc (
148- """
149- {header}{rows}
150- """
151- )
152- return _template .format (
153- header = header (group ), rows = rows (group_packages , packages )
154- )
155-
156-
157- def packages_markdown (dependencies : dict [str , list ], packages : list [Package ]) -> str :
120+ def _packages_to_markdown (
121+ dependencies : dict [str , list ], packages : list [Package ]
122+ ) -> str :
158123 def heading ():
159124 text = "# Dependecies\n "
160- text += "---\n "
125+ text += "---\n \n "
161126 return text
162127
128+ def dependency (group : str , group_packages : list , packages : list [Package ]) -> str :
129+ def _header (_group : str ):
130+ _group = "" .join ([word .capitalize () for word in _group .strip ().split ()])
131+ text = f"## { _group } Dependencies\n "
132+ text += "---\n "
133+ text += "|Package|version|Licence|\n "
134+ text += "|---|---|---|\n "
135+ return text
136+
137+ def _rows (_group_packages : list , _packages : list [Package ]) -> str :
138+ def _normalize_package_name (name : str ) -> str :
139+ _name = name .lower ()
140+ while "_" in _name :
141+ _name = _name .replace ("_" , "-" )
142+ return _name
143+
144+ text = ""
145+ for package in _group_packages :
146+ consistent = filter (
147+ lambda elem : (_normalize_package_name (elem .name ) == package ),
148+ _packages ,
149+ )
150+ for content in consistent :
151+ text += f"|[{ content .name } ]({ content .package_link } )"
152+ text += f"|{ content .version } "
153+ if content .license_link :
154+ text += f"|[{ content .license } ]({ content .license_link } )|\n "
155+ else :
156+ text += f"|{ content .license } |\n "
157+ text += "\n "
158+ return text
159+
160+ _template = cleandoc (
161+ """
162+ {header}{rows}
163+ """
164+ )
165+ return _template .format (
166+ header = _header (group ), rows = _rows (group_packages , packages )
167+ )
168+
163169 template = cleandoc (
164170 """
165171 {heading}{rows}
166172 """
167173 )
168- rows = ""
169174
175+ rows = ""
170176 for group in dependencies :
171177 rows += dependency (group , dependencies [group ], packages )
172178 return template .format (heading = heading (), rows = rows )
@@ -177,6 +183,7 @@ def dependency_licenses(session: Session) -> None:
177183 """returns the packages and their licenses"""
178184 toml = Path ("pyproject.toml" )
179185 dependencies = _dependencies (toml .read_text ())
180- _licenses (session )
181- package_infos = _packages_from_json (Path ("packages.json" ))
182- print (packages_markdown (dependencies , package_infos ))
186+ _licenses (session = session , filename = ".packages.json" )
187+ json = Path (".packages.json" ).read_text ()
188+ package_infos = _packages_from_json (json )
189+ print (_packages_to_markdown (dependencies = dependencies , packages = package_infos ))
0 commit comments