1 # Copyright (C) 2017 Apple Inc. All rights reserved.
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions
6 # 1. Redistributions of source code must retain the above copyright
7 # notice, this list of conditions and the following disclaimer.
8 # 2. Redistributions in binary form must reproduce the above copyright
9 # notice, this list of conditions and the following disclaimer in the
10 # documentation and/or other materials provided with the distribution.
12 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
13 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
14 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15 # DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
16 # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
18 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
19 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
20 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
21 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 class Version(object):
27 def __init__(self, ver='0'):
33 if isinstance(ver, int):
36 elif isinstance(ver, str) or isinstance(ver, unicode):
37 for i in xrange(len(ver.split('.'))):
38 self[i] = ver.split('.')[i]
40 elif isinstance(ver, Version) or isinstance(ver, collections.Iterable):
41 for i in xrange(len(ver)):
45 return # Empty version is implicitly zero
46 raise ValueError('Version expected to be string, integer, tuple or list of integers')
51 def __getitem__(self, key):
52 if isinstance(key, int):
63 raise ValueError('Version key must be between 0 and 4')
64 elif isinstance(key, str):
65 if hasattr(self, key):
66 return getattr(self, key)
67 raise ValueError('Version key must be major, minor, tiny, micro or nano')
68 raise ValueError('Expected version key to be string or integer')
70 def __setitem__(self, key, value):
71 if isinstance(key, int):
73 self.major = int(value)
76 self.minor = int(value)
79 self.tiny = int(value)
82 self.micro = int(value)
85 self.nano = int(value)
87 raise ValueError('Version key must be between 0 and 4')
88 elif isinstance(key, str):
89 if hasattr(self, key):
90 return setattr(self, key, value)
91 raise ValueError('Version key must be major, minor, tiny, micro or nano')
92 raise ValueError('Expected version key to be string or integer')
96 for i in xrange(len(self)):
99 result = str(self.major)
100 for i in xrange(len_to_print - 1):
101 result += '.{}'.format(self[i + 1])
104 def __cmp__(self, other):
105 for i in xrange(len(self)):
106 if cmp(self[i], other[i]):
107 return cmp(self[i], other[i])