Skip to content

Commit 7b62011

Browse files
stephenfinpriteau
authored andcommitted
[stable-only] remove pkg_resouces from reqiurements-check
this is a squash of 3 commits and a cap of setuptools to < 82 in setup.py Depends-on: https://review.opendev.org/c/openstack/devstack/+/976106 Replace use of distutils.version This is gone in Python 3.12. Ordering is slightly different with release candidates now (correctly, IMO) placed ahead of general releases so we have to update a single entry. codesearch.o.o [1] suggests this shouldn't affect anyone. [1] https://codesearch.opendev.org/?q=pysaml2!%3D4.0.3 Change-Id: I4cde27f048889dd557c0473138bd8a75c1e1cc58 Signed-off-by: Stephen Finucane <stephenfin@redhat.com> (cherry picked from commit 2d88770) Remove check-conflicts script This script made sense back before pip had a proper dependency resolver, but since pip 20.3 [1] this is no longer the case. Our jobs to test this can simply install the dependencies and let pip complain if it cannot resolve things. [1] https://discuss.python.org/t/announcement-pip-20-3-release/5948 Change-Id: Ifc30478dfffd52f126e0ad7535468cdd0b1cd36a Signed-off-by: Stephen Finucane <stephenfin@redhat.com> (cherry picked from commit 63a1790) Add pyproject.toml to fix install issues After capping setuptools in setup.py, there are issues when installing our library in a venv. Add a pyproject.toml file to avoid this. Signed-off-by: Dr. Jens Harbott <harbott@osism.tech> Change-Id: Ib9b7ecde0210a3b11bcb70e96e295cf73f2e0954 (cherry picked from commit ad78d83) Replace pkg_resources This will be removed after 2025-11-30. Get ahead of that breakage. Change-Id: Ib97eea1037fac541c8ebadc526ae9c3bb160f685 Signed-off-by: Stephen Finucane <stephenfin@redhat.com> (cherry picked from commit 7f008f9) (cherry picked from commit ed0f971)
1 parent 65790a5 commit 7b62011

12 files changed

Lines changed: 38 additions & 109 deletions

File tree

detail.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import urllib.parse as urlparse
2121
import urllib.request as urlreq
2222

23-
import pkg_resources
23+
import packaging.requirement
2424

2525
try:
2626
PYPI_LOCATION = os.environ['PYPI_LOCATION']
@@ -40,11 +40,11 @@
4040

4141

4242
def iter_names(req):
43-
for k in (req.key, req.project_name):
44-
yield k
45-
yield k.title()
46-
yield k.replace("-", "_")
47-
yield k.replace("-", "_").title()
43+
yield req.name
44+
yield req.name.lower()
45+
yield req.name.title()
46+
yield req.name.replace("-", "_")
47+
yield req.name.replace("-", "_").title()
4848

4949

5050
def release_data(req):
@@ -76,7 +76,7 @@ def main():
7676
line = line.strip()
7777
if line.startswith("#") or not line:
7878
continue
79-
req = pkg_resources.Requirement.parse(line)
79+
req = packaging.requirement.Requirement(line)
8080
print(" - processing: %s" % (req))
8181
try:
8282
raw_req_data = release_data(req)

global-requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ PyMySQL # MIT License
125125
pyOpenSSL # Apache-2.0
126126
pyparsing # MIT
127127
pyroute2!=0.5.4,!=0.5.5,!=0.7.1;sys_platform!='win32' # Apache-2.0 (+ dual licensed GPL2)
128-
pysaml2!=4.0.3,!=4.0.4,!=4.0.5,!=4.0.5rc1,!=4.1.0,!=4.2.0,!=4.3.0,!=4.4.0,!=4.6.0 # Apache-2.0
128+
pysaml2!=4.0.3,!=4.0.4,!=4.0.5rc1,!=4.0.5,!=4.1.0,!=4.2.0,!=4.3.0,!=4.4.0,!=4.6.0 # Apache-2.0
129129
pysnmp-lextudio # BSD
130130
pystache # MIT
131131
# Only required for sasl/binary protocol

openstack_requirements/cmds/check_conflicts.py

Lines changed: 0 additions & 75 deletions
This file was deleted.

openstack_requirements/constraints.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
from packaging import specifiers
1414

15+
from openstack_requirements import requirement
16+
1517

1618
# FIXME(dhellmann): These items were not in the constraints list but
1719
# should not be denylisted. We don't know yet what versions they
@@ -102,7 +104,7 @@ def satisfied(reqs, name, version, failures):
102104
failures = []
103105
for pkg_constraints in constraints.values():
104106
for constraint, _ in pkg_constraints:
105-
name = constraint.package
107+
name = requirement.canonical_name(constraint.package)
106108
version = constraint.specifiers[3:]
107109
satisfied(global_reqs, name, version, failures)
108110
return failures

openstack_requirements/requirement.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515
# This module has no IO at all, and none should be added.
1616

1717
import collections
18-
import distutils.version
18+
import packaging.requirements
1919
import packaging.specifiers
20-
import pkg_resources
20+
import packaging.utils
21+
import packaging.version
2122
import re
2223

2324

@@ -37,7 +38,7 @@ def key_specifier(a):
3738
'===': 1, '==': 1, '~=': 1, '!=': 1,
3839
'<': 2, '<=': 2}
3940
a = a._spec
40-
return (weight[a[0]], distutils.version.LooseVersion(a[1]))
41+
return (weight[a[0]], packaging.version.parse(a[1]))
4142

