[Checkins] SVN: megrok.chameleon/trunk/ Merge changes from chameleon-2.0 branch into trunk.

Uli Fouquet uli at gnufix.de
Mon Apr 11 11:34:42 EDT 2011


Log message for revision 121383:
  Merge changes from chameleon-2.0 branch into trunk.

Changed:
  U   megrok.chameleon/trunk/CHANGES.txt
  U   megrok.chameleon/trunk/buildout.cfg
  U   megrok.chameleon/trunk/setup.py
  U   megrok.chameleon/trunk/src/megrok/chameleon/README.txt
  U   megrok.chameleon/trunk/src/megrok/chameleon/components.py
  U   megrok.chameleon/trunk/src/megrok/chameleon/configure.zcml
  D   megrok.chameleon/trunk/src/megrok/chameleon/expressions.py
  D   megrok.chameleon/trunk/src/megrok/chameleon/namespaces.py
  U   megrok.chameleon/trunk/src/megrok/chameleon/tests/cpt_fixture/app_templates/food.cpt
  U   megrok.chameleon/trunk/src/megrok/chameleon/tests/cpt_fixture/app_templates/vars.cpt
  D   megrok.chameleon/trunk/src/megrok/chameleon/tests/genshi_fixture/

-=-
Modified: megrok.chameleon/trunk/CHANGES.txt
===================================================================
--- megrok.chameleon/trunk/CHANGES.txt	2011-04-11 13:37:44 UTC (rev 121382)
+++ megrok.chameleon/trunk/CHANGES.txt	2011-04-11 15:34:42 UTC (rev 121383)
@@ -1,7 +1,7 @@
 CHANGES
 *******
 
-0.5.2 (unreleased)
+1.0.0 (unreleased)
 ==================
 
 * ...

Modified: megrok.chameleon/trunk/buildout.cfg
===================================================================
--- megrok.chameleon/trunk/buildout.cfg	2011-04-11 13:37:44 UTC (rev 121382)
+++ megrok.chameleon/trunk/buildout.cfg	2011-04-11 15:34:42 UTC (rev 121383)
@@ -9,11 +9,10 @@
 extensions = buildout.dumppickedversions
 
 [versions]
-#zope.i18n = 3.5  # Only for tests with grok <= 1.0.
-sourcecodegen = 0.6.12
-Chameleon = 1.2.10
-docutils = 0.6
-lxml = 2.2.4
+Chameleon = 2.0-rc7
+ordereddict = 1.1
+unittest2 = 0.5.1
+z3c.pt = 2.0-rc1
 
 [interpreter]
 recipe = zc.recipe.egg

Modified: megrok.chameleon/trunk/setup.py
===================================================================
--- megrok.chameleon/trunk/setup.py	2011-04-11 13:37:44 UTC (rev 121382)
+++ megrok.chameleon/trunk/setup.py	2011-04-11 15:34:42 UTC (rev 121383)
@@ -1,21 +1,17 @@
 import os
 from setuptools import setup, find_packages
 
