From 8cc38e681f9caca838540511664337f964302f56 Mon Sep 17 00:00:00 2001 From: Jason Gerard DeRose Date: Tue, 13 Jan 2009 20:27:19 -0700 Subject: [PATCH] New Param: added new Flag param class and its unit test --- ipalib/parameter.py | 32 +++++++++++++++++++++++++++-- tests/test_ipalib/test_parameter.py | 28 +++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/ipalib/parameter.py b/ipalib/parameter.py index 7d70f40a8..31bd9db2b 100644 --- a/ipalib/parameter.py +++ b/ipalib/parameter.py @@ -219,6 +219,7 @@ class Param(ReadOnly): ('normalizer', callable, None), ('default_from', DefaultFrom, None), ('create_default', callable, None), + ('autofill', bool, False), ('flags', frozenset, frozenset()), # The 'default' kwarg gets appended in Param.__init__(): @@ -329,6 +330,17 @@ class Param(ReadOnly): **self.__kw ) + def __call__(self, value, **kw): + """ + One stop shopping. + """ + if value in NULLS: + value = self.get_default(**kw) + else: + value = self.convert(self.normalize(value)) + self.validate(value) + return value + def clone(self, **overrides): """ Return a new `Param` instance similar to this one. @@ -619,6 +631,20 @@ class Bool(Param): A parameter for boolean values (stored in the ``bool`` type). """ + type = bool + + +class Flag(Bool): + """ + A boolean parameter that always gets filled in with a default value. + + This `Bool` subclass forces ``autofill=True`` in `Flag.__init__()`. + """ + + def __init__(self, name, *rules, **kw): + kw['autofill'] = True + super(Flag, self).__init__(name, *rules, **kw) + class Int(Param): """ @@ -635,6 +661,7 @@ class Float(Param): """ type = float + type_error = _('must be a decimal number') class Bytes(Param): @@ -648,6 +675,7 @@ class Bytes(Param): """ type = str + type_error = _('must be binary data') kwargs = Param.kwargs + ( ('minlength', int, None), @@ -657,8 +685,8 @@ class Bytes(Param): ) - def __init__(self, name, **kw): - super(Bytes, self).__init__(name, **kw) + def __init__(self, name, *rules, **kw): + super(Bytes, self).__init__(name, *rules, **kw) if not ( self.length is None or diff --git a/tests/test_ipalib/test_parameter.py b/tests/test_ipalib/test_parameter.py index 8c4a93ab4..4a6fee55e 100644 --- a/tests/test_ipalib/test_parameter.py +++ b/tests/test_ipalib/test_parameter.py @@ -163,6 +163,7 @@ class test_Param(ClassChecker): assert o.default_from is None assert o.create_default is None assert o._get_default is None + assert o.autofill is False assert o.flags == frozenset() # Test that ValueError is raised when a kwarg from a subclass @@ -543,6 +544,33 @@ class test_Param(ClassChecker): assert o.normalizer.value is default +class test_Flag(ClassChecker): + """ + Test the `ipalib.parameter.Flag` class. + """ + _cls = parameter.Flag + + def test_init(self): + """ + Test the `ipalib.parameter.Flag.__init__` method. + """ + o = self.cls('my_flag') + assert o.type is bool + assert isinstance(o, parameter.Bool) + assert o.autofill is True + + # Test with autofill=False + o = self.cls('my_flag', autofill=False) + assert o.autofill is True + + # Test when cloning: + orig = self.cls('my_flag') + for clone in [orig.clone(), orig.clone(autofill=False)]: + assert clone.autofill is True + assert clone is not orig + assert type(clone) is self.cls + + class test_Bytes(ClassChecker): """ Test the `ipalib.parameter.Bytes` class.