[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