diff options
author | R. Tyler Ballance <tyler@monkeypox.org> | 2009-10-16 15:15:08 -0700 |
---|---|---|
committer | R. Tyler Ballance <tyler@monkeypox.org> | 2009-10-18 16:23:49 -0700 |
commit | 87cb61133ea9f1b53b811d534e3fae73e41c5e9a (patch) | |
tree | d7d714a0f7d9f149f9a7a71f13653bc0396cce1b | |
parent | da10b2ff9e862c3e1307dc9add005ec9b22d455d (diff) | |
download | python-cheetah-87cb61133ea9f1b53b811d534e3fae73e41c5e9a.tar.gz |
Add Template.__unicode__() to return unicode() objects, while Template.__str__() returns encoded str() objects
Per my discussion in #cheetah on IRC with mikeb@ regarding the following issue:
https://bugzilla.redhat.com/show_bug.cgi?id=529332
This, in addition to recent patches to cheetah/DummyTransaction.py should alleviate
migration issues for users still passing a mishmash of unicode()/str() objects into
Templates. __str__() should return a str() object, whereas __unicode__() should
return a unicode() object.
No-op the EncodeUnicode filter when it encounters a unicode() object.
-rw-r--r-- | cheetah/Filters.py | 2 | ||||
-rw-r--r-- | cheetah/Template.py | 25 | ||||
-rw-r--r-- | cheetah/Tests/Unicode.py | 16 |
3 files changed, 41 insertions, 2 deletions
diff --git a/cheetah/Filters.py b/cheetah/Filters.py index dd65f28..452afc5 100644 --- a/cheetah/Filters.py +++ b/cheetah/Filters.py @@ -58,7 +58,7 @@ class EncodeUnicode(Filter): >>> print t """ if isinstance(val, unicode): - return val.encode(encoding) + return val if val is None: return '' return str(val) diff --git a/cheetah/Template.py b/cheetah/Template.py index a8889d2..ec92208 100644 --- a/cheetah/Template.py +++ b/cheetah/Template.py @@ -994,22 +994,45 @@ class Template(Servlet): mainMethName = getattr(concreteTemplateClass,mainMethNameAttr, None) if mainMethName: def __str__(self): + rc = getattr(self, mainMethName)() + if isinstance(rc, unicode): + return rc.encode('utf-8') + return rc + def __unicode__(self): return getattr(self, mainMethName)() elif (hasattr(concreteTemplateClass, 'respond') and concreteTemplateClass.respond!=Servlet.respond): def __str__(self): + rc = self.respond() + if isinstance(rc, unicode): + return rc.encode('utf-8') + return rc + def __unicode__(self): return self.respond() else: def __str__(self): + rc = None + if hasattr(self, mainMethNameAttr): + rc = getattr(self,mainMethNameAttr)() + elif hasattr(self, 'respond'): + rc = self.respond() + else: + rc = super(self.__class__, self).__str__() + if isinstance(rc, unicode): + return rc.encode('utf-8') + return rc + def __unicode__(self): if hasattr(self, mainMethNameAttr): return getattr(self,mainMethNameAttr)() elif hasattr(self, 'respond'): return self.respond() else: - return super(self.__class__, self).__str__() + return super(self.__class__, self).__unicode__() __str__ = new.instancemethod(__str__, None, concreteTemplateClass) + __unicode__ = new.instancemethod(__unicode__, None, concreteTemplateClass) setattr(concreteTemplateClass, '__str__', __str__) + setattr(concreteTemplateClass, '__unicode__', __unicode__) _addCheetahPlumbingCodeToClass = classmethod(_addCheetahPlumbingCodeToClass) diff --git a/cheetah/Tests/Unicode.py b/cheetah/Tests/Unicode.py index d627503..12c00ac 100644 --- a/cheetah/Tests/Unicode.py +++ b/cheetah/Tests/Unicode.py @@ -150,6 +150,22 @@ $someUnicodeString""" a = unicode(template).encode("utf-8") self.assertEquals("Bébé", a) +class EncodeUnicodeCompatTest(unittest.TestCase): + """ + Taken initially from Red Hat's bugzilla #529332 + https://bugzilla.redhat.com/show_bug.cgi?id=529332 + """ + def runTest(self): + t = Template("""Foo ${var}""", filter='EncodeUnicode') + t.var = u"Text with some non-ascii characters: åäö" + + rc = t.respond() + assert isinstance(rc, unicode), ('Template.respond() should return unicode', rc) + + rc = str(t) + assert isinstance(rc, str), ('Template.__str__() should return a UTF-8 encoded string', rc) + + class Unicode_in_SearchList_Test(CommandLineTest): def test_BasicASCII(self): source = '''This is $adjective''' |