Skip to content

Commit

Permalink
:update: inherits the compositemodelelement from the ordereddict and …
Browse files Browse the repository at this point in the history
…:improve: parser UTs
  • Loading branch information
b3j0f committed Mar 7, 2016
1 parent 7905b5f commit 0a0e320
Show file tree
Hide file tree
Showing 5 changed files with 211 additions and 221 deletions.
173 changes: 31 additions & 142 deletions b3j0f/conf/model/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,73 +107,47 @@ def __repr__(self):
return result


class CompositeModelElement(ModelElement, dict):
class CompositeModelElement(ModelElement, OrderedDict):
"""Model element composed of model elements."""

__contenttype__ = ModelElement #: content type.

__slots__ = ('_content', ) + ModelElement.__slots__
__slots__ = ModelElement.__slots__

def __init__(self, *content):
def __init__(self, *melts):
"""
:param tuple melts: model elements to add.
"""

super(CompositeModelElement, self).__init__()

# init protected attributes
self._content = OrderedDict()

self.content = content

def __iter__(self):

return iter(self._content.values())

def __getitem__(self, key):

if isinstance(key, ModelElement):
key = key.name

return self._content[key]

def __setitem__(self, key, value):
for melt in melts:
self[melt.name] = melt

if isinstance(key, ModelElement):
key = key.name
def __deepcopy__(self, _):

self._content[key] = value

def __delitem__(self, key):

if isinstance(key, ModelElement):
key = key.name

del self._content[key]
return self.copy()

def __getattr__(self, key):

"""Try to delegate key attribute to content name.
"""
result = None

if key in self.__slots__:
result = super(CompositeModelElement, self).__getattribute__(key)

else:
result = self._content[key]

return result

def __deepcopy__(self, memo):
try:
result = self[key]

return self

def __contains__(self, key):

if isinstance(key, ModelElement):
key = key.name

return key in self._content

def __len__(self):
except KeyError:
raise AttributeError(
'\'{0}\' object has no attribute \'{1}\''.format(
self.__class__, key
)
)

return len(self._content)
return result

def __i(self, other, func):
"""Process input other with input func.
Expand Down Expand Up @@ -206,8 +180,7 @@ def __iadd__(self, other):
:raise: TypeError if other is not a ModelElement(s)."""

return self.__i(
other=other,
func=lambda melt: self._content.__setitem__(melt.name, melt)
other=other, func=lambda melt: self.__setitem__(melt.name, melt)
)

def __isub__(self, other):
Expand All @@ -217,10 +190,7 @@ def __isub__(self, other):
:return: self.
:raise: TypeError if other is not a ModelElement(s)."""

return self.__i(
other=other,
func=lambda melt: self._content.pop(melt.name)
)
return self.__i(other=other, func=lambda melt: self.pop(melt.name))

def __ixor__(self, other):
"""Put other element(s) which are not registered in this.
Expand All @@ -237,108 +207,27 @@ def __ixor__(self, other):
)
)

def __repr__(self):

result = super(CompositeModelElement, self).__repr__()

result = '{0}[{1}]'.format(result, self._content)

return result

def names(self):
"""Get content names."""

return tuple(self._content.keys())

@property
def content(self):
"""Get Content.
:rtype: tuple
"""

return tuple(self._content.values())

@content.setter
def content(self, value):
"""Change of content.
:param ModelElement(s) value: new content to use.
"""

self._content.clear()

self += value

def put(self, value):
"""Put a content value and return the previous one if exist.
:param ModelElement value: model element to put in this.
:return: previous model element registered at the same name.
:rtype: ModelElement
"""

result = self.get(value.name)

self += value

return result

def clean(self, *args, **kwargs):

for content in self._content.values():
for content in list(self.values()):

content.clean(*args, **kwargs)

def copy(self, cleaned=False, *args, **kwargs):

for slot in self.__slots__:
if slot not in kwargs:
attr = getattr(self, slot)
kwargs[slot] = attr

result = super(CompositeModelElement, self).copy(*args, **kwargs)

for content in self._content.values():
for content in list(self.values()):

result += content.copy(cleaned=cleaned)

return result

def pop(self, name):
"""Remove an element by name and return it.
:param str name: corresponding element name to remove.
:return: corresponding element name.
:rtype: ModelElement
:raises: KeyError if name is not registered in this."""

return self._content.pop(name)

def get(self, key, default=None):
"""Get a content value by its name.
:param str key: content name.
:param ModelElement default: default value if key is not registered.
:return: related content model element.
:rtype: ModelElement
"""

return self._content.get(key, default)

def setdefault(self, key, value):
"""Register a content value with specific name if key not already used.
:param str key: content name.
:param ModelElement value: model element to register.
:return: existing model element or input value if no modelelt has
been registered with key.
:rtype: ModelElement
"""

return self._content.setdefault(key, value)

def clear(self):
"""Clear this composite model element from this content."""

self._content.clear()

@property
def params(self):
"""Get set of parameters.
Expand All @@ -347,7 +236,7 @@ def params(self):

result = set()

for content in self._content.values():
for content in list(self.values()):

if isinstance(content, CompositeModelElement):
result = content.params | result
Expand Down
4 changes: 1 addition & 3 deletions b3j0f/conf/model/cat.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,7 @@ def getparams(self, param):
:rtype: list
"""

return list(
cparam for cparam in self._content.values() if cparam == param
)
return list(cparam for cparam in self.values() if cparam == param)

def copy(self, cleaned=False):

Expand Down
7 changes: 4 additions & 3 deletions b3j0f/conf/model/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def resolve(
:raises: Parameter.Error for any raised exception.
"""

for category in self._content.values():
for category in self.values():

for param in category:

Expand All @@ -81,9 +81,10 @@ def param(self, pname, cname=None, history=0):

categories = [] # list of categories containing input parameter name

for cat in self._content.values():
for cat in self.values():

if pname in cat:

categories.append(cat)

if cname in (None, cat.name):
Expand Down Expand Up @@ -112,7 +113,7 @@ def update(self, conf):

if cat.name in self:

selfcat = self._content[cat.name]
selfcat = self[cat.name]

for param in cat:

Expand Down

0 comments on commit 0a0e320

Please sign in to comment.