summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ipalib/public.py20
-rw-r--r--ipalib/tests/test_public.py20
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