[Checkins] SVN: megrok.chameleon/branches/ulif-chameleon_2-support/src/megrok/chameleon/ Remove self-brewed expression parsers. We will get all this from z3c.pt directly.
Uli Fouquet
uli at gnufix.de
Mon Apr 11 09:14:44 EDT 2011
Log message for revision 121371:
Remove self-brewed expression parsers. We will get all this from z3c.pt directly.
Changed:
D megrok.chameleon/branches/ulif-chameleon_2-support/src/megrok/chameleon/expressions.py
D megrok.chameleon/branches/ulif-chameleon_2-support/src/megrok/chameleon/namespaces.py
-=-
Deleted: megrok.chameleon/branches/ulif-chameleon_2-support/src/megrok/chameleon/expressions.py
===================================================================
--- megrok.chameleon/branches/ulif-chameleon_2-support/src/megrok/chameleon/expressions.py 2011-04-10 16:03:52 UTC (rev 121370)
+++ megrok.chameleon/branches/ulif-chameleon_2-support/src/megrok/chameleon/expressions.py 2011-04-11 13:14:43 UTC (rev 121371)
@@ -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/branches/ulif-chameleon_2-support/src/megrok/chameleon/namespaces.py
===================================================================
--- megrok.chameleon/branches/ulif-chameleon_2-support/src/megrok/chameleon/namespaces.py 2011-04-10 16:03:52 UTC (rev 121370)
+++ megrok.chameleon/branches/ulif-chameleon_2-support/src/megrok/chameleon/namespaces.py 2011-04-11 13:14:43 UTC (rev 121371)
@@ -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()
-
More information about the checkins
mailing list