Changeset 2566


Ignore:
Timestamp:
08/06/07 13:10:17 (12 years ago)
Author:
spascoe
Message:

Automatic checking of operation parameter values. Ranges aren't supported yet.

Location:
TI05-delivery/ows_framework/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • TI05-delivery/ows_framework/trunk/ows_common/ows_common/domain.py

    r2521 r2566  
    4141        self.valuesUnit = valuesUnit 
    4242 
     43    def isValidValue(self, value): 
     44        return self.possibleValues.isValidValue(value) 
     45 
    4346class PossibleValues(object): 
    4447    """ 
     
    5962    @type valuesRefURI: None or str 
    6063 
     64    @todo: Range checking 
     65    @todo: Converting into numeric types 
     66     
    6167    """ 
    6268    ANY_VALUE = 1 
     
    9399        return k 
    94100 
     101    def isValidValue(self, value): 
     102        """ 
     103        Check that value is valid within domain. 
     104 
     105        """ 
     106        if self.type == self.ANY_VALUE: 
     107            return True 
     108 
     109        if self.type == self.NO_VALUES: 
     110            return not value 
     111 
     112        if self.type == self.ALLOWED_VALUES: 
     113            for vr in self.allowedValues: 
     114                if isinstance(vr, Range) and vr.isInRange(value): 
     115                    return True 
     116                if value == vr: 
     117                    return True 
     118            return False 
     119                 
     120        if self.type == self.VALUES_REFERENCE: 
     121            raise NotImplementedError 
     122         
    95123 
    96124class Range(object): 
     
    119147        self.rangeClosure = rangeClosure 
    120148 
     149    def isInRange(self, value): 
     150        raise NotImplementedError 
    121151 
    122152class DomainMetadata(str): 
  • TI05-delivery/ows_framework/trunk/ows_common/ows_common/util.py

    r2561 r2566  
    1111from ows_common.domain import Domain, PossibleValues 
    1212 
    13 def make_domain(value=None, possibleValues=None, 
    14               meaning=None, dataType=None, valuesUnit=None): 
     13def make_domain(value=None, possibleValues=None, **kwargs): 
     14    """ 
     15    Construct a domain object. 
     16 
     17    @param value: The defaultValue of the domain 
     18    @param possibleValues: Either a list of possible values, 
     19        a PossibleValues object or None to represent any value 
     20    @param kwargs: all other arguments passed to the Domain constructor. 
     21    """ 
    1522    if possibleValues is None: 
    1623        pv = PossibleValues.anyValue() 
     
    2027        pv = PossibleValues.allowedValues(possibleValues) 
    2128 
    22     return Domain(defaultValue=value, possibleValues=pv, 
    23                   meaning=meaning, dataType=dataType, valuesUnit=valuesUnit) 
     29    return Domain(defaultValue=value, possibleValues=pv, **kwargs) 
     30 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/lib/decorators.py

    r2564 r2566  
    5050                if k in argspec[0]: 
    5151                    kw2[k] = v 
    52             kw = kw2 
    53                      
     52            kw = kw2    
    5453 
    5554        # Add arguments to kw according to self._ows_parameters 
    56         for param in wrapper._ows_parameters: 
     55        for param, domain in wrapper._ows_parameters.iteritems(): 
    5756            try: 
    58                 pl = param.lower() 
    59                 kw[pl] = self.ows_params[pl] 
     57                param_l = param.lower() 
     58                kw[param_l] = value = self.ows_params[param_l] 
    6059            except KeyError: 
    6160                if param in wrapper._ows_required_parameters: 
    6261                    raise MissingParameterValue('%s parameter is not specified' % param, 
    6362                                                param) 
     63            else: 
     64                # If the argument is present check it's a valid value 
     65                if not domain.isValidValue(value): 
     66                    raise InvalidParameterValue('%s is not a valid value for %s' % (value, param), param) 
     67                 
    6468        return method(self, **kw) 
    6569 
     
    181185            @operation 
    182186            @parameter('Bar', required=True) 
    183             def MyOp(self, bar): 
     187            @parameter('Baz', possibleValues=['a', 'b']) 
     188            def MyOp(self, bar, baz=None): 
    184189                return bar+1 
    185190 
     
    189194        # Check OWS protocol is adhered to 
    190195        assert self.foo.MyOp._ows_name == 'MyOp' 
    191         assert self.foo.MyOp._ows_parameters.keys() == ['Bar'] 
     196        assert self.foo.MyOp._ows_parameters.keys() == ['Bar', 'Baz'] 
    192197        assert self.foo.MyOp._ows_constraints == {} 
    193198        assert self.foo.MyOp._ows_required_parameters == ['Bar'] 
     
    197202        assert self.foo.MyOp() == 3 
    198203 
    199     def testCallFail(self): 
    200         self.foo.ows_params = {'baz': 2} 
     204    def testFailMissingParameter(self): 
     205        self.foo.ows_params = {'bip': 2} 
    201206        self.assertRaises(MissingParameterValue, self.foo.MyOp) 
     207 
     208    def testFailIncorrectParameterValue(self): 
     209        self.foo.ows_params = {'bar': 1, 'baz': 2} 
     210        self.assertRaises(InvalidParameterValue, self.foo.MyOp) 
     211 
     212    def testCallWithPossibleValue(self): 
     213        self.foo.ows_params = {'bar': 2, 'baz': 'b'} 
     214        assert self.foo.MyOp() == 3 
Note: See TracChangeset for help on using the changeset viewer.