GlobalObject serializes modules and classes to absolute import paths only

This commit is contained in:
jay.hennen
2017-04-18 16:43:03 -07:00
parent 1417eeb095
commit 396e06a49c
2 changed files with 43 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:
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

@@ -2096,6 +2096,43 @@ class TestGlobalObject(unittest.TestCase):
result = typ.serialize(node, colander.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)