Skip to content

Commit

Permalink
Support indirect definition references (#1130)
Browse files Browse the repository at this point in the history
  • Loading branch information
dmontagu committed Dec 21, 2023
1 parent 2cb87a6 commit 5c896fe
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
7 changes: 5 additions & 2 deletions python/pydantic_core/core_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -3576,12 +3576,13 @@ def definitions_schema(schema: CoreSchema, definitions: list[CoreSchema]) -> Def
class DefinitionReferenceSchema(TypedDict, total=False):
type: Required[Literal['definition-ref']]
schema_ref: Required[str]
ref: str
metadata: Any
serialization: SerSchema


def definition_reference_schema(
schema_ref: str, metadata: Any = None, serialization: SerSchema | None = None
schema_ref: str, ref: str | None = None, metadata: Any = None, serialization: SerSchema | None = None
) -> DefinitionReferenceSchema:
"""
Returns a schema that points to a schema stored in "definitions", this is useful for nested recursive
Expand All @@ -3606,7 +3607,9 @@ def definition_reference_schema(
metadata: Any other information you want to include with the schema, not used by pydantic-core
serialization: Custom serialization schema
"""
return _dict_not_none(type='definition-ref', schema_ref=schema_ref, metadata=metadata, serialization=serialization)
return _dict_not_none(
type='definition-ref', schema_ref=schema_ref, ref=ref, metadata=metadata, serialization=serialization
)


MYPY = False
Expand Down
10 changes: 10 additions & 0 deletions tests/validators/test_definitions.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,3 +140,13 @@ def test_use_after():
)
)
assert v.validate_python(['1', '2']) == (1, 2)


def test_definition_chain():
v = SchemaValidator(
core_schema.definitions_schema(
core_schema.definition_reference_schema('foo'),
[core_schema.definition_reference_schema(ref='foo', schema_ref='bar'), core_schema.int_schema(ref='bar')],
),
)
assert v.validate_python('1') == 1

0 comments on commit 5c896fe

Please sign in to comment.