1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """
23 Enum class implementation
24 """
25
26 from twisted.python.reflect import qual
27 from twisted.spread import jelly
28
29 _enumClassRegistry = {}
30
47
48
49 -class Enum(object, jelly.Jellyable):
50
51 __metaclass__ = EnumMetaClass
52 - def __init__(self, value, name, nick=None):
53 self.value = value
54 self.name = name
55
56 if nick == None:
57 nick = name
58
59 self.nick = nick
60 self._enumClassName = self.__class__.__name__
61
63 return '<enum %s of type %s>' % (self.name,
64 self.__class__.__name__)
65
66 - def get(klass, value):
68 get = classmethod(get)
69
70 - def set(klass, value, item):
72 set = classmethod(set)
73
75 sxp = jellier.prepare(self)
76 sxp.extend([
77 qual(Enum),
78 self._enumClassName,
79 self.value, self.name, self.nick])
80 return jellier.preserve(self, sxp)
81
82
84 - def __new__(klass, type_name, names=(), nicks=(), **extras):
85 if nicks:
86 if len(names) != len(nicks):
87 raise TypeError("nicks must have the same length as names")
88 else:
89 nicks = names
90
91 for extra in extras.values():
92 if not isinstance(extra, tuple):
93 raise TypeError('extra must be a tuple, not %s' % type(extra))
94
95 if len(extra) != len(names):
96 raise TypeError("extra items must have a length of %d" %
97 len(names))
98
99
100
101 etype = EnumMetaClass(type_name, (Enum,), {'__enums__': {}})
102 for value, name in enumerate(names):
103 enum = etype(value, name, nicks[value])
104 for extra_key, extra_values in extras.items():
105 assert not hasattr(enum, extra_key)
106 setattr(enum, extra_key, extra_values[value])
107 etype[value] = enum
108
109 _enumClassRegistry[type_name] = etype
110 return etype
111
112
113
114
129
130
131 jelly.setUnjellyableForClass(qual(Enum), EnumUnjellyer)
132