-
-
Notifications
You must be signed in to change notification settings - Fork 18
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
Creating deserialization_schema for recursive Generic fails #248
Comments
In fact, this is the expected behavior; reason is given in the error message: However, generic classes doesn't have a default type name — mainly because that's a matter of taste, for example, in your case, should it be Solution can be to assign a from __future__ import annotations
from dataclasses import dataclass
from typing import Generic, Sequence, TypeVar, Union
from apischema import type_name
from apischema.json_schema import deserialization_schema
T = TypeVar("T")
@dataclass
class Foo:
bar: int
@type_name(lambda tp, arg: f"{arg.__name__}{tp.__name__}")
@dataclass
class Group(Generic[T]):
children: Tree[T]
Tree = Sequence[Union[T, Group[T]]]
assert deserialization_schema(Tree[Foo]) == {
"type": "array",
"items": {"anyOf": [{"$ref": "#/$defs/Foo"}, {"$ref": "#/$defs/FooGroup"}]},
"$defs": {
"Foo": {
"type": "object",
"properties": {"bar": {"type": "integer"}},
"required": ["bar"],
"additionalProperties": False,
},
"FooGroup": {
"type": "object",
"properties": {
"children": {
"type": "array",
"items": {
"anyOf": [{"$ref": "#/$defs/Foo"}, {"$ref": "#/$defs/FooGroup"}]
},
}
},
"required": ["children"],
"additionalProperties": False,
},
},
"$schema": "http://json-schema.org/draft/2020-12/schema#",
} I admit the documentation is not clear about this use case, I should add a warning somewhere about lack of default "$ref" for generic type. |
Thanks, that fixes it! |
I'm trying to make a deserialization_schema for a recursive Generic type, but it is failing. If I remove the Genericness of the class
Group
it appears to work fine. Am I missing something, or is this a bug?Fails with:
The text was updated successfully, but these errors were encountered: