Skip to content

Commit 011f680

Browse files
committed
Fix python-semver#344 Allow empty string for bump method
The methods .bump_prerelease('') and .bump_build('') generates a prerelease and build part without the token.
1 parent bee273e commit 011f680

File tree

3 files changed

+84
-11
lines changed

3 files changed

+84
-11
lines changed

docs/usage/raise-parts-of-a-version.rst

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,28 @@ a version:
2828
'3.4.5-pre.2+build.5'
2929
3030
Likewise the module level functions :func:`semver.bump_major`.
31+
32+
For the functions :func:`Version.bump_prerelease <semver.version.Version.bump_prerelease>` and :func:`Version.bump_build <semver.version.Version.bump_build>` it's possible to pass an empty string or ``None``. However,
33+
it gives different results::
34+
35+
.. code-block:: python
36+
37+
>>> str(Version.parse("3.4.5").bump_prerelease(''))
38+
'3.4.5-1'
39+
>>> str(Version.parse("3.4.5").bump_prerelease(None))
40+
'3.4.5-rc.1'
41+
42+
An empty string removes any prefix whereas ``None`` is the same as calling
43+
the method without any argument.
44+
45+
If you already have a prerelease, the argument for the method
46+
is not taken into account:
47+
48+
.. code-block:: python
49+
50+
>>> str(Version.parse("3.4.5-rc.1").bump_prerelease(None))
51+
'3.4.5-rc.2'
52+
>>> str(Version.parse("3.4.5-rc.1").bump_prerelease(''))
53+
'3.4.5-rc.2'
54+
55+

src/semver/version.py

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -305,38 +305,62 @@ def bump_patch(self) -> "Version":
305305
cls = type(self)
306306
return cls(self._major, self._minor, self._patch + 1)
307307

308-
def bump_prerelease(self, token: str = "rc") -> "Version":
308+
def bump_prerelease(self, token: Optional[str] = "rc") -> "Version":
309309
"""
310310
Raise the prerelease part of the version, return a new object but leave
311311
self untouched.
312312
313-
:param token: defaults to ``rc``
314-
:return: new object with the raised prerelease part
313+
:param token: defaults to ``'rc'``
314+
:return: new :class:`Version` object with the raised prerelease part.
315+
The original object is not modified.
315316
316317
>>> ver = semver.parse("3.4.5")
317-
>>> ver.bump_prerelease()
318-
Version(major=3, minor=4, patch=5, prerelease='rc.2', \
319-
build=None)
318+
>>> ver.bump_prerelease().prerelease
319+
'rc.2'
320+
>>> ver.bump_prerelease('').prerelease
321+
'1'
320322
"""
321323
cls = type(self)
322-
prerelease = cls._increment_string(self._prerelease or (token or "rc") + ".0")
324+
if self._prerelease is not None:
325+
prerelease = self._prerelease
326+
elif token == "":
327+
prerelease = "0"
328+
elif token is None:
329+
prerelease = "rc.0"
330+
else:
331+
prerelease = str(token) + ".0"
332+
333+
# self._prerelease or (token or "rc") + ".0"
334+
prerelease = cls._increment_string(prerelease)
323335
return cls(self._major, self._minor, self._patch, prerelease)
324336

325-
def bump_build(self, token: str = "build") -> "Version":
337+
# VersionPart = Union[int, Optional[str]]
338+
def bump_build(self, token: Optional[str] = "build") -> "Version":
326339
"""
327340
Raise the build part of the version, return a new object but leave self
328341
untouched.
329342
330-
:param token: defaults to ``build``
331-
:return: new object with the raised build part
343+
:param token: defaults to ``'build'``
344+
:return: new :class:`Version` object with the raised build part.
345+
The original object is not modified.
332346
333347
>>> ver = semver.parse("3.4.5-rc.1+build.9")
334348
>>> ver.bump_build()
335349
Version(major=3, minor=4, patch=5, prerelease='rc.1', \
336350
build='build.10')
337351
"""
338352
cls = type(self)
339-
build = cls._increment_string(self._build or (token or "build") + ".0")
353+
if self._build is not None:
354+
build = self._build
355+
elif token == "":
356+
build = "0"
357+
elif token is None:
358+
build = "build.0"
359+
else:
360+
build = str(token) + ".0"
361+
362+
# self._build or (token or "build") + ".0"
363+
build = cls._increment_string(build)
340364
return cls(self._major, self._minor, self._patch, self._prerelease, build)
341365

342366
def compare(self, other: Comparable) -> int:

tests/test_bump.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,30 @@ def test_should_versioninfo_bump_multiple():
6666
assert v.bump_prerelease().bump_build().bump_build().bump_prerelease() == expected
6767

6868

69+
def test_should_versioninfo_bump_prerelease_with_empty_str():
70+
v = parse_version_info("3.4.5")
71+
expected = parse_version_info("3.4.5-1")
72+
assert v.bump_prerelease("") == expected
73+
74+
75+
def test_should_versioninfo_bump_prerelease_with_none():
76+
v = parse_version_info("3.4.5")
77+
expected = parse_version_info("3.4.5-rc.1")
78+
assert v.bump_prerelease(None) == expected
79+
80+
81+
def test_should_versioninfo_bump_build_with_empty_str():
82+
v = parse_version_info("3.4.5")
83+
expected = parse_version_info("3.4.5+1")
84+
assert v.bump_build("") == expected
85+
86+
87+
def test_should_versioninfo_bump_build_with_none():
88+
v = parse_version_info("3.4.5")
89+
expected = parse_version_info("3.4.5+build.1")
90+
assert v.bump_build(None) == expected
91+
92+
6993
def test_should_ignore_extensions_for_bump():
7094
assert bump_patch("3.4.5-rc1+build4") == "3.4.6"
7195

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy