diff --git a/ci_cd/utils.py b/ci_cd/utils.py index 782edade..70d1e534 100644 --- a/ci_cd/utils.py +++ b/ci_cd/utils.py @@ -129,10 +129,24 @@ def _build_version( if minor is not None: version += f".{minor}" if patch is not None: + if minor is None: + raise ValueError("Minor must be given if patch is given") version += f".{patch}" if pre_release is not None: + # semver spec #9: A pre-release version MAY be denoted by appending a + # hyphen and a series of dot separated identifiers immediately following + # the patch version. + # https://semver.org/#spec-item-9 + if patch is None: + raise ValueError("Patch must be given if pre_release is given") version += f"-{pre_release}" if build is not None: + # semver spec #10: Build metadata MAY be denoted by appending a plus sign + # and a series of dot separated identifiers immediately following the patch + # or pre-release version. + # https://semver.org/#spec-item-10 + if patch is None: + raise ValueError("Patch must be given if build is given") version += f"+{build}" return version diff --git a/tests/test_utils.py b/tests/test_utils.py index f57a21b9..7266ffb6 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -101,6 +101,26 @@ def test_semanticversion_invalid() -> None: {"version": "1.0.0", "major": 1, "minor": 0, "patch": 0}, "version cannot be specified along with other parameters", ), + ( + {"major": 1, "patch": 0}, + "Minor must be given if patch is given", + ), + ( + { + "major": 1, + "minor": 0, + "pre_release": "alpha", + }, + "Patch must be given if pre_release is given", + ), + ( + { + "major": 1, + "minor": 0, + "build": "001", + }, + "Patch must be given if build is given", + ), ("", "At least major must be given"), ({}, "At least major must be given"), ]