Skip to content

Commit ef06220

Browse files
authored
Merge pull request #4 from chrisburr/extract-version-funcs
Expose version parsing function
2 parents da78cf2 + ff74571 commit ef06220

File tree

4 files changed

+112
-12
lines changed

4 files changed

+112
-12
lines changed

src/diraccfg/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from __future__ import absolute_import
22

33
__all__ = [
4-
'CFG',
4+
"CFG",
5+
"parseVersion",
56
]
67

78
from .cfg import CFG
9+
from .versions import parseVersion

src/diraccfg/__main__.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import json
66
import os
77
import sys
8-
import re
98

109
from .cfg import CFG
10+
from .versions import parseVersion
1111

1212

1313
def parseArgs():
@@ -48,17 +48,17 @@ def sortVersions(allow_pre_releases=False):
4848

4949
parsedVersions = {}
5050
for obj in objs:
51-
match = re.match(r"^v(?P<major>\d+)r(?P<minor>\d+)(?:p(?P<patch>\d+))?(?:-pre(?P<pre>\d+))?$", obj)
52-
if match:
53-
v = match.groupdict()
54-
if not allow_pre_releases and v['pre']:
51+
try:
52+
major, minor, patch, pre = parseVersion(obj)
53+
except ValueError:
54+
if obj not in ('integration', 'devel', 'master'):
55+
sys.stderr.write('WARN: Unexpected version string %r\n' % obj)
56+
else:
57+
if pre is None:
58+
pre = sys.maxsize
59+
elif not allow_pre_releases:
5560
continue
56-
if v['pre'] is None:
57-
v['pre'] = sys.maxsize
58-
v = {k: 0 if v is None else int(v) for k, v in v.items()}
59-
parsedVersions[obj] = (v['major'], v['minor'], v['patch'], v['pre'])
60-
elif obj not in ('integration', 'devel', 'master'):
61-
sys.stderr.write('WARN: Unexpected version string %r\n' % obj)
61+
parsedVersions[obj] = (major, minor, patch, pre)
6262

6363
print(json.dumps(sorted(parsedVersions, key=parsedVersions.get, reverse=True)))
6464

src/diraccfg/versions.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from __future__ import absolute_import
2+
from __future__ import division
3+
from __future__ import print_function
4+
5+
import re
6+
7+
8+
def parseVersion(versionString):
9+
"""Parse a DIRAC-style version sting
10+
11+
:param versionString: Version identifier to parse
12+
:returns: `tuple` of 4 values (major, minor, patch, pre). All values will be
13+
`int` except "pre" which is `None` for released versions.
14+
:raises: ValueError if the versionString is invalid
15+
"""
16+
match = re.match(
17+
r"^v(?P<major>\d+)r(?P<minor>\d+)(?:p(?P<patch>\d+))?(?:-pre(?P<pre>\d+))?$",
18+
versionString,
19+
)
20+
if not match:
21+
raise ValueError("%s is not a valid version" % versionString)
22+
23+
segments = match.groupdict()
24+
for k, v in segments.items():
25+
if k != "pre" and v is None:
26+
segments[k] = 0
27+
if v is not None:
28+
segments[k] = int(v)
29+
30+
return (segments["major"], segments["minor"], segments["patch"], segments["pre"])

tests/test_versions.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from __future__ import absolute_import
2+
from __future__ import division
3+
from __future__ import print_function
4+
5+
import pytest
6+
7+
import diraccfg
8+
9+
10+
@pytest.mark.parametrize(
11+
"string,expected",
12+
[
13+
("v7r0p30", (7, 0, 30, None)),
14+
("v7r1", (7, 1, 0, None)),
15+
("v7r1-pre1", (7, 1, 0, 1)),
16+
("v7r1-pre9", (7, 1, 0, 9)),
17+
("v7r1p10", (7, 1, 10, None)),
18+
("v7r1p9", (7, 1, 9, None)),
19+
("v7r2-pre10", (7, 2, 0, 10)),
20+
("v7r2-pre9", (7, 2, 0, 9)),
21+
("v7r2p8-pre9", (7, 2, 8, 9)),
22+
23+
("v10r0p30", (10, 0, 30, None)),
24+
("v10r1", (10, 1, 0, None)),
25+
("v10r1-pre1", (10, 1, 0, 1)),
26+
("v10r1-pre9", (10, 1, 0, 9)),
27+
("v10r1p10", (10, 1, 10, None)),
28+
("v10r1p9", (10, 1, 9, None)),
29+
("v10r2-pre10", (10, 2, 0, 10)),
30+
("v10r2-pre9", (10, 2, 0, 9)),
31+
("v10r2p8-pre9", (10, 2, 8, 9)),
32+
33+
("v100r0p30", (100, 0, 30, None)),
34+
("v100r1", (100, 1, 0, None)),
35+
("v100r1-pre1", (100, 1, 0, 1)),
36+
("v100r1-pre9", (100, 1, 0, 9)),
37+
("v100r1p10", (100, 1, 10, None)),
38+
("v100r1p9", (100, 1, 9, None)),
39+
("v100r2-pre10", (100, 2, 0, 10)),
40+
("v100r2-pre9", (100, 2, 0, 9)),
41+
("v100r2p8-pre9", (100, 2, 8, 9)),
42+
],
43+
)
44+
def test_parseValid(string, expected):
45+
assert expected == diraccfg.parseVersion(string)
46+
47+
48+
@pytest.mark.parametrize(
49+
"string",
50+
[
51+
"v7r0p30-pre30-pre30",
52+
"master",
53+
"dev",
54+
"integration",
55+
"7r0p30",
56+
"v7r2p30p2",
57+
"1.0.0",
58+
"v7p30",
59+
"v7p30-pre2",
60+
"v10p30",
61+
"v10p30-pre2",
62+
"v100p30",
63+
"v100p30-pre2",
64+
],
65+
)
66+
def test_parseInvalid(string):
67+
with pytest.raises(ValueError):
68+
diraccfg.parseVersion(string)

0 commit comments

Comments
 (0)