Coverage for pydantic/_internal/_core_metadata.py: 100.00%
34 statements
« prev ^ index » next coverage.py v7.5.3, created at 2024-06-21 17:00 +0000
« prev ^ index » next coverage.py v7.5.3, created at 2024-06-21 17:00 +0000
1from __future__ import annotations as _annotations 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
3import typing 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
4from typing import Any 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
6import typing_extensions 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
8if typing.TYPE_CHECKING: 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
9 from ._schema_generation_shared import (
10 CoreSchemaOrField as CoreSchemaOrField,
11 )
12 from ._schema_generation_shared import (
13 GetJsonSchemaFunction,
14 )
17class CoreMetadata(typing_extensions.TypedDict, total=False): 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
18 """A `TypedDict` for holding the metadata dict of the schema.
20 Attributes:
21 pydantic_js_functions: List of JSON schema functions.
22 pydantic_js_prefer_positional_arguments: Whether JSON schema generator will
23 prefer positional over keyword arguments for an 'arguments' schema.
24 """
26 pydantic_js_functions: list[GetJsonSchemaFunction] 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
27 pydantic_js_annotation_functions: list[GetJsonSchemaFunction] 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
29 # If `pydantic_js_prefer_positional_arguments` is True, the JSON schema generator will
30 # prefer positional over keyword arguments for an 'arguments' schema.
31 pydantic_js_prefer_positional_arguments: bool | None 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
33 pydantic_typed_dict_cls: type[Any] | None # TODO: Consider moving this into the pydantic-core TypedDictSchema 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
36class CoreMetadataHandler: 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
37 """Because the metadata field in pydantic_core is of type `Any`, we can't assume much about its contents.
39 This class is used to interact with the metadata field on a CoreSchema object in a consistent
40 way throughout pydantic.
41 """
43 __slots__ = ('_schema',) 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
45 def __init__(self, schema: CoreSchemaOrField): 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
46 self._schema = schema 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
48 metadata = schema.get('metadata') 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
49 if metadata is None: 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
50 schema['metadata'] = CoreMetadata() 1abcdefghijklmnopqrstuvwxyzABCDEF
51 elif not isinstance(metadata, dict): 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
52 raise TypeError(f'CoreSchema metadata should be a dict; got {metadata!r}.') 1abcdefghijklmnopqrstuvwxyzABCDEF
54 @property 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
55 def metadata(self) -> CoreMetadata: 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
56 """Retrieves the metadata dict from the schema, initializing it to a dict if it is None
57 and raises an error if it is not a dict.
58 """
59 metadata = self._schema.get('metadata') 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
60 if metadata is None: 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
61 self._schema['metadata'] = metadata = CoreMetadata() 1abcdefghijklmnopqrstuvwxyzABCDEF
62 if not isinstance(metadata, dict): 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
63 raise TypeError(f'CoreSchema metadata should be a dict; got {metadata!r}.') 1abcdefghijklmnopqrstuvwxyzABCDEF
64 return metadata 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
67def build_metadata_dict( 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
68 *, # force keyword arguments to make it easier to modify this signature in a backwards-compatible way
69 js_functions: list[GetJsonSchemaFunction] | None = None,
70 js_annotation_functions: list[GetJsonSchemaFunction] | None = None,
71 js_prefer_positional_arguments: bool | None = None,
72 typed_dict_cls: type[Any] | None = None,
73 initial_metadata: Any | None = None,
74) -> Any:
75 """Builds a dict to use as the metadata field of a CoreSchema object in a manner that is consistent
76 with the CoreMetadataHandler class.
77 """
78 if initial_metadata is not None and not isinstance(initial_metadata, dict): 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
79 raise TypeError(f'CoreSchema metadata should be a dict; got {initial_metadata!r}.') 1abcdefghijklmnopqrstuvwxyzABCDEF
81 metadata = CoreMetadata( 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
82 pydantic_js_functions=js_functions or [],
83 pydantic_js_annotation_functions=js_annotation_functions or [],
84 pydantic_js_prefer_positional_arguments=js_prefer_positional_arguments,
85 pydantic_typed_dict_cls=typed_dict_cls,
86 )
87 metadata = {k: v for k, v in metadata.items() if v is not None} 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
89 if initial_metadata is not None: 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF
90 metadata = {**initial_metadata, **metadata} 1abcdefghijklmnopqrstuvwxyzABCDEF
92 return metadata 1abcdefghijklmnopqrstuvGHIJKLMNOwxyzABCDEF