summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRick Eyre <rick.eyre@hotmail.com>2015-02-17 11:50:30 -0500
committerRaphaël Barrois <raphael.barrois@polytechnique.org>2015-04-01 01:20:27 +0200
commit0b4d4c724f6d86bbc2c964af0463ef28de7c8015 (patch)
tree013d9ddc0f29dd9dda0fe8dad9830109ca4b58e6
parent5525528da2e00579777f5c2ce392a629b2634ff2 (diff)
downloadsemantic-version-0b4d4c724f6d86bbc2c964af0463ef28de7c8015.tar.gz
Adds a new bump version func to the API.
-rw-r--r--CREDITS1
-rw-r--r--README.rst16
-rw-r--r--semantic_version/base.py11
-rwxr-xr-xtests/test_base.py28
4 files changed, 56 insertions, 0 deletions
diff --git a/CREDITS b/CREDITS
index 75f8e2e..c700c77 100644
--- a/CREDITS
+++ b/CREDITS
@@ -19,6 +19,7 @@ The project has received contributions from (in alphabetical order):
* Raphaël Barrois <raphael.barrois+semver@polytechnique.org> (https://github.com/rbarrois)
* Michael Hrivnak <mhrivnak@hrivnak.org> (https://github.com/mhrivnak)
+* Rick Eyre <rick.eyre@outlook.com> (https://github.com/rickeyre)
Contributor license agreement
diff --git a/README.rst b/README.rst
index a13871c..a6bf947 100644
--- a/README.rst
+++ b/README.rst
@@ -107,6 +107,22 @@ Obviously, :class:`Versions <Version>` can be compared:
>>> semantic_version.Version('0.1.1') <= semantic_version.Version('0.1.1-alpha')
False
+You can also get a new version that represents a bump in one of the version levels:
+
+.. code-block:: pycon
+
+ >>> v = semantic_version.Version('0.1.1-pre+build')
+ >>> new_v = v.next_major()
+ >>> str(new_v)
+ '1.0.0'
+ >>> v = semantic_version.Version('1.1.1-pre+build')
+ >>> new_v = v.next_minor()
+ >>> str(new_v)
+ '1.2.0'
+ >>> v = semantic_version.Version('1.1.1-pre+build')
+ >>> new_v = v.next_patch()
+ >>> str(new_v)
+ '1.1.2'
It is also possible to check whether a given string is a proper semantic version string:
diff --git a/semantic_version/base.py b/semantic_version/base.py
index b56fcee..841c5f3 100644
--- a/semantic_version/base.py
+++ b/semantic_version/base.py
@@ -88,6 +88,17 @@ class Version(object):
return value
return int(value)
+ def next_major(self):
+ return Version('.'.join(str(x) for x in [self.major + 1, 0, 0]))
+
+ def next_minor(self):
+ return Version(
+ '.'.join(str(x) for x in [self.major, self.minor + 1, 0]))
+
+ def next_patch(self):
+ return Version(
+ '.'.join(str(x) for x in [self.major, self.minor, self.patch + 1]))
+
@classmethod
def coerce(cls, version_string, partial=False):
"""Coerce an arbitrary version string into a semver-compatible one.
diff --git a/tests/test_base.py b/tests/test_base.py
index f482140..df5d4ee 100755
--- a/tests/test_base.py
+++ b/tests/test_base.py
@@ -242,6 +242,34 @@ class VersionTestCase(unittest.TestCase):
self.assertTrue(v != '0.1.0')
self.assertFalse(v == '0.1.0')
+ def test_bump_versions(self):
+ # We Test each property explicitly as the == comparator for versions
+ # does not distinguish between prerelease or builds for equality.
+
+ v = base.Version('1.0.0-pre+build')
+ v = v.next_major()
+ self.assertEqual(v.major, 2)
+ self.assertEqual(v.minor, 0)
+ self.assertEqual(v.patch, 0)
+ self.assertEqual(v.prerelease, ())
+ self.assertEqual(v.build, ())
+
+ v = base.Version('1.0.1-pre+build')
+ v = v.next_minor()
+ self.assertEqual(v.major, 1)
+ self.assertEqual(v.minor, 1)
+ self.assertEqual(v.patch, 0)
+ self.assertEqual(v.prerelease, ())
+ self.assertEqual(v.build, ())
+
+ v = base.Version('1.1.0-pre+build')
+ v = v.next_patch()
+ self.assertEqual(v.major, 1)
+ self.assertEqual(v.minor, 1)
+ self.assertEqual(v.patch, 1)
+ self.assertEqual(v.prerelease, ())
+ self.assertEqual(v.build, ())
+
class SpecItemTestCase(unittest.TestCase):
components = {