Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-oslo.middleware for 
openSUSE:Factory checked in at 2026-06-15 19:44:39
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-oslo.middleware (Old)
 and      /work/SRC/openSUSE:Factory/.python-oslo.middleware.new.1981 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-oslo.middleware"

Mon Jun 15 19:44:39 2026 rev:25 rq:1359326 version:8.1.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-oslo.middleware/python-oslo.middleware.changes
    2026-03-29 20:01:41.051883994 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-oslo.middleware.new.1981/python-oslo.middleware.changes
  2026-06-15 19:48:06.219136042 +0200
@@ -1,0 +2,11 @@
+Sun Jun 14 21:13:39 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 8.1.0:
+  * tox: Use new constraints option
+  * tests: Use subTest
+  * typing: Fix compatibility with typed testtools, oslotest
+  * Update packaging configuration
+  * ruff: Configure hacking as external linter
+  * Update master for stable/2026.1
+
+-------------------------------------------------------------------

Old:
----
  oslo_middleware-8.0.0.tar.gz

New:
----
  oslo_middleware-8.1.0.tar.gz

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

Other differences:
------------------
++++++ python-oslo.middleware.spec ++++++
--- /var/tmp/diff_new_pack.eGxYMT/_old  2026-06-15 19:48:07.019169659 +0200
+++ /var/tmp/diff_new_pack.eGxYMT/_new  2026-06-15 19:48:07.027169996 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           python-oslo.middleware
-Version:        8.0.0
+Version:        8.1.0
 Release:        0
 Summary:        OpenStack oslo.middleware library
 License:        Apache-2.0

++++++ oslo_middleware-8.0.0.tar.gz -> oslo_middleware-8.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_middleware-8.0.0/ChangeLog 
new/oslo_middleware-8.1.0/ChangeLog
--- old/oslo_middleware-8.0.0/ChangeLog 2026-02-17 17:29:28.000000000 +0100
+++ new/oslo_middleware-8.1.0/ChangeLog 2026-05-18 11:14:22.000000000 +0200
@@ -1,6 +1,16 @@
 CHANGES
 =======
 
+8.1.0
+-----
+
+* tox: Use new constraints option
+* tests: Use subTest
+* typing: Fix compatibility with typed testtools, oslotest
+* Update packaging configuration
+* ruff: Configure hacking as external linter
+* Update master for stable/2026.1
+
 8.0.0
 -----
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_middleware-8.0.0/PKG-INFO 
new/oslo_middleware-8.1.0/PKG-INFO
--- old/oslo_middleware-8.0.0/PKG-INFO  2026-02-17 17:29:28.109672800 +0100
+++ new/oslo_middleware-8.1.0/PKG-INFO  2026-05-18 11:14:22.334196300 +0200
@@ -1,14 +1,14 @@
 Metadata-Version: 2.4
 Name: oslo.middleware
-Version: 8.0.0
+Version: 8.1.0
 Summary: Oslo Middleware library
 Author-email: OpenStack <[email protected]>
+License-Expression: Apache-2.0
 Project-URL: Homepage, https://docs.openstack.org/oslo.middleware
 Project-URL: Repository, https://opendev.org/openstack/oslo.middleware
 Classifier: Environment :: OpenStack
 Classifier: Intended Audience :: Information Technology
 Classifier: Intended Audience :: System Administrators
-Classifier: License :: OSI Approved :: Apache Software License
 Classifier: Operating System :: POSIX :: Linux
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_middleware-8.0.0/oslo.middleware.egg-info/PKG-INFO 
new/oslo_middleware-8.1.0/oslo.middleware.egg-info/PKG-INFO
--- old/oslo_middleware-8.0.0/oslo.middleware.egg-info/PKG-INFO 2026-02-17 
17:29:28.000000000 +0100
+++ new/oslo_middleware-8.1.0/oslo.middleware.egg-info/PKG-INFO 2026-05-18 
11:14:22.000000000 +0200
@@ -1,14 +1,14 @@
 Metadata-Version: 2.4
 Name: oslo.middleware
-Version: 8.0.0
+Version: 8.1.0
 Summary: Oslo Middleware library
 Author-email: OpenStack <[email protected]>
