From fe8f3158f6ca4c974b04fc677f05b5ad61db8123 Mon Sep 17 00:00:00 2001 From: Al Date: Sun, 17 Jan 2016 22:23:44 -0500 Subject: [PATCH] [fix] missing file in geodata --- scripts/geodata/enum.py | 62 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 scripts/geodata/enum.py diff --git a/scripts/geodata/enum.py b/scripts/geodata/enum.py new file mode 100644 index 00000000..504ad70a --- /dev/null +++ b/scripts/geodata/enum.py @@ -0,0 +1,62 @@ + +class EnumValue(object): + def __init__(self, value, name=None): + self.value = value + self.name = name + + def __hash__(self): + return self.value + + def __cmp__(self, other): + if isinstance(other, EnumValue): + return self.value.__cmp__(other.value) + else: + return self.value.__cmp__(other) + + def __unicode__(self): + return self.name + + def __str__(self): + return self.name + + def __repr__(self): + return self.name + + +class EnumMeta(type): + def __init__(self, name, bases, dict_): + self.registry = self.registry.copy() + self.name_registry = self.name_registry.copy() + for k, v in dict_.iteritems(): + if isinstance(v, EnumValue) and v not in self.registry: + if v.name is None: + v.name = k + self.registry[v.value] = v + self.name_registry[v.name] = v + return super(EnumMeta, self).__init__(name, bases, dict_) + + def __iter__(self): + return self.registry.itervalues() + + def __getitem__(self, key): + return self.registry[key] + + +class Enum(object): + __metaclass__ = EnumMeta + registry = {} + name_registry = {} + + @classmethod + def from_id(cls, value): + try: + return cls.registry[value] + except KeyError: + raise ValueError('Invalid value for {}: {}'.format(cls.__name__, value)) + + @classmethod + def from_string(cls, name): + try: + return cls.name_registry[name] + except KeyError: + raise ValueError('Invalid name for {}: {}'.format(cls.__name__, name))