Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/numpy/lib/_version.py: 13%
75 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1"""Utility to compare (NumPy) version strings.
3The NumpyVersion class allows properly comparing numpy version strings.
4The LooseVersion and StrictVersion classes that distutils provides don't
5work; they don't recognize anything like alpha/beta/rc/dev versions.
7"""
8import re
11__all__ = ['NumpyVersion']
14class NumpyVersion():
15 """Parse and compare numpy version strings.
17 NumPy has the following versioning scheme (numbers given are examples; they
18 can be > 9 in principle):
20 - Released version: '1.8.0', '1.8.1', etc.
21 - Alpha: '1.8.0a1', '1.8.0a2', etc.
22 - Beta: '1.8.0b1', '1.8.0b2', etc.
23 - Release candidates: '1.8.0rc1', '1.8.0rc2', etc.
24 - Development versions: '1.8.0.dev-f1234afa' (git commit hash appended)
25 - Development versions after a1: '1.8.0a1.dev-f1234afa',
26 '1.8.0b2.dev-f1234afa',
27 '1.8.1rc1.dev-f1234afa', etc.
28 - Development versions (no git hash available): '1.8.0.dev-Unknown'
30 Comparing needs to be done against a valid version string or other
31 `NumpyVersion` instance. Note that all development versions of the same
32 (pre-)release compare equal.
34 .. versionadded:: 1.9.0
36 Parameters
37 ----------
38 vstring : str
39 NumPy version string (``np.__version__``).
41 Examples
42 --------
43 >>> from numpy.lib import NumpyVersion
44 >>> if NumpyVersion(np.__version__) < '1.7.0':
45 ... print('skip')
46 >>> # skip
48 >>> NumpyVersion('1.7') # raises ValueError, add ".0"
49 Traceback (most recent call last):
50 ...
51 ValueError: Not a valid numpy version string
53 """
55 def __init__(self, vstring):
56 self.vstring = vstring
57 ver_main = re.match(r'\d+\.\d+\.\d+', vstring)
58 if not ver_main:
59 raise ValueError("Not a valid numpy version string")
61 self.version = ver_main.group()
62 self.major, self.minor, self.bugfix = [int(x) for x in
63 self.version.split('.')]
64 if len(vstring) == ver_main.end():
65 self.pre_release = 'final'
66 else:
67 alpha = re.match(r'a\d', vstring[ver_main.end():])
68 beta = re.match(r'b\d', vstring[ver_main.end():])
69 rc = re.match(r'rc\d', vstring[ver_main.end():])
70 pre_rel = [m for m in [alpha, beta, rc] if m is not None]
71 if pre_rel:
72 self.pre_release = pre_rel[0].group()
73 else:
74 self.pre_release = ''
76 self.is_devversion = bool(re.search(r'.dev', vstring))
78 def _compare_version(self, other):
79 """Compare major.minor.bugfix"""
80 if self.major == other.major:
81 if self.minor == other.minor:
82 if self.bugfix == other.bugfix:
83 vercmp = 0
84 elif self.bugfix > other.bugfix:
85 vercmp = 1
86 else:
87 vercmp = -1
88 elif self.minor > other.minor:
89 vercmp = 1
90 else:
91 vercmp = -1
92 elif self.major > other.major:
93 vercmp = 1
94 else:
95 vercmp = -1
97 return vercmp
99 def _compare_pre_release(self, other):
100 """Compare alpha/beta/rc/final."""
101 if self.pre_release == other.pre_release:
102 vercmp = 0
103 elif self.pre_release == 'final':
104 vercmp = 1
105 elif other.pre_release == 'final':
106 vercmp = -1
107 elif self.pre_release > other.pre_release:
108 vercmp = 1
109 else:
110 vercmp = -1
112 return vercmp
114 def _compare(self, other):
115 if not isinstance(other, (str, NumpyVersion)):
116 raise ValueError("Invalid object to compare with NumpyVersion.")
118 if isinstance(other, str):
119 other = NumpyVersion(other)
121 vercmp = self._compare_version(other)
122 if vercmp == 0:
123 # Same x.y.z version, check for alpha/beta/rc
124 vercmp = self._compare_pre_release(other)
125 if vercmp == 0:
126 # Same version and same pre-release, check if dev version
127 if self.is_devversion is other.is_devversion:
128 vercmp = 0
129 elif self.is_devversion:
130 vercmp = -1
131 else:
132 vercmp = 1
134 return vercmp
136 def __lt__(self, other):
137 return self._compare(other) < 0
139 def __le__(self, other):
140 return self._compare(other) <= 0
142 def __eq__(self, other):
143 return self._compare(other) == 0
145 def __ne__(self, other):
146 return self._compare(other) != 0
148 def __gt__(self, other):
149 return self._compare(other) > 0
151 def __ge__(self, other):
152 return self._compare(other) >= 0
154 def __repr__(self):
155 return "NumpyVersion(%s)" % self.vstring