diff genshi/filters/tests/i18n.py @ 916:872726bac135 experimental-py3k

add support for python 3 to genshi.filters: * minor changes to track encoding=None API change in core genshi modules. * renamed genshi/filters/tests/html.py to test_html.py to avoid clashes with Python 3 top-level html module when running tests subset. * did not rename genshi/filters/html.py. * i18n filters: * ugettext and friends are gone in Python 3 (and only gettext and friends exist and they now handle unicode) * Some \ line continuations inside doctests confused 2to3 and so were removed them. * Testing picked up a problem (already present in trunk) where Translator.__call__ could end up defining gettext as an endlessly recursive function. Noted with a TODO.
author hodgestar
date Sun, 24 Oct 2010 22:21:28 +0000
parents 85e4678337cf
children
line wrap: on
line diff
--- a/genshi/filters/tests/i18n.py
+++ b/genshi/filters/tests/i18n.py
@@ -14,13 +14,13 @@
 from datetime import datetime
 import doctest
 from gettext import NullTranslations
-from StringIO import StringIO
 import unittest
 
 from genshi.core import Attrs
 from genshi.template import MarkupTemplate, Context
 from genshi.filters.i18n import Translator, extract
 from genshi.input import HTML
+from genshi.compat import IS_PYTHON2, StringIO
 
 
 class DummyTranslations(NullTranslations):
@@ -39,17 +39,31 @@
     def _domain_call(self, func, domain, *args, **kwargs):
         return getattr(self._domains.get(domain, self), func)(*args, **kwargs)
 
-    def ugettext(self, message):
-        missing = object()
-        tmsg = self._catalog.get(message, missing)
-        if tmsg is missing:
-            if self._fallback:
-                return self._fallback.ugettext(message)
-            return unicode(message)
-        return tmsg
+    if IS_PYTHON2:
+        def ugettext(self, message):
+            missing = object()
+            tmsg = self._catalog.get(message, missing)
+            if tmsg is missing:
+                if self._fallback:
+                    return self._fallback.ugettext(message)
+                return unicode(message)
+            return tmsg
+    else:
+        def gettext(self, message):
+            missing = object()
+            tmsg = self._catalog.get(message, missing)
+            if tmsg is missing:
+                if self._fallback:
+                    return self._fallback.gettext(message)
+                return unicode(message)
+            return tmsg
 
-    def dugettext(self, domain, message):
-        return self._domain_call('ugettext', domain, message)
+    if IS_PYTHON2:
+        def dugettext(self, domain, message):
+            return self._domain_call('ugettext', domain, message)
+    else:
+        def dgettext(self, domain, message):
+            return self._domain_call('gettext', domain, message)
 
     def ungettext(self, msgid1, msgid2, n):
         try:
@@ -62,8 +76,16 @@
             else:
                 return msgid2
 
-    def dungettext(self, domain, singular, plural, numeral):
-        return self._domain_call('ungettext', domain, singular, plural, numeral)
+    if not IS_PYTHON2:
+        ngettext = ungettext
+        del ungettext
+
+    if IS_PYTHON2:
+        def dungettext(self, domain, singular, plural, numeral):
+            return self._domain_call('ungettext', domain, singular, plural, numeral)
+    else:
+        def dngettext(self, domain, singular, plural, numeral):
+            return self._domain_call('ngettext', domain, singular, plural, numeral)
 
 
 class TranslatorTestCase(unittest.TestCase):
@@ -72,7 +94,7 @@
         """
         Verify that translated attributes end up in a proper `Attrs` instance.
         """
-        html = HTML("""<html>
+        html = HTML(u"""<html>
           <span title="Foo"></span>
         </html>""")
         translator = Translator(lambda s: u"Voh")
@@ -218,9 +240,9 @@
         gettext = lambda s: u"Für Details siehe bitte [1:Hilfe]."
         translator = Translator(gettext)
         translator.setup(tmpl)
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           <p>Für Details siehe bitte <a href="help.html">Hilfe</a>.</p>
-        </html>""", tmpl.generate().render())
+        </html>""".encode('utf-8'), tmpl.generate().render(encoding='utf-8'))
 
     def test_extract_i18n_msg_nonewline(self):
         tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
@@ -241,7 +263,7 @@
         gettext = lambda s: u"Für Details siehe bitte [1:Hilfe]"
         translator = Translator(gettext)
         translator.setup(tmpl)
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           <p>Für Details siehe bitte <a href="help.html">Hilfe</a></p>
         </html>""", tmpl.generate().render())
 
@@ -264,9 +286,9 @@
         gettext = lambda s: u"Für Details siehe bitte [1:Hilfe]"
         translator = Translator(gettext)
         translator.setup(tmpl)
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           Für Details siehe bitte <a href="help.html">Hilfe</a>
-        </html>""", tmpl.generate().render())
+        </html>""".encode('utf-8'), tmpl.generate().render(encoding='utf-8'))
 
     def test_extract_i18n_msg_with_attributes(self):
         tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
@@ -394,7 +416,7 @@
         gettext = lambda s: u"Für Details siehe bitte [1:[2:Hilfeseite]]."
         translator = Translator(gettext)
         translator.setup(tmpl)
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           <p>Für Details siehe bitte <a href="help.html"><em>Hilfeseite</em></a>.</p>
         </html>""", tmpl.generate().render())
 
@@ -449,7 +471,7 @@
         gettext = lambda s: u"[1:] Einträge pro Seite anzeigen."
         translator = Translator(gettext)
         translator.setup(tmpl)
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           <p><input type="text" name="num"/> Einträge pro Seite anzeigen.</p>
         </html>""", tmpl.generate().render())
 
