[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