Merge pull request #288 from jay-hennen/master

GlobalObject patched serialization
This commit is contained in:
Michael Merickel
2017-04-25 01:46:37 -05:00
committed by GitHub
2 changed files with 49 additions and 1 deletions

View File

@@ -9,6 +9,7 @@ import pprint
import re
import translationstring
import warnings
import types
from .compat import (
text_,
@@ -1578,7 +1579,11 @@ class GlobalObject(SchemaType):
return null
try:
return appstruct.__name__
if isinstance(appstruct, types.ModuleType):
return appstruct.__name__
else:
return '{0.__module__}.{0.__name__}'.format(appstruct)
except AttributeError:
raise Invalid(node,
_('"${val}" has no __name__',

View File

@@ -2095,7 +2095,50 @@ class TestGlobalObject(unittest.TestCase):
node = DummySchemaNode(None)
result = typ.serialize(node, colander.tests)
self.assertEqual(result, 'colander.tests')
from colander import tests
typ = self._makeOne()
node = DummySchemaNode(None)
result = typ.serialize(node, tests)
self.assertEqual(result, 'colander.tests')
def test_serialize_class(self):
cls = self.__class__
typ = self._makeOne()
node = DummySchemaNode(None)
result = typ.serialize(node, cls)
self.assertEqual(result, 'colander.tests.test_colander.TestGlobalObject')
def test_deserialize_class_ok(self):
import colander
names = (
'colander.tests.test_colander.TestGlobalObject',
'.tests.test_colander.TestGlobalObject',
)
typ = self._makeOne(colander)
node = DummySchemaNode(None)
for name in names:
result = typ.deserialize(node, name)
self.assertEqual(result, self.__class__)
names = ('.TestGlobalObject',)
typ = self._makeOne(colander.tests.test_colander)
node = DummySchemaNode(None)
for name in names:
result = typ.deserialize(node, name)
self.assertEqual(result, self.__class__)
def test_deserialize_class_fail(self):
import colander
names = ('.test_colander.TestGlobalObject',
'.TestGlobalObject')
typ = self._makeOne(colander)
node = DummySchemaNode(None)
for name in names:
e = invalid_exc(typ.deserialize, node, name)
self.assertEqual(e.msg.interpolate(),
'The dotted name "{0}" cannot be imported'.format(name))
def test_serialize_fail(self):
typ = self._makeOne()
node = DummySchemaNode(None)