Skip to content

Commit e2b7cfe

Browse files
Apkawaactions-user
authored andcommitted
feat(bump): version_provider=semver optional option to make version compatible with semver
Signed-off-by: apkawa <apkawa@gmail.com>
1 parent 9d3a050 commit e2b7cfe

File tree

9 files changed

+368
-10
lines changed

9 files changed

+368
-10
lines changed

commitizen/bump.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from collections import OrderedDict
44
from itertools import zip_longest
55
from string import Template
6-
from typing import List, Optional, Tuple, Union
6+
from typing import List, Optional, Tuple, Type, Union
77

88
from packaging.version import Version
99

@@ -120,6 +120,7 @@ def generate_version(
120120
prerelease_offset: int = 0,
121121
devrelease: Optional[int] = None,
122122
is_local_version: bool = False,
123+
version_provider_cls: Optional[Type[Version]] = None,
123124
) -> Version:
124125
"""Based on the given increment a proper semver will be generated.
125126
@@ -132,15 +133,18 @@ def generate_version(
132133
MINOR 1.0.0 -> 1.1.0
133134
MAJOR 1.0.0 -> 2.0.0
134135
"""
136+
version_provider_cls = version_provider_cls or Version
135137
if is_local_version:
136-
version = Version(current_version)
138+
version = version_provider_cls(current_version)
137139
dev_version = devrelease_generator(devrelease=devrelease)
138140
pre_version = prerelease_generator(
139141
str(version.local), prerelease=prerelease, offset=prerelease_offset
140142
)
141143
semver = semver_generator(str(version.local), increment=increment)
142144

