12
12
13
13
EXAMPLE_STRINGS = [
14
14
{"v1.2.3" : "1.2.3" },
15
- {"v1.2.3-4-g5c6d7e8" : "1.2.3.dev4.g5c6d7e8" },
16
- {"v1.2.3-4-g5c6d7e8-dirty" : "1.2.3.dev4.g5c6d7e8.dirty" },
17
- {"v1.2.2-rc1-113-g5b54992f2-dirty" : "1.2.2.rc1.dev113.g5b54992f2.dirty" },
15
+ {"v1.2.3-4-g5c6d7e8" : "1.2.3.dev4+g5c6d7e8" },
16
+ {"v1.2.3-4-g5c6d7e8-dirty" : "1.2.3.dev4+g5c6d7e8.dirty" },
17
+ {"v1.2.2-rc1-113-g5b54992f2-dirty" : "1.2.2.rc1.dev113+g5b54992f2.dirty" },
18
+ {"v1.5.0-dev2" : "1.5.0.dev2" },
19
+ {"v1.5.0-alpha1" : "1.5.0.alpha1" },
20
+ {"v1.5.0-beta2" : "1.5.0.beta2" },
21
+ {"v1.5.0-alpha1-dev3" : "1.5.0.alpha1.dev3" },
22
+ {"v1.5.0-beta2-5-g1234567" : "1.5.0.beta2.dev5+g1234567" },
18
23
]
19
24
20
25
21
26
def convert_to_pep440 (version_string ):
22
- # Remove the leading 'v'
23
- version_string = version_string [1 :]
27
+ # Remove the leading 'v' if present
28
+ if version_string .startswith ("v" ):
29
+ version_string = version_string [1 :]
24
30
25
31
# Regular expressions to match different parts of the version string
26
32
main_version_pattern = r"^(\d+\.\d+\.\d+)"
27
- pre_release_pattern = r"(?:-rc(\d+))?"
28
- dev_release_pattern = r"(?:-(\d+)+)?"
33
+ pre_release_pattern = r"(?:-(alpha|beta|rc)(\d+))?"
34
+ dev_release_pattern = r"(?:-dev(\d+))?"
35
+ commit_count_pattern = r"(?:-(\d+))?"
29
36
commit_hash_pattern = r"(?:-g([^\-\.]+))?"
30
- dirty_pattern = r"([-.] dirty)?$"
37
+ dirty_pattern = r"(- dirty)?$"
31
38
32
39
# Combine the patterns
33
40
full_pattern = (
34
41
main_version_pattern
35
42
+ pre_release_pattern
36
43
+ dev_release_pattern
44
+ + commit_count_pattern
37
45
+ commit_hash_pattern
38
46
+ dirty_pattern
39
47
)
@@ -44,39 +52,49 @@ def convert_to_pep440(version_string):
44
52
if not match :
45
53
raise ValueError (f"Invalid version string: { version_string } " )
46
54
47
- components = {}
48
-
49
55
# Extract the components
50
56
main_version = match .group (1 )
51
- if len (match .groups ()) > 1 :
52
- components ["pre_release" ] = match .group (2 )
53
- if len (match .groups ()) > 2 :
54
- components ["dev_release" ] = match .group (3 )
55
- if len (match .groups ()) > 3 :
56
- components ["commit_hash" ] = match .group (4 )
57
- if len (match .groups ()) > 4 :
58
- components ["dirty" ] = match .group (5 )
59
-
57
+ pre_release_type = match .group (2 )
58
+ pre_release_num = match .group (3 )
59
+ dev_release = match .group (4 )
60
+ commit_count = match .group (5 )
61
+ commit_hash = match .group (6 )
62
+ dirty = match .group (7 )
63
+
64
+ # Construct the PEP440 compatible version
60
65
pep440_version = main_version
61
- if "dev_release" in components and components ["dev_release" ] is not None :
62
- pep440_version += f".dev{ components ['dev_release' ]} "
66
+
67
+ if pre_release_type and pre_release_num :
68
+ pep440_version += f".{ pre_release_type } { pre_release_num } "
69
+
70
+ if dev_release :
71
+ pep440_version += f".dev{ dev_release } "
72
+ elif commit_count :
73
+ pep440_version += f".dev{ commit_count } "
74
+
75
+ if commit_hash :
76
+ pep440_version += f"+g{ commit_hash } "
77
+
78
+ if dirty :
79
+ pep440_version += ".dirty"
63
80
64
81
return pep440_version
65
82
66
83
67
84
def test_convert_git_version_to_pep440_compatible ():
68
85
print ("Testing convert_git_version_to_pep440_compatible" )
69
86
70
- # Test the example strings
71
87
for example in EXAMPLE_STRINGS :
72
- git_version , pep440_version = example .popitem ()
73
- print (f"Testing { git_version } -> { pep440_version } " )
88
+ git_version , expected_pep440_version = list ( example .items ())[ 0 ]
89
+ print (f"Testing { git_version } -> { expected_pep440_version } " )
74
90
75
91
converted = convert_to_pep440 (git_version )
76
92
77
- assert pep440_version == converted or print (
78
- f"Failed: \n Expected: { pep440_version } \n Got: { converted } "
79
- )
93
+ assert (
94
+ expected_pep440_version == converted
95
+ ), f"Failed: \n Expected: { expected_pep440_version } \n Got: { converted } "
96
+
97
+ print ("All tests passed successfully!" )
80
98
81
99
82
100
if __name__ == "__main__" :
0 commit comments