[Checkins] SVN: zope.tales/trunk/ Ported the lazy expression from Products.PageTemplates.

Hanno Schlichting hannosch at hannosch.eu
Fri Jan 1 15:07:16 EST 2010


Log message for revision 107514:
  Ported the lazy expression from Products.PageTemplates.
  

Changed:
  U   zope.tales/trunk/CHANGES.txt
  U   zope.tales/trunk/setup.py
  U   zope.tales/trunk/src/zope/tales/engine.py
  U   zope.tales/trunk/src/zope/tales/expressions.py
  U   zope.tales/trunk/src/zope/tales/tests/test_expressions.py

-=-
Modified: zope.tales/trunk/CHANGES.txt
===================================================================
--- zope.tales/trunk/CHANGES.txt	2010-01-01 19:26:58 UTC (rev 107513)
+++ zope.tales/trunk/CHANGES.txt	2010-01-01 20:07:16 UTC (rev 107514)
@@ -2,6 +2,11 @@
 CHANGES
 =======
 
+3.5.0 (unreleased)
+------------------
+
+- Ported the lazy expression from Products.PageTemplates.
+
 3.4.0 (2007-10-03)
 ------------------
 
@@ -9,7 +14,6 @@
 
 - Initial release outside the Zope 3 trunk.
 
-
 3.2.0 (2006-01-05)
 ------------------
 
@@ -18,7 +22,6 @@
 
 - Documentation / test fixes.
 
-
 3.0.0 (2004-11-07)
 ------------------
 

Modified: zope.tales/trunk/setup.py
===================================================================
--- zope.tales/trunk/setup.py	2010-01-01 19:26:58 UTC (rev 107513)
+++ zope.tales/trunk/setup.py	2010-01-01 20:07:16 UTC (rev 107514)
@@ -27,7 +27,7 @@
     return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
 
 setup(name='zope.tales',
-      version = '3.4.1dev',
+      version = '3.5.0dev',
       author='Zope Corporation and Contributors',
       author_email='zope3-dev at zope.org',
       description='Zope 3 Template Application Language Expression Syntax '

Modified: zope.tales/trunk/src/zope/tales/engine.py
===================================================================
--- zope.tales/trunk/src/zope/tales/engine.py	2010-01-01 19:26:58 UTC (rev 107513)
+++ zope.tales/trunk/src/zope/tales/engine.py	2010-01-01 20:07:16 UTC (rev 107514)
@@ -18,7 +18,11 @@
 $Id$
 """
 from zope.tales.tales import ExpressionEngine
-from zope.tales.expressions import PathExpr, StringExpr, NotExpr, DeferExpr
+from zope.tales.expressions import PathExpr
+from zope.tales.expressions import StringExpr
+from zope.tales.expressions import NotExpr
+from zope.tales.expressions import DeferExpr
+from zope.tales.expressions import LazyExpr
 from zope.tales.expressions import SimpleModuleImporter
 from zope.tales.pythonexpr import PythonExpr
 
@@ -31,6 +35,7 @@
     reg('python', PythonExpr)
     reg('not', NotExpr)
     reg('defer', DeferExpr)
+    reg('lazy', LazyExpr)
     e.registerBaseName('modules', SimpleModuleImporter())
     return e
 

Modified: zope.tales/trunk/src/zope/tales/expressions.py
===================================================================
--- zope.tales/trunk/src/zope/tales/expressions.py	2010-01-01 19:26:58 UTC (rev 107513)
+++ zope.tales/trunk/src/zope/tales/expressions.py	2010-01-01 20:07:16 UTC (rev 107514)
@@ -309,6 +309,29 @@
         return '<DeferExpr %s>' % `self._s`
 
 
+class LazyWrapper(DeferWrapper):
+    """Wrapper for lazy: expression
+    """
+    def __init__(self, expr, econtext):
+        DeferWrapper.__init__(self, expr, econtext)
+        self._result = _marker
+
+    def __call__(self):
+        r = self._result
+        if r is _marker:
+            self._result = r = self._expr(self._econtext)
+        return r
+
+class LazyExpr(DeferExpr):
+    """lazy: expression handler for lazy initialization of expressions
+    """
+    def __call__(self, econtext):
+        return LazyWrapper(self._c, econtext)
+
+    def __repr__(self):
+        return 'lazy:%s' % `self._s`
+
+
 class SimpleModuleImporter(object):
     """Minimal module importer with no security."""
 

Modified: zope.tales/trunk/src/zope/tales/tests/test_expressions.py
===================================================================
--- zope.tales/trunk/src/zope/tales/tests/test_expressions.py	2010-01-01 19:26:58 UTC (rev 107513)
+++ zope.tales/trunk/src/zope/tales/tests/test_expressions.py	2010-01-01 20:07:16 UTC (rev 107514)
@@ -229,7 +229,19 @@
         check('string:foo${ab/cd | c/d | e//f}bar')
         check('string:foo${ab/cd | c/d | e/f/}bar')
 
+    def test_defer_expression_returns_wrapper(self):
+        from zope.tales.expressions import DeferWrapper
+        expr = self.engine.compile('defer: b')
+        context=self.context
+        self.failUnless(isinstance(expr(context), DeferWrapper))
 
+    def test_lazy_expression_returns_wrapper(self):
+        from zope.tales.expressions import LazyWrapper
+        expr = self.engine.compile('lazy: b')
+        context=self.context
+        self.failUnless(isinstance(expr(context), LazyWrapper))
+
+
 class FunctionTests(ExpressionTestBase):
 
     def setUp(self):
@@ -319,7 +331,6 @@
             self.fail('Engine accepted invalid namespace name')
 
     def testBadFunction(self):
-        from zope.tales.tales import CompilerError
         # namespace is fine, adapter is not defined
         try:
             expr = self.engine.compile('adapterTest/namespace:title')



More information about the checkins mailing list