Visitar URL original
Fix #484: Increment old-style prerelease with dot (#485) · sysfce2/python-semver@8c0a3f7 · GitHub
Skip to content

Commit 8c0a3f7

Browse files
authored
Fix python-semver#484: Increment old-style prerelease with dot (python-semver#485)
Fix `next_version` to correctly increment old-style prerelease versions without a dot separator (for example `rc3`). Previously, calling `next_version("prerelease")` on such versions would reset the prerelease number to 1 instead of incrementing it.
1 parent f53d13d commit 8c0a3f7

3 files changed

Lines changed: 41 additions & 1 deletion

File tree

‎changelog.d/484.bugfix.rst‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix :meth:`~semver.Version.next_version` to correctly increment old-style prerelease versions without a dot separator (for example ``rc3``). Previously, calling ``next_version("prerelease")`` on such versions would reset the prerelease number to 1 instead of incrementing it.

‎src/semver/version.py‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,13 @@ def next_version(self, part: str, prerelease_token: str = "rc") -> "Version":
539539
if part in cls.NAMES[:3]:
540540
return getattr(version, "bump_" + part)()
541541
else:
542-
if version.prerelease is not None and prerelease_token:
542+
if version.prerelease and prerelease_token:
543+
# Handle old-style prereleases like "rc3" (no dot separator)
544+
match = re.match(f"^{prerelease_token}(\\d+)$", version.prerelease)
545+
if match:
546+
num = int(match.group(1))
547+
return version.replace(prerelease=f"{prerelease_token}{num + 1}")
548+
543549
current_token = version.prerelease.split(".")[0]
544550
if current_token != prerelease_token:
545551
return version.replace(prerelease=f"{prerelease_token}.1", build=None)

‎tests/test_issue484.py‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"""Regression test for issue #484: next_version with old-style prereleases."""
2+
3+
from semver import Version
4+
5+
6+
def test_issue_484_rc3_to_rc4():
7+
"""Old-style prerelease 'rc3' should bump to 'rc4', not reset to 'rc.1'."""
8+
v = Version.parse("0.1.2-rc3")
9+
assert str(v.next_version("prerelease")) == "0.1.2-rc4"
10+
11+
12+
def test_issue_484_rc9_to_rc10():
13+
"""Ensure numeric bumping works across digit boundaries."""
14+
v = Version.parse("1.2.3-rc9")
15+
assert str(v.next_version("prerelease")) == "1.2.3-rc10"
16+
17+
18+
def test_issue_484_dot_style_unchanged():
19+
"""Dot-separated prereleases should still work as before."""
20+
v = Version.parse("0.1.2-rc.3")
21+
assert str(v.next_version("prerelease")) == "0.1.2-rc.4"
22+
23+
24+
def test_issue_484_different_token():
25+
"""A different prerelease token should still reset to rc.1."""
26+
v = Version.parse("1.2.3-alpha1")
27+
assert str(v.next_version("prerelease")) == "1.2.3-rc.1"
28+
29+
30+
def test_issue_484_custom_token():
31+
"""Custom prerelease token should be respected."""
32+
v = Version.parse("1.2.3-beta2")
33+
assert str(v.next_version("prerelease", "beta")) == "1.2.3-beta3"

0 commit comments

Comments
 (0)