+License-Expression: Apache-2.0
 Project-URL: Homepage, https://docs.openstack.org/oslo.middleware
 Project-URL: Repository, https://opendev.org/openstack/oslo.middleware
 Classifier: Environment :: OpenStack
 Classifier: Intended Audience :: Information Technology
 Classifier: Intended Audience :: System Administrators
-Classifier: License :: OSI Approved :: Apache Software License
 Classifier: Operating System :: POSIX :: Linux
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_middleware-8.0.0/oslo.middleware.egg-info/SOURCES.txt 
new/oslo_middleware-8.1.0/oslo.middleware.egg-info/SOURCES.txt
--- old/oslo_middleware-8.0.0/oslo.middleware.egg-info/SOURCES.txt      
2026-02-17 17:29:28.000000000 +0100
+++ new/oslo_middleware-8.1.0/oslo.middleware.egg-info/SOURCES.txt      
2026-05-18 11:14:22.000000000 +0200
@@ -95,6 +95,7 @@
 releasenotes/source/2024.2.rst
 releasenotes/source/2025.1.rst
 releasenotes/source/2025.2.rst
+releasenotes/source/2026.1.rst
 releasenotes/source/conf.py
 releasenotes/source/index.rst
 releasenotes/source/ocata.rst
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_middleware-8.0.0/oslo.middleware.egg-info/pbr.json 
new/oslo_middleware-8.1.0/oslo.middleware.egg-info/pbr.json
--- old/oslo_middleware-8.0.0/oslo.middleware.egg-info/pbr.json 2026-02-17 
17:29:28.000000000 +0100
+++ new/oslo_middleware-8.1.0/oslo.middleware.egg-info/pbr.json 2026-05-18 
11:14:22.000000000 +0200
@@ -1 +1 @@
-{"git_version": "ef1290c", "is_release": true}
\ No newline at end of file
+{"git_version": "d6c3e49", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_middleware-8.0.0/oslo_middleware/tests/test_auth_basic.py 
new/oslo_middleware-8.1.0/oslo_middleware/tests/test_auth_basic.py
--- old/oslo_middleware-8.0.0/oslo_middleware/tests/test_auth_basic.py  
2026-02-17 17:29:00.000000000 +0100
+++ new/oslo_middleware-8.1.0/oslo_middleware/tests/test_auth_basic.py  
2026-05-18 11:13:46.000000000 +0200
@@ -77,32 +77,32 @@
             'foo:bar\nmyName:$2y$05$lE3eGtyj41jZwrzS87KTqe6.'
             'JETVCWBkc32C63UP2aYrGoYOEpbJm\n\n\n'
         )
-        # test basic auth
-        self.assertEqual(
-            {'HTTP_X_USER': 'myName', 'HTTP_X_USER_NAME': 'myName'},
-            auth.authenticate(auth_file, 'myName', b'myPassword'),
-        )
-        # test failed auth
-        e = self.assertRaises(
-            webob.exc.HTTPBadRequest,
-            auth.authenticate,
-            auth_file,
-            'foo',
-            b'bar',
-        )
-        self.assertEqual(
-            'Only bcrypt digested passwords are supported for foo', str(e)
-        )
-        # test problem reading user data file
-        auth_file = auth_file + '.missing'
-        e = self.assertRaises(
-            webob.exc.HTTPBadRequest,
-            auth.authenticate,
-            auth_file,
-            'myName',
-            b'myPassword',
-        )
-        self.assertEqual('Problem reading auth file', str(e))
+        with self.subTest('basic auth'):
+            self.assertEqual(
+                {'HTTP_X_USER': 'myName', 'HTTP_X_USER_NAME': 'myName'},
+                auth.authenticate(auth_file, 'myName', b'myPassword'),
+            )
+        with self.subTest('failed auth'):
+            e = self.assertRaises(
+                webob.exc.HTTPBadRequest,
+                auth.authenticate,
+                auth_file,
+                'foo',
+                b'bar',
+            )
+            self.assertEqual(
+                'Only bcrypt digested passwords are supported for foo', str(e)
+            )
+        with self.subTest('problem reading user data file'):
+            auth_file = auth_file + '.missing'
+            e = self.assertRaises(
+                webob.exc.HTTPBadRequest,
+                auth.authenticate,
+                auth_file,
+                'myName',
+                b'myPassword',
+            )
+            self.assertEqual('Problem reading auth file', str(e))
 
     def test_auth_entry(self):
         entry_pass = (
@@ -110,86 +110,94 @@
             'JETVCWBkc32C63UP2aYrGoYOEpbJm'
         )
         entry_fail = 'foo:bar'
