From 9245567804b64357363200daa7a6f8e92467112f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damien=20Nad=C3=A9?= Date: Tue, 21 Jul 2020 18:11:59 +0200 Subject: [PATCH 1/4] turn VersionInfo.parse into a class method in order to be able to create subclasses --- semver.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/semver.py b/semver.py index 85811fec..f6e5bffc 100644 --- a/semver.py +++ b/semver.py @@ -637,8 +637,8 @@ def match(self, match_expr): return cmp_res in possibilities - @staticmethod - def parse(version): + @classmethod + def parse(cls, version): """ Parse version string to a VersionInfo instance. @@ -651,7 +651,7 @@ def parse(version): VersionInfo(major=3, minor=4, patch=5, \ prerelease='pre.2', build='build.4') """ - match = VersionInfo._REGEX.match(version) + match = cls._REGEX.match(version) if match is None: raise ValueError("%s is not valid SemVer string" % version) @@ -661,7 +661,7 @@ def parse(version): version_parts["minor"] = int(version_parts["minor"]) version_parts["patch"] = int(version_parts["patch"]) - return VersionInfo(**version_parts) + return cls(**version_parts) def replace(self, **parts): """ From 1f971022ca8e3bc25a55bc444785fa2886e28b48 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Fri, 16 Oct 2020 13:53:46 +0200 Subject: [PATCH 2/4] Integrate test case to test subclass --- test_semver.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test_semver.py b/test_semver.py index b23576d5..42c10e55 100644 --- a/test_semver.py +++ b/test_semver.py @@ -1128,3 +1128,19 @@ def test_next_version_with_versioninfo(version, part, expected): ) def test_repr(version, expected): assert repr(version) == expected + + +def test_subclass_from_versioninfo(): + class SemVerWithVPrefix(VersionInfo): + @classmethod + def parse(cls, version: str): + if not version.startswith('v'): + raise ValueError(f"{version}: not a valid semantic version tag") + return super().parse(version[1:]) + + def __str__(self): + # Reconstruct the tag. + return "v" + super().__str__() + + v = SemVerWithVPrefix.parse("v1.2.3") + assert str(v) == "v1.2.3" From 6f63acbd3ade775e36aaa5d663fd8f6cdb15531f Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Fri, 16 Oct 2020 13:56:20 +0200 Subject: [PATCH 3/4] Correct formatting with black --- test_semver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_semver.py b/test_semver.py index 42c10e55..60b123a6 100644 --- a/test_semver.py +++ b/test_semver.py @@ -1134,7 +1134,7 @@ def test_subclass_from_versioninfo(): class SemVerWithVPrefix(VersionInfo): @classmethod def parse(cls, version: str): - if not version.startswith('v'): + if not version.startswith("v"): raise ValueError(f"{version}: not a valid semantic version tag") return super().parse(version[1:]) From 2a8637b2194f357c7969f2f2ca87dc2bab6f2dd0 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Fri, 16 Oct 2020 14:00:35 +0200 Subject: [PATCH 4/4] Make it run for Python 2.7 and 3.4 --- test_semver.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test_semver.py b/test_semver.py index 60b123a6..0aeedbdb 100644 --- a/test_semver.py +++ b/test_semver.py @@ -1133,14 +1133,16 @@ def test_repr(version, expected): def test_subclass_from_versioninfo(): class SemVerWithVPrefix(VersionInfo): @classmethod - def parse(cls, version: str): + def parse(cls, version): if not version.startswith("v"): - raise ValueError(f"{version}: not a valid semantic version tag") - return super().parse(version[1:]) + raise ValueError( + "{v}: not a valid semantic version tag".format(v=version) + ) + return super(SemVerWithVPrefix, cls).parse(version[1:]) def __str__(self): # Reconstruct the tag. - return "v" + super().__str__() + return "v" + super(SemVerWithVPrefix, self).__str__() v = SemVerWithVPrefix.parse("v1.2.3") assert str(v) == "v1.2.3"