-version = '0.5.3dev'
+version = '1.0.0dev'
 
 install_requires = [
     'setuptools',
+    'grokcore.component',
     'grokcore.view',
-    'Chameleon',
-    'lxml', # Needed by chameleon.genshi
-    'zope.component',
-    'zope.contentprovider',
-    'zope.event',
-    'zope.traversing',
+    'Chameleon >= 2.0-rc1',
+    'z3c.pt >= 2.0-rc1',
     ]
 
 tests_require = [
-    'grokcore.component',
     'grokcore.viewlet',
     'zope.app.wsgi',
     'zope.app.zcmlfiles',

Modified: megrok.chameleon/trunk/src/megrok/chameleon/README.txt
===================================================================
--- megrok.chameleon/trunk/src/megrok/chameleon/README.txt	2011-04-11 13:37:44 UTC (rev 121382)
+++ megrok.chameleon/trunk/src/megrok/chameleon/README.txt	2011-04-11 15:34:42 UTC (rev 121383)
@@ -104,7 +104,6 @@
     <span tal:define="foo 'a FOO'">
     ${view.me_do()}
     <span tal:replace="structure view.me_do()" />
-    CSS-URL: ${static['test.css']()}
     My context is: ${view.url(context)}
     ${foo}
     <span tal:replace="foo" />
@@ -121,7 +120,6 @@
     <span>
     &lt;ME GROK EAT MAMMOTH!&gt;
     <ME GROK EAT MAMMOTH!>
-    CSS-URL: http://127.0.0.1/@@/megrok.chameleon.tests.cpt_fixture/test.css
     My context is: http://127.0.0.1/manfred
     a FOO
     a FOO
@@ -169,9 +167,6 @@
 * ``request``
     the current request
 
-* ``static`` 
-    the static dir of the application
-
 as we can see, when we look at the ``vars.cpt`` from our fixture:
 
     >>> cpt_file = os.path.join(template_dir, 'vars.cpt')
@@ -191,9 +186,6 @@
     <BLANKLINE>
       request (the current request):
        ${request}
-    <BLANKLINE>
-      static (the static dir of the application):
-       ${static}
     </body>
     </html>
 
@@ -206,7 +198,7 @@
     This template knows about the following vars:
     <BLANKLINE>
       template (the template instance):
-       &lt;vars template in ...vars.cpt&gt;
+       &lt;PageTemplateFile ...vars.cpt&gt;
     <BLANKLINE>
       view (the associated view):
        &lt;megrok.chameleon.tests.cpt_fixture.app.Vars object at 0x...&gt;
@@ -219,9 +211,6 @@
     GATEWAY_INTERFACE:	TestFooInterface/1.0
     HTTP_HOST:	127.0.0.1
     SERVER_URL:	http://127.0.0.1
-    <BLANKLINE>
-      static (the static dir of the application):
-       &lt;grokcore.view.components.DirectoryResource object at 0x...&gt;
     </body>
     </html>
 
@@ -350,8 +339,8 @@
         </div>
     <BLANKLINE>
         <!-- We support `not` -->
-        <div>False</div>
-        <div>False</div>
+        <div></div>
+        <div></div>
         <div>True</div>
         <div>True</div>
     <BLANKLINE>
@@ -466,161 +455,3 @@
   ``tal:content="view.value"``. Every occurence of TAL-expressions
   starting with ``python:`` now can be shortened by skipping this
   marker.
-
-Chameleon Genshi templates
-==========================
-
-Chameleon provides support for Genshi templates which can be used from
-grok writing templates with the ``.cg`` filename extension.
-
-Genshi text templates can be used with the ``.cgt`` filename
-extension.
-
-Note, that chameleon genshi templates might not cover the full range
-of functionality offered by native genshi parsers. Use `megrok.genshi`
-if you want native genshi support.
-
-See the `chameleon.genshi`_ page for more information.
-
-.. _chameleon.genshi: http://pypi.python.org/pypi/chameleon.genshi
-
-
-Prerequisites
--------------
-
-Before we can see the templates in action, we care for correct
-registration and set some used variables:
-
-    >>> import os
-    >>> testdir = os.path.join(os.path.dirname(__file__), 'tests')
-    >>> genshi_fixture = os.path.join(testdir, 'genshi_fixture')
-    >>> template_dir = os.path.join(genshi_fixture, 'app_templates')
-
-We register everything. Before we can grok our fixture, we have to
-grok the `megrok.chameleon` package. This way the new template types
-are registered with the framework:
-
-    >>> grokcore.view.testing.grok('megrok.chameleon')
-    >>> grokcore.view.testing.grok('megrok.chameleon.tests.genshi_fixture')
-
-We create a mammoth, which should provide us a bunch of Genshi driven
-views and put it in the database to setup location info:
-
-    >>> from megrok.chameleon.tests.genshi_fixture.app import Mammoth
-    >>> manfred = Mammoth()
-    >>> getRootFolder()['manfred'] = manfred
-
-Furthermore we prepare for getting the different views on manfred:
-
-    >>> from zope.publisher.browser import TestRequest
-    >>> from zope.component import getMultiAdapter
-    >>> request = TestRequest()
-
-
-Simple templates
-----------------
-
-We prepared a plain cavepainting view. The template looks like this:
-
-    >>> cavepainting_cg = os.path.join(template_dir, 'cavepainting.cg')
-    >>> print open(cavepainting_cg, 'rb').read()
-    <html>
-      <body>
-        A cave painting.
-      </body>
-    </html>
-
-The rendered view looks like this:
-
-    >>> view = getMultiAdapter((manfred, request),
-    ...                         name='cavepainting')
-    >>> print view()
-    <html>
-      <body>
-        A cave painting.
-      </body>
-    </html>
-
-
-Substituting variables
-----------------------
-
-A template can access variables like ``view``, ``context`` and its
-methods and attributes. The ``food`` view does exactly this. The
-template looks like this:
-
-    >>> food_cg = os.path.join(template_dir, 'food.cg')
-    >>> print open(food_cg, 'rb').read()
-    <html>
-    <body>
-    ${view.me_do()}
-    CSS-URL: ${static['test.css']()}
-    My context is: ${view.url(context)}
-    </body>
-    </html>
-
-The rendered view looks like this:
-
-    >>> view = getMultiAdapter((manfred, request), name='food')
-    >>> print view()
-    <html>
-    <body>
-    ME GROK EAT MAMMOTH!
-    CSS-URL: http://127.0.0.1/@@/megrok.chameleon.tests.genshi_fixture/test.css
-    My context is: http://127.0.0.1/manfred
-    </body>
-    </html>
-
-
-Including other templates
--------------------------
-
-With genshi support we can also include other templates. The
-``gatherer`` view looks like this:
-
-    >>> gatherer_cg = os.path.join(template_dir, 'gatherer.cg')
-    >>> print open(gatherer_cg, 'rb').read()
-    <html xmlns:xi="http://www.w3.org/2001/XInclude">
-    <body>
-    ME GROK GATHER BERRIES!
-    <xi:include href="berries.cg"/>
-    </body>
-    </html>
-
-Apparently here we include a template called ``berries.cg``. It looks
-like this:
-
-    >>> berries_cg = os.path.join(template_dir, 'berries.cg')
-    >>> print open(berries_cg, 'rb').read()
-    <strong>Lovely blueberries!</strong>
-
-
-When we render the former template, we get:
-
-    >>> view = getMultiAdapter((manfred, request), name='gatherer')
-    >>> print view()
-    <html>
-    <body>
-    ME GROK GATHER BERRIES!
-    <strong>Lovely blueberries!</strong>
-    </body>
-    </html>
-
-Text templates
---------------
-
-Also genshi text templates are supported. We have a template that
-looks like so:
-
-    >>> hunter_cgt = os.path.join(template_dir, 'hunter.cgt')
-    >>> print open(hunter_cgt, 'rb').read()
-    ME GROK HUNT ${view.game}!
-
-Note, that this template has the ``.cgt`` (= **c**\ ameleon **g**\ enshi
-**t**\ ext template) file extension.
-
-If we render it, all expressions are substituted:
-
-    >>> view = getMultiAdapter((manfred, request), name='hunter')
-    >>> print view()
-    ME GROK HUNT MAMMOTH!!

Modified: megrok.chameleon/trunk/src/megrok/chameleon/components.py
===================================================================
--- megrok.chameleon/trunk/src/megrok/chameleon/components.py	2011-04-11 13:37:44 UTC (rev 121382)
+++ megrok.chameleon/trunk/src/megrok/chameleon/components.py	2011-04-11 15:34:42 UTC (rev 121383)
@@ -13,17 +13,20 @@
 ##############################################################################
 """Chameleon page template components"""
 import os
-from chameleon.zpt.template import PageTemplateFile, PageTemplate
-from chameleon.genshi.template import (GenshiTemplateFile, GenshiTemplate,
-                                       GenshiTextTemplateFile,
-                                       GenshiTextTemplate)
 from grokcore.component import GlobalUtility, implements, name
 from grokcore.view import interfaces
 from grokcore.view.components import GrokTemplate
+from z3c.pt.pagetemplate import ViewPageTemplate, ViewPageTemplateFile
 
 #
 # Chameleon Zope Page Templates...
 #
+class PageTemplate(ViewPageTemplate):
+    default_expression = 'python'
+
+class PageTemplateFile(ViewPageTemplateFile):
+    default_expression = 'python'
+    
 class ChameleonPageTemplate(GrokTemplate):
 
     def setFromString(self, string):
@@ -46,8 +49,8 @@
         namespace = super(ChameleonPageTemplate, self).getNamespace(view)
         namespace.update(dict(
                 template=self,
-                nothing=None,
-                ))                
+                _ob=view, # z3c.pt expects this strange key for the view
+                ))
         return namespace
 
     @property
