blob: e716a55f6a70fff04b306b271d4d4702d0be0e45 [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)
36 self.names = names
37 self.values = []
38 for i, name in enumerate(names):
39 if self.string_values:
40 value = name
41 else:
42 value = i + start_value
43 self.values.append(value)
44 setattr(self, self.get_attr_name(name), value)
mblighe8819cd2008-02-15 16:48:40 +000045
46
jadmanski0afbb632008-06-06 21:10:57 +000047 @staticmethod
48 def get_attr_name(string):
49 return string.upper().replace(' ', '_')
mblighe8819cd2008-02-15 16:48:40 +000050
51
jadmanski0afbb632008-06-06 21:10:57 +000052 def choices(self):
53 'Return choice list suitable for Django model choices.'
54 return zip(self.values, self.names)
mblighe8819cd2008-02-15 16:48:40 +000055
56
jadmanski0afbb632008-06-06 21:10:57 +000057 def get_value(self, name):
58 """\
59 Convert a string name to it's corresponding value. If a value
60 is passed in, it is returned.
61 """
Aviv Keshet7c72f9c2013-05-21 15:53:41 -070062 if isinstance(name, (int, long)) and not self.string_values:
jadmanski0afbb632008-06-06 21:10:57 +000063 # name is already a value
64 return name
65 return getattr(self, self.get_attr_name(name))
mblighe8819cd2008-02-15 16:48:40 +000066
67
jadmanski0afbb632008-06-06 21:10:57 +000068 def get_string(self, value):
69 ' Given a value, get the string name for it.'
70 if value not in self.values:
71 raise ValueError('Value %s not in this enum' % value)
72 index = self.values.index(value)
73 return self.names[index]