Skip to content

Commit b8ad05b

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 528e796 commit b8ad05b

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
@@ -496,23 +496,31 @@ def _make_file_or_dir_dep(
496496
) -> FileDependency | DirectoryDependency | None:
497497
"""
498498
Helper function to create a file or directoru dependency with the given arguments.
499-
If path is not a file or directory that exists, `None` is returned.
499+
500+
If path is not a file or directory that exists, a guess is made based on the suffix
501+
of the given path. This is done to prevent dependendencies from being parsed as normal
502+
dependencies. This allows for downstream error handling.
503+
504+
See also: poetry#10068
500505
"""
501506
from poetry.core.packages.directory_dependency import DirectoryDependency
502507
from poetry.core.packages.file_dependency import FileDependency
503508

504509
_path = path
510+
505511
if not path.is_absolute() and base:
506512
# a base path was specified, so we should respect that
507513
_path = Path(base) / path
508514

509-
if _path.is_file():
515+
# we check if it is a file (if it exists) or rely on suffix to guess
516+
is_file = _path.is_file() if _path.exists() else path.suffix != ""
517+
518+
if is_file:
510519
return FileDependency(
511520
name, path, base=base, directory=subdirectory, extras=extras
512521
)
513-
elif _path.is_dir():
514-
if subdirectory:
515-
path = path / subdirectory
516-
return DirectoryDependency(name, path, base=base, extras=extras)
517522

518-
return None
523+
if subdirectory:
524+
path = path / subdirectory
525+
526+
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)