Open mouadennasri opened 1 year ago
From a very quick look, I have the feeling you're comparing a schema class/instance and a name. Should it be something more like this?
if resolve_schema_cls(value.nested).__name__ == schema_name:
or perhaps even
if resolve_schema_cls(value.nested) == resolve_schema_cls(schema):
@lafrech thank you for the quick feedback! but sadly that didn't solve the issue, the ApiSpec.refs
is empty and it raises:
ref_schema = self.spec.components.get_ref("schema", self.refs[schema_key])
KeyError: (<class 'api.insights.serializers.base.FilterSchema'>, None, frozenset(), frozenset(), frozenset(), False)
These are some debug outputs:
(Pdb) self.refs
{}
(Pdb) schema_key
(<class 'api.insights.serializers.base.FilterSchema'>, None, frozenset(), frozenset(), frozenset(), False)
(Pdb) self.spec.components.to_dict()
{
"schemas": {
"FilterSchema": {
"type": "object",
"properties": {
"next_filter": {
"nullable": True,
"allOf": [{"$ref": "#/components/schemas/FilterSchema"}],
},
"filter_type": {
"type": "string",
"enum": [
"Filter",
"IsFinishedFilter",
],
},
"params": {
"type": "array",
"nullable": True,
"items": {"nullable": True},
},
"operator_class": {
"type": "string",
"enum": [
"QueryOp",
"AndOperator",
],
},
"legacy_filter": {"type": "object"},
"auction_id": {
"type": "array",
"nullable": True,
"items": {"type": "string"},
},
"filter_join": {
"type": "string",
"enum": [
"QueryOp",
"AndOperator"
],
},
},
"required": ["filter_type", "operator_class"],
}
}
}
(Pdb) self.spec.components.get_ref("schema", "FilterSchema")
{'$ref': '#/components/schemas/FilterSchema'}
I have an issue with nested self-referencing schema,
The issue is with
FilterSchema
I have a helper method that converts Marshmallow Schema to an OpenApiJson object:
The
schema_name_resolver
as described in the docs should not returnNone
for Circular schemasBut it still complains:
And I'm sure that the
schema_name_resolver
is returning astring
when the schema is circularUsing a resolver as
lambda schema_class: None
will raise the error below which is understandable!I'm using: