227: check_type() and check_isinstance() now take arguments in (value, type_, name) order so the first two match the built-in isinstance() call signature

This commit is contained in:
Jason Gerard DeRose 2008-09-02 16:42:39 +00:00
parent 5af91df9a5
commit 6697b955ee
3 changed files with 65 additions and 62 deletions

View File

@ -23,17 +23,17 @@ All custom errors raised by `ipalib` package.
TYPE_FORMAT = '%s: need a %r; got %r' TYPE_FORMAT = '%s: need a %r; got %r'
def raise_TypeError(name, type_, value): def raise_TypeError(value, type_, name):
""" """
Raises a TypeError with a nicely formatted message and helpful attributes. Raises a TypeError with a nicely formatted message and helpful attributes.
The TypeError raised will have three custom attributes: The TypeError raised will have three custom attributes:
``name`` - The name (identifier) of the argument in question. ``value`` - The value (of incorrect type) passed as argument.
``type`` - The type expected for the argument. ``type`` - The type expected for the argument.
``value`` - The value (of incorrect type) passed as argument. ``name`` - The name (identifier) of the argument in question.
There is no edict that all TypeError should be raised with raise_TypeError, There is no edict that all TypeError should be raised with raise_TypeError,
but when it fits, use it... it makes the unit tests faster to write and but when it fits, use it... it makes the unit tests faster to write and
@ -48,40 +48,40 @@ def raise_TypeError(name, type_, value):
raise e raise e
TypeError: message: need a <type 'str'>; got u'Hello.' TypeError: message: need a <type 'str'>; got u'Hello.'
:param name: The name (identifier) of the argument in question. :param value: The value (of incorrect type) passed as argument.
:param type_: The type expected for the argument. :param type_: The type expected for the argument.
:param value: The value (of incorrect type) passed argument. :param name: The name (identifier) of the argument in question.
""" """
assert type(name) is str, TYPE_FORMAT % ('name', str, name)
assert type(type_) is type, TYPE_FORMAT % ('type_', type, type_) assert type(type_) is type, TYPE_FORMAT % ('type_', type, type_)
assert type(value) is not type_, 'value: %r is a %r' % (value, type_) assert type(value) is not type_, 'value: %r is a %r' % (value, type_)
assert type(name) is str, TYPE_FORMAT % ('name', str, name)
e = TypeError(TYPE_FORMAT % (name, type_, value)) e = TypeError(TYPE_FORMAT % (name, type_, value))
setattr(e, 'name', name)
setattr(e, 'type', type_)
setattr(e, 'value', value) setattr(e, 'value', value)
setattr(e, 'type', type_)
setattr(e, 'name', name)
raise e raise e
def check_type(name, type_, value, allow_None=False): def check_type(value, type_, name, allow_None=False):
assert type(name) is str, TYPE_FORMAT % ('name', str, name) assert type(name) is str, TYPE_FORMAT % ('name', str, name)
assert type(type_) is type, TYPE_FORMAT % ('type_', type, type_) assert type(type_) is type, TYPE_FORMAT % ('type_', type, type_)
assert type(allow_None) is bool, TYPE_FORMAT % ('allow_None', bool, allow_None) assert type(allow_None) is bool, TYPE_FORMAT % ('allow_None', bool, allow_None)
if value is None and allow_None: if value is None and allow_None:
return return
if type(value) is not type_: if type(value) is not type_:
raise_TypeError(name, type_, value) raise_TypeError(value, type_, name)
return value return value
def check_isinstance(name, type_, value, allow_None=False): def check_isinstance(value, type_, name, allow_None=False):
assert type(name) is str, TYPE_FORMAT % ('name', str, name)
assert type(type_) is type, TYPE_FORMAT % ('type_', type, type_) assert type(type_) is type, TYPE_FORMAT % ('type_', type, type_)
assert type(name) is str, TYPE_FORMAT % ('name', str, name)
assert type(allow_None) is bool, TYPE_FORMAT % ('allow_None', bool, allow_None) assert type(allow_None) is bool, TYPE_FORMAT % ('allow_None', bool, allow_None)
if value is None and allow_None: if value is None and allow_None:
return return
if not isinstance(value, type_): if not isinstance(value, type_):
raise_TypeError(name, type_, value) raise_TypeError(value, type_, name)
return value return value

View File

