diff --git a/wlauto/core/extension.py b/wlauto/core/extension.py index 3aed90dc..348a5b9f 100644 --- a/wlauto/core/extension.py +++ b/wlauto/core/extension.py @@ -82,7 +82,12 @@ class AttributeCollection(object): return p def __iadd__(self, other): + other = [self._to_attrcls(p) for p in other] + names = [] for p in other: + if p.name in names: + raise ValueError("Duplicate '{}' {}".format(p.name, p.__class__.__name__.split('.')[-1])) + names.append(p.name) self.add(p) return self @@ -687,4 +692,3 @@ class Module(Extension): def initialize(self, context): pass - diff --git a/wlauto/tests/test_extension.py b/wlauto/tests/test_extension.py index 77e244f6..dee00cc4 100644 --- a/wlauto/tests/test_extension.py +++ b/wlauto/tests/test_extension.py @@ -320,6 +320,13 @@ class ParametersTest(TestCase): myext = _instantiate(MyOtherExtension, mandatory=1, optional='invalid') myext.validate() + @raises(ValueError) + def test_duplicate_param_override(self): + class DuplicateParamExtension(MyBaseExtension): # pylint: disable=W0612 + parameters = [ + Parameter('food', override=True, default='cheese'), + Parameter('food', override=True, default='cheese'), + ] class ModuleTest(TestCase): @@ -340,4 +347,3 @@ class ModuleTest(TestCase): def _instantiate(cls, *args, **kwargs): # Needed to get around Extension's __init__ checks return cls(*args, **kwargs) -