[Checkins] SVN: megrok.jinja/trunk/ Initial import

Santiago Videla santiago.videla at gmail.com
Mon Apr 6 21:33:07 EDT 2009


Log message for revision 98958:
  Initial import
  
  

Changed:
  A   megrok.jinja/trunk/
  A   megrok.jinja/trunk/CHANGES.txt
  A   megrok.jinja/trunk/README.txt
  A   megrok.jinja/trunk/bootstrap.py
  A   megrok.jinja/trunk/buildout.cfg
  A   megrok.jinja/trunk/setup.py
  A   megrok.jinja/trunk/src/
  A   megrok.jinja/trunk/src/megrok/
  A   megrok.jinja/trunk/src/megrok/__init__.py
  A   megrok.jinja/trunk/src/megrok/jinja/
  A   megrok.jinja/trunk/src/megrok/jinja/README.txt
  A   megrok.jinja/trunk/src/megrok/jinja/__init__.py
  A   megrok.jinja/trunk/src/megrok/jinja/configure.zcml
  A   megrok.jinja/trunk/src/megrok/jinja/extensions.py
  A   megrok.jinja/trunk/src/megrok/jinja/factory.py
  A   megrok.jinja/trunk/src/megrok/jinja/ftesting.zcml
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/__init__.py
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/__init__.py
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n.py
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n_templates/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n_templates/nodomain.jinja
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n_templates/transtagtranslate.jinja
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n_templates/underscoretranslate.jinja
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/inline/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/inline/__init__.py
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/inline/test_inline.py
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/inline/test_inline_templates/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/inline/test_inline_templates/macros.jinja
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/locales/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/locales/mo/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/locales/po/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/locales/po/en/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/locales/po/en/test_domain.po
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/locales/po/es/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/locales/po/es/test_domain.po
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/__init__.py
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory.py
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/cavepainting.jinja
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/jsonview.json
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/macros.jinja
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/sayhi.jinja
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/test_functional.py

-=-
Added: megrok.jinja/trunk/CHANGES.txt
===================================================================
--- megrok.jinja/trunk/CHANGES.txt	                        (rev 0)
+++ megrok.jinja/trunk/CHANGES.txt	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,7 @@
+Changelog
+=========
+
+0.1 (unreleased)
+----------------
+
+Initial import.
\ No newline at end of file

Added: megrok.jinja/trunk/README.txt
===================================================================
--- megrok.jinja/trunk/README.txt	                        (rev 0)
+++ megrok.jinja/trunk/README.txt	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,4 @@
+Introduction
+============
+
+

