From 830ea39bb7d7a06302214430c2921763cb7f63d7 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Mon, 12 May 2025 05:03:38 -0400 Subject: [PATCH 1/7] feat(test): test mypyc dict views Intended to create a failing test case for the bug seen here: https://github.com/BobTheBuidler/checksum_dict/actions/runs/14843222374/job/41670896987 --- mypyc/test-data/run-dicts.test | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/mypyc/test-data/run-dicts.test b/mypyc/test-data/run-dicts.test index 2a3be188ad00..58306108f1ba 100644 --- a/mypyc/test-data/run-dicts.test +++ b/mypyc/test-data/run-dicts.test @@ -265,6 +265,30 @@ class MyDict(dict): else: return super().setdefault(k, v) + 10 +def test_dict_keys() -> None: + d: Dict[str, Optional[int]] = {'a': 1, 'b': 2} + assert list(d.keys()) == ['a', 'b'] + +def test_dict_subclass_keys() -> None: + d = MyDict({'a': 1, 'b': 2}) + assert list(d.keys()) == ['a', 'b'] + +def test_dict_values() -> None: + d: Dict[str, Optional[int]] = {'a': 1, 'b': 2} + assert list(d.values()) == [1, 2] + +def test_dict_subclass_values() -> None: + d = MyDict({'a': 1, 'b': 2}) + assert list(d.values()) == [1, 2] + +def test_dict_items() -> None: + d: Dict[str, Optional[int]] = {'a': 1, 'b': 2} + assert list(d.items()) == [('a', 1), ('b', 2)] + +def test_dict_subclass_items() -> None: + d = MyDict({'a': 1, 'b': 2}) + assert list(d.items()) == [('a', 1), ('b', 2)] + def test_dict_setdefault() -> None: d: Dict[str, Optional[int]] = {'a': 1, 'b': 2} assert d.setdefault('a', 2) == 1 From be70dbbd988558ce9d6e2ed4f67744d2f9fff85e Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Mon, 12 May 2025 05:15:21 -0400 Subject: [PATCH 2/7] feat(test): add test for 2 base dict subclass --- mypyc/test-data/run-dicts.test | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mypyc/test-data/run-dicts.test b/mypyc/test-data/run-dicts.test index 58306108f1ba..5b60e2267a74 100644 --- a/mypyc/test-data/run-dicts.test +++ b/mypyc/test-data/run-dicts.test @@ -265,6 +265,9 @@ class MyDict(dict): else: return super().setdefault(k, v) + 10 +class MyComplexDict(Dict, MyDict): + pass + def test_dict_keys() -> None: d: Dict[str, Optional[int]] = {'a': 1, 'b': 2} assert list(d.keys()) == ['a', 'b'] @@ -273,6 +276,10 @@ def test_dict_subclass_keys() -> None: d = MyDict({'a': 1, 'b': 2}) assert list(d.keys()) == ['a', 'b'] +def test_dict_subclass_complex_keys() -> None: + d = MyComplexDict({'a': 1, 'b': 2}) + assert list(d.keys()) == ['a', 'b'] + def test_dict_values() -> None: d: Dict[str, Optional[int]] = {'a': 1, 'b': 2} assert list(d.values()) == [1, 2] @@ -281,6 +288,10 @@ def test_dict_subclass_values() -> None: d = MyDict({'a': 1, 'b': 2}) assert list(d.values()) == [1, 2] +def test_dict_subclass_complex_values() -> None: + d = MyComplexDict({'a': 1, 'b': 2}) + assert list(d.values()) == [1, 2] + def test_dict_items() -> None: d: Dict[str, Optional[int]] = {'a': 1, 'b': 2} assert list(d.items()) == [('a', 1), ('b', 2)] @@ -289,6 +300,10 @@ def test_dict_subclass_items() -> None: d = MyDict({'a': 1, 'b': 2}) assert list(d.items()) == [('a', 1), ('b', 2)] +def test_dict_subclass_complex_items() -> None: + d = MyComplexDict({'a': 1, 'b': 2}) + assert list(d.items()) == [('a', 1), ('b', 2)] + def test_dict_setdefault() -> None: d: Dict[str, Optional[int]] = {'a': 1, 'b': 2} assert d.setdefault('a', 2) == 1 From d516591a164b9ec71c4e6e00f60fab555e23e6d6 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Mon, 12 May 2025 05:24:47 -0400 Subject: [PATCH 3/7] Update run-dicts.test --- mypyc/test-data/run-dicts.test | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mypyc/test-data/run-dicts.test b/mypyc/test-data/run-dicts.test index 5b60e2267a74..c6e0f4fef746 100644 --- a/mypyc/test-data/run-dicts.test +++ b/mypyc/test-data/run-dicts.test @@ -230,7 +230,7 @@ c [case testDictMethods] from collections import defaultdict -from typing import Dict, Optional, List, Set +from typing import DefaultDict, Dict, Optional, List, Set def test_dict_clear() -> None: d = {'a': 1, 'b': 2} @@ -265,7 +265,7 @@ class MyDict(dict): else: return super().setdefault(k, v) + 10 -class MyComplexDict(Dict, MyDict): +class MyComplexDict(DefaultDict, MyDict): pass def test_dict_keys() -> None: From c9e93a076c478d3e135288986ae6f23ae08790d9 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Tue, 13 May 2025 22:28:47 -0400 Subject: [PATCH 4/7] fix: compilation error due to mypy err --- mypyc/test-data/run-dicts.test | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mypyc/test-data/run-dicts.test b/mypyc/test-data/run-dicts.test index c6e0f4fef746..84540b625896 100644 --- a/mypyc/test-data/run-dicts.test +++ b/mypyc/test-data/run-dicts.test @@ -230,7 +230,8 @@ c [case testDictMethods] from collections import defaultdict -from typing import DefaultDict, Dict, Optional, List, Set +from typing import DefaultDict # type: ignore [attr-defined] +from typing import Dict, Optional, List, Set def test_dict_clear() -> None: d = {'a': 1, 'b': 2} From 5c08b9c958d65ae7fda7b853bcdd40122bb70aff Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Tue, 13 May 2025 23:00:52 -0400 Subject: [PATCH 5/7] Update run-dicts.test --- mypyc/test-data/run-dicts.test | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mypyc/test-data/run-dicts.test b/mypyc/test-data/run-dicts.test index 84540b625896..78e54eb65d66 100644 --- a/mypyc/test-data/run-dicts.test +++ b/mypyc/test-data/run-dicts.test @@ -267,7 +267,11 @@ class MyDict(dict): return super().setdefault(k, v) + 10 class MyComplexDict(DefaultDict, MyDict): - pass + def __init__(self, vals: Dict[str, int]): + # The custom init is necessary for this test as we cannot init a DefaultDict with a dict + DefaultDict.__init__(int) + for k, v in vals.items(): + self[k] = v def test_dict_keys() -> None: d: Dict[str, Optional[int]] = {'a': 1, 'b': 2} From 1992c9d4d6637b31bb9551b4907c07ea9a0cdd41 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Tue, 13 May 2025 23:08:23 -0400 Subject: [PATCH 6/7] Update run-dicts.test --- mypyc/test-data/run-dicts.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypyc/test-data/run-dicts.test b/mypyc/test-data/run-dicts.test index 78e54eb65d66..d0728974f140 100644 --- a/mypyc/test-data/run-dicts.test +++ b/mypyc/test-data/run-dicts.test @@ -269,7 +269,7 @@ class MyDict(dict): class MyComplexDict(DefaultDict, MyDict): def __init__(self, vals: Dict[str, int]): # The custom init is necessary for this test as we cannot init a DefaultDict with a dict - DefaultDict.__init__(int) + DefaultDict.__init__(self, int) for k, v in vals.items(): self[k] = v From f0ed64b06042b3b3981c69fa30ec0177b9eacd09 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Tue, 13 May 2025 23:28:43 -0400 Subject: [PATCH 7/7] Update run-dicts.test --- mypyc/test-data/run-dicts.test | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/mypyc/test-data/run-dicts.test b/mypyc/test-data/run-dicts.test index d0728974f140..956e1aed4914 100644 --- a/mypyc/test-data/run-dicts.test +++ b/mypyc/test-data/run-dicts.test @@ -266,12 +266,8 @@ class MyDict(dict): else: return super().setdefault(k, v) + 10 -class MyComplexDict(DefaultDict, MyDict): - def __init__(self, vals: Dict[str, int]): - # The custom init is necessary for this test as we cannot init a DefaultDict with a dict - DefaultDict.__init__(self, int) - for k, v in vals.items(): - self[k] = v +class MyComplexDict(DefaultDict[str, int], MyDict): + pass def test_dict_keys() -> None: d: Dict[str, Optional[int]] = {'a': 1, 'b': 2} @@ -282,7 +278,7 @@ def test_dict_subclass_keys() -> None: assert list(d.keys()) == ['a', 'b'] def test_dict_subclass_complex_keys() -> None: - d = MyComplexDict({'a': 1, 'b': 2}) + d = MyComplexDict(int, {'a': 1, 'b': 2}) assert list(d.keys()) == ['a', 'b'] def test_dict_values() -> None: @@ -294,7 +290,7 @@ def test_dict_subclass_values() -> None: assert list(d.values()) == [1, 2] def test_dict_subclass_complex_values() -> None: - d = MyComplexDict({'a': 1, 'b': 2}) + d = MyComplexDict(int, {'a': 1, 'b': 2}) assert list(d.values()) == [1, 2] def test_dict_items() -> None: @@ -306,7 +302,7 @@ def test_dict_subclass_items() -> None: assert list(d.items()) == [('a', 1), ('b', 2)] def test_dict_subclass_complex_items() -> None: - d = MyComplexDict({'a': 1, 'b': 2}) + d = MyComplexDict(int, {'a': 1, 'b': 2}) assert list(d.items()) == [('a', 1), ('b', 2)] def test_dict_setdefault() -> None: