22import collections
33import os .path
44
5- from liccheck .requirements import parse_requirements , resolve , resolve_without_deps
5+ from liccheck .requirements import parse_requirements , resolve
66
77from configparser import ConfigParser , NoOptionError
88import enum
99import functools
1010import re
1111import textwrap
12+ from packaging .requirements import Requirement
1213import sys
1314import semantic_version
1415import toml
@@ -138,10 +139,7 @@ class Reason(enum.Enum):
138139
139140
140141def get_packages_info (requirement_file , no_deps = False ):
141- regex_license = re .compile (r"License(?:-Expression)?: (?P<license>.*)?$" , re .M )
142- regex_classifier = re .compile (
143- r"Classifier: License(?: :: OSI Approved)?(?: :: (?P<classifier>.*))?$" , re .M
144- )
142+ regex_classifier = re .compile (r"^License(?: :: OSI Approved)?(?: :: (?P<classifier>.*))?$" )
145143
146144 requirements = parse_requirements (requirement_file )
147145
@@ -153,31 +151,27 @@ def transform(dist):
153151 licenses = list (set ([strip_license (l ) for l in licenses ]))
154152
155153 return {
156- "name" : dist .project_name ,
154+ "name" : dist .name ,
157155 "version" : dist .version ,
158- "location" : dist .location ,
159- "dependencies" : [dependency .project_name for dependency in dist .requires ()],
156+ "dependencies" : [Requirement (r ).name for r in dist .requires ] if dist .requires is not None else [],
160157 "licenses" : licenses ,
161158 }
162159
163160 def get_license (dist ):
164- if dist .has_metadata (dist .PKG_INFO ):
165- metadata = dist .get_metadata (dist .PKG_INFO )
166- match = regex_license .search (metadata )
167- if match :
168- license = match .group ("license" )
169- if license != "UNKNOWN" : # Value when license not specified.
170- return [license ]
161+ if dist .metadata is not None :
162+ license = dist .metadata .get ('License-Expression' ) or dist .metadata .get ('License' )
163+ if license is not None :
164+ return [license ]
171165
172166 return []
173167
174168 def get_licenses_from_classifiers (dist ):
175- if dist .has_metadata ( dist . PKG_INFO ) :
176- metadata = dist .get_metadata ( dist . PKG_INFO )
177-
178- # match might be found, but None if using the classifier:
179- # License :: OSI Approved
180- return [m for m in regex_classifier .findall ( metadata ) if m ]
169+ if dist .metadata is not None :
170+ classifiers = dist .metadata . get_all ( 'Classifier' )
171+ if classifiers is not None :
172+ # match might be found, but None if using the classifier:
173+ # License :: OSI Approved
174+ return [l . group ( 1 ) for l in [ regex_classifier .match ( m ) for m in classifiers ] if l ]
181175
182176 return []
183177
@@ -191,11 +185,12 @@ def strip_license(license):
191185 return license [: - len (" license" )]
192186 return license
193187
194- resolve_func = resolve_without_deps if no_deps else resolve
195- packages = [transform (dist ) for dist in resolve_func (requirements )]
188+ packages = [transform (dist ) for dist in resolve (requirements , without_deps = no_deps )]
196189 # keep only unique values as there are maybe some duplicates
197190 unique = []
198- [unique .append (item ) for item in packages if item not in unique ]
191+ for item in packages :
192+ if item not in unique :
193+ unique .append (item )
199194
200195 return sorted (unique , key = (lambda item : item ["name" ].lower ()))
201196
0 commit comments