diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 3d91c5b..4f1d35e 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -137,3 +137,4 @@ Contributors - Steve Piercy, 2016/02/26 - Sergiu Bivol, 2016/04/23 - Denis Nasyrov, 2016/08/23 +- Gabriela Surita, 2017/01/31 diff --git a/colander/__init__.py b/colander/__init__.py index e308527..08f8446 100644 --- a/colander/__init__.py +++ b/colander/__init__.py @@ -2145,7 +2145,10 @@ class _SchemaNode(object): v = getattr(self, k) if isinstance(v, deferred): v = v(self, kw) - setattr(self, k, v) + if isinstance(v, SchemaNode): + self[k] = v + else: + setattr(self, k, v) if getattr(self, 'after_bind', None): self.after_bind(self, kw) diff --git a/colander/tests/test_colander.py b/colander/tests/test_colander.py index 03e87dc..8cda68c 100644 --- a/colander/tests/test_colander.py +++ b/colander/tests/test_colander.py @@ -3008,6 +3008,17 @@ class TestSchemaNodeSubclassing(unittest.TestCase): bound_node = node.bind() self.assertEqual(bound_node.deserialize(colander.null), 10) + def test_nodes_can_be_deffered(self): + import colander + class MySchema(colander.MappingSchema): + @colander.deferred + def child(node, kw): + return colander.SchemaNode(colander.String(), missing='foo') + + node = MySchema() + bound_node = node.bind() + self.assertEqual(bound_node.deserialize({}), {'child': 'foo'}) + def test_schema_child_names_conflict_with_value_names_notused(self): import colander class MyNode(colander.SchemaNode):