summaryrefslogtreecommitdiffstats
path: root/ipalib/public.py
diff options
context:
space:
mode:
authorJason Gerard DeRose <jderose@redhat.com>2008-08-22 20:07:17 +0000
committerJason Gerard DeRose <jderose@redhat.com>2008-08-22 20:07:17 +0000
commitcad924168eebbb3618205651f8c7a30bf00fe47d (patch)
treec63af18b0da146606de2da2bd04d592857b32e60 /ipalib/public.py
parentb0ec8fe551bc5f454aa1babeab31a424fd8c9abe (diff)
downloadfreeipa.git-cad924168eebbb3618205651f8c7a30bf00fe47d.tar.gz
freeipa.git-cad924168eebbb3618205651f8c7a30bf00fe47d.tar.xz
freeipa.git-cad924168eebbb3618205651f8c7a30bf00fe47d.zip
183: Added public.DefaultFrom class; added corresponding unit tests
Diffstat (limited to 'ipalib/public.py')
-rw-r--r--ipalib/public.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/ipalib/public.py b/ipalib/public.py
index ff8bd8b0..19a678fb 100644
--- a/ipalib/public.py
+++ b/ipalib/public.py
@@ -25,6 +25,7 @@ and UI all use.
import re
import inspect
import plugable
+from plugable import lock
import errors
@@ -39,6 +40,26 @@ def is_rule(obj):
return callable(obj) and getattr(obj, RULE_FLAG, False) is True
+class DefaultFrom(plugable.ReadOnly):
+ def __init__(self, callback, *keys):
+ assert callable(callback), 'not a callable: %r' % callback
+ self.callback = callback
+ self.keys = keys
+ lock(self)
+
+ def __call__(self, **kw):
+ vals = tuple(kw.get(k, None) for k in self.keys)
+ if None in vals:
+ return None
+ try:
+ ret = self.callback(*vals)
+ except Exception:
+ return None
+ if isinstance(ret, basestring):
+ return ret
+ return None
+
+
class option(plugable.Plugin):
"""
The option class represents a kw argument from a command.