Skip to content

Commit 9912cde

Browse files
committed
feat(bump): version_provider=semver optional option to make version compatible with semver
Signed-off-by: apkawa <apkawa@gmail.com>
1 parent fb0d1eb commit 9912cde

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
@@ -7,7 +7,7 @@
77
import argcomplete
88
from decli import cli
99

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

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 (
@@ -61,6 +61,12 @@ def __init__(self, config: BaseConfig, arguments: dict):
6161
self.retry = arguments["retry"]
6262
self.pre_bump_hooks = self.config.settings["pre_bump_hooks"]
6363
self.post_bump_hooks = self.config.settings["post_bump_hooks"]
64+
version_provider = arguments["version_provider"] or self.config.settings.get(
65+
"version_provider"
66+
)
67+
self.version_provider = (
68+
version_provider and version_providers.providers[version_provider]
69+
)
6470

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

154160
current_tag_version: str = bump.normalize_tag(
155-
current_version, tag_format=tag_format
161+
current_version,
162+
tag_format=tag_format,
163+
version_provider_cls=self.version_provider,
156164
)
157165

158166
is_initial = self.is_initial_tag(current_tag_version, is_yes)
@@ -208,9 +216,14 @@ def __call__(self): # noqa: C901
208216
prerelease_offset=prerelease_offset,
209217
devrelease=devrelease,
210218
is_local_version=is_local_version,
219+
version_provider_cls=self.version_provider,
211220
)
212221

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

commitizen/defaults.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class Settings(TypedDict, total=False):
4343
pre_bump_hooks: Optional[List[str]]
4444
post_bump_hooks: Optional[List[str]]
4545
prerelease_offset: int
46+
version_provider: Optional[str]
4647

4748

4849
name: str = "cz_conventional_commits"
@@ -71,6 +72,7 @@ class Settings(TypedDict, total=False):
7172
"pre_bump_hooks": [],
7273
"post_bump_hooks": [],
7374
"prerelease_offset": 0,
75+
"version_provider": None,
7476
}
7577

7678
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)