Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-python-multipart for 
openSUSE:Factory checked in at 2025-12-30 12:00:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-python-multipart (Old)
 and      /work/SRC/openSUSE:Factory/.python-python-multipart.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-python-multipart"

Tue Dec 30 12:00:12 2025 rev:12 rq:1324591 version:0.0.21

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-python-multipart/python-python-multipart.changes
  2025-02-05 12:40:13.180039589 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-python-multipart.new.1928/python-python-multipart.changes
        2025-12-30 12:00:15.092282316 +0100
@@ -1,0 +2,6 @@
+Sun Dec 28 19:46:11 UTC 2025 - Dirk Müller <[email protected]>
+
+- update to 0.0.21:
+  * Add support for Python 3.14 and drop EOL 3.8 and 3.9 #216.
+
+-------------------------------------------------------------------

Old:
----
  python_multipart-0.0.20.tar.gz

New:
----
  python_multipart-0.0.21.tar.gz

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

Other differences:
------------------
++++++ python-python-multipart.spec ++++++
--- /var/tmp/diff_new_pack.GUgCN8/_old  2025-12-30 12:00:16.168326517 +0100
+++ /var/tmp/diff_new_pack.GUgCN8/_new  2025-12-30 12:00:16.168326517 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-python-multipart
 #
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2025 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-python-multipart
-Version:        0.0.20
+Version:        0.0.21
 Release:        0
 License:        Apache-2.0
 Summary:        Python streaming multipart parser

++++++ python_multipart-0.0.20.tar.gz -> python_multipart-0.0.21.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python_multipart-0.0.20/CHANGELOG.md 
new/python_multipart-0.0.21/CHANGELOG.md
--- old/python_multipart-0.0.20/CHANGELOG.md    2020-02-02 01:00:00.000000000 
+0100
+++ new/python_multipart-0.0.21/CHANGELOG.md    2020-02-02 01:00:00.000000000 
+0100
@@ -1,5 +1,9 @@
 # Changelog
 
