33import os
44import re
55from collections import OrderedDict
6- from itertools import zip_longest
76from string import Template
87from typing import List , Optional , Tuple , Union
98
10- from commitizen .defaults import MAJOR , MINOR , PATCH , bump_message
9+ from commitizen .defaults import bump_message
1110from commitizen .exceptions import CurrentVersionNotFoundError
1211from commitizen .git import GitCommit , smart_open
1312from commitizen .schemes import DEFAULT_SCHEME , Scheme , Version
@@ -46,115 +45,6 @@ def find_increment(
4645 return increment
4746
4847
49- def prerelease_generator (
50- current_version : str , prerelease : Optional [str ] = None , offset : int = 0
51- ) -> str :
52- """Generate prerelease
53-
54- X.YaN # Alpha release
55- X.YbN # Beta release
56- X.YrcN # Release Candidate
57- X.Y # Final
58-
59- This function might return something like 'alpha1'
60- but it will be handled by Version.
61- """
62- if not prerelease :
63- return ""
64-
65- version = Version (current_version )
66- # version.pre is needed for mypy check
67- if version .is_prerelease and version .pre and prerelease .startswith (version .pre [0 ]):
68- prev_prerelease : int = version .pre [1 ]
69- new_prerelease_number = prev_prerelease + 1
70- else :
71- new_prerelease_number = offset
72- pre_version = f"{ prerelease } { new_prerelease_number } "
73- return pre_version
74-
75-
76- def devrelease_generator (devrelease : int = None ) -> str :
77- """Generate devrelease
78-
79- The devrelease version should be passed directly and is not
80- inferred based on the previous version.
81- """
82- if devrelease is None :
83- return ""
84-
85- return f"dev{ devrelease } "
86-
87-
88- def semver_generator (current_version : str , increment : str = None ) -> str :
89- version = Version (current_version )
90- prev_release = list (version .release )
91- increments = [MAJOR , MINOR , PATCH ]
92- increments_version = dict (zip_longest (increments , prev_release , fillvalue = 0 ))
93-
94- # This flag means that current version
95- # must remove its prerelease tag,
96- # so it doesn't matter the increment.
97- # Example: 1.0.0a0 with PATCH/MINOR -> 1.0.0
98- if not version .is_prerelease :
99- if increment == MAJOR :
100- increments_version [MAJOR ] += 1
101- increments_version [MINOR ] = 0
102- increments_version [PATCH ] = 0
103- elif increment == MINOR :
104- increments_version [MINOR ] += 1
105- increments_version [PATCH ] = 0
106- elif increment == PATCH :
107- increments_version [PATCH ] += 1
108-
109- return str (
110- f"{ increments_version ['MAJOR' ]} ."
111- f"{ increments_version ['MINOR' ]} ."
112- f"{ increments_version ['PATCH' ]} "
113- )
114-
115-
116- def generate_version (
117- current_version : str ,
118- increment : str ,
119- prerelease : Optional [str ] = None ,
120- prerelease_offset : int = 0 ,
121- devrelease : Optional [int ] = None ,
122- is_local_version : bool = False ,
123- scheme : Optional [Scheme ] = None ,
124- ) -> Version :
125- """Based on the given increment a proper semver will be generated.
126-
127- For now the rules and versioning scheme is based on
128- python's PEP 0440.
129- More info: https://www.python.org/dev/peps/pep-0440/
130-
131- Example:
132- PATCH 1.0.0 -> 1.0.1
133- MINOR 1.0.0 -> 1.1.0
134- MAJOR 1.0.0 -> 2.0.0
135- """
136- scheme = scheme or DEFAULT_SCHEME
137-
138- if is_local_version :
139- version = scheme (current_version )
140- dev_version = devrelease_generator (devrelease = devrelease )
141- pre_version = prerelease_generator (
142- str (version .local ), prerelease = prerelease , offset = prerelease_offset
143- )
144- semver = semver_generator (str (version .local ), increment = increment )
145-
146- return scheme (f"{ version .public } +{ semver } { pre_version } { dev_version } " )
147- else :
148- dev_version = devrelease_generator (devrelease = devrelease )
149- pre_version = prerelease_generator (
150- current_version , prerelease = prerelease , offset = prerelease_offset
151- )
152- semver = semver_generator (current_version , increment = increment )
153-
154- # TODO: post version
155- return scheme (f"{ semver } { pre_version } { dev_version } " )
156-
157-
15848def update_version_in_files (
15949 current_version : str , new_version : str , files : List [str ], * , check_consistency = False
16050) -> None :
@@ -227,18 +117,13 @@ def normalize_tag(
227117 | ver1.0.0.a0 | 1.0.0a0 |
228118 """
229119 scheme = scheme or DEFAULT_SCHEME
230-
231- if isinstance (version , str ):
232- version = scheme (version )
120+ version = scheme (version ) if isinstance (version , str ) else version
233121
234122 if not tag_format :
235123 return str (version )
236124
237125 major , minor , patch = version .release
238- prerelease = ""
239- # version.pre is needed for mypy check
240- if version .is_prerelease and version .pre :
241- prerelease = f"{ version .pre [0 ]} { version .pre [1 ]} "
126+ prerelease = version .prerelease or ""
242127
243128 t = Template (tag_format )
244129 return t .safe_substitute (
@@ -249,7 +134,7 @@ def normalize_tag(
249134def create_commit_message (
250135 current_version : Union [Version , str ],
251136 new_version : Union [Version , str ],
252- message_template : str = None ,
137+ message_template : Optional [ str ] = None ,
253138) -> str :
254139 if message_template is None :
255140 message_template = bump_message
0 commit comments