Skip to content

Commit c36bb78

Browse files
author
Shubh Bapna
committed
allow prereleases from requirements
1 parent 393233a commit c36bb78

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

src/fromager/resolver.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,9 @@ def get_preference(
233233
def is_satisfied_by(self, requirement: Requirement, candidate: Candidate) -> bool:
234234
if canonicalize_name(requirement.name) != candidate.name:
235235
return False
236-
allow_prerelease = self.constraints.allow_prerelease(requirement.name)
236+
allow_prerelease = self.constraints.allow_prerelease(requirement.name) or bool(
237+
requirement.specifier.prereleases
238+
)
237239
return requirement.specifier.contains(
238240
candidate.version, prereleases=allow_prerelease
239241
) and self.constraints.is_satisfied_by(requirement.name, candidate.version)
@@ -291,7 +293,10 @@ def find_matches(
291293
continue
292294
# Skip versions that do not match the requirement. Allow prereleases only if constraints allow prereleases
293295
if not all(
294-
r.specifier.contains(candidate.version, prereleases=allow_prerelease)
296+
r.specifier.contains(
297+
candidate.version,
298+
prereleases=(allow_prerelease or bool(r.specifier.prereleases)),
299+
)
295300
for r in identifier_reqs
296301
):
297302
if DEBUG_RESOLVER:
@@ -372,7 +377,10 @@ def find_matches(
372377
continue
373378
# Skip versions that do not match the requirement
374379
if not all(
375-
r.specifier.contains(version, prereleases=allow_prerelease)
380+
r.specifier.contains(
381+
version,
382+
prereleases=(allow_prerelease or bool(r.specifier.prereleases)),
383+
)
376384
for r in identifier_reqs
377385
):
378386
if DEBUG_RESOLVER:

tests/test_resolver.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
<a href="https://files.pythonhosted.org/packages/c6/50/e0edd38dcd63fb26a8547f13d28f7a008bc4a3fd4eb4ff030673f22ad41a/hydra_core-1.3.2-1-py3-none-any.whl#sha256=fa0238a9e31df3373b35b0bfb672c34cc92718d21f81311d8996a16de1141d8b" data-dist-info-metadata="sha256=399046cbf9ae7ebab8dfd009e2b4f748212c710a0e75ca501a72bbb2d456e2e7" data-core-metadata="sha256=399046cbf9ae7ebab8dfd009e2b4f748212c710a0e75ca501a72bbb2d456e2e7">hydra_core-1.3.2-1-py3-none-any.whl</a>
2424
<br/>
2525
<a href="https://files.pythonhosted.org/packages/c6/50/e0edd38dcd63fb26a8547f13d28f7a008bc4a3fd4eb4ff030673f22ad41a/hydra_core-1.3.2-2-py3-none-any.whl#sha256=fa0238a9e31df3373b35b0bfb672c34cc92718d21f81311d8996a16de1141d8b" data-dist-info-metadata="sha256=399046cbf9ae7ebab8dfd009e2b4f748212c710a0e75ca501a72bbb2d456e2e7" data-core-metadata="sha256=399046cbf9ae7ebab8dfd009e2b4f748212c710a0e75ca501a72bbb2d456e2e7">hydra_core-1.3.2-2-py3-none-any.whl</a>
26+
<br />
27+
<a href="https://files.pythonhosted.org/packages/c6/50/e0edd38dcd63fb26a8547f13d28f7a008bc4a3fd4eb4ff030673f22ad41a/hydra_core-2.0.0a1-py3-none-any.whl" >hydra_core-2.0.0a1-py3-none-any.whl</a>
2628
</body>
2729
</html>
2830
<!--SERIAL 22812307-->
@@ -51,6 +53,28 @@ def test_provider_choose_wheel():
5153
assert str(candidate.version) == "1.3.2"
5254

5355

56+
def test_provider_choose_wheel_prereleases():
57+
with requests_mock.Mocker() as r:
58+
r.get(
59+
"https://pypi.org/simple/hydra-core/",
60+
text=_hydra_core_simple_response,
61+
)
62+
63+
provider = resolver.PyPIProvider(include_sdists=False)
64+
reporter = resolvelib.BaseReporter()
65+
rslvr = resolvelib.Resolver(provider, reporter)
66+
67+
result = rslvr.resolve([Requirement("hydra-core==2.0.0a1")])
68+
assert "hydra-core" in result.mapping
69+
70+
candidate = result.mapping["hydra-core"]
71+
assert (
72+
candidate.url
73+
== "https://files.pythonhosted.org/packages/c6/50/e0edd38dcd63fb26a8547f13d28f7a008bc4a3fd4eb4ff030673f22ad41a/hydra_core-2.0.0a1-py3-none-any.whl"
74+
)
75+
assert str(candidate.version) == "2.0.0a1"
76+
77+
5478
def test_provider_choose_sdist():
5579
with requests_mock.Mocker() as r:
5680
r.get(

0 commit comments

Comments
 (0)