@@ -893,6 +893,106 @@ class FineAndDandy:
893
893
error = None ,
894
894
)
895
895
896
+ @collect_cases
897
+ def test_cached_property (self ) -> Iterator [Case ]:
898
+ yield Case (
899
+ stub = """
900
+ from functools import cached_property
901
+ class Good:
902
+ @cached_property
903
+ def read_only_attr(self) -> int: ...
904
+ @cached_property
905
+ def read_only_attr2(self) -> int: ...
906
+ """ ,
907
+ runtime = """
908
+ import functools as ft
909
+ from functools import cached_property
910
+ class Good:
911
+ @cached_property
912
+ def read_only_attr(self): return 1
913
+ @ft.cached_property
914
+ def read_only_attr2(self): return 1
915
+ """ ,
916
+ error = None ,
917
+ )
918
+ yield Case (
919
+ stub = """
920
+ from functools import cached_property
921
+ class Bad:
922
+ @cached_property
923
+ def f(self) -> int: ...
924
+ """ ,
925
+ runtime = """
926
+ class Bad:
927
+ def f(self) -> int: return 1
928
+ """ ,
929
+ error = "Bad.f" ,
930
+ )
931
+ yield Case (
932
+ stub = """
933
+ from functools import cached_property
934
+ class GoodCachedAttr:
935
+ @cached_property
936
+ def f(self) -> int: ...
937
+ """ ,
938
+ runtime = """
939
+ class GoodCachedAttr:
940
+ f = 1
941
+ """ ,
942
+ error = None ,
943
+ )
944
+ yield Case (
945
+ stub = """
946
+ from functools import cached_property
947
+ class BadCachedAttr:
948
+ @cached_property
949
+ def f(self) -> str: ...
950
+ """ ,
951
+ runtime = """
952
+ class BadCachedAttr:
953
+ f = 1
954
+ """ ,
955
+ error = "BadCachedAttr.f" ,
956
+ )
957
+ yield Case (
958
+ stub = """
959
+ from functools import cached_property
960
+ from typing import final
961
+ class FinalGood:
962
+ @cached_property
963
+ @final
964
+ def attr(self) -> int: ...
965
+ """ ,
966
+ runtime = """
967
+ from functools import cached_property
968
+ from typing import final
969
+ class FinalGood:
970
+ @cached_property
971
+ @final
972
+ def attr(self):
973
+ return 1
974
+ """ ,
975
+ error = None ,
976
+ )
977
+ yield Case (
978
+ stub = """
979
+ from functools import cached_property
980
+ class FinalBad:
981
+ @cached_property
982
+ def attr(self) -> int: ...
983
+ """ ,
984
+ runtime = """
985
+ from functools import cached_property
986
+ from typing_extensions import final
987
+ class FinalBad:
988
+ @cached_property
989
+ @final
990
+ def attr(self):
991
+ return 1
992
+ """ ,
993
+ error = "FinalBad.attr" ,
994
+ )
995
+
896
996
@collect_cases
897
997
def test_var (self ) -> Iterator [Case ]:
898
998
yield Case (stub = "x1: int" , runtime = "x1 = 5" , error = None )
0 commit comments