1515import logging
1616LOGGER = logging .getLogger ('PYWPS' )
1717
18- LITERAL_DATA_TYPES = ('float' , 'boolean' , 'integer' , 'string' ,
19- 'positiveInteger' , 'anyURI' , 'time' , 'date' , 'dateTime' ,
20- 'scale' , 'angle' ,
21- 'nonNegativeInteger' , None )
18+ LITERAL_DATA_TYPES = dict ()
19+ """
20+ Store converter functions
21+ """
22+
23+
24+ # Decorator to use on converter function
25+ def register_convert_type (name ):
26+ """Decorator to register a converter
27+
28+ >>> @register_convert_type('type_name')
29+ ... def convert_my_stuff(value):
30+ ... # convert value ...
31+ ... return value
32+ """
33+
34+ def _register_convert_type (function ):
35+ global LITERAL_DATA_TYPES
36+ LITERAL_DATA_TYPES [name ] = function
37+ return function
38+
39+ return _register_convert_type
40+
2241
2342# currently we are supporting just ^^^ data types, feel free to add support for
2443# more
@@ -170,59 +189,24 @@ def from_json(cls, json_input):
170189ALLOWED_VALUES_TYPES = (AllowedValue , AnyValue , NoValue , ValuesReference )
171190
172191
173- def get_converter (convertor ):
174- """function for decoration of convert
175- """
176-
177- def decorator_selector (data_type , data ):
178- convert = None
179- if data_type in LITERAL_DATA_TYPES :
180- if data_type == 'string' :
181- convert = convert_string
182- elif data_type == 'integer' :
183- convert = convert_integer
184- elif data_type == 'float' :
185- convert = convert_float
186- elif data_type == 'boolean' :
187- convert = convert_boolean
188- elif data_type == 'positiveInteger' :
189- convert = convert_positiveInteger
190- elif data_type == 'anyURI' :
191- convert = convert_anyURI
192- elif data_type == 'time' :
193- convert = convert_time
194- elif data_type == 'date' :
195- convert = convert_date
196- elif data_type == 'dateTime' :
197- convert = convert_datetime
198- elif data_type == 'scale' :
199- convert = convert_scale
200- elif data_type == 'angle' :
201- convert = convert_angle
202- elif data_type == 'nonNegativeInteger' :
203- convert = convert_positiveInteger
204- else :
205- raise InvalidParameterValue (
206- "Invalid data_type value of LiteralInput "
207- "set to '{}'" .format (data_type ))
208- try :
209- return convert (data )
210- except ValueError :
211- raise InvalidParameterValue (
212- "Could not convert value '{}' to format '{}'" .format (
213- data , data_type ))
214-
215- return decorator_selector
216-
217-
218- @get_converter
219192def convert (data_type , data ):
220193 """Convert data to target value
221194 """
222195
223- return data_type , data
196+ convert = LITERAL_DATA_TYPES .get (data_type , None )
197+ if convert is None :
198+ raise InvalidParameterValue (
199+ "Invalid data_type value of LiteralInput "
200+ "set to '{}'" .format (data_type ))
201+ try :
202+ return convert (data )
203+ except ValueError :
204+ raise InvalidParameterValue (
205+ "Could not convert value '{}' to format '{}'" .format (
206+ data , data_type ))
224207
225208
209+ @register_convert_type ('boolean' )
226210def convert_boolean (inpt ):
227211 """Return boolean value from input boolean input
228212
@@ -253,6 +237,7 @@ def convert_boolean(inpt):
253237 return val
254238
255239
240+ @register_convert_type ('float' )
256241def convert_float (inpt ):
257242 """Return float value from inpt
258243
@@ -263,6 +248,7 @@ def convert_float(inpt):
263248 return float (inpt )
264249
265250
251+ @register_convert_type ('integer' )
266252def convert_integer (inpt ):
267253 """Return integer value from input inpt
268254
@@ -273,6 +259,7 @@ def convert_integer(inpt):
273259 return int (float (inpt ))
274260
275261
262+ @register_convert_type ('string' )
276263def convert_string (inpt ):
277264 """Return string value from input lit_input
278265
@@ -282,6 +269,8 @@ def convert_string(inpt):
282269 return str (inpt )
283270
284271
272+ @register_convert_type ('nonNegativeInteger' )
273+ @register_convert_type ('positiveInteger' )
285274def convert_positiveInteger (inpt ):
286275 """Return value of input"""
287276
@@ -293,6 +282,7 @@ def convert_positiveInteger(inpt):
293282 return inpt
294283
295284
285+ @register_convert_type ('anyURI' )
296286def convert_anyURI (inpt ):
297287 """Return value of input
298288
@@ -308,6 +298,7 @@ def convert_anyURI(inpt):
308298 'The value "{}" does not seem to be of type anyURI' .format (inpt ))
309299
310300
301+ @register_convert_type ('time' )
311302def convert_time (inpt ):
312303 """Return value of input
313304 time formating assumed according to ISO standard:
@@ -323,6 +314,7 @@ def convert_time(inpt):
323314 return inpt
324315
325316
317+ @register_convert_type ('date' )
326318def convert_date (inpt ):
327319 """Return value of input
328320 date formating assumed according to ISO standard:
@@ -338,6 +330,7 @@ def convert_date(inpt):
338330 return inpt
339331
340332
333+ @register_convert_type ('dateTime' )
341334def convert_datetime (inpt ):
342335 """Return value of input
343336 dateTime formating assumed according to ISO standard:
@@ -360,12 +353,14 @@ def convert_datetime(inpt):
360353 return inpt
361354
362355
356+ @register_convert_type ('scale' )
363357def convert_scale (inpt ):
364358 """Return value of input"""
365359
366360 return convert_float (inpt )
367361
368362
363+ @register_convert_type ('angle' )
369364def convert_angle (inpt ):
370365 """Return value of input
371366
0 commit comments