[Checkins] SVN: z3c.pt/trunk/ Make provider expression dynamic (as a string expression).

Malthe Borch mborch at gmail.com
Wed Sep 14 03:45:44 EST 2011


Log message for revision 122801:
  Make provider expression dynamic (as a string expression).

Changed:
  U   z3c.pt/trunk/CHANGES.txt
  U   z3c.pt/trunk/src/z3c/pt/expressions.py
  A   z3c.pt/trunk/src/z3c/pt/tests/provider.pt
  U   z3c.pt/trunk/src/z3c/pt/tests/test_templates.py

-=-
Modified: z3c.pt/trunk/CHANGES.txt
===================================================================
--- z3c.pt/trunk/CHANGES.txt	2011-09-13 21:36:57 UTC (rev 122800)
+++ z3c.pt/trunk/CHANGES.txt	2011-09-14 08:45:43 UTC (rev 122801)
@@ -1,6 +1,15 @@
 Changelog
 =========
 
+In next release ...
+
+- The provider expression is now first evaluated as a string
+  expression, the result of which is used as the content provider
+  name.
+
+  This fixes an issue where (provider-) string expressions would not
+  get evaluated correctly, e.g. ``provider: ${mgr}``.
+
 2.1.3 (2011-08-22)
 ~~~~~~~~~~~~~~~~~~
 

Modified: z3c.pt/trunk/src/z3c/pt/expressions.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/expressions.py	2011-09-13 21:36:57 UTC (rev 122800)
+++ z3c.pt/trunk/src/z3c/pt/expressions.py	2011-09-14 08:45:43 UTC (rev 122801)
@@ -18,6 +18,7 @@
 from chameleon.tales import PathExpr as BasePathExpr
 from chameleon.tales import ExistsExpr as BaseExistsExpr
 from chameleon.tales import PythonExpr as BasePythonExpr
+from chameleon.tales import StringExpr
 from chameleon.codegen import template
 from chameleon.astutil import load
 from chameleon.astutil import Symbol
@@ -27,7 +28,6 @@
 from chameleon.exc import ExpressionError
 
 _marker = object()
-_valid_name = re.compile(r"[a-zA-Z][a-zA-Z0-9_]*$").match
 
 
 def identity(x):
@@ -193,27 +193,19 @@
         super(ExistsExpr, self).__init__("nocall:" + expression)
 
 
-class ProviderExpr(object):
-    provider_regex = re.compile(r'^[A-Za-z][A-Za-z0-9_\.-]*$')
-
+class ProviderExpr(StringExpr):
     traverser = Static(
         template("cls()", cls=Symbol(ContentProviderTraverser), mode="eval")
         )
 
-    def __init__(self, expression):
-        self.expression = expression
-
     def __call__(self, target, engine):
-        string = self.expression.strip()
-        if self.provider_regex.match(string) is None:
-            raise SyntaxError(
-                "%s is not a valid content provider name." % string)
+        assignment = super(ProviderExpr, self).__call__(target, engine)
 
-        return template(
-            "target = traverse(context, request, view, name)",
+        return assignment + \
+               template(
+            "target = traverse(context, request, view, target.strip())",
             target=target,
             traverse=self.traverser,
-            name=ast.Str(string),
             )
 
 

Added: z3c.pt/trunk/src/z3c/pt/tests/provider.pt
===================================================================
--- z3c.pt/trunk/src/z3c/pt/tests/provider.pt	                        (rev 0)
+++ z3c.pt/trunk/src/z3c/pt/tests/provider.pt	2011-09-14 08:45:43 UTC (rev 122801)
@@ -0,0 +1,6 @@
+<html>
+  <body>
+    <div id="content" tal:content="structure provider: content" />
+    <div id="content" tal:content="structure provider: ${python: 'content'}" />
+  </body>
+</html>

Modified: z3c.pt/trunk/src/z3c/pt/tests/test_templates.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/tests/test_templates.py	2011-09-13 21:36:57 UTC (rev 122800)
+++ z3c.pt/trunk/src/z3c/pt/tests/test_templates.py	2011-09-14 08:45:43 UTC (rev 122801)
@@ -56,6 +56,49 @@
         self.failUnless("supported" in result)
         self.failUnless("some path" in result)
 
+    def test_provider(self):
+        from z3c.pt.pagetemplate import ViewPageTemplateFile
+
+        class Context(object):
+            pass
+
+        class Request(object):
+            response = None
+
+        class View(object):
+            __call__ = ViewPageTemplateFile("provider.pt")
+
+        class Provider(object):
+            def __init__(self, *args):
+                data.extend(list(args))
+
+            def update(self):
+                data.extend("updated")
+
+            def render(self):
+                return """<![CDATA[ %s ]]>""" % repr(data)
+
+        view = View()
+        data = []
+
+        from zope.interface import implementedBy
+        from zope.component import provideAdapter
+        from zope.contentprovider.interfaces import IContentProvider
+
+        provideAdapter(
+            Provider, (
+                implementedBy(Context),
+                implementedBy(Request),
+                implementedBy(View)
+                ),
+            IContentProvider,
+            name="content"
+            )
+
+        result = view(context=Context(), request=Request())
+        self.failUnless(repr(data) in result)
+
+
 def test_suite():
     import sys
     return unittest.findTestCases(sys.modules[__name__])



More information about the checkins mailing list