Skip to content

Commit 171fc97

Browse files
committed
First implementation of next_version
* Implement semver.next_version(version, part, prerelease_token="rc") * Add test cases * test_next_version * test_next_version_with_invalid_parts * Reformat code with black Co-authored-by: George Sakkis <gsakkis>
1 parent 3f92aa5 commit 171fc97

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

semver.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,53 @@ def finalize_version(version):
684684
return format_version(verinfo["major"], verinfo["minor"], verinfo["patch"])
685685

686686

687+
def next_version(version, part, prerelease_token="rc"):
688+
"""
689+
Determines the next version, takeing prereleases into account.
690+
691+
The "major", "minor", and "patch" raises the respective parts like
692+
the ``bump_*`` functions. The real difference is using the
693+
"preprelease" part. It gives you the next patch version of the prerelease,
694+
for example:
695+
696+
>>> semver.next_version("0.1.4", "prerelease")
697+
'0.1.5-rc.1'
698+
699+
:param version: a semver version string
700+
:param part: One of "major", "minor", "patch", or "prerelease"
701+
:param prerelease_token: prefix string of prerelease, defaults to 'rc'
702+
:return:
703+
"""
704+
validparts = {
705+
"major",
706+
"minor",
707+
"patch",
708+
"prerelease",
709+
# "build", # ???
710+
}
711+
if part not in validparts:
712+
raise ValueError(
713+
"Invalid part. Expected one of {validparts}, but got {part!r}".format(
714+
validparts=validparts, part=part
715+
)
716+
)
717+
version = VersionInfo.parse(version)
718+
if version.prerelease and (
719+
part == "patch"
720+
or (part == "minor" and version.patch == 0)
721+
or (part == "major" and version.minor == version.patch == 0)
722+
):
723+
return str(version.replace(prerelease=None))
724+
725+
if part in ("major", "minor", "patch"):
726+
return str(getattr(version, "bump_" + part)())
727+
728+
if not version.prerelease:
729+
version = version.bump_patch()
730+
return str(version.bump_prerelease(prerelease_token))
731+
732+
733+
# ---- CLI
687734
def cmd_bump(args):
688735
"""
689736
Subcommand: Bumps a version.

test_semver.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
match,
2121
max_ver,
2222
min_ver,
23+
next_version,
2324
parse,
2425
parse_version_info,
2526
process,
@@ -39,6 +40,7 @@
3940
match,
4041
max_ver,
4142
min_ver,
43+
next_version,
4244
parse,
4345
process,
4446
replace,
@@ -827,3 +829,33 @@ def test_replace_raises_ValueError_for_non_numeric_values():
827829
def test_should_versioninfo_isvalid():
828830
assert VersionInfo.isvalid("1.0.0") is True
829831
assert VersionInfo.isvalid("foo") is False
832+
833+
834+
@pytest.mark.parametrize(
835+
"version, part, expected",
836+
[
837+
# major
838+
("1.0.4-rc.1", "major", "2.0.0"),
839+
("1.1.0-rc.1", "major", "2.0.0"),
840+
("1.1.4-rc.1", "major", "2.0.0"),
841+
("1.2.3", "major", "2.0.0"),
842+
("1.0.0-rc.1", "major", "1.0.0"),
843+
# minor
844+
("0.2.0-rc.1", "minor", "0.2.0"),
845+
("0.2.5-rc.1", "minor", "0.3.0"),
846+
("1.3.1", "minor", "1.4.0"),
847+
# patch
848+
("1.3.2", "patch", "1.3.3"),
849+
("0.1.5-rc.2", "patch", "0.1.5"),
850+
# prerelease
851+
("0.1.4", "prerelease", "0.1.5-rc.1"),
852+
("0.1.5-rc.1", "prerelease", "0.1.5-rc.2"),
853+
],
854+
)
855+
def test_next_version(version, part, expected):
856+
assert next_version(version, part) == expected
857+
858+
859+
def test_next_version_with_invalid_parts():
860+
with pytest.raises(ValueError):
861+
next_version("1.0.1", "invalid")

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