- Timestamp:
- 12/08/04 11:41:46 (8 years ago)
- Location:
- trunk
- Files:
-
- 2 modified
-
airspeed.py (modified) (5 diffs)
-
airspeed_test.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/airspeed.py
r5 r6 61 61 62 62 63 class BlockEvaluator: 63 64 class Evaluator: 65 def eval_expression(self, expression, namespace_dict): 66 o = namespace_dict 67 for part in expression.split('.'): 68 if part.endswith('()'): ## FIXME 69 part = part[:-2] 70 try: o = getattr(o, part) 71 except AttributeError: pass 72 else: o = o() 73 else: 74 try: o = getattr(o, part) 75 except AttributeError: 76 try: o = o[part] 77 except KeyError: pass 78 if o in (None, namespace_dict): return None 79 return o 80 81 82 class BlockEvaluator(Evaluator): 83 class LocalNamespace(dict): 84 def __init__(self, parent_namespace): 85 self.parent_namespace = parent_namespace 86 def __getitem__(self, key): 87 try: return dict.__getitem__(self, key) 88 except KeyError: return self.parent_namespace[key] 89 64 90 def __init__(self): 65 91 self.children = [] 66 92 self.delegate = None 67 93 68 def evaluate(self, output_stream, expression_lookup):94 def evaluate(self, output_stream, namespace): 69 95 for child in self.children: 70 child.evaluate(output_stream, expression_lookup)96 child.evaluate(output_stream, namespace) 71 97 72 98 def add_evaluator(self, evaluator): … … 94 120 95 121 96 class PlainTextEvaluator :122 class PlainTextEvaluator(Evaluator): 97 123 def __init__(self, text): 98 124 self.text = text 99 125 100 def evaluate(self, output_stream, expression_lookup):126 def evaluate(self, output_stream, namespace): 101 127 output_stream.write(self.text) 102 128 103 129 104 class PlaceholderEvaluator :130 class PlaceholderEvaluator(Evaluator): 105 131 def __init__(self, token_value): 106 132 self.expression, self.silent, self.original_text = token_value 107 133 108 def evaluate(self, output_stream, expression_lookup):109 value = expression_lookup(self.expression)134 def evaluate(self, output_stream, namespace): 135 value = self.eval_expression(self.expression, namespace) 110 136 if value is None: 111 137 if self.silent: expression_value = '' … … 121 147 self.condition_expression = token_value 122 148 123 def evaluate(self, output_stream, expression_lookup):124 value = expression_lookup(self.condition_expression)149 def evaluate(self, output_stream, namespace): 150 value = self.eval_expression(self.condition_expression, namespace) 125 151 if value: 126 BlockEvaluator.evaluate(self, output_stream, expression_lookup)152 BlockEvaluator.evaluate(self, output_stream, namespace) 127 153 128 154 … … 132 158 self.expression, self.iter_var = token_value 133 159 134 def evaluate(self, output_stream, expression_lookup):135 values = expression_lookup(self.expression)160 def evaluate(self, output_stream, namespace): 161 values = self.eval_expression(self.expression, namespace) 136 162 for value in values: 137 BlockEvaluator.evaluate(self, output_stream, expression_lookup) 163 local_namespace = BlockEvaluator.LocalNamespace(namespace) 164 local_namespace[self.iter_var] = value 165 BlockEvaluator.evaluate(self, output_stream, local_namespace) 138 166 139 167 … … 148 176 evaluator.feed(token_type, token_value) 149 177 output = StringIO.StringIO() 150 evaluator.evaluate(output, self. find)178 evaluator.evaluate(output, self.data) 151 179 return output.getvalue() 152 153 def find(self, expression):154 o = self.data155 for part in expression.split('.'):156 if part.endswith('()'): ## FIXME157 part = part[:-2]158 try: o = getattr(o, part)159 except AttributeError: pass160 else: o = o()161 else:162 try: o = getattr(o, part)163 except AttributeError:164 try: o = o[part]165 except KeyError: pass166 if o in (None, self.data): return None167 return o168 169 180 170 181 def __setitem__(self, name, value): -
trunk/airspeed_test.py
r4 r6 123 123 self.assertEquals("", parser.merge(template)) 124 124 125 def test_foreach_with_expression_content_loops_correctly(self): 126 parser = airspeed.Parser() 127 template = airspeed.Template("#foreach ($name in $names)Hello $you. #end") 128 parser["you"] = "You" 129 parser["names"] = ["Chris", "Steve"] 130 self.assertEquals("Hello You. Hello You. ", parser.merge(template)) 131 132 def test_foreach_makes_loop_variable_accessible(self): 133 parser = airspeed.Parser() 134 template = airspeed.Template("#foreach ($name in $names)Hello $name. #end") 135 parser["names"] = ["Chris", "Steve"] 136 self.assertEquals("Hello Chris. Hello Steve. ", parser.merge(template)) 137 138 139 125 140 if __name__ == '__main__': 126 141 reload(airspeed)
