From 7ccdf501940d76519355ddfdb49599c024e79b28 Mon Sep 17 00:00:00 2001 From: Joe Dallago Date: Tue, 19 Mar 2013 19:25:15 +0000 Subject: [PATCH] More strict checking for what is allowed as a Mapping object. --- colander/__init__.py | 5 ++++- colander/tests/test_colander.py | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/colander/__init__.py b/colander/__init__.py index e035c30..cbe5b03 100644 --- a/colander/__init__.py +++ b/colander/__init__.py @@ -500,7 +500,10 @@ class Mapping(SchemaType): def _validate(self, node, value): try: - return dict(value) + if hasattr(value, 'items'): + return dict(value) + else: + raise TypeError('Does not implement dict-like functionality.') except Exception as e: raise Invalid(node, _('"${val}" is not a mapping type: ${err}', diff --git a/colander/tests/test_colander.py b/colander/tests/test_colander.py index 127dce4..5d3d2a2 100644 --- a/colander/tests/test_colander.py +++ b/colander/tests/test_colander.py @@ -527,10 +527,27 @@ class TestMapping(unittest.TestCase): def test_deserialize_not_a_mapping(self): node = DummySchemaNode(None) typ = self._makeOne() + + # None e = invalid_exc(typ.deserialize, node, None) self.assertTrue( e.msg.interpolate().startswith('"None" is not a mapping type')) + # list + e = invalid_exc(typ.deserialize, node, []) + self.assertTrue( + e.msg.interpolate().startswith('"[]" is not a mapping type')) + + # str + e = invalid_exc(typ.deserialize, node, "") + self.assertTrue( + e.msg.interpolate().startswith('"" is not a mapping type')) + + # tuple + e = invalid_exc(typ.deserialize, node, ()) + self.assertTrue( + e.msg.interpolate().startswith('"()" is not a mapping type')) + def test_deserialize_null(self): import colander node = DummySchemaNode(None)