Changeset 568
- Timestamp:
- 07/12/08 06:26:09 (5 months ago)
- Files:
-
- cly/trunk/cly/builder.py (modified) (13 diffs)
- cly/trunk/cly/test.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
cly/trunk/cly/builder.py
r566 r568 479 479 480 480 @classmethod 481 def xml_cast_attribute(cls, name, value):481 def cast_attribute(cls, name, value): 482 482 """Define functions for casting attributes to their correct Python type. 483 483 … … 487 487 """ 488 488 casts = { 489 'traversals': int, 'group': _xml_group_type,490 'order': int, 'match_candidates': _xml_boolean_type,491 'with_context': _xml_boolean_type,489 'traversals': int, 'group': group_cast, 490 'order': int, 'match_candidates': boolean_cast, 491 'with_context': boolean_cast, 492 492 } 493 493 if name in casts: … … 496 496 497 497 @classmethod 498 def xml_attribute_aliases(cls):498 def attribute_aliases(cls): 499 499 """Define attribute aliases for this node. 500 500 … … 591 591 592 592 @classmethod 593 def xml_cast_attribute(cls, name, value):593 def cast_attribute(cls, name, value): 594 594 return eval(value) 595 595 … … 605 605 606 606 @classmethod 607 def xml_cast_attribute(cls, name, value):607 def cast_attribute(cls, name, value): 608 608 if name == 'id': 609 return _xml_group_type(value)610 return super(Group, cls). xml_cast_attribute(name, value)609 return group_cast(value) 610 return super(Group, cls).cast_attribute(name, value) 611 611 612 612 … … 809 809 810 810 @classmethod 811 def xml_attribute_aliases(cls):811 def attribute_aliases(cls): 812 812 return {'exec': 'callback'} 813 813 … … 1051 1051 aliases = {} 1052 1052 for c in reversed(cls.mro()): 1053 if ' xml_attribute_aliases' in c.__dict__:1054 aliases.update(c. xml_attribute_aliases())1053 if 'attribute_aliases' in c.__dict__: 1054 aliases.update(c.attribute_aliases()) 1055 1055 1056 1056 attributes = dict([(str(aliases.get(k, k)), v) for k, v … … 1059 1059 for k, v in attributes.items(): 1060 1060 # Do type conversion 1061 v = cls. xml_cast_attribute(k, v)1061 v = cls.cast_attribute(k, v) 1062 1062 # Is the destination Node attribute callable? Do a lazy eval. 1063 1063 if callable(getattr(cls, k, None)): … … 1074 1074 else: 1075 1075 args = [] 1076 v = _xml_lazy_attr_evaluator(v, args)1076 v = lazy_attr_evaluator(v, args) 1077 1077 1078 1078 attributes[k] = v … … 1080 1080 1081 1081 1082 def _xml_lazy_attr_evaluator(attr, positional_args=None):1082 def lazy_attr_evaluator(attr, positional_args=None): 1083 1083 """Return a callable that lazily evaluates an expression. 1084 1084 … … 1089 1089 # Extract positional arguments from function object 1090 1090 positional_args = positional_args or [] 1091 def xml_attr_evaluator(*args, **kwargs):1091 def attr_evaluator(*args, **kwargs): 1092 1092 locals = dict(kwargs) 1093 1093 … … 1124 1124 e.args = e.args + ('while parsing "%s"' % attr,) 1125 1125 raise 1126 return xml_attr_evaluator1127 1128 1129 def _xml_boolean_type(value):1126 return attr_evaluator 1127 1128 1129 def boolean_cast(value): 1130 1130 """Converter for boolean attributes.""" 1131 1131 return str(value).lower() in ('true', '1', 'yes') 1132 1132 1133 1133 1134 def _xml_group_type(value):1134 def group_cast(value): 1135 1135 """Parse a group="n" attribute.""" 1136 1136 try: … … 1439 1439 1440 1440 @classmethod 1441 def xml_cast_attribute(cls, name, value):1441 def cast_attribute(cls, name, value): 1442 1442 if name == 'parts': 1443 1443 return int(value) 1444 return super(Hostname, cls). xml_cast_attribute(name, value)1444 return super(Hostname, cls).cast_attribute(name, value) 1445 1445 1446 1446 cly/trunk/cly/test.py
r558 r568 160 160 self.assertEqual(self._output, (('hello',), {})) 161 161 162 def test_ xml_cast_attribute(self):162 def test_cast_attribute(self): 163 163 class Test(Node): 164 164 @classmethod 165 def xml_cast_attribute(cls, name, value):165 def cast_attribute(cls, name, value): 166 166 if name == 'test': 167 167 return int(value) … … 177 177 self.assertTrue(isinstance(grammar.find('/test').test, int)) 178 178 179 def test_ xml_attribute_aliases(self):179 def test_attribute_aliases(self): 180 180 class Parent(Node): 181 181 @classmethod 182 def xml_attribute_aliases(cls):182 def attribute_aliases(cls): 183 183 return {'foo': 'bar'} 184 184 185 185 class Test(Parent): 186 186 @classmethod 187 def xml_attribute_aliases(cls):187 def attribute_aliases(cls): 188 188 return {'baz': 'waz'} 189 189
