Skip to content

Commit

Permalink
refactor: move constraint parsing of generic constraints from __init_…
Browse files Browse the repository at this point in the history
…_ into parser module and rename module for constraint parsing of version constraints from helpers to parser
  • Loading branch information
radoering committed Sep 24, 2022
1 parent 01de337 commit a41467e
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 57 deletions.
54 changes: 1 addition & 53 deletions src/poetry/core/constraints/generic/__init__.py
Original file line number Diff line number Diff line change
@@ -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"(?<!^)(?<![=>< ,]) *(?<!-)[, ](?!-) *(?!,|$)", constraints
)
constraint_objects = []

if len(and_constraints) > 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",
Expand Down
64 changes: 64 additions & 0 deletions src/poetry/core/constraints/generic/parser.py
Original file line number Diff line number Diff line change
@@ -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"(?<!^)(?<![=>< ,]) *(?<!-)[, ](?!-) *(?!,|$)", constraints
)
constraint_objects = []

if len(and_constraints) > 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}")
2 changes: 1 addition & 1 deletion src/poetry/core/constraints/version/__init__.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down
21 changes: 20 additions & 1 deletion src/poetry/core/packages/constraints/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand All @@ -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",
]
5 changes: 3 additions & 2 deletions src/poetry/core/semver/helpers.py
Original file line number Diff line number Diff line change
@@ -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"]

0 comments on commit a41467e

Please sign in to comment.