summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorR. Tyler Ballance <tyler@monkeypox.org>2009-10-24 17:47:38 -0700
committerR. Tyler Ballance <tyler@monkeypox.org>2009-10-24 17:47:38 -0700
commit62481b7d1d7ad698a05ffc35488b29f6b32df8e4 (patch)
treed98757358e3b2c340b344bb6d58dd7deba19b325
parent4c64fb2b00fb1121a42e48bcb53bac5f09841ee3 (diff)
parent7b1c2ad9f4e5830b5c88d95715014bb4044c090c (diff)
downloadpython-cheetah-maint.tar.gz
Merge branch 'master' into maintv2.3.0maint
-rw-r--r--CHANGES6
-rw-r--r--MANIFEST.in2
-rw-r--r--cheetah/Filters.py35
-rw-r--r--cheetah/Template.py25
-rw-r--r--cheetah/Tests/Unicode.py16
5 files changed, 52 insertions, 32 deletions
diff --git a/CHANGES b/CHANGES
index 46c0b0e..1aff910 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,13 +1,15 @@
-2.4.0 (October 15th, 2009)
+2.4.0 (October 24th, 2009)
- Fix a major performance regression in Template.__init__()
- More graceful handling of unicode when calling .respond() to render a template
- Minor code updates
+ - Update the default filter (thanks mikeb!)
-2.3.0 (October 15th, 2009) (loosely equivalent to 2.4.0)
+2.3.0 (October 24th, 2009) (loosely equivalent to 2.4.0)
- Fix a major performance regression in Template.__init__()
- More graceful handling of unicode when calling .respond() to render a template
- Minor code updates
+ - Update the default filter (thanks mikeb!)
2.2.2 (September 10th, 2009)
- Prevent _namemapper.c from segfaulting when PyImport_ImportModule fails for some reason (Bogdano Arendartchuk <debogdano@gmail.com>)
diff --git a/MANIFEST.in b/MANIFEST.in
index 266004d..f1d1938 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,4 +1,4 @@
-include MANIFEST.in *.py *.cfg TODO CHANGES LICENSE README examples docs bin
+include MANIFEST.in *.py *.cfg TODO CHANGES LICENSE README.markdown examples docs bin
recursive-include cheetah *.py *.tmpl *.txt
recursive-include bin *
recursive-include docs *
diff --git a/cheetah/Filters.py b/cheetah/Filters.py
index dd65f28..d452439 100644
--- a/cheetah/Filters.py
+++ b/cheetah/Filters.py
@@ -29,40 +29,19 @@ class Filter(object):
if val is None:
return u''
if isinstance(val, unicode):
- if encoding:
- return val.encode(encoding)
- else:
- return val
+ # ignore the encoding and return the unicode object
+ return val
else:
try:
- return str(val)
- except UnicodeEncodeError:
return unicode(val)
- return u''
+ except UnicodeDecodeError:
+ # we could put more fallbacks here, but we'll just pass the str
+ # on and let DummyTransaction worry about it
+ return str(val)
RawOrEncodedUnicode = Filter
-class EncodeUnicode(Filter):
- def filter(self, val,
- encoding='utf8',
- str=str,
- **kw):
- """Encode Unicode strings, by default in UTF-8.
-
- >>> import Cheetah.Template
- >>> t = Cheetah.Template.Template('''
- ... $myvar
- ... ${myvar, encoding='utf16'}
- ... ''', searchList=[{'myvar': u'Asni\xe8res'}],
- ... filter='EncodeUnicode')
- >>> print t
- """
- if isinstance(val, unicode):
- return val.encode(encoding)
- if val is None:
- return ''
- return str(val)
-
+EncodeUnicode = Filter
class Markdown(EncodeUnicode):
'''
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'''