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.
- {boto3-1.38.45 → boto3-1.42.22}/PKG-INFO +13 -7
- {boto3-1.38.45 → boto3-1.42.22}/README.rst +8 -2
- {boto3-1.38.45 → boto3-1.42.22}/boto3/__init__.py +3 -7
- {boto3-1.38.45 → boto3-1.42.22}/boto3/compat.py +9 -4
- {boto3-1.38.45 → boto3-1.42.22}/boto3/crt.py +53 -3
- {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/__init__.py +1 -1
- {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/service.py +1 -1
- {boto3-1.38.45 → boto3-1.42.22}/boto3/dynamodb/conditions.py +3 -3
- {boto3-1.38.45 → boto3-1.42.22}/boto3/exceptions.py +4 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/base.py +7 -11
- {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/factory.py +3 -3
- {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/model.py +3 -3
- {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/params.py +1 -1
- {boto3-1.38.45 → boto3-1.42.22}/boto3/s3/constants.py +1 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/s3/inject.py +6 -6
- {boto3-1.38.45 → boto3-1.42.22}/boto3/s3/transfer.py +114 -36
- {boto3-1.38.45 → boto3-1.42.22}/boto3/session.py +41 -31
- {boto3-1.38.45 → boto3-1.42.22}/boto3/utils.py +1 -11
- {boto3-1.38.45 → boto3-1.42.22}/boto3.egg-info/PKG-INFO +13 -7
- {boto3-1.38.45 → boto3-1.42.22}/boto3.egg-info/SOURCES.txt +0 -1
- {boto3-1.38.45 → boto3-1.42.22}/boto3.egg-info/requires.txt +2 -2
- {boto3-1.38.45 → boto3-1.42.22}/pyproject.toml +9 -1
- {boto3-1.38.45 → boto3-1.42.22}/setup.cfg +2 -2
- {boto3-1.38.45 → boto3-1.42.22}/setup.py +4 -4
- boto3-1.38.45/boto3/data/opsworks/2013-02-18/resources-1.json +0 -173
- {boto3-1.38.45 → boto3-1.42.22}/CONTRIBUTING.rst +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/LICENSE +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/MANIFEST.in +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/NOTICE +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/cloudformation/2010-05-15/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/cloudwatch/2010-08-01/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/dynamodb/2012-08-10/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2014-10-01/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2015-03-01/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2015-04-15/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2015-10-01/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2016-04-01/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2016-09-15/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/ec2/2016-11-15/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/glacier/2012-06-01/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/iam/2010-05-08/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/s3/2006-03-01/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/sns/2010-03-31/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/data/sqs/2012-11-05/resources-1.json +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/action.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/attr.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/base.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/client.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/collection.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/docstring.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/method.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/resource.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/subresource.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/utils.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/docs/waiter.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/dynamodb/__init__.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/dynamodb/table.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/dynamodb/transform.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/dynamodb/types.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/ec2/__init__.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/ec2/createtags.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/ec2/deletetags.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/examples/cloudfront.rst +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/examples/s3.rst +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/__init__.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/action.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/collection.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/resources/response.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3/s3/__init__.py +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3.egg-info/dependency_links.txt +0 -0
- {boto3-1.38.45 → boto3-1.42.22}/boto3.egg-info/top_level.txt +0 -0
- {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.
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
64
|
-
'date': '
|
|
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,
|
|
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.
|
|
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
|
-
|
|
165
|
-
crt_s3_client.crt_client,
|
|
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
|
|
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
|
|
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
|
|
314
|
+
return f"#{self._name_placeholder}{self._name_count}"
|
|
315
315
|
|
|
316
316
|
def _get_value_placeholder(self):
|
|
317
|
-
return
|
|
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
|
|
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:
|
|
@@ -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,
|
|
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,
|
|
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
|
-
|
|
128
|
-
identifiers
|
|
129
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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(
|
|
370
|
-
self._renamed[(category, name)] = name
|
|
371
|
-
name +=
|
|
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(
|
|
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.
|
|
@@ -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
|
|
444
|
-
:py:attr:`boto3.s3.transfer.S3Transfer.
|
|
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
|
|
523
|
-
:py:attr:`boto3.s3.transfer.S3Transfer.
|
|
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
|
|
586
|
-
:py:attr:`boto3.s3.transfer.S3Transfer.
|
|
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
|