Added: megrok.jinja/trunk/bootstrap.py
===================================================================
--- megrok.jinja/trunk/bootstrap.py	                        (rev 0)
+++ megrok.jinja/trunk/bootstrap.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,62 @@
+##############################################################################
+#
+# Copyright (c) 2006 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Bootstrap a buildout-based project
+
+Simply run this script in a directory containing a buildout.cfg.
+The script accepts buildout command-line options, so you can
+use the -c option to specify an alternate configuration file.
+
+$Id: bootstrap.py 85041 2008-03-31 15:57:30Z andreasjung $
+"""
+
+import os, shutil, sys, tempfile, urllib2
+
+tmpeggs = tempfile.mkdtemp()
+
+try:
+    import pkg_resources
+except ImportError:
+    ez = {}
+    exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py'
+                         ).read() in ez
+    ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)
+
+    import pkg_resources
+
+if sys.platform == 'win32':
+    def quote(c):
+        if ' ' in c:
+            return '"%s"' % c # work around spawn lamosity on windows
+        else:
+            return c
+else:
+    def quote (c):
+        return c
+
+cmd = 'from setuptools.command.easy_install import main; main()'
+ws  = pkg_resources.working_set
+assert os.spawnle(
+    os.P_WAIT, sys.executable, quote (sys.executable),
+    '-c', quote (cmd), '-mqNxd', quote (tmpeggs), 'zc.buildout',
+    dict(os.environ,
+         PYTHONPATH=
+         ws.find(pkg_resources.Requirement.parse('setuptools')).location
+         ),
+    ) == 0
+
+ws.add_entry(tmpeggs)
+ws.require('zc.buildout')
+import zc.buildout.buildout
+zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap'])
+shutil.rmtree(tmpeggs)

Added: megrok.jinja/trunk/buildout.cfg
===================================================================
--- megrok.jinja/trunk/buildout.cfg	                        (rev 0)
+++ megrok.jinja/trunk/buildout.cfg	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,20 @@
+[buildout]
+develop = .
+parts = interpreter test gettext
+extends = http://grok.zope.org/releaseinfo/grok-1.0a1.cfg
+versions = versions
+
+[interpreter]
+recipe = zc.recipe.egg
+eggs = megrok.jinja
+interpreter = python
+
+[test]
+recipe = zc.recipe.testrunner
+eggs = megrok.jinja
+defaults = ['--tests-pattern', '^f?tests$', '-v']
+
+[gettext]
+recipe = cc.gettext:msgfmt
+po_path = src/megrok/jinja/ftests/locales/po
+mo_path = src/megrok/jinja/ftests/locales/mo
\ No newline at end of file

Added: megrok.jinja/trunk/setup.py
===================================================================
--- megrok.jinja/trunk/setup.py	                        (rev 0)
+++ megrok.jinja/trunk/setup.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,43 @@
+from setuptools import setup, find_packages
+import os
+
+version = '0.1dev'
+
+long_description = (open('README.txt').read() +
+                    '\n\n' +
+                    open('CHANGES.txt').read())
+
+setup(name='megrok.jinja',
+      version=version,
+      description="Jinja2 templates integration in Grok",
+      long_description=long_description,
+      # Get more strings from http://www.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=['Development Status :: 3 - Alpha',
+                   'Environment :: Web Environment',
+                   'Intended Audience :: Developers',
+                   'License :: OSI Approved :: Zope Public License',
+                   'Programming Language :: Python :: 2.5',
+                   'Operating System :: OS Independent',
+                   'Topic :: Internet :: WWW/HTTP',
+                   ],
+      keywords='grok jinja2',
+      author='Santiago Videla',
+      author_email='santiago.videla at gmail.com',
+      url="http://svn.zope.org/megrok.jinja/",
+      license='ZPL',
+      packages=find_packages('src'),
+      package_dir = {'': 'src'},
+      namespace_packages=['megrok'],
+      include_package_data=True,
+      zip_safe=True,
+      install_requires=[
+          'setuptools',
+          'grok',
+          'Jinja2',
+          'simplejson',
+          'pyyaml'
+      ],
+      entry_points="""
+      # -*- Entry points: -*-
+      """,
+      )

Added: megrok.jinja/trunk/src/megrok/__init__.py
===================================================================
--- megrok.jinja/trunk/src/megrok/__init__.py	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/__init__.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,7 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)
+

Added: megrok.jinja/trunk/src/megrok/jinja/README.txt
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/README.txt	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/README.txt	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,3 @@
+To run the pymenthon.clients tests run:
+
+./bin/test --path ABSOLUTE/PATH/TO/pymenthon.clients/src

Added: megrok.jinja/trunk/src/megrok/jinja/__init__.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/__init__.py	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/__init__.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,13 @@
+##############################################################################
+#
+# Copyright (c) 2006-2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################

Added: megrok.jinja/trunk/src/megrok/jinja/configure.zcml
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/configure.zcml	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/configure.zcml	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,7 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:grok="http://namespaces.zope.org/grok">
+  <include package="grok" />
+  <includeDependencies package="." />
+  <grok:grok package="." />
+
+</configure>

Added: megrok.jinja/trunk/src/megrok/jinja/extensions.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/extensions.py	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/extensions.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,96 @@
+##############################################################################
+#
+# Copyright (c) 2006-2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
+from jinja2 import nodes
+from jinja2.ext import Extension, InternationalizationExtension
+from jinja2.utils import contextfunction
+from zope.component import getUtility
+from zope.i18n.interfaces import ITranslationDomain, IUserPreferredLanguages
+
+class DomainNotDefined(Exception):
+    def __str__(self):
+        return """
+    Domain translations it's required.
+    Use {% set i18n_domain='your-domain' %} in the top of your template."""
+
+ at contextfunction
+def translator(context, msg):
+    request = context.resolve('view').request
+    domain = context.resolve('i18n_domain')
+    if not domain:
+        raise DomainNotDefined
+
+    langs = IUserPreferredLanguages(request).getPreferredLanguages()
+
+    translation_domain = getUtility(ITranslationDomain, domain)
+
+    return translation_domain.translate(msg, target_language=langs[0])
+
+ at contextfunction
+def _translator_alias(context, string):
+    return context.resolve('gettext')(context, string)
+
+class i18nExtension(InternationalizationExtension):
+    """
+    Jinja2 extension based on the `InternationalizationExtension`
+    extension from jinja2.ext.
+    """
+    # We use the same tag that InternationalizationExtension
+    # in order to be able to reuse the parser method
+    tags = set(['trans'])
+
+    def __init__(self, environment):
+        Extension.__init__(self, environment)
+        environment.globals['_'] = _translator_alias
+        environment.extend(
+            install_gettext_translations=self._install,
+            install_null_translations=self._install_null,
+            uninstall_gettext_translations=self._uninstall,
+            extract_translations=self._extract
+        )
+
+    def _install(self):
+        """
+        We override this method to use a different translator
+        allowing dynamic domains using zope.i18n machinery.
+        """
+        self.environment.globals.update(gettext=translator)
+
+    def _make_node(self, singular, plural, variables, plural_expr):
+        """
+        This method it's called from the `parser` defined in
+        `jinja2.ext.InternationalizationExtension` class.
+
+        We need to override this method to handle the pluralize tag.
+        """
+
+        # singular only:
+        if plural_expr is None:
+            gettext = nodes.Name('gettext', 'load')
+            node = nodes.Call(gettext, [nodes.Const(singular)],
+                              [], None, None)
+
+        # singular and plural
+        else:
+            #TODO: implement {%pluralize%} tag.
+            raise NotImplementedError("{% pluralize %} was not implemented yet")
+
+        # mark the return value as safe if we are in an
+        # environment with autoescaping turned on
+        if self.environment.autoescape:
+            node = nodes.MarkSafe(node)
+
+        if variables:
+            node = nodes.Mod(node, variables)
+        return nodes.Output([node])

Added: megrok.jinja/trunk/src/megrok/jinja/factory.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/factory.py	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/factory.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,82 @@
+##############################################################################
+#
+# Copyright (c) 2006-2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
+from jinja2 import Environment, FileSystemLoader
+
+import yaml, simplejson, grok, os
+
+from grokcore.view.components import GrokTemplate
+from grokcore.view.interfaces import ITemplate, ITemplateFileFactory
+
+from extensions import i18nExtension
+
+# Create an Environment instance with the i18n extension
+# and the FileSystemLoader class loader that will look for
+# absolute path templates.
+# By default, auto_reload = True, for production system
+# should be set to False for higher performance
+env = Environment(extensions=[i18nExtension],
+                  loader=FileSystemLoader('/'))
+
+env.install_gettext_translations()
+
+
+class JTemplate(object):
+    """
+    Base class for JinjaTemplate and JsonTemplate
+    """
+    filepath = ''
+
+    @property
+    def template(self):
+        if self.filepath:
+            self._template = env.get_template(self.filepath)
+
+        return self._template
+
+    def setFromString(self, string):
+        self._template = env.from_string(string)
+
+    def setFromFilename(self, filename, _prefix=None):
+        self.filepath = os.path.join(_prefix, filename)
+
+class JsonTemplate(JTemplate, GrokTemplate):
+    grok.implements(ITemplate)
+
+    def render(self, view):
+        jinja_render = self.template.render(**self.getNamespace(view))
+        yaml_loader = yaml.load(jinja_render)
+        return simplejson.dumps(yaml_loader)
+
+class JsonTemplateFactory(grok.GlobalUtility):
+
+    grok.implements(ITemplateFileFactory)
+    grok.name('json')
+
+    def __call__(self, filename, _prefix=None):
+        return JsonTemplate(filename=filename, _prefix=_prefix)
+
+class JinjaTemplate(JTemplate, GrokTemplate):
+    grok.implements(ITemplate)
+
+    def render(self, view):
+        return self.template.render(**self.getNamespace(view))
+
+class JinjaTemplateFactory(grok.GlobalUtility):
+
+    grok.implements(ITemplateFileFactory)
+    grok.name('jinja')
+
+    def __call__(self, filename, _prefix=None):
+        return JinjaTemplate(filename=filename, _prefix=_prefix)

Added: megrok.jinja/trunk/src/megrok/jinja/ftesting.zcml
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftesting.zcml	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftesting.zcml	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,41 @@
+<configure
+   xmlns="http://namespaces.zope.org/zope"
+   xmlns:grok="http://namespaces.zope.org/grok"
+   xmlns:i18n="http://namespaces.zope.org/i18n"
+   i18n_domain="megrok.jinja.ftests"
+   package="megrok.jinja.ftests"
+   >
+
+  <include package="grok" />
+  <include package="megrok.jinja" />
+  <grok:grok package="megrok.jinja.ftests" />
+
+
+  <i18n:registerTranslations directory="locales/mo" />
+
+  <!-- Typical functional testing security setup -->
+  <securityPolicy
+      component="zope.securitypolicy.zopepolicy.ZopeSecurityPolicy"
+      />
+
+  <unauthenticatedPrincipal
+      id="zope.anybody"
+      title="Unauthenticated User"
+      />
+  <grant
+      permission="zope.View"
+      principal="zope.anybody"
+      />
+
+  <principal
+      id="zope.mgr"
+      title="Manager"
+      login="mgr"
+      password="mgrpw"
+      />
+
+  <role id="zope.Manager" title="Site Manager" />
+  <grantAll role="zope.Manager" />
+  <grant role="zope.Manager" principal="zope.mgr" />
+
+</configure>

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/__init__.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/__init__.py	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/__init__.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,13 @@
+##############################################################################
+#
+# Copyright (c) 2006-2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/__init__.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/__init__.py	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/__init__.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,13 @@
+##############################################################################
+#
+# Copyright (c) 2006-2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n.py	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,75 @@
+##############################################################################
+#
+# Copyright (c) 2006-2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
+"""
+  >>> from zope.publisher.browser import TestRequest
+  >>> from zope.component import getMultiAdapter
+
+Let's create a request instance asking for Spanish translations.
+We will set HTTP_ACCEPT_LANGUAGE to get the target_language. But
+note that the extension adapts the request instance to
+IUserPreferredLanguages. So, it's ok if you override this adapter
+to get the language from a cookie or whatever.::
+
+  >>> request = TestRequest(HTTP_ACCEPT_LANGUAGE = 'es')
+  >>> context = Context()
+
+Let's try the BreakLinesTranslate view. As we use the {% trans %} tag
+it's important to note that the break lines (\n) counts.
+If we use break lines in the tag body, the msgid in our
+.po file must use the same break lines.::
+
+  >>> view = getMultiAdapter((context, request), name='transtagtranslate')
+  >>> print view()
+  <BLANKLINE>
+  Probando la extension i18n en megrok.jinja.
+  Aca estamos usando la etiquera `trans`, por eso los saltos de linea.
+  <BLANKLINE>
+  <BLANKLINE>
+  Probando el tag `trans` de i18n sin saltos de linea.
+
+Most of the times it will be more comfortable to use the `_` function
+with some short msgid::
+
+  >>> view = getMultiAdapter((context, request), name='underscoretranslate')
+  >>> print view()
+  <BLANKLINE>
+  Probando la extension i18n en megrok.jinja usando la funcion `_`
+
+If we don't use {% set i18n_domain='some-domain' %} at the top
+of our template, an exception it's raised::
+
+  >>> view = getMultiAdapter((context, request), name='nodomain')
+  >>> print view()
+  Traceback (most recent call last):
+     ...
+  DomainNotDefined:
+      Domain translations it's required.
+      Use {% set i18n_domain='your-domain' %} in the top of your template.
+"""
+
+
+import grok
+
+class Context(grok.Context):
+    pass
+
+class TransTagTranslate(grok.View):
+    grok.context(Context)
+
+class UnderscoreTranslate(grok.View):
+    grok.context(Context)
+
+class NoDomain(grok.View):
+    grok.context(Context)

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n_templates/nodomain.jinja
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n_templates/nodomain.jinja	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n_templates/nodomain.jinja	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1 @@
+{% trans %}We will never see this message.{% endtrans %}
\ No newline at end of file

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n_templates/transtagtranslate.jinja
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n_templates/transtagtranslate.jinja	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n_templates/transtagtranslate.jinja	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,7 @@
+{% set i18n_domain='test_domain' %}
+{% trans %}
+Testing i18n extension in megrok.jinja.
+Here we are using `trans` tag, that's why the break lines.
+{% endtrans %}
+
+{% trans %}Testing i18n `trans` tag without breaklines.{% endtrans %}
\ No newline at end of file

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n_templates/underscoretranslate.jinja
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n_templates/underscoretranslate.jinja	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/i18n/test_i18n_templates/underscoretranslate.jinja	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,3 @@
+{% set i18n_domain='test_domain' %}
+
+{{ _('testing-underscore')}}

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/inline/__init__.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/inline/__init__.py	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/inline/__init__.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,13 @@
+##############################################################################
+#
+# Copyright (c) 2006-2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/inline/test_inline.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/inline/test_inline.py	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/inline/test_inline.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,99 @@
+##############################################################################
+#
+# Copyright (c) 2006-2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
+"""
+  >>> from zope.publisher.browser import TestRequest
+  >>> from zope.component import getMultiAdapter
+  >>> request = TestRequest()
+  >>> manfred = Mammoth()
+
+Let's get our first view that should render a plain text extending macros.jinja.
+
+  >>> view = getMultiAdapter((manfred, request), name='sayhi')
+  >>> print view()
+  Head content
+  <BLANKLINE>
+  GROK SAY HI!
+  <BLANKLINE>
+  Footer content
+
+We may want to set variables to use in the template
+
+  >>> view = getMultiAdapter((manfred, request), name='cavepainting')
+  >>> view()
+  u'GROK SAY: I LIKE BROWN COLOR'
+
+Let's see what happen with JSON templates. In the template we use
+YAML and Jinja2
+
+  >>> view = getMultiAdapter((manfred, request), name='jsonview')
+  >>> view()
+  '{"dicts": [{"key1": "some_text"}, {"k2": "val2", "k1": "val1"}]}'
+
+Note that the rendered text it's the result of simplejson.dumps
+See YAML documentation to learn how to say what you want
+
+"""
+
+
+import grok
+from zope.interface import Interface
+from megrok.jinja.factory import JinjaTemplate, JsonTemplate
+
+import os
+
+import megrok.jinja.ftests.inline as inline
+templates = os.path.join(os.path.dirname(inline.__file__),
+                         'test_inline_templates')
+class Mammoth(grok.Model):
+    pass
+
+class Macros(grok.View):
+    """
+    Templates that define blocks to be
+    extended must use a template file
+    """
+    grok.context(Mammoth)
+
+class SayHi(grok.View):
+    grok.context(Mammoth)
+
+    def update(self):
+        self.macros_tpl = "%s/macros.jinja" % templates
+
+sayhi = JinjaTemplate("""{% extends view.macros_tpl %}
+{% block main %}
+GROK SAY HI!
+{% endblock %}
+""")
+
+class CavePainting(grok.View):
+    grok.context(Mammoth)
+
+    def update(self):
+        self.color = 'BROWN'
+
+cavepainting = JinjaTemplate("GROK SAY: I LIKE {{ view.color }} COLOR")
+
+class JsonView(grok.View):
+    grok.context(Mammoth)
+
+    def update(self):
+        self.dict = {'k1' : 'val1', 'k2' : 'val2'}
+
+jsonview = JsonTemplate("""
+dicts :
+  - key1 : some_text
+  - {{ view.dict }}
+""")
\ No newline at end of file

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/inline/test_inline_templates/macros.jinja
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/inline/test_inline_templates/macros.jinja	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/inline/test_inline_templates/macros.jinja	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,5 @@
+Head content
+{% block main %}
+Main content
+{% endblock %}
+Footer content
\ No newline at end of file

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/locales/po/en/test_domain.po
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/locales/po/en/test_domain.po	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/locales/po/en/test_domain.po	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,16 @@
+# translation for tests
+# Santiago Videla, 2009
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: megrok.jinja\n"
+"POT-Creation-Date: 2009-03-26 23:16+ART\n"
+"PO-Revision-Date: 2009-03-26 23:16+ART\n"
+"Last-Translator: Santiago Videla <santiago.videla at gmail.com>\n"
+"Language-Team: Santiago Videla\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: pygettext.py 1.5\n"
+"Language-Code: en\n"
+

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/locales/po/es/test_domain.po
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/locales/po/es/test_domain.po	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/locales/po/es/test_domain.po	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,27 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: megrok.jinja\n"
+"POT-Creation-Date: 2009-03-26 23:16+ART\n"
+"PO-Revision-Date: 2009-03-26 23:16+ART\n"
+"Last-Translator: Santiago Videla <santiago.videla at gmail.com>\n"
+"Language-Team: Santiago Videla\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: pygettext.py 1.5\n"
+"Language-Code: es\n"
+
+msgid ""
+"\n"
+"Testing i18n extension in megrok.jinja.\n"
+"Here we are using `trans` tag, that's why the break lines.\n"
+msgstr ""
+"\n"
+"Probando la extension i18n en megrok.jinja.\n"
+"Aca estamos usando la etiquera `trans`, por eso los saltos de linea.\n"
+
+msgid "Testing i18n `trans` tag without breaklines."
+msgstr "Probando el tag `trans` de i18n sin saltos de linea."
+
+msgid "testing-underscore"
+msgstr "Probando la extension i18n en megrok.jinja usando la funcion `_`"

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/__init__.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/__init__.py	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/__init__.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,13 @@
+##############################################################################
+#
+# Copyright (c) 2006-2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory.py	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,81 @@
+##############################################################################
+#
+# Copyright (c) 2006-2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
+"""
+  >>> from zope.publisher.browser import TestRequest
+  >>> from zope.component import getMultiAdapter
+  >>> request = TestRequest()
+  >>> manfred = Mammoth()
+
+Let's get our first view that should render a plain text extending macros.jinja.
+
+  >>> view = getMultiAdapter((manfred, request), name='sayhi')
+  >>> print view()
+  Head content
+  <BLANKLINE>
+  GROK SAY HI!
+  <BLANKLINE>
+  Footer content
+
+
+We may want to set variables to use in the template
+
+  >>> view = getMultiAdapter((manfred, request), name='cavepainting')
+  >>> view()
+  u'GROK SAY: I LIKE BROWN COLOR'
+
+Let's see what happen with JSON templates. In the template we use
+YAML and Jinja2
+
+  >>> view = getMultiAdapter((manfred, request), name='jsonview')
+  >>> view()
+  '{"dicts": [{"key1": "some_text"}, {"key2": "Some Jinja2 expression"}, {"key-3": "whatever 3"}, {"key-4": "whatever 4"}, {"k2": "val2", "k1": "val1"}]}'
+
+Note that the rendered text it's the result of simplejson.dumps
+See YAML documentation to learn how to say what you want
+
+"""
+
+
+import grok
+from zope.interface import Interface
+import os
+
+import megrok.jinja.ftests.module_directory as moduledir
+templates = os.path.join(os.path.dirname(moduledir.__file__),
+                         'test_module_directory_templates')
+
+class Mammoth(grok.Model):
+    pass
+
+class Macros(grok.View):
+    grok.context(Mammoth)
+
+class SayHi(grok.View):
+    grok.context(Mammoth)
+
+    def update(self):
+        self.macros_tpl = "%s/macros.jinja" % templates
+
+class CavePainting(grok.View):
+    grok.context(Mammoth)
+
+    def update(self):
+        self.color = 'BROWN'
+
+class JsonView(grok.View):
+    grok.context(Mammoth)
+
+    def update(self):
+        self.dict = {'k1' : 'val1', 'k2' : 'val2'}

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/cavepainting.jinja
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/cavepainting.jinja	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/cavepainting.jinja	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1 @@
+GROK SAY: I LIKE {{ view.color }} COLOR
\ No newline at end of file

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/jsonview.json
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/jsonview.json	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/jsonview.json	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,10 @@
+#We are going to render a list of dictionaries
+dicts :
+   - key1 : some_text
+   - key2 : {{ 'Some Jinja2 expression' }}
+     {% set l = ['3','4'] %}
+     {% for v in l %}
+   - {{ 'key-' + v }} : whatever {{ v }}
+     {% endfor %}
+   - {{ view.dict }}
+

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/macros.jinja
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/macros.jinja	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/macros.jinja	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,5 @@
+Head content
+{% block main %}
+Main content
+{% endblock %}
+Footer content
\ No newline at end of file

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/sayhi.jinja
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/sayhi.jinja	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/module_directory/test_module_directory_templates/sayhi.jinja	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,4 @@
+{% extends view.macros_tpl %}
+{% block main %}
+GROK SAY HI!
+{% endblock %}

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/test_functional.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/test_functional.py	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/test_functional.py	2009-04-07 01:33:07 UTC (rev 98958)
@@ -0,0 +1,91 @@
+##############################################################################
+#
+# Copyright (c) 2006-2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
+import re
+import unittest
+import megrok.jinja
+import os.path
+
+from pkg_resources import resource_listdir
+from zope.testing import doctest, renormalizing
+from zope.app.testing.functional import (HTTPCaller, getRootFolder,
+                                         FunctionalTestSetup, sync, ZCMLLayer)
+
+ftesting_zcml = os.path.join(os.path.dirname(megrok.jinja.__file__), 'ftesting.zcml')
+FunctionalLayer = ZCMLLayer(ftesting_zcml, __name__, 'FunctionalLayer')
+
+def setUp(test):
+    FunctionalTestSetup().setUp()
+
+def tearDown(test):
+    FunctionalTestSetup().tearDown()
+
+checker = renormalizing.RENormalizing([
+    # Accommodate to exception wrapping in newer versions of mechanize
+    (re.compile(r'httperror_seek_wrapper:', re.M), 'HTTPError:'),
+    ])
+
+def http_call(method, path, data=None, **kw):
+    """Function to help make RESTful calls.
+
+    method - HTTP method to use
+    path - testbrowser style path
+    data - (body) data to submit
+    kw - any request parameters
+    """
+
+    if path.startswith('http://localhost'):
+        path = path[len('http://localhost'):]
+    request_string = '%s %s HTTP/1.1\n' % (method, path)
+    for key, value in kw.items():
+        request_string += '%s: %s\n' % (key, value)
+    if data is not None:
+        request_string += '\r\n'
+        request_string += data
+    return HTTPCaller()(request_string, handle_errors=False)
+
+def suiteFromPackage(name):
+    files = resource_listdir(__name__, name)
+    suite = unittest.TestSuite()
+    for filename in files:
+        if not filename.endswith('.py'):
+            continue
+        if filename == '__init__.py':
+            continue
+
+        dottedname = 'megrok.jinja.ftests.%s.%s' % (name, filename[:-3])
+        test = doctest.DocTestSuite(
+            dottedname, setUp=setUp, tearDown=tearDown,
+            checker=checker,
+            extraglobs=dict(http=HTTPCaller(),
+                            http_call=http_call,
+                            getRootFolder=getRootFolder,
+                            sync=sync),
+            optionflags=(doctest.ELLIPSIS+
+                         doctest.NORMALIZE_WHITESPACE+
+                         doctest.REPORT_NDIFF)
+            )
+        test.layer = FunctionalLayer
+
+        suite.addTest(test)
+    return suite
+
+def test_suite():
+    suite = unittest.TestSuite()
+    for name in ['module_directory', 'inline', 'i18n']:
+        suite.addTest(suiteFromPackage(name))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')



More information about the Checkins mailing list