Skip to content

Commit 1cecf88

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "generate-constraints: Make use of ranges"
2 parents a795bef + 9da6fcd commit 1cecf88

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)