@ -27,11 +27,12 @@ from ipalib import errors
type_format = '%s: need a %r; got %r' type_format = '%s: need a %r; got %r'
def check_TypeError(f, name, type_, value, **kw):
e = raises(TypeError, f, name, type_, value, **kw) def check_TypeError(f, value, type_, name, **kw):
assert e.name is name e = raises(TypeError, f, value, type_, name, **kw)
assert e.type is type_
assert e.value is value assert e.value is value
assert e.type is type_
assert e.name is name
assert str(e) == type_format % (name, type_, value) assert str(e) == type_format % (name, type_, value)
@ -40,26 +41,26 @@ def test_raise_TypeError():
Tests the `errors.raise_TypeError` function. Tests the `errors.raise_TypeError` function.
""" """
f = errors.raise_TypeError f = errors.raise_TypeError
name = 'message'
type_ = unicode
value = 'Hello.' value = 'Hello.'
type_ = unicode
name = 'message'
check_TypeError(f, name, type_, value) check_TypeError(f, value, type_, name)
# name not an str: # name not an str
fail = 42 fail_name = 42
e = raises(AssertionError, f, fail, type_, value) e = raises(AssertionError, f, value, type_, fail_name)
assert str(e) == type_format % ('name', str, fail) assert str(e) == type_format % ('name', str, fail_name), str(e)
# type_ not a type: # type_ not a type:
fail = unicode() fail_type = unicode()
e = raises(AssertionError, f, name, fail, value) e = raises(AssertionError, f, value, fail_type, name)
assert str(e) == type_format % ('type_', type, fail) assert str(e) == type_format % ('type_', type, fail_type)
# type(value) is type_: # type(value) is type_:
fail = u'How are you?' fail_value = u'How are you?'
e = raises(AssertionError, f, name, type_, fail) e = raises(AssertionError, f, fail_value, type_, name)
assert str(e) == 'value: %r is a %r' % (fail, type_) assert str(e) == 'value: %r is a %r' % (fail_value, type_)
def test_check_type(): def test_check_type():
@ -67,32 +68,33 @@ def test_check_type():
Tests the `errors.check_type` function. Tests the `errors.check_type` function.
""" """
f = errors.check_type f = errors.check_type
name = 'greeting'
value = 'How are you?' value = 'How are you?'
type_ = str
name = 'greeting'
# Should pass: # Should pass:
assert value is f(name, str, value) assert value is f(value, type_, name)
assert None is f(name, str, None, allow_None=True) assert None is f(None, type_, name, allow_None=True)
# Should raise TypeError # Should raise TypeError
check_TypeError(f, name, str, None) check_TypeError(f, None, type_, name)
check_TypeError(f, name, basestring, value) check_TypeError(f, value, basestring, name)
check_TypeError(f, name, unicode, value) check_TypeError(f, value, unicode, name)
# name not an str # name not an str
fail = unicode(name) fail_name = unicode(name)
e = raises(AssertionError, f, fail, str, value) e = raises(AssertionError, f, value, type_, fail_name)
assert str(e) == type_format % ('name', str, fail) assert str(e) == type_format % ('name', str, fail_name)
# type_ not a type: # type_ not a type:
fail = 42 fail_type = 42
e = raises(AssertionError, f, name, fail, value) e = raises(AssertionError, f, value, fail_type, name)
assert str(e) == type_format % ('type_', type, fail) assert str(e) == type_format % ('type_', type, fail_type)
# allow_None not a bool: # allow_None not a bool:
fail = 0 fail_bool = 0
e = raises(AssertionError, f, name, str, value, allow_None=fail) e = raises(AssertionError, f, value, type_, name, allow_None=fail_bool)
assert str(e) == type_format % ('allow_None', bool, fail) assert str(e) == type_format % ('allow_None', bool, fail_bool)
def test_check_isinstance(): def test_check_isinstance():
@ -100,29 +102,30 @@ def test_check_isinstance():
Tests the `errors.check_isinstance` function. Tests the `errors.check_isinstance` function.
""" """
f = errors.check_isinstance f = errors.check_isinstance
name = 'greeting'
value = 'How are you?' value = 'How are you?'
type_ = str
name = 'greeting'
# Should pass: # Should pass:
assert value is f(name, str, value) assert value is f(value, type_, name)
assert value is f(name, basestring, value) assert value is f(value, basestring, name)
assert None is f(name, str, None, allow_None=True) assert None is f(None, type_, name, allow_None=True)
# Should raise TypeError # Should raise TypeError
check_TypeError(f, name, str, None) check_TypeError(f, None, type_, name)
check_TypeError(f, name, unicode, value) check_TypeError(f, value, unicode, name)
# name not an str # name not an str
fail = unicode(name) fail_name = unicode(name)
e = raises(AssertionError, f, fail, str, value) e = raises(AssertionError, f, value, type_, fail_name)
assert str(e) == type_format % ('name', str, fail) assert str(e) == type_format % ('name', str, fail_name)
# type_ not a type: # type_ not a type:
fail = 42 fail_type = 42
e = raises(AssertionError, f, name, fail, value) e = raises(AssertionError, f, value, fail_type, name)
assert str(e) == type_format % ('type_', type, fail) assert str(e) == type_format % ('type_', type, fail_type)
# allow_None not a bool: # allow_None not a bool:
fail = 0 fail_bool = 0
e = raises(AssertionError, f, name, str, value, allow_None=fail) e = raises(AssertionError, f, value, type_, name, allow_None=fail_bool)
assert str(e) == type_format % ('allow_None', bool, fail) assert str(e) == type_format % ('allow_None', bool, fail_bool)

View File

@ -117,8 +117,8 @@ class test_Option2(ClassChecker):
""" """
Tests the `public.Option2.__init__` method. Tests the `public.Option2.__init__` method.
""" """
name = 'sn', name = 'sn'
doc = 'Last Name', doc = 'Last Name'
type_ = ipa_types.Unicode() type_ = ipa_types.Unicode()
o = self.cls(name, doc, type_) o = self.cls(name, doc, type_)
assert o.__islocked__() is True assert o.__islocked__() is True