mirror of
https://github.com/gsi-upm/senpy
synced 2024-11-22 08:12:27 +00:00
201 lines
5.7 KiB
Python
201 lines
5.7 KiB
Python
from future.utils import iteritems
|
|
from .models import Error, Results, Entry, from_string
|
|
import logging
|
|
logger = logging.getLogger(__name__)
|
|
|
|
API_PARAMS = {
|
|
"algorithm": {
|
|
"aliases": ["algorithms", "a", "algo"],
|
|
"required": False,
|
|
"description": ("Algorithms that will be used to process the request."
|
|
"It may be a list of comma-separated names."),
|
|
},
|
|
"expanded-jsonld": {
|
|
"@id": "expanded-jsonld",
|
|
"aliases": ["expanded"],
|
|
"options": "boolean",
|
|
"required": True,
|
|
"default": False
|
|
},
|
|
"with_parameters": {
|
|
"aliases": ['withparameters',
|
|
'with-parameters'],
|
|
"options": "boolean",
|
|
"default": False,
|
|
"required": True
|
|
},
|
|
"outformat": {
|
|
"@id": "outformat",
|
|
"aliases": ["o"],
|
|
"default": "json-ld",
|
|
"required": True,
|
|
"options": ["json-ld", "turtle"],
|
|
},
|
|
"help": {
|
|
"@id": "help",
|
|
"description": "Show additional help to know more about the possible parameters",
|
|
"aliases": ["h"],
|
|
"required": True,
|
|
"options": "boolean",
|
|
"default": False
|
|
},
|
|
"emotionModel": {
|
|
"@id": "emotionModel",
|
|
"aliases": ["emoModel"],
|
|
"required": False
|
|
},
|
|
"conversion": {
|
|
"@id": "conversion",
|
|
"description": "How to show the elements that have (not) been converted",
|
|
"required": True,
|
|
"options": ["filtered", "nested", "full"],
|
|
"default": "full"
|
|
}
|
|
}
|
|
|
|
EVAL_PARAMS = {
|
|
"algorithm": {
|
|
"aliases": ["plug", "p", "plugins", "algorithms", 'algo', 'a', 'plugin'],
|
|
"description": "Plugins to be evaluated",
|
|
"required": True,
|
|
"help": "See activated plugins in /plugins"
|
|
},
|
|
"dataset": {
|
|
"aliases": ["datasets", "data", "d"],
|
|
"description": "Datasets to be evaluated",
|
|
"required": True,
|
|
"help": "See avalaible datasets in /datasets"
|
|
}
|
|
}
|
|
|
|
PLUGINS_PARAMS = {
|
|
"plugin_type": {
|
|
"@id": "pluginType",
|
|
"description": 'What kind of plugins to list',
|
|
"aliases": ["pluginType"],
|
|
"required": True,
|
|
"default": 'analysisPlugin'
|
|
}
|
|
}
|
|
|
|
WEB_PARAMS = {
|
|
"inHeaders": {
|
|
"aliases": ["headers"],
|
|
"required": True,
|
|
"default": False,
|
|
"options": "boolean"
|
|
},
|
|
}
|
|
|
|
CLI_PARAMS = {
|
|
"plugin_folder": {
|
|
"aliases": ["folder"],
|
|
"required": True,
|
|
"default": "."
|
|
},
|
|
}
|
|
|
|
NIF_PARAMS = {
|
|
"input": {
|
|
"@id": "input",
|
|
"aliases": ["i"],
|
|
"required": True,
|
|
"help": "Input text"
|
|
},
|
|
"intype": {
|
|
"@id": "intype",
|
|
"aliases": ["t"],
|
|
"required": False,
|
|
"default": "direct",
|
|
"options": ["direct", "url", "file"],
|
|
},
|
|
"informat": {
|
|
"@id": "informat",
|
|
"aliases": ["f"],
|
|
"required": False,
|
|
"default": "text",
|
|
"options": ["text", "json-ld"],
|
|
},
|
|
"language": {
|
|
"@id": "language",
|
|
"aliases": ["l"],
|
|
"required": False,
|
|
},
|
|
"prefix": {
|
|
"@id": "prefix",
|
|
"aliases": ["p"],
|
|
"required": True,
|
|
"default": "",
|
|
},
|
|
"urischeme": {
|
|
"@id": "urischeme",
|
|
"aliases": ["u"],
|
|
"required": False,
|
|
"default": "RFC5147String",
|
|
"options": "RFC5147String"
|
|
}
|
|
}
|
|
|
|
|
|
def parse_params(indict, *specs):
|
|
if not specs:
|
|
specs = [NIF_PARAMS]
|
|
logger.debug("Parsing: {}\n{}".format(indict, specs))
|
|
outdict = indict.copy()
|
|
wrong_params = {}
|
|
for spec in specs:
|
|
for param, options in iteritems(spec):
|
|
for alias in options.get("aliases", []):
|
|
# Replace each alias with the correct name of the parameter
|
|
if alias in indict and alias != param:
|
|
outdict[param] = indict[alias]
|
|
del outdict[alias]
|
|
continue
|
|
if param not in outdict:
|
|
if "default" in options:
|
|
# We assume the default is correct
|
|
outdict[param] = options["default"]
|
|
elif options.get("required", False):
|
|
wrong_params[param] = spec[param]
|
|
continue
|
|
if "options" in options:
|
|
if options["options"] == "boolean":
|
|
outdict[param] = outdict[param] in [None, True, 'true', '1']
|
|
elif outdict[param] not in options["options"]:
|
|
wrong_params[param] = spec[param]
|
|
if wrong_params:
|
|
logger.debug("Error parsing: %s", wrong_params)
|
|
message = Error(
|
|
status=400,
|
|
message='Missing or invalid parameters',
|
|
parameters=outdict,
|
|
errors=wrong_params)
|
|
raise message
|
|
if 'algorithm' in outdict and not isinstance(outdict['algorithm'], list):
|
|
outdict['algorithm'] = outdict['algorithm'].split(',')
|
|
return outdict
|
|
|
|
|
|
def parse_extra_params(request, plugin=None):
|
|
params = request.parameters.copy()
|
|
if plugin:
|
|
extra_params = parse_params(params, plugin.get('extra_params', {}))
|
|
params.update(extra_params)
|
|
return params
|
|
|
|
|
|
def parse_call(params):
|
|
'''Return a results object based on the parameters used in a call/request.
|
|
'''
|
|
params = parse_params(params, NIF_PARAMS)
|
|
if params['informat'] == 'text':
|
|
results = Results()
|
|
entry = Entry(nif__isString=params['input'])
|
|
results.entries.append(entry)
|
|
elif params['informat'] == 'json-ld':
|
|
results = from_string(params['input'], cls=Results)
|
|
else: # pragma: no cover
|
|
raise NotImplementedError('Informat {} is not implemented'.format(params['informat']))
|
|
results.parameters = params
|
|
return results
|