143-
return Version(f"{version.public}+{semver}{pre_version}{dev_version}")
145+
return version_provider_cls(
146+
f"{version.public}+{semver}{pre_version}{dev_version}"
147+
)
144148
else:
145149
dev_version = devrelease_generator(devrelease=devrelease)
146150
pre_version = prerelease_generator(
@@ -149,7 +153,7 @@ def generate_version(
149153
semver = semver_generator(current_version, increment=increment)
150154

151155
# TODO: post version
152-
return Version(f"{semver}{pre_version}{dev_version}")
156+
return version_provider_cls(f"{semver}{pre_version}{dev_version}")
153157

154158

155159
def update_version_in_files(
@@ -208,7 +212,9 @@ def _version_to_regex(version: str) -> str:
208212

209213

210214
def normalize_tag(
211-
version: Union[Version, str], tag_format: Optional[str] = None
215+
version: Union[Version, str],
216+
tag_format: Optional[str] = None,
217+
version_provider_cls: Optional[Type[Version]] = None,
212218
) -> str:
213219
"""The tag and the software version might be different.
214220
@@ -221,8 +227,9 @@ def normalize_tag(
221227
| ver1.0.0 | 1.0.0 |
222228
| ver1.0.0.a0 | 1.0.0a0 |
223229
"""
230+
version_provider_cls = version_provider_cls or Version
224231
if isinstance(version, str):
225-
version = Version(version)
232+
version = version_provider_cls(version)
226233

227234
if not tag_format:
228235
return str(version)

commitizen/cli.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import argcomplete
99
from decli import cli
1010

11-
from commitizen import commands, config, out
11+
from commitizen import commands, config, out, version_providers
1212
from commitizen.exceptions import (
1313
CommitizenException,
1414
ExitCode,
@@ -203,6 +203,12 @@
203203
"help": "bump to the given version (e.g: 1.5.3)",
204204
"metavar": "MANUAL_VERSION",
205205
},
206+
{
207+
"name": ["--version-provider"],
208+
"help": "choose version provider",
209+
"default": None,
210+
"choices": version_providers.providers,
211+
},
206212
],
207213
},
208214
{

commitizen/commands/bump.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import questionary
66
from packaging.version import InvalidVersion, Version
77

8-
from commitizen import bump, cmd, defaults, factory, git, hooks, out
8+
from commitizen import bump, cmd, defaults, factory, git, hooks, out, version_providers
99
from commitizen.commands.changelog import Changelog
1010
from commitizen.config import BaseConfig
1111
from commitizen.exceptions import (
@@ -62,6 +62,12 @@ def __init__(self, config: BaseConfig, arguments: dict):
6262
self.retry = arguments["retry"]
6363
self.pre_bump_hooks = self.config.settings["pre_bump_hooks"]
6464
self.post_bump_hooks = self.config.settings["post_bump_hooks"]
65+
version_provider = arguments["version_provider"] or self.config.settings.get(
66+
"version_provider"
67+
)
68+
self.version_provider = (
69+
version_provider and version_providers.providers[version_provider]
70+
)
6571

6672
def is_initial_tag(self, current_tag_version: str, is_yes: bool = False) -> bool:
6773
"""Check if reading the whole git tree up to HEAD is needed."""
@@ -153,7 +159,9 @@ def __call__(self): # noqa: C901
153159
self.cz.bump_map = defaults.bump_map_major_version_zero
154160

155161
current_tag_version: str = bump.normalize_tag(
156-
current_version, tag_format=tag_format
162+
current_version,
163+
tag_format=tag_format,
164+
version_provider_cls=self.version_provider,
157165
)
158166

159167
is_initial = self.is_initial_tag(current_tag_version, is_yes)
@@ -209,9 +217,14 @@ def __call__(self): # noqa: C901
209217
prerelease_offset=prerelease_offset,
210218
devrelease=devrelease,
211219
is_local_version=is_local_version,
220+
version_provider_cls=self.version_provider,
212221
)
213222

214-
new_tag_version = bump.normalize_tag(new_version, tag_format=tag_format)
223+
new_tag_version = bump.normalize_tag(
224+
new_version,
225+
tag_format=tag_format,
226+
version_provider_cls=self.version_provider,
227+
)
215228
message = bump.create_commit_message(
216229
current_version, new_version, bump_commit_message
217230
)

commitizen/defaults.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class Settings(TypedDict, total=False):
4545
pre_bump_hooks: Optional[List[str]]
4646
post_bump_hooks: Optional[List[str]]
4747
prerelease_offset: int
48+
version_provider: Optional[str]
4849

4950

5051
name: str = "cz_conventional_commits"
@@ -75,6 +76,7 @@ class Settings(TypedDict, total=False):
7576
"pre_bump_hooks": [],
7677
"post_bump_hooks": [],
7778
"prerelease_offset": 0,
79+
"version_provider": None,
7880
}
7981

8082
MAJOR = "MAJOR"

commitizen/version_providers.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from packaging.version import Version
2+
3+
4+
class SemVerVersion(Version):
5+
def __str__(self) -> str:
6+
parts = []
7+
8+
# Epoch
9+
if self.epoch != 0:
10+
parts.append(f"{self.epoch}!")
11+
12+
# Release segment
13+
parts.append(".".join(str(x) for x in self.release))
14+
15+
# Pre-release
16+
if self.pre is not None:
17+
pre = "".join(str(x) for x in self.pre)
18+
parts.append(f"-{pre}")
19+
20+
# Post-release
21+
if self.post is not None:
22+
parts.append(f"-post{self.post}")
23+
24+
# Development release
25+
if self.dev is not None:
26+
parts.append(f"-dev{self.dev}")
27+
28+
# Local version segment
29+
if self.local is not None:
30+
parts.append(f"+{self.local}")
31+
32+
return "".join(parts)
33+
34+
35+
providers = {
36+
"pep": Version,
37+
"semver": SemVerVersion,
38+
}

docs/bump.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ options:
9696
--retry retry commit if it fails the 1st time
9797
--major-version-zero keep major version at zero, even for breaking changes
9898
--prerelease-offset start pre-releases with this offset
99+
--version-provider {pep,semver}
100+
choose version provider
101+
99102
```
100103
101104
### `--files-only`
@@ -476,6 +479,26 @@ Defaults to: `0`
476479
prerelease_offset = 1
477480
```
478481
482+
### `version_provider`
483+
484+
Choose version provider
485+
486+
* `pep` - default version provider.
487+
- prerelease - `1.0.1a0`
488+
- devrelease - `1.0.1dev0`
489+
- dev and pre - `1.0.1a0.dev0`
490+
* `semver` - semver compatibly provider. Added "-" delimiter
491+
- prerelease - `1.0.1-a0`
492+
- devrelease - `1.0.1-dev0`
493+
- dev and pre - `1.0.1-a0-dev0`
494+
495+
Defaults to: `pep`
496+
497+
```toml
498+
[tool.commitizen]
499+
version_provider = "semver"
500+
```
501+
479502
## Custom bump
480503
481504
Read the [customizing section](./customization.md).

0 commit comments

Comments
 (0)