diff --git a/src/poetry/core/semver/patterns.py b/src/poetry/core/semver/patterns.py index 0c3629b15..0bbf5d79f 100644 --- a/src/poetry/core/semver/patterns.py +++ b/src/poetry/core/semver/patterns.py @@ -8,7 +8,7 @@ ) _COMPLETE_VERSION = ( - fr"v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:\.(\d+))?{MODIFIERS}(?:\+[^\s]+)?" + fr"v?(?:\d+!)?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:\.(\d+))?{MODIFIERS}(?:\+[^\s]+)?" ) COMPLETE_VERSION = re.compile("(?i)" + _COMPLETE_VERSION) diff --git a/src/poetry/core/semver/version.py b/src/poetry/core/semver/version.py index ad89860b5..e617ddc62 100644 --- a/src/poetry/core/semver/version.py +++ b/src/poetry/core/semver/version.py @@ -171,6 +171,8 @@ def from_parts( post: Optional[ReleaseTag] = None, dev: Optional[ReleaseTag] = None, local: "LocalSegmentType" = None, + *, + epoch: int = 0, ) -> "Version": return cls( release=Release(major=major, minor=minor, patch=patch, extra=extra), @@ -178,4 +180,5 @@ def from_parts( post=post, dev=dev, local=local, + epoch=epoch, ) diff --git a/tests/semver/test_helpers.py b/tests/semver/test_helpers.py index c0054e984..389612254 100644 --- a/tests/semver/test_helpers.py +++ b/tests/semver/test_helpers.py @@ -25,6 +25,7 @@ (">=1.2.3", VersionRange(min=Version.from_parts(1, 2, 3), include_min=True)), ("=1.2.3", Version.from_parts(1, 2, 3)), ("1.2.3", Version.from_parts(1, 2, 3)), + ("1!2.3.4", Version.from_parts(2, 3, 4, epoch=1)), ("=1.0", Version.from_parts(1, 0, 0)), ("1.2.3b5", Version.from_parts(1, 2, 3, pre=ReleaseTag("beta", 5))), (">= 1.2.3", VersionRange(min=Version.from_parts(1, 2, 3), include_min=True)), diff --git a/tests/semver/test_version.py b/tests/semver/test_version.py index 0d18a1c51..b29cae723 100644 --- a/tests/semver/test_version.py +++ b/tests/semver/test_version.py @@ -28,6 +28,7 @@ ("1.0.0-post1", Version.from_parts(1, 0, 0, post=ReleaseTag("post", 1))), ("0.6c", Version.from_parts(0, 6, 0, pre=ReleaseTag("rc", 0))), ("0.6pre", Version.from_parts(0, 6, 0, pre=ReleaseTag("preview", 0))), + ("1!2.3.4", Version.from_parts(2, 3, 4, epoch=1)), ], ) def test_parse_valid(text: str, version: Version):