@@ -895,3 +895,95 @@ class Model:
895
895
'url' : f'https://errors.pydantic.dev/{ pydantic_version } /v/dataclass_type' ,
896
896
}
897
897
]
898
+
899
+
900
+ def test_cyclic_data () -> None :
901
+ cyclic_data = {}
902
+ cyclic_data ['b' ] = {'a' : cyclic_data }
903
+
904
+ schema = core_schema .definitions_schema (
905
+ core_schema .definition_reference_schema ('a' ),
906
+ [
907
+ core_schema .typed_dict_schema (
908
+ {
909
+ 'b' : core_schema .typed_dict_field (
910
+ core_schema .nullable_schema (core_schema .definition_reference_schema ('b' ))
911
+ )
912
+ },
913
+ ref = 'a' ,
914
+ ),
915
+ core_schema .typed_dict_schema (
916
+ {
917
+ 'a' : core_schema .typed_dict_field (
918
+ core_schema .nullable_schema (core_schema .definition_reference_schema ('a' ))
919
+ )
920
+ },
921
+ ref = 'b' ,
922
+ ),
923
+ ],
924
+ )
925
+
926
+ validator = SchemaValidator (schema )
927
+
928
+ with pytest .raises (ValidationError ) as exc_info :
929
+ validator .validate_python (cyclic_data )
930
+
931
+ assert exc_info .value .title == 'typed-dict'
932
+ assert exc_info .value .errors (include_url = False ) == [
933
+ {
934
+ 'type' : 'recursion_loop' ,
935
+ 'loc' : ('b' , 'a' ),
936
+ 'msg' : 'Recursion error - cyclic reference detected' ,
937
+ 'input' : cyclic_data ,
938
+ }
939
+ ]
940
+
941
+
942
+ def test_cyclic_data_threeway () -> None :
943
+ cyclic_data = {}
944
+ cyclic_data ['b' ] = {'c' : {'a' : cyclic_data }}
945
+
946
+ schema = core_schema .definitions_schema (
947
+ core_schema .definition_reference_schema ('a' ),
948
+ [
949
+ core_schema .typed_dict_schema (
950
+ {
951
+ 'b' : core_schema .typed_dict_field (
952
+ core_schema .nullable_schema (core_schema .definition_reference_schema ('b' ))
953
+ )
954
+ },
955
+ ref = 'a' ,
956
+ ),
957
+ core_schema .typed_dict_schema (
958
+ {
959
+ 'c' : core_schema .typed_dict_field (
960
+ core_schema .nullable_schema (core_schema .definition_reference_schema ('c' ))
961
+ )
962
+ },
963
+ ref = 'b' ,
964
+ ),
965
+ core_schema .typed_dict_schema (
966
+ {
967
+ 'a' : core_schema .typed_dict_field (
968
+ core_schema .nullable_schema (core_schema .definition_reference_schema ('a' ))
969
+ )
970
+ },
971
+ ref = 'c' ,
972
+ ),
973
+ ],
974
+ )
975
+
976
+ validator = SchemaValidator (schema )
977
+
978
+ with pytest .raises (ValidationError ) as exc_info :
979
+ validator .validate_python (cyclic_data )
980
+
981
+ assert exc_info .value .title == 'typed-dict'
982
+ assert exc_info .value .errors (include_url = False ) == [
983
+ {
984
+ 'type' : 'recursion_loop' ,
985
+ 'loc' : ('b' , 'c' , 'a' ),
986
+ 'msg' : 'Recursion error - cyclic reference detected' ,
987
+ 'input' : cyclic_data ,
988
+ }
989
+ ]
0 commit comments