4243

4344
class Requirement(collections.namedtuple('Requirement',
@@ -81,7 +82,7 @@ def to_line(self, marker_sep=';', line_prefix='', comment_prefix=' ',
8182

8283
def canonical_name(req_name):
8384
"""Return the canonical form of req_name."""
84-
return pkg_resources.safe_name(req_name).lower()
85+
return packaging.utils.canonicalize_name(req_name)
8586

8687

8788
def parse(content, permit_urls=False):
@@ -127,7 +128,7 @@ def parse_line(req_line, permit_urls=False):
127128
hash_pos = hash_pos + parse_start
128129
else:
129130
# Trigger an early failure before we look for ':'
130-
pkg_resources.Requirement.parse(req_line)
131+
packaging.requirements.Requirement(req_line)
131132
else:
132133
parse_start = 0
133134
location = ''
@@ -149,8 +150,8 @@ def parse_line(req_line, permit_urls=False):
149150
specifier = ''
150151
elif req_line:
151152
# Pulled out a requirement
152-
parsed = pkg_resources.Requirement.parse(req_line)
153-
name = parsed.project_name
153+
parsed = packaging.requirements.Requirement(req_line)
154+
name = parsed.name
154155
extras = parsed.extras
155156
specifier = str(parsed.specifier)
156157
else:

openstack_requirements/tests/test_requirement.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ def test_multiline(self):
156156
""")
157157
reqs = requirement.parse(content)
158158
self.assertEqual(
159-
set(['oslo.config', 'oslo.concurrency', 'oslo.context']),
159+
{'oslo-config', 'oslo-concurrency', 'oslo-context'},
160160
set(reqs.keys()),
161161
)
162162

@@ -168,16 +168,16 @@ def test_extras(self):
168168
""")
169169
reqs = requirement.parse(content)
170170
self.assertEqual(
171-
set(['oslo.config', 'oslo.concurrency', 'oslo.db']),
171+
{'oslo-config', 'oslo-concurrency', 'oslo-db'},
172172
set(reqs.keys()),
173173
)
174-
self.assertEqual(reqs['oslo.config'][0][0].extras, frozenset(()))
175-
self.assertEqual(reqs['oslo.concurrency'][0][0].extras,
174+
self.assertEqual(reqs['oslo-config'][0][0].extras, frozenset(()))
175+
self.assertEqual(reqs['oslo-concurrency'][0][0].extras,
176176
frozenset(('fixtures',)))
177-
self.assertEqual(reqs['oslo.db'][0][0].extras,
177+
self.assertEqual(reqs['oslo-db'][0][0].extras,
178178
frozenset(('fixtures', 'mysql')))
179179
self.assertCountEqual(reqs,
180-
['oslo.config', 'oslo.concurrency', 'oslo.db'])
180+
['oslo-config', 'oslo-concurrency', 'oslo-db'])
181181

182182

183183
class TestCanonicalName(testtools.TestCase):

pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[build-system]
2+
requires = ["pbr>=6.1.1","setuptools<82"]
3+
build-backend = "pbr.build"

setup.cfg

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ packages =
3030
console_scripts =
3131
edit-constraints = openstack_requirements.cmds.edit_constraint:main
3232
generate-constraints = openstack_requirements.cmds.generate:main
33-
check-conflicts = openstack_requirements.cmds.check_conflicts:main
3433
validate-constraints = openstack_requirements.cmds.validate:main
3534
validate-projects = openstack_requirements.cmds.validate_projects:main
3635
normalize-requirements = openstack_requirements.cmds.normalize_requirements:main

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@
1717
import setuptools
1818

1919
setuptools.setup(
20-
setup_requires=['pbr>=2.0.0'],
20+
setup_requires=['pbr>=2.0.0', 'setuptools<82'],
2121
pbr=True)

tools/cap.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,10 @@
1212
# License for the specific language governing permissions and limitations
1313
# under the License.
1414

15-
1615
import argparse
1716
import re
1817

19-
import pkg_resources
18+
import packaging.requirements
2019

2120
overrides = dict()
2221
# List of overrides needed. Ignore version in pip-freeze and use the one here
@@ -38,7 +37,7 @@ def cap(requirements, frozen):
3837
output = []
3938
for line in requirements:
4039
try:
41-
req = pkg_resources.Requirement.parse(line)
40+
req = packaging.requirements.Requirement(line)
4241
specifier = str(req.specifier)
4342
if any(op in specifier for op in ['==', '~=', '<']):
4443
# if already capped, continue
@@ -67,7 +66,7 @@ def cap(requirements, frozen):
6766
def pin(line, new_cap):
6867
"""Add new cap into existing line
6968
70-
Don't use pkg_resources so we can preserve the comments.
69+
Don't use packaging.requirements so we can preserve the comments.
7170
"""
7271
end = None
7372
use_comma = False
@@ -109,7 +108,7 @@ def freeze(lines):
109108

110109
for line in lines:
111110
try:
112-
req = pkg_resources.Requirement.parse(line)
111+
req = packaging.requirements.Requirement(line)
113112
freeze[req.project_name] = req.specifier
114113
except ValueError:
115114
# not a valid requirement, can be a comment, blank line etc

0 commit comments

Comments
 (0)