7f6a3eef6e2d383f31b99e52973a57c678573c46
[WebKit-https.git] / Tools / Scripts / webkitpy / common / version.py
1 # Copyright (C) 2017 Apple Inc. All rights reserved.
2 #
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions
5 # are met:
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.
11 #
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.
22
23 import collections
24
25 class Version(object):
26
27     def __init__(self, ver='0'):
28         self.major = 0
29         self.minor = 0
30         self.tiny = 0
31         self.micro = 0
32         self.nano = 0
33         if isinstance(ver, int):
34             self.major = ver
35             return
36         elif isinstance(ver, str) or isinstance(ver, unicode):
37             for i in xrange(len(ver.split('.'))):
38                 self[i] = ver.split('.')[i]
39             return
40         elif isinstance(ver, Version) or isinstance(ver, collections.Iterable):
41             for i in xrange(len(ver)):
42                 self[i] = ver[i]
43             return
44         elif ver is None:
45             return  # Empty version is implicitly zero
46         raise ValueError('Version expected to be string, integer, tuple or list of integers')
47
48     def __len__(self):
49         return 5
50
51     def __getitem__(self, key):
52         if isinstance(key, int):
53             if key == 0:
54                 return self.major
55             elif key == 1:
56                 return self.minor
57             elif key == 2:
58                 return self.tiny
59             elif key == 3:
60                 return self.micro
61             elif key == 4:
62                 return self.nano
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')
69
70     def __setitem__(self, key, value):
71         if isinstance(key, int):
72             if key == 0:
73                 self.major = int(value)
74                 return self.major
75             elif key == 1:
76                 self.minor = int(value)
77                 return self.minor
78             elif key == 2:
79                 self.tiny = int(value)
80                 return self.tiny
81             elif key == 3:
82                 self.micro = int(value)
83                 return self.micro
84             elif key == 4:
85                 self.nano = int(value)
86                 return self.nano
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')
93
94     def __str__(self):
95         len_to_print = 1
96         for i in xrange(len(self)):
97             if self[i]:
98                 len_to_print = i + 1
99         result = str(self.major)
100         for i in xrange(len_to_print - 1):
101             result += '.{}'.format(self[i + 1])
102         return result
103
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])
108         return 0