fix style failures in webkitpy: expected 2 blank lines found 1
[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
26 class Version(object):
27
28     def __init__(self, ver='0'):
29         self.major = 0
30         self.minor = 0
31         self.tiny = 0
32         self.micro = 0
33         self.nano = 0
34         if isinstance(ver, int):
35             self.major = ver
36             return
37         elif isinstance(ver, str) or isinstance(ver, unicode):
38             for i in xrange(len(ver.split('.'))):
39                 self[i] = ver.split('.')[i]
40             return
41         elif isinstance(ver, Version) or isinstance(ver, collections.Iterable):
42             for i in xrange(len(ver)):
43                 self[i] = ver[i]
44             return
45         elif ver is None:
46             return  # Empty version is implicitly zero
47         raise ValueError('Version expected to be string, integer, tuple or list of integers')
48
49     def __len__(self):
50         return 5
51
52     def __getitem__(self, key):
53         if isinstance(key, int):
54             if key == 0:
55                 return self.major
56             elif key == 1:
57                 return self.minor
58             elif key == 2:
59                 return self.tiny
60             elif key == 3:
61                 return self.micro
62             elif key == 4:
63                 return self.nano
64             raise ValueError('Version key must be between 0 and 4')
65         elif isinstance(key, str):
66             if hasattr(self, key):
67                 return getattr(self, key)
68             raise ValueError('Version key must be major, minor, tiny, micro or nano')
69         raise ValueError('Expected version key to be string or integer')
70
71     def __setitem__(self, key, value):
72         if isinstance(key, int):
73             if key == 0:
74                 self.major = int(value)
75                 return self.major
76             elif key == 1:
77                 self.minor = int(value)
78                 return self.minor
79             elif key == 2:
80                 self.tiny = int(value)
81                 return self.tiny
82             elif key == 3:
83                 self.micro = int(value)
84                 return self.micro
85             elif key == 4:
86                 self.nano = int(value)
87                 return self.nano
88             raise ValueError('Version key must be between 0 and 4')
89         elif isinstance(key, str):
90             if hasattr(self, key):
91                 return setattr(self, key, value)
92             raise ValueError('Version key must be major, minor, tiny, micro or nano')
93         raise ValueError('Expected version key to be string or integer')
94
95     def __str__(self):
96         len_to_print = 1
97         for i in xrange(len(self)):
98             if self[i]:
99                 len_to_print = i + 1
100         result = str(self.major)
101         for i in xrange(len_to_print - 1):
102             result += '.{}'.format(self[i + 1])
103         return result
104
105     def __cmp__(self, other):
106         for i in xrange(len(self)):
107             if cmp(self[i], other[i]):
108                 return cmp(self[i], other[i])
109         return 0