From ec097657db1a94a626ba452fd33e2618c75bde06 Mon Sep 17 00:00:00 2001 From: Antoine Lambert Date: Tue, 19 Aug 2025 17:29:48 +0200 Subject: [PATCH] Fix bad indentation level in src/pip/_internal/cli/parser.py The regression was introduced in 9f082bc and was leading to configuration entries being yielded multiple times, turning them to list instead of simple values and thus their validations were failing. Fixes #13548. --- news/13548.bugfix.rst | 2 ++ src/pip/_internal/cli/parser.py | 6 +++--- tests/functional/test_configuration.py | 22 +++++++++++++++++++++- 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 news/13548.bugfix.rst diff --git a/news/13548.bugfix.rst b/news/13548.bugfix.rst new file mode 100644 index 00000000000..1dff4989a5a --- /dev/null +++ b/news/13548.bugfix.rst @@ -0,0 +1,2 @@ +Fix regression in configuration parsing that was turning a single value +into a list and thus leading to a validation error. diff --git a/src/pip/_internal/cli/parser.py b/src/pip/_internal/cli/parser.py index f8b8ac43bec..3905a91f2e1 100644 --- a/src/pip/_internal/cli/parser.py +++ b/src/pip/_internal/cli/parser.py @@ -203,9 +203,9 @@ def _get_ordered_configuration_items( if section in override_order: section_items[section].append((key, val)) - # Yield each group in their override order - for section in override_order: - yield from section_items[section] + # Yield each group in their override order + for section in override_order: + yield from section_items[section] def _update_defaults(self, defaults: dict[str, Any]) -> dict[str, Any]: """Updates the given defaults with values from the config files and diff --git a/tests/functional/test_configuration.py b/tests/functional/test_configuration.py index af3000e7f77..eb84343a6de 100644 --- a/tests/functional/test_configuration.py +++ b/tests/functional/test_configuration.py @@ -9,12 +9,14 @@ import sys import textwrap +import pytest + from pip._internal.cli.status_codes import ERROR from pip._internal.configuration import CONFIG_BASENAME, Kind from pip._internal.configuration import get_configuration_files as _get_config_files from pip._internal.utils.compat import WINDOWS -from tests.lib import PipTestEnvironment +from tests.lib import PipTestEnvironment, TestData from tests.lib.configuration_helpers import ConfigurationMixin, kinds from tests.lib.venv import VirtualEnvironment @@ -212,3 +214,21 @@ def test_config_separated( ), result.stdout, ) + + @pytest.mark.network + def test_editable_mode_default_config( + self, script: PipTestEnvironment, data: TestData + ) -> None: + """Test that setting default editable mode through configuration works + as expected. + """ + script.pip( + "config", "--site", "set", "install.config-settings", "editable_mode=strict" + ) + to_install = data.src.joinpath("simplewheel-1.0") + script.pip("install", "-e", to_install) + assert os.path.isdir( + os.path.join( + to_install, "build", "__editable__.simplewheel-1.0-py3-none-any" + ) + )