@@ -684,6 +684,50 @@ 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 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" :
719+ return str (version .bump_major ())
720+ elif part == "minor" :
721+ return str (version .bump_minor ())
722+ elif part == "patch" :
723+ return str (version .bump_patch ())
724+ elif part == "prerelease" :
725+ return str (version .bump_patch ().bump_prerelease (token = prerelease_token ))
726+
727+ raise RuntimeError ("Should not happen, got {part}" .format (part = part ))
728+
729+
730+ # ---- CLI
687731def cmd_bump (args ):
688732 """
689733 Subcommand: Bumps a version.
0 commit comments