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