diff --git a/CREDITS b/CREDITS index ca9a781..258ea2b 100644 --- a/CREDITS +++ b/CREDITS @@ -18,12 +18,13 @@ Contributors The project has received contributions from (in alphabetical order): * Raphaƫl Barrois (https://github.com/rbarrois) +* Martin Ek (https://github.com/ekmartin) * Rick Eyre (https://github.com/rickeyre) -* Hugo Rodger-Brown (https://github.com/yunojuno) +* Dave Hall (https://github.com/skwashd) * Michael Hrivnak (https://github.com/mhrivnak) * William Minchin (https://github.com/minchinweb) -* Dave Hall (https://github.com/skwashd) -* Martin Ek (https://github.com/ekmartin) +* Hugo Rodger-Brown (https://github.com/yunojuno) +* Cooper Stimson (https://github.com/6c1) Contributor license agreement diff --git a/README.rst b/README.rst index c1d97d2..d1419e6 100644 --- a/README.rst +++ b/README.rst @@ -138,6 +138,15 @@ You can also get a new version that represents a bump in one of the version leve >>> str(new_v) '1.1.2' +A parameterized convenience wrapper is available: + +.. code-block:: pycon + + >>> v = semantic_version.Version('1.1.1-pre+build') + >>> new_v = v.next_version('minor') + >>> str(new_v) + '1.2.0' + 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 61d0f6a..5a68b2f 100644 --- a/semantic_version/base.py +++ b/semantic_version/base.py @@ -11,6 +11,9 @@ from .compat import base_cmp +MAJOR, MINOR, PATCH = 'major', 'minor', 'patch' + + def _to_int(value): try: return int(value), True @@ -110,6 +113,15 @@ def next_patch(self): return Version( '.'.join(str(x) for x in [self.major, self.minor, self.patch + 1])) + def next_version(self, version_level): + """Increment the given version level""" + if version_level not in (MAJOR, MINOR, PATCH): + raise ValueError( + 'Version level must be one of {}, {} or {}' + .format(MAJOR, MINOR, PATCH) + ) + return getattr(self, 'next_{}'.format(version_level))() + @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 a1255c3..34030d8 100755 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -393,6 +393,50 @@ def test_bump_prerelease_versions(self): self.assertEqual(v.prerelease, ()) self.assertEqual(v.build, ()) + def test_bump_version(self): + + v = base.Version('1.0.0+build') + self.assertEqual(v.next_major(), v.next_version(base.MAJOR)) + v = base.Version('1.0.0+build') + self.assertEqual(v.next_minor(), v.next_version(base.MINOR)) + v = base.Version('1.0.0+build') + self.assertEqual(v.next_patch(), v.next_version(base.PATCH)) + + v = base.Version('1.1.0+build') + self.assertEqual(v.next_major(), v.next_version(base.MAJOR)) + v = base.Version('1.1.0+build') + self.assertEqual(v.next_minor(), v.next_version(base.MINOR)) + v = base.Version('1.1.0+build') + self.assertEqual(v.next_patch(), v.next_version(base.PATCH)) + + v = base.Version('1.0.1+build') + self.assertEqual(v.next_major(), v.next_version(base.MAJOR)) + v = base.Version('1.0.1+build') + self.assertEqual(v.next_minor(), v.next_version(base.MINOR)) + v = base.Version('1.0.1+build') + self.assertEqual(v.next_patch(), v.next_version(base.PATCH)) + + v = base.Version('1.0.0-pre+build') + self.assertEqual(v.next_major(), v.next_version(base.MAJOR)) + v = base.Version('1.0.0-pre+build') + self.assertEqual(v.next_minor(), v.next_version(base.MINOR)) + v = base.Version('1.0.0-pre+build') + self.assertEqual(v.next_patch(), v.next_version(base.PATCH)) + + v = base.Version('1.1.0-pre+build') + self.assertEqual(v.next_major(), v.next_version(base.MAJOR)) + v = base.Version('1.1.0-pre+build') + self.assertEqual(v.next_minor(), v.next_version(base.MINOR)) + v = base.Version('1.1.0-pre+build') + self.assertEqual(v.next_patch(), v.next_version(base.PATCH)) + + v = base.Version('1.0.1-pre+build') + self.assertEqual(v.next_major(), v.next_version(base.MAJOR)) + v = base.Version('1.0.1-pre+build') + self.assertEqual(v.next_minor(), v.next_version(base.MINOR)) + v = base.Version('1.0.1-pre+build') + self.assertEqual(v.next_patch(), v.next_version(base.PATCH)) + class SpecItemTestCase(unittest.TestCase): invalids = [