2323from collections .abc import Callable
2424from datetime import date , datetime
2525from decimal import Decimal
26- from typing import Any
26+ from typing import Any , cast
2727
2828from tango .exceptions import ModelInstantiationError
2929from tango .shapes .generator import TypeGenerator
@@ -542,38 +542,6 @@ def create_instance(
542542 # Value is not a dict - might be a primitive or None
543543 result [result_field_name ] = value
544544
545- elif field_spec .is_wildcard :
546- # Wildcard on nested field - use full model type
547- # This is handled at the top level, but we need to handle it here too
548- # for nested wildcards like recipient(*)
549- if field_schema .nested_model :
550- if field_schema .is_list :
551- if isinstance (value , list ):
552- nested_instances = []
553- for item in value :
554- if isinstance (item , dict ):
555- # Parse all fields from the nested model
556- nested_instance = self ._parse_nested_wildcard (
557- item , field_schema .nested_model
558- )
559- nested_instances .append (nested_instance )
560- else :
561- nested_instances .append (item )
562- result [result_field_name ] = nested_instances
563- else :
564- result [result_field_name ] = value
565- else :
566- if isinstance (value , dict ):
567- nested_instance = self ._parse_nested_wildcard (
568- value , field_schema .nested_model
569- )
570- result [result_field_name ] = nested_instance
571- else :
572- result [result_field_name ] = value
573- else :
574- # Not a nested model, just use the value
575- result [result_field_name ] = value
576-
577545 else :
578546 # Simple field - parse using appropriate parser
579547 parsed_value = self ._parse_field (
@@ -661,7 +629,7 @@ def _resolve_nested_model(self, nested_model: type | str) -> type:
661629 raise ModelInstantiationError (
662630 f"Could not resolve nested model '{ nested_model } '"
663631 )
664- return model_class
632+ return cast ( type , model_class )
665633 except ImportError as err :
666634 raise ModelInstantiationError (
667635 f"Could not import models module to resolve '{ nested_model } '"
@@ -704,41 +672,6 @@ def _create_nested_instance(
704672 # Recursively create nested instance
705673 return self .create_instance (data , nested_shape , resolved_model , nested_type )
706674
707- def _parse_nested_wildcard (
708- self , data : dict [str , Any ], nested_model : type | str
709- ) -> dict [str , Any ]:
710- """Parse nested object with wildcard (all fields)
711-
712- Args:
713- data: Nested object data
714- nested_model: Model class or string name for the nested object
715-
716- Returns:
717- Dictionary with all parsed fields
718- """
719- # Resolve nested model if it's a string
720- resolved_model = self ._resolve_nested_model (nested_model )
721-
722- # Ensure model is registered
723- if not self .schema_registry .is_registered (resolved_model ):
724- self .schema_registry .register (resolved_model )
725-
726- # Get model schema
727- model_schema = self .schema_registry .get_schema (resolved_model )
728-
729- # Parse all fields
730- result : dict [str , Any ] = {}
731- for field_name , value in data .items ():
732- if field_name in model_schema :
733- field_schema = model_schema [field_name ]
734- parsed_value = self ._parse_field (field_name , value , field_schema .type , field_schema )
735- result [field_name ] = parsed_value
736- else :
737- # Field not in schema, include as-is
738- result [field_name ] = value
739-
740- return result
741-
742675 def _parse_field (self , field_name : str , value : Any , field_type : type , field_schema : Any ) -> Any :
743676 """Parse a single field value using appropriate parser
744677
@@ -778,7 +711,7 @@ def _parse_field(self, field_name: str, value: Any, field_type: type, field_sche
778711 return value
779712
780713 def validate_data (
781- self , data : dict [str , Any ], shape_spec : ShapeSpec , base_model : type
714+ self , data : dict [str , Any ], shape_spec : ShapeSpec , base_model : type | str
782715 ) -> list [str ]:
783716 """Validate that data matches the shape specification
784717
@@ -803,11 +736,15 @@ def validate_data(
803736 errors : list [str ] = []
804737
805738 if not isinstance (data , dict ):
806- errors .append (f"Expected dictionary data, got { type (data ).__name__ } " )
739+ errors .append ( # type: ignore[unreachable]
740+ f"Expected dictionary data, got { type (data ).__name__ } "
741+ )
807742 return errors
808743
809- # Ensure model is registered
810- if not self .schema_registry .is_registered (base_model ):
744+ # Ensure model is registered. String model names are expected to be
745+ # pre-registered (explicit schemas); only concrete classes can be
746+ # auto-registered via introspection.
747+ if isinstance (base_model , type ) and not self .schema_registry .is_registered (base_model ):
811748 self .schema_registry .register (base_model )
812749
813750 # Get model schema
@@ -826,9 +763,8 @@ def validate_data(
826763
827764 # Check if field exists in schema
828765 if field_spec .name not in model_schema :
829- errors .append (
830- f"Field '{ field_spec .name } ' does not exist in { base_model .__name__ } schema"
831- )
766+ model_name = base_model .__name__ if isinstance (base_model , type ) else base_model
767+ errors .append (f"Field '{ field_spec .name } ' does not exist in { model_name } schema" )
832768 continue
833769
834770 field_schema = model_schema [field_spec .name ]
0 commit comments