Skip to content

Commit 603646e

Browse files
committed
feat(version_types): expose version_types as a commitizen.version_type endpoint
1 parent 0354a9d commit 603646e

File tree

5 files changed

+29
-26
lines changed

5 files changed

+29
-26
lines changed

commitizen/bump.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
1+
from __future__ import annotations
2+
13
import os
24
import re
3-
import sys
4-
import typing
55
from collections import OrderedDict
66
from itertools import zip_longest
77
from string import Template
8-
from typing import List, Optional, Tuple, Type, Union
8+
from typing import TYPE_CHECKING, List, Optional, Tuple, Type, Union
99

1010
from packaging.version import Version
1111

1212
from commitizen.defaults import MAJOR, MINOR, PATCH, bump_message
1313
from commitizen.exceptions import CurrentVersionNotFoundError
1414
from commitizen.git import GitCommit, smart_open
1515

16-
if sys.version_info >= (3, 8):
16+
if TYPE_CHECKING:
1717
from commitizen.version_types import VersionProtocol
18-
else:
19-
# workaround mypy issue for 3.7 python
20-
VersionProtocol = typing.Any
2118

2219

2320
def find_increment(

commitizen/changelog.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,13 @@
2424
- [x] hook after changelog is generated (api calls)
2525
- [x] add support for change_type maps
2626
"""
27+
from __future__ import annotations
2728

2829
import os
2930
import re
30-
import sys
31-
import typing
3231
from collections import OrderedDict, defaultdict
3332
from datetime import date
34-
from typing import Callable, Dict, Iterable, List, Optional, Tuple, Type
33+
from typing import TYPE_CHECKING, Callable, Dict, Iterable, List, Optional, Tuple, Type
3534

3635
from jinja2 import Environment, PackageLoader
3736
from packaging.version import InvalidVersion, Version
@@ -41,11 +40,8 @@
4140
from commitizen.exceptions import InvalidConfigurationError, NoCommitsFoundError
4241
from commitizen.git import GitCommit, GitTag
4342

44-
if sys.version_info >= (3, 8):
43+
if TYPE_CHECKING:
4544
from commitizen.version_types import VersionProtocol
46-
else:
47-
# workaround mypy issue for 3.7 python
48-
VersionProtocol = typing.Any
4945

5046

5147
def get_commit_tag(commit: GitCommit, tags: List[GitTag]) -> Optional[GitTag]:

commitizen/version_types.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1-
import sys
2-
from typing import Optional, Tuple, Union
1+
from __future__ import annotations
32

4-
if sys.version_info >= (3, 8):
5-
from typing import Protocol as _Protocol
6-
else:
7-
_Protocol = object
3+
from typing import Optional, Tuple, Union
84

5+
import importlib_metadata as metadata
96
from packaging.version import Version
107

8+
# Protocol is Python 3.8+ but backported in typing-extensions
9+
try:
10+
from typing import Protocol
11+
except ImportError:
12+
from typing_extensions import Protocol # type: ignore
13+
1114

12-
class VersionProtocol(_Protocol):
15+
class VersionProtocol(Protocol):
1316
def __init__(self, _version: Union[Version, str]):
1417
raise NotImplementedError("must be implemented")
1518

@@ -37,7 +40,7 @@ def public(self) -> str:
3740
raise NotImplementedError("must be implemented")
3841

3942

40-
class SemVerVersion(VersionProtocol):
43+
class SemVer(VersionProtocol):
4144
def __init__(self, version: str):
4245
self._version = Version(version)
4346

@@ -93,7 +96,10 @@ def __str__(self) -> str:
9396
return "".join(parts)
9497

9598

99+
class Pep440(Version):
100+
pass
101+
102+
96103
VERSION_TYPES = {
97-
"semver": SemVerVersion,
98-
"pep440": Version,
104+
ep.name: ep.load() for ep in metadata.entry_points(group="commitizen.version_type")
99105
}

pyproject.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ pep621 = "commitizen.providers:Pep621Provider"
8989
poetry = "commitizen.providers:PoetryProvider"
9090
scm = "commitizen.providers:ScmProvider"
9191

92+
[tool.poetry.plugins."commitizen.version_type"]
93+
pep440 = "commitizen.version_types:Pep440"
94+
semver = "commitizen.version_types:SemVer"
95+
9296
[tool.coverage]
9397
[tool.coverage.report]
9498
show_missing = true

tests/test_bump_find_version_type_semver.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import pytest
44

55
from commitizen.bump import generate_version
6-
from commitizen.version_types import SemVerVersion
6+
from commitizen.version_types import SemVer
77

88
simple_flow = [
99
(("0.1.0", "PATCH", None, 0, None), "0.1.1"),
@@ -95,7 +95,7 @@ def test_generate_version_type(test_input, expected):
9595
prerelease=prerelease,
9696
prerelease_offset=prerelease_offset,
9797
devrelease=devrelease,
98-
version_type_cls=SemVerVersion,
98+
version_type_cls=SemVer,
9999
)
100100
)
101101
== expected

0 commit comments

Comments
 (0)