4040import sys
4141from tempfile import NamedTemporaryFile , mkdtemp
4242
43- import pkg_resources
4443from click import echo as _echo
4544from packaging .markers import default_environment
45+ from packaging .requirements import Requirement as PkgRequirement
4646from packaging .utils import canonicalize_name
4747
4848from pipgrip .compat import PIP_VERSION , urlparse
@@ -65,6 +65,34 @@ def read_requirements(path):
6565 raise RuntimeError ("{} is broken" .format (path ))
6666
6767
68+ class ParsedRequirement (object ):
69+ """Parsed requirement with attributes compatible with the old pkg_resources interface."""
70+
71+ __slots__ = (
72+ "key" ,
73+ "name" ,
74+ "extras" ,
75+ "extras_name" ,
76+ "specs" ,
77+ "url" ,
78+ "marker" ,
79+ "_str" ,
80+ )
81+
82+ def __init__ (self , key , name , extras , extras_name , specs , url , marker , full_str ):
83+ self .key = key
84+ self .name = name
85+ self .extras = extras
86+ self .extras_name = extras_name
87+ self .specs = specs
88+ self .url = url
89+ self .marker = marker
90+ self ._str = full_str
91+
92+ def __str__ (self ):
93+ return self ._str
94+
95+
6896_parse_req_cache = {}
6997
7098
@@ -74,32 +102,37 @@ def parse_req(requirement, extras=None):
74102 if cache_key in _parse_req_cache :
75103 return _parse_req_cache [cache_key ]
76104 if requirement == "_root_" or requirement == "." or requirement .startswith (".[" ):
77- req = pkg_resources . Requirement . parse (
105+ parsed = PkgRequirement (
78106 requirement .replace ("." , "rubbish" , 1 )
79107 if requirement .startswith (".[" )
80108 else "rubbish"
81109 )
82110 if extras :
83- req .extras = extras
84- req .key = "." if requirement .startswith (".[" ) else requirement
85- full_str = req .__str__ ().replace (req .name , req .key )
86- req .name = req .key
111+ parsed .extras = extras
112+ key = "." if requirement .startswith (".[" ) else requirement
113+ full_str = str (parsed ).replace (parsed .name , key )
87114 else :
88- req = pkg_resources . Requirement . parse (requirement )
115+ parsed = PkgRequirement (requirement )
89116 if extras :
90- req .extras = extras
91- req .key = canonicalize_name (req .key )
92- req .name = req .key
93- full_str = req .__str__ () # .replace(req.name, req.key)
117+ parsed .extras = extras
118+ key = canonicalize_name (parsed .name )
119+ full_str = str (parsed ).replace (parsed .name , key , 1 )
94120
95- def __str__ ():
96- return full_str
97-
98- req .__str__ = __str__
99- req .extras_name = (
100- req .name + "[" + "," .join (sorted (req .extras )) + "]" if req .extras else req .name
121+ extras_frozen = frozenset (parsed .extras )
122+ extras_name = (
123+ key + "[" + "," .join (sorted (extras_frozen )) + "]" if extras_frozen else key
124+ )
125+ specs = [(s .operator , s .version ) for s in parsed .specifier ]
126+ req = ParsedRequirement (
127+ key = key ,
128+ name = key ,
129+ extras = extras_frozen ,
130+ extras_name = extras_name ,
131+ specs = specs ,
132+ url = parsed .url ,
133+ marker = parsed .marker ,
134+ full_str = full_str ,
101135 )
102- req .extras = frozenset (req .extras )
103136 _parse_req_cache [cache_key ] = req
104137 return req
105138
0 commit comments