-        # success
-        self.assertEqual(
-            {'HTTP_X_USER': 'myName', 'HTTP_X_USER_NAME': 'myName'},
-            auth.auth_entry(entry_pass, b'myPassword'),
-        )
-        # failed, unknown digest format
-        ex = self.assertRaises(
-            webob.exc.HTTPBadRequest, auth.auth_entry, entry_fail, b'bar'
-        )
-        self.assertEqual(
-            'Only bcrypt digested passwords are supported for foo', str(ex)
-        )
-        # failed, incorrect password
-        self.assertRaises(
-            webob.exc.HTTPUnauthorized, auth.auth_entry, entry_pass, b'bar'
-        )
+        with self.subTest('success'):
+            self.assertEqual(
+                {'HTTP_X_USER': 'myName', 'HTTP_X_USER_NAME': 'myName'},
+                auth.auth_entry(entry_pass, b'myPassword'),
+            )
+        with self.subTest('unknown digest format'):
+            ex = self.assertRaises(
+                webob.exc.HTTPBadRequest, auth.auth_entry, entry_fail, b'bar'
+            )
+            self.assertEqual(
+                'Only bcrypt digested passwords are supported for foo', str(ex)
+            )
+        with self.subTest('incorrect password'):
+            self.assertRaises(
+                webob.exc.HTTPUnauthorized, auth.auth_entry, entry_pass, b'bar'
+            )
 
     def test_validate_auth_file(self):
         auth_file = self.write_auth_file(
             'myName:$2y$05$lE3eGtyj41jZwrzS87KTqe6.'
             'JETVCWBkc32C63UP2aYrGoYOEpbJm\n\n\n'
         )
-        # success, valid config
-        auth.validate_auth_file(auth_file)
-        # failed, missing auth file
-        auth_file = auth_file + '.missing'
-        self.assertRaises(
-            exc.ConfigInvalid, auth.validate_auth_file, auth_file
-        )
-        # failed, invalid entry
-        auth_file = self.write_auth_file(
-            'foo:bar\nmyName:$2y$05$lE3eGtyj41jZwrzS87KTqe6.'
-            'JETVCWBkc32C63UP2aYrGoYOEpbJm\n\n\n'
-        )
-        self.assertRaises(
-            webob.exc.HTTPBadRequest, auth.validate_auth_file, auth_file
-        )
+        with self.subTest('valid config'):
+            auth.validate_auth_file(auth_file)
+        with self.subTest('missing auth file'):
+            auth_file = auth_file + '.missing'
+            self.assertRaises(
+                exc.ConfigInvalid, auth.validate_auth_file, auth_file
+            )
+        with self.subTest('invalid entry'):
+            auth_file = self.write_auth_file(
+                'foo:bar\nmyName:$2y$05$lE3eGtyj41jZwrzS87KTqe6.'
+                'JETVCWBkc32C63UP2aYrGoYOEpbJm\n\n\n'
+            )
+            self.assertRaises(
+                webob.exc.HTTPBadRequest, auth.validate_auth_file, auth_file
+            )
 
     def test_parse_token(self):
-        # success with bytes
-        btoken = base64.b64encode(b'myName:myPassword')
-        self.assertEqual(('myName', b'myPassword'), auth.parse_token(btoken))
-        # success with string
-        token = str(btoken, encoding='utf-8')
-        self.assertEqual(('myName', b'myPassword'), auth.parse_token(token))
-        # failed, invalid base64
-        e = self.assertRaises(
-            webob.exc.HTTPBadRequest, auth.parse_token, token[:-1]
-        )
-        self.assertEqual('Could not decode authorization token', str(e))
-        # failed, no colon in token
-        token = str(base64.b64encode(b'myNamemyPassword'), encoding='utf-8')
-        e = self.assertRaises(
-            webob.exc.HTTPBadRequest, auth.parse_token, token[:-1]
-        )
-        self.assertEqual('Could not decode authorization token', str(e))
+        with self.subTest('success with bytes'):
+            btoken = base64.b64encode(b'myName:myPassword')
+            self.assertEqual(
+                ('myName', b'myPassword'), auth.parse_token(btoken)
+            )
+        with self.subTest('success with string'):
+            token = str(btoken, encoding='utf-8')
+            self.assertEqual(
+                ('myName', b'myPassword'), auth.parse_token(token)
+            )
+        with self.subTest('invalid base64'):
+            e = self.assertRaises(
+                webob.exc.HTTPBadRequest, auth.parse_token, token[:-1]
+            )
+            self.assertEqual('Could not decode authorization token', str(e))
+        with self.subTest('no colon in token'):
+            token = str(
+                base64.b64encode(b'myNamemyPassword'), encoding='utf-8'
+            )
+            e = self.assertRaises(
+                webob.exc.HTTPBadRequest, auth.parse_token, token[:-1]
+            )
+            self.assertEqual('Could not decode authorization token', str(e))
 
     def test_parse_header(self):
