Repository navigation
Expand file tree
/
Copy pathversion_compare.py
More file actions
85 lines (63 loc) · 1.83 KB
/
Copy pathversion_compare.py
File metadata and controls
85 lines (63 loc) · 1.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
"""Tolerant version comparator for real-world pipelines."""
import re
from functools import total_ordering
@total_ordering
class Version:
"""
Tolerant version comparator for real-world pipelines.
Handles:
v1.2
3.19
3.19.0-260127
3.19.0-rc1
3.19.0-rc1-260127
3.19_final
build_42
anything with numbers in it
"""
_PRERELEASE_RE = re.compile(r"(rc|alpha|beta|a|b)", re.I)
def __init__(self, raw: str):
self.raw = raw
self.parts = tuple(int(n) for n in re.findall(r"\d+", raw))
self.is_prerelease = bool(self._PRERELEASE_RE.search(raw))
def __eq__(self, other):
if not isinstance(other, Version):
return NotImplemented
return self.parts == other.parts and self.is_prerelease == other.is_prerelease
def __lt__(self, other):
if not isinstance(other, Version):
return NotImplemented
# compare numeric parts first
if self.parts != other.parts:
return self.parts < other.parts
# stable > prerelease
return self.is_prerelease and not other.is_prerelease
def __repr__(self):
return f"Version({self.raw!r})"
# -------------------------------
# Micro helpers
# -------------------------------
def version_gt(v1, v2):
"""Greater than"""
return Version(v1) > Version(v2)
def version_lt(v1, v2):
"""Less than"""
return Version(v1) < Version(v2)
def version_eq(v1, v2):
"""Equal"""
return Version(v1) == Version(v2)
def compare_versions(v1, v2):
"""Compare two version strings.
Returns:
-1 if v1 < v2
0 if v1 == v2
1 if v1 > v2
"""
ver1 = Version(v1)
ver2 = Version(v2)
if ver1 < ver2:
return -1
elif ver1 > ver2:
return 1
else:
return 0