summaryrefslogtreecommitdiffstats
path: root/ipalib/public.py
diff options
context:
space:
mode:
Diffstat (limited to 'ipalib/public.py')
-rw-r--r--ipalib/public.py434
1 files changed, 217 insertions, 217 deletions
diff --git a/ipalib/public.py b/ipalib/public.py
index 07f03ef83..6f7f21540 100644
--- a/ipalib/public.py
+++ b/ipalib/public.py
@@ -30,255 +30,255 @@ import errors
RULE_FLAG = 'validation_rule'
def rule(obj):
- assert not hasattr(obj, RULE_FLAG)
- setattr(obj, RULE_FLAG, True)
- return obj
+ assert not hasattr(obj, RULE_FLAG)
+ setattr(obj, RULE_FLAG, True)
+ return obj
def is_rule(obj):
- return callable(obj) and getattr(obj, RULE_FLAG, False) is True
+ return callable(obj) and getattr(obj, RULE_FLAG, False) is True
class option(object):
- """
- The option class represents a kw argument from a command.
- """
-
- __public__ = frozenset((
- 'normalize',
- 'validate',
- 'default',
- 'required',
- 'type',
- ))
- __rules = None
-
- # type = unicode, int, float # Set in subclass
-
- def normalize(self, value):
- """
- Returns the normalized form of `value`. If `value` cannot be
- normalized, NormalizationError is raised, which is a subclass of
- ValidationError.
-
- The base class implementation only does type coercion, but subclasses
- might do other normalization (e.g., a unicode option might strip
- leading and trailing white-space).
- """
- try:
- return self.type(value)
- except (TypeError, ValueError):
- raise errors.NormalizationError(
- self.__class__.__name__, value, self.type
- )
-
- def validate(self, value):
- """
- Calls each validation rule and if any rule fails, raises RuleError,
- which is a subclass of ValidationError.
- """
- for rule in self.rules:
- msg = rule(value)
- if msg is not None:
- raise errors.RuleError(
- self.__class__.__name__,
- value,
- rule,
- msg,
- )
-
- def __get_rules(self):
- """
- Returns the tuple of rule methods used for input validation. This
- tuple is lazily initialized the first time the property is accessed.
- """
- if self.__rules is None:
- self.__rules = tuple(sorted(
- self.__rules_iter(),
- key=lambda f: getattr(f, '__name__'),
- ))
- return self.__rules
- rules = property(__get_rules)
-
- def __rules_iter(self):
- """
- Iterates through the attributes in this instance to retrieve the
- methods implemented validation rules.
- """
- for name in dir(self.__class__):
- if name.startswith('_'):
- continue
- base_attr = getattr(self.__class__, name)
- if is_rule(base_attr):
- attr = getattr(self, name)
- if is_rule(attr):
- yield attr
-
- def default(self, **kw):
- """
- Returns a default or auto-completed value for this option. If no
- default is available, this method should return None.
- """
- return None
+ """
+ The option class represents a kw argument from a command.
+ """
+
+ __public__ = frozenset((
+ 'normalize',
+ 'validate',
+ 'default',
+ 'required',
+ 'type',
+ ))
+ __rules = None
+
+ # type = unicode, int, float # Set in subclass
+
+ def normalize(self, value):
+ """
+ Returns the normalized form of `value`. If `value` cannot be
+ normalized, NormalizationError is raised, which is a subclass of
+ ValidationError.
+
+ The base class implementation only does type coercion, but subclasses
+ might do other normalization (e.g., a unicode option might strip
+ leading and trailing white-space).
+ """
+ try:
+ return self.type(value)
+ except (TypeError, ValueError):
+ raise errors.NormalizationError(
+ self.__class__.__name__, value, self.type
+ )
+
+ def validate(self, value):
+ """
+ Calls each validation rule and if any rule fails, raises RuleError,
+ which is a subclass of ValidationError.
+ """
+ for rule in self.rules:
+ msg = rule(value)
+ if msg is not None:
+ raise errors.RuleError(
+ self.__class__.__name__,
+ value,
+ rule,
+ msg,
+ )
+
+ def __get_rules(self):
+ """
+ Returns the tuple of rule methods used for input validation. This
+ tuple is lazily initialized the first time the property is accessed.
+ """
+ if self.__rules is None:
+ self.__rules = tuple(sorted(
+ self.__rules_iter(),
+ key=lambda f: getattr(f, '__name__'),
+ ))
+ return self.__rules
+ rules = property(__get_rules)
+
+ def __rules_iter(self):
+ """
+ Iterates through the attributes in this instance to retrieve the
+ methods implemented validation rules.
+ """
+ for name in dir(self.__class__):
+ if name.startswith('_'):
+ continue
+ base_attr = getattr(self.__class__, name)
+ if is_rule(base_attr):
+ attr = getattr(self, name)
+ if is_rule(attr):
+ yield attr
+
+ def default(self, **kw):
+ """
+ Returns a default or auto-completed value for this option. If no
+ default is available, this method should return None.
+ """
+ return None
class cmd(plugable.Plugin):
- __public__ = frozenset((
- 'normalize',
- 'autofill',
- '__call__',
- 'get_doc',
- 'opt',
-
- ))
- __opt = None
-
- def get_doc(self, _):
- """
- Returns the gettext translated doc-string for this command.
-
- For example:
-
- >>> def get_doc(self, _):
- >>> return _('add new user')
- """
- raise NotImplementedError('%s.get_doc()' % self.name)
-
- def get_options(self):
- """
- Returns iterable with opt_proxy objects used to create the opt
- NameSpace when __get_opt() is called.
- """
- raise NotImplementedError('%s.get_options()' % self.name)
-
- def __get_opt(self):
- """
- Returns the NameSpace containing opt_proxy objects.
- """
- if self.__opt is None:
- self.__opt = plugable.NameSpace(self.get_options())
- return self.__opt
- opt = property(__get_opt)
-
- def normalize_iter(self, kw):
- for (key, value) in kw.items():
- if key in self.options:
- yield (
- key, self.options[key].normalize(value)
- )
- else:
- yield (key, value)
-
- def normalize(self, **kw):
- return dict(self.normalize_iter(kw))
-
- def validate(self, **kw):
- for (key, value) in kw.items():
- if key in self.options:
- self.options.validate(value)
-
- def default(self, **kw):
- for opt in self.options:
- if opt.name not in kw:
- value = opt.default(**kw)
- if value is not None:
- kw[opt.name] = value
-
- def __call__(self, **kw):
- (args, kw) = self.normalize(*args, **kw)
- (args, kw) = self.autofill(*args, **kw)
- self.validate(*args, **kw)
- self.execute(*args, **kw)
+ __public__ = frozenset((
+ 'normalize',
+ 'autofill',
+ '__call__',
+ 'get_doc',
+ 'opt',
+
+ ))
+ __opt = None
+
+ def get_doc(self, _):
+ """
+ Returns the gettext translated doc-string for this command.
+
+ For example:
+
+ >>> def get_doc(self, _):
+ >>> return _('add new user')
+ """
+ raise NotImplementedError('%s.get_doc()' % self.name)
+
+ def get_options(self):
+ """
+ Returns iterable with opt_proxy objects used to create the opt
+ NameSpace when __get_opt() is called.
+ """
+ raise NotImplementedError('%s.get_options()' % self.name)
+
+ def __get_opt(self):
+ """
+ Returns the NameSpace containing opt_proxy objects.
+ """
+ if self.__opt is None:
+ self.__opt = plugable.NameSpace(self.get_options())
+ return self.__opt
+ opt = property(__get_opt)
+
+ def normalize_iter(self, kw):
+ for (key, value) in kw.items():
+ if key in self.options:
+ yield (
+ key, self.options[key].normalize(value)
+ )
+ else:
+ yield (key, value)
+
+ def normalize(self, **kw):
+ return dict(self.normalize_iter(kw))
+
+ def validate(self, **kw):
+ for (key, value) in kw.items():
+ if key in self.options:
+ self.options.validate(value)
+
+ def default(self, **kw):
+ for opt in self.options:
+ if opt.name not in kw:
+ value = opt.default(**kw)
+ if value is not None:
+ kw[opt.name] = value
+
+ def __call__(self, **kw):
+ (args, kw) = self.normalize(*args, **kw)
+ (args, kw) = self.autofill(*args, **kw)
+ self.validate(*args, **kw)
+ self.execute(*args, **kw)
class obj(plugable.Plugin):
- __public__ = frozenset((
- 'mthd',
- 'prop',
- ))
- __mthd = None
- __prop = None
+ __public__ = frozenset((
+ 'mthd',
+ 'prop',
+ ))
+ __mthd = None
+ __prop = None
- def __get_mthd(self):
- return self.__mthd
- mthd = property(__get_mthd)
+ def __get_mthd(self):
+ return self.__mthd
+ mthd = property(__get_mthd)
- def __get_prop(self):
- return self.__prop
- prop = property(__get_prop)
+ def __get_prop(self):
+ return self.__prop
+ prop = property(__get_prop)
- def finalize(self, api):
- super(obj, self).finalize(api)
- self.__mthd = self.__create_ns('mthd')
- self.__prop = self.__create_ns('prop')
+ def finalize(self, api):
+ super(obj, self).finalize(api)
+ self.__mthd = self.__create_ns('mthd')
+ self.__prop = self.__create_ns('prop')
- def __create_ns(self, name):
- return plugable.NameSpace(self.__filter(name))
+ def __create_ns(self, name):
+ return plugable.NameSpace(self.__filter(name))
- def __filter(self, name):
- for i in getattr(self.api, name):
- if i.obj_name == self.name:
- yield i._clone('attr_name')
+ def __filter(self, name):
+ for i in getattr(self.api, name):
+ if i.obj_name == self.name:
+ yield i._clone('attr_name')
class attr(plugable.Plugin):
- __obj = None
+ __obj = None
- def __init__(self):
- m = re.match('^([a-z]+)_([a-z]+)$', self.__class__.__name__)
- assert m
- self.__obj_name = m.group(1)
- self.__attr_name = m.group(2)
+ def __init__(self):
+ m = re.match('^([a-z]+)_([a-z]+)$', self.__class__.__name__)
+ assert m
+ self.__obj_name = m.group(1)
+ self.__attr_name = m.group(2)
- def __get_obj_name(self):
- return self.__obj_name
- obj_name = property(__get_obj_name)
+ def __get_obj_name(self):
+ return self.__obj_name
+ obj_name = property(__get_obj_name)
- def __get_attr_name(self):
- return self.__attr_name
- attr_name = property(__get_attr_name)
+ def __get_attr_name(self):
+ return self.__attr_name
+ attr_name = property(__get_attr_name)
- def __get_obj(self):
- """
- Returns the obj instance this attribute is associated with, or None
- if no association has been set.
- """
- return self.__obj
- obj = property(__get_obj)
+ def __get_obj(self):
+ """
+ Returns the obj instance this attribute is associated with, or None
+ if no association has been set.
+ """
+ return self.__obj
+ obj = property(__get_obj)
- def finalize(self, api):
- super(attr, self).finalize(api)
- self.__obj = api.obj[self.obj_name]
+ def finalize(self, api):
+ super(attr, self).finalize(api)
+ self.__obj = api.obj[self.obj_name]
class mthd(attr, cmd):
- __public__ = frozenset((
- 'obj',
- 'obj_name',
- ))
+ __public__ = frozenset((
+ 'obj',
+ 'obj_name',
+ ))
class prop(attr):
- __public__ = frozenset((
- 'obj',
- 'obj_name',
- ))
+ __public__ = frozenset((
+ 'obj',
+ 'obj_name',
+ ))
- def get_doc(self, _):
- return _('prop doc')
+ def get_doc(self, _):
+ return _('prop doc')
class PublicAPI(plugable.API):
- __max_cmd_len = None
-
- def __init__(self):
- super(PublicAPI, self).__init__(cmd, obj, mthd, prop)
-
- def __get_max_cmd_len(self):
- if self.__max_cmd_len is None:
- if not hasattr(self, 'cmd'):
- return None
- max_cmd_len = max(len(str(cmd)) for cmd in self.cmd)
- object.__setattr__(self, '_PublicAPI__max_cmd_len', max_cmd_len)
- return self.__max_cmd_len
- max_cmd_len = property(__get_max_cmd_len)
+ __max_cmd_len = None
+
+ def __init__(self):
+ super(PublicAPI, self).__init__(cmd, obj, mthd, prop)
+
+ def __get_max_cmd_len(self):
+ if self.__max_cmd_len is None:
+ if not hasattr(self, 'cmd'):
+ return None
+ max_cmd_len = max(len(str(cmd)) for cmd in self.cmd)
+ object.__setattr__(self, '_PublicAPI__max_cmd_len', max_cmd_len)
+ return self.__max_cmd_len
+ max_cmd_len = property(__get_max_cmd_len)