11import os
22import re
3+ import sys
4+ import typing
35from collections import OrderedDict
46from itertools import zip_longest
57from string import Template
6- from typing import List , Optional , Tuple , Union
8+ from typing import List , Optional , Tuple , Type , Union
79
810from packaging .version import Version
911
1012from commitizen .defaults import MAJOR , MINOR , PATCH , bump_message
1113from commitizen .exceptions import CurrentVersionNotFoundError
1214from commitizen .git import GitCommit , smart_open
1315
16+ if sys .version_info >= (3 , 8 ):
17+ from commitizen .version_types import VersionProtocol
18+ else :
19+ # workaround mypy issue for 3.7 python
20+ VersionProtocol = typing .Any
21+
1422
1523def find_increment (
1624 commits : List [GitCommit ], regex : str , increments_map : Union [dict , OrderedDict ]
@@ -120,7 +128,8 @@ def generate_version(
120128 prerelease_offset : int = 0 ,
121129 devrelease : Optional [int ] = None ,
122130 is_local_version : bool = False ,
123- ) -> Version :
131+ version_type_cls : Optional [Type [VersionProtocol ]] = None ,
132+ ) -> VersionProtocol :
124133 """Based on the given increment a proper semver will be generated.
125134
126135 For now the rules and versioning scheme is based on
@@ -132,15 +141,17 @@ def generate_version(
132141 MINOR 1.0.0 -> 1.1.0
133142 MAJOR 1.0.0 -> 2.0.0
134143 """
144+ if version_type_cls is None :
145+ version_type_cls = Version
135146 if is_local_version :
136- version = Version (current_version )
147+ version = version_type_cls (current_version )
137148 dev_version = devrelease_generator (devrelease = devrelease )
138149 pre_version = prerelease_generator (
139150 str (version .local ), prerelease = prerelease , offset = prerelease_offset
140151 )
141152 semver = semver_generator (str (version .local ), increment = increment )
142153
143- return Version (f"{ version .public } +{ semver } { pre_version } { dev_version } " )
154+ return version_type_cls (f"{ version .public } +{ semver } { pre_version } { dev_version } " )
144155 else :
145156 dev_version = devrelease_generator (devrelease = devrelease )
146157 pre_version = prerelease_generator (
@@ -149,7 +160,7 @@ def generate_version(
149160 semver = semver_generator (current_version , increment = increment )
150161
151162 # TODO: post version
152- return Version (f"{ semver } { pre_version } { dev_version } " )
163+ return version_type_cls (f"{ semver } { pre_version } { dev_version } " )
153164
154165
155166def update_version_in_files (
@@ -208,7 +219,9 @@ def _version_to_regex(version: str) -> str:
208219
209220
210221def normalize_tag (
211- version : Union [Version , str ], tag_format : Optional [str ] = None
222+ version : Union [VersionProtocol , str ],
223+ tag_format : Optional [str ] = None ,
224+ version_type_cls : Optional [Type [VersionProtocol ]] = None ,
212225) -> str :
213226 """The tag and the software version might be different.
214227
@@ -221,8 +234,10 @@ def normalize_tag(
221234 | ver1.0.0 | 1.0.0 |
222235 | ver1.0.0.a0 | 1.0.0a0 |
223236 """
237+ if version_type_cls is None :
238+ version_type_cls = Version
224239 if isinstance (version , str ):
225- version = Version (version )
240+ version = version_type_cls (version )
226241
227242 if not tag_format :
228243 return str (version )
0 commit comments