Skip to content

Include parameter name in JSON Schema error path on unmarshalling #246

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
playpauseandstop opened this issue Apr 23, 2020 · 7 comments · Fixed by #473
Closed

Include parameter name in JSON Schema error path on unmarshalling #246

playpauseandstop opened this issue Apr 23, 2020 · 7 comments · Fixed by #473
Labels
area/casting Indicates an issue on casting area. area/unmarshalling Indicates an issue on unmarshalling area.

Comments

@playpauseandstop
Copy link

playpauseandstop commented Apr 23, 2020

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 playpauseandstop/rororo#53

@playpauseandstop
Copy link
Author

Similar issue with CastError

It doesn't contain name attrib and it is impossible to find out which parameter name resulted casting error

@p1c2u p1c2u added area/casting Indicates an issue on casting area. area/unmarshalling Indicates an issue on unmarshalling area. labels Jul 20, 2020
@jgod
Copy link
Contributor

jgod commented Dec 24, 2020

Yeah this is a must

@jgod
Copy link
Contributor

jgod commented Dec 24, 2020

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.

@osynge
Copy link

osynge commented Nov 1, 2021

I feel this is resolved please see my answer to #241

@jyggen
Copy link
Contributor

jyggen commented Sep 26, 2022

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.

@wickedest
Copy link
Contributor

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

@p1c2u
Copy link
Collaborator

p1c2u commented Jan 12, 2023

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/casting Indicates an issue on casting area. area/unmarshalling Indicates an issue on unmarshalling area.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants