summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTzu-ping Chung <uranusjr@gmail.com>2021-09-26 12:42:12 +0800
committerGitHub <noreply@github.com>2021-09-26 12:42:12 +0800
commitf609d35a8f247916bf43e21b14b4a9c5ab17349d (patch)
tree65231734e098591c431d790c427705a12add68cb
parent0f21fb920647f07439c3ec9fb29579c0e00072ec (diff)
parent105a3287a3404378846d3d57e75b7fc1ae652167 (diff)
downloadpip-f609d35a8f247916bf43e21b14b4a9c5ab17349d.tar.gz
Merge pull request #10482 from notatallshaw/known_depths
-rw-r--r--news/10482.bugfix.rst1
-rw-r--r--src/pip/_internal/resolution/resolvelib/provider.py2
-rw-r--r--tests/unit/resolution_resolvelib/test_provider.py65
3 files changed, 67 insertions, 1 deletions
diff --git a/news/10482.bugfix.rst b/news/10482.bugfix.rst
new file mode 100644
index 000000000..b6cf64f23
--- /dev/null
+++ b/news/10482.bugfix.rst
@@ -0,0 +1 @@
+New resolver: Fixes depth ordering of packages during resolution, e.g. a dependency 2 levels deep will be ordered before a dependecy 3 levels deep.
diff --git a/src/pip/_internal/resolution/resolvelib/provider.py b/src/pip/_internal/resolution/resolvelib/provider.py
index 632854d3b..a3250b351 100644
--- a/src/pip/_internal/resolution/resolvelib/provider.py
+++ b/src/pip/_internal/resolution/resolvelib/provider.py
@@ -112,9 +112,9 @@ class PipProvider(_ProviderBase):
for _, parent in information[identifier]
)
inferred_depth = min(d for d in parent_depths) + 1.0
- self._known_depths[identifier] = inferred_depth
else:
inferred_depth = 1.0
+ self._known_depths[identifier] = inferred_depth
requested_order = self._user_requested.get(identifier, math.inf)
diff --git a/tests/unit/resolution_resolvelib/test_provider.py b/tests/unit/resolution_resolvelib/test_provider.py
new file mode 100644
index 000000000..970254280
--- /dev/null
+++ b/tests/unit/resolution_resolvelib/test_provider.py
@@ -0,0 +1,65 @@
+from pip._vendor.resolvelib.resolvers import RequirementInformation
+
+from pip._internal.models.candidate import InstallationCandidate
+from pip._internal.models.link import Link
+from pip._internal.req.constructors import install_req_from_req_string
+from pip._internal.resolution.resolvelib.provider import PipProvider
+from pip._internal.resolution.resolvelib.requirements import SpecifierRequirement
+
+
+def build_requirement_information(name, parent):
+ install_requirement = install_req_from_req_string(name)
+ requirement_information = RequirementInformation(
+ requirement=SpecifierRequirement(install_requirement), parent=parent
+ )
+ return [requirement_information]
+
+
+def test_provider_known_depths(factory):
+ # Root requirement is specified by the user
+ # therefore has an infered depth of 1
+ root_requirement_name = "my-package"
+ provider = PipProvider(
+ factory=factory,
+ constraints={},
+ ignore_dependencies=False,
+ upgrade_strategy="to-satisfy-only",
+ user_requested={root_requirement_name: 0},
+ )
+
+ root_requirement_information = build_requirement_information(
+ name=root_requirement_name, parent=None
+ )
+ provider.get_preference(
+ identifier=root_requirement_name,
+ resolutions={},
+ candidates={},
+ information={root_requirement_name: root_requirement_information},
+ )
+ assert provider._known_depths == {root_requirement_name: 1.0}
+
+ # Transative requirement is a dependency of root requirement
+ # theforefore has an infered depth of 2
+ root_package_candidate = InstallationCandidate(
+ root_requirement_name,
+ "1.0",
+ Link("https://{root_requirement_name}.com"),
+ )
+ transative_requirement_name = "my-transitive-package"
+
+ transative_package_information = build_requirement_information(
+ name=transative_requirement_name, parent=root_package_candidate
+ )
+ provider.get_preference(
+ identifier=transative_requirement_name,
+ resolutions={},
+ candidates={},
+ information={
+ root_requirement_name: root_requirement_information,
+ transative_requirement_name: transative_package_information,
+ },
+ )
+ assert provider._known_depths == {
+ transative_requirement_name: 2.0,
+ root_requirement_name: 1.0,
+ }