boto3 1.38.45__tar.gz → 1.42.22__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. {boto3-1.38.45 → boto3-1.42.22}/PKG-INFO +13 -7
  2. {boto3-1.38.45 → boto3-1.42.22}/README.rst +8 -2
  3. {boto3-1.38.45 → boto3-1.42.22}/boto3/__init__.py +3 -7
  4. {boto3-1.38.45 → boto3-1.42.22}/boto3/compat.py +9 -4
  5. {boto3-1.38.45 → boto3-1.42.22}/boto3/crt.py +53 -3
  6. {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/__init__.py +1 -1
  7. {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/service.py +1 -1
  8. {boto3-1.38.45 → boto3-1.42.22}/boto3/dynamodb/conditions.py +3 -3
  9. {boto3-1.38.45 → boto3-1.42.22}/boto3/exceptions.py +4 -0
  10. {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/base.py +7 -11
  11. {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/factory.py +3 -3
  12. {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/model.py +3 -3
  13. {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/params.py +1 -1
  14. {boto3-1.38.45 → boto3-1.42.22}/boto3/s3/constants.py +1 -0
  15. {boto3-1.38.45 → boto3-1.42.22}/boto3/s3/inject.py +6 -6
  16. {boto3-1.38.45 → boto3-1.42.22}/boto3/s3/transfer.py +114 -36
  17. {boto3-1.38.45 → boto3-1.42.22}/boto3/session.py +41 -31
  18. {boto3-1.38.45 → boto3-1.42.22}/boto3/utils.py +1 -11
  19. {boto3-1.38.45 → boto3-1.42.22}/boto3.egg-info/PKG-INFO +13 -7
  20. {boto3-1.38.45 → boto3-1.42.22}/boto3.egg-info/SOURCES.txt +0 -1
  21. {boto3-1.38.45 → boto3-1.42.22}/boto3.egg-info/requires.txt +2 -2
  22. {boto3-1.38.45 → boto3-1.42.22}/pyproject.toml +9 -1
  23. {boto3-1.38.45 → boto3-1.42.22}/setup.cfg +2 -2
  24. {boto3-1.38.45 → boto3-1.42.22}/setup.py +4 -4
  25. boto3-1.38.45/boto3/data/opsworks/2013-02-18/resources-1.json +0 -173
  26. {boto3-1.38.45 → boto3-1.42.22}/CONTRIBUTING.rst +0 -0
  27. {boto3-1.38.45 → boto3-1.42.22}/LICENSE +0 -0
  28. {boto3-1.38.45 → boto3-1.42.22}/MANIFEST.in +0 -0
  29. {boto3-1.38.45 → boto3-1.42.22}/NOTICE +0 -0
  30. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/cloudformation/2010-05-15/resources-1.json +0 -0
  31. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/cloudwatch/2010-08-01/resources-1.json +0 -0
  32. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/dynamodb/2012-08-10/resources-1.json +0 -0
  33. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2014-10-01/resources-1.json +0 -0
  34. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2015-03-01/resources-1.json +0 -0
  35. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2015-04-15/resources-1.json +0 -0
  36. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2015-10-01/resources-1.json +0 -0
  37. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2016-04-01/resources-1.json +0 -0
  38. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2016-09-15/resources-1.json +0 -0
  39. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2016-11-15/resources-1.json +0 -0
  40. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/glacier/2012-06-01/resources-1.json +0 -0
  41. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/iam/2010-05-08/resources-1.json +0 -0
  42. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/s3/2006-03-01/resources-1.json +0 -0
  43. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/sns/2010-03-31/resources-1.json +0 -0
  44. {boto3-1.38.45 → boto3-1.42.22}/boto3/data/sqs/2012-11-05/resources-1.json +0 -0
  45. {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/action.py +0 -0
  46. {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/attr.py +0 -0
  47. {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/base.py +0 -0
  48. {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/client.py +0 -0
  49. {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/collection.py +0 -0
  50. {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/docstring.py +0 -0
  51. {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/method.py +0 -0
  52. {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/resource.py +0 -0
  53. {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/subresource.py +0 -0
  54. {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/utils.py +0 -0
  55. {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/waiter.py +0 -0
  56. {boto3-1.38.45 → boto3-1.42.22}/boto3/dynamodb/__init__.py +0 -0
  57. {boto3-1.38.45 → boto3-1.42.22}/boto3/dynamodb/table.py +0 -0
  58. {boto3-1.38.45 → boto3-1.42.22}/boto3/dynamodb/transform.py +0 -0
  59. {boto3-1.38.45 → boto3-1.42.22}/boto3/dynamodb/types.py +0 -0
  60. {boto3-1.38.45 → boto3-1.42.22}/boto3/ec2/__init__.py +0 -0
  61. {boto3-1.38.45 → boto3-1.42.22}/boto3/ec2/createtags.py +0 -0
  62. {boto3-1.38.45 → boto3-1.42.22}/boto3/ec2/deletetags.py +0 -0
  63. {boto3-1.38.45 → boto3-1.42.22}/boto3/examples/cloudfront.rst +0 -0
  64. {boto3-1.38.45 → boto3-1.42.22}/boto3/examples/s3.rst +0 -0
  65. {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/__init__.py +0 -0
  66. {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/action.py +0 -0
  67. {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/collection.py +0 -0
  68. {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/response.py +0 -0
  69. {boto3-1.38.45 → boto3-1.42.22}/boto3/s3/__init__.py +0 -0
  70. {boto3-1.38.45 → boto3-1.42.22}/boto3.egg-info/dependency_links.txt +0 -0
  71. {boto3-1.38.45 → boto3-1.42.22}/boto3.egg-info/top_level.txt +0 -0
  72. {boto3-1.38.45 → boto3-1.42.22}/requirements.txt +0 -0
@@ -1,16 +1,15 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: boto3
3
- Version: 1.38.45
3
+ Version: 1.42.22
4
4
  Summary: The AWS SDK for Python
5
5
  Home-page: https://github.com/boto/boto3
6
6
  Author: Amazon Web Services
7
- License: Apache License 2.0
7
+ License: Apache-2.0
8
8
  Project-URL: Documentation, https://boto3.amazonaws.com/v1/documentation/api/latest/index.html
9
9
  Project-URL: Source, https://github.com/boto/boto3
10
10
  Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Intended Audience :: Developers
12
12
  Classifier: Natural Language :: English
13
- Classifier: License :: OSI Approved :: Apache Software License
14
13
  Classifier: Programming Language :: Python
15
14
  Classifier: Programming Language :: Python :: 3
16
15
  Classifier: Programming Language :: Python :: 3 :: Only
@@ -19,12 +18,13 @@ Classifier: Programming Language :: Python :: 3.10
19
18
  Classifier: Programming Language :: Python :: 3.11
20
19
  Classifier: Programming Language :: Python :: 3.12
21
20
  Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
22
  Requires-Python: >= 3.9
23
23
  License-File: LICENSE
24
24
  License-File: NOTICE
25
- Requires-Dist: botocore<1.39.0,>=1.38.45
25
+ Requires-Dist: botocore<1.43.0,>=1.42.22
26
26
  Requires-Dist: jmespath<2.0.0,>=0.7.1
27
- Requires-Dist: s3transfer<0.14.0,>=0.13.0
27
+ Requires-Dist: s3transfer<0.17.0,>=0.16.0
28
28
  Provides-Extra: crt
29
29
  Requires-Dist: botocore[crt]<2.0a0,>=1.21.0; extra == "crt"
30
30
 
@@ -47,10 +47,16 @@ Boto (pronounced boh-toh) was named after the fresh water dolphin native to the
47
47
  Notices
48
48
  -------
49
49
 
50
+ On 2026-04-29, support for Python 3.9 will end for Boto3. This follows the
51
+ Python Software Foundation `end of support <https://peps.python.org/pep-0596/#lifespan>`__
52
+ for the runtime which occurred on 2025-10-31.
53
+
50
54
  On 2025-04-22, support for Python 3.8 ended for Boto3. This follows the
51
55
  Python Software Foundation `end of support <https://peps.python.org/pep-0569/#lifespan>`__
52
56
  for the runtime which occurred on 2024-10-07.
53
- For more information, see this `blog post <https://aws.amazon.com/blogs/developer/python-support-policy-updates-for-aws-sdks-and-tools/>`__.
57
+
58
+ For more information on deprecations, see this
59
+ `blog post <https://aws.amazon.com/blogs/developer/python-support-policy-updates-for-aws-sdks-and-tools/>`__.
54
60
 
55
61
  .. _boto: https://docs.pythonboto.org/
56
62
  .. _`doc site`: https://boto3.amazonaws.com/v1/documentation/api/latest/index.html
@@ -109,7 +115,7 @@ Then, set up a default region (in e.g. ``~/.aws/config``):
109
115
  .. code-block:: ini
110
116
 
111
117
  [default]
112
- region=us-east-1
118
+ region = us-east-1
113
119
 
114
120
  Other credential configuration methods can be found `here <https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html>`__
115
121
 
@@ -17,10 +17,16 @@ Boto (pronounced boh-toh) was named after the fresh water dolphin native to the
17
17
  Notices
18
18
  -------
19
19
 
20
+ On 2026-04-29, support for Python 3.9 will end for Boto3. This follows the
21
+ Python Software Foundation `end of support <https://peps.python.org/pep-0596/#lifespan>`__
22
+ for the runtime which occurred on 2025-10-31.
23
+
20
24
  On 2025-04-22, support for Python 3.8 ended for Boto3. This follows the
21
25
  Python Software Foundation `end of support <https://peps.python.org/pep-0569/#lifespan>`__
22
26
  for the runtime which occurred on 2024-10-07.
23
- For more information, see this `blog post <https://aws.amazon.com/blogs/developer/python-support-policy-updates-for-aws-sdks-and-tools/>`__.
27
+
28
+ For more information on deprecations, see this
29
+ `blog post <https://aws.amazon.com/blogs/developer/python-support-policy-updates-for-aws-sdks-and-tools/>`__.
24
30
 
25
31
  .. _boto: https://docs.pythonboto.org/
26
32
  .. _`doc site`: https://boto3.amazonaws.com/v1/documentation/api/latest/index.html
@@ -79,7 +85,7 @@ Then, set up a default region (in e.g. ``~/.aws/config``):
79
85
  .. code-block:: ini
80
86
 
81
87
  [default]
82
- region=us-east-1
88
+ region = us-east-1
83
89
 
84
90
  Other credential configuration methods can be found `here <https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html>`__
85
91
 
@@ -12,12 +12,13 @@
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
14
  import logging
15
+ from logging import NullHandler
15
16
 
16
17
  from boto3.compat import _warn_deprecated_python
17
18
  from boto3.session import Session
18
19
 
19
20
  __author__ = 'Amazon Web Services'
20
- __version__ = '1.38.45'
21
+ __version__ = '1.42.22'
21
22
 
22
23
 
23
24
  # The default Boto3 session; autoloaded when needed.
@@ -101,11 +102,6 @@ def resource(*args, **kwargs):
101
102
  return _get_default_session().resource(*args, **kwargs)
102
103
 
103
104
 
104
- # Set up logging to ``/dev/null`` like a library is supposed to.
105
+ # Set up do-nothing logging like a library is supposed to.
105
106
  # https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library
106
- class NullHandler(logging.Handler):
107
- def emit(self, record):
108
- pass
109
-
110
-
111
107
  logging.getLogger('boto3').addHandler(NullHandler())
@@ -18,6 +18,8 @@ import warnings
18
18
 
19
19
  from boto3.exceptions import PythonDeprecationWarning
20
20
 
21
+ from s3transfer.manager import TransferConfig
22
+
21
23
  # In python3, socket.error is OSError, which is too general
22
24
  # for what we want (i.e FileNotFoundError is a subclass of OSError).
23
25
  # In py3 all the socket related errors are in a newly created
@@ -29,6 +31,9 @@ _APPEND_MODE_CHAR = 'a'
29
31
  import collections.abc as collections_abc
30
32
 
31
33
 
34
+ TRANSFER_CONFIG_SUPPORTS_CRT = hasattr(TransferConfig, 'UNSET_DEFAULT')
35
+
36
+
32
37
  if sys.platform.startswith('win'):
33
38
  def rename_file(current_filename, new_filename):
34
39
  try:
@@ -60,8 +65,8 @@ def filter_python_deprecation_warnings():
60
65
 
61
66
  def _warn_deprecated_python():
62
67
  """Use this template for future deprecation campaigns as needed."""
63
- py_37_params = {
64
- 'date': 'December 13, 2023',
68
+ py_39_params = {
69
+ 'date': 'April 29, 2026',
65
70
  'blog_link': (
66
71
  'https://aws.amazon.com/blogs/developer/'
67
72
  'python-support-policy-updates-for-aws-sdks-and-tools/'
@@ -69,7 +74,7 @@ def _warn_deprecated_python():
69
74
  }
70
75
  deprecated_versions = {
71
76
  # Example template for future deprecations
72
- (3, 7): py_37_params,
77
+ (3, 9): py_39_params,
73
78
  }
74
79
  py_version = sys.version_info[:2]
75
80
 
@@ -78,7 +83,7 @@ def _warn_deprecated_python():
78
83
  warning = (
79
84
  "Boto3 will no longer support Python {}.{} "
80
85
  "starting {}. To continue receiving service updates, "
81
- "bug fixes, and security updates please upgrade to Python 3.8 or "
86
+ "bug fixes, and security updates please upgrade to Python 3.10 or "
82
87
  "later. More information can be found here: {}"
83
88
  ).format(py_version[0], py_version[1], params['date'], params['blog_link'])
84
89
  warnings.warn(warning, PythonDeprecationWarning)
@@ -19,6 +19,7 @@ project and is not intended for external consumption. All interfaces
19
19
  contained within are subject to abrupt breaking changes.
20
20
  """
21
21
 
22
+ import logging
22
23
  import threading
23
24
 
24
25
  import botocore.exceptions
@@ -31,6 +32,12 @@ from s3transfer.crt import (
31
32
  create_s3_crt_client,
32
33
  )
33
34
 
35
+ from boto3.compat import TRANSFER_CONFIG_SUPPORTS_CRT
36
+ from boto3.exceptions import InvalidCrtTransferConfigError
37
+ from boto3.s3.constants import CRT_TRANSFER_CLIENT
38
+
39
+ logger = logging.getLogger(__name__)
40
+
34
41
  # Singletons for CRT-backed transfers
35
42
  CRT_S3_CLIENT = None
36
43
  BOTOCORE_CRT_SERIALIZER = None
@@ -39,6 +46,15 @@ CLIENT_CREATION_LOCK = threading.Lock()
39
46
  PROCESS_LOCK_NAME = 'boto3'
40
47
 
41
48
 
49
+ _ALLOWED_CRT_TRANSFER_CONFIG_OPTIONS = {
50
+ 'multipart_threshold',
51
+ 'max_concurrency',
52
+ 'max_request_concurrency',
53
+ 'multipart_chunksize',
54
+ 'preferred_transfer_client',
55
+ }
56
+
57
+
42
58
  def _create_crt_client(session, config, region_name, cred_provider):
43
59
  """Create a CRT S3 Client for file transfer.
44
60
 
@@ -157,11 +173,45 @@ def compare_identity(boto3_creds, crt_s3_creds):
157
173
  return is_matching_identity
158
174
 
159
175
 
176
+ def _validate_crt_transfer_config(config):
177
+ if config is None:
178
+ return
179
+ # CRT client can also be configured via `AUTO_RESOLVE_TRANSFER_CLIENT`
180
+ # but it predates this validation. We only validate against CRT client
181
+ # configured via `CRT_TRANSFER_CLIENT` to preserve compatibility.
182
+ if config.preferred_transfer_client != CRT_TRANSFER_CLIENT:
183
+ return
184
+ invalid_crt_args = []
185
+ for param in config.DEFAULTS.keys():
186
+ val = config.get_deep_attr(param)
187
+ if (
188
+ param not in _ALLOWED_CRT_TRANSFER_CONFIG_OPTIONS
189
+ and val is not config.UNSET_DEFAULT
190
+ ):
191
+ invalid_crt_args.append(param)
192
+ if len(invalid_crt_args) > 0:
193
+ raise InvalidCrtTransferConfigError(
194
+ "The following transfer config options are invalid "
195
+ "when preferred_transfer_client is set to crt: "
196
+ f"{', '.join(invalid_crt_args)}`"
197
+ )
198
+
199
+
160
200
  def create_crt_transfer_manager(client, config):
161
201
  """Create a CRTTransferManager for optimized data transfer."""
162
202
  crt_s3_client = get_crt_s3_client(client, config)
163
203
  if is_crt_compatible_request(client, crt_s3_client):
164
- return CRTTransferManager(
165
- crt_s3_client.crt_client, BOTOCORE_CRT_SERIALIZER
166
- )
204
+ crt_transfer_manager_kwargs = {
205
+ 'crt_s3_client': crt_s3_client.crt_client,
206
+ 'crt_request_serializer': BOTOCORE_CRT_SERIALIZER,
207
+ }
208
+ if TRANSFER_CONFIG_SUPPORTS_CRT:
209
+ _validate_crt_transfer_config(config)
210
+ crt_transfer_manager_kwargs['config'] = config
211
+ if not TRANSFER_CONFIG_SUPPORTS_CRT and config:
212
+ logger.warning(
213
+ 'Using TransferConfig with CRT client requires '
214
+ 's3transfer >= 0.16.0, configured values will be ignored.'
215
+ )
216
+ return CRTTransferManager(**crt_transfer_manager_kwargs)
167
217
  return None
@@ -45,7 +45,7 @@ def generate_docs(root_dir, session):
45
45
  service_name, session, services_doc_path
46
46
  ).document_service()
47
47
  service_doc_path = os.path.join(
48
- services_doc_path, service_name + '.rst'
48
+ services_doc_path, f"{service_name}.rst"
49
49
  )
50
50
  with open(service_doc_path, 'wb') as f:
51
51
  f.write(docs)
@@ -190,7 +190,7 @@ class ServiceDocumenter(BaseServiceDocumenter):
190
190
 
191
191
  def _get_example_file(self):
192
192
  return os.path.realpath(
193
- os.path.join(self.EXAMPLE_PATH, self._service_name + '.rst')
193
+ os.path.join(self.EXAMPLE_PATH, f"{self._service_name}.rst")
194
194
  )
195
195
 
196
196
  def _document_examples(self, section):
@@ -311,10 +311,10 @@ class ConditionExpressionBuilder:
311
311
  self._value_placeholder = 'v'
312
312
 
313
313
  def _get_name_placeholder(self):
314
- return '#' + self._name_placeholder + str(self._name_count)
314
+ return f"#{self._name_placeholder}{self._name_count}"
315
315
 
316
316
  def _get_value_placeholder(self):
317
- return ':' + self._value_placeholder + str(self._value_count)
317
+ return f":{self._value_placeholder}{self._value_count}"
318
318
 
319
319
  def reset(self):
320
320
  """Resets the placeholder name and values"""
@@ -451,7 +451,7 @@ class ConditionExpressionBuilder:
451
451
  # Assuming the values are grouped by parenthesis.
452
452
  # IN is the currently the only one that uses this so it maybe
453
453
  # needed to be changed in future.
454
- return '(' + ', '.join(placeholder_list) + ')'
454
+ return f"({', '.join(placeholder_list)})"
455
455
  # Otherwise, treat the value as a single value that needs only
456
456
  # one placeholder.
457
457
  else:
@@ -124,3 +124,7 @@ class PythonDeprecationWarning(Warning):
124
124
  """
125
125
 
126
126
  pass
127
+
128
+
129
+ class InvalidCrtTransferConfigError(Boto3Error):
130
+ pass
@@ -104,7 +104,7 @@ class ServiceResource:
104
104
  # Allow setting identifiers as positional arguments in the order
105
105
  # in which they were defined in the ResourceJSON.
106
106
  for i, value in enumerate(args):
107
- setattr(self, '_' + self.meta.identifiers[i], value)
107
+ setattr(self, f"_{self.meta.identifiers[i]}", value)
108
108
 
109
109
  # Allow setting identifiers via keyword arguments. Here we need
110
110
  # extra logic to ignore other keyword arguments like ``client``.
@@ -115,7 +115,7 @@ class ServiceResource:
115
115
  if name not in self.meta.identifiers:
116
116
  raise ValueError(f'Unknown keyword argument: {name}')
117
117
 
118
- setattr(self, '_' + name, value)
118
+ setattr(self, f"_{name}", value)
119
119
 
120
120
  # Validate that all identifiers have been set.
121
121
  for identifier in self.meta.identifiers:
@@ -123,15 +123,11 @@ class ServiceResource:
123
123
  raise ValueError(f'Required parameter {identifier} not set')
124
124
 
125
125
  def __repr__(self):
126
- identifiers = []
127
- for identifier in self.meta.identifiers:
128
- identifiers.append(
129
- f'{identifier}={repr(getattr(self, identifier))}'
130
- )
131
- return "{}({})".format(
132
- self.__class__.__name__,
133
- ', '.join(identifiers),
134
- )
126
+ identifiers = [
127
+ f'{identifier}={repr(getattr(self, identifier))}'
128
+ for identifier in self.meta.identifiers
129
+ ]
130
+ return f"{self.__class__.__name__}({', '.join(identifiers)})"
135
131
 
136
132
  def __eq__(self, other):
137
133
  # Should be instances of the same resource class
@@ -145,7 +145,7 @@ class ResourceFactory:
145
145
  cls_name = resource_name
146
146
  if service_context.service_name == resource_name:
147
147
  cls_name = 'ServiceResource'
148
- cls_name = service_context.service_name + '.' + cls_name
148
+ cls_name = f"{service_context.service_name}.{cls_name}"
149
149
 
150
150
  base_classes = [ServiceResource]
151
151
  if self._emitter is not None:
@@ -325,7 +325,7 @@ class ResourceFactory:
325
325
  # identifiers have a value ``None``. If any are ``None``,
326
326
  # a more informative user error than a generic AttributeError
327
327
  # is raised.
328
- return getattr(self, '_' + identifier.name, None)
328
+ return getattr(self, f"_{identifier.name}", None)
329
329
 
330
330
  get_identifier.__name__ = str(identifier.name)
331
331
  get_identifier.__doc__ = docstring.IdentifierDocstring(
@@ -344,7 +344,7 @@ class ResourceFactory:
344
344
  """
345
345
 
346
346
  def get_identifier(self):
347
- return getattr(self, '_' + identifier.name, None)
347
+ return getattr(self, f"_{identifier.name}", None)
348
348
 
349
349
  get_identifier.__name__ = str(identifier.member_name)
350
350
  get_identifier.__doc__ = docstring.AttributeDocstring(
@@ -366,9 +366,9 @@ class ResourceModel:
366
366
  name = xform_name(name)
367
367
 
368
368
  if name in names:
369
- logger.debug(f'Renaming {self.name} {category} {name}')
370
- self._renamed[(category, name)] = name + '_' + category
371
- name += '_' + category
369
+ logger.debug('Renaming %s %s %s', self.name, category, name)
370
+ self._renamed[(category, name)] = f"{name}_{category}"
371
+ name += f"_{category}"
372
372
 
373
373
  if name in names:
374
374
  # This isn't good, let's raise instead of trying to keep
@@ -132,7 +132,7 @@ def build_param_structure(params, target, value, index=None):
132
132
  else:
133
133
  # We have an explicit index
134
134
  index = int(result.group(1))
135
- part = part[: -len(str(index) + '[]')]
135
+ part = part[: -len(f"{index}[]")]
136
136
  else:
137
137
  # Index will be set after we know the proper part
138
138
  # name and that it's a list instance.
@@ -14,4 +14,5 @@
14
14
 
15
15
  # TransferConfig preferred_transfer_client settings
16
16
  CLASSIC_TRANSFER_CLIENT = "classic"
17
+ CRT_TRANSFER_CLIENT = "crt"
17
18
  AUTO_RESOLVE_TRANSFER_CLIENT = "auto"
@@ -440,8 +440,8 @@ def copy(
440
440
 
441
441
  :type ExtraArgs: dict
442
442
  :param ExtraArgs: Extra arguments that may be passed to the
443
- client operation. For allowed download arguments see
444
- :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_DOWNLOAD_ARGS`.
443
+ client operation. For allowed copy arguments see
444
+ :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_COPY_ARGS`.
445
445
 
446
446
  :type Callback: function
447
447
  :param Callback: A method which takes a number of bytes transferred to
@@ -519,8 +519,8 @@ def bucket_copy(
519
519
 
520
520
  :type ExtraArgs: dict
521
521
  :param ExtraArgs: Extra arguments that may be passed to the
522
- client operation. For allowed download arguments see
523
- :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_DOWNLOAD_ARGS`.
522
+ client operation. For allowed copy arguments see
523
+ :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_COPY_ARGS`.
524
524
 
525
525
  :type Callback: function
526
526
  :param Callback: A method which takes a number of bytes transferred to
@@ -582,8 +582,8 @@ def object_copy(
582
582
 
583
583
  :type ExtraArgs: dict
584
584
  :param ExtraArgs: Extra arguments that may be passed to the
585
- client operation. For allowed download arguments see
586
- :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_DOWNLOAD_ARGS`.
585
+ client operation. For allowed copy arguments see
586
+ :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_COPY_ARGS`.
587
587
 
588
588
  :type Callback: function
589
589
  :param Callback: A method which takes a number of bytes transferred to