Skip to content

Commit

Permalink
Enum is immutable, deepcopy should return self
Browse files Browse the repository at this point in the history
  • Loading branch information
matllubos committed Jun 8, 2018
1 parent e65ca6c commit 6a890cd
Showing 1 changed file with 27 additions and 19 deletions.
46 changes: 27 additions & 19 deletions chamber/utils/datastructures.py
Expand Up @@ -5,7 +5,7 @@
class AbstractEnum:

def _has_attr(self, name):
return name in self.container
return name in self._container

def _get_attr_val(self, name):
return name
Expand All @@ -15,27 +15,35 @@ def __getattr__(self, name):
return self._get_attr_val(name)
raise AttributeError('Missing attribute %s' % name)

def __copy__(self, *args, **kwargs):
# Enum is immutable
return self

def __deepcopy__(self, *args, **kwargs):
# Enum is immutable
return self


class Enum(AbstractEnum):

def __init__(self, *items):
self.container = OrderedDict((
self._container = OrderedDict((
item if isinstance(item, (list, tuple)) else (item, item)
for item in items
))
super(Enum, self).__init__()

def _get_attr_val(self, name):
return self.container[name]
return self._container[name]

def __iter__(self):
return self.container.values().__iter__()
return self._container.values().__iter__()


class NumEnum(AbstractEnum):

def __init__(self, *items):
self.container = OrderedDict()
self._container = OrderedDict()
super(NumEnum, self).__init__()
i = 0
for item in items:
Expand All @@ -47,12 +55,12 @@ def __init__(self, *items):
key = item
i += 1

if i in self.container.values():
if i in self._container.values():
raise ValueError('Index %s already exists, please renumber choices')
self.container[key] = i
self._container[key] = i

def _get_attr_val(self, name):
return self.container[name]
return self._container[name]


class AbstractChoicesEnum:
Expand Down Expand Up @@ -81,33 +89,33 @@ def get_label(self, name):
class ChoicesEnum(AbstractChoicesEnum, AbstractEnum):

def __init__(self, *items):
self.container = OrderedDict()
self._container = OrderedDict()
super(ChoicesEnum, self).__init__()
for item in items:
if len(item) == 3:
key, label, val = item
elif len(item) == 2:
key, label = item
val = key
self.container[key] = (val, label)
self._container[key] = (val, label)

def get_name(self, i):
for key, (val, _) in self.container.items():
for key, (val, _) in self._container.items():
if val == i:
return key
return None

def _get_attr_val(self, name):
return self.container[name][0]
return self._container[name][0]

def _get_choices(self):
return list(self.container.values())
return list(self._container.values())


class ChoicesNumEnum(AbstractChoicesEnum, AbstractEnum):

def __init__(self, *items):
self.container = OrderedDict()
self._container = OrderedDict()
super(ChoicesNumEnum, self).__init__()
i = 0
for item in items:
Expand All @@ -121,21 +129,21 @@ def __init__(self, *items):
else:
raise ValueError('Wrong input data format')

if i in {j for j, _ in self.container.values()}:
if i in {j for j, _ in self._container.values()}:
raise ValueError('Index %s already exists, please renumber choices')
self.container[key] = (i, val)
self._container[key] = (i, val)

def get_name(self, i):
for key, (number, _) in self.container.items():
for key, (number, _) in self._container.items():
if number == i:
return key
return None

def _get_attr_val(self, name):
return self.container[name][0]
return self._container[name][0]

def _get_choices(self):
return list(self.container.values())
return list(self._container.values())


class SubstatesChoicesNumEnum(ChoicesNumEnum):
Expand Down

0 comments on commit 6a890cd

Please sign in to comment.