From 5dab4e22c27cbb71882137dab7c0764fdd279f50 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Wed, 26 Jan 2011 20:17:49 +0000 Subject: [PATCH] - Bug fix: if a ``title`` argument which is the empty string or ``None`` is passed explicitly to a SchemaNode, it is no longer replaced by a title computed from the name. --- CHANGES.txt | 4 ++++ colander/__init__.py | 9 ++++++--- colander/tests.py | 13 +++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 0a77702..a2d0e9d 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -7,6 +7,10 @@ Next release - New API: ``colander.required``. Used as the marker value when a ``missing`` argument is left unspecified. +- Bug fix: if a ``title`` argument which is the empty string or ``None`` is + passed explicitly to a SchemaNode, it is no longer replaced by a title + computed from the name. + 0.9.1 (2010-12-02) ------------------ diff --git a/colander/__init__.py b/colander/__init__.py index d4b243e..be99e86 100644 --- a/colander/__init__.py +++ b/colander/__init__.py @@ -1256,7 +1256,11 @@ class SchemaNode(object): self.default = kw.pop('default', null) self.missing = kw.pop('missing', required) self.name = kw.pop('name', '') - self.title = kw.pop('title', self.name.replace('_', ' ').title()) + self.raw_title = kw.pop('title', _marker) + if self.raw_title is _marker: + self.title = self.name.replace('_', ' ').title() + else: + self.title = self.raw_title self.description = kw.pop('description', '') self.widget = kw.pop('widget', None) self.after_bind = kw.pop('after_bind', None) @@ -1403,14 +1407,13 @@ class SchemaNode(object): self.name, ) - class _SchemaMeta(type): def __init__(cls, name, bases, clsattrs): nodes = [] for name, value in clsattrs.items(): if isinstance(value, SchemaNode): value.name = name - if not value.title: + if value.raw_title is _marker: value.title = name.replace('_', ' ').title() nodes.append((value._order, value)) cls.__schema_nodes__ = nodes diff --git a/colander/tests.py b/colander/tests.py index 22d1f5f..8929951 100644 --- a/colander/tests.py +++ b/colander/tests.py @@ -1608,6 +1608,19 @@ class TestSchema(unittest.TestCase): self.assertEqual(node.children[0].title, 'Thing A') self.assertEqual(node.children[1].title, 'bar') + def test_title_munging(self): + import colander + class MySchema(colander.Schema): + thing1 = colander.SchemaNode(colander.String()) + thing2 = colander.SchemaNode(colander.String(), title=None) + thing3 = colander.SchemaNode(colander.String(), title='') + thing4 = colander.SchemaNode(colander.String(), title='thing2') + node = MySchema() + self.assertEqual(node.children[0].title, 'Thing1') + self.assertEqual(node.children[1].title, None) + self.assertEqual(node.children[2].title, '') + self.assertEqual(node.children[3].title, 'thing2') + class TestSequenceSchema(unittest.TestCase): def test_succeed(self): import colander