From c3fbf0a67c04d7e629ad31e282f488e2faad4e10 Mon Sep 17 00:00:00 2001 From: Ryan DiRisio Date: Thu, 15 Aug 2024 15:52:31 -0400 Subject: [PATCH 01/13] change python version to be 3.11 and above --- pyproject.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3b3d6a1..e900886 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "aws-sdk-signers" -requires-python = ">=3.12" +requires-python = ">=3.11" authors = [ {name = "Amazon Web Services"}, ] @@ -14,7 +14,7 @@ license = {file = "LICENSE"} keywords = ["AWS", "Signing", "SigV4", "HTTP"] classifiers = [ "Development Status :: 2 - Pre-Alpha", - "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.11", "Programming Language :: Python" ] dynamic = ["version"] @@ -59,7 +59,7 @@ docstring-code-format = false docstring-code-line-length = "dynamic" [tool.mypy] -python_version = "3.12" +python_version = "3.11" strict = true [tool.pytest.ini_options] From 8e069bc7c642aa747193b0432c78da7efc7d891f Mon Sep 17 00:00:00 2001 From: Ryan DiRisio Date: Fri, 16 Aug 2024 11:51:15 -0400 Subject: [PATCH 02/13] Make code compatible with 3.10 one test fails due to ordereddict's new __repr__ in 3.12 --- .github/workflows/ci.yml | 2 +- pyproject.toml | 9 +++++---- src/aws_sdk_signers/_identity.py | 4 ++-- src/aws_sdk_signers/_io.py | 11 +++++++---- src/aws_sdk_signers/_version.py | 2 +- src/aws_sdk_signers/signers.py | 12 +++++++++--- tests/unit/auth/test_sigv4.py | 4 ++-- tests/unit/test_identity.py | 10 +++++----- tests/unit/test_signers.py | 6 +++--- 9 files changed, 35 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 13f206d..badfeac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.12'] + python-version: ['3.10', '3.11', '3.12'] os: [ubuntu-latest, macOS-latest, windows-latest] steps: diff --git a/pyproject.toml b/pyproject.toml index e900886..ea779de 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "aws-sdk-signers" -requires-python = ">=3.11" +requires-python = ">=3.10" authors = [ {name = "Amazon Web Services"}, ] @@ -18,6 +18,9 @@ classifiers = [ "Programming Language :: Python" ] dynamic = ["version"] +dependencies = [ + 'typing-extensions >=4.12.2,<5 ; python_version == "3.10"', +] [project.optional-dependencies] test = [ @@ -38,8 +41,6 @@ path = "src/aws_sdk_signers/_version.py" line-length = 88 indent-width = 4 -target-version = "py312" - [tool.ruff.lint] select = ["E4", "E7", "E9", "F", "I", "UP"] ignore = [] @@ -59,7 +60,7 @@ docstring-code-format = false docstring-code-line-length = "dynamic" [tool.mypy] -python_version = "3.11" +python_version = "3.12" strict = true [tool.pytest.ini_options] diff --git a/src/aws_sdk_signers/_identity.py b/src/aws_sdk_signers/_identity.py index 8b66ed9..92aaa88 100644 --- a/src/aws_sdk_signers/_identity.py +++ b/src/aws_sdk_signers/_identity.py @@ -4,7 +4,7 @@ """ from dataclasses import dataclass -from datetime import UTC, datetime +from datetime import datetime, timezone from .interfaces.identity import Identity @@ -21,4 +21,4 @@ def is_expired(self) -> bool: """Whether the identity is expired.""" if self.expiration is None: return False - return self.expiration < datetime.now(UTC) + return self.expiration < datetime.now(timezone.utc) diff --git a/src/aws_sdk_signers/_io.py b/src/aws_sdk_signers/_io.py index 477ab3b..a95503c 100644 --- a/src/aws_sdk_signers/_io.py +++ b/src/aws_sdk_signers/_io.py @@ -3,13 +3,16 @@ SPDX-License-Identifier: Apache-2.0 """ +import sys from asyncio import iscoroutinefunction from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Callable from io import BytesIO -from typing import ( - Self, - cast, -) +from typing import cast + +if sys.version_info < (3, 11): + from typing_extensions import Self +else: + from typing import Self from aws_sdk_signers.interfaces.io import AsyncByteStream, ByteStream diff --git a/src/aws_sdk_signers/_version.py b/src/aws_sdk_signers/_version.py index 95d3078..7ef099a 100644 --- a/src/aws_sdk_signers/_version.py +++ b/src/aws_sdk_signers/_version.py @@ -6,4 +6,4 @@ # This file is protected via CODEOWNERS from __future__ import annotations -__version__ = "0.0.2" +__version__ = "0.0.2post002" diff --git a/src/aws_sdk_signers/signers.py b/src/aws_sdk_signers/signers.py index 0b53e0c..28b94cc 100644 --- a/src/aws_sdk_signers/signers.py +++ b/src/aws_sdk_signers/signers.py @@ -6,13 +6,19 @@ import datetime import hmac import io +import sys import warnings from collections.abc import AsyncIterable from copy import deepcopy from hashlib import sha256 -from typing import Required, TypedDict +from typing import TypedDict from urllib.parse import parse_qsl, quote +if sys.version_info < (3, 11): + from typing_extensions import Required +else: + from typing import Required + from ._http import URI, AWSRequest, Field from ._identity import AWSCredentialIdentity from ._io import AsyncBytesReader @@ -185,7 +191,7 @@ def _generate_new_request(self, *, request: AWSRequest) -> AWSRequest: def _resolve_signing_date(self, *, date: str | None) -> str: if date is None: - date_obj = datetime.datetime.now(datetime.UTC) + date_obj = datetime.datetime.now(datetime.timezone.utc) date = date_obj.strftime(SIGV4_TIMESTAMP_FORMAT) return date @@ -548,7 +554,7 @@ async def _generate_new_request(self, *, request: AWSRequest) -> AWSRequest: async def _resolve_signing_date(self, *, date: str | None) -> str: if date is None: - date_obj = datetime.datetime.now(datetime.UTC) + date_obj = datetime.datetime.now(datetime.timezone.utc) date = date_obj.strftime(SIGV4_TIMESTAMP_FORMAT) return date diff --git a/tests/unit/auth/test_sigv4.py b/tests/unit/auth/test_sigv4.py index 4d0850a..4778ac5 100644 --- a/tests/unit/auth/test_sigv4.py +++ b/tests/unit/auth/test_sigv4.py @@ -2,7 +2,7 @@ import pathlib import re from collections.abc import Iterable -from datetime import UTC, datetime +from datetime import datetime, timezone from http.server import BaseHTTPRequestHandler from io import BytesIO @@ -30,7 +30,7 @@ REGION: str = "us-east-1" DATE: datetime = datetime( - year=2015, month=8, day=30, hour=12, minute=36, second=0, tzinfo=UTC + year=2015, month=8, day=30, hour=12, minute=36, second=0, tzinfo=timezone.utc ) DATE_STR: str = DATE.strftime(SIGV4_TIMESTAMP_FORMAT) diff --git a/tests/unit/test_identity.py b/tests/unit/test_identity.py index f09c99d..3e2920c 100644 --- a/tests/unit/test_identity.py +++ b/tests/unit/test_identity.py @@ -1,4 +1,4 @@ -from datetime import UTC, datetime, timedelta +from datetime import datetime, timedelta, timezone import pytest from aws_sdk_signers import AWSCredentialIdentity @@ -23,13 +23,13 @@ "AKID1234EXAMPLE", "SECRET1234", None, - datetime(2024, 5, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc), ), ( "AKID1234EXAMPLE", "SECRET1234", "SESS_TOKEN_1234", - datetime(2024, 5, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc), ), ], ) @@ -65,14 +65,14 @@ def test_aws_credential_identity( "AKID1234EXAMPLE", "SECRET1234", None, - datetime(2024, 5, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc), True, ), ( "AKID1234EXAMPLE", "SECRET1234", "SESS_TOKEN_1234", - datetime.now(UTC) + timedelta(hours=1), + datetime.now(timezone.utc) + timedelta(hours=1), False, ), ], diff --git a/tests/unit/test_signers.py b/tests/unit/test_signers.py index 4592413..31cda65 100644 --- a/tests/unit/test_signers.py +++ b/tests/unit/test_signers.py @@ -5,7 +5,7 @@ import re import typing -from datetime import UTC, datetime +from datetime import datetime, timezone from io import BytesIO import pytest @@ -99,7 +99,7 @@ def test_sign_with_expired_identity( access_key_id="AKID123456", secret_access_key="EXAMPLE1234SECRET", session_token="X123456SESSION", - expiration=datetime(1970, 1, 1, tzinfo=UTC), + expiration=datetime(1970, 1, 1, tzinfo=timezone.utc), ) with pytest.raises(ValueError): self.SIGV4_SYNC_SIGNER.sign( @@ -150,7 +150,7 @@ async def test_sign_with_expired_identity( access_key_id="AKID123456", secret_access_key="EXAMPLE1234SECRET", session_token="X123456SESSION", - expiration=datetime(1970, 1, 1, tzinfo=UTC), + expiration=datetime(1970, 1, 1, tzinfo=timezone.utc), ) with pytest.raises(ValueError): await self.SIGV4_ASYNC_SIGNER.sign( From 99136d5b79e33770b88e8b4ebc4f4e2dfb136c3e Mon Sep 17 00:00:00 2001 From: Ryan DiRisio Date: Fri, 16 Aug 2024 11:51:23 -0400 Subject: [PATCH 03/13] make tests verbose --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index badfeac..78403e5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,4 +27,4 @@ jobs: python -m pip install -e .[test] - name: Run tests run: | - python -m pytest tests + python -m pytest -v tests From 071b03cd1a400e8f365ffb80705def25f2081ada Mon Sep 17 00:00:00 2001 From: Ryan DiRisio Date: Fri, 16 Aug 2024 12:05:41 -0400 Subject: [PATCH 04/13] change `Fields.__repr__` to cast OrderedDict() to dict(). A bit cleaner looking, and also supports 3.10/3.11 --- src/aws_sdk_signers/_http.py | 2 +- tests/unit/test_fields.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/aws_sdk_signers/_http.py b/src/aws_sdk_signers/_http.py index 8eef6d9..a567bc5 100644 --- a/src/aws_sdk_signers/_http.py +++ b/src/aws_sdk_signers/_http.py @@ -210,7 +210,7 @@ def __len__(self) -> int: return len(self.entries) def __repr__(self) -> str: - return f"Fields({self.entries})" + return f"Fields({dict(self.entries)})" def __contains__(self, key: str) -> bool: return self._normalize_field_name(key) in self.entries diff --git a/tests/unit/test_fields.py b/tests/unit/test_fields.py index 23319f8..fadb4ff 100644 --- a/tests/unit/test_fields.py +++ b/tests/unit/test_fields.py @@ -210,8 +210,8 @@ def test_fields_length_value(fields: Fields, expected_length: int) -> None: ( Fields([Field(name="fname1")]), ( - "Fields(OrderedDict({'fname1': Field(name='fname1', value=[], " - "kind=)}))" + "Fields({'fname1': Field(name='fname1', value=[], " + "kind=)})" ), ), ], From 4c859e8b8f447be0917a8ad3084651c6e19dfe4c Mon Sep 17 00:00:00 2001 From: Ryan DiRisio Date: Fri, 16 Aug 2024 12:09:48 -0400 Subject: [PATCH 05/13] do matrix for lint as well --- .github/workflows/lint.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index a1984a5..b588b50 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,12 +10,15 @@ permissions: jobs: lint: runs-on: ubuntu-20.04 + strategy: + matrix: + python-version: ['3.10', '3.11', '3.12'] steps: - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - name: Set up Python 3.12 + - name: 'Set up Python ${{ matrix.python-version }}' uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d with: - python-version: 3.12 + python-version: '${{ matrix.python-version }}' - name: Run pre-commit uses: pre-commit/action@646c83fcd040023954eafda54b4db0192ce70507 From f6af93e8bd81771cb9ff732df4f4cded957156ad Mon Sep 17 00:00:00 2001 From: Ryan DiRisio Date: Fri, 16 Aug 2024 12:12:29 -0400 Subject: [PATCH 06/13] match indent --- .github/workflows/lint.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b588b50..c925139 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,14 +11,15 @@ jobs: lint: runs-on: ubuntu-20.04 strategy: + fail-fast: false matrix: python-version: ['3.10', '3.11', '3.12'] steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - name: 'Set up Python ${{ matrix.python-version }}' - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d - with: - python-version: '${{ matrix.python-version }}' - - name: Run pre-commit - uses: pre-commit/action@646c83fcd040023954eafda54b4db0192ce70507 + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 + - name: 'Set up Python ${{ matrix.python-version }}' + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d + with: + python-version: '${{ matrix.python-version }}' + - name: Run pre-commit + uses: pre-commit/action@646c83fcd040023954eafda54b4db0192ce70507 From 46eef3757dab69882d2fddc519801b45adb8e35b Mon Sep 17 00:00:00 2001 From: Ryan DiRisio Date: Fri, 16 Aug 2024 12:16:24 -0400 Subject: [PATCH 07/13] revert version --- src/aws_sdk_signers/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aws_sdk_signers/_version.py b/src/aws_sdk_signers/_version.py index 7ef099a..95d3078 100644 --- a/src/aws_sdk_signers/_version.py +++ b/src/aws_sdk_signers/_version.py @@ -6,4 +6,4 @@ # This file is protected via CODEOWNERS from __future__ import annotations -__version__ = "0.0.2post002" +__version__ = "0.0.2" From de294ebfdfb2107e7ab834d5ce370f7d13fadc37 Mon Sep 17 00:00:00 2001 From: Ryan DiRisio Date: Fri, 16 Aug 2024 12:18:41 -0400 Subject: [PATCH 08/13] Add version tags in project classifiers --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index ea779de..42c42e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,9 @@ license = {file = "LICENSE"} keywords = ["AWS", "Signing", "SigV4", "HTTP"] classifiers = [ "Development Status :: 2 - Pre-Alpha", + "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Programming Language :: Python" ] dynamic = ["version"] From ba0263cd2f3c3c533b9f0940094246d0a8a1da8d Mon Sep 17 00:00:00 2001 From: Ryan DiRisio Date: Fri, 16 Aug 2024 14:31:08 -0400 Subject: [PATCH 09/13] do UTC import based on python version simplifies number of code changes --- src/aws_sdk_signers/_identity.py | 10 +++++++++- src/aws_sdk_signers/signers.py | 10 ++++++++-- tests/unit/auth/test_sigv4.py | 10 +++++++++- tests/unit/test_fields.py | 1 + tests/unit/test_identity.py | 19 ++++++++++++++----- tests/unit/test_signers.py | 12 ++++++++++-- 6 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/aws_sdk_signers/_identity.py b/src/aws_sdk_signers/_identity.py index 92aaa88..7355060 100644 --- a/src/aws_sdk_signers/_identity.py +++ b/src/aws_sdk_signers/_identity.py @@ -3,11 +3,19 @@ SPDX-License-Identifier: Apache-2.0 """ +import sys from dataclasses import dataclass from datetime import datetime, timezone from .interfaces.identity import Identity +if sys.version_info < (3, 12): + from datetime import timezone + + UTC = timezone.utc +else: + from datetime import UTC + @dataclass(kw_only=True) class AWSCredentialIdentity(Identity): @@ -21,4 +29,4 @@ def is_expired(self) -> bool: """Whether the identity is expired.""" if self.expiration is None: return False - return self.expiration < datetime.now(timezone.utc) + return self.expiration < datetime.now(UTC) diff --git a/src/aws_sdk_signers/signers.py b/src/aws_sdk_signers/signers.py index 28b94cc..dc3464e 100644 --- a/src/aws_sdk_signers/signers.py +++ b/src/aws_sdk_signers/signers.py @@ -24,6 +24,12 @@ from ._io import AsyncBytesReader from .exceptions import AWSSDKWarning, MissingExpectedParameterException +if sys.version_info < (3, 12): + from datetime import timezone + UTC = timezone.utc +else: + from datetime import UTC + HEADERS_EXCLUDED_FROM_SIGNING: tuple[str, ...] = ( "accept", "accept-encoding", @@ -191,7 +197,7 @@ def _generate_new_request(self, *, request: AWSRequest) -> AWSRequest: def _resolve_signing_date(self, *, date: str | None) -> str: if date is None: - date_obj = datetime.datetime.now(datetime.timezone.utc) + date_obj = datetime.datetime.now(UTC) date = date_obj.strftime(SIGV4_TIMESTAMP_FORMAT) return date @@ -554,7 +560,7 @@ async def _generate_new_request(self, *, request: AWSRequest) -> AWSRequest: async def _resolve_signing_date(self, *, date: str | None) -> str: if date is None: - date_obj = datetime.datetime.now(datetime.timezone.utc) + date_obj = datetime.datetime.now(UTC) date = date_obj.strftime(SIGV4_TIMESTAMP_FORMAT) return date diff --git a/tests/unit/auth/test_sigv4.py b/tests/unit/auth/test_sigv4.py index 4778ac5..99b3f68 100644 --- a/tests/unit/auth/test_sigv4.py +++ b/tests/unit/auth/test_sigv4.py @@ -1,6 +1,7 @@ import os import pathlib import re +import sys from collections.abc import Iterable from datetime import datetime, timezone from http.server import BaseHTTPRequestHandler @@ -24,13 +25,20 @@ ) from freezegun import freeze_time +if sys.version_info < (3, 12): + from datetime import timezone + + UTC = timezone.utc +else: + from datetime import UTC + SECRET_KEY: str = "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" ACCESS_KEY: str = "AKIDEXAMPLE" SERVICE: str = "service" REGION: str = "us-east-1" DATE: datetime = datetime( - year=2015, month=8, day=30, hour=12, minute=36, second=0, tzinfo=timezone.utc + year=2015, month=8, day=30, hour=12, minute=36, second=0, tzinfo=UTC ) DATE_STR: str = DATE.strftime(SIGV4_TIMESTAMP_FORMAT) diff --git a/tests/unit/test_fields.py b/tests/unit/test_fields.py index fadb4ff..487ebf4 100644 --- a/tests/unit/test_fields.py +++ b/tests/unit/test_fields.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 import pytest + from aws_sdk_signers import Field, Fields from aws_sdk_signers.interfaces.http import FieldPosition diff --git a/tests/unit/test_identity.py b/tests/unit/test_identity.py index 3e2920c..cb2f5e4 100644 --- a/tests/unit/test_identity.py +++ b/tests/unit/test_identity.py @@ -1,8 +1,17 @@ -from datetime import datetime, timedelta, timezone +import sys +from datetime import datetime, timedelta import pytest + from aws_sdk_signers import AWSCredentialIdentity +if sys.version_info < (3, 12): + from datetime import timezone + + UTC = timezone.utc +else: + from datetime import UTC + @pytest.mark.parametrize( "access_key_id,secret_access_key,session_token,expiration", @@ -23,13 +32,13 @@ "AKID1234EXAMPLE", "SECRET1234", None, - datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc), + datetime(2024, 5, 1, 0, 0, 0, tzinfo=UTC), ), ( "AKID1234EXAMPLE", "SECRET1234", "SESS_TOKEN_1234", - datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc), + datetime(2024, 5, 1, 0, 0, 0, tzinfo=UTC), ), ], ) @@ -65,14 +74,14 @@ def test_aws_credential_identity( "AKID1234EXAMPLE", "SECRET1234", None, - datetime(2024, 5, 1, 0, 0, 0, tzinfo=timezone.utc), + datetime(2024, 5, 1, 0, 0, 0, tzinfo=UTC), True, ), ( "AKID1234EXAMPLE", "SECRET1234", "SESS_TOKEN_1234", - datetime.now(timezone.utc) + timedelta(hours=1), + datetime.now(UTC) + timedelta(hours=1), False, ), ], diff --git a/tests/unit/test_signers.py b/tests/unit/test_signers.py index 31cda65..e6c19fb 100644 --- a/tests/unit/test_signers.py +++ b/tests/unit/test_signers.py @@ -4,6 +4,7 @@ """ import re +import sys import typing from datetime import datetime, timezone from io import BytesIO @@ -19,6 +20,13 @@ SigV4SigningProperties, ) +if sys.version_info < (3, 12): + from datetime import timezone + + UTC = timezone.utc +else: + from datetime import UTC + SIGV4_RE = re.compile( r"AWS4-HMAC-SHA256 " r"Credential=(?P\w+)/\d+/" @@ -99,7 +107,7 @@ def test_sign_with_expired_identity( access_key_id="AKID123456", secret_access_key="EXAMPLE1234SECRET", session_token="X123456SESSION", - expiration=datetime(1970, 1, 1, tzinfo=timezone.utc), + expiration=datetime(1970, 1, 1, tzinfo=UTC), ) with pytest.raises(ValueError): self.SIGV4_SYNC_SIGNER.sign( @@ -150,7 +158,7 @@ async def test_sign_with_expired_identity( access_key_id="AKID123456", secret_access_key="EXAMPLE1234SECRET", session_token="X123456SESSION", - expiration=datetime(1970, 1, 1, tzinfo=timezone.utc), + expiration=datetime(1970, 1, 1, tzinfo=UTC), ) with pytest.raises(ValueError): await self.SIGV4_ASYNC_SIGNER.sign( From 7a3ab7e2977a5f6d927fbda0cd9ff3740e37f88f Mon Sep 17 00:00:00 2001 From: Ryan DiRisio Date: Fri, 16 Aug 2024 14:31:32 -0400 Subject: [PATCH 10/13] formatting --- src/aws_sdk_signers/signers.py | 1 + tests/unit/test_fields.py | 1 - tests/unit/test_identity.py | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/aws_sdk_signers/signers.py b/src/aws_sdk_signers/signers.py index dc3464e..f050e67 100644 --- a/src/aws_sdk_signers/signers.py +++ b/src/aws_sdk_signers/signers.py @@ -26,6 +26,7 @@ if sys.version_info < (3, 12): from datetime import timezone + UTC = timezone.utc else: from datetime import UTC diff --git a/tests/unit/test_fields.py b/tests/unit/test_fields.py index 487ebf4..fadb4ff 100644 --- a/tests/unit/test_fields.py +++ b/tests/unit/test_fields.py @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 import pytest - from aws_sdk_signers import Field, Fields from aws_sdk_signers.interfaces.http import FieldPosition diff --git a/tests/unit/test_identity.py b/tests/unit/test_identity.py index cb2f5e4..297024d 100644 --- a/tests/unit/test_identity.py +++ b/tests/unit/test_identity.py @@ -2,7 +2,6 @@ from datetime import datetime, timedelta import pytest - from aws_sdk_signers import AWSCredentialIdentity if sys.version_info < (3, 12): From d20350594e90215eb303963ea74c75aa65e7605c Mon Sep 17 00:00:00 2001 From: Ryan DiRisio Date: Fri, 16 Aug 2024 14:32:47 -0400 Subject: [PATCH 11/13] remove unnecessary import --- tests/unit/auth/test_sigv4.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/auth/test_sigv4.py b/tests/unit/auth/test_sigv4.py index 99b3f68..b946c0e 100644 --- a/tests/unit/auth/test_sigv4.py +++ b/tests/unit/auth/test_sigv4.py @@ -3,7 +3,7 @@ import re import sys from collections.abc import Iterable -from datetime import datetime, timezone +from datetime import datetime from http.server import BaseHTTPRequestHandler from io import BytesIO From fd365c31d54aa01c1f02d9d2dbabbd8e236bde40 Mon Sep 17 00:00:00 2001 From: Ryan DiRisio Date: Fri, 16 Aug 2024 14:59:31 -0400 Subject: [PATCH 12/13] revert test back to what it was, conditionally do repr --- src/aws_sdk_signers/_http.py | 8 +++++++- tests/unit/test_fields.py | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/aws_sdk_signers/_http.py b/src/aws_sdk_signers/_http.py index a567bc5..b9606b4 100644 --- a/src/aws_sdk_signers/_http.py +++ b/src/aws_sdk_signers/_http.py @@ -12,6 +12,7 @@ from __future__ import annotations +import sys from collections import Counter, OrderedDict from collections.abc import AsyncIterable, Iterable, Iterator from copy import deepcopy @@ -210,7 +211,12 @@ def __len__(self) -> int: return len(self.entries) def __repr__(self) -> str: - return f"Fields({dict(self.entries)})" + if sys.version_info < (3, 12): + # Dicts are ordered in 3.11 and 3.10, so it's safe to use dict. + # Used to mock a 3.12-like output. + return f"Fields(OrderedDict({dict(self.entries)}))" + else: + return f"Fields({self.entries})" def __contains__(self, key: str) -> bool: return self._normalize_field_name(key) in self.entries diff --git a/tests/unit/test_fields.py b/tests/unit/test_fields.py index fadb4ff..23319f8 100644 --- a/tests/unit/test_fields.py +++ b/tests/unit/test_fields.py @@ -210,8 +210,8 @@ def test_fields_length_value(fields: Fields, expected_length: int) -> None: ( Fields([Field(name="fname1")]), ( - "Fields({'fname1': Field(name='fname1', value=[], " - "kind=)})" + "Fields(OrderedDict({'fname1': Field(name='fname1', value=[], " + "kind=)}))" ), ), ], From fff6297577159caf6934a26c5efa3e5beb91231c Mon Sep 17 00:00:00 2001 From: Ryan DiRisio Date: Fri, 16 Aug 2024 15:00:20 -0400 Subject: [PATCH 13/13] remove unnecessary timezone import --- tests/unit/test_signers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_signers.py b/tests/unit/test_signers.py index e6c19fb..3616053 100644 --- a/tests/unit/test_signers.py +++ b/tests/unit/test_signers.py @@ -6,7 +6,7 @@ import re import sys import typing -from datetime import datetime, timezone +from datetime import datetime from io import BytesIO import pytest