-        auth_value = 'Basic bXlOYW1lOm15UGFzc3dvcmQ='
-        # success
-        self.assertEqual(
-            'bXlOYW1lOm15UGFzc3dvcmQ=',
-            auth.parse_header({'HTTP_AUTHORIZATION': auth_value}),
-        )
-        # failed, missing Authorization header
-        e = self.assertRaises(
-            webob.exc.HTTPUnauthorized, auth.parse_header, {}
-        )
-        # failed missing token
-        e = self.assertRaises(
-            webob.exc.HTTPBadRequest,
-            auth.parse_header,
-            {'HTTP_AUTHORIZATION': 'Basic'},
-        )
-        self.assertEqual('Could not parse Authorization header', str(e))
-        # failed, type other than Basic
-        digest_value = 'Digest username="myName" nonce="foobar"'
-        e = self.assertRaises(
-            webob.exc.HTTPBadRequest,
-            auth.parse_header,
-            {'HTTP_AUTHORIZATION': digest_value},
-        )
-        self.assertEqual('Unsupported authorization type "Digest"', str(e))
+        with self.subTest('success'):
+            auth_value = 'Basic bXlOYW1lOm15UGFzc3dvcmQ='
+            self.assertEqual(
+                'bXlOYW1lOm15UGFzc3dvcmQ=',
+                auth.parse_header({'HTTP_AUTHORIZATION': auth_value}),
+            )
+
+        with self.subTest('failed, missing Authorization header'):
+            self.assertRaises(
+                webob.exc.HTTPUnauthorized, auth.parse_header, {}
+            )
+            # failed missing token
+            e = self.assertRaises(
+                webob.exc.HTTPBadRequest,
+                auth.parse_header,
+                {'HTTP_AUTHORIZATION': 'Basic'},
+            )
+            self.assertEqual('Could not parse Authorization header', str(e))
+
+        with self.subTest('failed, type other than Basic'):
+            digest_value = 'Digest username="myName" nonce="foobar"'
+            e = self.assertRaises(
+                webob.exc.HTTPBadRequest,
+                auth.parse_header,
+                {'HTTP_AUTHORIZATION': digest_value},
+            )
+            self.assertEqual('Unsupported authorization type "Digest"', str(e))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_middleware-8.0.0/oslo_middleware/tests/test_request_id.py 
new/oslo_middleware-8.1.0/oslo_middleware/tests/test_request_id.py
--- old/oslo_middleware-8.0.0/oslo_middleware/tests/test_request_id.py  
2026-02-17 17:29:00.000000000 +0100
+++ new/oslo_middleware-8.1.0/oslo_middleware/tests/test_request_id.py  
2026-05-18 11:13:46.000000000 +0200
@@ -37,8 +37,7 @@
         req = webob.Request.blank('/test')
         res = req.get_response(app)
         res_req_id = res.headers.get(request_id.HTTP_RESP_HEADER_REQUEST_ID)
-        if isinstance(res_req_id, bytes):
-            res_req_id = res_req_id.decode('utf-8')
+        assert isinstance(res_req_id, str)
         self.assertThat(res_req_id, matchers.StartsWith('req-'))
         # request-id in request environ is returned as response body
         self.assertEqual(res.body.decode('utf-8'), res_req_id)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_middleware-8.0.0/pyproject.toml 
