11from collections .abc import Generator , Iterable , Mapping
22from dataclasses import dataclass
33from types import UnionType
4- from typing import Any , Union , cast , get_args , get_origin
4+ from typing import Union , cast , get_args , get_origin
55
66from pydantic import BaseModel , ValidationError
77from pydantic .fields import FieldInfo
@@ -23,23 +23,23 @@ class PydanticFieldAdapter:
2323 raw_field : FieldInfo
2424
2525 @property
26- def annotation (self ) -> Any :
26+ def annotation (self ) -> object :
2727 return self .raw_field .annotation
2828
2929 @property
30- def excel_codec (self ) -> type [Any ]:
30+ def excel_codec (self ) -> type [ExcelFieldCodec ]:
3131 annotation = self .annotation
3232 origin = get_origin (annotation )
3333 if origin in (UnionType , Union ):
3434 args = [arg for arg in get_args (annotation ) if arg is not type (None )]
3535 if len (args ) != 1 :
3636 raise ProgrammaticError (msg (MessageKey .UNSUPPORTED_FIELD_TYPE_DECLARATION , annotation = annotation ))
37- return cast (type [Any ], args [0 ])
37+ return cast (type [ExcelFieldCodec ], args [0 ])
3838
39- return cast (type [Any ], annotation )
39+ return cast (type [ExcelFieldCodec ], annotation )
4040
4141 @property
42- def value_type (self ) -> type [Any ]:
42+ def value_type (self ) -> type [ExcelFieldCodec ]:
4343 """Backward-compatible alias for excel_codec."""
4444 return self .excel_codec
4545
@@ -67,14 +67,14 @@ def runtime_metadata(self) -> FieldMetaInfo:
6767 declared = self .declared_metadata
6868 return declared .bind_runtime (
6969 required = self .required ,
70- excel_codec = cast ( type [ ExcelFieldCodec ], self .excel_codec ) ,
70+ excel_codec = self .excel_codec ,
7171 parent_label = declared .label ,
7272 parent_key = Key (self .name ),
7373 key = Key (self .name ),
7474 offset = 0 ,
7575 )
7676
77- def validate_value (self , raw_value : Any ) -> Any :
77+ def validate_value (self , raw_value : object ) -> object :
7878 if raw_value is None :
7979 if self .allows_none and not self .required :
8080 return None
@@ -116,12 +116,12 @@ def get_model_field_names(model: type[BaseModel]) -> list[str]:
116116
117117
118118def instantiate_pydantic_model [ModelT : BaseModel ](
119- data : Mapping [str , Any ],
119+ data : Mapping [str , object ],
120120 model : type [ModelT ],
121121) -> ModelT | list [ExcelCellError | ExcelRowError ]:
122122 """Instantiate a Pydantic model and return mapped Excel errors when validation fails."""
123123 model_adapter = PydanticModelAdapter (model )
124- normalized_data : dict [str , Any ] = {}
124+ normalized_data : dict [str , object ] = {}
125125 errors : list [ExcelCellError | ExcelRowError ] = []
126126 failed_fields : set [str ] = set ()
127127
@@ -158,18 +158,14 @@ def _extract_pydantic_model(model: PydanticModelAdapter) -> Generator[FieldMetaI
158158 inherited = sub_field_info .inherited_from (declared_metadata )
159159 yield inherited .bind_runtime (
160160 required = field_adapter .required ,
161- excel_codec = cast ( type [ ExcelFieldCodec ], excel_codec ) ,
161+ excel_codec = excel_codec ,
162162 parent_label = declared_metadata .label ,
163163 parent_key = Key (field_adapter .name ),
164164 key = key ,
165165 offset = offset ,
166166 )
167-
168- elif issubclass (excel_codec , ExcelFieldCodec ):
169- yield field_adapter .runtime_metadata ()
170-
171167 else :
172- raise ProgrammaticError ( msg ( MessageKey . VALUE_TYPE_DECLARATION_UNSUPPORTED , value_type = excel_codec ) )
168+ yield field_adapter . runtime_metadata ( )
173169
174170
175171def _handle_error (
@@ -188,7 +184,7 @@ def _handle_error(
188184
189185
190186def _model_validate [ModelT : BaseModel ](
191- data : dict [str , Any ],
187+ data : dict [str , object ],
192188 model : type [ModelT ],
193189 model_adapter : PydanticModelAdapter ,
194190 failed_fields : set [str ],
0 commit comments