diff --git a/src/pip/_internal/cli/req_command.py b/src/pip/_internal/cli/req_command.py index 42888a1228b..7f41961b393 100644 --- a/src/pip/_internal/cli/req_command.py +++ b/src/pip/_internal/cli/req_command.py @@ -10,7 +10,7 @@ import sys from functools import partial from optparse import Values -from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union +from typing import TYPE_CHECKING, Any, List, Optional, Tuple from pip._internal.cache import WheelCache from pip._internal.cli import cmdoptions @@ -441,13 +441,9 @@ def get_requirements( else None ) cli_config_settings = getattr(options, "config_settings", None) - config_settings: Optional[Dict[str, Union[str, List[str]]]] - if req_config_settings and cli_config_settings: - config_settings = merge_config_settings( - req_config_settings, cli_config_settings - ) - else: - config_settings = req_config_settings or cli_config_settings + config_settings = merge_config_settings( + req_config_settings, cli_config_settings + ) req_to_add = install_req_from_parsed_requirement( parsed_req, isolated=options.isolated_mode, diff --git a/src/pip/_internal/utils/misc.py b/src/pip/_internal/utils/misc.py index 4d288cd8859..1f95a5624db 100644 --- a/src/pip/_internal/utils/misc.py +++ b/src/pip/_internal/utils/misc.py @@ -27,7 +27,6 @@ Iterable, Iterator, List, - Mapping, Optional, TextIO, Tuple, @@ -733,9 +732,12 @@ def prepare_metadata_for_build_editable( def merge_config_settings( - reqs_settings: Mapping[str, Union[str, List[str]]], - cli_settings: Mapping[str, Union[str, List[str]]], + reqs_settings: Optional[Dict[str, Union[str, List[str]]]], + cli_settings: Optional[Dict[str, Union[str, List[str]]]], ) -> Dict[str, Union[str, List[str]]]: + if not reqs_settings or not cli_settings: + return reqs_settings or cli_settings + dd: Dict[str, Union[str, List[str]]] = {} for d in (reqs_settings, cli_settings): for k, v in d.items(): diff --git a/tests/unit/test_utils_misc.py b/tests/unit/test_utils_misc.py index a00d5461f6d..408ee40ac38 100644 --- a/tests/unit/test_utils_misc.py +++ b/tests/unit/test_utils_misc.py @@ -1,25 +1,25 @@ from typing import Dict, List, Union +import pytest + from pip._internal.utils.misc import merge_config_settings -def test_merge_config_settings() -> None: - reqs: Dict[str, Union[str, List[str]]] = { - "foo": "bar", - "bar": "foo", - "foobar": ["bar"], - "baz": ["foo"], - } - cli: Dict[str, Union[str, List[str]]] = { - "foo": ["baz"], - "bar": "bar", - "foobar": ["baz"], - "baz": "bar", - } - expected = { - "foo": ["bar", "baz"], - "bar": ["foo", "bar"], - "foobar": ["bar", "baz"], - "baz": ["foo", "bar"], - } +@pytest.mark.parametrize( + "reqs, cli, expected", + [ + ({"foo": "bar"}, {"foo": ["baz"]}, {"foo": ["bar", "baz"]}), + ({"foo": "bar"}, {"foo": "baz"}, {"foo": ["bar", "baz"]}), + ({"foo": ["bar"]}, {"foo": ["baz"]}, {"foo": ["bar", "baz"]}), + ({"foo": ["bar"]}, {"foo": "baz"}, {"foo": ["bar", "baz"]}), + ({"foo": "bar"}, {"foo": ["baz"]}, {"foo": ["bar", "baz"]}), + ({"foo": "bar"}, {}, {"foo": "bar"}), + ({}, {"foo": ["bar"]}, {"foo": ["bar"]}), + ], +) +def test_merge_config_settings( + reqs: Dict[str, Union[str, List[str]]], + cli: Dict[str, Union[str, List[str]]], + expected: Dict[str, Union[str, List[str]]], +) -> None: assert merge_config_settings(reqs, cli) == expected