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+