@@ -63,60 +66,3 @@
 
     def __call__(self, filename, _prefix=None):
         return ChameleonPageTemplate(filename=filename, _prefix=_prefix)
-
-#
-# Chameleon Genshi Templates
-#
-class ChameleonGenshiTemplate(GrokTemplate):
-    filename = None
-    _format = None
-
-    def setFromString(self, string):
-        self._filename = None
-        self._template = GenshiTemplate(string, format=self._format)
-
-    def setFromFilename(self, filename, _prefix=None):
-        self._filename = filename
-        self._prefix = _prefix
-        self._template = GenshiTemplateFile(
-            os.path.join(_prefix, filename), format=self._format)
-        return
-
-    def render(self, view):
-        if self._filename is not None:
-            self.setFromFilename(self._filename, self._prefix)
-        return self._template(**self.getNamespace(view))
-
-class ChameleonGenshiTemplateFactory(GlobalUtility):
-    implements(interfaces.ITemplateFileFactory)
-    name('cg')
-
-    def __call__(self, filename, _prefix=None):
-        return ChameleonGenshiTemplate(filename=filename, _prefix=_prefix)
-
-
-class ChameleonGenshiTextTemplate(GrokTemplate):
-    filename = None
-
-    def setFromString(self, string):
-        self._filename = None
-        self._template = GenshiTextTemplate(string)
-
-    def setFromFilename(self, filename, _prefix=None):
-        self._filename = filename
-        self._prefix = _prefix
-        self._template = GenshiTextTemplateFile(
-            os.path.join(_prefix, filename))
-        return
-
-    def render(self, view):
-        if self._filename is not None:
-            self.setFromFilename(self._filename, self._prefix)
-        return self._template(**self.getNamespace(view))
-
-class ChameleonGenshiTextTemplateFactory(GlobalUtility):
-    implements(interfaces.ITemplateFileFactory)
-    name('cgt')
-
-    def __call__(self, filename, _prefix=None):
-        return ChameleonGenshiTextTemplate(filename=filename, _prefix=_prefix)

