diff --git a/news/8601.feature b/news/8601.feature new file mode 100644 index 00000000000..3e56c66ab1b --- /dev/null +++ b/news/8601.feature @@ -0,0 +1 @@ +Support ``--use-feature`` in requirements files diff --git a/src/pip/_internal/operations/freeze.py b/src/pip/_internal/operations/freeze.py index e15f3e3da0b..ddb9cb232ce 100644 --- a/src/pip/_internal/operations/freeze.py +++ b/src/pip/_internal/operations/freeze.py @@ -100,7 +100,8 @@ def freeze( '--pre', '--trusted-host', '--process-dependency-links', - '--extra-index-url'))): + '--extra-index-url', + '--use-feature'))): line = line.rstrip() if line not in emitted_options: emitted_options.add(line) diff --git a/src/pip/_internal/req/req_file.py b/src/pip/_internal/req/req_file.py index e120ad91b0f..1050582289a 100644 --- a/src/pip/_internal/req/req_file.py +++ b/src/pip/_internal/req/req_file.py @@ -62,6 +62,7 @@ cmdoptions.require_hashes, cmdoptions.pre, cmdoptions.trusted_host, + cmdoptions.use_new_feature, ] # type: List[Callable[..., optparse.Option]] # options to be passed to requirements @@ -224,12 +225,18 @@ def handle_option_line( ): # type: (...) -> None - # percolate hash-checking option upward - if options and opts.require_hashes: - options.require_hashes = opts.require_hashes + if options: + # percolate options upward + if opts.require_hashes: + options.require_hashes = opts.require_hashes + if opts.features_enabled: + options.features_enabled.extend( + f for f in opts.features_enabled + if f not in options.features_enabled + ) # set finder options - elif finder: + if finder: find_links = finder.find_links index_urls = finder.index_urls if opts.index_url: diff --git a/tests/functional/test_freeze.py b/tests/functional/test_freeze.py index 3792beeca97..ef22169869b 100644 --- a/tests/functional/test_freeze.py +++ b/tests/functional/test_freeze.py @@ -548,6 +548,7 @@ def test_freeze_nested_vcs(script, outer_vcs, inner_vcs): --extra-index-url http://ignore --find-links http://ignore --index-url http://ignore + --use-feature 2020-resolver """) diff --git a/tests/unit/test_req_file.py b/tests/unit/test_req_file.py index b22ce20138e..879f088a41d 100644 --- a/tests/unit/test_req_file.py +++ b/tests/unit/test_req_file.py @@ -47,6 +47,7 @@ def options(session): isolated_mode=False, index_url='default_url', format_control=FormatControl(set(), set()), + features_enabled=[], ) @@ -382,6 +383,13 @@ def test_set_finder_allow_all_prereleases(self, line_processor, finder): line_processor("--pre", "file", 1, finder=finder) assert finder.allow_all_prereleases + def test_use_feature(self, line_processor, options): + """--use-feature can be set in requirements files.""" + line_processor( + "--use-feature=2020-resolver", "filename", 1, options=options + ) + assert "2020-resolver" in options.features_enabled + def test_relative_local_find_links( self, line_processor, finder, monkeypatch, tmpdir ):