Skip to content

Commit 5adff19

Browse files
authored
Bump botocore dependency specification (#1387)
1 parent c7f8f48 commit 5adff19

File tree

13 files changed

+317
-39
lines changed

13 files changed

+317
-39
lines changed

CHANGES.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
Changes
22
-------
33

4+
2.23.2 (2025-07-24)
5+
^^^^^^^^^^^^^^^^^^^
6+
* bump botocore dependency specification
7+
48
2.23.1 (2025-07-16)
59
^^^^^^^^^^^^^^^^^^^
610
* bump botocore dependency specification

aiobotocore/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '2.23.1'
1+
__version__ = '2.23.2'

aiobotocore/client.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ async def create_client(
8181
config_store=self._config_store,
8282
service_signature_version=service_signature_version,
8383
)
84+
if token := self._evaluate_client_specific_token(
85+
service_model.signing_name
86+
):
87+
auth_token = token
8488
client_args = self._get_client_args(
8589
service_model,
8690
region_name,
@@ -355,6 +359,7 @@ async def _make_api_call(self, operation_name, api_params):
355359
'has_streaming_input': operation_model.has_streaming_input,
356360
'auth_type': operation_model.resolved_auth_type,
357361
'unsigned_payload': operation_model.unsigned_payload,
362+
'auth_options': self._service_model.metadata.get('auth'),
358363
}
359364

360365
api_params = await self._emit_api_params(
@@ -412,9 +417,9 @@ async def _make_api_call(self, operation_name, api_params):
412417

413418
if http.status_code >= 300:
414419
error_info = parsed_response.get("Error", {})
415-
error_code = error_info.get("QueryErrorCode") or error_info.get(
416-
"Code"
417-
)
420+
error_code = request_context.get(
421+
'error_code_override'
422+
) or error_info.get("Code")
418423
error_class = self.exceptions.from_code(error_code)
419424
raise error_class(parsed_response, operation_name)
420425
else:

aiobotocore/endpoint.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,9 @@
3030
async def convert_to_response_dict(http_response, operation_model):
3131
"""Convert an HTTP response object to a request dict.
3232
33-
This converts the requests library's HTTP response object to
34-
a dictionary.
33+
This converts the HTTP response object to a dictionary.
3534
36-
:type http_response: botocore.vendored.requests.model.Response
35+
:type http_response: botocore.awsrequest.AWSResponse
3736
:param http_response: The HTTP response from an AWS service request.
3837
3938
:rtype: dict

aiobotocore/session.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ async def _create_client(
234234
exceptions_factory,
235235
config_store,
236236
user_agent_creator=user_agent_creator,
237+
auth_token_resolver=self.get_auth_token,
237238
)
238239
client = await client_creator.create_client(
239240
service_name=service_name,

aiobotocore/signers.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
create_request_object,
1313
prepare_request_dict,
1414
)
15+
from botocore.tokens import FrozenAuthToken
1516
from botocore.utils import ArnParser
1617

1718

@@ -146,9 +147,12 @@ async def get_auth_instance(
146147
)
147148

148149
if cls.REQUIRES_TOKEN is True:
149-
frozen_token = None
150-
if self._auth_token is not None:
150+
if self._auth_token and not isinstance(
151+
self._auth_token, FrozenAuthToken
152+
):
151153
frozen_token = await self._auth_token.get_frozen_token()
154+
else:
155+
frozen_token = self._auth_token
152156
auth = cls(frozen_token)
153157
return auth
154158

aiobotocore/tokens.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from botocore.tokens import (
99
DeferredRefreshableToken,
1010
FrozenAuthToken,
11+
ScopedEnvTokenProvider,
1112
SSOTokenProvider,
1213
TokenProviderChain,
1314
_utc_now,
@@ -18,6 +19,7 @@
1819

1920
def create_token_resolver(session):
2021
providers = [
22+
ScopedEnvTokenProvider(session),
2123
AioSSOTokenProvider(session),
2224
]
2325
return TokenProviderChain(providers=providers)
@@ -150,7 +152,7 @@ async def _refresher(self):
150152
token_dict["accessToken"], expiration=expiration
151153
)
152154

153-
def load_token(self):
155+
def load_token(self, **kwargs):
154156
if self._sso_config is None:
155157
return None
156158

pyproject.toml

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ dynamic = ["version", "readme"]
3131
dependencies = [
3232
"aiohttp >= 3.9.2, < 4.0.0",
3333
"aioitertools >= 0.5.1, < 1.0.0",
34-
"botocore >= 1.38.40, < 1.38.47", # NOTE: When updating, always keep `project.optional-dependencies` aligned
34+
"botocore >= 1.39.7, < 1.39.9", # NOTE: When updating, always keep `project.optional-dependencies` aligned
3535
"python-dateutil >= 2.1, < 3.0.0",
3636
"jmespath >= 0.7.1, < 2.0.0",
3737
"multidict >= 6.0.0, < 7.0.0",
@@ -40,10 +40,10 @@ dependencies = [
4040

4141
[project.optional-dependencies]
4242
awscli = [
43-
"awscli >= 1.40.39, < 1.40.46",
43+
"awscli >= 1.41.7, < 1.41.9",
4444
]
4545
boto3 = [
46-
"boto3 >= 1.38.40, < 1.38.47",
46+
"boto3 >= 1.39.7, < 1.39.9",
4747
]
4848
httpx = [
4949
"httpx >= 0.25.1, < 0.29"
@@ -107,12 +107,6 @@ markers = [
107107
"patch_attributes",
108108
]
109109

110-
[tool.isort]
111-
profile = "black"
112-
line_length = 79
113-
honor_noqa = true
114-
src_paths = ["aiobotocore", "tests"]
115-
116110
[tool.ruff]
117111
exclude = [
118112
".bzr",

tests/botocore_tests/__init__.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,16 @@ class ClientHTTPStubber(BaseHTTPStubber):
163163
@property
164164
def _events(self):
165165
return self._obj_with_event_emitter.meta.events
166+
167+
168+
def patch_load_service_model(
169+
session, monkeypatch, service_model_json, ruleset_json
170+
):
171+
def mock_load_service_model(service_name, type_name, api_version=None):
172+
if type_name == 'service-2':
173+
return service_model_json
174+
if type_name == 'endpoint-rule-set-1':
175+
return ruleset_json
176+
177+
loader = session.get_component('data_loader')
178+
monkeypatch.setattr(loader, 'load_service_model', mock_load_service_model)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import pytest
2+
3+
from tests.botocore_tests import create_session
4+
5+
6+
@pytest.fixture()
7+
def patched_session(monkeypatch):
8+
monkeypatch.setenv('AWS_ACCESS_KEY_ID', 'access_key')
9+
monkeypatch.setenv('AWS_SECRET_ACCESS_KEY', 'secret_key')
10+
monkeypatch.setenv('AWS_CONFIG_FILE', 'no-exist-foo')
11+
monkeypatch.delenv('AWS_PROFILE', raising=False)
12+
monkeypatch.delenv('AWS_DEFAULT_REGION', raising=False)
13+
session = create_session()
14+
return session

0 commit comments

Comments
 (0)