@@ -584,7 +584,7 @@ def _internal_class_schema(
584584 if field .init or include_non_init
585585 )
586586
587- schema_class = type (clazz . __name__ , (_base_schema (clazz , base_schema ),), attributes )
587+ schema_class = type (_name , (_base_schema (clazz , base_schema ),), attributes )
588588 return cast (Type [marshmallow .Schema ], schema_class )
589589
590590
@@ -602,6 +602,7 @@ def _field_by_supertype(
602602 newtype_supertype : Type ,
603603 metadata : dict ,
604604 base_schema : Optional [Type [marshmallow .Schema ]],
605+ generic_params_to_args : Optional [Tuple [Tuple [type , type ], ...]] = None ,
605606) -> marshmallow .fields .Field :
606607 """
607608 Return a new field for fields based on a super field. (Usually spawned from NewType)
@@ -632,6 +633,7 @@ def _field_by_supertype(
632633 metadata = metadata ,
633634 default = default ,
634635 base_schema = base_schema ,
636+ generic_params_to_args = generic_params_to_args ,
635637 )
636638
637639
@@ -655,6 +657,7 @@ def _generic_type_add_any(typ: type) -> type:
655657def _field_for_generic_type (
656658 typ : type ,
657659 base_schema : Optional [Type [marshmallow .Schema ]],
660+ generic_params_to_args : Optional [Tuple [Tuple [type , type ], ...]] = None ,
658661 ** metadata : Any ,
659662) -> Optional [marshmallow .fields .Field ]:
660663 """
@@ -667,7 +670,11 @@ def _field_for_generic_type(
667670 type_mapping = base_schema .TYPE_MAPPING if base_schema else {}
668671
669672 if origin in (list , List ):
670- child_type = _field_for_schema (arguments [0 ], base_schema = base_schema )
673+ child_type = field_for_schema (
674+ arguments [0 ],
675+ base_schema = base_schema ,
676+ generic_params_to_args = generic_params_to_args ,
677+ )
671678 list_type = cast (
672679 Type [marshmallow .fields .List ],
673680 type_mapping .get (List , marshmallow .fields .List ),
@@ -680,25 +687,42 @@ def _field_for_generic_type(
680687 ):
681688 from . import collection_field
682689
683- child_type = _field_for_schema (arguments [0 ], base_schema = base_schema )
690+ child_type = field_for_schema (
691+ arguments [0 ],
692+ base_schema = base_schema ,
693+ generic_params_to_args = generic_params_to_args ,
694+ )
684695 return collection_field .Sequence (cls_or_instance = child_type , ** metadata )
685696 if origin in (set , Set ):
686697 from . import collection_field
687698
688- child_type = _field_for_schema (arguments [0 ], base_schema = base_schema )
699+ child_type = field_for_schema (
700+ arguments [0 ],
701+ base_schema = base_schema ,
702+ generic_params_to_args = generic_params_to_args ,
703+ )
689704 return collection_field .Set (
690705 cls_or_instance = child_type , frozen = False , ** metadata
691706 )
692707 if origin in (frozenset , FrozenSet ):
693708 from . import collection_field
694709
695- child_type = _field_for_schema (arguments [0 ], base_schema = base_schema )
710+ child_type = field_for_schema (
711+ arguments [0 ],
712+ base_schema = base_schema ,
713+ generic_params_to_args = generic_params_to_args ,
714+ )
696715 return collection_field .Set (
697716 cls_or_instance = child_type , frozen = True , ** metadata
698717 )
699718 if origin in (tuple , Tuple ):
700719 children = tuple (
701- _field_for_schema (arg , base_schema = base_schema ) for arg in arguments
720+ field_for_schema (
721+ arg ,
722+ base_schema = base_schema ,
723+ generic_params_to_args = generic_params_to_args ,
724+ )
725+ for arg in arguments
702726 )
703727 tuple_type = cast (
704728 Type [marshmallow .fields .Tuple ],
@@ -710,8 +734,16 @@ def _field_for_generic_type(
710734 if origin in (dict , Dict , collections .abc .Mapping , Mapping ):
711735 dict_type = type_mapping .get (Dict , marshmallow .fields .Dict )
712736 return dict_type (
713- keys = _field_for_schema (arguments [0 ], base_schema = base_schema ),
714- values = _field_for_schema (arguments [1 ], base_schema = base_schema ),
737+ keys = field_for_schema (
738+ arguments [0 ],
739+ base_schema = base_schema ,
740+ generic_params_to_args = generic_params_to_args ,
741+ ),
742+ values = field_for_schema (
743+ arguments [1 ],
744+ base_schema = base_schema ,
745+ generic_params_to_args = generic_params_to_args ,
746+ ),
715747 ** metadata ,
716748 )
717749
@@ -768,6 +800,7 @@ def _field_for_union_type(
768800 subtypes [0 ],
769801 metadata = metadata ,
770802 base_schema = base_schema ,
803+ generic_params_to_args = generic_params_to_args ,
771804 )
772805 from . import union_field
773806
@@ -779,6 +812,7 @@ def _field_for_union_type(
779812 subtyp ,
780813 metadata = {"required" : True },
781814 base_schema = base_schema ,
815+ generic_params_to_args = generic_params_to_args ,
782816 ),
783817 )
784818 for subtyp in subtypes
@@ -818,14 +852,17 @@ def field_for_schema(
818852 <class 'marshmallow.fields.Url'>
819853 """
820854 with _SchemaContext (localns = typ_frame .f_locals if typ_frame is not None else None ):
821- return _field_for_schema (typ , default , metadata , base_schema )
855+ return _field_for_schema (
856+ typ , default , metadata , base_schema , generic_params_to_args
857+ )
822858
823859
824860def _field_for_schema (
825861 typ : type ,
826862 default : Any = marshmallow .missing ,
827863 metadata : Optional [Mapping [str , Any ]] = None ,
828864 base_schema : Optional [Type [marshmallow .Schema ]] = None ,
865+ generic_params_to_args : Optional [Tuple [Tuple [type , type ], ...]] = None ,
829866) -> marshmallow .fields .Field :
830867 """
831868 Get a marshmallow Field corresponding to the given python type.
@@ -913,7 +950,9 @@ def _field_for_schema(
913950 )
914951 else :
915952 subtyp = Any
916- return _field_for_schema (subtyp , default , metadata , base_schema )
953+ return field_for_schema (
954+ subtyp , default , metadata , base_schema , generic_params_to_args
955+ )
917956
918957 annotated_field = _field_for_annotated_type (typ , ** metadata )
919958 if annotated_field :
@@ -938,6 +977,7 @@ def _field_for_schema(
938977 newtype_supertype = newtype_supertype ,
939978 metadata = metadata ,
940979 base_schema = base_schema ,
980+ generic_params_to_args = generic_params_to_args ,
941981 )
942982
943983 # enumerations
0 commit comments