Skip to content

Commit aa0ce1a

Browse files
committed
-
1 parent 987c197 commit aa0ce1a

File tree

2 files changed

+76
-15
lines changed

2 files changed

+76
-15
lines changed

python_toolbox/version_info.py

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,39 @@ class VersionInfo(tuple):
1818
Example:
1919
2020
VersionInfo(1, 2, 0) == \
21-
VersionInfo(major=1, minor=2, micro=0) == \
21+
VersionInfo(major=1, minor=2, micro=0, modifier='release') == \
2222
(1, 2, 0)
2323
'''
2424

2525
__slots__ = ()
2626

2727

28-
_fields = ('major', 'minor', 'micro')
28+
_fields = ('major', 'minor', 'micro', 'modifier')
2929

3030

31-
def __new__(cls, major, minor, micro):
32-
'''Create new instance of `VersionInfo(major, minor, micro)`.'''
33-
return tuple.__new__(cls, (major, minor, micro))
31+
def __new__(cls, major, minor=0, micro=0, modifier='release'):
32+
'''
33+
Create new instance of `VersionInfo(major, minor, micro, modifier)`.
34+
'''
35+
assert isinstance(major, int)
36+
assert isinstance(minor, int)
37+
assert isinstance(micro, int)
38+
assert isinstance(modifier, basestring)
39+
return tuple.__new__(cls, (major, minor, micro, modifier))
3440

3541

3642
@classmethod
3743
def _make(cls, iterable, new=tuple.__new__, len=len):
3844
'''Make a new `VersionInfo` object from a sequence or iterable.'''
3945
result = new(cls, iterable)
40-
if len(result) != 3:
41-
raise TypeError('Expected 3 arguments, got %d' % len(result))
46+
if len(result) != 4:
47+
raise TypeError('Expected 4 arguments, got %d' % len(result))
4248
return result
4349

4450

4551
def __repr__(self):
4652
'''Return a nicely formatted representation string.'''
47-
return 'VersionInfo(major=%r, minor=%r, micro=%r)' % self
53+
return 'VersionInfo(major=%r, minor=%r, micro=%r, modifier=%r)' % self
4854

4955

5056
def _asdict(self):
@@ -59,21 +65,33 @@ def _replace(self, **kwargs):
5965
Make a `VersionInfo` object replacing specified fields with new values.
6066
'''
6167
result = \
62-
self._make(map(kwargs.pop, ('major', 'minor', 'micro'), self))
68+
self._make(map(kwargs.pop, ('major', 'minor', 'micro', 'modifier'),
69+
self))
6370
if kwargs:
6471
raise ValueError('Got unexpected field names: %r' % kwargs.keys())
6572
return result
6673

6774

6875
def __getnewargs__(self):
69-
'''Return self as a plain tuple. Used by copy and pickle.'''
70-
return tuple(self)
76+
'''Return self as a plain tuple. Used by copy and pickle.'''
77+
return tuple(self)
7178

79+
@property
80+
def version_text(self):
81+
'''A textual description of the version, like '1.4.2 beta'.'''
82+
version_text = '%s.%s' % (self.major, self.minor)
83+
if self.micro:
84+
version_text += '.%s' % self.micro
85+
if self.modifier != 'release':
86+
version_text += ' %s' % self.modifier
87+
return version_text
7288

73-
major = property(_itemgetter(0), doc='Alias for field number 0')
7489

90+
major = property(_itemgetter(0))
7591

76-
minor = property(_itemgetter(1), doc='Alias for field number 1')
92+
minor = property(_itemgetter(1))
7793

78-
79-
micro = property(_itemgetter(2), doc='Alias for field number 2')
94+
micro = property(_itemgetter(2))
95+
96+
modifier = property(_itemgetter(3))
97+
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Copyright 2009-2012 Ram Rachum.
2+
# This program is distributed under the MIT license.
3+
4+
'''Testing module for `python_toolbox.version_info.VersionInfo`.'''
5+
6+
from python_toolbox.version_info import VersionInfo
7+
8+
9+
def test():
10+
'''Test the basic workings of `VersionInfo`.'''
11+
12+
version_info_0 = VersionInfo(1, 7, 8)
13+
version_info_1 = VersionInfo(9, 7, 3)
14+
version_info_2 = VersionInfo(major=22)
15+
16+
assert version_info_0 < version_info_1 < version_info_2
17+
assert version_info_0 <= version_info_1 <= version_info_2
18+
19+
assert version_info_0.major == 1
20+
assert version_info_0.minor == version_info_1.minor == 7
21+
assert version_info_0.modifier == version_info_1.modifier == \
22+
version_info_2.modifier == 'release'
23+
24+
25+
version_info_4 = VersionInfo(9, 7, 8)
26+
version_info_5 = VersionInfo(9, 7, 8, 'alpha')
27+
version_info_6 = VersionInfo(9, 7, 8, 'beta')
28+
version_info_7 = VersionInfo(9, 7, 8, 'rc')
29+
version_info_8 = VersionInfo(9, 7, 8, 'release')
30+
31+
assert version_info_4 == version_info_8
32+
assert sorted((version_info_5, version_info_6, version_info_7,
33+
version_info_8)) == \
34+
[version_info_5, version_info_6, version_info_7, version_info_8]
35+
36+
37+
def test_version_text():
38+
assert VersionInfo(1, 5, 3).version_text == '1.5.3'
39+
assert VersionInfo(1, 0, 3).version_text == '1.0.3'
40+
assert VersionInfo(1, 0).version_text == '1.0'
41+
assert VersionInfo(1).version_text == '1.0'
42+
assert VersionInfo(1, 0, modifier='rc').version_text == '1.0 rc'
43+
assert VersionInfo(4, modifier='beta').version_text == '4.0 beta'

0 commit comments

Comments
 (0)