changeset 225:16d7b5db7ef4 trunk

support slices in expressions (fixes #51)
author mgood
date Thu, 07 Sep 2006 20:40:56 +0000
parents 90d62225f411
children 4d8a9e03b23d
files markup/eval.py markup/tests/eval.py
diffstat 2 files changed, 36 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/markup/eval.py
+++ b/markup/eval.py
@@ -349,6 +349,18 @@
         node.quals = map(lambda x: self.visit(x, *args, **kwargs), node.quals)
         return node
 
+    def visitSlice(self, node, *args, **kwargs):
+        node.expr = self.visit(node.expr, locals_=True, *args, **kwargs)
+        if node.lower is not None:
+            node.lower = self.visit(node.lower, *args, **kwargs)
+        if node.upper is not None:
+            node.upper = self.visit(node.upper, *args, **kwargs)
+        return node
+
+    def visitSliceobj(self, node, *args, **kwargs):
+        node.nodes = map(lambda x: self.visit(x, *args, **kwargs), node.nodes)
+        return node
+
 
 class ExpressionASTTransformer(ASTTransformer):
     """Concrete AST transformer that implements the AST transformations needed
--- a/markup/tests/eval.py
+++ b/markup/tests/eval.py
@@ -274,6 +274,30 @@
             expr = Expression("list(i['name'] for i in items if i['value'] > 1)")
             self.assertEqual(['b'], expr.evaluate({'items': items}))
 
+    def test_slice(self):
+        expr = Expression("numbers[0:2]")
+        self.assertEqual([0, 1], expr.evaluate({'numbers': range(5)}))
+
+    def test_slice_with_vars(self):
+        expr = Expression("numbers[start:end]")
+        self.assertEqual([0, 1], expr.evaluate({'numbers': range(5), 'start': 0, 'end': 2}))
+
+    def test_slice_copy(self):
+        expr = Expression("numbers[:]")
+        self.assertEqual([0, 1, 2, 3, 4], expr.evaluate({'numbers': range(5)}))
+
+    def test_slice_stride(self):
+        expr = Expression("numbers[::stride]")
+        self.assertEqual([0, 2, 4], expr.evaluate({'numbers': range(5), 'stride': 2}))
+
+    def test_slice_negative_start(self):
+        expr = Expression("numbers[-1:]")
+        self.assertEqual([4], expr.evaluate({'numbers': range(5)}))
+
+    def test_slice_negative_end(self):
+        expr = Expression("numbers[:-1]")
+        self.assertEqual([0, 1, 2, 3], expr.evaluate({'numbers': range(5)}))
+
     def test_error_access_undefined(self):
         expr = Expression("nothing", filename='index.html', lineno=50)
         self.assertEqual(Undefined, type(expr.evaluate({})))
Copyright (C) 2012-2017 Edgewall Software