2
2
3
3
import os
4
4
import re
5
- import sys
6
- import typing
7
5
from collections import OrderedDict
8
- from itertools import zip_longest
9
6
from string import Template
10
7
11
- from packaging .version import Version
12
-
13
- from commitizen .defaults import MAJOR , MINOR , PATCH , bump_message
8
+ from commitizen .defaults import bump_message
14
9
from commitizen .exceptions import CurrentVersionNotFoundError
15
10
from commitizen .git import GitCommit , smart_open
16
-
17
- if sys .version_info >= (3 , 8 ):
18
- from commitizen .version_types import VersionProtocol
19
- else :
20
- # workaround mypy issue for 3.7 python
21
- VersionProtocol = typing .Any
11
+ from commitizen .version_schemes import DEFAULT_SCHEME , VersionScheme , Version
22
12
23
13
24
14
def find_increment (
@@ -54,115 +44,6 @@ def find_increment(
54
44
return increment
55
45
56
46
57
- def prerelease_generator (
58
- current_version : str , prerelease : str | None = None , offset : int = 0
59
- ) -> str :
60
- """Generate prerelease
61
-
62
- X.YaN # Alpha release
63
- X.YbN # Beta release
64
- X.YrcN # Release Candidate
65
- X.Y # Final
66
-
67
- This function might return something like 'alpha1'
68
- but it will be handled by Version.
69
- """
70
- if not prerelease :
71
- return ""
72
-
73
- version = Version (current_version )
74
- # version.pre is needed for mypy check
75
- if version .is_prerelease and version .pre and prerelease .startswith (version .pre [0 ]):
76
- prev_prerelease : int = version .pre [1 ]
77
- new_prerelease_number = prev_prerelease + 1
78
- else :
79
- new_prerelease_number = offset
80
- pre_version = f"{ prerelease } { new_prerelease_number } "
81
- return pre_version
82
-
83
-
84
- def devrelease_generator (devrelease : int = None ) -> str :
85
- """Generate devrelease
86
-
87
- The devrelease version should be passed directly and is not
88
- inferred based on the previous version.
89
- """
90
- if devrelease is None :
91
- return ""
92
-
93
- return f"dev{ devrelease } "
94
-
95
-
96
- def semver_generator (current_version : str , increment : str = None ) -> str :
97
- version = Version (current_version )
98
- prev_release = list (version .release )
99
- increments = [MAJOR , MINOR , PATCH ]
100
- increments_version = dict (zip_longest (increments , prev_release , fillvalue = 0 ))
101
-
102
- # This flag means that current version
103
- # must remove its prerelease tag,
104
- # so it doesn't matter the increment.
105
- # Example: 1.0.0a0 with PATCH/MINOR -> 1.0.0
106
- if not version .is_prerelease :
107
- if increment == MAJOR :
108
- increments_version [MAJOR ] += 1
109
- increments_version [MINOR ] = 0
110
- increments_version [PATCH ] = 0
111
- elif increment == MINOR :
112
- increments_version [MINOR ] += 1
113
- increments_version [PATCH ] = 0
114
- elif increment == PATCH :
115
- increments_version [PATCH ] += 1
116
-
117
- return str (
118
- f"{ increments_version ['MAJOR' ]} ."
119
- f"{ increments_version ['MINOR' ]} ."
120
- f"{ increments_version ['PATCH' ]} "
121
- )
122
-
123
-
124
- def generate_version (
125
- current_version : str ,
126
- increment : str ,
127
- prerelease : str | None = None ,
128
- prerelease_offset : int = 0 ,
129
- devrelease : int | None = None ,
130
- is_local_version : bool = False ,
131
- version_type_cls : type [VersionProtocol ] | None = None ,
132
- ) -> VersionProtocol :
133
- """Based on the given increment a proper semver will be generated.
134
-
135
- For now the rules and versioning scheme is based on
136
- python's PEP 0440.
137
- More info: https://www.python.org/dev/peps/pep-0440/
138
-
139
- Example:
140
- PATCH 1.0.0 -> 1.0.1
141
- MINOR 1.0.0 -> 1.1.0
142
- MAJOR 1.0.0 -> 2.0.0
143
- """
144
- if version_type_cls is None :
145
- version_type_cls = Version
146
- if is_local_version :
147
- version = version_type_cls (current_version )
148
- dev_version = devrelease_generator (devrelease = devrelease )
149
- pre_version = prerelease_generator (
150
- str (version .local ), prerelease = prerelease , offset = prerelease_offset
151
- )
152
- semver = semver_generator (str (version .local ), increment = increment )
153
-
154
- return version_type_cls (f"{ version .public } +{ semver } { pre_version } { dev_version } " )
155
- else :
156
- dev_version = devrelease_generator (devrelease = devrelease )
157
- pre_version = prerelease_generator (
158
- current_version , prerelease = prerelease , offset = prerelease_offset
159
- )
160
- semver = semver_generator (current_version , increment = increment )
161
-
162
- # TODO: post version
163
- return version_type_cls (f"{ semver } { pre_version } { dev_version } " )
164
-
165
-
166
47
def update_version_in_files (
167
48
current_version : str , new_version : str , files : list [str ], * , check_consistency = False
168
49
) -> None :
@@ -219,9 +100,9 @@ def _version_to_regex(version: str) -> str:
219
100
220
101
221
102
def normalize_tag (
222
- version : VersionProtocol | str ,
103
+ version : Version | str ,
223
104
tag_format : str | None = None ,
224
- version_type_cls : type [ VersionProtocol ] | None = None ,
105
+ scheme : VersionScheme | None = None ,
225
106
) -> str :
226
107
"""The tag and the software version might be different.
227
108
@@ -234,19 +115,14 @@ def normalize_tag(
234
115
| ver1.0.0 | 1.0.0 |
235
116
| ver1.0.0.a0 | 1.0.0a0 |
236
117
"""
237
- if version_type_cls is None :
238
- version_type_cls = Version
239
- if isinstance (version , str ):
240
- version = version_type_cls (version )
118
+ scheme = scheme or DEFAULT_SCHEME
119
+ version = scheme (version ) if isinstance (version , str ) else version
241
120
242
121
if not tag_format :
243
122
return str (version )
244
123
245
124
major , minor , patch = version .release
246
- prerelease = ""
247
- # version.pre is needed for mypy check
248
- if version .is_prerelease and version .pre :
249
- prerelease = f"{ version .pre [0 ]} { version .pre [1 ]} "
125
+ prerelease = version .prerelease or ""
250
126
251
127
t = Template (tag_format )
252
128
return t .safe_substitute (
@@ -257,7 +133,7 @@ def normalize_tag(
257
133
def create_commit_message (
258
134
current_version : Version | str ,
259
135
new_version : Version | str ,
260
- message_template : str = None ,
136
+ message_template : str | None = None ,
261
137
) -> str :
262
138
if message_template is None :
263
139
message_template = bump_message
0 commit comments