From a41467e1c0bc645459bff86cbdc60d284d31a390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20D=C3=B6ring?= <30527984+radoering@users.noreply.github.com> Date: Sat, 24 Sep 2022 18:17:36 +0200 Subject: [PATCH] refactor: move constraint parsing of generic constraints from __init__ into parser module and rename module for constraint parsing of version constraints from helpers to parser --- .../core/constraints/generic/__init__.py | 54 +--------------- src/poetry/core/constraints/generic/parser.py | 64 +++++++++++++++++++ .../core/constraints/version/__init__.py | 2 +- .../version/{helpers.py => parser.py} | 0 .../core/packages/constraints/__init__.py | 21 +++++- src/poetry/core/semver/helpers.py | 5 +- 6 files changed, 89 insertions(+), 57 deletions(-) create mode 100644 src/poetry/core/constraints/generic/parser.py rename src/poetry/core/constraints/version/{helpers.py => parser.py} (100%) diff --git a/src/poetry/core/constraints/generic/__init__.py b/src/poetry/core/constraints/generic/__init__.py index 1c1beeb8f..ccd7f5a6b 100644 --- a/src/poetry/core/constraints/generic/__init__.py +++ b/src/poetry/core/constraints/generic/__init__.py @@ -1,66 +1,14 @@ from __future__ import annotations -import re - from poetry.core.constraints.generic.any_constraint import AnyConstraint from poetry.core.constraints.generic.base_constraint import BaseConstraint from poetry.core.constraints.generic.constraint import Constraint from poetry.core.constraints.generic.empty_constraint import EmptyConstraint from poetry.core.constraints.generic.multi_constraint import MultiConstraint +from poetry.core.constraints.generic.parser import parse_constraint from poetry.core.constraints.generic.union_constraint import UnionConstraint -BASIC_CONSTRAINT = re.compile(r"^(!?==?)?\s*([^\s]+?)\s*$") - - -def parse_constraint(constraints: str) -> BaseConstraint: - if constraints == "*": - return AnyConstraint() - - or_constraints = re.split(r"\s*\|\|?\s*", constraints.strip()) - or_groups = [] - for constraints in or_constraints: - and_constraints = re.split( - r"(?< ,]) *(? 1: - for constraint in and_constraints: - constraint_objects.append(parse_single_constraint(constraint)) - else: - constraint_objects.append(parse_single_constraint(and_constraints[0])) - - if len(constraint_objects) == 1: - constraint = constraint_objects[0] - else: - constraint = constraint_objects[0] - for next_constraint in constraint_objects[1:]: - constraint = constraint.intersect(next_constraint) - - or_groups.append(constraint) - - if len(or_groups) == 1: - return or_groups[0] - else: - return UnionConstraint(*or_groups) - - -def parse_single_constraint(constraint: str) -> Constraint: - # Basic comparator - m = BASIC_CONSTRAINT.match(constraint) - if m: - op = m.group(1) - if op is None: - op = "==" - - version = m.group(2).strip() - - return Constraint(version, op) - - raise ValueError(f"Could not parse version constraint: {constraint}") - - __all__ = [ "AnyConstraint", "BaseConstraint", diff --git a/src/poetry/core/constraints/generic/parser.py b/src/poetry/core/constraints/generic/parser.py new file mode 100644 index 000000000..7ef2b1a29 --- /dev/null +++ b/src/poetry/core/constraints/generic/parser.py @@ -0,0 +1,64 @@ +from __future__ import annotations + +import re + +from typing import TYPE_CHECKING + +from poetry.core.constraints.generic.any_constraint import AnyConstraint +from poetry.core.constraints.generic.constraint import Constraint +from poetry.core.constraints.generic.union_constraint import UnionConstraint + + +if TYPE_CHECKING: + from poetry.core.constraints.generic.base_constraint import BaseConstraint + + +BASIC_CONSTRAINT = re.compile(r"^(!?==?)?\s*([^\s]+?)\s*$") + + +def parse_constraint(constraints: str) -> BaseConstraint: + if constraints == "*": + return AnyConstraint() + + or_constraints = re.split(r"\s*\|\|?\s*", constraints.strip()) + or_groups = [] + for constraints in or_constraints: + and_constraints = re.split( + r"(?< ,]) *(? 1: + for constraint in and_constraints: + constraint_objects.append(parse_single_constraint(constraint)) + else: + constraint_objects.append(parse_single_constraint(and_constraints[0])) + + if len(constraint_objects) == 1: + constraint = constraint_objects[0] + else: + constraint = constraint_objects[0] + for next_constraint in constraint_objects[1:]: + constraint = constraint.intersect(next_constraint) + + or_groups.append(constraint) + + if len(or_groups) == 1: + return or_groups[0] + else: + return UnionConstraint(*or_groups) + + +def parse_single_constraint(constraint: str) -> Constraint: + # Basic comparator + m = BASIC_CONSTRAINT.match(constraint) + if m: + op = m.group(1) + if op is None: + op = "==" + + version = m.group(2).strip() + + return Constraint(version, op) + + raise ValueError(f"Could not parse version constraint: {constraint}") diff --git a/src/poetry/core/constraints/version/__init__.py b/src/poetry/core/constraints/version/__init__.py index 14a4ae181..ad85d819d 100644 --- a/src/poetry/core/constraints/version/__init__.py +++ b/src/poetry/core/constraints/version/__init__.py @@ -1,7 +1,7 @@ from __future__ import annotations from poetry.core.constraints.version.empty_constraint import EmptyConstraint -from poetry.core.constraints.version.helpers import parse_constraint +from poetry.core.constraints.version.parser import parse_constraint from poetry.core.constraints.version.util import constraint_regions from poetry.core.constraints.version.version import Version from poetry.core.constraints.version.version_constraint import VersionConstraint diff --git a/src/poetry/core/constraints/version/helpers.py b/src/poetry/core/constraints/version/parser.py similarity index 100% rename from src/poetry/core/constraints/version/helpers.py rename to src/poetry/core/constraints/version/parser.py diff --git a/src/poetry/core/packages/constraints/__init__.py b/src/poetry/core/packages/constraints/__init__.py index bbd5a4e4d..585f2219d 100644 --- a/src/poetry/core/packages/constraints/__init__.py +++ b/src/poetry/core/packages/constraints/__init__.py @@ -2,6 +2,15 @@ import warnings +from poetry.core.constraints.generic import AnyConstraint +from poetry.core.constraints.generic import BaseConstraint +from poetry.core.constraints.generic import Constraint +from poetry.core.constraints.generic import EmptyConstraint +from poetry.core.constraints.generic import MultiConstraint +from poetry.core.constraints.generic import UnionConstraint +from poetry.core.constraints.generic import parse_constraint +from poetry.core.constraints.generic.parser import parse_single_constraint + warnings.warn( "poetry.core.packages.constraints is deprecated." @@ -10,4 +19,14 @@ stacklevel=2, ) -from poetry.core.constraints.generic import * # noqa: E402, F401, F403 + +__all__ = [ + "AnyConstraint", + "BaseConstraint", + "Constraint", + "EmptyConstraint", + "MultiConstraint", + "UnionConstraint", + "parse_constraint", + "parse_single_constraint", +] diff --git a/src/poetry/core/semver/helpers.py b/src/poetry/core/semver/helpers.py index 5b5d8e59d..065d366f3 100644 --- a/src/poetry/core/semver/helpers.py +++ b/src/poetry/core/semver/helpers.py @@ -1,6 +1,7 @@ from __future__ import annotations -from poetry.core.constraints.version import parse_constraint +from poetry.core.constraints.version.parser import parse_constraint +from poetry.core.constraints.version.parser import parse_single_constraint -__all__ = ["parse_constraint"] +__all__ = ["parse_constraint", "parse_single_constraint"]