+## 0.0.21 (2025-12-17)
+
+* Add support for Python 3.14 and drop EOL 3.8 and 3.9 
[#216](https://github.com/Kludex/python-multipart/pull/216).
+
 ## 0.0.20 (2024-12-16)
 
 * Handle messages containing only end boundary 
[#142](https://github.com/Kludex/python-multipart/pull/142).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python_multipart-0.0.20/PKG-INFO 
new/python_multipart-0.0.21/PKG-INFO
--- old/python_multipart-0.0.20/PKG-INFO        2020-02-02 01:00:00.000000000 
+0100
+++ new/python_multipart-0.0.21/PKG-INFO        2020-02-02 01:00:00.000000000 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: python-multipart
-Version: 0.0.20
+Version: 0.0.21
 Summary: A streaming multipart parser for Python
 Project-URL: Homepage, https://github.com/Kludex/python-multipart
 Project-URL: Documentation, https://kludex.github.io/python-multipart/
@@ -16,13 +16,13 @@
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Requires-Python: >=3.8
+Requires-Python: >=3.10
 Description-Content-Type: text/markdown
 
 # [Python-Multipart](https://kludex.github.io/python-multipart/)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python_multipart-0.0.20/pyproject.toml 
new/python_multipart-0.0.21/pyproject.toml
--- old/python_multipart-0.0.20/pyproject.toml  2020-02-02 01:00:00.000000000 
+0100
+++ new/python_multipart-0.0.21/pyproject.toml  2020-02-02 01:00:00.000000000 
+0100
@@ -8,7 +8,7 @@
 description = "A streaming multipart parser for Python"
 readme = "README.md"
 license = "Apache-2.0"
-requires-python = ">=3.8"
+requires-python = ">=3.10"
 authors = [
     { name = "Andrew Dunham", email = "[email protected]" },
     { name = "Marcelo Trylesinski", email = "[email protected]" },
@@ -21,17 +21,17 @@
     'Operating System :: OS Independent',
     'Programming Language :: Python :: 3 :: Only',
     'Programming Language :: Python :: 3',
-    'Programming Language :: Python :: 3.8',
-    'Programming Language :: Python :: 3.9',
     'Programming Language :: Python :: 3.10',
     'Programming Language :: Python :: 3.11',
     'Programming Language :: Python :: 3.12',
+    'Programming Language :: Python :: 3.13',
+    'Programming Language :: Python :: 3.14',
     'Topic :: Software Development :: Libraries :: Python Modules',
 ]
 dependencies = []
 
-[tool.uv]
-dev-dependencies = [
+[dependency-groups]
+dev = [
     "atomicwrites==1.4.1",
     "attrs==23.2.0",
     "coverage==7.4.4",
@@ -44,7 +44,7 @@
     "PyYAML==6.0.1",
     "invoke==2.2.0",
     "pytest-timeout==2.3.1",
-    "ruff==0.8.0",
+    "ruff==0.11.7",
     "mypy",
     "types-PyYAML",
     "atheris==2.3.0; python_version <= '3.11'",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python_multipart-0.0.20/python_multipart/__init__.py 
new/python_multipart-0.0.21/python_multipart/__init__.py
--- old/python_multipart-0.0.20/python_multipart/__init__.py    2020-02-02 
01:00:00.000000000 +0100
+++ new/python_multipart-0.0.21/python_multipart/__init__.py    2020-02-02 
01:00:00.000000000 +0100
@@ -2,7 +2,7 @@
 __author__ = "Andrew Dunham"
 __license__ = "Apache"
 __copyright__ = "Copyright (c) 2012-2013, Andrew Dunham"
-__version__ = "0.0.20"
+__version__ = "0.0.21"
 
 from .multipart import (
     BaseParser,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python_multipart-0.0.20/python_multipart/decoders.py 
new/python_multipart-0.0.21/python_multipart/decoders.py
--- old/python_multipart-0.0.20/python_multipart/decoders.py    2020-02-02 
01:00:00.000000000 +0100
+++ new/python_multipart-0.0.21/python_multipart/decoders.py    2020-02-02 
01:00:00.000000000 +0100
@@ -62,7 +62,7 @@
 
         # Prepend any cache info to our data.
         if len(self.cache) > 0:
-            data = self.cache + data
+            data = bytes(self.cache) + data
 
         # Slice off a string that's a multiple of 4.
         decode_len = (len(data) // 4) * 4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python_multipart-0.0.20/python_multipart/multipart.py 
new/python_multipart-0.0.21/python_multipart/multipart.py
--- old/python_multipart-0.0.20/python_multipart/multipart.py   2020-02-02 
01:00:00.000000000 +0100
+++ new/python_multipart-0.0.21/python_multipart/multipart.py   2020-02-02 
01:00:00.000000000 +0100
@@ -15,9 +15,8 @@
 from .exceptions import FileError, FormParserError, MultipartParseError, 
QuerystringParseError
 
 if TYPE_CHECKING:  # pragma: no cover
-    from typing import Any, Callable, Literal, Protocol, TypedDict
-
-    from typing_extensions import TypeAlias
+    from collections.abc import Callable
+    from typing import Any, Literal, Protocol, TypeAlias, TypedDict
 
     class SupportsRead(Protocol):
         def read(self, __n: int) -> bytes: ...
@@ -332,7 +331,7 @@
         else:
             v = repr(self.value)
 
-        return "{}(field_name={!r}, value={})".format(self.__class__.__name__, 
self.field_name, v)
+        return f"{self.__class__.__name__}(field_name={self.field_name!r}, 
value={v})"
 
 
 class File:
@@ -570,7 +569,7 @@
         self._fileobj.close()
 
     def __repr__(self) -> str:
-        return "{}(file_name={!r}, 
field_name={!r})".format(self.__class__.__name__, self.file_name, 
self.field_name)
+        return f"{self.__class__.__name__}(file_name={self.file_name!r}, 
field_name={self.field_name!r})"
 
 
 class BaseParser:
@@ -1241,7 +1240,7 @@
             elif state == MultipartState.HEADER_VALUE_ALMOST_DONE:
                 # The last character should be a LF.  If not, it's an error.
                 if c != LF:
-                    msg = "Did not find LF character at end of header " 
"(found %r)" % (c,)
+                    msg = f"Did not find LF character at end of header (found 
{c!r})"
                     self.logger.warning(msg)
                     e = MultipartParseError(msg)
                     e.offset = i
@@ -1715,7 +1714,7 @@
                 else:
                     self.logger.warning("Unknown Content-Transfer-Encoding: 
%r", transfer_encoding)
                     if self.config["UPLOAD_ERROR_ON_BAD_CTE"]:
-                        raise FormParserError('Unknown 
Content-Transfer-Encoding "{!r}"'.format(transfer_encoding))
+                        raise FormParserError(f'Unknown 
Content-Transfer-Encoding "{transfer_encoding!r}"')
                     else:
                         # If we aren't erroring, then we just treat this as an
                         # unencoded Content-Transfer-Encoding.
@@ -1746,7 +1745,7 @@
 
         else:
             self.logger.warning("Unknown Content-Type: %r", content_type)
-            raise FormParserError("Unknown Content-Type: 
{}".format(content_type))
+            raise FormParserError(f"Unknown Content-Type: {content_type}")
 
         self.parser = parser
 
@@ -1776,7 +1775,7 @@
             self.parser.close()
 
     def __repr__(self) -> str:
-        return "{}(content_type={!r}, 
parser={!r})".format(self.__class__.__name__, self.content_type, self.parser)
+        return f"{self.__class__.__name__}(content_type={self.content_type!r}, 
parser={self.parser!r})"
 
 
 def create_form_parser(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python_multipart-0.0.20/tests/compat.py 
new/python_multipart-0.0.21/tests/compat.py
--- old/python_multipart-0.0.20/tests/compat.py 2020-02-02 01:00:00.000000000 
+0100
+++ new/python_multipart-0.0.21/tests/compat.py 2020-02-02 01:00:00.000000000 
+0100
@@ -8,7 +8,8 @@
 from typing import TYPE_CHECKING
 
 if TYPE_CHECKING:
-    from typing import Any, Callable
+    from collections.abc import Callable
+    from typing import Any
 
 
 def ensure_in_path(path: str) -> None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python_multipart-0.0.20/tests/test_multipart.py 
new/python_multipart-0.0.21/tests/test_multipart.py
--- old/python_multipart-0.0.20/tests/test_multipart.py 2020-02-02 
01:00:00.000000000 +0100
+++ new/python_multipart-0.0.21/tests/test_multipart.py 2020-02-02 
01:00:00.000000000 +0100
@@ -37,7 +37,8 @@
 from .compat import parametrize, parametrize_class
 
 if TYPE_CHECKING:
-    from typing import Any, Iterator, TypedDict
+    from collections.abc import Iterator
+    from typing import Any, TypedDict
 
     from python_multipart.multipart import FieldProtocol, FileConfig, 
FileProtocol
 
@@ -1069,7 +1070,9 @@
 
         self.make("boundary")
         data = b"--Boundary\r\nfoobar"
-        with self.assertRaisesRegex(MultipartParseError, "Expected boundary 
character %r, got %r" % (b"b"[0], b"B"[0])):
+        with self.assertRaisesRegex(
+            MultipartParseError, "Expected boundary character {!r}, got 
{!r}".format(b"b"[0], b"B"[0])
+        ):
             self.f.write(data)
 
     def test_octet_stream(self) -> None:

Reply via email to