Skip to content

Commit 27e7cba

Browse files
committed
Add properties to VersionInfo
1 parent 9a76560 commit 27e7cba

File tree

2 files changed

+69
-6
lines changed

2 files changed

+69
-6
lines changed

mike/versions.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import re
33
from verspec.loose import LooseVersion as Version
44

5+
from . import jsonpath
6+
57

68
def _ensure_version(version):
79
if not isinstance(version, Version):
@@ -10,7 +12,7 @@ def _ensure_version(version):
1012

1113

1214
class VersionInfo:
13-
def __init__(self, version, title=None, aliases=[]):
15+
def __init__(self, version, title=None, aliases=[], properties=None):
1416
self._check_version(str(version), 'version')
1517
for i in aliases:
1618
self._check_version(i, 'alias')
@@ -19,18 +21,23 @@ def __init__(self, version, title=None, aliases=[]):
1921
self.version = _ensure_version(version)
2022
self.title = version_name if title is None else title
2123
self.aliases = set(aliases)
24+
self.properties = properties
2225

2326
if str(self.version) in self.aliases:
2427
raise ValueError('duplicated version and alias')
2528

2629
@classmethod
2730
def from_json(cls, data):
28-
return cls(data['version'], data['title'], data['aliases'])
31+
return cls(data['version'], data['title'], data['aliases'],
32+
data.get('properties'))
2933

3034
def to_json(self):
31-
return {'version': str(self.version),
35+
data = {'version': str(self.version),
3236
'title': self.title,
3337
'aliases': list(self.aliases)}
38+
if self.properties:
39+
data['properties'] = self.properties
40+
return data
3441

3542
@classmethod
3643
def loads(cls, data):
@@ -48,11 +55,13 @@ def _check_version(version, kind):
4855
def __eq__(self, rhs):
4956
return (str(self.version) == str(rhs.version) and
5057
self.title == rhs.title and
51-
self.aliases == rhs.aliases)
58+
self.aliases == rhs.aliases and
59+
self.properties == rhs.properties)
5260

