Skip to content

Commit 89abbd3

Browse files
committed
Experimental implementation of supporting [] disabling default extras
1 parent 9483cca commit 89abbd3

File tree

3 files changed

+24
-13
lines changed

3 files changed

+24
-13
lines changed

src/pip/_internal/req/constructors.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@
3131
from pip._internal.utils.urls import path_to_url
3232
from pip._internal.vcs import is_url, vcs
3333

34+
EXPLICIT_EMPTY_EXTRAS = 'explicit-no-default-extras'
35+
3436
__all__ = [
3537
"install_req_from_editable",
3638
"install_req_from_line",
3739
"parse_editable",
40+
"EXPLICIT_EMPTY_EXTRAS"
3841
]
3942

4043
logger = logging.getLogger(__name__)
@@ -48,7 +51,11 @@ def _strip_extras(path: str) -> Tuple[str, Optional[str]]:
4851
path_no_extras = m.group(1)
4952
extras = m.group(2)
5053
else:
51-
path_no_extras = path
54+
if '[]' in path:
55+
extras = f'[{EXPLICIT_EMPTY_EXTRAS}]'
56+
path_no_extras = path.replace('[]', '')
57+
else:
58+
path_no_extras = path
5259

5360
return path_no_extras, extras
5461

src/pip/_internal/resolution/legacy/resolver.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
InstallRequirement,
3939
check_invalid_constraint_type,
4040
)
41+
from pip._internal.req.constructors import EXPLICIT_EMPTY_EXTRAS
4142
from pip._internal.req.req_set import RequirementSet
4243
from pip._internal.resolution.base import BaseResolver, InstallRequirementProvider
4344
from pip._internal.utils import compatibility_tags
@@ -552,12 +553,13 @@ def add_req(subreq: Requirement, extras_requested: Iterable[str]) -> None:
552553
set(req_to_install.extras) - set(dist.iter_provided_extras())
553554
)
554555
for missing in missing_requested:
555-
logger.warning(
556-
"%s %s does not provide the extra '%s'",
557-
dist.raw_name,
558-
dist.version,
559-
missing,
560-
)
556+
if missing != EXPLICIT_EMPTY_EXTRAS:
557+
logger.warning(
558+
"%s %s does not provide the extra '%s'",
559+
dist.raw_name,
560+
dist.version,
561+
missing,
562+
)
561563

562564
available_requested = sorted(
563565
set(dist.iter_provided_extras()) & set(req_to_install.extras)

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
install_req_from_line,
2222
)
2323
from pip._internal.req.req_install import InstallRequirement
24+
from pip._internal.req.constructors import EXPLICIT_EMPTY_EXTRAS
2425
from pip._internal.utils.direct_url_helpers import direct_url_from_link
2526
from pip._internal.utils.misc import normalize_version_info
2627

@@ -515,12 +516,13 @@ def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requiremen
515516
valid_extras = self.extras.intersection(self.base.dist.iter_provided_extras())
516517
invalid_extras = self.extras.difference(self.base.dist.iter_provided_extras())
517518
for extra in sorted(invalid_extras):
518-
logger.warning(
519-
"%s %s does not provide the extra '%s'",
520-
self.base.name,
521-
self.version,
522-
extra,
523-
)
519+
if extra != EXPLICIT_EMPTY_EXTRAS:
520+
logger.warning(
521+
"%s %s does not provide the extra '%s'",
522+
self.base.name,
523+
self.version,
524+
extra,
525+
)
524526

525527
for r in self.base.dist.iter_dependencies(valid_extras):
526528
yield from factory.make_requirements_from_spec(

0 commit comments

Comments
 (0)