diff --git a/detail.py b/detail.py index b48d4c44fd..a98065a20d 100644 --- a/detail.py +++ b/detail.py @@ -20,7 +20,7 @@ import traceback import urllib.parse as urlparse import urllib.request as urlreq -import pkg_resources +import packaging.requirement try: PYPI_LOCATION = os.environ['PYPI_LOCATION'] @@ -40,11 +40,11 @@ KEEP_KEYS = frozenset([ def iter_names(req): - for k in (req.key, req.project_name): - yield k - yield k.title() - yield k.replace("-", "_") - yield k.replace("-", "_").title() + yield req.name + yield req.name.lower() + yield req.name.title() + yield req.name.replace("-", "_") + yield req.name.replace("-", "_").title() def release_data(req): @@ -76,7 +76,7 @@ def main(): line = line.strip() if line.startswith("#") or not line: continue - req = pkg_resources.Requirement.parse(line) + req = packaging.requirement.Requirement(line) print(" - processing: %s" % (req)) try: raw_req_data = release_data(req) diff --git a/openstack_requirements/constraints.py b/openstack_requirements/constraints.py index f374f242cf..6680d3a20e 100644 --- a/openstack_requirements/constraints.py +++ b/openstack_requirements/constraints.py @@ -12,6 +12,8 @@ from packaging import specifiers +from openstack_requirements import requirement + # FIXME(dhellmann): These items were not in the constraints list but # should not be denylisted. We don't know yet what versions they @@ -102,7 +104,7 @@ def check_compatible(global_reqs, constraints): failures = [] for pkg_constraints in constraints.values(): for constraint, _ in pkg_constraints: - name = constraint.package + name = requirement.canonical_name(constraint.package) version = constraint.specifiers[3:] satisfied(global_reqs, name, version, failures) return failures diff --git a/openstack_requirements/requirement.py b/openstack_requirements/requirement.py index da94db5248..89b3e4c56c 100644 --- a/openstack_requirements/requirement.py +++ b/openstack_requirements/requirement.py @@ -15,9 +15,10 @@ # This module has no IO at all, and none should be added. import collections +import packaging.requirements import packaging.specifiers +import packaging.utils import packaging.version -import pkg_resources import re @@ -70,7 +71,7 @@ url_re = re.compile( def canonical_name(req_name): """Return the canonical form of req_name.""" - return pkg_resources.safe_name(req_name).lower() + return packaging.utils.canonicalize_name(req_name) def parse(content, permit_urls=False): @@ -116,7 +117,7 @@ def parse_line(req_line, permit_urls=False): hash_pos = hash_pos + parse_start else: # Trigger an early failure before we look for ':' - pkg_resources.Requirement.parse(req_line) + packaging.requirements.Requirement(req_line) else: parse_start = 0 location = '' @@ -138,8 +139,8 @@ def parse_line(req_line, permit_urls=False): specifier = '' elif req_line: # Pulled out a requirement - parsed = pkg_resources.Requirement.parse(req_line) - name = parsed.project_name + parsed = packaging.requirements.Requirement(req_line) + name = parsed.name extras = parsed.extras specifier = str(parsed.specifier) else: diff --git a/openstack_requirements/tests/test_requirement.py b/openstack_requirements/tests/test_requirement.py index f0a4ed5daa..8942a33942 100644 --- a/openstack_requirements/tests/test_requirement.py +++ b/openstack_requirements/tests/test_requirement.py @@ -154,7 +154,7 @@ class TestToReqs(testtools.TestCase): """) reqs = requirement.parse(content) self.assertEqual( - set(['oslo.config', 'oslo.concurrency', 'oslo.context']), + {'oslo-config', 'oslo-concurrency', 'oslo-context'}, set(reqs.keys()), ) @@ -166,16 +166,16 @@ class TestToReqs(testtools.TestCase): """) reqs = requirement.parse(content) self.assertEqual( - set(['oslo.config', 'oslo.concurrency', 'oslo.db']), + {'oslo-config', 'oslo-concurrency', 'oslo-db'}, set(reqs.keys()), ) - self.assertEqual(reqs['oslo.config'][0][0].extras, frozenset(())) - self.assertEqual(reqs['oslo.concurrency'][0][0].extras, + self.assertEqual(reqs['oslo-config'][0][0].extras, frozenset(())) + self.assertEqual(reqs['oslo-concurrency'][0][0].extras, frozenset(('fixtures',))) - self.assertEqual(reqs['oslo.db'][0][0].extras, + self.assertEqual(reqs['oslo-db'][0][0].extras, frozenset(('fixtures', 'mysql'))) self.assertCountEqual(reqs, - ['oslo.config', 'oslo.concurrency', 'oslo.db']) + ['oslo-config', 'oslo-concurrency', 'oslo-db']) class TestCanonicalName(testtools.TestCase): diff --git a/tools/cap.py b/tools/cap.py index cd6ba56751..82ed8e617c 100755 --- a/tools/cap.py +++ b/tools/cap.py @@ -12,11 +12,10 @@ # License for the specific language governing permissions and limitations # under the License. - import argparse import re -import pkg_resources +import packaging.requirements overrides = dict() # List of overrides needed. Ignore version in pip-freeze and use the one here @@ -38,7 +37,7 @@ def cap(requirements, frozen): output = [] for line in requirements: try: - req = pkg_resources.Requirement.parse(line) + req = packaging.requirements.Requirement(line) specifier = str(req.specifier) if any(op in specifier for op in ['==', '~=', '<']): # if already capped, continue @@ -67,7 +66,7 @@ def cap(requirements, frozen): def pin(line, new_cap): """Add new cap into existing line - Don't use pkg_resources so we can preserve the comments. + Don't use packaging.requirements so we can preserve the comments. """ end = None use_comma = False @@ -109,7 +108,7 @@ def freeze(lines): for line in lines: try: - req = pkg_resources.Requirement.parse(line) + req = packaging.requirements.Requirement(line) freeze[req.project_name] = req.specifier except ValueError: # not a valid requirement, can be a comment, blank line etc diff --git a/tools/what-broke.py b/tools/what-broke.py index 01194341f5..bb2d74e1ea 100755 --- a/tools/what-broke.py +++ b/tools/what-broke.py @@ -38,7 +38,7 @@ import json import sys import urllib.request as urlreq -import pkg_resources +import packaging.requirements class Release(object): @@ -62,7 +62,7 @@ def _parse_pypi_released(datestr): def _package_name(line): - return pkg_resources.Requirement.parse(line).project_name + return packaging.requirements.Requirement(line).name def get_requirements():