Merge pull request #288 from jay-hennen/master
GlobalObject patched serialization
This commit is contained in:
@@ -9,6 +9,7 @@ import pprint
|
|||||||
import re
|
import re
|
||||||
import translationstring
|
import translationstring
|
||||||
import warnings
|
import warnings
|
||||||
|
import types
|
||||||
|
|
||||||
from .compat import (
|
from .compat import (
|
||||||
text_,
|
text_,
|
||||||
@@ -1578,7 +1579,11 @@ class GlobalObject(SchemaType):
|
|||||||
return null
|
return null
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return appstruct.__name__
|
if isinstance(appstruct, types.ModuleType):
|
||||||
|
return appstruct.__name__
|
||||||
|
else:
|
||||||
|
return '{0.__module__}.{0.__name__}'.format(appstruct)
|
||||||
|
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
raise Invalid(node,
|
raise Invalid(node,
|
||||||
_('"${val}" has no __name__',
|
_('"${val}" has no __name__',
|
||||||
|
@@ -2095,7 +2095,50 @@ class TestGlobalObject(unittest.TestCase):
|
|||||||
node = DummySchemaNode(None)
|
node = DummySchemaNode(None)
|
||||||
result = typ.serialize(node, colander.tests)
|
result = typ.serialize(node, colander.tests)
|
||||||
self.assertEqual(result, '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):
|
def test_serialize_fail(self):
|
||||||
typ = self._makeOne()
|
typ = self._makeOne()
|
||||||
node = DummySchemaNode(None)
|
node = DummySchemaNode(None)
|
||||||
|
Reference in New Issue
Block a user