[Checkins] SVN: z3c.pt/trunk/ Added 'not' and 'exists' expressions. API updates.

Malthe Borch mborch at gmail.com
Sat Nov 15 21:07:46 EST 2008


Log message for revision 93001:
  Added 'not' and 'exists' expressions. API updates.

Changed:
  U   z3c.pt/trunk/CHANGES.txt
  U   z3c.pt/trunk/src/z3c/pt/configure.zcml
  U   z3c.pt/trunk/src/z3c/pt/expressions.py

-=-
Modified: z3c.pt/trunk/CHANGES.txt
===================================================================
--- z3c.pt/trunk/CHANGES.txt	2008-11-16 02:05:43 UTC (rev 93000)
+++ z3c.pt/trunk/CHANGES.txt	2008-11-16 02:07:45 UTC (rev 93001)
@@ -4,6 +4,10 @@
 Head
 ~~~~
 
+- Updated expressions to recent API changes. [malthe]
+
+- Added 'exists' and 'not' translators. [malthe]
+
   Bug fixes
 
 - Adjusted the bigtable benchmark test to API changes. [hannosch]

Modified: z3c.pt/trunk/src/z3c/pt/configure.zcml
===================================================================
--- z3c.pt/trunk/src/z3c/pt/configure.zcml	2008-11-16 02:05:43 UTC (rev 93000)
+++ z3c.pt/trunk/src/z3c/pt/configure.zcml	2008-11-16 02:07:45 UTC (rev 93001)
@@ -11,8 +11,16 @@
      component=".expressions.path_translator" />
 
   <utility
+     name="not"
+     component=".expressions.not_translator" />
+
+  <utility
      name="provider"
      component=".expressions.provider_translator" />
 
+  <utility
+     name="exists"
+     component=".expressions.exists_translator" />
+
 </configure>
  

Modified: z3c.pt/trunk/src/z3c/pt/expressions.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/expressions.py	2008-11-16 02:05:43 UTC (rev 93000)
+++ z3c.pt/trunk/src/z3c/pt/expressions.py	2008-11-16 02:07:45 UTC (rev 93001)
@@ -10,12 +10,24 @@
 
 from chameleon.core import types
 from chameleon.zpt import expressions
+from chameleon.zpt.interfaces import IExpressionTranslator
 
 _marker = object()
 
 def identity(x):
     return x
 
+def get_content_provider(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)
+
+    cp.update()
+    return cp.render()
+
 class ZopeTraverser(object):
     def __init__(self, proxify=identity):
         self.proxify = proxify
@@ -48,6 +60,16 @@
             return base()
 
         return base
+    
+class ZopeExistsTraverser(ZopeTraverser):
+    exceptions = AttributeError, LookupError, TypeError
+    
+    def __call__(self, *args, **kwargs):
+        try:
+            return ZopeTraverser.__call__(self, *args, **kwargs)
+        except self.exceptions:
+            return 0
+        return 1
 
 class PathTranslator(expressions.ExpressionTranslator):
     path_regex = re.compile(
@@ -58,17 +80,8 @@
 
     symbol = '_path'
 
-    def validate(self, string):
+    def translate(self, string, escape=None):
         """
-        >>> validate = PathTranslator().validate
-        >>> validate("image_path/++resource++/@@hello.html")
-        """
-
-        if not self.path_regex.match(string.strip()):
-            raise SyntaxError("Not a valid path-expression.")
-
-    def translate(self, string):
-        """
         >>> translate = PathTranslator().translate
 
         >>> translate("a/b")
@@ -76,6 +89,9 @@
 
         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')")
 
@@ -87,6 +103,9 @@
 
         """
 
+        if not self.path_regex.match(string.strip()):
+            raise SyntaxError("Not a valid path-expression: %s." % string)
+
         nocall = False
         negate = False
 
@@ -127,32 +146,42 @@
 
         return value
 
-path_translator = PathTranslator()
+class NotTranslator(PathTranslator):
+    symbol = '_path_not'
 
-def get_content_provider(context, request, view, name):
-    cp = zope.component.queryMultiAdapter(
-        (context, request, view), IContentProvider, name=name)
+    def translate(self, string, escape=None):
+        path_translator = zope.component.getUtility(
+            IExpressionTranslator, name='path')
+        value = path_translator.translate(string, escape=escape)
+        symbol_mapping = value.symbol_mapping
+        value = types.value("not(%s)" % value)
+        value.symbol_mapping = symbol_mapping
+        return value
 
-    # provide a useful error message, if the provider was not found.
-    if cp is None:
-        raise ContentProviderLookupError(name)
-
-    cp.update()
-    return cp.render()
-
 class ProviderTranslator(expressions.ExpressionTranslator):
     provider_regex = re.compile(r'^[A-Za-z][A-Za-z0-9_\.-]*$')
+    
     symbol = '_get_content_provider'
 
-    def validate(self, string):
+    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)
 
-    def translate(self, string):
         value = types.value("%s(context, request, view, '%s')" % \
                             (self.symbol, string))
         value.symbol_mapping[self.symbol] = get_content_provider
         return value
 
+class ExistsTranslator(PathTranslator):
+    """Implements string translation expression."""
+
+    symbol = '_path_exists'
+    
+    path_traverse = ZopeExistsTraverser()
+
+exists_translator = ExistsTranslator()
+path_translator = PathTranslator()
+not_translator = NotTranslator()    
 provider_translator = ProviderTranslator()
+



More information about the Checkins mailing list