« Return to Thread: [PATCH 1/2] Add Template.__unicode__() to return unicode() objects, while Template.__str__() returns encoded str() objects

[PATCH 1/2] Add Template.__unicode__() to return unicode() objects, while Template.__str__() returns encoded str() objects

by R. Tyler Ballance :: Rate this Message:

Reply to Author | View in Thread

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.

Additionally, __str__() should return a str() object, whereas __unicode__() should
return a unicode() object.
---
 cheetah/Template.py      |   25 ++++++++++++++++++++++++-
 cheetah/Tests/Unicode.py |   16 ++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletions(-)

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'''
--
1.6.5



------------------------------------------------------------------------------
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay
ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference
_______________________________________________
Cheetahtemplate-discuss mailing list
Cheetahtemplate-discuss@...
https://lists.sourceforge.net/lists/listinfo/cheetahtemplate-discuss

 « Return to Thread: [PATCH 1/2] Add Template.__unicode__() to return unicode() objects, while Template.__str__() returns encoded str() objects