Changeset 22

Show
Ignore:
Timestamp:
18/08/04 18:39:45 (8 years ago)
Author:
steve
Message:

binary operators: < > <= >= == !=

Location:
trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/airspeed.py

    r21 r22  
    33import re 
    44import cStringIO as StringIO 
     5import operator 
    56 
    67__all__ = ['TemplateSyntaxError', 'Template'] 
     
    275276 
    276277 
     278class BinaryOperator(_Element): 
     279    PATTERN = re.compile(r'\s*(>=|<=|<|==|!=|>)\s*(.*)$', re.S) 
     280    def parse(self): 
     281        self.operator, = self.identity_match(self.PATTERN) 
     282        op = operator 
     283        self.operator = {'>': op.__gt__, '>=': op.__ge__, 
     284                         '<': op.__lt__, '<=': op.__le__, 
     285                         '==': op.__eq__, '!=': op.__ne__}[self.operator] 
     286 
     287    def apply_to(self, value1, value2): 
     288        return self.operator(value1, value2) 
     289 
     290 
    277291class Condition(_Element): 
    278292    OPENING_PATTERN = re.compile(r'\(\s*(.*)$', re.S) 
    279293    CLOSING_PATTERN = re.compile(r'\s*\)(.*)$', re.S) 
     294    binary_operator = None 
     295    value2 = None 
    280296    def parse(self): 
    281297        self.require_match(self.OPENING_PATTERN, '(') 
    282         self.expression = self.next_element(Value) 
    283         self.require_match(self.CLOSING_PATTERN, ')') 
    284         self.calculate = self.expression.calculate 
     298        self.value = self.next_element(Value) 
     299        try: 
     300            self.binary_operator = self.next_element(BinaryOperator) 
     301            self.value2 = self.require_next_element(Value, 'value') 
     302        except NoMatch: 
     303            pass 
     304        self.require_match(self.CLOSING_PATTERN, ') or >') 
     305 
     306    def calculate(self, namespace): 
     307        if self.binary_operator is None: 
     308            return self.value.calculate(namespace) 
     309        else: 
     310            value1, value2 = self.value.calculate(namespace), self.value2.calculate(namespace) 
     311            return self.binary_operator.apply_to(value1, value2) 
    285312 
    286313 
  • trunk/airspeed_test.py

    r21 r22  
    266266        else: self.fail('expected error') 
    267267 
    268  
     268    def test_compare_greater_than_operator(self): 
     269        template = airspeed.Template('#if ( $value > 1 )yes#end') 
     270        self.assertEquals('', template.merge({'value': 0})) 
     271        self.assertEquals('', template.merge({'value': 1})) 
     272        self.assertEquals('yes', template.merge({'value': 2})) 
     273 
     274    def test_compare_greater_than_or_equal_operator(self): 
     275        template = airspeed.Template('#if ( $value >= 1 )yes#end') 
     276        self.assertEquals('', template.merge({'value': 0})) 
     277        self.assertEquals('yes', template.merge({'value': 1})) 
     278        self.assertEquals('yes', template.merge({'value': 2})) 
     279 
     280    def test_compare_less_than_operator(self): 
     281        template = airspeed.Template('#if ( $value < 1 )yes#end') 
     282        self.assertEquals('yes', template.merge({'value': 0})) 
     283        self.assertEquals('', template.merge({'value': 1})) 
     284        self.assertEquals('', template.merge({'value': 2})) 
     285 
     286    def test_compare_less_than_or_equal_operator(self): 
     287        template = airspeed.Template('#if ( $value <= 1 )yes#end') 
     288        self.assertEquals('yes', template.merge({'value': 0})) 
     289        self.assertEquals('yes', template.merge({'value': 1})) 
     290        self.assertEquals('', template.merge({'value': 2})) 
     291 
     292    def test_compare_equality_operator(self): 
     293        template = airspeed.Template('#if ( $value == 1 )yes#end') 
     294        self.assertEquals('', template.merge({'value': 0})) 
     295        self.assertEquals('yes', template.merge({'value': 1})) 
     296        self.assertEquals('', template.merge({'value': 2})) 
    269297# 
    270298# TODO: