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

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

Many new ideas in this commit. It's still in a state of flux.
I'm exploring using decorators and class attributes with the prefix "_ows"
to declare properties that need to be in the OWS capabilities document.

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 parameter(name, value=None, possibleValues=None,
27              meaning=None, dataType=None, valuesUnit=None):
28    """
29    A decorator to add a parameter to an operation.
30
31    @param name: the parameter name.  This should be appropriately CamelCased.
32    @param value: the ows:Domain.defaultValue attribute or None
33    @param possibleValues: None or a list of allowed values or a
34        PossibleValues instance.
35   
36    """
37    def d(method):
38        method._ows_parameters = getattr(method, '_ows_parameters', {})
39        method._ows_parameters[name] = make_domain(value=value,
40                                                 possibleValues=possibleValues,
41                                                 meaning=meaning,
42                                                 dataType=dataType,
43                                                 valuesUnit=valuesUnit)
44        return method
45
46    return d
47
48def constraint(name, value=None, possibleValues=None,
49               meaning=None, dataType=None, valuesUnit=None):
50    """
51    A decorator to add a constraint to an operation.
52
53    @param name: the parameter name.  This should be appropriately CamelCased.
54    @param value: the ows:Domain.defaultValue attribute or None
55    @param possibleValues: None or a list of allowed values or a
56        PossibleValues instance.
57   
58    """
59    def d(method):
60        method._ows_constraints = getattr(method, '_ows_constraints', {})
61        method._ows_constraints[name] = make_domain(value=value,
62                                                 possibleValues=possibleValues,
63                                                 meaning=meaning,
64                                                 dataType=dataType,
65                                                 valuesUnit=valuesUnit)
66        return method
67
68    return d
69
70#-----------------------------------------------------------------------------
71
72from unittest import TestCase
73
74class TestDecorators(TestCase):
75    def testParameter(self):
76        @parameter('foo', 'bar')
77        def f(x):
78            return x+1
79        domain = f._ows_parameters['foo']
80        assert domain.defaultValue == 'bar'
81        assert domain.possibleValues.type == domain.possibleValues.ANY_VALUE
82        assert f(2) == 3
83
84    def testConstraint(self):
85        @constraint('foo', 'bar')
86        def f(x):
87            return x+1
88        domain = f._ows_constraints['foo']
89        assert domain.defaultValue == 'bar'
90        assert domain.possibleValues.type == domain.possibleValues.ANY_VALUE
91        assert f(2) == 3
92   
93    def testMultiParameter(self):
94        @parameter('foo', 'bar')
95        @parameter('baz', 12)
96        def f(x):
97            return x+1
98        assert 'foo' in f._ows_parameters.keys()
99        assert 'baz' in f._ows_parameters.keys()
100
101    def testMultiConstraint(self):
102        @constraint('foo', 'bar')
103        @constraint('baz', 12)
104        def f(x):
105            return x+1
106        assert 'foo' in f._ows_constraints.keys()
107        assert 'baz' in f._ows_constraints.keys()
108        assert f(2) == 3
109
110    def testComplexParameter(self):
111        @parameter('foo', 'bar', possibleValues=[1,2,3])
112        def f(x):
113            return x+1
114        domain = f._ows_parameters['foo']
115        assert domain.defaultValue == 'bar'
116        print domain.possibleValues.type
117        assert domain.possibleValues.type == \
118               domain.possibleValues.ALLOWED_VALUES
119        assert domain.possibleValues.allowedValues == [1,2,3]
Note: See TracBrowser for help on using the repository browser.