source: TI05-delivery/ows_framework/trunk/ows_common/ows_common/decorators.py @ 2502

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI05-delivery/ows_framework/trunk/ows_common/ows_common/decorators.py@2502
Revision 2502, 4.4 KB checked in by spascoe, 12 years ago (diff)

Some bug fixes to ows_common. OwsController?._load_capabilities implements
discovery of capabilities from a controller definition.

Line 
1# Copyright (C) 2007 STFC & NERC (Science and Technology Facilities Council).
2# This software may be distributed under the terms of the
3# Q Public License, version 1.0 or later.
4# http://ndg.nerc.ac.uk/public_docs/QPublic_license.txt
5"""
6Decorators for annotating OWS server controllers with information used
7to populate the ows_common model.
8
9@author: Stephen Pascoe
10"""
11
12from ows_common.domain import Domain, PossibleValues
13
14def make_domain(value=None, possibleValues=None,
15              meaning=None, dataType=None, valuesUnit=None):
16    if possibleValues is None:
17        pv = PossibleValues.anyValue()
18    elif isinstance(possibleValues, PossibleValues):
19        pv = possibleValues
20    else:
21        pv = PossibleValues.allowedValues(possibleValues)
22
23    return Domain(defaultValue=value, possibleValues=pv,
24                  meaning=meaning, dataType=dataType, valuesUnit=valuesUnit)
25
26def operation(method):
27    """
28    A decorator which tags a method as a OWS operation.
29
30    """
31    method._ows_name = method.__name__
32
33    return method
34
35def parameter(name, value=None, possibleValues=None,
36              meaning=None, dataType=None, valuesUnit=None):
37    """
38    A decorator to add a parameter to an operation.
39
40    @param name: the parameter name.  This should be appropriately CamelCased.
41    @param value: the ows:Domain.defaultValue attribute or None
42    @param possibleValues: None or a list of allowed values or a
43        PossibleValues instance.
44   
45    """
46    def d(method):
47        method._ows_parameters = getattr(method, '_ows_parameters', {})
48        method._ows_parameters[name] = make_domain(value=value,
49                                                 possibleValues=possibleValues,
50                                                 meaning=meaning,
51                                                 dataType=dataType,
52                                                 valuesUnit=valuesUnit)
53        return method
54
55    return d
56
57def constraint(name, value=None, possibleValues=None,
58               meaning=None, dataType=None, valuesUnit=None):
59    """
60    A decorator to add a constraint to an operation.
61
62    @param name: the parameter name.  This should be appropriately CamelCased.
63    @param value: the ows:Domain.defaultValue attribute or None
64    @param possibleValues: None or a list of allowed values or a
65        PossibleValues instance.
66   
67    """
68    def d(method):
69        method._ows_constraints = getattr(method, '_ows_constraints', {})
70        method._ows_constraints[name] = make_domain(value=value,
71                                                 possibleValues=possibleValues,
72                                                 meaning=meaning,
73                                                 dataType=dataType,
74                                                 valuesUnit=valuesUnit)
75        return method
76
77    return d
78
79#-----------------------------------------------------------------------------
80
81from unittest import TestCase
82
83class TestDecorators(TestCase):
84    def testParameter(self):
85        @parameter('foo', 'bar')
86        def f(x):
87            return x+1
88        domain = f._ows_parameters['foo']
89        assert domain.defaultValue == 'bar'
90        assert domain.possibleValues.type == domain.possibleValues.ANY_VALUE
91        assert f(2) == 3
92
93    def testConstraint(self):
94        @constraint('foo', 'bar')
95        def f(x):
96            return x+1
97        domain = f._ows_constraints['foo']
98        assert domain.defaultValue == 'bar'
99        assert domain.possibleValues.type == domain.possibleValues.ANY_VALUE
100        assert f(2) == 3
101   
102    def testMultiParameter(self):
103        @parameter('foo', 'bar')
104        @parameter('baz', 12)
105        def f(x):
106            return x+1
107        assert 'foo' in f._ows_parameters.keys()
108        assert 'baz' in f._ows_parameters.keys()
109
110    def testMultiConstraint(self):
111        @constraint('foo', 'bar')
112        @constraint('baz', 12)
113        def f(x):
114            return x+1
115        assert 'foo' in f._ows_constraints.keys()
116        assert 'baz' in f._ows_constraints.keys()
117        assert f(2) == 3
118
119    def testComplexParameter(self):
120        @parameter('foo', 'bar', possibleValues=[1,2,3])
121        def f(x):
122            return x+1
123        domain = f._ows_parameters['foo']
124        assert domain.defaultValue == 'bar'
125        print domain.possibleValues.type
126        assert domain.possibleValues.type == \
127               domain.possibleValues.ALLOWED_VALUES
128        assert domain.possibleValues.allowedValues == [1,2,3]
Note: See TracBrowser for help on using the repository browser.