Skip to content

Commit 616d7bf

Browse files
authored
make allow-prereleases a tri-state setting to really forbid pre-releases if the setting is false and keep default behavior to allow pre-releases only if necessary (#783)
1 parent 5f6c309 commit 616d7bf

File tree

5 files changed

+34
-6
lines changed

5 files changed

+34
-6
lines changed

src/poetry/core/factory.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ def create_dependency(
414414
python_versions = constraint.get("python")
415415
platform = constraint.get("platform")
416416
markers = constraint.get("markers")
417-
allows_prereleases = constraint.get("allow-prereleases", False)
417+
allows_prereleases = constraint.get("allow-prereleases")
418418

419419
dependency: Dependency
420420
if "git" in constraint:

src/poetry/core/packages/dependency.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def __init__(
4141
constraint: str | VersionConstraint,
4242
optional: bool = False,
4343
groups: Iterable[str] | None = None,
44-
allows_prereleases: bool = False,
44+
allows_prereleases: bool | None = None,
4545
extras: Iterable[str] | None = None,
4646
source_type: str | None = None,
4747
source_url: str | None = None,
@@ -233,7 +233,14 @@ def base_pep_508_name(self) -> str:
233233
def base_pep_508_name_resolved(self) -> str:
234234
return self.base_pep_508_name
235235

236-
def allows_prereleases(self) -> bool:
236+
def allows_prereleases(self) -> bool | None:
237+
"""
238+
None (default): only use pre-release versions
239+
if no stable version satisfies the constraint
240+
False: do not allow pre-release versions
241+
even if this means there is no solution
242+
True: do not distinguish between stable and pre-release versions
243+
"""
237244
return self._allows_prereleases
238245

239246
def is_optional(self) -> bool:

tests/packages/test_dependency.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"^1.0.0-1",
2525
],
2626
)
27-
@pytest.mark.parametrize("allows_prereleases", [False, True])
27+
@pytest.mark.parametrize("allows_prereleases", [None, False, True])
2828
def test_allows_prerelease(constraint: str, allows_prereleases: bool) -> None:
2929
dependency = Dependency("A", constraint, allows_prereleases=allows_prereleases)
3030
assert dependency.allows_prereleases() == allows_prereleases

tests/packages/test_dependency_group.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def create_dependency(
1515
constraint: str = "*",
1616
*,
1717
extras: tuple[str, ...] = (),
18-
allows_prereleases: bool = False,
18+
allows_prereleases: bool | None = None,
1919
develop: bool = False,
2020
source_name: str | None = None,
2121
marker: str | None = None,
@@ -147,6 +147,11 @@ def test_remove_dependency_removes_from_both_lists() -> None:
147147
[create_dependency("foo", allows_prereleases=True)],
148148
[create_dependency("foo", ">=1", allows_prereleases=True)],
149149
),
150+
(
151+
[Dependency.create_from_pep_508("foo>=1")],
152+
[create_dependency("foo", allows_prereleases=False)],
153+
[create_dependency("foo", ">=1", allows_prereleases=False)],
154+
),
150155
# directory dependency - develop
151156
(
152157
[DirectoryDependency("foo", Path("path/to/foo"))],

tests/test_factory.py

+17-1
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ def test_create_poetry(new_format: str) -> None:
221221
requests = dependencies["requests"]
222222
assert requests.pretty_constraint == (">=2.18,<3.0" if new_format else "^2.18")
223223
assert not requests.is_vcs()
224-
assert not requests.allows_prereleases()
224+
assert requests.allows_prereleases() is None
225225
assert requests.is_optional()
226226
assert requests.extras == frozenset({"security"})
227227

@@ -930,6 +930,22 @@ def test_create_dependency_marker_variants(
930930
assert str(dep.marker) == exp_marker
931931

932932

933+
@pytest.mark.parametrize(
934+
("constraint", "expected"),
935+
[
936+
("1", None),
937+
({"version": "1"}, None),
938+
({"version": "1", "allow-prereleases": False}, False),
939+
({"version": "1", "allow-prereleases": True}, True),
940+
],
941+
)
942+
def test_create_dependency_allow_prereleases(
943+
constraint: str | dict[str, str], expected: bool | None
944+
) -> None:
945+
dep = Factory.create_dependency("foo", constraint)
946+
assert dep.allows_prereleases() is expected
947+
948+
933949
def test_all_classifiers_unique_even_if_classifiers_is_duplicated() -> None:
934950
poetry = Factory().create_poetry(
935951
fixtures_dir / "project_with_duplicated_classifiers"

0 commit comments

Comments
 (0)