@@ -684,6 +684,58 @@ def finalize_version(version):
684
684
return format_version (verinfo ["major" ], verinfo ["minor" ], verinfo ["patch" ])
685
685
686
686
687
+ def next_version (version , part , prerelease_token = "rc" ):
688
+ """
689
+ Determines the next version, takeing prepreleases 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 part == "major" and version .prerelease :
719
+ return format_version (version .major , version .minor , version .patch )
720
+ elif part == "major" and not version .prerelease :
721
+ return str (version .bump_major ())
722
+ elif part == "minor" and version .prerelease :
723
+ return format_version (version .major , version .minor , version .patch )
724
+ elif part == "minor" and not version .prerelease :
725
+ return str (version .bump_minor ())
726
+ elif part == "patch" and version .prerelease :
727
+ return format_version (version .major , version .minor , version .patch )
728
+ elif part == "patch" and not version .prerelease :
729
+ return str (version .bump_patch ())
730
+ elif part == "prerelease" and version .prerelease :
731
+ return str (version .bump_prerelease (token = prerelease_token ))
732
+ elif part == "prerelease" and not version .prerelease :
733
+ return str (version .bump_patch ().bump_prerelease (token = prerelease_token ))
734
+
735
+ raise RuntimeError ("Should not happen, got {part}" .format (part = part ))
736
+
737
+
738
+ # ---- CLI
687
739
def cmd_bump (args ):
688
740
"""
689
741
Subcommand: Bumps a version.
0 commit comments