Skip to content

Commit d0bb978

Browse files
authored
Merge pull request #668 from gschwind/improve-literaltype-implementation
Improve the implementation of pywps.inout.literaltypes
2 parents 6fa8a21 + d4ee662 commit d0bb978

File tree

1 file changed

+46
-51
lines changed

1 file changed

+46
-51
lines changed

pywps/inout/literaltypes.py

Lines changed: 46 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,29 @@
1515
import logging
1616
LOGGER = 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):
170189
ALLOWED_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
219192
def 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')
226210
def 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')
256241
def 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')
266252
def 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')
276263
def 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')
285274
def 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')
296286
def 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')
311302
def 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')
326318
def 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')
341334
def 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')
363357
def convert_scale(inpt):
364358
"""Return value of input"""
365359

366360
return convert_float(inpt)
367361

368362

363+
@register_convert_type('angle')
369364
def convert_angle(inpt):
370365
"""Return value of input
371366

0 commit comments

Comments
 (0)