5361
def __repr__(self):
54-
return '<VersionInfo({!r}, {!r}, {{{}}})>'.format(
55-
self.version, self.title, ', '.join(repr(i) for i in self.aliases)
62+
return '<VersionInfo({!r}, {!r}, {{{}}}{})>'.format(
63+
self.version, self.title, ', '.join(repr(i) for i in self.aliases),
64+
', {!r}'.format(self.properties) if self.properties else ''
5665
)
5766

5867
def update(self, title=None, aliases=[]):
@@ -69,6 +78,12 @@ def update(self, title=None, aliases=[]):
6978
self.aliases |= aliases
7079
return added
7180

81+
def get_property(self, expr, **kwargs):
82+
return jsonpath.get_value(self.properties, expr, **kwargs)
83+
84+
def set_property(self, expr, value):
85+
self.properties = jsonpath.set_value(self.properties, expr, value)
86+
7287

7388
class Versions:
7489
def __init__(self):

test/unit/test_versions.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import unittest
33
from verspec.loose import LooseVersion as Version
44

5+
from mike.jsonpath import Deleted
56
from mike.versions import VersionInfo, Versions
67

78

@@ -11,21 +12,31 @@ def test_create(self):
1112
self.assertEqual(v.version, Version('1.0'))
1213
self.assertEqual(v.title, '1.0')
1314
self.assertEqual(v.aliases, set())
15+
self.assertEqual(v.properties, None)
1416

1517
v = VersionInfo('1.0', '1.0.0')
1618
self.assertEqual(v.version, Version('1.0'))
1719
self.assertEqual(v.title, '1.0.0')
1820
self.assertEqual(v.aliases, set())
21+
self.assertEqual(v.properties, None)
1922

2023
v = VersionInfo('1.0', aliases=['latest'])
2124
self.assertEqual(v.version, Version('1.0'))
2225
self.assertEqual(v.title, '1.0')
2326
self.assertEqual(v.aliases, {'latest'})
27+
self.assertEqual(v.properties, None)
28+
29+
v = VersionInfo('1.0', properties={'prop': 'val'})
30+
self.assertEqual(v.version, Version('1.0'))
31+
self.assertEqual(v.title, '1.0')
32+
self.assertEqual(v.aliases, set())
33+
self.assertEqual(v.properties, {'prop': 'val'})
2434

2535
v = VersionInfo(Version('1.0'))
2636
self.assertEqual(v.version, Version('1.0'))
2737
self.assertEqual(v.title, '1.0')
2838
self.assertEqual(v.aliases, set())
39+
self.assertEqual(v.properties, None)
2940

3041
with self.assertRaisesRegex(ValueError, "^'' is not a valid version$"):
3142
VersionInfo('')
@@ -58,19 +69,29 @@ def test_equality(self):
5869
self.assertNotEqual(v, VersionInfo('1.0', aliases=['latest']))
5970
self.assertNotEqual(v, VersionInfo('1.0.0'))
6071
self.assertNotEqual(v, VersionInfo('1.0.0', '1.0'))
72+
self.assertNotEqual(v, VersionInfo('1.0', properties={'prop': 'val'}))
6173

6274
v = VersionInfo('1.0', '1.0.0')
6375
self.assertNotEqual(v, VersionInfo('1.0'))
6476
self.assertNotEqual(v, VersionInfo('1.1'))
6577
self.assertEqual(v, VersionInfo('1.0', '1.0.0'))
6678
self.assertNotEqual(v, VersionInfo('1.0', aliases=['latest']))
6779
self.assertNotEqual(v, VersionInfo('1.0.0'))
80+
self.assertNotEqual(v, VersionInfo('1.0', properties={'prop': 'val'}))
6881

6982
v = VersionInfo('1.0', aliases=['latest'])
7083
self.assertNotEqual(v, VersionInfo('1.0'))
7184
self.assertNotEqual(v, VersionInfo('1.1'))
7285
self.assertNotEqual(v, VersionInfo('1.0', '1.0.0'))
7386
self.assertEqual(v, VersionInfo('1.0', aliases=['latest']))
87+
self.assertNotEqual(v, VersionInfo('1.0', properties={'prop': 'val'}))
88+
89+
v = VersionInfo('1.0', properties={'prop': 'val'})
90+
self.assertNotEqual(v, VersionInfo('1.0'))
91+
self.assertNotEqual(v, VersionInfo('1.1'))
92+
self.assertNotEqual(v, VersionInfo('1.0', '1.0.0'))
93+
self.assertNotEqual(v, VersionInfo('1.0', aliases=['latest']))
94+
self.assertEqual(v, VersionInfo('1.0', properties={'prop': 'val'}))
7495

7596
def test_from_json(self):
7697
self.assertEqual(VersionInfo.from_json({
@@ -81,6 +102,11 @@ def test_from_json(self):
81102
'version': '1.0', 'title': '1.0.0', 'aliases': ['latest']
82103
}), VersionInfo('1.0', '1.0.0', ['latest']))
83104

105+
self.assertEqual(VersionInfo.from_json({
106+
'version': '1.0', 'title': '1.0.0', 'aliases': [],
107+
'properties': {'prop': 'val'}
108+
}), VersionInfo('1.0', '1.0.0', [], {'prop': 'val'}))
109+
84110
def test_to_json(self):
85111
v = VersionInfo('1.0')
86112
self.assertEqual(v.to_json(), {
@@ -92,6 +118,12 @@ def test_to_json(self):
92118
'version': '1.0', 'title': '1.0.0', 'aliases': ['latest']
93119
})
94120

121+
v = VersionInfo('1.0', '1.0.0', [], {'prop': 'val'})
122+
self.assertEqual(v.to_json(), {
123+
'version': '1.0', 'title': '1.0.0', 'aliases': [],
124+
'properties': {'prop': 'val'}
125+
})
126+
95127
def test_loads(self):
96128
self.assertEqual(VersionInfo.loads(
97129
'{"version": "1.0", "title": "1.0", "aliases": []}'
@@ -127,6 +159,22 @@ def test_update(self):
127159
"^'foo/bar' is not a valid alias$"):
128160
v.update(aliases=['foo/bar'])
129161

162+
def test_get_property(self):
163+
v = VersionInfo('1.0', properties={'prop': 'val'})
164+
self.assertEqual(v.get_property('prop'), 'val')
165+
166+
v = VersionInfo('1.0', properties={'prop': ['foo', 'bar']})
167+
self.assertEqual(v.get_property('prop[1]'), 'bar')
168+
169+
def test_set_property(self):
170+
v = VersionInfo('1.0', properties={'prop': 'val'})
171+
v.set_property('hello', 'world')
172+
self.assertEqual(v.properties, {'prop': 'val', 'hello': 'world'})
173+
174+
v = VersionInfo('1.0', properties={'prop': ['foo', 'bar']})
175+
v.set_property('prop[1]', Deleted)
176+
self.assertEqual(v.properties, {'prop': ['foo']})
177+
130178

131179
class TestVersions(unittest.TestCase):
132180
def test_add(self):

0 commit comments

Comments
 (0)