new/oslo_middleware-8.1.0/pyproject.toml
--- old/oslo_middleware-8.0.0/pyproject.toml    2026-02-17 17:29:00.000000000 
+0100
+++ new/oslo_middleware-8.1.0/pyproject.toml    2026-05-18 11:13:46.000000000 
+0200
@@ -9,12 +9,12 @@
 authors = [
     {name = "OpenStack", email = "[email protected]"},
 ]
+license = "Apache-2.0"
 requires-python = ">=3.10"
 classifiers = [
     "Environment :: OpenStack",
     "Intended Audience :: Information Technology",
     "Intended Audience :: System Administrators",
-    "License :: OSI Approved :: Apache Software License",
     "Operating System :: POSIX :: Linux",
     "Programming Language :: Python",
     "Programming Language :: Python :: 3",
@@ -58,29 +58,16 @@
 request_id = "oslo_middleware:RequestId.factory"
 sizelimit = "oslo_middleware:RequestBodySizeLimiter.factory"
 
-[tool.setuptools]
-packages = ["oslo_middleware"]
-
-[tool.ruff]
-line-length = 79
-
-[tool.ruff.format]
-quote-style = "preserve"
-docstring-code-format = true
-
-[tool.ruff.lint]
-select = ["E4", "E5", "E7", "E9", "F", "G", "LOG", "S", "UP"]
-
-[tool.ruff.lint.per-file-ignores]
-"oslo_middleware/tests/*" = ["S"]
+[tool.setuptools.packages.find]
+include = ["oslo_middleware"]
 
 [tool.mypy]
 python_version = "3.10"
 show_column_numbers = true
 show_error_context = true
 strict = true
-ignore_missing_imports = true
-exclude = '(?x)(doc | releasenotes)'
+disable_error_code = ["import-untyped"]
+exclude = "(?x)(doc | releasenotes)"
 
 [[tool.mypy.overrides]]
 module = ["oslo_middleware.tests.*"]
@@ -90,3 +77,17 @@
 disallow_subclassing_any = false
 disallow_untyped_calls = false
 disallow_untyped_defs = false
+
+[tool.ruff]
+line-length = 79
+
+[tool.ruff.format]
+quote-style = "preserve"
+docstring-code-format = true
+
+[tool.ruff.lint]
+select = ["E4", "E5", "E7", "E9", "F", "G", "LOG", "S", "UP"]
+external = ["H"]
+
+[tool.ruff.lint.per-file-ignores]
+"oslo_middleware/tests/*" = ["S"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_middleware-8.0.0/releasenotes/source/2026.1.rst 
new/oslo_middleware-8.1.0/releasenotes/source/2026.1.rst
--- old/oslo_middleware-8.0.0/releasenotes/source/2026.1.rst    1970-01-01 
01:00:00.000000000 +0100
+++ new/oslo_middleware-8.1.0/releasenotes/source/2026.1.rst    2026-05-18 
11:13:46.000000000 +0200
@@ -0,0 +1,6 @@
+===========================
+2026.1 Series Release Notes
+===========================
+
+.. release-notes::
+   :branch: stable/2026.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_middleware-8.0.0/releasenotes/source/index.rst 
new/oslo_middleware-8.1.0/releasenotes/source/index.rst
--- old/oslo_middleware-8.0.0/releasenotes/source/index.rst     2026-02-17 
17:29:00.000000000 +0100
+++ new/oslo_middleware-8.1.0/releasenotes/source/index.rst     2026-05-18 
11:13:46.000000000 +0200
@@ -6,6 +6,7 @@
    :maxdepth: 1
 
    unreleased
+   2026.1
    2025.2
    2025.1
    2024.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_middleware-8.0.0/tox.ini 
new/oslo_middleware-8.1.0/tox.ini
--- old/oslo_middleware-8.0.0/tox.ini   2026-02-17 17:29:00.000000000 +0100
+++ new/oslo_middleware-8.1.0/tox.ini   2026-05-18 11:13:46.000000000 +0200
@@ -1,10 +1,11 @@
 [tox]
-minversion = 3.18.0
+minversion = 4.28.0
 envlist = py3,pep8
 
 [testenv]
+constraints =
+  
{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
 deps =
-  
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
   -r{toxinidir}/test-requirements.txt
 commands = stestr run --slowest {posargs}
 
@@ -37,7 +38,6 @@
 allowlist_externals =
   rm
 deps =
-  
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
   -r{toxinidir}/doc/requirements.txt
 commands =
   rm -fr doc/build

Reply via email to