blob: 269cc91168394671f54672b29138c8c2e938cae3 [file] [log] [blame]
mblighe8819cd2008-02-15 16:48:40 +00001"""\
2Generic enumeration support.
3"""
4
5__author__ = 'showard@google.com (Steve Howard)'
6
7class Enum(object):
jadmanski0afbb632008-06-06 21:10:57 +00008 """\
9 Utility class to implement Enum-like functionality.
mblighe8819cd2008-02-15 16:48:40 +000010
jadmanski0afbb632008-06-06 21:10:57 +000011 >>> e = Enum('String one', 'String two')
12 >>> e.STRING_ONE
13 0
14 >>> e.STRING_TWO
15 1
16 >>> e.choices()
17 [(0, 'String one'), (1, 'String two')]
18 >>> e.get_value('String one')
19 0
20 >>> e.get_string(0)
21 'String one'
mblighe8819cd2008-02-15 16:48:40 +000022
jadmanski0afbb632008-06-06 21:10:57 +000023 >>> e = Enum('Hello', 'Goodbye', string_values=True)
24 >>> e.HELLO, e.GOODBYE
25 ('Hello', 'Goodbye')
mblighe8819cd2008-02-15 16:48:40 +000026
jadmanski0afbb632008-06-06 21:10:57 +000027 >>> e = Enum('One', 'Two', start_value=1)
28 >>> e.ONE
29 1
30 >>> e.TWO
31 2
32 """
33 def __init__(self, *names, **kwargs):
34 self.string_values = kwargs.get('string_values')
35 start_value = kwargs.get('start_value', 0)
Alex Milleref446dd2013-09-04 15:25:31 -070036 step = kwargs.get('step', 1)
jadmanski0afbb632008-06-06 21:10:57 +000037 self.names = names
38 self.values = []
39 for i, name in enumerate(names):
40 if self.string_values:
41 value = name
42 else:
Alex Milleref446dd2013-09-04 15:25:31 -070043 value = i * step + start_value
jadmanski0afbb632008-06-06 21:10:57 +000044 self.values.append(value)
45 setattr(self, self.get_attr_name(name), value)
mblighe8819cd2008-02-15 16:48:40 +000046
47
jadmanski0afbb632008-06-06 21:10:57 +000048 @staticmethod
49 def get_attr_name(string):
50 return string.upper().replace(' ', '_')
mblighe8819cd2008-02-15 16:48:40 +000051
52
jadmanski0afbb632008-06-06 21:10:57 +000053 def choices(self):
54 'Return choice list suitable for Django model choices.'
55 return zip(self.values, self.names)
mblighe8819cd2008-02-15 16:48:40 +000056
57
jadmanski0afbb632008-06-06 21:10:57 +000058 def get_value(self, name):
59 """\
60 Convert a string name to it's corresponding value. If a value
61 is passed in, it is returned.
62 """
Aviv Keshet7c72f9c2013-05-21 15:53:41 -070063 if isinstance(name, (int, long)) and not self.string_values:
jadmanski0afbb632008-06-06 21:10:57 +000064 # name is already a value
65 return name
66 return getattr(self, self.get_attr_name(name))
mblighe8819cd2008-02-15 16:48:40 +000067
68
jadmanski0afbb632008-06-06 21:10:57 +000069 def get_string(self, value):
70 ' Given a value, get the string name for it.'
71 if value not in self.values:
72 raise ValueError('Value %s not in this enum' % value)
73 index = self.values.index(value)
74 return self.names[index]