99#
1010
1111import ast
12+ from configparser import ConfigParser
1213import json
1314import logging
15+ from pathlib import Path
1416import os
1517import re
1618import sys
1719from typing import NamedTuple
20+ import tempfile
1821import zipfile
19- from configparser import ConfigParser
20- from pathlib import Path
2122
2223import dparse2
2324import packaging
@@ -456,7 +457,7 @@ def parse_metadata(location, datasource_id, package_type):
456457 primary_language = 'Python' ,
457458 name = name ,
458459 version = version ,
459- description = get_description ( metainfo = meta , location = str (location )),
460+ description = get_description (metainfo = meta , location = str (location )),
460461 #TODO: https://github.com/nexB/scancode-toolkit/issues/3014
461462 declared_license = get_declared_license (meta ),
462463 keywords = get_keywords (meta ),
@@ -707,27 +708,26 @@ def parse(cls, location):
707708 "setup_requires" : "setup" ,
708709 "python_requires" : "python" ,
709710 }
710- for sub_section in scope_by_sub_section :
711+ for sub_section , scope in scope_by_sub_section . items () :
711712 if sub_section not in section :
712713 continue
713- scope = scope_by_sub_section [sub_section ]
714714 if scope != "python" :
715715 reqs = list (get_requirement_from_section (section = section , sub_section = sub_section ))
716716 dependent_packages .extend (cls .parse_reqs (reqs , scope ))
717717 continue
718- python_requires = section [sub_section ]
718+ python_requires_specifier = section [sub_section ]
719719 purl = PackageURL (
720+ type = "generic" ,
720721 name = "python" ,
721- type = "generic"
722722 )
723- resolved_purl = is_purl_resolved (purl = purl , specifiers = SpecifierSet (python_requires ))
723+ resolved_purl = get_resolved_purl (purl = purl , specifiers = SpecifierSet (python_requires_specifier ))
724724 dependent_packages .append (models .DependentPackage (
725725 purl = str (resolved_purl .purl ),
726726 scope = scope ,
727727 is_runtime = True ,
728728 is_optional = False ,
729729 is_resolved = resolved_purl .is_resolved ,
730- extracted_requirement = f"python_requires{ python_requires } " ,
730+ extracted_requirement = f"python_requires{ python_requires_specifier } " ,
731731 ))
732732
733733 if section .name == "options.extras_require" :
@@ -784,7 +784,7 @@ def parse_reqs(cls, reqs, scope):
784784 name = canonicalize_name (req_parsed .name )
785785 purl = PackageURL (type = "pypi" , name = name )
786786 specifiers = req_parsed .specifier ._specs
787- resolved_purl = is_purl_resolved (purl = purl , specifiers = specifiers )
787+ resolved_purl = get_resolved_purl (purl = purl , specifiers = specifiers )
788788 dependent_packages .append (
789789 models .DependentPackage (
790790 purl = str (resolved_purl .purl ),
@@ -798,9 +798,10 @@ def parse_reqs(cls, reqs, scope):
798798 return dependent_packages
799799
800800
801- def is_purl_resolved (purl : PackageURL , specifiers : SpecifierSet ):
801+ def get_resolved_purl (purl : PackageURL , specifiers : SpecifierSet ):
802802 """
803- Check if the purl is resolved
803+ Check if the purl is resolved and return a ResolvedPurl.
804+ If the purl is resolved, update its version to the pinned version
804805 """
805806 is_resolved = False
806807 if len (specifiers ) == 1 :
@@ -901,7 +902,7 @@ def get_requirements_txt_dependencies(location, include_nested=False):
901902 include_nested = include_nested ,
902903 )
903904 if not req_file or not req_file .requirements :
904- return []
905+ return [], {}
905906
906907 # for now we ignore errors
907908 extra_data = {}
@@ -1979,23 +1980,14 @@ def compute_normalized_license(declared_license):
19791980
19801981def get_requirement_from_section (section , sub_section ):
19811982 """
1982- Generate requirements from the `sub_section`
1983- """
1984- content = section .get (sub_section ) or ""
1985- for req in content .splitlines ():
1986- if not req :
1987- continue
1988- #pytest-mypy >= 0.9.1; \
1989- req = req .replace ("; \\ " , "" )
1990- # pip>=19.1 # For proper file:// URLs support.
1991- if "#" in req :
1992- req , _ = req .rsplit ("#" )
1993- try :
1994- Requirement (req )
1995- yield req
1996- except :
1997- #pure-eval; black; tox
1998- req_split_by_semi_colon = req .split (";" )
1999- req_split_by_semi_colon = [req .strip () for req in req_split_by_semi_colon if req ]
2000- for req in req_split_by_semi_colon :
2001- yield req
1983+ Yield extracted requirement from the ``sub_section`` key of of a ``section``
1984+ mapping (from a setup.cfg)
1985+ """
1986+ content = section .get (sub_section , "" )
1987+ temp = tempfile .NamedTemporaryFile (delete = False )
1988+ location = temp .name
1989+ with open (location , "w" ) as f :
1990+ f .write (content )
1991+ packages , _ = get_requirements_txt_dependencies (location = location )
1992+ for req in packages :
1993+ yield req .extracted_requirement
0 commit comments