Skip to content

Commit 61f06f1

Browse files
committed
Fix tests
1 parent 39cc2e9 commit 61f06f1

File tree

2 files changed

+43
-17
lines changed

2 files changed

+43
-17
lines changed

src/test_typing_extensions.py

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4318,14 +4318,16 @@ class Closed(TypedDict, closed=True):
43184318
class Unclosed(TypedDict, closed=False):
43194319
...
43204320

4321-
class ChildUnclosed(Closed, Unclosed):
4322-
...
4321+
with self.assertWarns(DeprecationWarning):
4322+
class ChildUnclosed(Closed, Unclosed):
4323+
...
43234324

43244325
self.assertFalse(ChildUnclosed.__closed__)
43254326
self.assertEqual(ChildUnclosed.__extra_items__, type(None))
43264327

4327-
class ChildClosed(Unclosed, Closed):
4328-
...
4328+
with self.assertWarns(DeprecationWarning):
4329+
class ChildClosed(Unclosed, Closed):
4330+
...
43294331

43304332
self.assertFalse(ChildClosed.__closed__)
43314333
self.assertEqual(ChildClosed.__extra_items__, type(None))
@@ -4690,19 +4692,34 @@ def test_extra_keys_non_readonly_compat(self):
46904692
class Base(TypedDict, closed=True):
46914693
__extra_items__: str
46924694

4693-
class Child(Base):
4694-
a: NotRequired[int]
4695+
with self.assertWarns(DeprecationWarning):
4696+
class Child(Base):
4697+
a: NotRequired[int]
46954698

46964699
self.assertEqual(Child.__required_keys__, frozenset({}))
46974700
self.assertEqual(Child.__optional_keys__, frozenset({'a'}))
46984701
self.assertEqual(Child.__readonly_keys__, frozenset({}))
46994702
self.assertEqual(Child.__mutable_keys__, frozenset({'a'}))
47004703

4704+
@skipIf(TYPING_3_14_0, "Only supported on <3.14")
47014705
def test_extra_keys_readonly(self):
47024706
class Base(TypedDict, closed=True):
47034707
__extra_items__: ReadOnly[str]
47044708

4705-
class Child(Base):
4709+
with self.assertWarns(DeprecationWarning):
4710+
class Child(Base):
4711+
a: NotRequired[str]
4712+
4713+
self.assertEqual(Child.__required_keys__, frozenset({}))
4714+
self.assertEqual(Child.__optional_keys__, frozenset({'a'}))
4715+
self.assertEqual(Child.__readonly_keys__, frozenset({}))
4716+
self.assertEqual(Child.__mutable_keys__, frozenset({'a'}))
4717+
4718+
def test_extra_keys_readonly_explicit_closed(self):
4719+
class Base(TypedDict, closed=True):
4720+
__extra_items__: ReadOnly[str]
4721+
4722+
class Child(Base, closed=True):
47064723
a: NotRequired[str]
47074724

47084725
self.assertEqual(Child.__required_keys__, frozenset({}))
@@ -4766,26 +4783,26 @@ class Base(TypedDict, closed=True):
47664783
self.assertEqual(Base.__extra_items__, ReadOnly[Union[str, None]])
47674784
self.assertTrue(Base.__closed__)
47684785

4769-
class Child(Base):
4786+
class Child(Base, closed=True):
47704787
a: int
47714788
__extra_items__: int
47724789

4773-
self.assertEqual(Child.__required_keys__, frozenset({'a', "__extra_items__"}))
4790+
self.assertEqual(Child.__required_keys__, frozenset({'a'}))
47744791
self.assertEqual(Child.__optional_keys__, frozenset({}))
47754792
self.assertEqual(Child.__readonly_keys__, frozenset({}))
4776-
self.assertEqual(Child.__mutable_keys__, frozenset({'a', "__extra_items__"}))
4777-
self.assertEqual(Child.__annotations__, {"__extra_items__": int, "a": int})
4778-
self.assertEqual(Child.__extra_items__, ReadOnly[Union[str, None]])
4779-
self.assertFalse(Child.__closed__)
4793+
self.assertEqual(Child.__mutable_keys__, frozenset({'a'}))
4794+
self.assertEqual(Child.__annotations__, {"a": int})
4795+
self.assertEqual(Child.__extra_items__, int)
4796+
self.assertTrue(Child.__closed__)
47804797

47814798
class GrandChild(Child, closed=True):
47824799
__extra_items__: str
47834800

4784-
self.assertEqual(GrandChild.__required_keys__, frozenset({'a', "__extra_items__"}))
4801+
self.assertEqual(GrandChild.__required_keys__, frozenset({'a'}))
47854802
self.assertEqual(GrandChild.__optional_keys__, frozenset({}))
47864803
self.assertEqual(GrandChild.__readonly_keys__, frozenset({}))
4787-
self.assertEqual(GrandChild.__mutable_keys__, frozenset({'a', "__extra_items__"}))
4788-
self.assertEqual(GrandChild.__annotations__, {"__extra_items__": int, "a": int})
4804+
self.assertEqual(GrandChild.__mutable_keys__, frozenset({'a'}))
4805+
self.assertEqual(GrandChild.__annotations__, {"a": int})
47894806
self.assertEqual(GrandChild.__extra_items__, str)
47904807
self.assertTrue(GrandChild.__closed__)
47914808

src/typing_extensions.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -986,7 +986,16 @@ def __new__(cls, name, bases, ns, *, total=True, closed=None, extra_items=None):
986986
if base_extra_items_type is not None:
987987
extra_items_type = base_extra_items_type
988988
if getattr(base, "__closed__", False) and not closed:
989-
raise TypeError("Child of a closed TypedDict must also be closed")
989+
if sys.version_info < (3, 14):
990+
# PEP 728 wants this to be an error, but that is not
991+
# compatible with previous versions of typing-extensions.
992+
warnings.warn(
993+
"Child of a closed TypedDict must also be closed. This will "
994+
"be an error in Python 3.14.",
995+
DeprecationWarning,
996+
)
997+
else:
998+
raise TypeError("Child of a closed TypedDict must also be closed")
990999

9911000
if closed and extra_items_type is None:
9921001
extra_items_type = Never

0 commit comments

Comments
 (0)