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