Mercurial > genshi > genshi-test
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&noquickjump=1&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)