@@ -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
@@ -374,14 +394,7 @@ def parse_version_info(version):
374
394
'build.4'
375
395
"""
376
396
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 )
385
398
return version_info
386
399
387
400
@@ -684,6 +697,53 @@ def finalize_version(version):
684
697
return format_version (verinfo ["major" ], verinfo ["minor" ], verinfo ["patch" ])
685
698
686
699
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
687
747
def cmd_bump (args ):
688
748
"""
689
749
Subcommand: Bumps a version.
0 commit comments