openapi-core
openapi-core copied to clipboard
Include parameter name in JSON Schema error path on unmarshalling
Hi,
I've run into the problem, when I'm not able to show which invalid parameter raised an InvalidSchemaValue
.
As InvalidSchemaValue
contains a list of schema_errors
(List[JsonSchemaValidationError]
) I expect to have relative_path
/ absoulte_path
filled for its items. But in reality all items have empty path
/ relative_path
attributes (and absolute_path
property).
I've managed to fix this by manually add parameter name as JSON Schem error path as,
try:
return unmarshaller(value)
except InvalidSchemaValue as err:
# Modify invalid schema validation errors to include parameter name
if isinstance(param_or_media_type, Parameter):
param_name = param_or_media_type.name
for schema_error in err.schema_errors:
schema_error.path = schema_error.relative_path = deque(
[param_name]
)
raise err
instead of plain,
return unmarshaller(value)
But would like to have path filled by openapi_core
instead.
More details in https://github.com/playpauseandstop/rororo/pull/53
Similar issue with CastError
It doesn't contain name
attrib and it is impossible to find out which parameter name resulted casting error
Yeah this is a must
By the way, do you know how to determine the location (path, body, header, etc.) where the erroring parameter is located? It's not in the error object, either.
I feel this is resolved please see my answer to https://github.com/p1c2u/openapi-core/issues/241
I don't think this is resolved. I need to differentiate between schema errors in the request body and in the request parameters (e.g. query string) and there seems to be no info about this on the exception intself nor the schema errors it contains.
I don't know the code base too well, but I was poking around. Couldn't the parameter name just be mapped to the exception here?
try:
value = self._get_parameter(param, request)
except MissingParameter:
continue
except (
MissingRequiredParameter,
DeserializeError,
CastError,
ValidateError,
UnmarshalError,
) as exc:
errors.append(exc)
continue
else:
location = getattr(parameters, param_location)
location[param_name] = value
Errors are definitely something to improve. However this will be a breaking change and I was waiting for this until I refactor validators. I will add errors refactor to the 0.17 roadmap.