Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-s3transfer for openSUSE:Factory checked in at 2024-03-14 17:42:22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-s3transfer (Old) and /work/SRC/openSUSE:Factory/.python-s3transfer.new.1905 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-s3transfer" Thu Mar 14 17:42:22 2024 rev:28 rq:1156949 version:0.10.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-s3transfer/python-s3transfer.changes 2023-12-25 19:04:34.671901408 +0100 +++ /work/SRC/openSUSE:Factory/.python-s3transfer.new.1905/python-s3transfer.changes 2024-03-14 17:42:28.943708039 +0100 @@ -1,0 +2,16 @@ +Mon Mar 4 14:00:49 UTC 2024 - Robert Schweikert <rjsch...@suse.com> + +- Drop Provides for SLE 15 SP4 and openSUSE Leap 15.4 and later + +------------------------------------------------------------------- +Wed Jan 31 22:45:39 UTC 2024 - Robert Schweikert <rjsch...@suse.com> + +- Switch to Python 3.11 build in SLE 15 SP4 and openSUSE Leap 15.4 and + later (jsc#PCT-371). +- Switch to wheel build +- Update to 0.10.0 + * feature:``s3``: Added CRT support for S3 Express One Zone +- From 0.9.0 + * feature:Python: End of support for Python 3.7 + +------------------------------------------------------------------- Old: ---- s3transfer-0.8.2.tar.gz New: ---- s3transfer-0.10.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-s3transfer.spec ++++++ --- /var/tmp/diff_new_pack.qqX5i6/_old 2024-03-14 17:42:29.467727252 +0100 +++ /var/tmp/diff_new_pack.qqX5i6/_new 2024-03-14 17:42:29.467727252 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-s3transfer # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2024 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,10 +16,9 @@ # -%{?!python_module:%define python_module() python-%{**} python3-%{**}} -%define skip_python2 1 +%{?sle15_python_module_pythons} Name: python-s3transfer -Version: 0.8.2 +Version: 0.10.0 Release: 0 Summary: Python S3 transfer manager License: Apache-2.0 @@ -27,15 +26,18 @@ URL: https://github.com/boto/s3transfer Source0: https://files.pythonhosted.org/packages/source/s/s3transfer/s3transfer-%{version}.tar.gz BuildRequires: %{python_module botocore >= 1.33.2} +BuildRequires: %{python_module pip} BuildRequires: %{python_module pytest} BuildRequires: %{python_module setuptools} +BuildRequires: %{python_module wheel} BuildRequires: fdupes BuildRequires: python-rpm-macros -Requires: python-botocore <= 2.0.0 -Requires: python-botocore >= 1.33.2 Requires: python-requests +Requires: (python-botocore >= 1.33.2 with python-botocore <= 2.0.0) BuildArch: noarch - +%if 0%{?sle_version} >= 150400 +Obsoletes: python3-s3transfer < %{version} +%endif %python_subpackages %description @@ -47,10 +49,10 @@ rm -rf tests/integration %build -%python_build +%pyproject_wheel %install -%python_install +%pyproject_install %python_expand %fdupes %{buildroot}%{$python_sitelib} %check @@ -61,5 +63,5 @@ %license LICENSE.txt %doc README.rst %{python_sitelib}/s3transfer/ -%{python_sitelib}/s3transfer-%{version}-py*.egg-info +%{python_sitelib}/s3transfer-%{version}*-info ++++++ s3transfer-0.8.2.tar.gz -> s3transfer-0.10.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/s3transfer-0.8.2/PKG-INFO new/s3transfer-0.10.0/PKG-INFO --- old/s3transfer-0.8.2/PKG-INFO 2023-11-29 20:43:09.000000000 +0100 +++ new/s3transfer-0.10.0/PKG-INFO 2023-12-21 20:12:29.487909300 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: s3transfer -Version: 0.8.2 +Version: 0.10.0 Summary: An Amazon S3 Transfer Manager Home-page: https://github.com/boto/s3transfer Author: Amazon Web Services @@ -14,13 +14,12 @@ Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.7 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 -Requires-Python: >= 3.7 +Requires-Python: >= 3.8 Provides-Extra: crt License-File: LICENSE.txt License-File: NOTICE.txt diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/s3transfer-0.8.2/s3transfer/__init__.py new/s3transfer-0.10.0/s3transfer/__init__.py --- old/s3transfer-0.8.2/s3transfer/__init__.py 2023-11-29 20:43:09.000000000 +0100 +++ new/s3transfer-0.10.0/s3transfer/__init__.py 2023-12-21 20:12:29.000000000 +0100 @@ -144,7 +144,7 @@ from s3transfer.exceptions import RetriesExceededError, S3UploadFailedError __author__ = 'Amazon Web Services' -__version__ = '0.8.2' +__version__ = '0.10.0' class NullHandler(logging.Handler): @@ -681,7 +681,6 @@ class S3Transfer: - ALLOWED_DOWNLOAD_ARGS = [ 'VersionId', 'SSECustomerAlgorithm', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/s3transfer-0.8.2/s3transfer/crt.py new/s3transfer-0.10.0/s3transfer/crt.py --- old/s3transfer-0.8.2/s3transfer/crt.py 2023-11-29 20:43:09.000000000 +0100 +++ new/s3transfer-0.10.0/s3transfer/crt.py 2023-12-21 20:12:29.000000000 +0100 @@ -18,7 +18,12 @@ import awscrt.s3 import botocore.awsrequest import botocore.session -from awscrt.auth import AwsCredentials, AwsCredentialsProvider +from awscrt.auth import ( + AwsCredentials, + AwsCredentialsProvider, + AwsSigningAlgorithm, + AwsSigningConfig, +) from awscrt.io import ( ClientBootstrap, ClientTlsContext, @@ -35,7 +40,12 @@ from s3transfer.constants import MB from s3transfer.exceptions import TransferNotDoneError from s3transfer.futures import BaseTransferFuture, BaseTransferMeta -from s3transfer.utils import CallArgs, OSUtils, get_callbacks +from s3transfer.utils import ( + CallArgs, + OSUtils, + get_callbacks, + is_s3express_bucket, +) logger = logging.getLogger(__name__) @@ -148,6 +158,7 @@ tls_mode=tls_mode, tls_connection_options=tls_connection_options, throughput_target_gbps=target_gbps, + enable_s3express=True, ) @@ -807,7 +818,7 @@ on_done_before_calls, on_done_after_calls, ): - return { + make_request_args = { 'request': self._request_serializer.serialize_http_request( request_type, future ), @@ -819,6 +830,11 @@ ), 'on_progress': self.get_crt_callback(future, 'progress'), } + if is_s3express_bucket(call_args.bucket): + make_request_args['signing_config'] = AwsSigningConfig( + algorithm=AwsSigningAlgorithm.V4_S3EXPRESS + ) + return make_request_args class RenameTempFileHandler: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/s3transfer-0.8.2/s3transfer/futures.py new/s3transfer-0.10.0/s3transfer/futures.py --- old/s3transfer-0.8.2/s3transfer/futures.py 2023-11-29 20:38:58.000000000 +0100 +++ new/s3transfer-0.10.0/s3transfer/futures.py 2023-12-21 20:10:16.000000000 +0100 @@ -505,6 +505,7 @@ than concurrent.futures.Future.add_done_callback that requires a single argument for the future. """ + # The done callback for concurrent.futures.Future will always pass a # the future in as the only argument. So we need to create the # proper signature wrapper that will invoke the callback provided. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/s3transfer-0.8.2/s3transfer.egg-info/PKG-INFO new/s3transfer-0.10.0/s3transfer.egg-info/PKG-INFO --- old/s3transfer-0.8.2/s3transfer.egg-info/PKG-INFO 2023-11-29 20:43:09.000000000 +0100 +++ new/s3transfer-0.10.0/s3transfer.egg-info/PKG-INFO 2023-12-21 20:12:29.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: s3transfer -Version: 0.8.2 +Version: 0.10.0 Summary: An Amazon S3 Transfer Manager Home-page: https://github.com/boto/s3transfer Author: Amazon Web Services @@ -14,13 +14,12 @@ Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.7 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 -Requires-Python: >= 3.7 +Requires-Python: >= 3.8 Provides-Extra: crt License-File: LICENSE.txt License-File: NOTICE.txt diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/s3transfer-0.8.2/setup.py new/s3transfer-0.10.0/setup.py --- old/s3transfer-0.8.2/setup.py 2023-11-29 20:40:28.000000000 +0100 +++ new/s3transfer-0.10.0/setup.py 2023-12-21 20:10:16.000000000 +0100 @@ -33,7 +33,7 @@ 'crt': 'botocore[crt]>=1.33.2,<2.0a.0', }, license="Apache License 2.0", - python_requires=">= 3.7", + python_requires=">= 3.8", classifiers=[ 'Development Status :: 3 - Alpha', 'Intended Audience :: Developers', @@ -42,7 +42,6 @@ 'Programming Language :: Python', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3 :: Only', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/s3transfer-0.8.2/tests/functional/test_copy.py new/s3transfer-0.10.0/tests/functional/test_copy.py --- old/s3transfer-0.8.2/tests/functional/test_copy.py 2023-11-29 20:40:28.000000000 +0100 +++ new/s3transfer-0.10.0/tests/functional/test_copy.py 2023-12-21 20:10:16.000000000 +0100 @@ -84,7 +84,6 @@ expected_create_mpu_params=None, expected_complete_mpu_params=None, ): - # Add all responses needed to do the copy of the object. # Should account for both ranged and nonranged downloads. stubbed_responses = self.create_stubbed_responses()[1:] @@ -497,7 +496,6 @@ def _add_params_to_expected_params( self, add_copy_kwargs, operation_types, new_params ): - expected_params_to_update = [] for operation_type in operation_types: add_copy_kwargs_key = 'expected_' + operation_type + '_params' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/s3transfer-0.8.2/tests/functional/test_crt.py new/s3transfer-0.10.0/tests/functional/test_crt.py --- old/s3transfer-0.8.2/tests/functional/test_crt.py 2023-11-29 20:40:28.000000000 +0100 +++ new/s3transfer-0.10.0/tests/functional/test_crt.py 2023-12-21 20:12:29.000000000 +0100 @@ -68,6 +68,7 @@ def setUp(self): self.region = 'us-west-2' self.bucket = "test_bucket" + self.s3express_bucket = 's3expressbucket--usw2-az5--x-s3' self.key = "test_key" self.expected_content = b'my content' self.expected_download_content = b'new content' @@ -77,6 +78,8 @@ ) self.expected_path = "/" + self.bucket + "/" + self.key self.expected_host = "s3.%s.amazonaws.com" % (self.region) + self.expected_s3express_host = f'{self.s3express_bucket}.s3express-usw2-az5.us-west-2.amazonaws.com' + self.expected_s3express_path = f'/{self.key}' self.s3_request = mock.Mock(awscrt.s3.S3Request) self.s3_crt_client = mock.Mock(awscrt.s3.S3Client) self.s3_crt_client.make_request.side_effect = ( @@ -134,6 +137,21 @@ for expected_missing_header in expected_missing_headers: self.assertNotIn(expected_missing_header.lower(), header_names) + def _assert_exected_s3express_request( + self, make_request_kwargs, expected_http_method='GET' + ): + self._assert_expected_crt_http_request( + make_request_kwargs["request"], + expected_host=self.expected_s3express_host, + expected_path=self.expected_s3express_path, + expected_http_method=expected_http_method, + ) + self.assertIn('signing_config', make_request_kwargs) + self.assertEqual( + make_request_kwargs['signing_config'].algorithm, + awscrt.auth.AwsSigningAlgorithm.V4_S3EXPRESS, + ) + def _assert_subscribers_called(self, expected_future=None): self.assertTrue(self.record_subscriber.on_queued_called) self.assertTrue(self.record_subscriber.on_done_called) @@ -355,6 +373,20 @@ [self.record_subscriber], ) + def test_upload_with_s3express(self): + future = self.transfer_manager.upload( + self.filename, + self.s3express_bucket, + self.key, + {}, + [self.record_subscriber], + ) + future.result() + self._assert_exected_s3express_request( + self.s3_crt_client.make_request.call_args[1], + expected_http_method='PUT', + ) + def test_download(self): future = self.transfer_manager.download( self.bucket, self.key, self.filename, {}, [self.record_subscriber] @@ -457,6 +489,20 @@ underlying_stream.getvalue(), self.expected_download_content ) + def test_download_with_s3express(self): + future = self.transfer_manager.download( + self.s3express_bucket, + self.key, + self.filename, + {}, + [self.record_subscriber], + ) + future.result() + self._assert_exected_s3express_request( + self.s3_crt_client.make_request.call_args[1], + expected_http_method='GET', + ) + def test_delete(self): future = self.transfer_manager.delete( self.bucket, self.key, {}, [self.record_subscriber] @@ -480,6 +526,16 @@ ) self._assert_subscribers_called(future) + def test_delete_with_s3express(self): + future = self.transfer_manager.delete( + self.s3express_bucket, self.key, {}, [self.record_subscriber] + ) + future.result() + self._assert_exected_s3express_request( + self.s3_crt_client.make_request.call_args[1], + expected_http_method='DELETE', + ) + def test_blocks_when_max_requests_processes_reached(self): self.s3_crt_client.make_request.return_value = self.s3_request # We simulate blocking by not invoking the on_done callbacks for diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/s3transfer-0.8.2/tests/functional/test_delete.py new/s3transfer-0.10.0/tests/functional/test_delete.py --- old/s3transfer-0.8.2/tests/functional/test_delete.py 2023-11-29 20:38:58.000000000 +0100 +++ new/s3transfer-0.10.0/tests/functional/test_delete.py 2023-12-21 20:10:16.000000000 +0100 @@ -15,7 +15,6 @@ class TestDeleteObject(BaseGeneralInterfaceTest): - __test__ = True def setUp(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/s3transfer-0.8.2/tests/unit/test_crt.py new/s3transfer-0.10.0/tests/unit/test_crt.py --- old/s3transfer-0.8.2/tests/unit/test_crt.py 2023-11-29 20:43:09.000000000 +0100 +++ new/s3transfer-0.10.0/tests/unit/test_crt.py 2023-12-21 20:12:29.000000000 +0100 @@ -362,3 +362,7 @@ mock_s3_crt_client.call_args[1]['throughput_target_gbps'] == expected_gbps ) + + def test_always_enables_s3express(self, mock_s3_crt_client): + s3transfer.crt.create_s3_crt_client('us-west-2') + assert mock_s3_crt_client.call_args[1]['enable_s3express'] is True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/s3transfer-0.8.2/tests/unit/test_s3transfer.py new/s3transfer-0.10.0/tests/unit/test_s3transfer.py --- old/s3transfer-0.8.2/tests/unit/test_s3transfer.py 2023-11-29 20:38:58.000000000 +0100 +++ new/s3transfer-0.10.0/tests/unit/test_s3transfer.py 2023-12-21 20:10:16.000000000 +0100 @@ -377,7 +377,6 @@ class TestMultipartDownloader(unittest.TestCase): - maxDiff = None def test_multipart_download_uses_correct_client_calls(self):