summaryrefslogtreecommitdiffstats
path: root/ipalib/public.py
diff options
context:
space:
mode:
Diffstat (limited to 'ipalib/public.py')
-rw-r--r--ipalib/public.py42
1 files changed, 25 insertions, 17 deletions
diff --git a/ipalib/public.py b/ipalib/public.py
index 72a08d7a..24d416c9 100644
--- a/ipalib/public.py
+++ b/ipalib/public.py
@@ -27,7 +27,7 @@ import inspect
import plugable
from plugable import lock, check_name
import errors
-from errors import check_type, check_isinstance
+from errors import check_type, check_isinstance, raise_TypeError
import ipa_types
@@ -105,28 +105,36 @@ class Option(plugable.ReadOnly):
self.rules = (type_.validate,) + rules
lock(self)
+ def __convert_scalar(self, value, position=None):
+ if value is None:
+ raise TypeError('value cannot be None')
+ converted = self.type(value)
+ if converted is None:
+ raise errors.ConversionError(
+ self.name, value, self.type, position
+ )
+ return converted
+
def convert(self, value):
if self.multivalue:
if type(value) in (tuple, list):
- return tuple(self.type(v) for v in value)
- return (self.type(value),)
- return self.type(value)
+ return tuple(
+ self.__convert_scalar(v, i) for (i, v) in enumerate(value)
+ )
+ return (self.__convert_scalar(value, 0),) # tuple
+ return self.__convert_scalar(value)
def __normalize_scalar(self, value):
- if value is None:
- return None
if type(value) is not self.type.type:
- raise TypeError('need a %r; got %r' % (self.type.type, value))
+ raise_TypeError(value, self.type.type, 'value')
return self.__normalize(value)
def normalize(self, value):
if self.__normalize is None:
return value
if self.multivalue:
- if value is None:
- return None
if type(value) is not tuple:
- raise TypeError('multivalue must be a tuple; got %r' % value)
+ raise_TypeError(value, tuple, 'value')
return tuple(self.__normalize_scalar(v) for v in value)
return self.__normalize_scalar(value)
@@ -137,6 +145,10 @@ class Option(plugable.ReadOnly):
raise errors.RuleError(self.name, value, rule, error)
def validate(self, value):
+ if value is None and self.required:
+ raise errors.RequirementError(self.name)
+ else:
+ return
if self.multivalue:
if type(value) is not tuple:
raise TypeError('multivalue must be a tuple; got %r' % value)
@@ -210,13 +222,9 @@ class Command(plugable.Plugin):
def validate(self, **kw):
self.print_call('validate', kw, 1)
- for option in self.Option():
- value = kw.get(option.name, None)
- if value is None:
- if option.required:
- raise errors.RequirementError(option.name)
- continue
- option.validate(value)
+ for (key, value) in kw.iteritems():
+ if key in self.Option:
+ self.Option[key].validate(value)
def execute(self, **kw):
self.print_call('execute', kw, 1)