Skip to content

Commit 9da6fcd

Browse files
stephenfintipabu
authored andcommitted
generate-constraints: Make use of ranges
Currently, if we run with generate-constraints with a large number of Python versions, we will get a large number of Python version specific markers for dependencies: one for each passed Python version. For example: $ generate-constraints \ -b blacklist.txt \ -p /usr/bin/python3.8 \ -p /usr/bin/python3.9 \ -p /usr/bin/python3.10 \ -r global-requirements.txt Will yield versions like: networkx===3.1;python_version=='3.8' networkx===3.2.1;python_version=='3.10' networkx===3.2.1;python_version=='3.9' What has happened here is that the given dependency (networkx in this case) has dropped support for an older Python version (Python 3.8). However, the way that we've specified this limits our constraints to the versions of Python we ran (-p <python>) or the versions we mapped/mocked (--version map <real:mapped[:mapped...]>). This isn't ideal. Instead, it would be better to think in terms of upper and lower limits. That is, if we generated a map like so: networkx===3.1;python_version<='3.8' networkx===3.2.1;python_version>='3.9' This has the benefit of being simpler and potentially allowing us to generate constraints for more Python versions than we currently check for. Change-Id: Ibfc6a79624e5591baf945a578f9d265071e57f73 Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
1 parent 4a00643 commit 9da6fcd

File tree

2 files changed

+23
-11
lines changed

2 files changed

+23
-11
lines changed

openstack_requirements/cmds/generate.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ def _combine_freezes(freezes, denylist=None):
127127
for py_version, freeze in freezes:
128128
if py_version in reference_versions:
129129
raise Exception("Duplicate python %s" % py_version)
130+
130131
reference_versions.append(py_version)
131132
for package, version in freeze:
132133
packages.setdefault(
@@ -135,18 +136,29 @@ def _combine_freezes(freezes, denylist=None):
135136
for package, versions in sorted(packages.items()):
136137
if package.lower() in excludes:
137138
continue
138-
if (len(versions) != 1 or
139-
list(versions.values())[0] != reference_versions):
140-
# markers
141-
for version, py_versions in sorted(versions.items()):
142-
# Once the ecosystem matures, we can consider using OR.
139+
140+
if len(versions) > 1:
141+
# markers for packages with multiple versions - we use python
142+
# version ranges for these
143+
for idx, (version, py_versions) in enumerate(sorted(versions.items())): # noqa: E501
144+
if idx == 0: # lower-bound
145+
marker = f"python_version<='{py_versions[-1]}'"
146+
elif idx + 1 != len(versions): # intermediate version(s)
147+
marker = f"python_version>='{py_versions[0]}',<={py_versions[-1]}" # noqa: E501
148+
else: # upper-bound
149+
marker = f"python_version>='{py_versions[0]}'"
150+
151+
yield f'{package}==={version};{marker}\n'
152+
elif list(versions.values())[0] != reference_versions:
153+
# markers for packages with a single version - these are usually
154+
# version specific so we use strict python versions for these
155+
for idx, (version, py_versions) in enumerate(sorted(versions.items())): # noqa: E501
143156
for py_version in sorted(py_versions):
144-
yield (
145-
"%s===%s;python_version=='%s'\n" %
146-
(package, version, py_version))
157+
marker = f"python_version=='{py_version}'"
158+
yield f'{package}==={version};{marker}\n'
147159
else:
148160
# no markers
149-
yield '%s===%s\n' % (package, list(versions.keys())[0])
161+
yield f'{package}==={list(versions)[0]}\n'
150162

151163

152164
def _clone_versions(freezes, options):

openstack_requirements/tests/test_generate.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ def test_different_versions(self):
8989
freeze_27 = ('2.7', [('fixtures', '1.2.0')])
9090
freeze_34 = ('3.4', [('fixtures', '1.5.0')])
9191
self.assertEqual(
92-
["fixtures===1.2.0;python_version=='2.7'\n",
93-
"fixtures===1.5.0;python_version=='3.4'\n"],
92+
["fixtures===1.2.0;python_version<='2.7'\n",
93+
"fixtures===1.5.0;python_version>='3.4'\n"],
9494
list(generate._combine_freezes([freeze_27, freeze_34])))
9595

9696
def test_duplicate_pythons(self):

0 commit comments

Comments
 (0)