diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index fb6378764..bbdecca59 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -12,6 +12,14 @@ body: description: What is the problem? A clear and concise description of the bug. validations: required: true + - type: checkboxes + id: regression + attributes: + label: Regression Issue + description: What is a regression? If it worked in a previous version but doesn't in the latest version, it's considered a regression. In this case, please provide specific version number in the report. + options: + - label: Select this option if this issue appears to be a regression. + required: false - type: textarea id: expected attributes: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b79ca38fd..ea94c5bfd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ env: PACKAGE_NAME: aws-crt-python LINUX_BASE_IMAGE: ubuntu-18-x64 RUN: ${{ github.run_id }}-${{ github.run_number }} - CRT_CI_ROLE: ${{ secrets.CRT_CI_ROLE_ARN }} + CRT_CI_ROLE: ${{ secrets.CRT_CI_ROLE_ARN }} AWS_DEFAULT_REGION: us-east-1 jobs: @@ -231,7 +231,7 @@ jobs: - name: Build ${{ env.PACKAGE_NAME }} + consumers run: | python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')" - python builder.pyz build -p ${{ env.PACKAGE_NAME }} --python "C:\\hostedtoolcache\\windows\\Python\\3.7.9\\${{ matrix.arch }}\\python.exe" + python builder.pyz build -p ${{ env.PACKAGE_NAME }} --python "C:\\hostedtoolcache\\windows\\Python\\3.8.10\\${{ matrix.arch }}\\python.exe" macos: @@ -293,7 +293,7 @@ jobs: version: ${{ matrix.version }} cpu_count: 4 shell: bash - environment_variables: AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN AWS_DEFAULT_REGION + environment_variables: AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN AWS_DEFAULT_REGION run: | sudo pkg_add awscli py3-pip py3-urllib3 python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz', 'builder')" @@ -321,7 +321,7 @@ jobs: version: '14.0' cpu_count: 4 shell: bash - environment_variables: AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN AWS_DEFAULT_REGION + environment_variables: AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN AWS_DEFAULT_REGION run: | sudo pkg install -y python3 devel/py-pip net/py-urllib3 devel/py-awscli cmake python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz', 'builder')" @@ -335,7 +335,7 @@ jobs: - uses: actions/checkout@v4 with: submodules: true - - name: Run tests + - name: Run tests run: | python3 -m pip install --upgrade --requirement requirements-dev.txt python3 -m pip install . --verbose diff --git a/.github/workflows/issue-regression-labeler.yml b/.github/workflows/issue-regression-labeler.yml new file mode 100644 index 000000000..bd000719d --- /dev/null +++ b/.github/workflows/issue-regression-labeler.yml @@ -0,0 +1,32 @@ +# Apply potential regression label on issues +name: issue-regression-label +on: + issues: + types: [opened, edited] +jobs: + add-regression-label: + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - name: Fetch template body + id: check_regression + uses: actions/github-script@v7 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TEMPLATE_BODY: ${{ github.event.issue.body }} + with: + script: | + const regressionPattern = /\[x\] Select this option if this issue appears to be a regression\./i; + const template = `${process.env.TEMPLATE_BODY}` + const match = regressionPattern.test(template); + core.setOutput('is_regression', match); + - name: Manage regression label + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + if [ "${{ steps.check_regression.outputs.is_regression }}" == "true" ]; then + gh issue edit ${{ github.event.issue.number }} --add-label "potential-regression" -R ${{ github.repository }} + else + gh issue edit ${{ github.event.issue.number }} --remove-label "potential-regression" -R ${{ github.repository }} + fi diff --git a/README.md b/README.md index 0b5e7cfc0..bd2359c7a 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ This library is licensed under the Apache 2.0 License. ## Minimum Requirements: -* Python 3.7+ +* Python 3.8+ ## Installation diff --git a/awscrt/eventstream/__init__.py b/awscrt/eventstream/__init__.py index 09e24ada4..945027527 100644 --- a/awscrt/eventstream/__init__.py +++ b/awscrt/eventstream/__init__.py @@ -5,9 +5,8 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0. -from collections.abc import ByteString from enum import IntEnum -from typing import Any +from typing import Any, Union from uuid import UUID __all__ = ['HeaderType', 'Header'] @@ -135,7 +134,7 @@ def from_int64(cls, name: str, value: int) -> 'Header': return cls(name, value, HeaderType.INT64) @classmethod - def from_byte_buf(cls, name: str, value: ByteString) -> 'Header': + def from_byte_buf(cls, name: str, value: Union[bytes, bytearray]) -> 'Header': """Create a Header of type :attr:`~HeaderType.BYTE_BUF` The value must be a bytes-like object""" @@ -246,7 +245,7 @@ def value_as_int64(self) -> int: Raises an exception if type is not :attr:`~HeaderType.INT64`""" return self._value_as(HeaderType.INT64) - def value_as_byte_buf(self) -> ByteString: + def value_as_byte_buf(self) -> Union[bytes, bytearray]: """Return value of bytes Raises an exception if type is not :attr:`~HeaderType.BYTE_BUF`""" diff --git a/awscrt/eventstream/rpc.py b/awscrt/eventstream/rpc.py index b70352e02..ff0096e26 100644 --- a/awscrt/eventstream/rpc.py +++ b/awscrt/eventstream/rpc.py @@ -11,11 +11,11 @@ import awscrt.exceptions from awscrt.eventstream import Header from awscrt.io import ClientBootstrap, SocketOptions, TlsConnectionOptions -from collections.abc import ByteString, Callable +from collections.abc import Callable from concurrent.futures import Future from enum import IntEnum from functools import partial -from typing import Optional, Sequence +from typing import Optional, Sequence, Union __all__ = [ 'MessageType', @@ -381,7 +381,7 @@ def send_protocol_message( self, *, headers: Optional[Sequence[Header]] = None, - payload: Optional[ByteString] = None, + payload: Optional[Union[bytes, bytearray]] = None, message_type: MessageType, flags: Optional[int] = None, on_flush: Callable = None) -> 'concurrent.futures.Future': @@ -483,7 +483,7 @@ def activate( *, operation: str, headers: Sequence[Header] = None, - payload: ByteString = None, + payload: Union[bytes, bytearray] = None, message_type: MessageType, flags: int = None, on_flush: Callable = None): @@ -553,7 +553,7 @@ def send_message( self, *, headers: Sequence[Header] = None, - payload: ByteString = None, + payload: Union[bytes, bytearray] = None, message_type: MessageType, flags: int = None, on_flush: Callable = None) -> 'concurrent.futures.Future': diff --git a/codebuild/cd/manylinux-x64-build.yml b/codebuild/cd/manylinux-x64-build.yml index 146f3a726..a3dd03af3 100644 --- a/codebuild/cd/manylinux-x64-build.yml +++ b/codebuild/cd/manylinux-x64-build.yml @@ -8,7 +8,7 @@ phases: commands: - export CC=gcc - cd aws-crt-python - - /opt/python/cp37-cp37m/bin/python ./continuous-delivery/update-version.py + - /opt/python/cp38-cp38/bin/python ./continuous-delivery/update-version.py build: commands: - echo Build started on `date` diff --git a/codebuild/cd/manylinux-x86-build.yml b/codebuild/cd/manylinux-x86-build.yml index d1bd6e059..4046bce48 100644 --- a/codebuild/cd/manylinux-x86-build.yml +++ b/codebuild/cd/manylinux-x86-build.yml @@ -8,7 +8,7 @@ phases: commands: - export CC=gcc - cd aws-crt-python - - /opt/python/cp37-cp37m/bin/python ./continuous-delivery/update-version.py + - /opt/python/cp38-cp38/bin/python ./continuous-delivery/update-version.py build: commands: - echo Build started on `date` diff --git a/continuous-delivery/sanity-check-test-pypi.bat b/continuous-delivery/sanity-check-test-pypi.bat index 949911612..8cc2d0166 100644 --- a/continuous-delivery/sanity-check-test-pypi.bat +++ b/continuous-delivery/sanity-check-test-pypi.bat @@ -1,8 +1,8 @@ FOR /F "delims=" %%A in ('git describe --tags') do ( set TAG_VERSION=%%A ) set CURRENT_VERSION=%TAG_VERSION:v=% -"C:\Program Files\Python37\python.exe" continuous-delivery\pip-install-with-retry.py --no-cache-dir -i https://testpypi.python.org/simple --user awscrt==%CURRENT_VERSION% || goto error -"C:\Program Files\Python37\python.exe" continuous-delivery\test-pip-install.py || goto error +"C:\Program Files\Python38\python.exe" continuous-delivery\pip-install-with-retry.py --no-cache-dir -i https://testpypi.python.org/simple --user awscrt==%CURRENT_VERSION% || goto error +"C:\Program Files\Python38\python.exe" continuous-delivery\test-pip-install.py || goto error goto :EOF diff --git a/crt/CMakeLists.txt b/crt/CMakeLists.txt index 99296e6e7..afda9e150 100644 --- a/crt/CMakeLists.txt +++ b/crt/CMakeLists.txt @@ -1,6 +1,6 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0. -cmake_minimum_required(VERSION 3.1) +cmake_minimum_required(VERSION 3.9) # This CMakeLists.txt exists so we can build all the C libraries we depend on # simultaneously. This is much faster than building dependencies one at a time. @@ -30,21 +30,38 @@ include(CTest) # (On Windows and Apple we use the default OS libraries) if(UNIX AND NOT APPLE) option(USE_OPENSSL "Set this if you want to use your system's OpenSSL compatible libcrypto" OFF) + include(AwsPrebuildDependency) if(NOT USE_OPENSSL) - set(DISABLE_GO ON CACHE BOOL "Build without using Go, we don't want the extra dependency") - set(BUILD_LIBSSL OFF CACHE BOOL "Don't need libssl, only need libcrypto") - set(DISABLE_PERL ON CACHE BOOL "Build without using Perl, we don't want the extra dependency") + set(AWSLC_CMAKE_ARGUMENTS + -DDISABLE_GO=ON # Build without using Go, we don't want the extra dependency + -DDISABLE_PERL=ON # Build without using Perl, we don't want the extra dependency + -DBUILD_LIBSSL=OFF # Don't need libssl, only need libcrypto + -DBUILD_TESTING=OFF + ) + if(CMAKE_C_COMPILER_ID MATCHES "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS "5.0") - set(MY_ASSEMBLER_IS_TOO_OLD_FOR_512AVX ON CACHE BOOL "Disable AVX512 on old GCC that not supports it") + # Disable AVX512 on old GCC that not supports it. + list(APPEND AWSLC_CMAKE_ARGUMENTS -DMY_ASSEMBLER_IS_TOO_OLD_FOR_512AVX=ON) endif() - add_subdirectory(aws-lc) + # s2n-tls uses libcrypto during its configuration, so we need to prebuild aws-lc. + aws_prebuild_dependency( + DEPENDENCY_NAME AWSLC + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/aws-lc + CMAKE_ARGUMENTS ${AWSLC_CMAKE_ARGUMENTS} + ) endif() - set(UNSAFE_TREAT_WARNINGS_AS_ERRORS OFF CACHE BOOL "") - add_subdirectory(s2n) + # prebuild s2n-tls. + aws_prebuild_dependency( + DEPENDENCY_NAME S2N + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/s2n + CMAKE_ARGUMENTS + -DUNSAFE_TREAT_WARNINGS_AS_ERRORS=OFF + -DBUILD_TESTING=OFF + ) endif() add_subdirectory(aws-c-common) diff --git a/crt/aws-c-auth b/crt/aws-c-auth index 48d647bf4..3982bd75f 160000 --- a/crt/aws-c-auth +++ b/crt/aws-c-auth @@ -1 +1 @@ -Subproject commit 48d647bf43f8872e4dc5ec6343b0c5974195fbdd +Subproject commit 3982bd75fea74efd8f9b462b27fedd4599db4f53 diff --git a/crt/aws-c-cal b/crt/aws-c-cal index 2cb1d2eac..656762aef 160000 --- a/crt/aws-c-cal +++ b/crt/aws-c-cal @@ -1 +1 @@ -Subproject commit 2cb1d2eac925e2dbc45025eb89af82bd790c23a0 +Subproject commit 656762aefbee2bc8f509cb23cd107abff20a72bb diff --git a/crt/aws-c-common b/crt/aws-c-common index b9959f592..f41b772f0 160000 --- a/crt/aws-c-common +++ b/crt/aws-c-common @@ -1 +1 @@ -Subproject commit b9959f5922a4b969beab8f0b99aa0b34bc9ee55c +Subproject commit f41b772f0de9454a4e7a65750b58c2379533bbf1 diff --git a/crt/aws-c-compression b/crt/aws-c-compression index f36d01672..c6c1191e5 160000 --- a/crt/aws-c-compression +++ b/crt/aws-c-compression @@ -1 +1 @@ -Subproject commit f36d01672d61e49d96a777870d456f66fa391cd4 +Subproject commit c6c1191e525e5aa6ead9e1afc392e35d3b50331e diff --git a/crt/aws-c-event-stream b/crt/aws-c-event-stream index 1b3825fc9..d2dcc9344 160000 --- a/crt/aws-c-event-stream +++ b/crt/aws-c-event-stream @@ -1 +1 @@ -Subproject commit 1b3825fc9cae2e9c7ed7479ee5d354d52ebdf7a0 +Subproject commit d2dcc9344dae24de320866045d85166d8a91a0d1 diff --git a/crt/aws-c-http b/crt/aws-c-http index 6068653e1..74b3a0dd1 160000 --- a/crt/aws-c-http +++ b/crt/aws-c-http @@ -1 +1 @@ -Subproject commit 6068653e1d582bd8e7d1c9f81f86beaf10444e3d +Subproject commit 74b3a0dd1396b72f701c8bdf24e5c6f41e52cf87 diff --git a/crt/aws-c-io b/crt/aws-c-io index c345d7727..fe93d0afc 160000 --- a/crt/aws-c-io +++ b/crt/aws-c-io @@ -1 +1 @@ -Subproject commit c345d77274db83c0c2e30331814093e7c84c45e2 +Subproject commit fe93d0afcc1cede32ac9569abd8669ed011b1b8c diff --git a/crt/aws-c-mqtt b/crt/aws-c-mqtt index c43232c1b..627c3334e 160000 --- a/crt/aws-c-mqtt +++ b/crt/aws-c-mqtt @@ -1 +1 @@ -Subproject commit c43232c1bc378344bb7245d7fcb167410f3fe931 +Subproject commit 627c3334e52021aa8d5772b6ca076884610f3219 diff --git a/crt/aws-c-s3 b/crt/aws-c-s3 index aede1d8c2..8c1969bce 160000 --- a/crt/aws-c-s3 +++ b/crt/aws-c-s3 @@ -1 +1 @@ -Subproject commit aede1d8c24f9f580d5a96c089878e9b258b88d04 +Subproject commit 8c1969bce5bfe0e063cbc719182dbe344342b880 diff --git a/crt/aws-c-sdkutils b/crt/aws-c-sdkutils index 4658412a6..0818f28ee 160000 --- a/crt/aws-c-sdkutils +++ b/crt/aws-c-sdkutils @@ -1 +1 @@ -Subproject commit 4658412a61ad5749db92a8d1e0717cb5e76ada1c +Subproject commit 0818f28ee436b892f09fbe8e3a6ae37ff40e9436 diff --git a/crt/aws-checksums b/crt/aws-checksums index ce04ab00b..0d2f5521f 160000 --- a/crt/aws-checksums +++ b/crt/aws-checksums @@ -1 +1 @@ -Subproject commit ce04ab00b3ecc41912f478bfedca39f8e1919d6b +Subproject commit 0d2f5521f61215f38f791d106ae304402208112d diff --git a/crt/aws-lc b/crt/aws-lc index d3a598c1b..8ffe277c2 160000 --- a/crt/aws-lc +++ b/crt/aws-lc @@ -1 +1 @@ -Subproject commit d3a598c1b419d49b5b08f0677add4581572e2edc +Subproject commit 8ffe277c21915ca82dc78a3bdc6a92e10c284b92 diff --git a/crt/s2n b/crt/s2n index 08d413a0b..ffe0bf42d 160000 --- a/crt/s2n +++ b/crt/s2n @@ -1 +1 @@ -Subproject commit 08d413a0b9b3226e775a38f04e3cf02230cc97c4 +Subproject commit ffe0bf42da8f139eff8fd2237f47fbde40b478fb diff --git a/docsrc/source/api/checksums.rst b/docsrc/source/api/checksums.rst new file mode 100644 index 000000000..17b6fd75a --- /dev/null +++ b/docsrc/source/api/checksums.rst @@ -0,0 +1,5 @@ +awscrt.checksums +================ + +.. automodule:: awscrt.checksums + :members: diff --git a/docsrc/source/index.rst b/docsrc/source/index.rst index 0558f3f54..c2b65240a 100644 --- a/docsrc/source/index.rst +++ b/docsrc/source/index.rst @@ -12,6 +12,7 @@ API Reference :maxdepth: 2 api/auth + api/checksums api/common api/crypto api/exceptions diff --git a/setup.py b/setup.py index 13cf5e645..6951b5010 100644 --- a/setup.py +++ b/setup.py @@ -13,6 +13,12 @@ import sys import sysconfig from wheel.bdist_wheel import bdist_wheel +if sys.platform == 'win32': + # distutils is deprecated in Python 3.10 and removed in 3.12. However, it still works because Python defines a compatibility interface as long as setuptools is installed. + # We don't have an official alternative for distutils.ccompiler as of September 2024. See: https://github.com/pypa/setuptools/issues/2806 + # Once that issue is resolved, we can migrate to the official solution. + # For now, restrict distutils to Windows only, where it's needed. + import distutils.ccompiler def is_64bit(): @@ -76,7 +82,6 @@ def determine_generator_args(): if sys.platform == 'win32': try: # See which compiler python picks - import distutils.ccompiler compiler = distutils.ccompiler.new_compiler() compiler.initialize() @@ -332,11 +337,6 @@ def awscrt_ext(): libraries.reverse() if sys.platform == 'win32': - # distutils is deprecated in Python 3.10 and removed in 3.12. However, it still works because Python defines a compatibility interface as long as setuptools is installed. - # We don't have an official alternative for distutils.ccompiler as of September 2024. See: https://github.com/pypa/setuptools/issues/2806 - # Once that issue is resolved, we can migrate to the official solution. - # For now, restrict distutils to Windows only, where it's needed. - import distutils.ccompiler # the windows apis being used under the hood. Since we're static linking we have to follow the entire chain down libraries += ['Secur32', 'Crypt32', 'Advapi32', 'NCrypt', 'BCrypt', 'Kernel32', 'Ws2_32', 'Shlwapi'] # Ensure that debug info is in the obj files, and that it is linked into the .pyd so that @@ -471,7 +471,7 @@ def _load_version(): "Operating System :: Unix", "Operating System :: MacOS", ], - python_requires='>=3.7', + python_requires='>=3.8', ext_modules=[awscrt_ext()], cmdclass={'build_ext': awscrt_build_ext, "bdist_wheel": bdist_wheel_abi3}, test_suite='test', diff --git a/test/test_s3.py b/test/test_s3.py index ddde60aaa..2ff069208 100644 --- a/test/test_s3.py +++ b/test/test_s3.py @@ -222,8 +222,9 @@ def test_sanity_secure(self): self.assertIsNotNone(s3_client) def test_sanity_network_interface_names(self): - s3_client = s3_client_new(True, self.region, network_interface_names=("eth0", "eth1")) - self.assertIsNotNone(s3_client) + # This is just a sanity test to ensure that we are passing the parameter correctly. + with self.assertRaises(Exception): + s3_client_new(True, self.region, network_interface_names=("eth0", "invalid-network-interface")) def test_wait_shutdown(self): s3_client = s3_client_new(False, self.region)