@@ -257,6 +257,26 @@ def bump_build(self, token="build"):
257257 """
258258 return parse_version_info (bump_build (str (self ), token ))
259259
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+
260280 @comparator
261281 def __eq__ (self , other ):
262282 return _compare_by_keys (self ._asdict (), _to_dict (other )) == 0
@@ -374,14 +394,7 @@ def parse_version_info(version):
374394 'build.4'
375395 """
376396 parts = parse (version )
377- version_info = VersionInfo (
378- parts ["major" ],
379- parts ["minor" ],
380- parts ["patch" ],
381- parts ["prerelease" ],
382- parts ["build" ],
383- )
384-
397+ version_info = VersionInfo (** parts )
385398 return version_info
386399
387400
@@ -684,6 +697,53 @@ def finalize_version(version):
684697 return format_version (verinfo ["major" ], verinfo ["minor" ], verinfo ["patch" ])
685698
686699
700+ def next_version (version , part , prerelease_token = "rc" ):
701+ """
702+ Determines the next version, takeing prereleases into account.
703+
704+ The "major", "minor", and "patch" raises the respective parts like
705+ the ``bump_*`` functions. The real difference is using the
706+ "preprelease" part. It gives you the next patch version of the prerelease,
707+ for example:
708+
709+ >>> semver.next_version("0.1.4", "prerelease")
710+ '0.1.5-rc.1'
711+
712+ :param version: a semver version string
713+ :param part: One of "major", "minor", "patch", or "prerelease"
714+ :param prerelease_token: prefix string of prerelease, defaults to 'rc'
715+ :return:
716+ """
717+ validparts = {
718+ "major" ,
719+ "minor" ,
720+ "patch" ,
721+ "prerelease" ,
722+ # "build", # ???
723+ }
724+ if part not in validparts :
725+ raise ValueError (
726+ "Invalid part. Expected one of {validparts}, but got {part!r}" .format (
727+ validparts = validparts , part = part
728+ )
729+ )
730+ version = VersionInfo .parse (version )
731+ if version .prerelease and (
732+ part == "patch"
733+ or (part == "minor" and version .patch == 0 )
734+ or (part == "major" and version .minor == version .patch == 0 )
735+ ):
736+ return str (version .replace (prerelease = None ))
737+
738+ if part in ("major" , "minor" , "patch" ):
739+ return str (getattr (version , "bump_" + part )())
740+
741+ if not version .prerelease :
742+ version = version .bump_patch ()
743+ return str (version .bump_prerelease (prerelease_token ))
744+
745+
746+ # ---- CLI
687747def cmd_bump (args ):
688748 """
689749 Subcommand: Bumps a version.
0 commit comments