Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 15 additions & 7 deletions src/poetry/core/packages/dependency.py
Original file line number Diff line number Diff line change
Expand Up @@ -499,23 +499,31 @@ def _make_file_or_dir_dep(
) -> FileDependency | DirectoryDependency | None:
"""
Helper function to create a file or directoru dependency with the given arguments.
If path is not a file or directory that exists, `None` is returned.

If path is not a file or directory that exists, a guess is made based on the suffix
of the given path. This is done to prevent dependendencies from being parsed as normal
dependencies. This allows for downstream error handling.

See also: poetry#10068
"""
from poetry.core.packages.directory_dependency import DirectoryDependency
from poetry.core.packages.file_dependency import FileDependency

_path = path

if not path.is_absolute() and base:
# a base path was specified, so we should respect that
_path = Path(base) / path

if _path.is_file():
# we check if it is a file (if it exists) or rely on suffix to guess
is_file = _path.is_file() if _path.exists() else path.suffix != ""

if is_file:
return FileDependency(
name, path, base=base, directory=subdirectory, extras=extras
)
elif _path.is_dir():
if subdirectory:
path = path / subdirectory
return DirectoryDependency(name, path, base=base, extras=extras)

return None
if subdirectory:
path = path / subdirectory

return DirectoryDependency(name, path, base=base, extras=extras)
23 changes: 23 additions & 0 deletions tests/packages/test_dependency.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

from poetry.core.constraints.version.exceptions import ParseConstraintError
from poetry.core.packages.dependency import Dependency
from poetry.core.packages.directory_dependency import DirectoryDependency
from poetry.core.packages.file_dependency import FileDependency
from poetry.core.version.markers import InvalidMarkerError
from poetry.core.version.markers import parse_marker
from poetry.core.version.requirements import InvalidRequirementError
Expand Down Expand Up @@ -218,6 +220,27 @@ def test_to_pep_508_with_invalid_requirement(requirement: str) -> None:
_ = Dependency.create_from_pep_508(requirement)


@pytest.mark.parametrize(
("requirement", "dependency_type"),
[
(
"eflips-depot @ [email protected]/mpm-tu-berlin/eflips-depot.git@feature/allow-only-oppo-charging",
DirectoryDependency,
),
(
"eflips-depot @ [email protected]/mpm-tu-berlin/eflips-depot.git@feature/allow-only-oppo-charging.whl",
FileDependency,
),
],
)
def test_to_pep_508_with_invalid_path_requirement(
requirement: str, dependency_type: type[FileDependency | DirectoryDependency]
) -> None:
dependency = Dependency.create_from_pep_508(requirement)
assert isinstance(dependency, dependency_type)
assert dependency.source_url


def test_complete_name() -> None:
assert Dependency("foo", ">=1.2.3").complete_name == "foo"
assert (
Expand Down
Loading