From 06200a949670bb725f8c2803b29d8cbee64a7cd7 Mon Sep 17 00:00:00 2001 From: Darren Weber Date: Wed, 19 Jun 2019 17:39:06 -0700 Subject: [PATCH] Add utils for poetry/semver - boolean check for a sem-ver string - filter and sort a sequence of sem-ver strings - these utils are used to filter and sort a list of git tags --- poetry/semver/__init__.py | 16 +++++++++++ tests/semver/test_sem_ver_utils.py | 46 ++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 tests/semver/test_sem_ver_utils.py diff --git a/poetry/semver/__init__.py b/poetry/semver/__init__.py index 40b3cd4ec0c..fee42830e3a 100644 --- a/poetry/semver/__init__.py +++ b/poetry/semver/__init__.py @@ -1,6 +1,8 @@ import re +from typing import List from .empty_constraint import EmptyConstraint +from .patterns import COMPLETE_VERSION from .patterns import BASIC_CONSTRAINT from .patterns import CARET_CONSTRAINT from .patterns import TILDE_CONSTRAINT @@ -12,6 +14,20 @@ from .version_union import VersionUnion +def is_sem_ver_constraint(sem_ver): # type: (str) -> bool + try: + parse_single_constraint(sem_ver) + return True + except ValueError: + return False + + +def sem_ver_sorted(values): # type: (List[str]) -> List[str] + versions = [t for t in values if COMPLETE_VERSION.match(t)] + versions = sorted(versions, key=lambda t: parse_single_constraint(t)) + return versions + + def parse_constraint(constraints): # type: (str) -> VersionConstraint if constraints == "*": return VersionRange() diff --git a/tests/semver/test_sem_ver_utils.py b/tests/semver/test_sem_ver_utils.py new file mode 100644 index 00000000000..330b357487f --- /dev/null +++ b/tests/semver/test_sem_ver_utils.py @@ -0,0 +1,46 @@ +import pytest + +from poetry.semver import is_sem_ver_constraint +from poetry.semver import sem_ver_sorted + + +@pytest.mark.parametrize( + "constraint,result", + [ + ("*", True), + ("*.*", True), + ("v*.*", True), + ("*.x.*", True), + ("x.X.x.*", True), + # ('!=1.0.0', Constraint('!=', '1.0.0.0')), + (">1.0.0", True), + ("<1.2.3", True), + ("<=1.2.3", True), + (">=1.2.3", True), + ("=1.2.3", True), + ("1.2.3", True), + ("=1.0", True), + ("1.2.3b5", True), + (">= 1.2.3", True), + (">dev", True), + ("hot-fix-666", False), + ], +) +def test_is_sem_ver_constraint(constraint, result): + assert is_sem_ver_constraint(constraint) == result + + +@pytest.mark.parametrize( + "unsorted, sorted_", + [ + (["1.0.3", "1.0.2", "1.0.1"], ["1.0.1", "1.0.2", "1.0.3"]), + (["1.0.0.2", "1.0.0.0rc2"], ["1.0.0.0rc2", "1.0.0.2"]), + (["1.0.0.0", "1.0.0.0rc2"], ["1.0.0.0rc2", "1.0.0.0"]), + (["1.0.0.0.0", "1.0.0.0rc2"], ["1.0.0.0rc2", "1.0.0.0.0"]), + (["1.0.0rc2", "1.0.0rc1"], ["1.0.0rc1", "1.0.0rc2"]), + (["1.0.0rc2", "1.0.0b1"], ["1.0.0b1", "1.0.0rc2"]), + (["1.0.3", "1.0.2", "1.0.1", "hot-fix-666"], ["1.0.1", "1.0.2", "1.0.3"]), + ], +) +def test_sem_ver_sorted(unsorted, sorted_): + assert sem_ver_sorted(unsorted) == sorted_