Skip to content

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

Getting PointerToNowhere when migrating from RefResolver to referencing #1312

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
stefanofusai opened this issue Oct 28, 2024 · 1 comment
Closed

Comments

@stefanofusai
Copy link

I have been trying my best to migrate from RefResolver to the newer referencing lib but with no avail, and I even requested for help in the openapi-schema-validator repository: python-openapi/openapi-schema-validator#203 as I'm using jsonschema together with the openapi-schema-validator library.

I will report the issue I opened there, hoping that someone from your team can better assist me. Thank you for the help.


Dear team,
I've been trying my best to migrate my schema validation from RefResolver to the newer referencing library, but with no avail.
I would really appreciate some help or tips to point me in the right direction.

What is working for me, with RefResolver, is the following code:

def validate_schema(
    instance: dict[str, Any],
    schema: dict[str, Any],
    *,
    path: str,
    method: str,
    response: str,
    content: str = "application/json",
) -> None:
    try:
        _methods = schema["paths"][path]

    except KeyError:  # pragma: no cover (should never happen)
        msg = f"Path {path} not found in schema"
        raise ValueError(msg) from None

    try:
        _responses = _methods[method]

    except KeyError:  # pragma: no cover (should never happen)
        msg = f"Method {method} not found in schema"
        raise ValueError(msg) from None

    try:
        _content = _responses["responses"][response]["content"]

    except KeyError:  # pragma: no cover (should never happen)
        msg = f"Response {response} not found in schema"
        raise ValueError(msg) from None

    try:
        _schema = _content[content]["schema"]

    except KeyError:  # pragma: no cover (should never happen)
        msg = f"Content {content} not found in schema"
        raise ValueError(msg) from None

    openapi_schema_validator.validate(
        instance,
        _schema,
        cls=OAS30Validator,
        resolver=RefResolver.from_schema(schema),  # TODO: migrate to referencing lib
    )

I then tried to migrate to the referencing lib as mentioned here:

resource = Resource.from_contents(schema, default_specification=DRAFT202012)
registry = Registry().with_resource("", resource)
openapi_schema_validator.validate(instance, _schema, registry=registry)

But with no success, as all I get are errors like:
jsonschema.exceptions._WrappedReferencingError: PointerToNowhere: '/components/schemas/Foo' does not exist within {'$ref': '#/components/schemas/Foo'}

What am I missing? Thank you for the help.

@Julian
Copy link
Member

Julian commented Oct 28, 2024

I will try to find some time to look there, but {'$ref': '#/components/schemas/Foo'} is never correct. That pointer means "in this document is a key called components, and in it is a subkey called schemas, and.. etc.

But that's clearly wrong, as that document has one and only one key in it, it's $ref.

@python-jsonschema python-jsonschema locked and limited conversation to collaborators Oct 28, 2024
@Julian Julian converted this issue into discussion #1313 Oct 28, 2024

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants