@@ -476,10 +476,7 @@ class M(BaseModel):
476476 Working = B [m ]
477477 generics .append (Working )
478478
479- # A[int, C] -> 2 caches
480- # A[int, C][M] -> 3 caches // this is generated by `mro`
481- # B[M] -> 3 caches
482- target_size = cache_size + count_create_models * 3 * 2 + 2
479+ target_size = cache_size + count_create_models * 3 + 2
483480 assert len (_GENERIC_TYPES_CACHE ) < target_size + _LIMITED_DICT_SIZE
484481 del models
485482 del generics
@@ -2871,139 +2868,13 @@ class AllowExtraGeneric(BaseModel, Generic[T], extra='allow'):
28712868 data : T
28722869
28732870
2874- def test_generic_mro_single ():
2875- T = TypeVar ('T' )
2876-
2877- # 1.
2878- class A (BaseModel , Generic [T ]): ...
2879-
2880- class B (A , Generic [T ]): ...
2881-
2882- assert B [int ].__mro__ == (B [int ], B , A [int ], A , BaseModel , Generic , object )
2883-
2884- # 2.
2885- class A (BaseModel , Generic [T ]): ...
2886-
2887- class B (A [T ]): ...
2888-
2889- class C (B [int ]): ...
2890-
2891- assert B .__mro__ == (B , A , BaseModel , Generic , object )
2892- assert C .__mro__ == (C , B [int ], B , A [int ], A , BaseModel , Generic , object )
2893-
2894- # 3.
2895- class A (BaseModel , Generic [T ]): ...
2896-
2897- class B (A [T ], Generic [T ]): ...
2898-
2899- class C (B [T ], Generic [T ]): ...
2900-
2901- assert B .__mro__ == (B , A , BaseModel , Generic , object )
2902- assert B [int ].__mro__ == (B [int ], B , A [int ], A , BaseModel , Generic , object )
2903- assert C [int ].__mro__ == (C [int ], C , B [int ], B , A [int ], A , BaseModel , Generic , object )
2904-
2905- # 4.
2906- class A (BaseModel , Generic [T ]): ...
2907-
2908- class B (A [int ], Generic [T ]): ...
2909-
2910- class C (B [str ], Generic [T ]): ...
2911-
2912- assert B .__mro__ == (B , A [int ], A , BaseModel , Generic , object )
2913- assert C .__mro__ == (C , B [str ], B , A [int ], A , BaseModel , Generic , object )
2914-
2915-
2916- def test_generic_mro_multi ():
2917- T1 = TypeVar ('T1' )
2918- T2 = TypeVar ('T2' )
2919- T3 = TypeVar ('T3' )
2920-
2921- # 1.
2922- class A (BaseModel , Generic [T1 , T2 ]): ...
2923-
2924- class B (A [int , T2 ], BaseModel , Generic [T2 ]): ...
2925-
2926- assert A [int , T2 ][str ].__mro__ == (A [int , T2 ][str ], A , BaseModel , Generic , object )
2927- assert B [str ].__mro__ == (B [str ], B , A [int , T2 ][str ], A , BaseModel , Generic , object )
2928-
2929- # 2.
2930- class A (BaseModel , Generic [T1 , T2 ]): ...
2931-
2932- B = A [int , T2 ]
2933- C = B [str ]
2934-
2935- assert B .__mro__ == (A [int , T2 ], A , BaseModel , Generic , object )
2936- assert C .__mro__ == (B [str ], A , BaseModel , Generic , object )
2937-
2938- # 3.
2939-
2940- class A (BaseModel , Generic [T1 ]): ...
2941-
2942- class B1 (A [T1 ], Generic [T1 , T2 ]): ...
2943-
2944- class B2 (A [T2 ], Generic [T1 , T2 ]): ...
2945-
2946- assert B1 [T1 , str ].__mro__ == (B1 [T1 , str ], B1 , A , BaseModel , Generic , object )
2947- assert B2 [T1 , str ].__mro__ == (B2 [T1 , str ], B2 , A [str ], A , BaseModel , Generic , object )
2948-
2949- assert B1 [T1 , str ][int ].__mro__ == (B1 [T1 , str ][int ], B1 , A [int ], A , BaseModel , Generic , object )
2950- assert B2 [T1 , str ][int ].__mro__ == (B2 [T1 , str ][int ], B2 , A [str ], A , BaseModel , Generic , object )
2951-
2952- assert B1 [int , str ].__mro__ == (B1 [int , str ], B1 , A [int ], A , BaseModel , Generic , object )
2953- assert B2 [int , str ].__mro__ == (B2 [int , str ], B2 , A [str ], A , BaseModel , Generic , object )
2954-
2955- # 4.
2956-
2957- class A (BaseModel , Generic [T1 ]): ...
2958-
2959- class B (A [T2 ], Generic [T2 ]): ...
2960-
2961- class C1 (B [T3 ], Generic [T3 , T1 ]): ...
2962-
2963- class C2 (B [T3 ], Generic [T3 , T2 ]): ...
2964-
2965- assert C1 [int , str ].__mro__ == (C1 [int , str ], C1 , B [int ], B , A [int ], A , BaseModel , Generic , object )
2966- assert C2 [int , str ].__mro__ == (C2 [int , str ], C2 , B [int ], B , A [int ], A , BaseModel , Generic , object )
2967-
2968-
2969- def test_generic_mro_circular_typevar ():
2970- T1 = TypeVar ('T1' )
2971- T2 = TypeVar ('T2' )
2972- T3 = TypeVar ('T3' )
2973-
2974- class A (BaseModel , Generic [T1 ]): ...
2975-
2976- class B (A [T2 ], Generic [T2 ]): ...
2977-
2978- class C (B [T3 ], Generic [T3 ]): ...
2979-
2980- class D (C [T1 ], Generic [T1 ]): ...
2981-
2982- class E (D [T2 ], Generic [T2 ]): ...
2983-
2984- assert E [int ].__mro__ == (E [int ], E , D [int ], D , C [int ], C , B [int ], B , A [int ], A , BaseModel , Generic , object )
2985-
2986-
2987- def test_generic_mro_swap ():
2988- T1 = TypeVar ('T1' )
2989- T2 = TypeVar ('T2' )
2990-
2991- class A (BaseModel , Generic [T1 ]): ...
2992-
2993- class B (A [T1 ], Generic [T1 , T2 ]): ...
2994-
2995- class BSwap (B [T2 , T1 ], Generic [T1 , T2 ]): ...
2996-
2997- C = BSwap [T1 , str ]
2998-
2999- assert C .__mro__ == (C , BSwap , B [str , T1 ], B , A [str ], A , BaseModel , Generic , object )
3000- assert C [int ].__mro__ == (C [int ], BSwap , B [str , int ], B , A [str ], A , BaseModel , Generic , object )
3001-
3002- assert BSwap [int , str ].__mro__ [1 :] == C [int ].__mro__ [1 :]
3003-
3004-
30052871def test_generic_field ():
3006- # https://github.com/pydantic/pydantic/issues/10039
2872+ """Test for https://github.com/pydantic/pydantic/issues/10039.
2873+
2874+ This was originally fixed by defining a custom MRO for Pydantic models,
2875+ but the fix from https://github.com/pydantic/pydantic/pull/10666 seemed
2876+ better. Test is still kept for historical purposes.
2877+ """
30072878
30082879 T = TypeVar ('T' )
30092880
@@ -3018,9 +2889,6 @@ class Model(BaseModel):
30182889
30192890 Model (input_bool = C ())
30202891
3021- assert C .__mro__ == (C , B [bool ], B , A [bool ], A , BaseModel , Generic , object )
3022- assert issubclass (C , A [bool ]) and issubclass (C , A [int ]) is False
3023-
30242892
30252893def test_generic_any_or_never () -> None :
30262894 T = TypeVar ('T' )
@@ -3099,41 +2967,3 @@ class Holder(BaseModel, Generic[T]):
30992967 holder2 = Holder (inner = Inner (inner = 1 ))
31002968 # implies that validation succeeds for both
31012969 assert holder1 == holder2
3102-
3103-
3104- def test_generic_mro_multi_level ():
3105- """Pass another generic model as an arg.
3106-
3107- See https://github.com/pydantic/pydantic/issues/11024.
3108- """
3109-
3110- T = TypeVar ('T' )
3111-
3112- class GenericBaseModel (BaseModel , Generic [T ]): ...
3113-
3114- class EnumerableModel (GenericBaseModel [T ]):
3115- values : List [T ]
3116-
3117- T1 = TypeVar ('T1' )
3118- T2 = TypeVar ('T2' )
3119-
3120- class CombineModel (BaseModel , Generic [T1 , T2 ]):
3121- field_1 : T1
3122- field_2 : T2
3123-
3124- class EnumerableCombineModel (EnumerableModel [CombineModel [T1 , T2 ]]): ...
3125-
3126- m = EnumerableCombineModel [int , int ]
3127-
3128- mro = (
3129- EnumerableCombineModel [int , int ],
3130- EnumerableCombineModel ,
3131- EnumerableModel [CombineModel [int , int ]],
3132- EnumerableModel ,
3133- GenericBaseModel [CombineModel [int , int ]],
3134- GenericBaseModel ,
3135- BaseModel ,
3136- Generic ,
3137- object ,
3138- )
3139- assert m .__mro__ == tuple (HasRepr (repr (m )) for m in mro )
0 commit comments