1- import itertools
2- import random
1+ from __future__ import annotations
32
43import pytest
54
6- from commitizen .version_schemes import SemVer , VersionProtocol
7-
8- simple_flow = [
9- (("0.1.0" , "PATCH" , None , 0 , None ), "0.1.1" ),
10- (("0.1.0" , "PATCH" , None , 0 , 1 ), "0.1.1-dev1" ),
11- (("0.1.1" , "MINOR" , None , 0 , None ), "0.2.0" ),
12- (("0.2.0" , "MINOR" , None , 0 , None ), "0.3.0" ),
13- (("0.2.0" , "MINOR" , None , 0 , 1 ), "0.3.0-dev1" ),
14- (("0.3.0" , "PATCH" , None , 0 , None ), "0.3.1" ),
15- (("0.3.0" , "PATCH" , "alpha" , 0 , None ), "0.3.1-a0" ),
16- (("0.3.1a0" , None , "alpha" , 0 , None ), "0.3.1-a1" ),
17- (("0.3.0" , "PATCH" , "alpha" , 1 , None ), "0.3.1-a1" ),
18- (("0.3.1a0" , None , "alpha" , 1 , None ), "0.3.1-a1" ),
19- (("0.3.1a0" , None , None , 0 , None ), "0.3.1" ),
20- (("0.3.1" , "PATCH" , None , 0 , None ), "0.3.2" ),
21- (("0.4.2" , "MAJOR" , "alpha" , 0 , None ), "1.0.0-a0" ),
22- (("1.0.0a0" , None , "alpha" , 0 , None ), "1.0.0-a1" ),
23- (("1.0.0a1" , None , "alpha" , 0 , None ), "1.0.0-a2" ),
24- (("1.0.0a1" , None , "alpha" , 0 , 1 ), "1.0.0-a2-dev1" ),
25- (("1.0.0a2.dev0" , None , "alpha" , 0 , 1 ), "1.0.0-a3-dev1" ),
26- (("1.0.0a2.dev0" , None , "alpha" , 0 , 0 ), "1.0.0-a3-dev0" ),
27- (("1.0.0a1" , None , "beta" , 0 , None ), "1.0.0-b0" ),
28- (("1.0.0b0" , None , "beta" , 0 , None ), "1.0.0-b1" ),
29- (("1.0.0b1" , None , "rc" , 0 , None ), "1.0.0-rc0" ),
30- (("1.0.0rc0" , None , "rc" , 0 , None ), "1.0.0-rc1" ),
31- (("1.0.0rc0" , None , "rc" , 0 , 1 ), "1.0.0-rc1-dev1" ),
32- (("1.0.0rc0" , "PATCH" , None , 0 , None ), "1.0.0" ),
33- (("1.0.0a3.dev0" , None , "beta" , 0 , None ), "1.0.0-b0" ),
34- (("1.0.0" , "PATCH" , None , 0 , None ), "1.0.1" ),
35- (("1.0.1" , "PATCH" , None , 0 , None ), "1.0.2" ),
36- (("1.0.2" , "MINOR" , None , 0 , None ), "1.1.0" ),
37- (("1.1.0" , "MINOR" , None , 0 , None ), "1.2.0" ),
38- (("1.2.0" , "PATCH" , None , 0 , None ), "1.2.1" ),
39- (("1.2.1" , "MAJOR" , None , 0 , None ), "2.0.0" ),
40- ]
41-
42- local_versions = [
43- (("4.5.0+0.1.0" , "PATCH" , None , 0 , None ), "4.5.0+0.1.1" ),
44- (("4.5.0+0.1.1" , "MINOR" , None , 0 , None ), "4.5.0+0.2.0" ),
45- (("4.5.0+0.2.0" , "MAJOR" , None , 0 , None ), "4.5.0+1.0.0" ),
46- ]
47-
48- # never bump backwards on pre-releases
49- linear_prerelease_cases = [
50- (("0.1.1b1" , None , "alpha" , 0 , None ), "0.1.1-b2" ),
51- (("0.1.1rc0" , None , "alpha" , 0 , None ), "0.1.1-rc1" ),
52- (("0.1.1rc0" , None , "beta" , 0 , None ), "0.1.1-rc1" ),
53- ]
54-
55- weird_cases = [
56- (("1.1" , "PATCH" , None , 0 , None ), "1.1.1" ),
57- (("1" , "MINOR" , None , 0 , None ), "1.1.0" ),
58- (("1" , "MAJOR" , None , 0 , None ), "2.0.0" ),
59- (("1a0" , None , "alpha" , 0 , None ), "1.0.0-a1" ),
60- (("1a0" , None , "alpha" , 1 , None ), "1.0.0-a1" ),
61- (("1" , None , "beta" , 0 , None ), "1.0.0-b0" ),
62- (("1" , None , "beta" , 1 , None ), "1.0.0-b1" ),
63- (("1beta" , None , "beta" , 0 , None ), "1.0.0-b1" ),
64- (("1.0.0alpha1" , None , "alpha" , 0 , None ), "1.0.0-a2" ),
65- (("1" , None , "rc" , 0 , None ), "1.0.0-rc0" ),
66- (("1.0.0rc1+e20d7b57f3eb" , "PATCH" , None , 0 , None ), "1.0.0" ),
67- ]
68-
69- # test driven development
70- tdd_cases = [
71- (("0.1.1" , "PATCH" , None , 0 , None ), "0.1.2" ),
72- (("0.1.1" , "MINOR" , None , 0 , None ), "0.2.0" ),
73- (("2.1.1" , "MAJOR" , None , 0 , None ), "3.0.0" ),
74- (("0.9.0" , "PATCH" , "alpha" , 0 , None ), "0.9.1-a0" ),
75- (("0.9.0" , "MINOR" , "alpha" , 0 , None ), "0.10.0-a0" ),
76- (("0.9.0" , "MAJOR" , "alpha" , 0 , None ), "1.0.0-a0" ),
77- (("0.9.0" , "MAJOR" , "alpha" , 1 , None ), "1.0.0-a1" ),
78- (("1.0.0a2" , None , "beta" , 0 , None ), "1.0.0-b0" ),
79- (("1.0.0a2" , None , "beta" , 1 , None ), "1.0.0-b1" ),
80- (("1.0.0beta1" , None , "rc" , 0 , None ), "1.0.0-rc0" ),
81- (("1.0.0rc1" , None , "rc" , 0 , None ), "1.0.0-rc2" ),
82- (("1.0.0-a0" , None , "rc" , 0 , None ), "1.0.0-rc0" ),
83- (("1.0.0-alpha1" , None , "alpha" , 0 , None ), "1.0.0-a2" ),
84- ]
85-
86- exact_cases = [
87- (("1.0.0" , "PATCH" , None , 0 , None ), "1.0.1" ),
88- (("1.0.0" , "MINOR" , None , 0 , None ), "1.1.0" ),
89- # with exact_increment=False: "1.0.0-b0"
90- (("1.0.0a1" , "PATCH" , "beta" , 0 , None ), "1.0.1-b0" ),
91- # with exact_increment=False: "1.0.0-b1"
92- (("1.0.0b0" , "PATCH" , "beta" , 0 , None ), "1.0.1-b0" ),
93- # with exact_increment=False: "1.0.0-rc0"
94- (("1.0.0b1" , "PATCH" , "rc" , 0 , None ), "1.0.1-rc0" ),
95- # with exact_increment=False: "1.0.0-rc1"
96- (("1.0.0rc0" , "PATCH" , "rc" , 0 , None ), "1.0.1-rc0" ),
97- # with exact_increment=False: "1.0.0-rc1-dev1"
98- (("1.0.0rc0" , "PATCH" , "rc" , 0 , 1 ), "1.0.1-rc0-dev1" ),
99- # with exact_increment=False: "1.0.0-b0"
100- (("1.0.0a1" , "MINOR" , "beta" , 0 , None ), "1.1.0-b0" ),
101- # with exact_increment=False: "1.0.0-b1"
102- (("1.0.0b0" , "MINOR" , "beta" , 0 , None ), "1.1.0-b0" ),
103- # with exact_increment=False: "1.0.0-rc0"
104- (("1.0.0b1" , "MINOR" , "rc" , 0 , None ), "1.1.0-rc0" ),
105- # with exact_increment=False: "1.0.0-rc1"
106- (("1.0.0rc0" , "MINOR" , "rc" , 0 , None ), "1.1.0-rc0" ),
107- # with exact_increment=False: "1.0.0-rc1-dev1"
108- (("1.0.0rc0" , "MINOR" , "rc" , 0 , 1 ), "1.1.0-rc0-dev1" ),
109- # with exact_increment=False: "2.0.0"
110- (("2.0.0b0" , "MAJOR" , None , 0 , None ), "3.0.0" ),
111- # with exact_increment=False: "2.0.0"
112- (("2.0.0b0" , "MINOR" , None , 0 , None ), "2.1.0" ),
113- # with exact_increment=False: "2.0.0"
114- (("2.0.0b0" , "PATCH" , None , 0 , None ), "2.0.1" ),
115- # same with exact_increment=False
116- (("2.0.0b0" , "MAJOR" , "alpha" , 0 , None ), "3.0.0-a0" ),
117- # with exact_increment=False: "2.0.0b1"
118- (("2.0.0b0" , "MINOR" , "alpha" , 0 , None ), "2.1.0-a0" ),
119- # with exact_increment=False: "2.0.0b1"
120- (("2.0.0b0" , "PATCH" , "alpha" , 0 , None ), "2.0.1-a0" ),
121- ]
5+ from commitizen .version_schemes import Increment , Prerelease , SemVer , VersionProtocol
1226
1237
1248@pytest .mark .parametrize (
1259 "test_input, expected" ,
126- itertools .chain (tdd_cases , weird_cases , simple_flow , linear_prerelease_cases ),
10+ [
11+ # test driven development
12+ (("0.1.1" , "PATCH" , None , 0 , None ), "0.1.2" ),
13+ (("0.1.1" , "MINOR" , None , 0 , None ), "0.2.0" ),
14+ (("2.1.1" , "MAJOR" , None , 0 , None ), "3.0.0" ),
15+ (("0.9.0" , "PATCH" , "alpha" , 0 , None ), "0.9.1-a0" ),
16+ (("0.9.0" , "MINOR" , "alpha" , 0 , None ), "0.10.0-a0" ),
17+ (("0.9.0" , "MAJOR" , "alpha" , 0 , None ), "1.0.0-a0" ),
18+ (("0.9.0" , "MAJOR" , "alpha" , 1 , None ), "1.0.0-a1" ),
19+ (("1.0.0a2" , None , "beta" , 0 , None ), "1.0.0-b0" ),
20+ (("1.0.0a2" , None , "beta" , 1 , None ), "1.0.0-b1" ),
21+ (("1.0.0beta1" , None , "rc" , 0 , None ), "1.0.0-rc0" ),
22+ (("1.0.0rc1" , None , "rc" , 0 , None ), "1.0.0-rc2" ),
23+ (("1.0.0-a0" , None , "rc" , 0 , None ), "1.0.0-rc0" ),
24+ (("1.0.0-alpha1" , None , "alpha" , 0 , None ), "1.0.0-a2" ),
25+ # weird cases
26+ (("1.1" , "PATCH" , None , 0 , None ), "1.1.1" ),
27+ (("1" , "MINOR" , None , 0 , None ), "1.1.0" ),
28+ (("1" , "MAJOR" , None , 0 , None ), "2.0.0" ),
29+ (("1a0" , None , "alpha" , 0 , None ), "1.0.0-a1" ),
30+ (("1a0" , None , "alpha" , 1 , None ), "1.0.0-a1" ),
31+ (("1" , None , "beta" , 0 , None ), "1.0.0-b0" ),
32+ (("1" , None , "beta" , 1 , None ), "1.0.0-b1" ),
33+ (("1beta" , None , "beta" , 0 , None ), "1.0.0-b1" ),
34+ (("1.0.0alpha1" , None , "alpha" , 0 , None ), "1.0.0-a2" ),
35+ (("1" , None , "rc" , 0 , None ), "1.0.0-rc0" ),
36+ (("1.0.0rc1+e20d7b57f3eb" , "PATCH" , None , 0 , None ), "1.0.0" ),
37+ # simple flow
38+ (("0.1.0" , "PATCH" , None , 0 , None ), "0.1.1" ),
39+ (("0.1.0" , "PATCH" , None , 0 , 1 ), "0.1.1-dev1" ),
40+ (("0.1.1" , "MINOR" , None , 0 , None ), "0.2.0" ),
41+ (("0.2.0" , "MINOR" , None , 0 , None ), "0.3.0" ),
42+ (("0.2.0" , "MINOR" , None , 0 , 1 ), "0.3.0-dev1" ),
43+ (("0.3.0" , "PATCH" , None , 0 , None ), "0.3.1" ),
44+ (("0.3.0" , "PATCH" , "alpha" , 0 , None ), "0.3.1-a0" ),
45+ (("0.3.1a0" , None , "alpha" , 0 , None ), "0.3.1-a1" ),
46+ (("0.3.0" , "PATCH" , "alpha" , 1 , None ), "0.3.1-a1" ),
47+ (("0.3.1a0" , None , "alpha" , 1 , None ), "0.3.1-a1" ),
48+ (("0.3.1a0" , None , None , 0 , None ), "0.3.1" ),
49+ (("0.3.1" , "PATCH" , None , 0 , None ), "0.3.2" ),
50+ (("0.4.2" , "MAJOR" , "alpha" , 0 , None ), "1.0.0-a0" ),
51+ (("1.0.0a0" , None , "alpha" , 0 , None ), "1.0.0-a1" ),
52+ (("1.0.0a1" , None , "alpha" , 0 , None ), "1.0.0-a2" ),
53+ (("1.0.0a1" , None , "alpha" , 0 , 1 ), "1.0.0-a2-dev1" ),
54+ (("1.0.0a2.dev0" , None , "alpha" , 0 , 1 ), "1.0.0-a3-dev1" ),
55+ (("1.0.0a2.dev0" , None , "alpha" , 0 , 0 ), "1.0.0-a3-dev0" ),
56+ (("1.0.0a1" , None , "beta" , 0 , None ), "1.0.0-b0" ),
57+ (("1.0.0b0" , None , "beta" , 0 , None ), "1.0.0-b1" ),
58+ (("1.0.0b1" , None , "rc" , 0 , None ), "1.0.0-rc0" ),
59+ (("1.0.0rc0" , None , "rc" , 0 , None ), "1.0.0-rc1" ),
60+ (("1.0.0rc0" , None , "rc" , 0 , 1 ), "1.0.0-rc1-dev1" ),
61+ (("1.0.0rc0" , "PATCH" , None , 0 , None ), "1.0.0" ),
62+ (("1.0.0a3.dev0" , None , "beta" , 0 , None ), "1.0.0-b0" ),
63+ (("1.0.0" , "PATCH" , None , 0 , None ), "1.0.1" ),
64+ (("1.0.1" , "PATCH" , None , 0 , None ), "1.0.2" ),
65+ (("1.0.2" , "MINOR" , None , 0 , None ), "1.1.0" ),
66+ (("1.1.0" , "MINOR" , None , 0 , None ), "1.2.0" ),
67+ (("1.2.0" , "PATCH" , None , 0 , None ), "1.2.1" ),
68+ (("1.2.1" , "MAJOR" , None , 0 , None ), "2.0.0" ),
69+ # linear prerelease cases (never bump backwards on pre-releases)
70+ (("0.1.1b1" , None , "alpha" , 0 , None ), "0.1.1-b2" ),
71+ (("0.1.1rc0" , None , "alpha" , 0 , None ), "0.1.1-rc1" ),
72+ (("0.1.1rc0" , None , "beta" , 0 , None ), "0.1.1-rc1" ),
73+ ],
12774)
128- def test_bump_semver_version (test_input , expected ):
129- current_version = test_input [0 ]
130- increment = test_input [1 ]
131- prerelease = test_input [2 ]
132- prerelease_offset = test_input [3 ]
133- devrelease = test_input [4 ]
75+ def test_bump_semver_version (
76+ test_input : tuple [str , Increment , Prerelease | None , int , int | None ], expected : str
77+ ):
78+ current_version , increment , prerelease , prerelease_offset , devrelease = test_input
13479 assert (
13580 str (
13681 SemVer (current_version ).bump (
@@ -144,13 +89,49 @@ def test_bump_semver_version(test_input, expected):
14489 )
14590
14691
147- @pytest .mark .parametrize ("test_input, expected" , exact_cases )
148- def test_bump_semver_version_force (test_input , expected ):
149- current_version = test_input [0 ]
150- increment = test_input [1 ]
151- prerelease = test_input [2 ]
152- prerelease_offset = test_input [3 ]
153- devrelease = test_input [4 ]
92+ @pytest .mark .parametrize (
93+ "test_input, expected" ,
94+ [
95+ (("1.0.0" , "PATCH" , None , 0 , None ), "1.0.1" ),
96+ (("1.0.0" , "MINOR" , None , 0 , None ), "1.1.0" ),
97+ # with exact_increment=False: "1.0.0-b0"
98+ (("1.0.0a1" , "PATCH" , "beta" , 0 , None ), "1.0.1-b0" ),
99+ # with exact_increment=False: "1.0.0-b1"
100+ (("1.0.0b0" , "PATCH" , "beta" , 0 , None ), "1.0.1-b0" ),
101+ # with exact_increment=False: "1.0.0-rc0"
102+ (("1.0.0b1" , "PATCH" , "rc" , 0 , None ), "1.0.1-rc0" ),
103+ # with exact_increment=False: "1.0.0-rc1"
104+ (("1.0.0rc0" , "PATCH" , "rc" , 0 , None ), "1.0.1-rc0" ),
105+ # with exact_increment=False: "1.0.0-rc1-dev1"
106+ (("1.0.0rc0" , "PATCH" , "rc" , 0 , 1 ), "1.0.1-rc0-dev1" ),
107+ # with exact_increment=False: "1.0.0-b0"
108+ (("1.0.0a1" , "MINOR" , "beta" , 0 , None ), "1.1.0-b0" ),
109+ # with exact_increment=False: "1.0.0-b1"
110+ (("1.0.0b0" , "MINOR" , "beta" , 0 , None ), "1.1.0-b0" ),
111+ # with exact_increment=False: "1.0.0-rc0"
112+ (("1.0.0b1" , "MINOR" , "rc" , 0 , None ), "1.1.0-rc0" ),
113+ # with exact_increment=False: "1.0.0-rc1"
114+ (("1.0.0rc0" , "MINOR" , "rc" , 0 , None ), "1.1.0-rc0" ),
115+ # with exact_increment=False: "1.0.0-rc1-dev1"
116+ (("1.0.0rc0" , "MINOR" , "rc" , 0 , 1 ), "1.1.0-rc0-dev1" ),
117+ # with exact_increment=False: "2.0.0"
118+ (("2.0.0b0" , "MAJOR" , None , 0 , None ), "3.0.0" ),
119+ # with exact_increment=False: "2.0.0"
120+ (("2.0.0b0" , "MINOR" , None , 0 , None ), "2.1.0" ),
121+ # with exact_increment=False: "2.0.0"
122+ (("2.0.0b0" , "PATCH" , None , 0 , None ), "2.0.1" ),
123+ # same with exact_increment=False
124+ (("2.0.0b0" , "MAJOR" , "alpha" , 0 , None ), "3.0.0-a0" ),
125+ # with exact_increment=False: "2.0.0b1"
126+ (("2.0.0b0" , "MINOR" , "alpha" , 0 , None ), "2.1.0-a0" ),
127+ # with exact_increment=False: "2.0.0b1"
128+ (("2.0.0b0" , "PATCH" , "alpha" , 0 , None ), "2.0.1-a0" ),
129+ ],
130+ )
131+ def test_bump_semver_version_force (
132+ test_input : tuple [str , Increment , Prerelease | None , int , int | None ], expected : str
133+ ):
134+ current_version , increment , prerelease , prerelease_offset , devrelease = test_input
154135 assert (
155136 str (
156137 SemVer (current_version ).bump (
@@ -165,13 +146,18 @@ def test_bump_semver_version_force(test_input, expected):
165146 )
166147
167148
168- @pytest .mark .parametrize ("test_input,expected" , local_versions )
169- def test_bump_semver_version_local (test_input , expected ):
170- current_version = test_input [0 ]
171- increment = test_input [1 ]
172- prerelease = test_input [2 ]
173- prerelease_offset = test_input [3 ]
174- devrelease = test_input [4 ]
149+ @pytest .mark .parametrize (
150+ "test_input, expected" ,
151+ [
152+ (("4.5.0+0.1.0" , "PATCH" , None , 0 , None ), "4.5.0+0.1.1" ),
153+ (("4.5.0+0.1.1" , "MINOR" , None , 0 , None ), "4.5.0+0.2.0" ),
154+ (("4.5.0+0.2.0" , "MAJOR" , None , 0 , None ), "4.5.0+1.0.0" ),
155+ ],
156+ )
157+ def test_bump_semver_version_local (
158+ test_input : tuple [str , Increment , Prerelease | None , int , int | None ], expected : str
159+ ):
160+ current_version , increment , prerelease , prerelease_offset , devrelease = test_input
175161 is_local_version = True
176162 assert (
177163 str (
@@ -194,76 +180,3 @@ def test_semver_scheme_property():
194180
195181def test_semver_implement_version_protocol ():
196182 assert isinstance (SemVer ("0.0.1" ), VersionProtocol )
197-
198-
199- def test_semver_sortable ():
200- test_input = [x [0 ][0 ] for x in simple_flow ]
201- test_input .extend ([x [1 ] for x in simple_flow ])
202- # randomize
203- random_input = [SemVer (x ) for x in random .sample (test_input , len (test_input ))]
204- assert len (random_input ) == len (test_input )
205- sorted_result = [str (x ) for x in sorted (random_input )]
206- assert sorted_result == [
207- "0.1.0" ,
208- "0.1.0" ,
209- "0.1.1-dev1" ,
210- "0.1.1" ,
211- "0.1.1" ,
212- "0.2.0" ,
213- "0.2.0" ,
214- "0.2.0" ,
215- "0.3.0-dev1" ,
216- "0.3.0" ,
217- "0.3.0" ,
218- "0.3.0" ,
219- "0.3.0" ,
220- "0.3.1-a0" ,
221- "0.3.1-a0" ,
222- "0.3.1-a0" ,
223- "0.3.1-a0" ,
224- "0.3.1-a1" ,
225- "0.3.1-a1" ,
226- "0.3.1-a1" ,
227- "0.3.1" ,
228- "0.3.1" ,
229- "0.3.1" ,
230- "0.3.2" ,
231- "0.4.2" ,
232- "1.0.0-a0" ,
233- "1.0.0-a0" ,
234- "1.0.0-a1" ,
235- "1.0.0-a1" ,
236- "1.0.0-a1" ,
237- "1.0.0-a1" ,
238- "1.0.0-a2-dev0" ,
239- "1.0.0-a2-dev0" ,
240- "1.0.0-a2-dev1" ,
241- "1.0.0-a2" ,
242- "1.0.0-a3-dev0" ,
243- "1.0.0-a3-dev0" ,
244- "1.0.0-a3-dev1" ,
245- "1.0.0-b0" ,
246- "1.0.0-b0" ,
247- "1.0.0-b0" ,
248- "1.0.0-b1" ,
249- "1.0.0-b1" ,
250- "1.0.0-rc0" ,
251- "1.0.0-rc0" ,
252- "1.0.0-rc0" ,
253- "1.0.0-rc0" ,
254- "1.0.0-rc1-dev1" ,
255- "1.0.0-rc1" ,
256- "1.0.0" ,
257- "1.0.0" ,
258- "1.0.1" ,
259- "1.0.1" ,
260- "1.0.2" ,
261- "1.0.2" ,
262- "1.1.0" ,
263- "1.1.0" ,
264- "1.2.0" ,
265- "1.2.0" ,
266- "1.2.1" ,
267- "1.2.1" ,
268- "2.0.0" ,
269- ]
0 commit comments