Skip to content

Commit bb5c750

Browse files
committed
fix(dependency): do not discard unknown urls
Prior to this change, when parsing PEP 508 requirement strings, the `Dependency` class silently discarded any URI tokens that cannot be validated as existing files. Resolves: python-poetry/poetry#10068
1 parent b1505c6 commit bb5c750

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

src/poetry/core/packages/dependency.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -499,23 +499,31 @@ def _make_file_or_dir_dep(
499499
) -> FileDependency | DirectoryDependency | None:
500500
"""
501501
Helper function to create a file or directoru dependency with the given arguments.
502-
If path is not a file or directory that exists, `None` is returned.
502+
503+
If path is not a file or directory that exists, a guess is made based on the suffix
504+
of the given path. This is done to prevent dependendencies from being parsed as normal
505+
dependencies. This allows for downstream error handling.
506+
507+
See also: poetry#10068
503508
"""
504509
from poetry.core.packages.directory_dependency import DirectoryDependency
505510
from poetry.core.packages.file_dependency import FileDependency
506511

507512
_path = path
513+
508514
if not path.is_absolute() and base:
509515
# a base path was specified, so we should respect that
510516
_path = Path(base) / path
511517

512-
if _path.is_file():
518+
# we check if it is a file (if it exists) or rely on suffix to guess
519+
is_file = _path.is_file() if _path.exists() else path.suffix != ""
520+
521+
if is_file:
513522
return FileDependency(
514523
name, path, base=base, directory=subdirectory, extras=extras
515524
)
516-
elif _path.is_dir():
517-
if subdirectory:
518-
path = path / subdirectory
519-
return DirectoryDependency(name, path, base=base, extras=extras)
520525

521-
return None
526+
if subdirectory:
527+
path = path / subdirectory
528+
529+
return DirectoryDependency(name, path, base=base, extras=extras)

tests/packages/test_dependency.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
from poetry.core.constraints.version.exceptions import ParseConstraintError
88
from poetry.core.packages.dependency import Dependency
9+
from poetry.core.packages.directory_dependency import DirectoryDependency
10+
from poetry.core.packages.file_dependency import FileDependency
911
from poetry.core.version.markers import InvalidMarkerError
1012
from poetry.core.version.markers import parse_marker
1113
from poetry.core.version.requirements import InvalidRequirementError
@@ -218,6 +220,27 @@ def test_to_pep_508_with_invalid_requirement(requirement: str) -> None:
218220
_ = Dependency.create_from_pep_508(requirement)
219221

220222

223+
@pytest.mark.parametrize(
224+
("requirement", "dependency_type"),
225+
[
226+
(
227+
"eflips-depot @ [email protected]/mpm-tu-berlin/eflips-depot.git@feature/allow-only-oppo-charging",
228+
DirectoryDependency,
229+
),
230+
(
231+
"eflips-depot @ [email protected]/mpm-tu-berlin/eflips-depot.git@feature/allow-only-oppo-charging.whl",
232+
FileDependency,
233+
),
234+
],
235+
)
236+
def test_to_pep_508_with_invalid_path_requirement(
237+
requirement: str, dependency_type: type[FileDependency | DirectoryDependency]
238+
) -> None:
239+
dependency = Dependency.create_from_pep_508(requirement)
240+
assert isinstance(dependency, dependency_type)
241+
assert dependency.source_url
242+
243+
221244
def test_complete_name() -> None:
222245
assert Dependency("foo", ">=1.2.3").complete_name == "foo"
223246
assert (

0 commit comments

Comments
 (0)