From d9f59348057c5369b3be0531605a2deab255630d Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Thu, 23 Feb 2012 01:23:22 -0500 Subject: [PATCH] - ``name`` passed to a SchemaNode constructor was not respected in declaratively constructed schemas. Now if you pass ``name`` to the SchemaNode constructor within the body of a schema class, it will take precedence over the name it's been assigned to in the schema class. See https://github.com/Pylons/colander/issues/39 . Fixes #39. --- CHANGES.txt | 6 ++++++ colander/__init__.py | 3 ++- colander/tests/test_colander.py | 12 ++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index dfcc887..1deeca9 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -17,6 +17,12 @@ Next release - Invalid.messages() now returns an empty list if there are no messages. See https://github.com/Pylons/colander/pull/21 . +- ``name`` passed to a SchemaNode constructor was not respected in + declaratively constructed schemas. Now if you pass ``name`` to the + SchemaNode constructor within the body of a schema class, it will take + precedence over the name it's been assigned to in the schema class. + See https://github.com/Pylons/colander/issues/39 . + 0.9.6 (2012-02-14) ------------------ diff --git a/colander/__init__.py b/colander/__init__.py index d4f81a6..f13c0d4 100644 --- a/colander/__init__.py +++ b/colander/__init__.py @@ -1694,7 +1694,8 @@ class _SchemaMeta(type): nodes = [] for name, value in clsattrs.items(): if isinstance(value, SchemaNode): - value.name = name + if not value.name: + value.name = name if value.raw_title is _marker: value.title = name.replace('_', ' ').title() nodes.append((value._order, value)) diff --git a/colander/tests/test_colander.py b/colander/tests/test_colander.py index 9317caa..7482629 100644 --- a/colander/tests/test_colander.py +++ b/colander/tests/test_colander.py @@ -2102,6 +2102,18 @@ class TestSchemaNode(unittest.TestCase): self.assertEqual(len(outer_clone.children), 0) self.assertEqual(len(outer_node.children), 1) + def test_declarative_name_reassignment(self): + # see https://github.com/Pylons/colander/issues/39 + import colander + class FnordSchema(colander.Schema): + fnord = colander.SchemaNode( + colander.Sequence(), + colander.SchemaNode(colander.Integer(), name=''), + name="fnord[]" + ) + schema = FnordSchema() + self.assertEqual(schema['fnord[]'].name, 'fnord[]') + class TestDeferred(unittest.TestCase): def _makeOne(self, wrapped): from colander import deferred