Commit 77d89758 by Arun Babu Neelicattu

ensure provider respects subdirectory when merging

parent 5cacba89
...@@ -43,7 +43,8 @@ class DependencyCache: ...@@ -43,7 +43,8 @@ class DependencyCache:
def __init__(self, provider: Provider) -> None: def __init__(self, provider: Provider) -> None:
self.provider = provider self.provider = provider
self.cache: dict[ self.cache: dict[
tuple[str, str | None, str | None, str | None], list[DependencyPackage] tuple[str, str | None, str | None, str | None, str | None],
list[DependencyPackage],
] = {} ] = {}
# TODO: re-enable cache when poetry-core upgrade is completed # TODO: re-enable cache when poetry-core upgrade is completed
...@@ -60,6 +61,7 @@ class DependencyCache: ...@@ -60,6 +61,7 @@ class DependencyCache:
dependency.source_type, dependency.source_type,
dependency.source_url, dependency.source_url,
dependency.source_reference, dependency.source_reference,
dependency.source_subdirectory,
) )
packages = self.cache.get(key) packages = self.cache.get(key)
......
...@@ -575,7 +575,7 @@ class Provider: ...@@ -575,7 +575,7 @@ class Provider:
# of source type, reference etc. are taking into consideration when duplicates # of source type, reference etc. are taking into consideration when duplicates
# are identified. # are identified.
duplicates: dict[ duplicates: dict[
tuple[str, str | None, str | None, str | None], list[Dependency] tuple[str, str | None, str | None, str | None, str | None], list[Dependency]
] = {} ] = {}
for dep in dependencies: for dep in dependencies:
key = ( key = (
...@@ -583,6 +583,7 @@ class Provider: ...@@ -583,6 +583,7 @@ class Provider:
dep.source_type, dep.source_type,
dep.source_url, dep.source_url,
dep.source_reference, dep.source_reference,
dep.source_subdirectory,
) )
if key not in duplicates: if key not in duplicates:
duplicates[key] = [] duplicates[key] = []
......
[tool.poetry]
name = "one"
version = "1.0.0"
description = "Some description."
authors = []
license = "MIT"
[tool.poetry.dependencies]
python = "^3.7"
[tool.poetry]
name = "one"
version = "1.0.0"
description = "Some description."
authors = []
license = "MIT"
[tool.poetry.dependencies]
python = "^3.7"
[tool.poetry]
name = "two"
version = "2.0.0"
description = "Some description."
authors = []
license = "MIT"
[tool.poetry.dependencies]
python = "^3.7"
[tool.poetry]
name = "demo"
version = "1.2.3"
description = "Some description."
authors = []
license = "MIT"
[tool.poetry.dependencies]
python = "^3.7"
[tool.poetry]
name = "demo"
version = "1.2.3"
description = "Some description."
authors = []
license = "MIT"
[tool.poetry.dependencies]
python = "^3.7"
[tool.poetry]
name = "sample"
version = "1.0.0"
description = "Sample Project"
authors = []
license = "MIT"
[tool.poetry.dependencies]
python = "^3.7"
demo = [
{ path = "demo_one", platform = "linux" },
{ path = "demo_two", platform = "win32" },
]
...@@ -59,3 +59,65 @@ def test_solver_dependency_cache_respects_source_type( ...@@ -59,3 +59,65 @@ def test_solver_dependency_cache_respects_source_type(
package_git.package.source_resolved_reference package_git.package.source_resolved_reference
== "9cf87a285a2d3fbb0b9fa621997b3acc3631ed24" == "9cf87a285a2d3fbb0b9fa621997b3acc3631ed24"
) )
def test_solver_dependency_cache_respects_subdirectories(
root: ProjectPackage, provider: Provider, repo: Repository
):
dependency_one = Factory.create_dependency(
"one",
{
"git": "https://github.com/demo/subdirectories.git",
"subdirectory": "one",
"platform": "linux",
},
)
dependency_one_copy = Factory.create_dependency(
"one",
{
"git": "https://github.com/demo/subdirectories.git",
"subdirectory": "one-copy",
"platform": "win32",
},
)
root.add_dependency(dependency_one)
root.add_dependency(dependency_one_copy)
cache = DependencyCache(provider)
cache.search_for.cache_clear()
# ensure cache was never hit for both calls
cache.search_for(dependency_one)
cache.search_for(dependency_one_copy)
assert not cache.search_for.cache_info().hits
packages_one = cache.search_for(dependency_one)
packages_one_copy = cache.search_for(dependency_one_copy)
if not is_poetry_core_1_1_0a7_compat:
assert cache.search_for.cache_info().hits == 2
assert cache.search_for.cache_info().currsize == 2
assert len(packages_one) == len(packages_one_copy) == 1
package_one = packages_one[0]
package_one_copy = packages_one_copy[0]
assert package_one.package.name == package_one_copy.name
assert package_one.package.version.text == package_one_copy.package.version.text
assert package_one.package.source_type == package_one_copy.source_type == "git"
assert (
package_one.package.source_resolved_reference
== package_one_copy.source_resolved_reference
== "9cf87a285a2d3fbb0b9fa621997b3acc3631ed24"
)
assert (
package_one.package.source_subdirectory != package_one_copy.source_subdirectory
)
assert package_one.package.source_subdirectory == "one"
assert package_one_copy.package.source_subdirectory == "one-copy"
assert package_one.dependency.marker.intersect(
package_one_copy.dependency.marker
).is_empty()
...@@ -12,7 +12,9 @@ from poetry.core.packages.file_dependency import FileDependency ...@@ -12,7 +12,9 @@ from poetry.core.packages.file_dependency import FileDependency
from poetry.core.packages.project_package import ProjectPackage from poetry.core.packages.project_package import ProjectPackage
from poetry.core.packages.vcs_dependency import VCSDependency from poetry.core.packages.vcs_dependency import VCSDependency
from poetry.factory import Factory
from poetry.inspection.info import PackageInfo from poetry.inspection.info import PackageInfo
from poetry.packages import DependencyPackage
from poetry.puzzle.provider import Provider from poetry.puzzle.provider import Provider
from poetry.repositories.pool import Pool from poetry.repositories.pool import Pool
from poetry.repositories.repository import Repository from poetry.repositories.repository import Repository
...@@ -510,3 +512,76 @@ def test_search_for_file_wheel_with_extras(provider: Provider): ...@@ -510,3 +512,76 @@ def test_search_for_file_wheel_with_extras(provider: Provider):
"foo": [get_dependency("cleo")], "foo": [get_dependency("cleo")],
"bar": [get_dependency("tomlkit")], "bar": [get_dependency("tomlkit")],
} }
def test_complete_package_preserves_source_type(provider: Provider) -> None:
fixtures = Path(__file__).parent.parent / "fixtures"
project_dir = fixtures.joinpath("with_conditional_path_deps")
poetry = Factory().create_poetry(cwd=project_dir)
complete_package = provider.complete_package(
DependencyPackage(poetry.package.to_dependency(), poetry.package)
)
requires = complete_package.package.all_requires
assert len(requires) == 2
assert {requires[0].source_url, requires[1].source_url} == {
project_dir.joinpath("demo_one").as_posix(),
project_dir.joinpath("demo_two").as_posix(),
}
assert {str(requires[0].marker), str(requires[1].marker)} == {
'sys_platform == "linux"',
'sys_platform == "win32"',
}
def test_complete_package_preserves_source_type_with_subdirectories(
provider: Provider, root: ProjectPackage
) -> None:
dependency_one = Factory.create_dependency(
"one",
{
"git": "https://github.com/demo/subdirectories.git",
"subdirectory": "one",
"platform": "linux",
},
)
dependency_one_copy = Factory.create_dependency(
"one",
{
"git": "https://github.com/demo/subdirectories.git",
"subdirectory": "one-copy",
"platform": "win32",
},
)
dependency_two = Factory.create_dependency(
"two",
{"git": "https://github.com/demo/subdirectories.git", "subdirectory": "two"},
)
root.add_dependency(
Factory.create_dependency(
"one",
{
"git": "https://github.com/demo/subdirectories.git",
"subdirectory": "one",
"platform": "linux",
},
)
)
root.add_dependency(dependency_one_copy)
root.add_dependency(dependency_two)
complete_package = provider.complete_package(
DependencyPackage(root.to_dependency(), root)
)
requires = complete_package.package.all_requires
assert len(requires) == 3
assert {r.to_pep_508() for r in requires} == {
dependency_one.to_pep_508(),
dependency_one_copy.to_pep_508(),
dependency_two.to_pep_508(),
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment