From 292813c70a376c25154ad1fc26e4d6c29a96b871 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Sun, 9 Apr 2023 11:45:21 +0300 Subject: [PATCH 1/2] gh-103395: Improve `typing._GenericAlias.__dir__` coverage --- Lib/test/test_typing.py | 71 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index b8eee9a570a301..6600aef989fa9a 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -855,6 +855,15 @@ def test_accepts_single_type(self): (*tuple[int],) Unpack[Tuple[int]] + def test_dir(self): + dir_items = set(dir(Unpack[Tuple[int]])) + for required_item in [ + '__args__', '__parameters__', '__origin__', + 'copy_with', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + def test_rejects_multiple_types(self): with self.assertRaises(TypeError): Unpack[Tuple[int], Tuple[str]] @@ -1699,6 +1708,15 @@ def test_repr(self): u = Optional[str] self.assertEqual(repr(u), 'typing.Optional[str]') + def test_dir(self): + dir_items = set(dir(Union[str, int])) + for required_item in [ + '__args__', '__parameters__', '__origin__', + 'copy_with', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + def test_cannot_subclass(self): with self.assertRaisesRegex(TypeError, r'Cannot subclass typing\.Union'): @@ -1839,6 +1857,17 @@ def test_eq_hash(self): self.assertNotEqual(C, Callable[..., int]) self.assertNotEqual(C, Callable) + def test_dir(self): + Callable = self.Callable + dir_items = set(dir(Callable[..., int])) + for required_item in [ + '__args__', '__parameters__', '__origin__', + # TODO: add to `collections.abc.Callable`: + # 'copy_with', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + def test_cannot_instantiate(self): Callable = self.Callable with self.assertRaises(TypeError): @@ -2151,6 +2180,15 @@ def test_repr(self): self.assertEqual(repr(Literal[None]), "typing.Literal[None]") self.assertEqual(repr(Literal[1, 2, 3, 3]), "typing.Literal[1, 2, 3]") + def test_dir(self): + dir_items = set(dir(Literal[1, 2, 3])) + for required_item in [ + '__args__', '__parameters__', '__origin__', + 'copy_with', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + def test_cannot_init(self): with self.assertRaises(TypeError): Literal() @@ -7315,6 +7353,16 @@ def test_repr(self): "typing.Annotated[typing.List[int], 4, 5]" ) + def test_dir(self): + dir_items = set(dir(Annotated[int, 4])) + for required_item in [ + '__args__', '__parameters__', '__origin__', + '__metadata__', + 'copy_with', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + def test_flatten(self): A = Annotated[Annotated[int, 4], 5] self.assertEqual(A, Annotated[int, 4, 5]) @@ -8033,6 +8081,16 @@ class MyClass: ... c = Concatenate[MyClass, P] self.assertNotEqual(c, Concatenate) + def test_dir(self): + P = ParamSpec('P') + dir_items = set(dir(Concatenate[int, P])) + for required_item in [ + '__args__', '__parameters__', '__origin__', + 'copy_with', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + def test_valid_uses(self): P = ParamSpec('P') T = TypeVar('T') @@ -8310,10 +8368,19 @@ class Foo(Generic[T]): def bar(self): pass baz = 3 + __magic__ = 4 + # The class attributes of the original class should be visible even # in dir() of the GenericAlias. See bpo-45755. - self.assertIn('bar', dir(Foo[int])) - self.assertIn('baz', dir(Foo[int])) + dir_items = set(dir(Foo[int])) + for required_item in [ + 'bar', 'baz', + '__args__', '__parameters__', '__origin__', + 'copy_with', + ]: + with self.subTest(required_item=required_item): + self.assertIn(required_item, dir_items) + self.assertNotIn('__magic__', dir_items) class RevealTypeTests(BaseTestCase): From b94e133ab577bf3753e28517cf448477b874fa19 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Mon, 10 Apr 2023 10:12:00 +0300 Subject: [PATCH 2/2] Address review --- Lib/test/test_typing.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 6600aef989fa9a..f983efe956f902 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -859,7 +859,6 @@ def test_dir(self): dir_items = set(dir(Unpack[Tuple[int]])) for required_item in [ '__args__', '__parameters__', '__origin__', - 'copy_with', ]: with self.subTest(required_item=required_item): self.assertIn(required_item, dir_items) @@ -1712,7 +1711,6 @@ def test_dir(self): dir_items = set(dir(Union[str, int])) for required_item in [ '__args__', '__parameters__', '__origin__', - 'copy_with', ]: with self.subTest(required_item=required_item): self.assertIn(required_item, dir_items) @@ -1862,8 +1860,6 @@ def test_dir(self): dir_items = set(dir(Callable[..., int])) for required_item in [ '__args__', '__parameters__', '__origin__', - # TODO: add to `collections.abc.Callable`: - # 'copy_with', ]: with self.subTest(required_item=required_item): self.assertIn(required_item, dir_items) @@ -2184,7 +2180,6 @@ def test_dir(self): dir_items = set(dir(Literal[1, 2, 3])) for required_item in [ '__args__', '__parameters__', '__origin__', - 'copy_with', ]: with self.subTest(required_item=required_item): self.assertIn(required_item, dir_items) @@ -7358,7 +7353,6 @@ def test_dir(self): for required_item in [ '__args__', '__parameters__', '__origin__', '__metadata__', - 'copy_with', ]: with self.subTest(required_item=required_item): self.assertIn(required_item, dir_items) @@ -8086,7 +8080,6 @@ def test_dir(self): dir_items = set(dir(Concatenate[int, P])) for required_item in [ '__args__', '__parameters__', '__origin__', - 'copy_with', ]: with self.subTest(required_item=required_item): self.assertIn(required_item, dir_items) @@ -8376,7 +8369,6 @@ def bar(self): for required_item in [ 'bar', 'baz', '__args__', '__parameters__', '__origin__', - 'copy_with', ]: with self.subTest(required_item=required_item): self.assertIn(required_item, dir_items)