Modified: megrok.chameleon/trunk/src/megrok/chameleon/configure.zcml
===================================================================
--- megrok.chameleon/trunk/src/megrok/chameleon/configure.zcml	2011-04-11 13:37:44 UTC (rev 121382)
+++ megrok.chameleon/trunk/src/megrok/chameleon/configure.zcml	2011-04-11 15:34:42 UTC (rev 121383)
@@ -4,6 +4,7 @@
 
   <include package="grokcore.view" file="meta-minimal.zcml" />
   <include package="grokcore.view" />
+  <include package="z3c.pt" />
   <grok:grok package="." />
 
 </configure>

Deleted: megrok.chameleon/trunk/src/megrok/chameleon/expressions.py
===================================================================
--- megrok.chameleon/trunk/src/megrok/chameleon/expressions.py	2011-04-11 13:37:44 UTC (rev 121382)
+++ megrok.chameleon/trunk/src/megrok/chameleon/expressions.py	2011-04-11 15:34:42 UTC (rev 121383)
@@ -1,312 +0,0 @@
-import grokcore.component as grok
-import re
-import zope.event
-
-from zope.traversing.adapters import traversePathElement
-from zope.contentprovider.interfaces import IContentProvider
-from zope.contentprovider.interfaces import ContentProviderLookupError
-from zope.traversing.interfaces import ITraversable
-
-try:
-    from zope.contentprovider.interfaces import BeforeUpdateEvent
-except ImportError:
-    BeforeUpdateEvent = None
-
-from chameleon.core import types
-from chameleon.zpt import expressions
-from chameleon.zpt.interfaces import IExpressionTranslator
-
-from megrok.chameleon import namespaces
-
-
-_marker = object()
-_valid_name = re.compile(r"[a-zA-Z][a-zA-Z0-9_]*$").match
-
-def identity(x):
-    return x
-
-class ContentProviderTraverser(object):
-    def __call__(self, context, request, view, name):
-        cp = zope.component.queryMultiAdapter(
-            (context, request, view), IContentProvider, name=name)
-
-        # provide a useful error message, if the provider was not found.
-        if cp is None:
-            raise ContentProviderLookupError(name)
-
-        if BeforeUpdateEvent is not None:
-            zope.event.notify(BeforeUpdateEvent(cp, request))
-        cp.update()
-        return cp.render()
-
-class ZopeTraverser(object):
-    def __init__(self, proxify=identity):
-        self.proxify = proxify
-
-    def __call__(self, base, request, call, *path_items):
-        """See ``zope.app.pagetemplate.engine``."""
-
-        if bool(path_items):
-            path_items = list(path_items)
-            path_items.reverse()
-
-            while len(path_items):
-                name = path_items.pop()
-                ns = ':' in name
-                if ns is True:
-                    namespace, name = name.split(':', 1)
-                    base = namespaces.function_namespaces[namespace](base)
-                    if ITraversable.providedBy(base):
-                        base = self.proxify(traversePathElement(
-                            base, name, path_items, request=request))
-                        continue
-
-                # special-case dicts for performance reasons
-                if isinstance(base, dict):
-                    next = base.get(name, _marker)
-                else:
-                    next = getattr(base, name, _marker)
-
-                if next is not _marker:
-                    base = next
-                    if ns is True and isinstance(base, types.MethodType):
-                        base = base()
-                    continue
-                else:
-                    base = traversePathElement(
-                        base, name, path_items, request=request)
-
-                if not isinstance(base, (basestring, tuple, list)):
-                    base = self.proxify(base)
-
-        if call and getattr(base, '__call__', _marker) is not _marker:
-            return base()
-
-        return base
-
-class ZopeExistsTraverser(ZopeTraverser):
-    exceptions = AttributeError, LookupError, TypeError
-
-    def __call__(self, base, request, call, *args, **kwargs):
-        try:
-            return ZopeTraverser.__call__(
-                self, base, request, False, *args, **kwargs) is not None
-        except self.exceptions:
-            return False
-        return True
-
-class PathTranslator(expressions.ExpressionTranslator):
-    path_regex = re.compile(
-        r'^((nocall|not):\s*)*([A-Za-z_][A-Za-z0-9_:]*)'+
-        r'(/[?A-Za-z_@\-+][?A-Za-z0-9_@\-\.+/:]*)*$')
-
-    interpolation_regex = re.compile(
-        r'\?[A-Za-z][A-Za-z0-9_]+')
-
-    path_traverse = ZopeTraverser()
-    scope = 'request'
-
-    symbol = '_path'
-
-    def translate(self, string, escape=None):
-        """
-        >>> translate = PathTranslator().translate
-
-        >>> translate("") is None
-        True
-
-        >>> translate("nocall: a")
-        value('a')
-
-        >>> translate("nothing")
-        value('None')
-
-        >>> translate("a/b")
-        value("_path(a, request, True, 'b')")
-
-        Verify allowed character set.
-
-        >>> translate("image_path/++res++/@@hello.html")
-        value("_path(image_path, request, True, '++res++', '@@hello.html')")
-
-        >>> translate("context/@@view")
-        value("_path(context, request, True, '@@view')")
-
-        >>> translate("nocall: context/@@view")
-        value("_path(context, request, False, '@@view')")
-
-        >>> translate("context/?view")
-        value("_path(context, request, True, '%s' % (view,))")
-
-        >>> translate("context/@@?view")
-        value("_path(context, request, True, '@@%s' % (view,))")
-        """
-
-        if not string:
-            return None
-
-        if not self.path_regex.match(string.strip()):
-            raise SyntaxError("Not a valid path-expression: %s." % string)
-
-        nocall = False
-
-        while string:
-            m = self.re_pragma.match(string)
-            if m is None:
-                break
-
-            string = string[m.end():]
-            pragma = m.group('pragma').lower()
-
-            if pragma == 'nocall':
-                nocall = True
-            else:
-                raise ValueError("Invalid pragma: %s" % pragma)
-
-        parts = string.strip().split('/')
-
-        # map 'nothing' to 'None'
-        parts = map(lambda part: part == 'nothing' and 'None' or part, parts)
-
-        components = []
-        for part in parts[1:]:
-            interpolation_args = []
-
-            def replace(match):
-                start, end = match.span()
-                interpolation_args.append(
-                    part[start+1:end])
-                return "%s"
-
-            while True:
-                part, count = self.interpolation_regex.subn(replace, part)
-                if count == 0:
-                    break
-
-            if len(interpolation_args):
-                component = "%s %% (%s,)" % (
-                    repr(part), ", ".join(interpolation_args))
-            else:
-                component = repr(str(part))
-
-            components.append(component)
-
-        base = parts[0]
-
-        if not components:
-            if len(parts) == 1 and (nocall or base == 'None'):
-                value = types.value('%s' % base)
-                return value
-            else:
-                components = ()
-
-        value = types.value(
-            '%s(%s, %s, %s, %s)' % \
-            (self.symbol, base, self.scope, not nocall, ', '.join(components)))
-
-        value.symbol_mapping[self.symbol] = self.path_traverse
-
-        return value
-
-
-class NotTranslator(expressions.ExpressionTranslator, grok.Adapter):
-    grok.name('not')
-    grok.context(IExpressionTranslator)
-    grok.provides(IExpressionTranslator)
-
-    recursive = True
-
-    def __init__(self, translator):
-        self.translator = translator
-
-    def tales(self, string, escape=None):
-        """
-        >>> tales = NotTranslator(path_translator).tales
-
-        >>> tales("abc/def/ghi")
-        value("not(_path(abc, request, True, 'def', 'ghi'))")
-
-        >>> tales("abc | def")
-        parts(value('not(_path(abc, request, True, ))'),
-              value('not(_path(def, request, True, ))'))
-
-        >>> tales("abc | not: def")
-        parts(value('not(_path(abc, request, True, ))'),
-              value('not(not(_path(def, request, True, )))'))
-
-        >>> tales("abc | not: def | ghi")
-        parts(value('not(_path(abc, request, True, ))'),
-              value('not(not(_path(def, request, True, )))'),
-              value('not(not(_path(ghi, request, True, )))'))
-        """
-
-        value = self.translator.tales(string, escape=escape)
-        if isinstance(value, types.value):
-            value = (value,)
-
-        parts = []
-        for part in value:
-            factory = type(part)
-            value = factory("not(%s)" % part)
-            value.symbol_mapping.update(part.symbol_mapping)
-            parts.append(value)
-
-        if len(parts) == 1:
-            return parts[0]
-
-        return types.parts(parts)
-
-class ProviderTranslator(expressions.ExpressionTranslator):
-    provider_regex = re.compile(r'^[A-Za-z][A-Za-z0-9_\.-]*$')
-
-    symbol = '_get_content_provider'
-    content_provider_traverser = ContentProviderTraverser()
-
-    def translate(self, string, escape=None):
-        if self.provider_regex.match(string) is None:
-            raise SyntaxError(
-                "%s is not a valid content provider name." % string)
-
-        value = types.value("%s(context, request, view, '%s')" % \
-                            (self.symbol, string))
-        value.symbol_mapping[self.symbol] = self.content_provider_traverser
-        return value
-
-class ExistsTranslator(PathTranslator):
-    """Implements string translation expression."""
-
-    symbol = '_path_exists'
-
-    path_traverse = ZopeExistsTraverser()
-
-    def translate(self, *args, **kwargs):
-        value = super(ExistsTranslator, self).translate(*args, **kwargs)
-        if value is None:
-            return
-
-        assert isinstance(value, types.value)
-        parts = types.parts(
-            (value, types.value('False')))
-        parts.exceptions = NameError,
-        return parts
-
-exists_translator = ExistsTranslator()
-path_translator = PathTranslator()
-provider_translator = ProviderTranslator()
-
-z3c_pt_installed = True
-try:
-    import z3c.pt
-except ImportError:
-    z3c_pt_installed = False
-    
-if not z3c_pt_installed:
-    #XXX: Nasty workaround when z3c.pt is installed
-    #
-    # As z3c.pt registers same sort of translators for same interfaces
-    # and under same name (Chameleon needs it to parse certain TALES
-    # expressions), we do only conditionally register these utilites
-    # here.
-    grok.global_utility(ExistsTranslator, name='exists')
-    grok.global_utility(PathTranslator, name='path')
-    grok.global_utility(ProviderTranslator, name='provider')

