summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--semantic_version/base.py24
-rwxr-xr-xtests/test_base.py9
3 files changed, 27 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 6c0f593..2bf2e2c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,12 @@ ChangeLog
2.10.1 (unreleased)
-------------------
+*Minor:*
+
+ * `112 <https://github.com/rbarrois/python-semanticversion/issues/112>`_:
+ Functions returning a new ``Version`` instance reuse the current class,
+ helping with subclassing.
+
*Bugfix:*
* `141 <https://github.com/rbarrois/python-semanticversion/issues/141>`_:
diff --git a/semantic_version/base.py b/semantic_version/base.py
index 1c10155..6be5624 100644
--- a/semantic_version/base.py
+++ b/semantic_version/base.py
@@ -132,14 +132,14 @@ class Version(object):
def next_major(self):
if self.prerelease and self.minor == self.patch == 0:
- return Version(
+ return self.__class__(
major=self.major,
minor=0,
patch=0,
partial=self.partial,
)
else:
- return Version(
+ return self.__class__(
major=self.major + 1,
minor=0,
patch=0,
@@ -148,14 +148,14 @@ class Version(object):
def next_minor(self):
if self.prerelease and self.patch == 0:
- return Version(
+ return self.__class__(
major=self.major,
minor=self.minor,
patch=0,
partial=self.partial,
)
else:
- return Version(
+ return self.__class__(
major=self.major,
minor=self.minor + 1,
patch=0,
@@ -164,14 +164,14 @@ class Version(object):
def next_patch(self):
if self.prerelease:
- return Version(
+ return self.__class__(
major=self.major,
minor=self.minor,
patch=self.patch,
partial=self.partial,
)
else:
- return Version(
+ return self.__class__(
major=self.major,
minor=self.minor,
patch=self.patch + 1,
@@ -181,7 +181,7 @@ class Version(object):
def truncate(self, level='patch'):
"""Return a new Version object, truncated up to the selected level."""
if level == 'build':
- return Version(
+ return self.__class__(
major=self.major,
minor=self.minor,
patch=self.patch,
@@ -190,7 +190,7 @@ class Version(object):
partial=self.partial,
)
elif level == 'prerelease':
- return Version(
+ return self.__class__(
major=self.major,
minor=self.minor,
patch=self.patch,
@@ -198,21 +198,21 @@ class Version(object):
partial=self.partial,
)
elif level == 'patch':
- return Version(
+ return self.__class__(
major=self.major,
minor=self.minor,
patch=self.patch,
partial=self.partial,
)
elif level == 'minor':
- return Version(
+ return self.__class__(
major=self.major,
minor=self.minor,
patch=None if self.partial else 0,
partial=self.partial,
)
elif level == 'major':
- return Version(
+ return self.__class__(
major=self.major,
minor=None if self.partial else 0,
patch=None if self.partial else 0,
@@ -266,7 +266,7 @@ class Version(object):
)
if match.end() == len(version_string):
- return Version(version, partial=partial)
+ return cls(version, partial=partial)
rest = version_string[match.end():]
diff --git a/tests/test_base.py b/tests/test_base.py
index 73d1b08..4136045 100755
--- a/tests/test_base.py
+++ b/tests/test_base.py
@@ -405,6 +405,15 @@ class VersionTestCase(unittest.TestCase):
self.assertEqual(v.truncate("minor"), base.Version("3.2.0"))
self.assertEqual(v.truncate("major"), base.Version("3.0.0"))
+ def test_subclass(self):
+ """Custom subclasses of Version returns instances of themselves."""
+ class MyVersion(base.Version):
+ pass
+
+ v = MyVersion("3.2.1-pre")
+ subv = v.truncate()
+ self.assertEqual(type(subv), MyVersion)
+
class SpecItemTestCase(unittest.TestCase):
if sys.version_info[0] <= 2: