From 5dd3d6bb3a063e85c3134ef15200792eeade0bc7 Mon Sep 17 00:00:00 2001 From: imseananriley Date: Sun, 23 Jun 2024 21:14:17 -0600 Subject: [PATCH] fixes json schema issue Signed-off-by: imseananriley --- pandera/typing/pandas.py | 46 ++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/pandera/typing/pandas.py b/pandera/typing/pandas.py index 9c2a0b7c3..3c444b533 100644 --- a/pandera/typing/pandas.py +++ b/pandera/typing/pandas.py @@ -19,6 +19,7 @@ import numpy as np import pandas as pd +from pandera.config import config_context from pandera.engines import PYDANTIC_V2 from pandera.errors import SchemaError, SchemaInitError from pandera.typing.common import ( @@ -30,12 +31,6 @@ ) from pandera.typing.formats import Formats -try: - from typing import get_args -except ImportError: - from typing_extensions import get_args - - try: from typing import _GenericAlias # type: ignore[attr-defined] except ImportError: # pragma: no cover @@ -190,13 +185,38 @@ def _get_schema_model(cls, field): def __get_pydantic_core_schema__( cls, _source_type: Any, _handler: GetCoreSchemaHandler ) -> core_schema.CoreSchema: - schema_model = get_args(_source_type)[0] - return core_schema.no_info_plain_validator_function( - functools.partial( - cls.pydantic_validate, - schema_model=schema_model, - ), - ) + + with config_context(validation_enabled=False): + schema_model = _source_type().__orig_class__.__args__[0] + if (schema_model.Config.from_format == "dict") and ( + schema_model.Config.from_format_kwargs == {"orient": "records"} + ): + schema = schema_model.to_schema() + type_map = { + "str": core_schema.str_schema(), + "int64": core_schema.int_schema(), + "float64": core_schema.float_schema(), + "bool": core_schema.bool_schema(), + "datetime64[ns]": core_schema.datetime_schema(), + } + + return core_schema.list_schema( + core_schema.typed_dict_schema( + { + i: core_schema.typed_dict_field( + type_map[str(j.dtype)] + ) + for i, j in schema.columns.items() + }, + ) + ) + else: + return core_schema.no_info_plain_validator_function( + functools.partial( + cls.pydantic_validate, + schema_model=schema_model, + ), + ) else: