| 161 | |
| 162 | |
| 163 | def pep435_enum(name): |
| 164 | # Implements PEP 435 in the minimal fashion needed by SQLAlchemy |
| 165 | __members__ = OrderedDict() |
| 166 | |
| 167 | def __init__(self, name, value, alias=None): |
| 168 | self.name = name |
| 169 | self.value = value |
| 170 | self.__members__[name] = self |
| 171 | value_to_member[value] = self |
| 172 | setattr(self.__class__, name, self) |
| 173 | if alias: |
| 174 | self.__members__[alias] = self |
| 175 | setattr(self.__class__, alias, self) |
| 176 | |
| 177 | value_to_member = {} |
| 178 | |
| 179 | @classmethod |
| 180 | def get(cls, value): |
| 181 | return value_to_member[value] |
| 182 | |
| 183 | someenum = type( |
| 184 | name, |
| 185 | (object,), |
| 186 | {"__members__": __members__, "__init__": __init__, "get": get}, |
| 187 | ) |
| 188 | |
| 189 | # getframe() trick for pickling I don't understand courtesy |
| 190 | # Python namedtuple() |
| 191 | try: |
| 192 | module = sys._getframe(1).f_globals.get("__name__", "__main__") |
| 193 | except (AttributeError, ValueError): |
| 194 | pass |
| 195 | if module is not None: |
| 196 | someenum.__module__ = module |
| 197 | |
| 198 | return someenum |