From db31b01fd221f44982fb33c7854e777d188fded1 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Sun, 31 Dec 2023 15:05:13 +0100 Subject: [PATCH 1/6] Apply refub suggestion [FURB108]: Replace `x == y or x == z` with `x in (y, z)` --- src/packaging/_parser.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/packaging/_parser.py b/src/packaging/_parser.py index 4576981c..684df754 100644 --- a/src/packaging/_parser.py +++ b/src/packaging/_parser.py @@ -324,10 +324,7 @@ def _parse_marker_var(tokenizer: Tokenizer) -> MarkerVar: def process_env_var(env_var: str) -> Variable: - if ( - env_var == "platform_python_implementation" - or env_var == "python_implementation" - ): + if env_var in ("platform_python_implementation", "python_implementation"): return Variable("platform_python_implementation") else: return Variable(env_var) From fd0c18148bf232dc23a2d984cdc4b05fb76e6800 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Sun, 31 Dec 2023 15:09:28 +0100 Subject: [PATCH 2/6] Apply refurb suggestion [FURB110]: Replace `x if x else y` with `x or y` --- src/packaging/requirements.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packaging/requirements.py b/src/packaging/requirements.py index 0c00eba3..bdc43a7e 100644 --- a/src/packaging/requirements.py +++ b/src/packaging/requirements.py @@ -38,7 +38,7 @@ def __init__(self, requirement_string: str) -> None: self.name: str = parsed.name self.url: Optional[str] = parsed.url or None - self.extras: Set[str] = set(parsed.extras if parsed.extras else []) + self.extras: Set[str] = set(parsed.extras or []) self.specifier: SpecifierSet = SpecifierSet(parsed.specifier) self.marker: Optional[Marker] = None if parsed.marker is not None: From 3531306ed22cd194c213e858133a99846f081b64 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Sun, 31 Dec 2023 15:16:33 +0100 Subject: [PATCH 3/6] Apply refurb suggestion [FURB142]: Replace `for x in y: s.add(...)` with `s.update(... for x in y)` --- src/packaging/specifiers.py | 22 +++------------------- src/packaging/tags.py | 12 ++++++------ 2 files changed, 9 insertions(+), 25 deletions(-) diff --git a/src/packaging/specifiers.py b/src/packaging/specifiers.py index 94448327..1a347341 100644 --- a/src/packaging/specifiers.py +++ b/src/packaging/specifiers.py @@ -11,17 +11,7 @@ import abc import itertools import re -from typing import ( - Callable, - Iterable, - Iterator, - List, - Optional, - Set, - Tuple, - TypeVar, - Union, -) +from typing import Callable, Iterable, Iterator, List, Optional, Tuple, TypeVar, Union from .utils import canonicalize_version from .version import Version @@ -729,14 +719,8 @@ def __init__( # strip each item to remove leading/trailing whitespace. split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] - # Parsed each individual specifier, attempting first to make it a - # Specifier. - parsed: Set[Specifier] = set() - for specifier in split_specifiers: - parsed.add(Specifier(specifier)) - - # Turn our parsed specifiers into a frozen set and save them for later. - self._specs = frozenset(parsed) + # Make each individual specifier a Specifier and save in a frozen set for later. + self._specs = frozenset(Specifier(specifier) for specifier in split_specifiers) # Store our prereleases value so we can use it later to determine if # we accept prereleases or not. diff --git a/src/packaging/tags.py b/src/packaging/tags.py index 89f19261..65c45cc0 100644 --- a/src/packaging/tags.py +++ b/src/packaging/tags.py @@ -103,13 +103,13 @@ def parse_tag(tag: str) -> FrozenSet[Tag]: Returning a set is required due to the possibility that the tag is a compressed tag set. """ - tags = set() interpreters, abis, platforms = tag.split("-") - for interpreter in interpreters.split("."): - for abi in abis.split("."): - for platform_ in platforms.split("."): - tags.add(Tag(interpreter, abi, platform_)) - return frozenset(tags) + return frozenset( + Tag(interpreter, abi, platform_) + for platform_ in platforms.split(".") + for abi in abis.split(".") + for interpreter in interpreters.split(".") + ) def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]: From 5d58c689f7ba147d4de5ce15f5992093f82a1675 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Sun, 31 Dec 2023 15:36:00 +0100 Subject: [PATCH 4/6] Apply refurb suggestion [FURB179]: Replace `itertools.chain(*x)` with `itertools.chain.from_iterable(x)` --- src/packaging/specifiers.py | 5 ++++- tests/test_specifiers.py | 12 ++++-------- tests/test_version.py | 6 ++---- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/packaging/specifiers.py b/src/packaging/specifiers.py index 1a347341..a3bd9e7c 100644 --- a/src/packaging/specifiers.py +++ b/src/packaging/specifiers.py @@ -687,7 +687,10 @@ def _pad_version(left: List[str], right: List[str]) -> Tuple[List[str], List[str left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) - return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) + return ( + list(itertools.chain.from_iterable(left_split)), + list(itertools.chain.from_iterable(right_split)), + ) class SpecifierSet(BaseSpecifier): diff --git a/tests/test_specifiers.py b/tests/test_specifiers.py index ebcd9d98..a79b860e 100644 --- a/tests/test_specifiers.py +++ b/tests/test_specifiers.py @@ -235,8 +235,7 @@ def test_specifiers_hash(self, specifier): @pytest.mark.parametrize( ("left", "right", "op"), - itertools.chain( - * + itertools.chain.from_iterable( # Verify that the equal (==) operator works correctly [[(x, x, operator.eq) for x in SPECIFIERS]] + @@ -260,8 +259,7 @@ def test_comparison_canonicalizes(self, left, right): @pytest.mark.parametrize( ("left", "right", "op"), - itertools.chain( - * + itertools.chain.from_iterable( # Verify that the equal (==) operator works correctly [[(x, x, operator.ne) for x in SPECIFIERS]] + @@ -815,8 +813,7 @@ def test_specifiers_combine_not_implemented(self): @pytest.mark.parametrize( ("left", "right", "op"), - itertools.chain( - * + itertools.chain.from_iterable( # Verify that the equal (==) operator works correctly [[(x, x, operator.eq) for x in SPECIFIERS]] + @@ -836,8 +833,7 @@ def test_comparison_true(self, left, right, op): @pytest.mark.parametrize( ("left", "right", "op"), - itertools.chain( - * + itertools.chain.from_iterable( # Verify that the equal (==) operator works correctly [[(x, x, operator.ne) for x in SPECIFIERS]] + diff --git a/tests/test_version.py b/tests/test_version.py index 8004c0cc..6cdbe190 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -667,8 +667,7 @@ def test_version_is_postrelease(self, version, expected): ("left", "right", "op"), # Below we'll generate every possible combination of VERSIONS that # should be True for the given operator - itertools.chain( - * + itertools.chain.from_iterable( # Verify that the less than (<) operator works correctly [ [(x, y, operator.lt) for y in VERSIONS[i + 1 :]] @@ -710,8 +709,7 @@ def test_comparison_true(self, left, right, op): ("left", "right", "op"), # Below we'll generate every possible combination of VERSIONS that # should be False for the given operator - itertools.chain( - * + itertools.chain.from_iterable( # Verify that the less than (<) operator works correctly [ [(x, y, operator.lt) for y in VERSIONS[: i + 1]] From f279fe359079d8973ce887441c7b3de8618a083c Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Fri, 5 Jan 2024 10:08:19 +0100 Subject: [PATCH 5/6] Update src/packaging/specifiers.py Co-authored-by: Pradyun Gedam --- src/packaging/specifiers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packaging/specifiers.py b/src/packaging/specifiers.py index a3bd9e7c..2d015bab 100644 --- a/src/packaging/specifiers.py +++ b/src/packaging/specifiers.py @@ -723,7 +723,7 @@ def __init__( split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] # Make each individual specifier a Specifier and save in a frozen set for later. - self._specs = frozenset(Specifier(specifier) for specifier in split_specifiers) + self._specs = frozenset(map(Specifier, split_specifiers)) # Store our prereleases value so we can use it later to determine if # we accept prereleases or not. From b17e8ef8072adf5d2a4c4c12eaf0cbafa0332e10 Mon Sep 17 00:00:00 2001 From: Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> Date: Mon, 8 Jan 2024 22:34:07 +0100 Subject: [PATCH 6/6] Revert attempt to simplify frozenset() The result is less readable. --- src/packaging/tags.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/packaging/tags.py b/src/packaging/tags.py index 65c45cc0..89f19261 100644 --- a/src/packaging/tags.py +++ b/src/packaging/tags.py @@ -103,13 +103,13 @@ def parse_tag(tag: str) -> FrozenSet[Tag]: Returning a set is required due to the possibility that the tag is a compressed tag set. """ + tags = set() interpreters, abis, platforms = tag.split("-") - return frozenset( - Tag(interpreter, abi, platform_) - for platform_ in platforms.split(".") - for abi in abis.split(".") - for interpreter in interpreters.split(".") - ) + for interpreter in interpreters.split("."): + for abi in abis.split("."): + for platform_ in platforms.split("."): + tags.add(Tag(interpreter, abi, platform_)) + return frozenset(tags) def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]: