Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-typing_extensions for 
openSUSE:Factory checked in at 2025-07-21 19:58:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-typing_extensions (Old)
 and      /work/SRC/openSUSE:Factory/.python-typing_extensions.new.8875 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-typing_extensions"

Mon Jul 21 19:58:36 2025 rev:30 rq:1294417 version:4.14.1

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-typing_extensions/python-typing_extensions.changes
        2025-07-10 23:15:16.317097685 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-typing_extensions.new.8875/python-typing_extensions.changes
      2025-07-21 19:58:40.651057594 +0200
@@ -1,0 +2,9 @@
+Fri Jul 18 16:11:33 UTC 2025 - Dirk Müller <dmuel...@suse.com>
+
+- update to 4.14.1:
+  * Fix usage of `typing_extensions.TypedDict` nested inside
+    other types (e.g., `typing.Type[typing_extensions.TypedDict]`).
+    This is not allowed by the type system but worked on older
+    versions, so we maintain support.
+
+-------------------------------------------------------------------

Old:
----
  typing_extensions-4.14.0.tar.gz

New:
----
  typing_extensions-4.14.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-typing_extensions.spec ++++++
--- /var/tmp/diff_new_pack.vRbXWE/_old  2025-07-21 19:58:41.223081067 +0200
+++ /var/tmp/diff_new_pack.vRbXWE/_new  2025-07-21 19:58:41.227081232 +0200
@@ -27,7 +27,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-typing_extensions%{psuffix}
-Version:        4.14.0
+Version:        4.14.1
 Release:        0
 Summary:        Backported and Experimental Type Hints for Python 3.8+
 License:        Python-2.0

++++++ typing_extensions-4.14.0.tar.gz -> typing_extensions-4.14.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typing_extensions-4.14.0/CHANGELOG.md 
new/typing_extensions-4.14.1/CHANGELOG.md
--- old/typing_extensions-4.14.0/CHANGELOG.md   2025-06-02 16:51:14.748456200 
+0200
+++ new/typing_extensions-4.14.1/CHANGELOG.md   2025-07-04 15:27:15.427119300 
+0200
@@ -1,3 +1,9 @@
+# Release 4.14.1 (July 4, 2025)
+
+- Fix usage of `typing_extensions.TypedDict` nested inside other types
+  (e.g., `typing.Type[typing_extensions.TypedDict]`). This is not allowed by 
the
+  type system but worked on older versions, so we maintain support.
+
 # Release 4.14.0 (June 2, 2025)
 
 Changes since 4.14.0rc1:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typing_extensions-4.14.0/PKG-INFO 
new/typing_extensions-4.14.1/PKG-INFO
--- old/typing_extensions-4.14.0/PKG-INFO       1970-01-01 01:00:00.000000000 
+0100
+++ new/typing_extensions-4.14.1/PKG-INFO       1970-01-01 01:00:00.000000000 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: typing_extensions
-Version: 4.14.0
+Version: 4.14.1
 Summary: Backported and Experimental Type Hints for Python 3.9+
 Keywords: 
annotations,backport,checker,checking,function,hinting,hints,type,typechecking,typehinting,typehints,typing
 Author-email: "Guido van Rossum, Jukka Lehtosalo, Łukasz Langa, Michael Lee" 
<levkivs...@gmail.com>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typing_extensions-4.14.0/pyproject.toml 
new/typing_extensions-4.14.1/pyproject.toml
--- old/typing_extensions-4.14.0/pyproject.toml 2025-06-02 16:51:14.749456400 
+0200
+++ new/typing_extensions-4.14.1/pyproject.toml 2025-07-04 15:27:15.428119400 
+0200
@@ -6,7 +6,7 @@
 # Project metadata
 [project]
 name = "typing_extensions"
-version = "4.14.0"
+version = "4.14.1"
 description = "Backported and Experimental Type Hints for Python 3.9+"
 readme = "README.md"
 requires-python = ">=3.9"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/typing_extensions-4.14.0/src/test_typing_extensions.py 
new/typing_extensions-4.14.1/src/test_typing_extensions.py
--- old/typing_extensions-4.14.0/src/test_typing_extensions.py  2025-06-02 
16:51:14.750456300 +0200
+++ new/typing_extensions-4.14.1/src/test_typing_extensions.py  2025-07-04 
15:27:15.429119300 +0200
@@ -525,7 +525,7 @@
             type(self.bottom_type)()
 
     def test_pickle(self):
-        for proto in range(pickle.HIGHEST_PROTOCOL):
+        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
             pickled = pickle.dumps(self.bottom_type, protocol=proto)
             self.assertIs(self.bottom_type, pickle.loads(pickled))
 
@@ -4202,6 +4202,12 @@
         self.assertEqual(Emp.__annotations__, {'name': str, 'id': int})
         self.assertEqual(Emp.__total__, True)
 
+    def test_allowed_as_type_argument(self):
+        # https://github.com/python/typing_extensions/issues/613
+        obj = typing.Type[typing_extensions.TypedDict]
+        self.assertIs(typing_extensions.get_origin(obj), type)
+        self.assertEqual(typing_extensions.get_args(obj), 
(typing_extensions.TypedDict,))
+
     @skipIf(sys.version_info < (3, 13), "Change in behavior in 3.13")
     def test_keywords_syntax_raises_on_3_13(self):
         with self.assertRaises(TypeError), 
self.assertWarns(DeprecationWarning):
@@ -5284,6 +5290,8 @@
              'z': 'Required[undefined]'},
         )
 
+    def test_dunder_dict(self):
+        self.assertIsInstance(TypedDict.__dict__, dict)
 
 class AnnotatedTests(BaseTestCase):
 
@@ -5896,7 +5904,7 @@
         P_co = ParamSpec('P_co', covariant=True)
         P_contra = ParamSpec('P_contra', contravariant=True)
         P_default = ParamSpec('P_default', default=[int])
-        for proto in range(pickle.HIGHEST_PROTOCOL):
+        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
             with self.subTest(f'Pickle protocol {proto}'):
                 for paramspec in (P, P_co, P_contra, P_default):
                     z = pickle.loads(pickle.dumps(paramspec, proto))
@@ -6319,7 +6327,7 @@
         self.assertIs(StrT.__bound__, LiteralString)
 
     def test_pickle(self):
-        for proto in range(pickle.HIGHEST_PROTOCOL):
+        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
             pickled = pickle.dumps(LiteralString, protocol=proto)
             self.assertIs(LiteralString, pickle.loads(pickled))
 
@@ -6366,7 +6374,7 @@
                 return (self, self)
 
     def test_pickle(self):
-        for proto in range(pickle.HIGHEST_PROTOCOL):
+        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
             pickled = pickle.dumps(Self, protocol=proto)
             self.assertIs(Self, pickle.loads(pickled))
 
@@ -6578,7 +6586,7 @@
         Ts = TypeVarTuple('Ts')
         Ts_default = TypeVarTuple('Ts_default', default=Unpack[Tuple[int, 
str]])
 
-        for proto in range(pickle.HIGHEST_PROTOCOL):
+        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
             for typevartuple in (Ts, Ts_default):
                 z = pickle.loads(pickle.dumps(typevartuple, proto))
                 self.assertEqual(z.__name__, typevartuple.__name__)
@@ -7589,7 +7597,7 @@
         U_co = typing_extensions.TypeVar('U_co', covariant=True)
         U_contra = typing_extensions.TypeVar('U_contra', contravariant=True)
         U_default = typing_extensions.TypeVar('U_default', default=int)
-        for proto in range(pickle.HIGHEST_PROTOCOL):
+        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
             for typevar in (U, U_co, U_contra, U_default):
                 z = pickle.loads(pickle.dumps(typevar, proto))
                 self.assertEqual(z.__name__, typevar.__name__)
@@ -7738,7 +7746,7 @@
         global U, U_infer  # pickle wants to reference the class by name
         U = typing_extensions.TypeVar('U')
         U_infer = typing_extensions.TypeVar('U_infer', infer_variance=True)
-        for proto in range(pickle.HIGHEST_PROTOCOL):
+        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
             for typevar in (U, U_infer):
                 z = pickle.loads(pickle.dumps(typevar, proto))
                 self.assertEqual(z.__name__, typevar.__name__)
@@ -8343,7 +8351,7 @@
 
     def test_pickle(self):
         doc_info = Doc("Who to say hi to")
