Skip to content

Commit

Permalink
provider: remove unrelated filenames/hashes of direct origin dependen…
Browse files Browse the repository at this point in the history
…cies in complete_package()
  • Loading branch information
radoering committed Sep 3, 2022
1 parent 58d2b99 commit 373f97b
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 26 deletions.
70 changes: 44 additions & 26 deletions src/poetry/puzzle/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -546,35 +546,53 @@ def complete_package(
package = dependency_package.package
dependency = dependency_package.dependency
requires = package.all_requires
elif package.source_type not in {
"directory",
"file",
"url",
"git",
}:
try:
dependency_package = DependencyPackage(
dependency,
self._pool.package(
package.pretty_name,
package.version,
extras=list(dependency.extras),
repository=dependency.source_name,
),
)
except PackageNotFound as e:
else:
if package.source_type == "file":
if len(package.files) > 1:
# a locked package might contain further files
# for multiple-constraints dependencies -> prune
path = urllib.parse.urlsplit(package.source_url).path
assert isinstance(path, str)
filename = Path(path).name
for item in package.files:
if item["file"] == filename:
package.files = [item]
break
else:
self.debug(
f"<debug>No entry for {package} in metadata files of lock"
" file</debug>"
)
package = self.search_for_direct_origin_dependency(
package.to_dependency()
)
elif package.source_type in {"directory", "git", "url"}:
# these types don't have files, however,
# a locked package might contain further files
# for multiple-constraints dependencies -> clear
package.files = []
else:
try:
dependency_package = next(
DependencyPackage(dependency, pkg)
for pkg in self.search_for_installed_packages(dependency)
dependency_package = DependencyPackage(
dependency,
self._pool.package(
package.pretty_name,
package.version,
extras=list(dependency.extras),
repository=dependency.source_name,
),
)
except StopIteration:
raise e from e
except PackageNotFound as e:
try:
dependency_package = next(
DependencyPackage(dependency, pkg)
for pkg in self.search_for_installed_packages(dependency)
)
except StopIteration:
raise e from e

package = dependency_package.package
dependency = dependency_package.dependency
requires = package.requires
else:
package = dependency_package.package
dependency = dependency_package.dependency
requires = package.requires

if self._load_deferred:
Expand Down
59 changes: 59 additions & 0 deletions tests/puzzle/test_provider.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from __future__ import annotations

import itertools

from pathlib import Path
from subprocess import CalledProcessError
from typing import TYPE_CHECKING
Expand Down Expand Up @@ -688,3 +690,60 @@ def test_complete_package_preserves_source_type_with_subdirectories(
dependency_one_copy.to_pep_508(),
dependency_two.to_pep_508(),
}


def test_complete_package_fixes_files(
root: ProjectPackage, repository: Repository, provider: Provider
) -> None:
expected_files = {
None: [
{"file": "demo-1.0.tar.gz", "hash": "sha256"},
{"file": "demo-1.0-py3-none-any.whl", "hash": "sha256"},
],
"git": [],
"directory": [],
"file": [{"file": "demo-1.1-py3-none-any.whl", "hash": "sha256"}],
"url": [],
}

package = Package("demo", "1.0")
package.files = expected_files[None]
repository.add_package(package)

locked_files = list(itertools.chain.from_iterable(expected_files.values()))
locked_packages = [
Package("demo", "1.0"),
Package(
"demo",
"1.0",
source_type="git",
source_url="https://github.com/demo/demo.git",
),
Package(
"demo",
"1.0",
source_type="directory",
source_url="./folder",
),
Package(
"demo",
"1.1",
source_type="file",
source_url="./demo-1.1-py3-none-any.whl",
),
Package(
"url",
"1.2",
source_type="url",
source_url="https://example.com/demo-1.2-py3-none-any.whl",
),
]
for locked_package in locked_packages:
locked_package.files = locked_files.copy()
result_package = provider.complete_package(
DependencyPackage(Dependency("demo", "*"), locked_package)
)
assert result_package.package.source_type == locked_package.source_type
assert (
result_package.package.files == expected_files[locked_package.source_type]
)

0 comments on commit 373f97b

Please sign in to comment.