Skip to content

Commit 8decb45

Browse files
authored
Fix error caused by weakly referenced package not specifying version range (#1712)
Signed-off-by: loonghao <[email protected]>
1 parent 9b01d0b commit 8decb45

File tree

6 files changed

+46
-10
lines changed

6 files changed

+46
-10
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
name = "test_weakly_reference_requires"
2+
version = "2.0"
3+
4+
requires = ["~test_variant_split_mid1", "~test_variant_split_mid2"]
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
name = "test_weakly_reference_variant"
2+
version = "2.0"
3+
4+
requires = ["~pyfoo"]
5+
6+
variants = [["test_variant_split_mid1", "~test_variant_split_mid2-1..3"]]

src/rez/package_order.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,9 @@ def sort_key(self, package_name, version_like):
116116
117117
Args:
118118
package_name: (str) The family name of the package we are sorting
119-
version_like: (Version|_LowerBound|_UpperBound|_Bound|VersionRange)
120-
the version-like object you wish to generate a key for
119+
version_like: (Version|_LowerBound|_UpperBound|_Bound|VersionRange|None)
120+
The version-like object to be used as a basis for generating a sort key.
121+
Note that 'None' is also a supported value, which maintains the default sorting order.
121122
122123
Returns:
123124
Sortable object
@@ -126,21 +127,26 @@ def sort_key(self, package_name, version_like):
126127
"""
127128
if isinstance(version_like, VersionRange):
128129
return tuple(self.sort_key(package_name, bound) for bound in version_like.bounds)
129-
elif isinstance(version_like, _Bound):
130+
if isinstance(version_like, _Bound):
130131
return (self.sort_key(package_name, version_like.lower),
131132
self.sort_key(package_name, version_like.upper))
132-
elif isinstance(version_like, _LowerBound):
133+
if isinstance(version_like, _LowerBound):
133134
inclusion_key = -2 if version_like.inclusive else -1
134135
return self.sort_key(package_name, version_like.version), inclusion_key
135-
elif isinstance(version_like, _UpperBound):
136+
if isinstance(version_like, _UpperBound):
136137
inclusion_key = 2 if version_like.inclusive else 1
137138
return self.sort_key(package_name, version_like.version), inclusion_key
138-
elif isinstance(version_like, Version):
139+
if isinstance(version_like, Version):
139140
# finally, the bit that we actually use the sort_key_implementation for.
140141
return FallbackComparable(
141142
self.sort_key_implementation(package_name, version_like), version_like)
142-
else:
143-
raise TypeError(version_like)
143+
if version_like is None:
144+
# As no version range is provided for this package,
145+
# Python's sort preserves the order of equal elements.
146+
# Thus, to maintain the original order,
147+
# we return the same object for all None values.
148+
return 0
149+
raise TypeError(version_like)
144150

145151
def sort_key_implementation(self, package_name, version):
146152
"""Returns a sort key usable for sorting these packages within the

src/rez/tests/test_completion.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ def _eq(prefix, expected_completions):
5252
_eq("", ["bahish", "nada", "nopy", "pybah", "pydad", "pyfoo", "pymum",
5353
"pyodd", "pyson", "pysplit", "python", "pyvariants",
5454
"test_variant_split_start", "test_variant_split_mid1",
55-
"test_variant_split_mid2", "test_variant_split_end", "missing_variant_requires"])
55+
"test_variant_split_mid2", "test_variant_split_end", "missing_variant_requires",
56+
"test_weakly_reference_requires", "test_weakly_reference_variant"])
5657
_eq("py", ["pybah", "pydad", "pyfoo", "pymum", "pyodd", "pyson",
5758
"pysplit", "python", "pyvariants"])
5859
_eq("pys", ["pyson", "pysplit"])

src/rez/tests/test_packages.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@
5858
'timestamped-1.0.5', 'timestamped-1.0.6', 'timestamped-1.1.0', 'timestamped-1.1.1',
5959
'timestamped-1.2.0', 'timestamped-2.0.0', 'timestamped-2.1.0', 'timestamped-2.1.5',
6060
'multi-1.0', 'multi-1.1', 'multi-1.2', 'multi-2.0',
61-
'missing_variant_requires-1'
61+
'missing_variant_requires-1',
62+
'test_weakly_reference_requires-2.0',
63+
'test_weakly_reference_variant-2.0',
6264
])
6365

6466

src/rez/tests/test_solver.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,23 @@ def test_12_missing_variant_requires(self):
256256
config.override("error_on_missing_variant_requires", False)
257257
self._solve(["missing_variant_requires"], ["nada[]", "missing_variant_requires-1[1]"])
258258

259+
def test_13_resolve_weakly_reference_requires(self):
260+
"""Test resolving a package with a weakly referenced requirement."""
261+
self._solve(["test_weakly_reference_requires", "test_variant_split_mid2-2"],
262+
['test_weakly_reference_requires-2.0[]',
263+
'test_variant_split_end-3.0[0]',
264+
'test_variant_split_mid2-2.0[1]'])
265+
266+
def test_14_resolve_weakly_reference_variant(self):
267+
"""Test resolving a package with a weakly referenced variant."""
268+
self._solve(["test_weakly_reference_variant-2.0", "test_variant_split_mid2-2", "pyfoo"],
269+
['test_variant_split_end-1.0[1]',
270+
'test_variant_split_mid1-1.0[1]',
271+
'test_weakly_reference_variant-2.0[0]',
272+
'test_variant_split_mid2-2.0[0]',
273+
'python-2.6.8[]',
274+
'pyfoo-3.1.0[]'])
275+
259276

260277
if __name__ == '__main__':
261278
unittest.main()

0 commit comments

Comments
 (0)