-        for proto in range(pickle.HIGHEST_PROTOCOL):
+        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
             pickled = pickle.dumps(doc_info, protocol=proto)
             self.assertEqual(doc_info, pickle.loads(pickled))
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typing_extensions-4.14.0/src/typing_extensions.py 
new/typing_extensions-4.14.1/src/typing_extensions.py
--- old/typing_extensions-4.14.0/src/typing_extensions.py       2025-06-02 
16:51:14.751456300 +0200
+++ new/typing_extensions-4.14.1/src/typing_extensions.py       2025-07-04 
15:27:15.430119500 +0200
@@ -221,7 +221,55 @@
 
 ClassVar = typing.ClassVar
 
+# Vendored from cpython typing._SpecialFrom
+# Having a separate class means that instances will not be rejected by
+# typing._type_check.
+class _SpecialForm(typing._Final, _root=True):
+    __slots__ = ('_name', '__doc__', '_getitem')
+
+    def __init__(self, getitem):
+        self._getitem = getitem
+        self._name = getitem.__name__
+        self.__doc__ = getitem.__doc__
+
+    def __getattr__(self, item):
+        if item in {'__name__', '__qualname__'}:
+            return self._name
+
+        raise AttributeError(item)
+
+    def __mro_entries__(self, bases):
+        raise TypeError(f"Cannot subclass {self!r}")
+
+    def __repr__(self):
+        return f'typing_extensions.{self._name}'
+
+    def __reduce__(self):
+        return self._name
+
+    def __call__(self, *args, **kwds):
+        raise TypeError(f"Cannot instantiate {self!r}")
+
+    def __or__(self, other):
+        return typing.Union[self, other]
+
+    def __ror__(self, other):
+        return typing.Union[other, self]
+
+    def __instancecheck__(self, obj):
+        raise TypeError(f"{self} cannot be used with isinstance()")
+
+    def __subclasscheck__(self, cls):
+        raise TypeError(f"{self} cannot be used with issubclass()")
+
+    @typing._tp_cache
+    def __getitem__(self, parameters):
+        return self._getitem(self, parameters)
+
 
+# Note that inheriting from this class means that the object will be
+# rejected by typing._type_check, so do not use it if the special form
+# is arguably valid as a type by itself.
 class _ExtensionsSpecialForm(typing._SpecialForm, _root=True):
     def __repr__(self):
         return 'typing_extensions.' + self._name
@@ -1223,7 +1271,7 @@
         td.__orig_bases__ = (TypedDict,)
         return td
 
-    class _TypedDictSpecialForm(_ExtensionsSpecialForm, _root=True):
+    class _TypedDictSpecialForm(_SpecialForm, _root=True):
         def __call__(
             self,
             typename,
@@ -2201,48 +2249,6 @@
         return typing._GenericAlias(self, (item,))
 
 
-# Vendored from cpython typing._SpecialFrom
-class _SpecialForm(typing._Final, _root=True):
-    __slots__ = ('_name', '__doc__', '_getitem')
-
-    def __init__(self, getitem):
-        self._getitem = getitem
-        self._name = getitem.__name__
-        self.__doc__ = getitem.__doc__
-
-    def __getattr__(self, item):
-        if item in {'__name__', '__qualname__'}:
-            return self._name
-
-        raise AttributeError(item)
-
-    def __mro_entries__(self, bases):
-        raise TypeError(f"Cannot subclass {self!r}")
-
-    def __repr__(self):
-        return f'typing_extensions.{self._name}'
-
-    def __reduce__(self):
-        return self._name
-
-    def __call__(self, *args, **kwds):
-        raise TypeError(f"Cannot instantiate {self!r}")
-
-    def __or__(self, other):
-        return typing.Union[self, other]
-
-    def __ror__(self, other):
-        return typing.Union[other, self]
-
-    def __instancecheck__(self, obj):
-        raise TypeError(f"{self} cannot be used with isinstance()")
-
-    def __subclasscheck__(self, cls):
-        raise TypeError(f"{self} cannot be used with issubclass()")
-
-    @typing._tp_cache
-    def __getitem__(self, parameters):
-        return self._getitem(self, parameters)
 
 
 if hasattr(typing, "LiteralString"):  # 3.11+

Reply via email to