@@ -257,6 +257,26 @@ def bump_build(self, token="build"):
257
257
"""
258
258
return parse_version_info (bump_build (str (self ), token ))
259
259
260
+ def next_version (self , part , prerelease_token = "rc" ):
261
+ """
262
+ Determines the next version, takeing prereleases into account.
263
+
264
+ The "major", "minor", and "patch" raises the respective parts like
265
+ the ``bump_*`` functions. The real difference is using the
266
+ "preprelease" part. It gives you the next patch version of the prerelease,
267
+ for example:
268
+
269
+ >>> semver.next_version("0.1.4", "prerelease")
270
+ '0.1.5-rc.1'
271
+
272
+ :param version: a semver version string
273
+ :param part: One of "major", "minor", "patch", or "prerelease"
274
+ :param prerelease_token: prefix string of prerelease, defaults to 'rc'
275
+ :return:
276
+ """
277
+ nxt = next_version (str (self ), part , prerelease_token )
278
+ return parse_version_info (nxt )
279
+
260
280
@comparator
261
281
def __eq__ (self , other ):
262
282
return _compare_by_keys (self ._asdict (), _to_dict (other )) == 0
@@ -684,6 +704,53 @@ def finalize_version(version):
684
704
return format_version (verinfo ["major" ], verinfo ["minor" ], verinfo ["patch" ])
685
705
686
706
707
+ def next_version (version , part , prerelease_token = "rc" ):
708
+ """
709
+ Determines the next version, takeing prereleases into account.
710
+
711
+ The "major", "minor", and "patch" raises the respective parts like
712
+ the ``bump_*`` functions. The real difference is using the
713
+ "preprelease" part. It gives you the next patch version of the prerelease,
714
+ for example:
715
+
716
+ >>> semver.next_version("0.1.4", "prerelease")
717
+ '0.1.5-rc.1'
718
+
719
+ :param version: a semver version string
720
+ :param part: One of "major", "minor", "patch", or "prerelease"
721
+ :param prerelease_token: prefix string of prerelease, defaults to 'rc'
722
+ :return:
723
+ """
724
+ validparts = {
725
+ "major" ,
726
+ "minor" ,
727
+ "patch" ,
728
+ "prerelease" ,
729
+ # "build", # ???
730
+ }
731
+ if part not in validparts :
732
+ raise ValueError (
733
+ "Invalid part. Expected one of {validparts}, but got {part!r}" .format (
734
+ validparts = validparts , part = part
735
+ )
736
+ )
737
+ version = VersionInfo .parse (version )
738
+ if version .prerelease and (
739
+ part == "patch"
740
+ or (part == "minor" and version .patch == 0 )
741
+ or (part == "major" and version .minor == version .patch == 0 )
742
+ ):
743
+ return str (version .replace (prerelease = None ))
744
+
745
+ if part in ("major" , "minor" , "patch" ):
746
+ return str (getattr (version , "bump_" + part )())
747
+
748
+ if not version .prerelease :
749
+ version = version .bump_patch ()
750
+ return str (version .bump_prerelease (prerelease_token ))
751
+
752
+
753
+ # ---- CLI
687
754
def cmd_bump (args ):
688
755
"""
689
756
Subcommand: Bumps a version.
0 commit comments