@@ -476,7 +498,7 @@
         gettext = lambda s: u"Für [2:Details] siehe bitte [1:Hilfe]."
         translator = Translator(gettext)
         translator.setup(tmpl)
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           <p>Für <em>Details</em> siehe bitte <a href="help.html">Hilfe</a>.</p>
         </html>""", tmpl.generate().render())
 
@@ -500,13 +522,13 @@
           <p i18n:msg="">
             Show me <input type="text" name="num" /> entries per page, starting at page <input type="text" name="num" />.
           </p>
-        </html>""")
+        </html>""", encoding='utf-8')
         gettext = lambda s: u"[1:] Einträge pro Seite, beginnend auf Seite [2:]."
         translator = Translator(gettext)
         translator.setup(tmpl)
-        self.assertEqual("""<html>
-          <p><input type="text" name="num"/> Eintr\xc3\xa4ge pro Seite, beginnend auf Seite <input type="text" name="num"/>.</p>
-        </html>""", tmpl.generate().render())
+        self.assertEqual(u"""<html>
+          <p><input type="text" name="num"/> Eintr\u00E4ge pro Seite, beginnend auf Seite <input type="text" name="num"/>.</p>
+        </html>""".encode('utf-8'), tmpl.generate().render(encoding='utf-8'))
 
     def test_extract_i18n_msg_with_param(self):
         tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
@@ -545,7 +567,7 @@
         gettext = lambda s: u"%(name)s, sei gegrüßt!"
         translator = Translator(gettext)
         translator.setup(tmpl)
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           <p>Jim, sei gegrüßt!</p>
         </html>""", tmpl.generate(user=dict(name='Jim')).render())
 
@@ -559,7 +581,7 @@
         gettext = lambda s: u"Sei gegrüßt, [1:Alter]!"
         translator = Translator(gettext)
         translator.setup(tmpl)
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           <p>Sei gegrüßt, <a href="#42">Alter</a>!</p>
         </html>""", tmpl.generate(anchor='42').render())
 
@@ -617,7 +639,7 @@
         gettext = lambda s: u"[1:] Einträge pro Seite anzeigen."
         translator = Translator(gettext)
         translator.setup(tmpl)
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           <p><input type="text" name="num" value="x"/> Einträge pro Seite anzeigen.</p>
         </html>""", tmpl.generate().render())
 
@@ -676,7 +698,7 @@
         }))
         tmpl.filters.insert(0, translator)
         tmpl.add_directives(Translator.NAMESPACE, translator)
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           <p title="Voh bär">Voh</p>
         </html>""", tmpl.generate().render())
 
@@ -720,9 +742,9 @@
         })
         translator = Translator(translations)
         translator.setup(tmpl)
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           Modificado à um dia por Pedro
-        </html>""", tmpl.generate(date='um dia', author="Pedro").render())
+        </html>""".encode('utf-8'), tmpl.generate(date='um dia', author="Pedro").render(encoding='utf-8'))
 
 
     def test_i18n_msg_ticket_251_extract(self):
@@ -749,9 +771,9 @@
         })
         translator = Translator(translations)
         translator.setup(tmpl)
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           <p><tt><b>Trandução[ 0 ]</b>: <em>Uma moeda</em></tt></p>
-        </html>""", tmpl.generate().render())
+        </html>""".encode('utf-8'), tmpl.generate().render(encoding='utf-8'))
 
     def test_extract_i18n_msg_with_other_directives_nested(self):
         tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
@@ -811,7 +833,7 @@
         self.assertEqual(1, len(messages))
         ctx = Context()
         ctx.push({'trac': {'homepage': 'http://trac.edgewall.org/'}})
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           <p>Antes de o fazer, porém,
             <strong>por favor tente <a href="http://trac.edgewall.org/search?ticket=yes&amp;noquickjump=1&amp;q=q">procurar</a>
             por problemas semelhantes</strong>, uma vez que é muito provável que este problema
@@ -846,11 +868,11 @@
             '[2:[3:trac.ini]]\n            and cannot be edited on this page.',
             messages[0][2]
         )
-        self.assertEqual("""<html>
+        self.assertEqual(u"""<html>
           <p class="hint"><strong>Nota:</strong> Este repositório está definido em
            <code><a href="href.wiki(TracIni)">trac.ini</a></code>
             e não pode ser editado nesta página.</p>
-        </html>""", tmpl.generate(editable=False).render())
+        </html>""".encode('utf-8'), tmpl.generate(editable=False).render(encoding='utf-8'))
 
     def test_extract_i18n_msg_with_py_strip(self):
         tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
@@ -1771,6 +1793,11 @@
             loader = TemplateLoader([dirname], callback=callback)
             tmpl = loader.load('tmpl10.html')
 
+            if IS_PYTHON2:
+                dgettext = translations.dugettext
+            else:
+                dgettext = translations.dgettext
+
             self.assertEqual("""<html>
                         <div>Included tmpl0</div>
                         <p title="foo_Bar 0">foo_Bar 0</p>
@@ -1797,7 +1824,7 @@
                         <p title="Voh">Voh 3</p>
                         <p title="Voh">Voh 3</p>
                 </html>""", tmpl.generate(idx=-1,
-                                          dg=translations.dugettext).render())
+                                          dg=dgettext).render())
         finally:
             shutil.rmtree(dirname)
 
Copyright (C) 2012-2017 Edgewall Software