Deleted: megrok.chameleon/trunk/src/megrok/chameleon/namespaces.py
===================================================================
--- megrok.chameleon/trunk/src/megrok/chameleon/namespaces.py	2011-04-11 13:37:44 UTC (rev 121382)
+++ megrok.chameleon/trunk/src/megrok/chameleon/namespaces.py	2011-04-11 15:34:42 UTC (rev 121383)
@@ -1,94 +0,0 @@
-import zope.component
-from zope.traversing.interfaces import IPathAdapter
-
-class AdapterNamespaces(object):
-    """Simulate tales function namespaces with adapter lookup.
-
-    When we are asked for a namespace, we return an object that
-    actually computes an adapter when called:
-
-    To demonstrate this, we need to register an adapter:
-
-      >>> def adapter1(ob):
-      ...     return 1
-      >>> zope.component.getGlobalSiteManager().registerAdapter(
-      ...     adapter1, [zope.interface.Interface], IPathAdapter, 'a1')
-
-    Now, with this adapter in place, we can try out the namespaces:
-
-      >>> ob = object()
-      >>> namespaces = AdapterNamespaces()
-      >>> namespace = namespaces['a1']
-      >>> namespace(ob)
-      1
-      >>> namespace = namespaces['a2']
-      >>> namespace(ob)
-      Traceback (most recent call last):
-      ...
-      KeyError: 'a2'
-    """
-
-    def __init__(self):
-        self.namespaces = {}
-
-    def __getitem__(self, name):
-        namespace = self.namespaces.get(name)
-        if namespace is None:
-            def namespace(object):
-                try:
-                    return zope.component.getAdapter(object, IPathAdapter, name)
-                except zope.component.ComponentLookupError:
-                    raise KeyError(name)
-
-            self.namespaces[name] = namespace
-        return namespace
-
-
-    def registerFunctionNamespace(self, namespacename, namespacecallable):
-        """Register a function namespace
-
-        namespace - a string containing the name of the namespace to
-                    be registered
-
-        namespacecallable - a callable object which takes the following
-                            parameter:
-
-                            context - the object on which the functions
-                                      provided by this namespace will
-                                      be called
-
-                            This callable should return an object which
-                            can be traversed to get the functions provided
-                            by the this namespace.
-
-        example:
-
-           class stringFuncs(object):
-
-              def __init__(self,context):
-                 self.context = str(context)
-
-              def upper(self):
-                 return self.context.upper()
-
-              def lower(self):
-                 return self.context.lower()
-
-            engine.registerFunctionNamespace('string',stringFuncs)
-        """
-        self.namespaces[namespacename] = namespacecallable
-
-
-    def getFunctionNamespace(self, namespacename):
-        """ Returns the function namespace """
-        return self.namespaces[namespacename]
-
-try:
-    # If zope.app.pagetemplates is available, use the adapter
-    # registered with the main zope.app.pagetemplates engine so that
-    # we don't need to re-register them.
-    from zope.app.pagetemplates.engine import Engine
-    function_namespaces = Engine.namespaces
-except (ImportError, AttributeError):
-    function_namespaces = AdapterNamespaces()
-

