Skip to content

Commit d59af5b

Browse files
committed
refactor(version_scheme): cleanup
1 parent a0cc490 commit d59af5b

File tree

1 file changed

+55
-55
lines changed

1 file changed

+55
-55
lines changed

commitizen/version_schemes.py

Lines changed: 55 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@
4141

4242
Increment: TypeAlias = Literal["MAJOR", "MINOR", "PATCH"]
4343
Prerelease: TypeAlias = Literal["alpha", "beta", "rc"]
44-
DEFAULT_VERSION_PARSER = r"v?(?P<version>([0-9]+)\.([0-9]+)(?:\.([0-9]+))?(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.]+)?(\w+)?)"
44+
_DEFAULT_VERSION_PARSER = re.compile(
45+
r"v?(?P<version>([0-9]+)\.([0-9]+)(?:\.([0-9]+))?(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.]+)?(\w+)?)"
46+
)
4547

4648

4749
@runtime_checkable
@@ -156,7 +158,7 @@ class BaseVersion(_BaseVersion):
156158
A base class implementing the `VersionProtocol` for PEP440-like versions.
157159
"""
158160

159-
parser: ClassVar[re.Pattern] = re.compile(DEFAULT_VERSION_PARSER)
161+
parser: ClassVar[re.Pattern] = _DEFAULT_VERSION_PARSER
160162
"""Regex capturing this version scheme into a `version` group"""
161163

162164
@property
@@ -186,20 +188,16 @@ def generate_prerelease(
186188
if not prerelease:
187189
return ""
188190

191+
new_prerelease_number = offset
189192
# prevent down-bumping the pre-release phase, e.g. from 'b1' to 'a2'
190193
# https://packaging.python.org/en/latest/specifications/version-specifiers/#pre-releases
191194
# https://semver.org/#spec-item-11
192195
if self.is_prerelease and self.pre:
193196
prerelease = max(prerelease, self.pre[0])
197+
if prerelease.startswith(self.pre[0]):
198+
new_prerelease_number = self.pre[1] + 1
194199

195-
# version.pre is needed for mypy check
196-
if self.is_prerelease and self.pre and prerelease.startswith(self.pre[0]):
197-
prev_prerelease: int = self.pre[1]
198-
new_prerelease_number = prev_prerelease + 1
199-
else:
200-
new_prerelease_number = offset
201-
pre_version = f"{prerelease}{new_prerelease_number}"
202-
return pre_version
200+
return f"{prerelease}{new_prerelease_number}"
203201

204202
def generate_devrelease(self, devrelease: int | None) -> str:
205203
"""Generate devrelease
@@ -265,39 +263,39 @@ def bump(
265263
if self.local and is_local_version:
266264
local_version = self.scheme(self.local).bump(increment)
267265
return self.scheme(f"{self.public}+{local_version}") # type: ignore
268-
else:
269-
if not self.is_prerelease:
270-
base = self.increment_base(increment)
271-
elif exact_increment:
272-
base = self.increment_base(increment)
273-
else:
274-
base = f"{self.major}.{self.minor}.{self.micro}"
275-
if increment == PATCH:
276-
pass
277-
elif increment == MINOR:
278-
if self.micro != 0:
279-
base = self.increment_base(increment)
280-
elif increment == MAJOR:
281-
if self.minor != 0 or self.micro != 0:
282-
base = self.increment_base(increment)
283-
dev_version = self.generate_devrelease(devrelease)
284-
285-
release = list(self.release)
286-
if len(release) < 3:
287-
release += [0] * (3 - len(release))
288-
current_base = ".".join(str(part) for part in release)
289-
if base == current_base:
290-
pre_version = self.generate_prerelease(
291-
prerelease, offset=prerelease_offset
292-
)
293-
else:
294-
base_version = cast(BaseVersion, self.scheme(base))
295-
pre_version = base_version.generate_prerelease(
296-
prerelease, offset=prerelease_offset
297-
)
298-
build_metadata = self.generate_build_metadata(build_metadata)
299-
# TODO: post version
300-
return self.scheme(f"{base}{pre_version}{dev_version}{build_metadata}") # type: ignore
266+
267+
base = self._get_increment_base(increment, exact_increment)
268+
dev_version = self.generate_devrelease(devrelease)
269+
270+
release = list(self.release)
271+
if len(release) < 3:
272+
release += [0] * (3 - len(release))
273+
current_base = ".".join(str(part) for part in release)
274+
275+
base_version = (
276+
self if base == current_base else cast(BaseVersion, self.scheme(base))
277+
)
278+
279+
pre_version = base_version.generate_prerelease(
280+
prerelease, offset=prerelease_offset
281+
)
282+
283+
# TODO: post version
284+
return self.scheme(
285+
f"{base}{pre_version}{dev_version}{self.generate_build_metadata(build_metadata)}"
286+
) # type: ignore
287+
288+
def _get_increment_base(
289+
self, increment: Increment | None, exact_increment: bool
290+
) -> str:
291+
if (
292+
not self.is_prerelease
293+
or exact_increment
294+
or (increment == MINOR and self.micro != 0)
295+
or (increment == MAJOR and (self.minor != 0 or self.micro != 0))
296+
):
297+
return self.increment_base(increment)
298+
return f"{self.major}.{self.minor}.{self.micro}"
301299

302300

303301
class Pep440(BaseVersion):
@@ -316,7 +314,7 @@ class SemVer(BaseVersion):
316314
"""
317315

318316
def __str__(self) -> str:
319-
parts = []
317+
parts: list[str] = []
320318

321319
# Epoch
322320
if self.epoch != 0:
@@ -364,7 +362,7 @@ def prerelease(self) -> str | None:
364362
return None
365363

366364
def __str__(self) -> str:
367-
parts = []
365+
parts: list[str] = []
368366

369367
# Epoch
370368
if self.epoch != 0:
@@ -373,9 +371,19 @@ def __str__(self) -> str:
373371
# Release segment
374372
parts.append(".".join(str(x) for x in self.release))
375373

374+
if prerelease := self._get_prerelease():
375+
parts.append(f"-{prerelease}")
376+
377+
# Local version segment
378+
if self.local:
379+
parts.append(f"+{self.local}")
380+
381+
return "".join(parts)
382+
383+
def _get_prerelease(self) -> str:
376384
# Pre-release identifiers
377385
# See: https://semver.org/spec/v2.0.0.html#spec-item-9
378-
prerelease_parts = []
386+
prerelease_parts: list[str] = []
379387
if self.prerelease:
380388
prerelease_parts.append(f"{self.prerelease}")
381389

@@ -387,15 +395,7 @@ def __str__(self) -> str:
387395
if self.dev is not None:
388396
prerelease_parts.append(f"dev.{self.dev}")
389397

390-
if prerelease_parts:
391-
parts.append("-")
392-
parts.append(".".join(prerelease_parts))
393-
394-
# Local version segment
395-
if self.local:
396-
parts.append(f"+{self.local}")
397-
398-
return "".join(parts)
398+
return ".".join(prerelease_parts)
399399

400400

401401
DEFAULT_SCHEME: VersionScheme = Pep440

0 commit comments

Comments
 (0)