diff --git a/secop/modules.py b/secop/modules.py index d63cb93..8811562 100644 --- a/secop/modules.py +++ b/secop/modules.py @@ -56,6 +56,7 @@ class HasAccessibles(HasProperties): accessibles = OrderedDict() # dict of accessibles merged_properties = {} # dict of dict of merged properties new_names = [] # list of names of new accessibles + override_values = {} # bare values overriding a parameter and methods overriding a command for base in reversed(cls.__mro__): for key, value in base.__dict__.items(): if isinstance(value, Accessible): @@ -63,17 +64,20 @@ class HasAccessibles(HasProperties): if base == cls and key not in accessibles: new_names.append(key) accessibles[key] = value + override_values.pop(key, None) elif key in accessibles: # either a bare value overriding a parameter # or a method overriding a command - aobj = aobj.copy() - aobj.override(value) - accessibles[key] = aobj + override_values[key] = value for aname, aobj in accessibles.items(): - if aobj != getattr(cls, aname, None): + if aname in override_values: aobj = aobj.copy() + aobj.merge(merged_properties[aname]) + aobj.override(override_values[aname]) + # replace the bare value by the created accessible setattr(cls, aname, aobj) - aobj.merge(merged_properties[aname]) + else: + aobj.merge(merged_properties[aname]) accessibles[aname] = aobj # rebuild order: (1) inherited items, (2) items from paramOrder, (3) new accessibles # move (2) to the end diff --git a/secop/params.py b/secop/params.py index 72d0455..86e6bd0 100644 --- a/secop/params.py +++ b/secop/params.py @@ -60,11 +60,8 @@ class Accessible(HasProperties): """override with a bare value""" raise NotImplementedError - def copy(self, **kwds): - """return a (deep) copy of ourselfs - - :param kwds: override given properties - """ + def copy(self): + """return a (deep) copy of ourselfs""" raise NotImplementedError def updateProperties(self, merged_properties): @@ -223,15 +220,11 @@ class Parameter(Accessible): else: raise ProgrammingError('can not use %r as name of a Parameter' % self.name) - def copy(self, **kwds): - """return a (deep) copy of ourselfs - - :param kwds: override given properties - """ + def copy(self): + """return a (deep) copy of ourselfs""" res = type(self)() res.name = self.name res.init(self.propertyValues) - res.init(kwds) if 'datatype' in self.propertyValues: res.datatype = res.datatype.copy() return res @@ -407,16 +400,12 @@ class Command(Accessible): self.func = func return self - def copy(self, **kwds): - """return a (deep) copy of ourselfs - - :param kwds: override given properties - """ + def copy(self): + """return a (deep) copy of ourselfs""" res = type(self)() res.name = self.name res.func = self.func res.init(self.propertyValues) - res.init(kwds) if res.argument: res.argument = res.argument.copy() if res.result: @@ -435,6 +424,8 @@ class Command(Accessible): if not callable(value): raise ProgrammingError('%s = %r is overriding a Command' % (self.name, value)) self.func = value + if value.__doc__: + self.description = inspect.cleandoc(value.__doc__) def merge(self, merged_properties): """merge with inherited properties