Modified: megrok.chameleon/trunk/src/megrok/chameleon/tests/cpt_fixture/app_templates/food.cpt
===================================================================
--- megrok.chameleon/trunk/src/megrok/chameleon/tests/cpt_fixture/app_templates/food.cpt	2011-04-11 13:37:44 UTC (rev 121382)
+++ megrok.chameleon/trunk/src/megrok/chameleon/tests/cpt_fixture/app_templates/food.cpt	2011-04-11 15:34:42 UTC (rev 121383)
@@ -3,7 +3,6 @@
 <span tal:define="foo 'a FOO'">
 ${view.me_do()}
 <span tal:replace="structure view.me_do()" />
-CSS-URL: ${static['test.css']()}
 My context is: ${view.url(context)}
 ${foo}
 <span tal:replace="foo" />

Modified: megrok.chameleon/trunk/src/megrok/chameleon/tests/cpt_fixture/app_templates/vars.cpt
===================================================================
--- megrok.chameleon/trunk/src/megrok/chameleon/tests/cpt_fixture/app_templates/vars.cpt	2011-04-11 13:37:44 UTC (rev 121382)
+++ megrok.chameleon/trunk/src/megrok/chameleon/tests/cpt_fixture/app_templates/vars.cpt	2011-04-11 15:34:42 UTC (rev 121383)
@@ -13,8 +13,5 @@
 
   request (the current request):
    ${request}
-
-  static (the static dir of the application):
-   ${static}
 </body>
 </html>



More information about the checkins mailing list