diff options
-rw-r--r-- | ipalib/public.py | 20 | ||||
-rw-r--r-- | ipalib/tests/test_public.py | 20 |
2 files changed, 35 insertions, 5 deletions
diff --git a/ipalib/public.py b/ipalib/public.py index d1c4fa2a..88b08be5 100644 --- a/ipalib/public.py +++ b/ipalib/public.py @@ -46,13 +46,12 @@ class option(plugable.Plugin): __public__ = frozenset(( 'normalize', - 'validate', 'default', + 'validate', 'required', 'type', )) __rules = None - type = unicode required = False @@ -94,10 +93,11 @@ class option(plugable.Plugin): tuple is lazily initialized the first time the property is accessed. """ if self.__rules is None: - self.__rules = tuple(sorted( + rules = tuple(sorted( self.__rules_iter(), key=lambda f: getattr(f, '__name__'), )) + object.__setattr__(self, '_option__rules', rules) return self.__rules rules = property(__get_rules) @@ -132,6 +132,7 @@ class cmd(plugable.Plugin): 'normalize', 'default', 'validate', + 'execute', '__call__', 'get_doc', 'options', @@ -196,7 +197,18 @@ class cmd(plugable.Plugin): def validate(self, **kw): for (key, value) in kw.items(): if key in self.options: - self.options.validate(value) + self.options[key].validate(value) + + def execute(self, **kw) + pass + + def print_n_call(self, method, kw): + print '%s.%s(%s)' % ( + self.name, + method, + ' '.join('%s=%r' % (k, v) for (k, v) in kw.items()), + ) + getattr(self, method)(**kw) def __call__(self, **kw): kw = self.normalize(**kw) diff --git a/ipalib/tests/test_public.py b/ipalib/tests/test_public.py index 4f3d382f..81401859 100644 --- a/ipalib/tests/test_public.py +++ b/ipalib/tests/test_public.py @@ -170,7 +170,7 @@ class test_cmd(ClassChecker): @public.rule def my_rule(self, value): if value != self.name: - return 'must equal %s' % name + return 'must equal %r' % self.name def default(self, **kw): return kw['default_from'] @@ -249,6 +249,24 @@ class test_cmd(ClassChecker): assert sub.default(**no_fill) == {} assert sub.default(**fill) == default + def test_validate(self): + """ + Tests the `validate` method. + """ + assert 'validate' in self.cls.__public__ # Public + sub = self.subcls() + for name in ('option0', 'option1'): + okay = { + name: name, + 'another_option': 'some value', + } + fail = { + name: 'whatever', + 'another_option': 'some value', + } + sub.validate(**okay) + raises(errors.RuleError, sub.validate, **fail) + def test_obj(): cls = public.obj |