From 8e09ed58cb1fb8660458b46e111b2ab691ec4cad Mon Sep 17 00:00:00 2001 From: Dhimas Ardinata Date: Sun, 17 May 2026 18:03:30 +0700 Subject: [PATCH] perf(config): cache filter policy packages --- src/poetry/config/config.py | 4 ++-- tests/config/test_config.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/poetry/config/config.py b/src/poetry/config/config.py index af5d23a6339..e2c0b4ac56f 100644 --- a/src/poetry/config/config.py +++ b/src/poetry/config/config.py @@ -83,14 +83,14 @@ def build_config_setting_normalizer(val: str) -> Mapping[str, str | Sequence[str @dataclasses.dataclass class PackageFilterPolicy: policy: dataclasses.InitVar[str | list[str] | None] - packages: list[str] = dataclasses.field(init=False) + packages: frozenset[str] = dataclasses.field(init=False) def __post_init__(self, policy: str | list[str] | None) -> None: if not policy: policy = [] elif isinstance(policy, str): policy = self.normalize(policy) - self.packages = policy + self.packages = frozenset(policy) def allows(self, package_name: str) -> bool: if ":all:" in self.packages: diff --git a/tests/config/test_config.py b/tests/config/test_config.py index 2e81c35a37f..22ff65c6c2c 100644 --- a/tests/config/test_config.py +++ b/tests/config/test_config.py @@ -13,6 +13,7 @@ from deepdiff.diff import DeepDiff from poetry.config.config import Config +from poetry.config.config import PackageFilterPolicy from poetry.config.config import boolean_normalizer from poetry.config.config import int_normalizer from poetry.config.config import str_list_normalizer @@ -50,6 +51,16 @@ def test_str_list_normalizer(value: str, expected: list[str]) -> None: assert str_list_normalizer(value) == expected +def test_package_filter_policy_normalizes_and_matches_packages() -> None: + policy = PackageFilterPolicy("PyTest,black") + + assert policy.packages == frozenset({"black", "pytest"}) + assert policy.allows("Poetry") + assert not policy.allows("PyTest") + assert policy.has_exact_package("PyTest") + assert not policy.has_exact_package("Poetry") + + @pytest.mark.parametrize( ("name", "value"), [