diff --git a/docs/usage/increase-parts-of-a-version_prereleases.rst b/docs/usage/increase-parts-of-a-version_prereleases.rst index 845f229..c2088c5 100644 --- a/docs/usage/increase-parts-of-a-version_prereleases.rst +++ b/docs/usage/increase-parts-of-a-version_prereleases.rst @@ -19,6 +19,6 @@ would perhaps a better fit. >>> str(Version.parse("3.4.5-pre.2+build.4").next_version(part="patch")) '3.4.5' >>> str(Version.parse("3.4.5+build.4").next_version(part="patch")) - '3.4.5' + '3.4.6' >>> str(Version.parse("0.1.4").next_version("prerelease")) '0.1.5-rc.1' diff --git a/src/semver/version.py b/src/semver/version.py index f9450f9..c3625f4 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -471,7 +471,7 @@ def next_version(self, part: str, prerelease_token: str = "rc") -> "Version": f"Invalid part. Expected one of {validparts}, but got {part!r}" ) version = self - if (version.prerelease or version.build) and ( + if version.prerelease and ( part == "patch" or (part == "minor" and version.patch == 0) or (part == "major" and version.minor == version.patch == 0) diff --git a/tests/test_parsing.py b/tests/test_parsing.py index ddf5219..e4e7858 100644 --- a/tests/test_parsing.py +++ b/tests/test_parsing.py @@ -198,6 +198,16 @@ def test_next_version_with_invalid_parts(): ("0.2.0-rc.1", "patch", "0.2.0"), # same as "minor" ("1.0.0-rc.1", "patch", "1.0.0"), # same as "major" ("1.0.0-rc.1", "minor", "1.0.0"), # same as "major" + # build-only versions: build metadata does not affect precedence, + # so next_version should bump the version, not just strip the build + ("1.2.3+build.5", "patch", "1.2.4"), + ("1.0.0+build.5", "patch", "1.0.1"), + ("0.1.4+build.5", "patch", "0.1.5"), + ("1.2.0+build.5", "minor", "1.3.0"), + ("1.0.0+build.5", "major", "2.0.0"), + # prerelease+build: build is stripped along with prerelease during finalization + ("1.2.3-rc.1+build.5", "patch", "1.2.3"), + ("1.2.3-rc.1+build.5", "prerelease", "1.2.3-rc.2"), ], ) def test_next_version_with_versioninfo(version, part, expected):