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