Skip to content

Commit 218e7d8

Browse files
authored
Merge pull request #8146 from uranusjr/new-resolver-extra-in-explicit-requirement
New resolver: Carry extras info in ExplicitRequirement
2 parents d3847e3 + 06d9ea0 commit 218e7d8

File tree

3 files changed

+80
-1
lines changed

3 files changed

+80
-1
lines changed

src/pip/_internal/resolution/resolvelib/candidates.py

+2
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,8 @@ def get_dependencies(self):
413413
]
414414
# Add a dependency on the exact base.
415415
# (See note 2b in the class docstring)
416+
# FIXME: This does not work if the base candidate is specified by
417+
# link, e.g. "pip install .[dev]" will fail.
416418
spec = "{}=={}".format(self.base.name, self.base.version)
417419
deps.append(factory.make_requirement_from_spec(spec, self.base._ireq))
418420
return deps

src/pip/_internal/resolution/resolvelib/factory.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ def make_requirement_from_install_req(self, ireq):
152152
# Specifically, this might be needed in "name @ URL"
153153
# syntax - need to check where that syntax is handled.
154154
cand = self._make_candidate_from_link(
155-
ireq.link, extras=set(), parent=ireq,
155+
ireq.link, extras=set(ireq.extras), parent=ireq,
156156
)
157157
return ExplicitRequirement(cand)
158158
return SpecifierRequirement(ireq, factory=self)

tests/functional/test_new_resolver.py

+77
Original file line numberDiff line numberDiff line change
@@ -529,3 +529,80 @@ def test_new_resolver_handles_prerelease(
529529
*pip_args
530530
)
531531
assert_installed(script, pkg=expected_version)
532+
533+
534+
class TestExtraMerge(object):
535+
"""
536+
Test installing a package that depends the same package with different
537+
extras, one listed as required and the other as in extra.
538+
"""
539+
540+
def _local_with_setup(script, name, version, requires, extras):
541+
"""Create the package as a local source directory to install from path.
542+
"""
543+
return create_test_package_with_setup(
544+
script,
545+
name=name,
546+
version=version,
547+
install_requires=requires,
548+
extras_require=extras,
549+
)
550+
551+
def _direct_wheel(script, name, version, requires, extras):
552+
"""Create the package as a wheel to install from path directly.
553+
"""
554+
return create_basic_wheel_for_package(
555+
script,
556+
name=name,
557+
version=version,
558+
depends=requires,
559+
extras=extras,
560+
)
561+
562+
def _wheel_from_index(script, name, version, requires, extras):
563+
"""Create the package as a wheel to install from index.
564+
"""
565+
create_basic_wheel_for_package(
566+
script,
567+
name=name,
568+
version=version,
569+
depends=requires,
570+
extras=extras,
571+
)
572+
return name
573+
574+
@pytest.mark.parametrize(
575+
"pkg_builder",
576+
[
577+
pytest.param(
578+
_local_with_setup, marks=pytest.mark.xfail(strict=True),
579+
),
580+
_direct_wheel,
581+
_wheel_from_index,
582+
],
583+
)
584+
def test_new_resolver_extra_merge_in_package(
585+
self, monkeypatch, script, pkg_builder,
586+
):
587+
create_basic_wheel_for_package(script, "depdev", "1.0.0")
588+
create_basic_wheel_for_package(
589+
script,
590+
"dep",
591+
"1.0.0",
592+
extras={"dev": ["depdev"]},
593+
)
594+
requirement = pkg_builder(
595+
script,
596+
name="pkg",
597+
version="1.0.0",
598+
requires=["dep"],
599+
extras={"dev": ["dep[dev]"]},
600+
)
601+
602+
script.pip(
603+
"install", "--unstable-feature=resolver",
604+
"--no-cache-dir", "--no-index",
605+
"--find-links", script.scratch_path,
606+
requirement + "[dev]",
607+
)
608+
assert_installed(script, pkg="1.0.0", dep="1.0.0", depdev="1.0.0")

0 commit comments

Comments
 (0)