Merge pull request #96 from jayd3e/dict-is-too-liberal

Stricter checking for what is allowed as a Mapping object.
This commit is contained in:
Chris McDonough
2013-03-23 00:57:51 -07:00
2 changed files with 21 additions and 1 deletions

View File

@@ -510,7 +510,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}',

View File

@@ -529,10 +529,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)