From a583265ce1a8ae1983462474ce4da31ba52ee459 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 14 Jan 2025 13:14:18 +0000 Subject: [PATCH 01/52] chore(ci): fix permissions for gh pages (#5866) Adding pages permission --- .github/workflows/publish_v3_layer.yml | 2 +- .github/workflows/reusable_publish_docs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index d27031af366..761a9b2796a 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -304,7 +304,7 @@ jobs: permissions: # lower privilege propagated from parent workflow (release.yml) contents: read - #pages: write + pages: write pull-requests: none id-token: write secrets: inherit diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index ac5172c9891..fa1d58fd656 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -42,7 +42,7 @@ jobs: permissions: contents: read # push to gh-pages id-token: write # trade JWT token for AWS credentials in AWS Docs account - #pages: write # uncomment if mike fails as we migrated to S3 hosting + pages: write # uncomment if mike fails as we migrated to S3 hosting steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: From 3e555568dceefb0ff7853c8ee8d36806560bd5c6 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 14 Jan 2025 13:21:27 +0000 Subject: [PATCH 02/52] chore(ci): adjust token permission (#5867) * Adding pages permission * Adding pages permission --- .github/workflows/publish_v3_layer.yml | 2 +- .github/workflows/reusable_publish_docs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index 761a9b2796a..6f537f6b9cb 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -303,7 +303,7 @@ jobs: needs: [update_v3_layer_arn_docs, prepare_docs_alias] permissions: # lower privilege propagated from parent workflow (release.yml) - contents: read + contents: write pages: write pull-requests: none id-token: write diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index fa1d58fd656..036ff89ef40 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -40,7 +40,7 @@ jobs: runs-on: ubuntu-latest environment: "Docs" permissions: - contents: read # push to gh-pages + contents: write # push to gh-pages id-token: write # trade JWT token for AWS credentials in AWS Docs account pages: write # uncomment if mike fails as we migrated to S3 hosting steps: From ee7b11025ece20c8ce2b2c0f82c2b7528c3053c4 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 14 Jan 2025 16:02:38 +0000 Subject: [PATCH 03/52] docs(layer): update layer version number - v3.4.1 (#5869) Release v3.4.1 --- aws_lambda_powertools/shared/version.py | 2 +- docs/includes/_layer_homepage_arm64.md | 348 ++++++++--------- docs/includes/_layer_homepage_x86.md | 360 +++++++++--------- docs/index.md | 16 +- examples/homepage/install/arm64/amplify.txt | 4 +- examples/homepage/install/arm64/cdk_arm64.py | 2 +- .../homepage/install/arm64/pulumi_arm64.py | 2 +- examples/homepage/install/arm64/sam.yaml | 2 +- .../homepage/install/arm64/serverless.yml | 2 +- examples/homepage/install/arm64/terraform.tf | 2 +- examples/homepage/install/x86_64/amplify.txt | 4 +- examples/homepage/install/x86_64/cdk_x86.py | 2 +- .../homepage/install/x86_64/pulumi_x86.py | 2 +- examples/homepage/install/x86_64/sam.yaml | 2 +- .../homepage/install/x86_64/serverless.yml | 2 +- examples/homepage/install/x86_64/terraform.tf | 2 +- examples/logger/sam/template.yaml | 2 +- examples/metrics/sam/template.yaml | 2 +- examples/metrics_datadog/sam/template.yaml | 2 +- examples/tracer/sam/template.yaml | 2 +- pyproject.toml | 2 +- 21 files changed, 382 insertions(+), 382 deletions(-) diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index fb8effa0707..30c32827ec3 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.4.1a10" +VERSION = "3.4.1" diff --git a/docs/includes/_layer_homepage_arm64.md b/docs/includes/_layer_homepage_arm64.md index 9e6282089c4..7d9b0dcaa19 100644 --- a/docs/includes/_layer_homepage_arm64.md +++ b/docs/includes/_layer_homepage_arm64.md @@ -5,202 +5,202 @@ | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:5**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | === "Python 3.9" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:5**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:6**{: .copyMe}:clipboard: | === "Python 3.10" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:5**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:6**{: .copyMe}:clipboard: | === "Python 3.11" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:5**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:6**{: .copyMe}:clipboard: | === "Python 3.12" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6**{: .copyMe}:clipboard: | === "Python 3.13" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:5**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:6**{: .copyMe}:clipboard: | diff --git a/docs/includes/_layer_homepage_x86.md b/docs/includes/_layer_homepage_x86.md index 6776e494d81..329137bb10f 100644 --- a/docs/includes/_layer_homepage_x86.md +++ b/docs/includes/_layer_homepage_x86.md @@ -5,208 +5,208 @@ | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:5**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | === "Python 3.9" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:5**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:6**{: .copyMe}:clipboard: | === "Python 3.10" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:5**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:6**{: .copyMe}:clipboard: | === "Python 3.11" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:5**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:6**{: .copyMe}:clipboard: | === "Python 3.12" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6**{: .copyMe}:clipboard: | === "Python 3.13" | Region | Layer ARN | | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:5**{: .copyMe}:clipboard: | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:6**{: .copyMe}:clipboard: | diff --git a/docs/index.md b/docs/index.md index c8e083c6457..23194e3c735 100644 --- a/docs/index.md +++ b/docs/index.md @@ -69,8 +69,8 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc | Architecture | Layer ARN | | ------------ | --------------------------------------------------------------------------------------------------------- | - | x86_64 | __arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-{python_version}-x86_64:5__{: .copyMe}:clipboard: | - | ARM | __arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-{python_version}-arm64:5__{: .copyMe}:clipboard: | + | x86_64 | __arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-{python_version}-x86_64:6__{: .copyMe}:clipboard: | + | ARM | __arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-{python_version}-arm64:6__{: .copyMe}:clipboard: | === "AWS Console" @@ -205,7 +205,7 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc You can use AWS CLI to generate a pre-signed URL to download the contents of our Lambda Layer. ```bash title="AWS CLI command to download Lambda Layer content" - aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5 --region eu-west-1 + aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 --region eu-west-1 ``` You'll find the pre-signed URL under `Location` key as part of the CLI command output. @@ -220,15 +220,15 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc | Architecture | Layer ARN | | ------------ | --------------------------------------------------------------------------------------------------------- | - | x86_64 | __arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsPythonV3-{python_version}-x86_64:5__{: .copyMe}:clipboard: | - | ARM | __arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsPythonV3-{python_version}-arm64:5__{: .copyMe}:clipboard: | + | x86_64 | __arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsPythonV3-{python_version}-x86_64:6__{: .copyMe}:clipboard: | + | ARM | __arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsPythonV3-{python_version}-arm64:6__{: .copyMe}:clipboard: | **AWS GovCloud (us-gov-west-1)** | Architecture | Layer ARN | | ------------ | --------------------------------------------------------------------------------------------------------- | - | x86_64 | __arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsPythonV3-{python_version}-x86_64:5__{: .copyMe}:clipboard: | - | ARM | __arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsPythonV3-{python_version}-arm64:5__{: .copyMe}:clipboard: | + | x86_64 | __arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsPythonV3-{python_version}-x86_64:6__{: .copyMe}:clipboard: | + | ARM | __arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsPythonV3-{python_version}-arm64:6__{: .copyMe}:clipboard: | === "Serverless Application Repository (SAR)" @@ -319,7 +319,7 @@ In this context, `[aws-sdk]` is an alias to the `boto3` package. Due to dependen The pre-signed URL to download this Lambda Layer will be within `Location` key in the CLI output. The CLI output will also contain the Powertools for AWS Lambda version it contains. ```bash title="AWS CLI command to download Lambda Layer content" -aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5 --region eu-west-1 +aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 --region eu-west-1 ``` #### SAR diff --git a/examples/homepage/install/arm64/amplify.txt b/examples/homepage/install/arm64/amplify.txt index 6632d90e0c9..7621a2b88f7 100644 --- a/examples/homepage/install/arm64/amplify.txt +++ b/examples/homepage/install/arm64/amplify.txt @@ -6,7 +6,7 @@ ? Do you want to configure advanced settings? Yes ... ? Do you want to enable Lambda layers for this function? Yes -? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5 +? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6 ❯ amplify push -y @@ -17,5 +17,5 @@ General information - Name: ? Which setting do you want to update? Lambda layers configuration ? Do you want to enable Lambda layers for this function? Yes -? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5 +? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6 ? Do you want to edit the local lambda function now? No diff --git a/examples/homepage/install/arm64/cdk_arm64.py b/examples/homepage/install/arm64/cdk_arm64.py index 92250f0537a..2115eb70b54 100644 --- a/examples/homepage/install/arm64/cdk_arm64.py +++ b/examples/homepage/install/arm64/cdk_arm64.py @@ -10,7 +10,7 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: powertools_layer = aws_lambda.LayerVersion.from_layer_version_arn( self, id="lambda-powertools", - layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5", + layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6", ) aws_lambda.Function( self, diff --git a/examples/homepage/install/arm64/pulumi_arm64.py b/examples/homepage/install/arm64/pulumi_arm64.py index 01ccba0349d..401e64a19ec 100644 --- a/examples/homepage/install/arm64/pulumi_arm64.py +++ b/examples/homepage/install/arm64/pulumi_arm64.py @@ -22,7 +22,7 @@ pulumi.Output.concat( "arn:aws:lambda:", aws.get_region_output().name, - ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5", + ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6", ), ], tracing_config={"mode": "Active"}, diff --git a/examples/homepage/install/arm64/sam.yaml b/examples/homepage/install/arm64/sam.yaml index 46c1aa02e40..47596af46b9 100644 --- a/examples/homepage/install/arm64/sam.yaml +++ b/examples/homepage/install/arm64/sam.yaml @@ -9,4 +9,4 @@ Resources: Runtime: python3.12 Handler: app.lambda_handler Layers: - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6 diff --git a/examples/homepage/install/arm64/serverless.yml b/examples/homepage/install/arm64/serverless.yml index c7ae8a9a464..0f312201c51 100644 --- a/examples/homepage/install/arm64/serverless.yml +++ b/examples/homepage/install/arm64/serverless.yml @@ -10,4 +10,4 @@ functions: handler: lambda_function.lambda_handler architecture: arm64 layers: - - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5 + - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6 diff --git a/examples/homepage/install/arm64/terraform.tf b/examples/homepage/install/arm64/terraform.tf index ab348f26999..504bad85045 100644 --- a/examples/homepage/install/arm64/terraform.tf +++ b/examples/homepage/install/arm64/terraform.tf @@ -34,7 +34,7 @@ resource "aws_lambda_function" "test_lambda" { role = aws_iam_role.iam_for_lambda.arn handler = "index.test" runtime = "python3.12" - layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:5"] + layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:6"] architectures = ["arm64"] source_code_hash = filebase64sha256("lambda_function_payload.zip") diff --git a/examples/homepage/install/x86_64/amplify.txt b/examples/homepage/install/x86_64/amplify.txt index c641b4fa01a..7e115842900 100644 --- a/examples/homepage/install/x86_64/amplify.txt +++ b/examples/homepage/install/x86_64/amplify.txt @@ -6,7 +6,7 @@ ? Do you want to configure advanced settings? Yes ... ? Do you want to enable Lambda layers for this function? Yes -? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5 +? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 ❯ amplify push -y @@ -17,5 +17,5 @@ General information - Name: ? Which setting do you want to update? Lambda layers configuration ? Do you want to enable Lambda layers for this function? Yes -? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5 +? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 ? Do you want to edit the local lambda function now? No diff --git a/examples/homepage/install/x86_64/cdk_x86.py b/examples/homepage/install/x86_64/cdk_x86.py index 6aa8ae4bddc..cada7ccc549 100644 --- a/examples/homepage/install/x86_64/cdk_x86.py +++ b/examples/homepage/install/x86_64/cdk_x86.py @@ -10,7 +10,7 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: powertools_layer = aws_lambda.LayerVersion.from_layer_version_arn( self, id="lambda-powertools", - layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5", + layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6", ) aws_lambda.Function( self, diff --git a/examples/homepage/install/x86_64/pulumi_x86.py b/examples/homepage/install/x86_64/pulumi_x86.py index d217218ca83..4e71b4124ce 100644 --- a/examples/homepage/install/x86_64/pulumi_x86.py +++ b/examples/homepage/install/x86_64/pulumi_x86.py @@ -22,7 +22,7 @@ pulumi.Output.concat( "arn:aws:lambda:", aws.get_region_output().name, - ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5", + ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6", ), ], tracing_config={"mode": "Active"}, diff --git a/examples/homepage/install/x86_64/sam.yaml b/examples/homepage/install/x86_64/sam.yaml index f1af3cb96ec..227cb925ba3 100644 --- a/examples/homepage/install/x86_64/sam.yaml +++ b/examples/homepage/install/x86_64/sam.yaml @@ -8,4 +8,4 @@ Resources: Runtime: python3.12 Handler: app.lambda_handler Layers: - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 diff --git a/examples/homepage/install/x86_64/serverless.yml b/examples/homepage/install/x86_64/serverless.yml index cd82dc91ca4..377eb759288 100644 --- a/examples/homepage/install/x86_64/serverless.yml +++ b/examples/homepage/install/x86_64/serverless.yml @@ -10,4 +10,4 @@ functions: handler: lambda_function.lambda_handler architecture: arm64 layers: - - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5 + - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 diff --git a/examples/homepage/install/x86_64/terraform.tf b/examples/homepage/install/x86_64/terraform.tf index 89add7efb29..39ba18c9ac8 100644 --- a/examples/homepage/install/x86_64/terraform.tf +++ b/examples/homepage/install/x86_64/terraform.tf @@ -34,7 +34,7 @@ resource "aws_lambda_function" "test_lambda" { role = aws_iam_role.iam_for_lambda.arn handler = "index.test" runtime = "python3.12" - layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5"] + layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6"] source_code_hash = filebase64sha256("lambda_function_payload.zip") } diff --git a/examples/logger/sam/template.yaml b/examples/logger/sam/template.yaml index 98243a9dc67..f37909f5324 100644 --- a/examples/logger/sam/template.yaml +++ b/examples/logger/sam/template.yaml @@ -14,7 +14,7 @@ Globals: Layers: # Find the latest Layer version in the official documentation # https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 Resources: LoggerLambdaHandlerExample: diff --git a/examples/metrics/sam/template.yaml b/examples/metrics/sam/template.yaml index c78fba6b88d..77bdfa93782 100644 --- a/examples/metrics/sam/template.yaml +++ b/examples/metrics/sam/template.yaml @@ -15,7 +15,7 @@ Globals: Layers: # Find the latest Layer version in the official documentation # https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 Resources: CaptureLambdaHandlerExample: diff --git a/examples/metrics_datadog/sam/template.yaml b/examples/metrics_datadog/sam/template.yaml index 0a250d1eaf9..b34eccbd337 100644 --- a/examples/metrics_datadog/sam/template.yaml +++ b/examples/metrics_datadog/sam/template.yaml @@ -20,7 +20,7 @@ Globals: Layers: # Find the latest Layer version in the official documentation # https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 # Find the latest Layer version in the Datadog official documentation # Datadog SDK diff --git a/examples/tracer/sam/template.yaml b/examples/tracer/sam/template.yaml index 0e0ee1c6ee7..9596c5307f5 100644 --- a/examples/tracer/sam/template.yaml +++ b/examples/tracer/sam/template.yaml @@ -13,7 +13,7 @@ Globals: Layers: # Find the latest Layer version in the official documentation # https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer - - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:5 + - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:6 Resources: CaptureLambdaHandlerExample: diff --git a/pyproject.toml b/pyproject.toml index b9c91d969b1..8260682f0aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.4.1a10" +version = "3.4.1" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From 190d7afa7923cad72b300554416749294cd81d36 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:28:18 +0000 Subject: [PATCH 04/52] chore(ci): new pre-release 3.4.2a0 (#5873) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- aws_lambda_powertools/shared/version.py | 2 +- provenance/3.4.2a0/multiple.intoto.jsonl | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 provenance/3.4.2a0/multiple.intoto.jsonl diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index 30c32827ec3..fedce557921 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.4.1" +VERSION = "3.4.2a0" diff --git a/provenance/3.4.2a0/multiple.intoto.jsonl b/provenance/3.4.2a0/multiple.intoto.jsonl new file mode 100644 index 00000000000..87f56fa866e --- /dev/null +++ b/provenance/3.4.2a0/multiple.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjQuMmEwLXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiMjFmNzRjODk3NzZlOTcxOTM1ZGZmM2Q4ODQwOWM0YWM5ODA1ZDA1MmI5MjA3ZjJjZDgyOWE1ZGM3ZDk0YTkyOSJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjQuMmEwLnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiI4MGU1Zjg4MmZmMzk5OTQ1ZWIxOTliMjE4YmVhOTVmODNiZWJjZWY3NjMwNjMzNzFmMjAxMGQxYjVlNzNjNmUxIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiZWU3YjExMDI1ZWNlMjBjOGNlMmIyYzBmODJjMmI3NTI4YzMwNTNjNCJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sInBhcmFtZXRlcnMiOnt9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoic2NoZWR1bGUiLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sIm9yZ2FuaXphdGlvbiI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJkZXNjcmlwdGlvbiI6IiIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvZXZlbnRzIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2hvb2tzIiwiaWQiOjEyOTEyNzYzOCwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9pc3N1ZXMiLCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvbWVtYmVyc3svbWVtYmVyfSIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJwdWJsaWNfbWVtYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcHVibGljX21lbWJlcnN7L21lbWJlcn0iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTVUMTI6MjY6MTJaIiwiY3VzdG9tX3Byb3BlcnRpZXMiOnt9LCJkZWZhdWx0X2JyYW5jaCI6ImRldmVsb3AiLCJkZXBsb3ltZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kZXBsb3ltZW50cyIsImRlc2NyaXB0aW9uIjoiQSBkZXZlbG9wZXIgdG9vbGtpdCB0byBpbXBsZW1lbnQgU2VydmVybGVzcyBiZXN0IHByYWN0aWNlcyBhbmQgaW5jcmVhc2UgZGV2ZWxvcGVyIHZlbG9jaXR5LiIsImRpc2FibGVkIjpmYWxzZSwiZG93bmxvYWRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Rvd25sb2FkcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ldmVudHMiLCJmb3JrIjpmYWxzZSwiZm9ya3MiOjQwMiwiZm9ya3NfY291bnQiOjQwMiwiZm9ya3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZm9ya3MiLCJmdWxsX25hbWUiOiJhd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJnaXRfY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvY29tbWl0c3svc2hhfSIsImdpdF9yZWZzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9yZWZzey9zaGF9IiwiZ2l0X3RhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RhZ3N7L3NoYX0iLCJnaXRfdXJsIjoiZ2l0Oi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiaGFzX2Rpc2N1c3Npb25zIjp0cnVlLCJoYXNfZG93bmxvYWRzIjp0cnVlLCJoYXNfaXNzdWVzIjp0cnVlLCJoYXNfcGFnZXMiOmZhbHNlLCJoYXNfcHJvamVjdHMiOnRydWUsImhhc193aWtpIjpmYWxzZSwiaG9tZXBhZ2UiOiJodHRwczovL2RvY3MucG93ZXJ0b29scy5hd3MuZGV2L2xhbWJkYS9weXRob24vbGF0ZXN0LyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2hvb2tzIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiaWQiOjIyMTkxOTM3OSwiaXNfdGVtcGxhdGUiOmZhbHNlLCJpc3N1ZV9jb21tZW50X3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9jb21tZW50c3svbnVtYmVyfSIsImlzc3VlX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvZXZlbnRzey9udW1iZXJ9IiwiaXNzdWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlc3svbnVtYmVyfSIsImtleXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24va2V5c3sva2V5X2lkfSIsImxhYmVsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYWJlbHN7L25hbWV9IiwibGFuZ3VhZ2UiOiJQeXRob24iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJtaXQtMCIsIm5hbWUiOiJNSVQgTm8gQXR0cmlidXRpb24iLCJub2RlX2lkIjoiTURjNlRHbGpaVzV6WlRReCIsInNwZHhfaWQiOiJNSVQtMCIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vbGljZW5zZXMvbWl0LTAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJwb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJub2RlX2lkIjoiTURFd09sSmxjRzl6YVhSdmNua3lNakU1TVRrek56az0iLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjo5NCwib3Blbl9pc3N1ZXNfY291bnQiOjk0LCJvd25lciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTEyNzYzOD92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scyIsImlkIjoxMjkxMjc2MzgsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL29yZ3MiLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdGFycmVkey9vd25lcn17L3JlcG99Iiwic3Vic2NyaXB0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiT3JnYW5pemF0aW9uIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scyIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjUtMDEtMTRUMjA6MjQ6MjBaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcmVsZWFzZXN7L2lkfSIsInNpemUiOjY1OTIxLCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjI5NTQsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDEtMTVUMDE6MTE6NTJaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjI5NTQsIndhdGNoZXJzX2NvdW50IjoyOTU0LCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMjc4MzkzNjQ5MiIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMTUzIiwiZ2l0aHViX3NoYTEiOiJlZTdiMTEwMjVlY2UyMGM4Y2UyYjJjMGY4MmMyYjc1MjhjMzA1M2M0In19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEyNzgzOTM2NDkyLTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiJlZTdiMTEwMjVlY2UyMGM4Y2UyYjJjMGY4MmMyYjc1MjhjMzA1M2M0In19XX19","signatures":[{"keyid":"","sig":"MEQCIF5c4ZO1WgHM2QpfdX5Z9eubBQk7dFIgfAEQwjz1y42YAiBtMbt9HVik7VdvwGWr8EwCc8R9HmOSv9AjKhzmmIueiw==","cert":"-----BEGIN CERTIFICATE-----\nMIIHZjCCBuugAwIBAgIUALw/TEjf0od8PKthz6XupKDTocIwCgYIKoZIzj0EAwMw\nNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRl\ncm1lZGlhdGUwHhcNMjUwMTE1MDgwNzUxWhcNMjUwMTE1MDgxNzUxWjAAMFkwEwYH\nKoZIzj0CAQYIKoZIzj0DAQcDQgAEFAYiW0i7pp9oIoSwl5hBapqHidwpZ7RdAj/b\nrdtcUsLSXaUPuCuwJjMB2mgn91BEUpctzPIIWk2a3Kj7hOklH6OCBgowggYGMA4G\nA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUJFER\nbtOHUDcM64ebxfi7cIUtTq8wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4Y\nZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1l\nd29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2Vu\nZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4wLjAwOQYKKwYB\nBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50\nLmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBChlZTdi\nMTEwMjVlY2UyMGM4Y2UyYjJjMGY4MmMyYjc1MjhjMzA1M2M0MBkGCisGAQQBg78w\nAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRz\nL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8v\nZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3Iv\nLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJl\nZnMvdGFncy92Mi4wLjAwOAYKKwYBBAGDvzABCgQqDCg1YTc3NWIzNjdhNTZkNWJk\nMTE4YTIyNGE4MTFiYmEyODgxNTBhNTYzMB0GCisGAQQBg78wAQsEDwwNZ2l0aHVi\nLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mt\ncG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzAB\nDQQqDChlZTdiMTEwMjVlY2UyMGM4Y2UyYjJjMGY4MmMyYjc1MjhjMzA1M2M0MCIG\nCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8E\nCwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29t\nL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisG\nAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bv\nd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVs\nZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoZWU3\nYjExMDI1ZWNlMjBjOGNlMmIyYzBmODJjMmI3NTI4YzMwNTNjNDAYBgorBgEEAYO/\nMAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIu\nY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rp\nb25zL3J1bnMvMTI3ODM5MzY0OTIvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgM\nBnB1YmxpYzCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKi\nSl643jyt/4eKcoAvKe6OAAABlGkBKmgAAAQDAEYwRAIgWoNLj6uhIqGkRG1/OYLK\ntazj5PRk9PxaUFSyVo+SzHgCICqzLMW0USz7vFUmU/Gi+sVtUljtuKSdglut7xQ4\n1C6gMAoGCCqGSM49BAMDA2kAMGYCMQD8W5wNRP9qqJQGfhVEO208Vbyh1e0sJngW\nxJedy4/emE16f/UFXxKRLRT/zR26UfYCMQDVkFCEYgF8G1PT1SKOPWLU7zd9TCJz\nb6qJ8IGNNM/7vZ09/cKme2NWTM4xph0cw2E=\n-----END CERTIFICATE-----\n"}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 8260682f0aa..c1e1f123798 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.4.1" +version = "3.4.2a0" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"] From c4fa74a21bc701de00fa12c2fe816af83a1f2adb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:30:23 +0000 Subject: [PATCH 05/52] chore(deps-dev): bump cfn-lint from 1.22.4 to 1.22.5 (#5872) Bumps [cfn-lint](https://github.com/aws-cloudformation/cfn-lint) from 1.22.4 to 1.22.5. - [Release notes](https://github.com/aws-cloudformation/cfn-lint/releases) - [Changelog](https://github.com/aws-cloudformation/cfn-lint/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws-cloudformation/cfn-lint/compare/v1.22.4...v1.22.5) --- updated-dependencies: - dependency-name: cfn-lint dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 06418911dab..3fd42c69228 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1076,13 +1076,13 @@ pycparser = "*" [[package]] name = "cfn-lint" -version = "1.22.4" +version = "1.22.5" description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved" optional = false python-versions = ">=3.8" files = [ - {file = "cfn_lint-1.22.4-py3-none-any.whl", hash = "sha256:fc8d41f581cbc03adbb3fc7caccc3ba43945fb7a7ffae26d8c51bc65741baa6f"}, - {file = "cfn_lint-1.22.4.tar.gz", hash = "sha256:c70b578ac6f44f9f487ca9aeb6fd9a75836fdbe379e073aef8b4161e06071bdd"}, + {file = "cfn_lint-1.22.5-py3-none-any.whl", hash = "sha256:18309e59cc03ff18b02676688df7eb1a17f5276da3776f31946fc0d9aa9b8fe7"}, + {file = "cfn_lint-1.22.5.tar.gz", hash = "sha256:8b4f55e283143e99d8d331627637226c291cecfb936606f7aab2d940e71e566d"}, ] [package.dependencies] @@ -4418,4 +4418,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<4.0.0" -content-hash = "b14a4796466f18bc107bb1f1702112d7f9d2e831f6036ed0c5906a48c440e7bf" +content-hash = "c836791b03240691cff46292b30968c8380fe64a3b77adacd6764141c7fc15d6" diff --git a/pyproject.toml b/pyproject.toml index c1e1f123798..8a1b1435c96 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -111,7 +111,7 @@ datadog = ["datadog-lambda"] datamasking = ["aws-encryption-sdk", "jsonpath-ng"] [tool.poetry.group.dev.dependencies] -cfn-lint = "1.22.4" +cfn-lint = "1.22.5" mypy = "^1.1.1" types-python-dateutil = "^2.8.19.6" aws-cdk-aws-appsync-alpha = "^2.59.0a0" From a7776c2fa751dc9c9c3c1ac01b94a57ec897f7de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:38:24 +0000 Subject: [PATCH 06/52] chore(deps-dev): bump boto3-stubs from 1.35.97 to 1.35.99 (#5874) Bumps [boto3-stubs](https://github.com/youtype/mypy_boto3_builder) from 1.35.97 to 1.35.99. - [Release notes](https://github.com/youtype/mypy_boto3_builder/releases) - [Commits](https://github.com/youtype/mypy_boto3_builder/commits) --- updated-dependencies: - dependency-name: boto3-stubs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3fd42c69228..7c65705e9fd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -434,13 +434,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.35.97" -description = "Type annotations for boto3 1.35.97 generated with mypy-boto3-builder 8.8.0" +version = "1.35.99" +description = "Type annotations for boto3 1.35.99 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.35.97-py3-none-any.whl", hash = "sha256:da33f2a540c942505d761bcc59bc16d607a9adb815198967d66b38515a4a60e8"}, - {file = "boto3_stubs-1.35.97.tar.gz", hash = "sha256:4182f9f18f279969fbcb697200f9a89a6b07a95e45f7db276ab90dcdf65a72ba"}, + {file = "boto3_stubs-1.35.99-py3-none-any.whl", hash = "sha256:14ae7f49ad8825cc8bca5e7891d08b68e39512439ebfa1c52e41e51aed2b199c"}, + {file = "boto3_stubs-1.35.99.tar.gz", hash = "sha256:3052e3d68e2044e2fd5daa7f0f7c976a5cc85a528aff610c3b874a30f1dbd3fb"}, ] [package.dependencies] @@ -507,7 +507,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.35.0,<1.36.0)"] billing = ["mypy-boto3-billing (>=1.35.0,<1.36.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.35.0,<1.36.0)"] -boto3 = ["boto3 (==1.35.97)"] +boto3 = ["boto3 (==1.35.99)"] braket = ["mypy-boto3-braket (>=1.35.0,<1.36.0)"] budgets = ["mypy-boto3-budgets (>=1.35.0,<1.36.0)"] ce = ["mypy-boto3-ce (>=1.35.0,<1.36.0)"] From 8c89def81aa447b7e6e0831b6390fbf0c7149c7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:39:02 +0000 Subject: [PATCH 07/52] chore(deps-dev): bump sentry-sdk from 2.19.2 to 2.20.0 (#5870) Bumps [sentry-sdk](https://github.com/getsentry/sentry-python) from 2.19.2 to 2.20.0. - [Release notes](https://github.com/getsentry/sentry-python/releases) - [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-python/compare/2.19.2...2.20.0) --- updated-dependencies: - dependency-name: sentry-sdk dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7c65705e9fd..8397cfd711f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3764,13 +3764,13 @@ pathspec = ">=0.10.1" [[package]] name = "sentry-sdk" -version = "2.19.2" +version = "2.20.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.19.2-py2.py3-none-any.whl", hash = "sha256:ebdc08228b4d131128e568d696c210d846e5b9d70aa0327dec6b1272d9d40b84"}, - {file = "sentry_sdk-2.19.2.tar.gz", hash = "sha256:467df6e126ba242d39952375dd816fbee0f217d119bf454a8ce74cf1e7909e8d"}, + {file = "sentry_sdk-2.20.0-py2.py3-none-any.whl", hash = "sha256:c359a1edf950eb5e80cffd7d9111f3dbeef57994cb4415df37d39fda2cf22364"}, + {file = "sentry_sdk-2.20.0.tar.gz", hash = "sha256:afa82713a92facf847df3c6f63cec71eb488d826a50965def3d7722aa6f0fdab"}, ] [package.dependencies] @@ -3815,6 +3815,7 @@ sqlalchemy = ["sqlalchemy (>=1.2)"] starlette = ["starlette (>=0.19.1)"] starlite = ["starlite (>=1.48)"] tornado = ["tornado (>=6)"] +unleash = ["UnleashClient (>=6.0.1)"] [[package]] name = "six" From b2967d0cc4f9851258129ec547c789b34484ac32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Jan 2025 19:55:05 -0300 Subject: [PATCH 08/52] chore(deps-dev): bump mypy-boto3-appconfigdata from 1.35.93 to 1.36.0 in the boto-typing group (#5875) chore(deps-dev): bump mypy-boto3-appconfigdata in the boto-typing group Bumps the boto-typing group with 1 update: [mypy-boto3-appconfigdata](https://github.com/youtype/mypy_boto3_builder). Updates `mypy-boto3-appconfigdata` from 1.35.93 to 1.36.0 - [Release notes](https://github.com/youtype/mypy_boto3_builder/releases) - [Commits](https://github.com/youtype/mypy_boto3_builder/commits) --- updated-dependencies: - dependency-name: mypy-boto3-appconfigdata dependency-type: direct:development update-type: version-update:semver-minor dependency-group: boto-typing ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 934 ++++++++++++++++++++++++------------------------- pyproject.toml | 2 +- 2 files changed, 468 insertions(+), 468 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8397cfd711f..6d21adf4170 100644 --- a/poetry.lock +++ b/poetry.lock @@ -434,439 +434,439 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.35.99" -description = "Type annotations for boto3 1.35.99 generated with mypy-boto3-builder 8.8.0" +version = "1.36.1" +description = "Type annotations for boto3 1.36.1 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.35.99-py3-none-any.whl", hash = "sha256:14ae7f49ad8825cc8bca5e7891d08b68e39512439ebfa1c52e41e51aed2b199c"}, - {file = "boto3_stubs-1.35.99.tar.gz", hash = "sha256:3052e3d68e2044e2fd5daa7f0f7c976a5cc85a528aff610c3b874a30f1dbd3fb"}, + {file = "boto3_stubs-1.36.1-py3-none-any.whl", hash = "sha256:ddc44b30598067a6c20bd8df4e72cf4155be8dc29fb2cd3e7ed26149cf7dd69a"}, + {file = "boto3_stubs-1.36.1.tar.gz", hash = "sha256:d7cbf8aab4eacf0988a879243bbb5cd3139f08f83e82c9556c3412d71373840f"}, ] [package.dependencies] botocore-stubs = "*" -mypy-boto3-appconfig = {version = ">=1.35.0,<1.36.0", optional = true, markers = "extra == \"appconfig\""} -mypy-boto3-appconfigdata = {version = ">=1.35.0,<1.36.0", optional = true, markers = "extra == \"appconfigdata\""} -mypy-boto3-cloudformation = {version = ">=1.35.0,<1.36.0", optional = true, markers = "extra == \"cloudformation\""} -mypy-boto3-cloudwatch = {version = ">=1.35.0,<1.36.0", optional = true, markers = "extra == \"cloudwatch\""} -mypy-boto3-dynamodb = {version = ">=1.35.0,<1.36.0", optional = true, markers = "extra == \"dynamodb\""} -mypy-boto3-lambda = {version = ">=1.35.0,<1.36.0", optional = true, markers = "extra == \"lambda\""} -mypy-boto3-logs = {version = ">=1.35.0,<1.36.0", optional = true, markers = "extra == \"logs\""} -mypy-boto3-s3 = {version = ">=1.35.0,<1.36.0", optional = true, markers = "extra == \"s3\""} -mypy-boto3-secretsmanager = {version = ">=1.35.0,<1.36.0", optional = true, markers = "extra == \"secretsmanager\""} -mypy-boto3-ssm = {version = ">=1.35.0,<1.36.0", optional = true, markers = "extra == \"ssm\""} -mypy-boto3-xray = {version = ">=1.35.0,<1.36.0", optional = true, markers = "extra == \"xray\""} +mypy-boto3-appconfig = {version = ">=1.36.0,<1.37.0", optional = true, markers = "extra == \"appconfig\""} +mypy-boto3-appconfigdata = {version = ">=1.36.0,<1.37.0", optional = true, markers = "extra == \"appconfigdata\""} +mypy-boto3-cloudformation = {version = ">=1.36.0,<1.37.0", optional = true, markers = "extra == \"cloudformation\""} +mypy-boto3-cloudwatch = {version = ">=1.36.0,<1.37.0", optional = true, markers = "extra == \"cloudwatch\""} +mypy-boto3-dynamodb = {version = ">=1.36.0,<1.37.0", optional = true, markers = "extra == \"dynamodb\""} +mypy-boto3-lambda = {version = ">=1.36.0,<1.37.0", optional = true, markers = "extra == \"lambda\""} +mypy-boto3-logs = {version = ">=1.36.0,<1.37.0", optional = true, markers = "extra == \"logs\""} +mypy-boto3-s3 = {version = ">=1.36.0,<1.37.0", optional = true, markers = "extra == \"s3\""} +mypy-boto3-secretsmanager = {version = ">=1.36.0,<1.37.0", optional = true, markers = "extra == \"secretsmanager\""} +mypy-boto3-ssm = {version = ">=1.36.0,<1.37.0", optional = true, markers = "extra == \"ssm\""} +mypy-boto3-xray = {version = ">=1.36.0,<1.37.0", optional = true, markers = "extra == \"xray\""} types-s3transfer = "*" typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [package.extras] -accessanalyzer = ["mypy-boto3-accessanalyzer (>=1.35.0,<1.36.0)"] -account = ["mypy-boto3-account (>=1.35.0,<1.36.0)"] -acm = ["mypy-boto3-acm (>=1.35.0,<1.36.0)"] -acm-pca = ["mypy-boto3-acm-pca (>=1.35.0,<1.36.0)"] -all = ["mypy-boto3-accessanalyzer (>=1.35.0,<1.36.0)", "mypy-boto3-account (>=1.35.0,<1.36.0)", "mypy-boto3-acm (>=1.35.0,<1.36.0)", "mypy-boto3-acm-pca (>=1.35.0,<1.36.0)", "mypy-boto3-amp (>=1.35.0,<1.36.0)", "mypy-boto3-amplify (>=1.35.0,<1.36.0)", "mypy-boto3-amplifybackend (>=1.35.0,<1.36.0)", "mypy-boto3-amplifyuibuilder (>=1.35.0,<1.36.0)", "mypy-boto3-apigateway (>=1.35.0,<1.36.0)", "mypy-boto3-apigatewaymanagementapi (>=1.35.0,<1.36.0)", "mypy-boto3-apigatewayv2 (>=1.35.0,<1.36.0)", "mypy-boto3-appconfig (>=1.35.0,<1.36.0)", "mypy-boto3-appconfigdata (>=1.35.0,<1.36.0)", "mypy-boto3-appfabric (>=1.35.0,<1.36.0)", "mypy-boto3-appflow (>=1.35.0,<1.36.0)", "mypy-boto3-appintegrations (>=1.35.0,<1.36.0)", "mypy-boto3-application-autoscaling (>=1.35.0,<1.36.0)", "mypy-boto3-application-insights (>=1.35.0,<1.36.0)", "mypy-boto3-application-signals (>=1.35.0,<1.36.0)", "mypy-boto3-applicationcostprofiler (>=1.35.0,<1.36.0)", "mypy-boto3-appmesh (>=1.35.0,<1.36.0)", "mypy-boto3-apprunner (>=1.35.0,<1.36.0)", "mypy-boto3-appstream (>=1.35.0,<1.36.0)", "mypy-boto3-appsync (>=1.35.0,<1.36.0)", "mypy-boto3-apptest (>=1.35.0,<1.36.0)", "mypy-boto3-arc-zonal-shift (>=1.35.0,<1.36.0)", "mypy-boto3-artifact (>=1.35.0,<1.36.0)", "mypy-boto3-athena (>=1.35.0,<1.36.0)", "mypy-boto3-auditmanager (>=1.35.0,<1.36.0)", "mypy-boto3-autoscaling (>=1.35.0,<1.36.0)", "mypy-boto3-autoscaling-plans (>=1.35.0,<1.36.0)", "mypy-boto3-b2bi (>=1.35.0,<1.36.0)", "mypy-boto3-backup (>=1.35.0,<1.36.0)", "mypy-boto3-backup-gateway (>=1.35.0,<1.36.0)", "mypy-boto3-backupsearch (>=1.35.0,<1.36.0)", "mypy-boto3-batch (>=1.35.0,<1.36.0)", "mypy-boto3-bcm-data-exports (>=1.35.0,<1.36.0)", "mypy-boto3-bcm-pricing-calculator (>=1.35.0,<1.36.0)", "mypy-boto3-bedrock (>=1.35.0,<1.36.0)", "mypy-boto3-bedrock-agent (>=1.35.0,<1.36.0)", "mypy-boto3-bedrock-agent-runtime (>=1.35.0,<1.36.0)", "mypy-boto3-bedrock-data-automation (>=1.35.0,<1.36.0)", "mypy-boto3-bedrock-data-automation-runtime (>=1.35.0,<1.36.0)", "mypy-boto3-bedrock-runtime (>=1.35.0,<1.36.0)", "mypy-boto3-billing (>=1.35.0,<1.36.0)", "mypy-boto3-billingconductor (>=1.35.0,<1.36.0)", "mypy-boto3-braket (>=1.35.0,<1.36.0)", "mypy-boto3-budgets (>=1.35.0,<1.36.0)", "mypy-boto3-ce (>=1.35.0,<1.36.0)", "mypy-boto3-chatbot (>=1.35.0,<1.36.0)", "mypy-boto3-chime (>=1.35.0,<1.36.0)", "mypy-boto3-chime-sdk-identity (>=1.35.0,<1.36.0)", "mypy-boto3-chime-sdk-media-pipelines (>=1.35.0,<1.36.0)", "mypy-boto3-chime-sdk-meetings (>=1.35.0,<1.36.0)", "mypy-boto3-chime-sdk-messaging (>=1.35.0,<1.36.0)", "mypy-boto3-chime-sdk-voice (>=1.35.0,<1.36.0)", "mypy-boto3-cleanrooms (>=1.35.0,<1.36.0)", "mypy-boto3-cleanroomsml (>=1.35.0,<1.36.0)", "mypy-boto3-cloud9 (>=1.35.0,<1.36.0)", "mypy-boto3-cloudcontrol (>=1.35.0,<1.36.0)", "mypy-boto3-clouddirectory (>=1.35.0,<1.36.0)", "mypy-boto3-cloudformation (>=1.35.0,<1.36.0)", "mypy-boto3-cloudfront (>=1.35.0,<1.36.0)", "mypy-boto3-cloudfront-keyvaluestore (>=1.35.0,<1.36.0)", "mypy-boto3-cloudhsm (>=1.35.0,<1.36.0)", "mypy-boto3-cloudhsmv2 (>=1.35.0,<1.36.0)", "mypy-boto3-cloudsearch (>=1.35.0,<1.36.0)", "mypy-boto3-cloudsearchdomain (>=1.35.0,<1.36.0)", "mypy-boto3-cloudtrail (>=1.35.0,<1.36.0)", "mypy-boto3-cloudtrail-data (>=1.35.0,<1.36.0)", "mypy-boto3-cloudwatch (>=1.35.0,<1.36.0)", "mypy-boto3-codeartifact (>=1.35.0,<1.36.0)", "mypy-boto3-codebuild (>=1.35.0,<1.36.0)", "mypy-boto3-codecatalyst (>=1.35.0,<1.36.0)", "mypy-boto3-codecommit (>=1.35.0,<1.36.0)", "mypy-boto3-codeconnections (>=1.35.0,<1.36.0)", "mypy-boto3-codedeploy (>=1.35.0,<1.36.0)", "mypy-boto3-codeguru-reviewer (>=1.35.0,<1.36.0)", "mypy-boto3-codeguru-security (>=1.35.0,<1.36.0)", "mypy-boto3-codeguruprofiler (>=1.35.0,<1.36.0)", "mypy-boto3-codepipeline (>=1.35.0,<1.36.0)", "mypy-boto3-codestar-connections (>=1.35.0,<1.36.0)", "mypy-boto3-codestar-notifications (>=1.35.0,<1.36.0)", "mypy-boto3-cognito-identity (>=1.35.0,<1.36.0)", "mypy-boto3-cognito-idp (>=1.35.0,<1.36.0)", "mypy-boto3-cognito-sync (>=1.35.0,<1.36.0)", "mypy-boto3-comprehend (>=1.35.0,<1.36.0)", "mypy-boto3-comprehendmedical (>=1.35.0,<1.36.0)", "mypy-boto3-compute-optimizer (>=1.35.0,<1.36.0)", "mypy-boto3-config (>=1.35.0,<1.36.0)", "mypy-boto3-connect (>=1.35.0,<1.36.0)", "mypy-boto3-connect-contact-lens (>=1.35.0,<1.36.0)", "mypy-boto3-connectcampaigns (>=1.35.0,<1.36.0)", "mypy-boto3-connectcampaignsv2 (>=1.35.0,<1.36.0)", "mypy-boto3-connectcases (>=1.35.0,<1.36.0)", "mypy-boto3-connectparticipant (>=1.35.0,<1.36.0)", "mypy-boto3-controlcatalog (>=1.35.0,<1.36.0)", "mypy-boto3-controltower (>=1.35.0,<1.36.0)", "mypy-boto3-cost-optimization-hub (>=1.35.0,<1.36.0)", "mypy-boto3-cur (>=1.35.0,<1.36.0)", "mypy-boto3-customer-profiles (>=1.35.0,<1.36.0)", "mypy-boto3-databrew (>=1.35.0,<1.36.0)", "mypy-boto3-dataexchange (>=1.35.0,<1.36.0)", "mypy-boto3-datapipeline (>=1.35.0,<1.36.0)", "mypy-boto3-datasync (>=1.35.0,<1.36.0)", "mypy-boto3-datazone (>=1.35.0,<1.36.0)", "mypy-boto3-dax (>=1.35.0,<1.36.0)", "mypy-boto3-deadline (>=1.35.0,<1.36.0)", "mypy-boto3-detective (>=1.35.0,<1.36.0)", "mypy-boto3-devicefarm (>=1.35.0,<1.36.0)", "mypy-boto3-devops-guru (>=1.35.0,<1.36.0)", "mypy-boto3-directconnect (>=1.35.0,<1.36.0)", "mypy-boto3-discovery (>=1.35.0,<1.36.0)", "mypy-boto3-dlm (>=1.35.0,<1.36.0)", "mypy-boto3-dms (>=1.35.0,<1.36.0)", "mypy-boto3-docdb (>=1.35.0,<1.36.0)", "mypy-boto3-docdb-elastic (>=1.35.0,<1.36.0)", "mypy-boto3-drs (>=1.35.0,<1.36.0)", "mypy-boto3-ds (>=1.35.0,<1.36.0)", "mypy-boto3-ds-data (>=1.35.0,<1.36.0)", "mypy-boto3-dsql (>=1.35.0,<1.36.0)", "mypy-boto3-dynamodb (>=1.35.0,<1.36.0)", "mypy-boto3-dynamodbstreams (>=1.35.0,<1.36.0)", "mypy-boto3-ebs (>=1.35.0,<1.36.0)", "mypy-boto3-ec2 (>=1.35.0,<1.36.0)", "mypy-boto3-ec2-instance-connect (>=1.35.0,<1.36.0)", "mypy-boto3-ecr (>=1.35.0,<1.36.0)", "mypy-boto3-ecr-public (>=1.35.0,<1.36.0)", "mypy-boto3-ecs (>=1.35.0,<1.36.0)", "mypy-boto3-efs (>=1.35.0,<1.36.0)", "mypy-boto3-eks (>=1.35.0,<1.36.0)", "mypy-boto3-eks-auth (>=1.35.0,<1.36.0)", "mypy-boto3-elastic-inference (>=1.35.0,<1.36.0)", "mypy-boto3-elasticache (>=1.35.0,<1.36.0)", "mypy-boto3-elasticbeanstalk (>=1.35.0,<1.36.0)", "mypy-boto3-elastictranscoder (>=1.35.0,<1.36.0)", "mypy-boto3-elb (>=1.35.0,<1.36.0)", "mypy-boto3-elbv2 (>=1.35.0,<1.36.0)", "mypy-boto3-emr (>=1.35.0,<1.36.0)", "mypy-boto3-emr-containers (>=1.35.0,<1.36.0)", "mypy-boto3-emr-serverless (>=1.35.0,<1.36.0)", "mypy-boto3-entityresolution (>=1.35.0,<1.36.0)", "mypy-boto3-es (>=1.35.0,<1.36.0)", "mypy-boto3-events (>=1.35.0,<1.36.0)", "mypy-boto3-evidently (>=1.35.0,<1.36.0)", "mypy-boto3-finspace (>=1.35.0,<1.36.0)", "mypy-boto3-finspace-data (>=1.35.0,<1.36.0)", "mypy-boto3-firehose (>=1.35.0,<1.36.0)", "mypy-boto3-fis (>=1.35.0,<1.36.0)", "mypy-boto3-fms (>=1.35.0,<1.36.0)", "mypy-boto3-forecast (>=1.35.0,<1.36.0)", "mypy-boto3-forecastquery (>=1.35.0,<1.36.0)", "mypy-boto3-frauddetector (>=1.35.0,<1.36.0)", "mypy-boto3-freetier (>=1.35.0,<1.36.0)", "mypy-boto3-fsx (>=1.35.0,<1.36.0)", "mypy-boto3-gamelift (>=1.35.0,<1.36.0)", "mypy-boto3-geo-maps (>=1.35.0,<1.36.0)", "mypy-boto3-geo-places (>=1.35.0,<1.36.0)", "mypy-boto3-geo-routes (>=1.35.0,<1.36.0)", "mypy-boto3-glacier (>=1.35.0,<1.36.0)", "mypy-boto3-globalaccelerator (>=1.35.0,<1.36.0)", "mypy-boto3-glue (>=1.35.0,<1.36.0)", "mypy-boto3-grafana (>=1.35.0,<1.36.0)", "mypy-boto3-greengrass (>=1.35.0,<1.36.0)", "mypy-boto3-greengrassv2 (>=1.35.0,<1.36.0)", "mypy-boto3-groundstation (>=1.35.0,<1.36.0)", "mypy-boto3-guardduty (>=1.35.0,<1.36.0)", "mypy-boto3-health (>=1.35.0,<1.36.0)", "mypy-boto3-healthlake (>=1.35.0,<1.36.0)", "mypy-boto3-iam (>=1.35.0,<1.36.0)", "mypy-boto3-identitystore (>=1.35.0,<1.36.0)", "mypy-boto3-imagebuilder (>=1.35.0,<1.36.0)", "mypy-boto3-importexport (>=1.35.0,<1.36.0)", "mypy-boto3-inspector (>=1.35.0,<1.36.0)", "mypy-boto3-inspector-scan (>=1.35.0,<1.36.0)", "mypy-boto3-inspector2 (>=1.35.0,<1.36.0)", "mypy-boto3-internetmonitor (>=1.35.0,<1.36.0)", "mypy-boto3-invoicing (>=1.35.0,<1.36.0)", "mypy-boto3-iot (>=1.35.0,<1.36.0)", "mypy-boto3-iot-data (>=1.35.0,<1.36.0)", "mypy-boto3-iot-jobs-data (>=1.35.0,<1.36.0)", "mypy-boto3-iotanalytics (>=1.35.0,<1.36.0)", "mypy-boto3-iotdeviceadvisor (>=1.35.0,<1.36.0)", "mypy-boto3-iotevents (>=1.35.0,<1.36.0)", "mypy-boto3-iotevents-data (>=1.35.0,<1.36.0)", "mypy-boto3-iotfleethub (>=1.35.0,<1.36.0)", "mypy-boto3-iotfleetwise (>=1.35.0,<1.36.0)", "mypy-boto3-iotsecuretunneling (>=1.35.0,<1.36.0)", "mypy-boto3-iotsitewise (>=1.35.0,<1.36.0)", "mypy-boto3-iotthingsgraph (>=1.35.0,<1.36.0)", "mypy-boto3-iottwinmaker (>=1.35.0,<1.36.0)", "mypy-boto3-iotwireless (>=1.35.0,<1.36.0)", "mypy-boto3-ivs (>=1.35.0,<1.36.0)", "mypy-boto3-ivs-realtime (>=1.35.0,<1.36.0)", "mypy-boto3-ivschat (>=1.35.0,<1.36.0)", "mypy-boto3-kafka (>=1.35.0,<1.36.0)", "mypy-boto3-kafkaconnect (>=1.35.0,<1.36.0)", "mypy-boto3-kendra (>=1.35.0,<1.36.0)", "mypy-boto3-kendra-ranking (>=1.35.0,<1.36.0)", "mypy-boto3-keyspaces (>=1.35.0,<1.36.0)", "mypy-boto3-kinesis (>=1.35.0,<1.36.0)", "mypy-boto3-kinesis-video-archived-media (>=1.35.0,<1.36.0)", "mypy-boto3-kinesis-video-media (>=1.35.0,<1.36.0)", "mypy-boto3-kinesis-video-signaling (>=1.35.0,<1.36.0)", "mypy-boto3-kinesis-video-webrtc-storage (>=1.35.0,<1.36.0)", "mypy-boto3-kinesisanalytics (>=1.35.0,<1.36.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.35.0,<1.36.0)", "mypy-boto3-kinesisvideo (>=1.35.0,<1.36.0)", "mypy-boto3-kms (>=1.35.0,<1.36.0)", "mypy-boto3-lakeformation (>=1.35.0,<1.36.0)", "mypy-boto3-lambda (>=1.35.0,<1.36.0)", "mypy-boto3-launch-wizard (>=1.35.0,<1.36.0)", "mypy-boto3-lex-models (>=1.35.0,<1.36.0)", "mypy-boto3-lex-runtime (>=1.35.0,<1.36.0)", "mypy-boto3-lexv2-models (>=1.35.0,<1.36.0)", "mypy-boto3-lexv2-runtime (>=1.35.0,<1.36.0)", "mypy-boto3-license-manager (>=1.35.0,<1.36.0)", "mypy-boto3-license-manager-linux-subscriptions (>=1.35.0,<1.36.0)", "mypy-boto3-license-manager-user-subscriptions (>=1.35.0,<1.36.0)", "mypy-boto3-lightsail (>=1.35.0,<1.36.0)", "mypy-boto3-location (>=1.35.0,<1.36.0)", "mypy-boto3-logs (>=1.35.0,<1.36.0)", "mypy-boto3-lookoutequipment (>=1.35.0,<1.36.0)", "mypy-boto3-lookoutmetrics (>=1.35.0,<1.36.0)", "mypy-boto3-lookoutvision (>=1.35.0,<1.36.0)", "mypy-boto3-m2 (>=1.35.0,<1.36.0)", "mypy-boto3-machinelearning (>=1.35.0,<1.36.0)", "mypy-boto3-macie2 (>=1.35.0,<1.36.0)", "mypy-boto3-mailmanager (>=1.35.0,<1.36.0)", "mypy-boto3-managedblockchain (>=1.35.0,<1.36.0)", "mypy-boto3-managedblockchain-query (>=1.35.0,<1.36.0)", "mypy-boto3-marketplace-agreement (>=1.35.0,<1.36.0)", "mypy-boto3-marketplace-catalog (>=1.35.0,<1.36.0)", "mypy-boto3-marketplace-deployment (>=1.35.0,<1.36.0)", "mypy-boto3-marketplace-entitlement (>=1.35.0,<1.36.0)", "mypy-boto3-marketplace-reporting (>=1.35.0,<1.36.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.35.0,<1.36.0)", "mypy-boto3-mediaconnect (>=1.35.0,<1.36.0)", "mypy-boto3-mediaconvert (>=1.35.0,<1.36.0)", "mypy-boto3-medialive (>=1.35.0,<1.36.0)", "mypy-boto3-mediapackage (>=1.35.0,<1.36.0)", "mypy-boto3-mediapackage-vod (>=1.35.0,<1.36.0)", "mypy-boto3-mediapackagev2 (>=1.35.0,<1.36.0)", "mypy-boto3-mediastore (>=1.35.0,<1.36.0)", "mypy-boto3-mediastore-data (>=1.35.0,<1.36.0)", "mypy-boto3-mediatailor (>=1.35.0,<1.36.0)", "mypy-boto3-medical-imaging (>=1.35.0,<1.36.0)", "mypy-boto3-memorydb (>=1.35.0,<1.36.0)", "mypy-boto3-meteringmarketplace (>=1.35.0,<1.36.0)", "mypy-boto3-mgh (>=1.35.0,<1.36.0)", "mypy-boto3-mgn (>=1.35.0,<1.36.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.35.0,<1.36.0)", "mypy-boto3-migrationhub-config (>=1.35.0,<1.36.0)", "mypy-boto3-migrationhuborchestrator (>=1.35.0,<1.36.0)", "mypy-boto3-migrationhubstrategy (>=1.35.0,<1.36.0)", "mypy-boto3-mq (>=1.35.0,<1.36.0)", "mypy-boto3-mturk (>=1.35.0,<1.36.0)", "mypy-boto3-mwaa (>=1.35.0,<1.36.0)", "mypy-boto3-neptune (>=1.35.0,<1.36.0)", "mypy-boto3-neptune-graph (>=1.35.0,<1.36.0)", "mypy-boto3-neptunedata (>=1.35.0,<1.36.0)", "mypy-boto3-network-firewall (>=1.35.0,<1.36.0)", "mypy-boto3-networkflowmonitor (>=1.35.0,<1.36.0)", "mypy-boto3-networkmanager (>=1.35.0,<1.36.0)", "mypy-boto3-networkmonitor (>=1.35.0,<1.36.0)", "mypy-boto3-notifications (>=1.35.0,<1.36.0)", "mypy-boto3-notificationscontacts (>=1.35.0,<1.36.0)", "mypy-boto3-oam (>=1.35.0,<1.36.0)", "mypy-boto3-observabilityadmin (>=1.35.0,<1.36.0)", "mypy-boto3-omics (>=1.35.0,<1.36.0)", "mypy-boto3-opensearch (>=1.35.0,<1.36.0)", "mypy-boto3-opensearchserverless (>=1.35.0,<1.36.0)", "mypy-boto3-opsworks (>=1.35.0,<1.36.0)", "mypy-boto3-opsworkscm (>=1.35.0,<1.36.0)", "mypy-boto3-organizations (>=1.35.0,<1.36.0)", "mypy-boto3-osis (>=1.35.0,<1.36.0)", "mypy-boto3-outposts (>=1.35.0,<1.36.0)", "mypy-boto3-panorama (>=1.35.0,<1.36.0)", "mypy-boto3-partnercentral-selling (>=1.35.0,<1.36.0)", "mypy-boto3-payment-cryptography (>=1.35.0,<1.36.0)", "mypy-boto3-payment-cryptography-data (>=1.35.0,<1.36.0)", "mypy-boto3-pca-connector-ad (>=1.35.0,<1.36.0)", "mypy-boto3-pca-connector-scep (>=1.35.0,<1.36.0)", "mypy-boto3-pcs (>=1.35.0,<1.36.0)", "mypy-boto3-personalize (>=1.35.0,<1.36.0)", "mypy-boto3-personalize-events (>=1.35.0,<1.36.0)", "mypy-boto3-personalize-runtime (>=1.35.0,<1.36.0)", "mypy-boto3-pi (>=1.35.0,<1.36.0)", "mypy-boto3-pinpoint (>=1.35.0,<1.36.0)", "mypy-boto3-pinpoint-email (>=1.35.0,<1.36.0)", "mypy-boto3-pinpoint-sms-voice (>=1.35.0,<1.36.0)", "mypy-boto3-pinpoint-sms-voice-v2 (>=1.35.0,<1.36.0)", "mypy-boto3-pipes (>=1.35.0,<1.36.0)", "mypy-boto3-polly (>=1.35.0,<1.36.0)", "mypy-boto3-pricing (>=1.35.0,<1.36.0)", "mypy-boto3-privatenetworks (>=1.35.0,<1.36.0)", "mypy-boto3-proton (>=1.35.0,<1.36.0)", "mypy-boto3-qapps (>=1.35.0,<1.36.0)", "mypy-boto3-qbusiness (>=1.35.0,<1.36.0)", "mypy-boto3-qconnect (>=1.35.0,<1.36.0)", "mypy-boto3-qldb (>=1.35.0,<1.36.0)", "mypy-boto3-qldb-session (>=1.35.0,<1.36.0)", "mypy-boto3-quicksight (>=1.35.0,<1.36.0)", "mypy-boto3-ram (>=1.35.0,<1.36.0)", "mypy-boto3-rbin (>=1.35.0,<1.36.0)", "mypy-boto3-rds (>=1.35.0,<1.36.0)", "mypy-boto3-rds-data (>=1.35.0,<1.36.0)", "mypy-boto3-redshift (>=1.35.0,<1.36.0)", "mypy-boto3-redshift-data (>=1.35.0,<1.36.0)", "mypy-boto3-redshift-serverless (>=1.35.0,<1.36.0)", "mypy-boto3-rekognition (>=1.35.0,<1.36.0)", "mypy-boto3-repostspace (>=1.35.0,<1.36.0)", "mypy-boto3-resiliencehub (>=1.35.0,<1.36.0)", "mypy-boto3-resource-explorer-2 (>=1.35.0,<1.36.0)", "mypy-boto3-resource-groups (>=1.35.0,<1.36.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.35.0,<1.36.0)", "mypy-boto3-robomaker (>=1.35.0,<1.36.0)", "mypy-boto3-rolesanywhere (>=1.35.0,<1.36.0)", "mypy-boto3-route53 (>=1.35.0,<1.36.0)", "mypy-boto3-route53-recovery-cluster (>=1.35.0,<1.36.0)", "mypy-boto3-route53-recovery-control-config (>=1.35.0,<1.36.0)", "mypy-boto3-route53-recovery-readiness (>=1.35.0,<1.36.0)", "mypy-boto3-route53domains (>=1.35.0,<1.36.0)", "mypy-boto3-route53profiles (>=1.35.0,<1.36.0)", "mypy-boto3-route53resolver (>=1.35.0,<1.36.0)", "mypy-boto3-rum (>=1.35.0,<1.36.0)", "mypy-boto3-s3 (>=1.35.0,<1.36.0)", "mypy-boto3-s3control (>=1.35.0,<1.36.0)", "mypy-boto3-s3outposts (>=1.35.0,<1.36.0)", "mypy-boto3-s3tables (>=1.35.0,<1.36.0)", "mypy-boto3-sagemaker (>=1.35.0,<1.36.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.35.0,<1.36.0)", "mypy-boto3-sagemaker-edge (>=1.35.0,<1.36.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.35.0,<1.36.0)", "mypy-boto3-sagemaker-geospatial (>=1.35.0,<1.36.0)", "mypy-boto3-sagemaker-metrics (>=1.35.0,<1.36.0)", "mypy-boto3-sagemaker-runtime (>=1.35.0,<1.36.0)", "mypy-boto3-savingsplans (>=1.35.0,<1.36.0)", "mypy-boto3-scheduler (>=1.35.0,<1.36.0)", "mypy-boto3-schemas (>=1.35.0,<1.36.0)", "mypy-boto3-sdb (>=1.35.0,<1.36.0)", "mypy-boto3-secretsmanager (>=1.35.0,<1.36.0)", "mypy-boto3-security-ir (>=1.35.0,<1.36.0)", "mypy-boto3-securityhub (>=1.35.0,<1.36.0)", "mypy-boto3-securitylake (>=1.35.0,<1.36.0)", "mypy-boto3-serverlessrepo (>=1.35.0,<1.36.0)", "mypy-boto3-service-quotas (>=1.35.0,<1.36.0)", "mypy-boto3-servicecatalog (>=1.35.0,<1.36.0)", "mypy-boto3-servicecatalog-appregistry (>=1.35.0,<1.36.0)", "mypy-boto3-servicediscovery (>=1.35.0,<1.36.0)", "mypy-boto3-ses (>=1.35.0,<1.36.0)", "mypy-boto3-sesv2 (>=1.35.0,<1.36.0)", "mypy-boto3-shield (>=1.35.0,<1.36.0)", "mypy-boto3-signer (>=1.35.0,<1.36.0)", "mypy-boto3-simspaceweaver (>=1.35.0,<1.36.0)", "mypy-boto3-sms (>=1.35.0,<1.36.0)", "mypy-boto3-sms-voice (>=1.35.0,<1.36.0)", "mypy-boto3-snow-device-management (>=1.35.0,<1.36.0)", "mypy-boto3-snowball (>=1.35.0,<1.36.0)", "mypy-boto3-sns (>=1.35.0,<1.36.0)", "mypy-boto3-socialmessaging (>=1.35.0,<1.36.0)", "mypy-boto3-sqs (>=1.35.0,<1.36.0)", "mypy-boto3-ssm (>=1.35.0,<1.36.0)", "mypy-boto3-ssm-contacts (>=1.35.0,<1.36.0)", "mypy-boto3-ssm-incidents (>=1.35.0,<1.36.0)", "mypy-boto3-ssm-quicksetup (>=1.35.0,<1.36.0)", "mypy-boto3-ssm-sap (>=1.35.0,<1.36.0)", "mypy-boto3-sso (>=1.35.0,<1.36.0)", "mypy-boto3-sso-admin (>=1.35.0,<1.36.0)", "mypy-boto3-sso-oidc (>=1.35.0,<1.36.0)", "mypy-boto3-stepfunctions (>=1.35.0,<1.36.0)", "mypy-boto3-storagegateway (>=1.35.0,<1.36.0)", "mypy-boto3-sts (>=1.35.0,<1.36.0)", "mypy-boto3-supplychain (>=1.35.0,<1.36.0)", "mypy-boto3-support (>=1.35.0,<1.36.0)", "mypy-boto3-support-app (>=1.35.0,<1.36.0)", "mypy-boto3-swf (>=1.35.0,<1.36.0)", "mypy-boto3-synthetics (>=1.35.0,<1.36.0)", "mypy-boto3-taxsettings (>=1.35.0,<1.36.0)", "mypy-boto3-textract (>=1.35.0,<1.36.0)", "mypy-boto3-timestream-influxdb (>=1.35.0,<1.36.0)", "mypy-boto3-timestream-query (>=1.35.0,<1.36.0)", "mypy-boto3-timestream-write (>=1.35.0,<1.36.0)", "mypy-boto3-tnb (>=1.35.0,<1.36.0)", "mypy-boto3-transcribe (>=1.35.0,<1.36.0)", "mypy-boto3-transfer (>=1.35.0,<1.36.0)", "mypy-boto3-translate (>=1.35.0,<1.36.0)", "mypy-boto3-trustedadvisor (>=1.35.0,<1.36.0)", "mypy-boto3-verifiedpermissions (>=1.35.0,<1.36.0)", "mypy-boto3-voice-id (>=1.35.0,<1.36.0)", "mypy-boto3-vpc-lattice (>=1.35.0,<1.36.0)", "mypy-boto3-waf (>=1.35.0,<1.36.0)", "mypy-boto3-waf-regional (>=1.35.0,<1.36.0)", "mypy-boto3-wafv2 (>=1.35.0,<1.36.0)", "mypy-boto3-wellarchitected (>=1.35.0,<1.36.0)", "mypy-boto3-wisdom (>=1.35.0,<1.36.0)", "mypy-boto3-workdocs (>=1.35.0,<1.36.0)", "mypy-boto3-workmail (>=1.35.0,<1.36.0)", "mypy-boto3-workmailmessageflow (>=1.35.0,<1.36.0)", "mypy-boto3-workspaces (>=1.35.0,<1.36.0)", "mypy-boto3-workspaces-thin-client (>=1.35.0,<1.36.0)", "mypy-boto3-workspaces-web (>=1.35.0,<1.36.0)", "mypy-boto3-xray (>=1.35.0,<1.36.0)"] -amp = ["mypy-boto3-amp (>=1.35.0,<1.36.0)"] -amplify = ["mypy-boto3-amplify (>=1.35.0,<1.36.0)"] -amplifybackend = ["mypy-boto3-amplifybackend (>=1.35.0,<1.36.0)"] -amplifyuibuilder = ["mypy-boto3-amplifyuibuilder (>=1.35.0,<1.36.0)"] -apigateway = ["mypy-boto3-apigateway (>=1.35.0,<1.36.0)"] -apigatewaymanagementapi = ["mypy-boto3-apigatewaymanagementapi (>=1.35.0,<1.36.0)"] -apigatewayv2 = ["mypy-boto3-apigatewayv2 (>=1.35.0,<1.36.0)"] -appconfig = ["mypy-boto3-appconfig (>=1.35.0,<1.36.0)"] -appconfigdata = ["mypy-boto3-appconfigdata (>=1.35.0,<1.36.0)"] -appfabric = ["mypy-boto3-appfabric (>=1.35.0,<1.36.0)"] -appflow = ["mypy-boto3-appflow (>=1.35.0,<1.36.0)"] -appintegrations = ["mypy-boto3-appintegrations (>=1.35.0,<1.36.0)"] -application-autoscaling = ["mypy-boto3-application-autoscaling (>=1.35.0,<1.36.0)"] -application-insights = ["mypy-boto3-application-insights (>=1.35.0,<1.36.0)"] -application-signals = ["mypy-boto3-application-signals (>=1.35.0,<1.36.0)"] -applicationcostprofiler = ["mypy-boto3-applicationcostprofiler (>=1.35.0,<1.36.0)"] -appmesh = ["mypy-boto3-appmesh (>=1.35.0,<1.36.0)"] -apprunner = ["mypy-boto3-apprunner (>=1.35.0,<1.36.0)"] -appstream = ["mypy-boto3-appstream (>=1.35.0,<1.36.0)"] -appsync = ["mypy-boto3-appsync (>=1.35.0,<1.36.0)"] -apptest = ["mypy-boto3-apptest (>=1.35.0,<1.36.0)"] -arc-zonal-shift = ["mypy-boto3-arc-zonal-shift (>=1.35.0,<1.36.0)"] -artifact = ["mypy-boto3-artifact (>=1.35.0,<1.36.0)"] -athena = ["mypy-boto3-athena (>=1.35.0,<1.36.0)"] -auditmanager = ["mypy-boto3-auditmanager (>=1.35.0,<1.36.0)"] -autoscaling = ["mypy-boto3-autoscaling (>=1.35.0,<1.36.0)"] -autoscaling-plans = ["mypy-boto3-autoscaling-plans (>=1.35.0,<1.36.0)"] -b2bi = ["mypy-boto3-b2bi (>=1.35.0,<1.36.0)"] -backup = ["mypy-boto3-backup (>=1.35.0,<1.36.0)"] -backup-gateway = ["mypy-boto3-backup-gateway (>=1.35.0,<1.36.0)"] -backupsearch = ["mypy-boto3-backupsearch (>=1.35.0,<1.36.0)"] -batch = ["mypy-boto3-batch (>=1.35.0,<1.36.0)"] -bcm-data-exports = ["mypy-boto3-bcm-data-exports (>=1.35.0,<1.36.0)"] -bcm-pricing-calculator = ["mypy-boto3-bcm-pricing-calculator (>=1.35.0,<1.36.0)"] -bedrock = ["mypy-boto3-bedrock (>=1.35.0,<1.36.0)"] -bedrock-agent = ["mypy-boto3-bedrock-agent (>=1.35.0,<1.36.0)"] -bedrock-agent-runtime = ["mypy-boto3-bedrock-agent-runtime (>=1.35.0,<1.36.0)"] -bedrock-data-automation = ["mypy-boto3-bedrock-data-automation (>=1.35.0,<1.36.0)"] -bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime (>=1.35.0,<1.36.0)"] -bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.35.0,<1.36.0)"] -billing = ["mypy-boto3-billing (>=1.35.0,<1.36.0)"] -billingconductor = ["mypy-boto3-billingconductor (>=1.35.0,<1.36.0)"] -boto3 = ["boto3 (==1.35.99)"] -braket = ["mypy-boto3-braket (>=1.35.0,<1.36.0)"] -budgets = ["mypy-boto3-budgets (>=1.35.0,<1.36.0)"] -ce = ["mypy-boto3-ce (>=1.35.0,<1.36.0)"] -chatbot = ["mypy-boto3-chatbot (>=1.35.0,<1.36.0)"] -chime = ["mypy-boto3-chime (>=1.35.0,<1.36.0)"] -chime-sdk-identity = ["mypy-boto3-chime-sdk-identity (>=1.35.0,<1.36.0)"] -chime-sdk-media-pipelines = ["mypy-boto3-chime-sdk-media-pipelines (>=1.35.0,<1.36.0)"] -chime-sdk-meetings = ["mypy-boto3-chime-sdk-meetings (>=1.35.0,<1.36.0)"] -chime-sdk-messaging = ["mypy-boto3-chime-sdk-messaging (>=1.35.0,<1.36.0)"] -chime-sdk-voice = ["mypy-boto3-chime-sdk-voice (>=1.35.0,<1.36.0)"] -cleanrooms = ["mypy-boto3-cleanrooms (>=1.35.0,<1.36.0)"] -cleanroomsml = ["mypy-boto3-cleanroomsml (>=1.35.0,<1.36.0)"] -cloud9 = ["mypy-boto3-cloud9 (>=1.35.0,<1.36.0)"] -cloudcontrol = ["mypy-boto3-cloudcontrol (>=1.35.0,<1.36.0)"] -clouddirectory = ["mypy-boto3-clouddirectory (>=1.35.0,<1.36.0)"] -cloudformation = ["mypy-boto3-cloudformation (>=1.35.0,<1.36.0)"] -cloudfront = ["mypy-boto3-cloudfront (>=1.35.0,<1.36.0)"] -cloudfront-keyvaluestore = ["mypy-boto3-cloudfront-keyvaluestore (>=1.35.0,<1.36.0)"] -cloudhsm = ["mypy-boto3-cloudhsm (>=1.35.0,<1.36.0)"] -cloudhsmv2 = ["mypy-boto3-cloudhsmv2 (>=1.35.0,<1.36.0)"] -cloudsearch = ["mypy-boto3-cloudsearch (>=1.35.0,<1.36.0)"] -cloudsearchdomain = ["mypy-boto3-cloudsearchdomain (>=1.35.0,<1.36.0)"] -cloudtrail = ["mypy-boto3-cloudtrail (>=1.35.0,<1.36.0)"] -cloudtrail-data = ["mypy-boto3-cloudtrail-data (>=1.35.0,<1.36.0)"] -cloudwatch = ["mypy-boto3-cloudwatch (>=1.35.0,<1.36.0)"] -codeartifact = ["mypy-boto3-codeartifact (>=1.35.0,<1.36.0)"] -codebuild = ["mypy-boto3-codebuild (>=1.35.0,<1.36.0)"] -codecatalyst = ["mypy-boto3-codecatalyst (>=1.35.0,<1.36.0)"] -codecommit = ["mypy-boto3-codecommit (>=1.35.0,<1.36.0)"] -codeconnections = ["mypy-boto3-codeconnections (>=1.35.0,<1.36.0)"] -codedeploy = ["mypy-boto3-codedeploy (>=1.35.0,<1.36.0)"] -codeguru-reviewer = ["mypy-boto3-codeguru-reviewer (>=1.35.0,<1.36.0)"] -codeguru-security = ["mypy-boto3-codeguru-security (>=1.35.0,<1.36.0)"] -codeguruprofiler = ["mypy-boto3-codeguruprofiler (>=1.35.0,<1.36.0)"] -codepipeline = ["mypy-boto3-codepipeline (>=1.35.0,<1.36.0)"] -codestar-connections = ["mypy-boto3-codestar-connections (>=1.35.0,<1.36.0)"] -codestar-notifications = ["mypy-boto3-codestar-notifications (>=1.35.0,<1.36.0)"] -cognito-identity = ["mypy-boto3-cognito-identity (>=1.35.0,<1.36.0)"] -cognito-idp = ["mypy-boto3-cognito-idp (>=1.35.0,<1.36.0)"] -cognito-sync = ["mypy-boto3-cognito-sync (>=1.35.0,<1.36.0)"] -comprehend = ["mypy-boto3-comprehend (>=1.35.0,<1.36.0)"] -comprehendmedical = ["mypy-boto3-comprehendmedical (>=1.35.0,<1.36.0)"] -compute-optimizer = ["mypy-boto3-compute-optimizer (>=1.35.0,<1.36.0)"] -config = ["mypy-boto3-config (>=1.35.0,<1.36.0)"] -connect = ["mypy-boto3-connect (>=1.35.0,<1.36.0)"] -connect-contact-lens = ["mypy-boto3-connect-contact-lens (>=1.35.0,<1.36.0)"] -connectcampaigns = ["mypy-boto3-connectcampaigns (>=1.35.0,<1.36.0)"] -connectcampaignsv2 = ["mypy-boto3-connectcampaignsv2 (>=1.35.0,<1.36.0)"] -connectcases = ["mypy-boto3-connectcases (>=1.35.0,<1.36.0)"] -connectparticipant = ["mypy-boto3-connectparticipant (>=1.35.0,<1.36.0)"] -controlcatalog = ["mypy-boto3-controlcatalog (>=1.35.0,<1.36.0)"] -controltower = ["mypy-boto3-controltower (>=1.35.0,<1.36.0)"] -cost-optimization-hub = ["mypy-boto3-cost-optimization-hub (>=1.35.0,<1.36.0)"] -cur = ["mypy-boto3-cur (>=1.35.0,<1.36.0)"] -customer-profiles = ["mypy-boto3-customer-profiles (>=1.35.0,<1.36.0)"] -databrew = ["mypy-boto3-databrew (>=1.35.0,<1.36.0)"] -dataexchange = ["mypy-boto3-dataexchange (>=1.35.0,<1.36.0)"] -datapipeline = ["mypy-boto3-datapipeline (>=1.35.0,<1.36.0)"] -datasync = ["mypy-boto3-datasync (>=1.35.0,<1.36.0)"] -datazone = ["mypy-boto3-datazone (>=1.35.0,<1.36.0)"] -dax = ["mypy-boto3-dax (>=1.35.0,<1.36.0)"] -deadline = ["mypy-boto3-deadline (>=1.35.0,<1.36.0)"] -detective = ["mypy-boto3-detective (>=1.35.0,<1.36.0)"] -devicefarm = ["mypy-boto3-devicefarm (>=1.35.0,<1.36.0)"] -devops-guru = ["mypy-boto3-devops-guru (>=1.35.0,<1.36.0)"] -directconnect = ["mypy-boto3-directconnect (>=1.35.0,<1.36.0)"] -discovery = ["mypy-boto3-discovery (>=1.35.0,<1.36.0)"] -dlm = ["mypy-boto3-dlm (>=1.35.0,<1.36.0)"] -dms = ["mypy-boto3-dms (>=1.35.0,<1.36.0)"] -docdb = ["mypy-boto3-docdb (>=1.35.0,<1.36.0)"] -docdb-elastic = ["mypy-boto3-docdb-elastic (>=1.35.0,<1.36.0)"] -drs = ["mypy-boto3-drs (>=1.35.0,<1.36.0)"] -ds = ["mypy-boto3-ds (>=1.35.0,<1.36.0)"] -ds-data = ["mypy-boto3-ds-data (>=1.35.0,<1.36.0)"] -dsql = ["mypy-boto3-dsql (>=1.35.0,<1.36.0)"] -dynamodb = ["mypy-boto3-dynamodb (>=1.35.0,<1.36.0)"] -dynamodbstreams = ["mypy-boto3-dynamodbstreams (>=1.35.0,<1.36.0)"] -ebs = ["mypy-boto3-ebs (>=1.35.0,<1.36.0)"] -ec2 = ["mypy-boto3-ec2 (>=1.35.0,<1.36.0)"] -ec2-instance-connect = ["mypy-boto3-ec2-instance-connect (>=1.35.0,<1.36.0)"] -ecr = ["mypy-boto3-ecr (>=1.35.0,<1.36.0)"] -ecr-public = ["mypy-boto3-ecr-public (>=1.35.0,<1.36.0)"] -ecs = ["mypy-boto3-ecs (>=1.35.0,<1.36.0)"] -efs = ["mypy-boto3-efs (>=1.35.0,<1.36.0)"] -eks = ["mypy-boto3-eks (>=1.35.0,<1.36.0)"] -eks-auth = ["mypy-boto3-eks-auth (>=1.35.0,<1.36.0)"] -elastic-inference = ["mypy-boto3-elastic-inference (>=1.35.0,<1.36.0)"] -elasticache = ["mypy-boto3-elasticache (>=1.35.0,<1.36.0)"] -elasticbeanstalk = ["mypy-boto3-elasticbeanstalk (>=1.35.0,<1.36.0)"] -elastictranscoder = ["mypy-boto3-elastictranscoder (>=1.35.0,<1.36.0)"] -elb = ["mypy-boto3-elb (>=1.35.0,<1.36.0)"] -elbv2 = ["mypy-boto3-elbv2 (>=1.35.0,<1.36.0)"] -emr = ["mypy-boto3-emr (>=1.35.0,<1.36.0)"] -emr-containers = ["mypy-boto3-emr-containers (>=1.35.0,<1.36.0)"] -emr-serverless = ["mypy-boto3-emr-serverless (>=1.35.0,<1.36.0)"] -entityresolution = ["mypy-boto3-entityresolution (>=1.35.0,<1.36.0)"] -es = ["mypy-boto3-es (>=1.35.0,<1.36.0)"] -essential = ["mypy-boto3-cloudformation (>=1.35.0,<1.36.0)", "mypy-boto3-dynamodb (>=1.35.0,<1.36.0)", "mypy-boto3-ec2 (>=1.35.0,<1.36.0)", "mypy-boto3-lambda (>=1.35.0,<1.36.0)", "mypy-boto3-rds (>=1.35.0,<1.36.0)", "mypy-boto3-s3 (>=1.35.0,<1.36.0)", "mypy-boto3-sqs (>=1.35.0,<1.36.0)"] -events = ["mypy-boto3-events (>=1.35.0,<1.36.0)"] -evidently = ["mypy-boto3-evidently (>=1.35.0,<1.36.0)"] -finspace = ["mypy-boto3-finspace (>=1.35.0,<1.36.0)"] -finspace-data = ["mypy-boto3-finspace-data (>=1.35.0,<1.36.0)"] -firehose = ["mypy-boto3-firehose (>=1.35.0,<1.36.0)"] -fis = ["mypy-boto3-fis (>=1.35.0,<1.36.0)"] -fms = ["mypy-boto3-fms (>=1.35.0,<1.36.0)"] -forecast = ["mypy-boto3-forecast (>=1.35.0,<1.36.0)"] -forecastquery = ["mypy-boto3-forecastquery (>=1.35.0,<1.36.0)"] -frauddetector = ["mypy-boto3-frauddetector (>=1.35.0,<1.36.0)"] -freetier = ["mypy-boto3-freetier (>=1.35.0,<1.36.0)"] -fsx = ["mypy-boto3-fsx (>=1.35.0,<1.36.0)"] -full = ["boto3-stubs-full (>=1.35.0,<1.36.0)"] -gamelift = ["mypy-boto3-gamelift (>=1.35.0,<1.36.0)"] -geo-maps = ["mypy-boto3-geo-maps (>=1.35.0,<1.36.0)"] -geo-places = ["mypy-boto3-geo-places (>=1.35.0,<1.36.0)"] -geo-routes = ["mypy-boto3-geo-routes (>=1.35.0,<1.36.0)"] -glacier = ["mypy-boto3-glacier (>=1.35.0,<1.36.0)"] -globalaccelerator = ["mypy-boto3-globalaccelerator (>=1.35.0,<1.36.0)"] -glue = ["mypy-boto3-glue (>=1.35.0,<1.36.0)"] -grafana = ["mypy-boto3-grafana (>=1.35.0,<1.36.0)"] -greengrass = ["mypy-boto3-greengrass (>=1.35.0,<1.36.0)"] -greengrassv2 = ["mypy-boto3-greengrassv2 (>=1.35.0,<1.36.0)"] -groundstation = ["mypy-boto3-groundstation (>=1.35.0,<1.36.0)"] -guardduty = ["mypy-boto3-guardduty (>=1.35.0,<1.36.0)"] -health = ["mypy-boto3-health (>=1.35.0,<1.36.0)"] -healthlake = ["mypy-boto3-healthlake (>=1.35.0,<1.36.0)"] -iam = ["mypy-boto3-iam (>=1.35.0,<1.36.0)"] -identitystore = ["mypy-boto3-identitystore (>=1.35.0,<1.36.0)"] -imagebuilder = ["mypy-boto3-imagebuilder (>=1.35.0,<1.36.0)"] -importexport = ["mypy-boto3-importexport (>=1.35.0,<1.36.0)"] -inspector = ["mypy-boto3-inspector (>=1.35.0,<1.36.0)"] -inspector-scan = ["mypy-boto3-inspector-scan (>=1.35.0,<1.36.0)"] -inspector2 = ["mypy-boto3-inspector2 (>=1.35.0,<1.36.0)"] -internetmonitor = ["mypy-boto3-internetmonitor (>=1.35.0,<1.36.0)"] -invoicing = ["mypy-boto3-invoicing (>=1.35.0,<1.36.0)"] -iot = ["mypy-boto3-iot (>=1.35.0,<1.36.0)"] -iot-data = ["mypy-boto3-iot-data (>=1.35.0,<1.36.0)"] -iot-jobs-data = ["mypy-boto3-iot-jobs-data (>=1.35.0,<1.36.0)"] -iotanalytics = ["mypy-boto3-iotanalytics (>=1.35.0,<1.36.0)"] -iotdeviceadvisor = ["mypy-boto3-iotdeviceadvisor (>=1.35.0,<1.36.0)"] -iotevents = ["mypy-boto3-iotevents (>=1.35.0,<1.36.0)"] -iotevents-data = ["mypy-boto3-iotevents-data (>=1.35.0,<1.36.0)"] -iotfleethub = ["mypy-boto3-iotfleethub (>=1.35.0,<1.36.0)"] -iotfleetwise = ["mypy-boto3-iotfleetwise (>=1.35.0,<1.36.0)"] -iotsecuretunneling = ["mypy-boto3-iotsecuretunneling (>=1.35.0,<1.36.0)"] -iotsitewise = ["mypy-boto3-iotsitewise (>=1.35.0,<1.36.0)"] -iotthingsgraph = ["mypy-boto3-iotthingsgraph (>=1.35.0,<1.36.0)"] -iottwinmaker = ["mypy-boto3-iottwinmaker (>=1.35.0,<1.36.0)"] -iotwireless = ["mypy-boto3-iotwireless (>=1.35.0,<1.36.0)"] -ivs = ["mypy-boto3-ivs (>=1.35.0,<1.36.0)"] -ivs-realtime = ["mypy-boto3-ivs-realtime (>=1.35.0,<1.36.0)"] -ivschat = ["mypy-boto3-ivschat (>=1.35.0,<1.36.0)"] -kafka = ["mypy-boto3-kafka (>=1.35.0,<1.36.0)"] -kafkaconnect = ["mypy-boto3-kafkaconnect (>=1.35.0,<1.36.0)"] -kendra = ["mypy-boto3-kendra (>=1.35.0,<1.36.0)"] -kendra-ranking = ["mypy-boto3-kendra-ranking (>=1.35.0,<1.36.0)"] -keyspaces = ["mypy-boto3-keyspaces (>=1.35.0,<1.36.0)"] -kinesis = ["mypy-boto3-kinesis (>=1.35.0,<1.36.0)"] -kinesis-video-archived-media = ["mypy-boto3-kinesis-video-archived-media (>=1.35.0,<1.36.0)"] -kinesis-video-media = ["mypy-boto3-kinesis-video-media (>=1.35.0,<1.36.0)"] -kinesis-video-signaling = ["mypy-boto3-kinesis-video-signaling (>=1.35.0,<1.36.0)"] -kinesis-video-webrtc-storage = ["mypy-boto3-kinesis-video-webrtc-storage (>=1.35.0,<1.36.0)"] -kinesisanalytics = ["mypy-boto3-kinesisanalytics (>=1.35.0,<1.36.0)"] -kinesisanalyticsv2 = ["mypy-boto3-kinesisanalyticsv2 (>=1.35.0,<1.36.0)"] -kinesisvideo = ["mypy-boto3-kinesisvideo (>=1.35.0,<1.36.0)"] -kms = ["mypy-boto3-kms (>=1.35.0,<1.36.0)"] -lakeformation = ["mypy-boto3-lakeformation (>=1.35.0,<1.36.0)"] -lambda = ["mypy-boto3-lambda (>=1.35.0,<1.36.0)"] -launch-wizard = ["mypy-boto3-launch-wizard (>=1.35.0,<1.36.0)"] -lex-models = ["mypy-boto3-lex-models (>=1.35.0,<1.36.0)"] -lex-runtime = ["mypy-boto3-lex-runtime (>=1.35.0,<1.36.0)"] -lexv2-models = ["mypy-boto3-lexv2-models (>=1.35.0,<1.36.0)"] -lexv2-runtime = ["mypy-boto3-lexv2-runtime (>=1.35.0,<1.36.0)"] -license-manager = ["mypy-boto3-license-manager (>=1.35.0,<1.36.0)"] -license-manager-linux-subscriptions = ["mypy-boto3-license-manager-linux-subscriptions (>=1.35.0,<1.36.0)"] -license-manager-user-subscriptions = ["mypy-boto3-license-manager-user-subscriptions (>=1.35.0,<1.36.0)"] -lightsail = ["mypy-boto3-lightsail (>=1.35.0,<1.36.0)"] -location = ["mypy-boto3-location (>=1.35.0,<1.36.0)"] -logs = ["mypy-boto3-logs (>=1.35.0,<1.36.0)"] -lookoutequipment = ["mypy-boto3-lookoutequipment (>=1.35.0,<1.36.0)"] -lookoutmetrics = ["mypy-boto3-lookoutmetrics (>=1.35.0,<1.36.0)"] -lookoutvision = ["mypy-boto3-lookoutvision (>=1.35.0,<1.36.0)"] -m2 = ["mypy-boto3-m2 (>=1.35.0,<1.36.0)"] -machinelearning = ["mypy-boto3-machinelearning (>=1.35.0,<1.36.0)"] -macie2 = ["mypy-boto3-macie2 (>=1.35.0,<1.36.0)"] -mailmanager = ["mypy-boto3-mailmanager (>=1.35.0,<1.36.0)"] -managedblockchain = ["mypy-boto3-managedblockchain (>=1.35.0,<1.36.0)"] -managedblockchain-query = ["mypy-boto3-managedblockchain-query (>=1.35.0,<1.36.0)"] -marketplace-agreement = ["mypy-boto3-marketplace-agreement (>=1.35.0,<1.36.0)"] -marketplace-catalog = ["mypy-boto3-marketplace-catalog (>=1.35.0,<1.36.0)"] -marketplace-deployment = ["mypy-boto3-marketplace-deployment (>=1.35.0,<1.36.0)"] -marketplace-entitlement = ["mypy-boto3-marketplace-entitlement (>=1.35.0,<1.36.0)"] -marketplace-reporting = ["mypy-boto3-marketplace-reporting (>=1.35.0,<1.36.0)"] -marketplacecommerceanalytics = ["mypy-boto3-marketplacecommerceanalytics (>=1.35.0,<1.36.0)"] -mediaconnect = ["mypy-boto3-mediaconnect (>=1.35.0,<1.36.0)"] -mediaconvert = ["mypy-boto3-mediaconvert (>=1.35.0,<1.36.0)"] -medialive = ["mypy-boto3-medialive (>=1.35.0,<1.36.0)"] -mediapackage = ["mypy-boto3-mediapackage (>=1.35.0,<1.36.0)"] -mediapackage-vod = ["mypy-boto3-mediapackage-vod (>=1.35.0,<1.36.0)"] -mediapackagev2 = ["mypy-boto3-mediapackagev2 (>=1.35.0,<1.36.0)"] -mediastore = ["mypy-boto3-mediastore (>=1.35.0,<1.36.0)"] -mediastore-data = ["mypy-boto3-mediastore-data (>=1.35.0,<1.36.0)"] -mediatailor = ["mypy-boto3-mediatailor (>=1.35.0,<1.36.0)"] -medical-imaging = ["mypy-boto3-medical-imaging (>=1.35.0,<1.36.0)"] -memorydb = ["mypy-boto3-memorydb (>=1.35.0,<1.36.0)"] -meteringmarketplace = ["mypy-boto3-meteringmarketplace (>=1.35.0,<1.36.0)"] -mgh = ["mypy-boto3-mgh (>=1.35.0,<1.36.0)"] -mgn = ["mypy-boto3-mgn (>=1.35.0,<1.36.0)"] -migration-hub-refactor-spaces = ["mypy-boto3-migration-hub-refactor-spaces (>=1.35.0,<1.36.0)"] -migrationhub-config = ["mypy-boto3-migrationhub-config (>=1.35.0,<1.36.0)"] -migrationhuborchestrator = ["mypy-boto3-migrationhuborchestrator (>=1.35.0,<1.36.0)"] -migrationhubstrategy = ["mypy-boto3-migrationhubstrategy (>=1.35.0,<1.36.0)"] -mq = ["mypy-boto3-mq (>=1.35.0,<1.36.0)"] -mturk = ["mypy-boto3-mturk (>=1.35.0,<1.36.0)"] -mwaa = ["mypy-boto3-mwaa (>=1.35.0,<1.36.0)"] -neptune = ["mypy-boto3-neptune (>=1.35.0,<1.36.0)"] -neptune-graph = ["mypy-boto3-neptune-graph (>=1.35.0,<1.36.0)"] -neptunedata = ["mypy-boto3-neptunedata (>=1.35.0,<1.36.0)"] -network-firewall = ["mypy-boto3-network-firewall (>=1.35.0,<1.36.0)"] -networkflowmonitor = ["mypy-boto3-networkflowmonitor (>=1.35.0,<1.36.0)"] -networkmanager = ["mypy-boto3-networkmanager (>=1.35.0,<1.36.0)"] -networkmonitor = ["mypy-boto3-networkmonitor (>=1.35.0,<1.36.0)"] -notifications = ["mypy-boto3-notifications (>=1.35.0,<1.36.0)"] -notificationscontacts = ["mypy-boto3-notificationscontacts (>=1.35.0,<1.36.0)"] -oam = ["mypy-boto3-oam (>=1.35.0,<1.36.0)"] -observabilityadmin = ["mypy-boto3-observabilityadmin (>=1.35.0,<1.36.0)"] -omics = ["mypy-boto3-omics (>=1.35.0,<1.36.0)"] -opensearch = ["mypy-boto3-opensearch (>=1.35.0,<1.36.0)"] -opensearchserverless = ["mypy-boto3-opensearchserverless (>=1.35.0,<1.36.0)"] -opsworks = ["mypy-boto3-opsworks (>=1.35.0,<1.36.0)"] -opsworkscm = ["mypy-boto3-opsworkscm (>=1.35.0,<1.36.0)"] -organizations = ["mypy-boto3-organizations (>=1.35.0,<1.36.0)"] -osis = ["mypy-boto3-osis (>=1.35.0,<1.36.0)"] -outposts = ["mypy-boto3-outposts (>=1.35.0,<1.36.0)"] -panorama = ["mypy-boto3-panorama (>=1.35.0,<1.36.0)"] -partnercentral-selling = ["mypy-boto3-partnercentral-selling (>=1.35.0,<1.36.0)"] -payment-cryptography = ["mypy-boto3-payment-cryptography (>=1.35.0,<1.36.0)"] -payment-cryptography-data = ["mypy-boto3-payment-cryptography-data (>=1.35.0,<1.36.0)"] -pca-connector-ad = ["mypy-boto3-pca-connector-ad (>=1.35.0,<1.36.0)"] -pca-connector-scep = ["mypy-boto3-pca-connector-scep (>=1.35.0,<1.36.0)"] -pcs = ["mypy-boto3-pcs (>=1.35.0,<1.36.0)"] -personalize = ["mypy-boto3-personalize (>=1.35.0,<1.36.0)"] -personalize-events = ["mypy-boto3-personalize-events (>=1.35.0,<1.36.0)"] -personalize-runtime = ["mypy-boto3-personalize-runtime (>=1.35.0,<1.36.0)"] -pi = ["mypy-boto3-pi (>=1.35.0,<1.36.0)"] -pinpoint = ["mypy-boto3-pinpoint (>=1.35.0,<1.36.0)"] -pinpoint-email = ["mypy-boto3-pinpoint-email (>=1.35.0,<1.36.0)"] -pinpoint-sms-voice = ["mypy-boto3-pinpoint-sms-voice (>=1.35.0,<1.36.0)"] -pinpoint-sms-voice-v2 = ["mypy-boto3-pinpoint-sms-voice-v2 (>=1.35.0,<1.36.0)"] -pipes = ["mypy-boto3-pipes (>=1.35.0,<1.36.0)"] -polly = ["mypy-boto3-polly (>=1.35.0,<1.36.0)"] -pricing = ["mypy-boto3-pricing (>=1.35.0,<1.36.0)"] -privatenetworks = ["mypy-boto3-privatenetworks (>=1.35.0,<1.36.0)"] -proton = ["mypy-boto3-proton (>=1.35.0,<1.36.0)"] -qapps = ["mypy-boto3-qapps (>=1.35.0,<1.36.0)"] -qbusiness = ["mypy-boto3-qbusiness (>=1.35.0,<1.36.0)"] -qconnect = ["mypy-boto3-qconnect (>=1.35.0,<1.36.0)"] -qldb = ["mypy-boto3-qldb (>=1.35.0,<1.36.0)"] -qldb-session = ["mypy-boto3-qldb-session (>=1.35.0,<1.36.0)"] -quicksight = ["mypy-boto3-quicksight (>=1.35.0,<1.36.0)"] -ram = ["mypy-boto3-ram (>=1.35.0,<1.36.0)"] -rbin = ["mypy-boto3-rbin (>=1.35.0,<1.36.0)"] -rds = ["mypy-boto3-rds (>=1.35.0,<1.36.0)"] -rds-data = ["mypy-boto3-rds-data (>=1.35.0,<1.36.0)"] -redshift = ["mypy-boto3-redshift (>=1.35.0,<1.36.0)"] -redshift-data = ["mypy-boto3-redshift-data (>=1.35.0,<1.36.0)"] -redshift-serverless = ["mypy-boto3-redshift-serverless (>=1.35.0,<1.36.0)"] -rekognition = ["mypy-boto3-rekognition (>=1.35.0,<1.36.0)"] -repostspace = ["mypy-boto3-repostspace (>=1.35.0,<1.36.0)"] -resiliencehub = ["mypy-boto3-resiliencehub (>=1.35.0,<1.36.0)"] -resource-explorer-2 = ["mypy-boto3-resource-explorer-2 (>=1.35.0,<1.36.0)"] -resource-groups = ["mypy-boto3-resource-groups (>=1.35.0,<1.36.0)"] -resourcegroupstaggingapi = ["mypy-boto3-resourcegroupstaggingapi (>=1.35.0,<1.36.0)"] -robomaker = ["mypy-boto3-robomaker (>=1.35.0,<1.36.0)"] -rolesanywhere = ["mypy-boto3-rolesanywhere (>=1.35.0,<1.36.0)"] -route53 = ["mypy-boto3-route53 (>=1.35.0,<1.36.0)"] -route53-recovery-cluster = ["mypy-boto3-route53-recovery-cluster (>=1.35.0,<1.36.0)"] -route53-recovery-control-config = ["mypy-boto3-route53-recovery-control-config (>=1.35.0,<1.36.0)"] -route53-recovery-readiness = ["mypy-boto3-route53-recovery-readiness (>=1.35.0,<1.36.0)"] -route53domains = ["mypy-boto3-route53domains (>=1.35.0,<1.36.0)"] -route53profiles = ["mypy-boto3-route53profiles (>=1.35.0,<1.36.0)"] -route53resolver = ["mypy-boto3-route53resolver (>=1.35.0,<1.36.0)"] -rum = ["mypy-boto3-rum (>=1.35.0,<1.36.0)"] -s3 = ["mypy-boto3-s3 (>=1.35.0,<1.36.0)"] -s3control = ["mypy-boto3-s3control (>=1.35.0,<1.36.0)"] -s3outposts = ["mypy-boto3-s3outposts (>=1.35.0,<1.36.0)"] -s3tables = ["mypy-boto3-s3tables (>=1.35.0,<1.36.0)"] -sagemaker = ["mypy-boto3-sagemaker (>=1.35.0,<1.36.0)"] -sagemaker-a2i-runtime = ["mypy-boto3-sagemaker-a2i-runtime (>=1.35.0,<1.36.0)"] -sagemaker-edge = ["mypy-boto3-sagemaker-edge (>=1.35.0,<1.36.0)"] -sagemaker-featurestore-runtime = ["mypy-boto3-sagemaker-featurestore-runtime (>=1.35.0,<1.36.0)"] -sagemaker-geospatial = ["mypy-boto3-sagemaker-geospatial (>=1.35.0,<1.36.0)"] -sagemaker-metrics = ["mypy-boto3-sagemaker-metrics (>=1.35.0,<1.36.0)"] -sagemaker-runtime = ["mypy-boto3-sagemaker-runtime (>=1.35.0,<1.36.0)"] -savingsplans = ["mypy-boto3-savingsplans (>=1.35.0,<1.36.0)"] -scheduler = ["mypy-boto3-scheduler (>=1.35.0,<1.36.0)"] -schemas = ["mypy-boto3-schemas (>=1.35.0,<1.36.0)"] -sdb = ["mypy-boto3-sdb (>=1.35.0,<1.36.0)"] -secretsmanager = ["mypy-boto3-secretsmanager (>=1.35.0,<1.36.0)"] -security-ir = ["mypy-boto3-security-ir (>=1.35.0,<1.36.0)"] -securityhub = ["mypy-boto3-securityhub (>=1.35.0,<1.36.0)"] -securitylake = ["mypy-boto3-securitylake (>=1.35.0,<1.36.0)"] -serverlessrepo = ["mypy-boto3-serverlessrepo (>=1.35.0,<1.36.0)"] -service-quotas = ["mypy-boto3-service-quotas (>=1.35.0,<1.36.0)"] -servicecatalog = ["mypy-boto3-servicecatalog (>=1.35.0,<1.36.0)"] -servicecatalog-appregistry = ["mypy-boto3-servicecatalog-appregistry (>=1.35.0,<1.36.0)"] -servicediscovery = ["mypy-boto3-servicediscovery (>=1.35.0,<1.36.0)"] -ses = ["mypy-boto3-ses (>=1.35.0,<1.36.0)"] -sesv2 = ["mypy-boto3-sesv2 (>=1.35.0,<1.36.0)"] -shield = ["mypy-boto3-shield (>=1.35.0,<1.36.0)"] -signer = ["mypy-boto3-signer (>=1.35.0,<1.36.0)"] -simspaceweaver = ["mypy-boto3-simspaceweaver (>=1.35.0,<1.36.0)"] -sms = ["mypy-boto3-sms (>=1.35.0,<1.36.0)"] -sms-voice = ["mypy-boto3-sms-voice (>=1.35.0,<1.36.0)"] -snow-device-management = ["mypy-boto3-snow-device-management (>=1.35.0,<1.36.0)"] -snowball = ["mypy-boto3-snowball (>=1.35.0,<1.36.0)"] -sns = ["mypy-boto3-sns (>=1.35.0,<1.36.0)"] -socialmessaging = ["mypy-boto3-socialmessaging (>=1.35.0,<1.36.0)"] -sqs = ["mypy-boto3-sqs (>=1.35.0,<1.36.0)"] -ssm = ["mypy-boto3-ssm (>=1.35.0,<1.36.0)"] -ssm-contacts = ["mypy-boto3-ssm-contacts (>=1.35.0,<1.36.0)"] -ssm-incidents = ["mypy-boto3-ssm-incidents (>=1.35.0,<1.36.0)"] -ssm-quicksetup = ["mypy-boto3-ssm-quicksetup (>=1.35.0,<1.36.0)"] -ssm-sap = ["mypy-boto3-ssm-sap (>=1.35.0,<1.36.0)"] -sso = ["mypy-boto3-sso (>=1.35.0,<1.36.0)"] -sso-admin = ["mypy-boto3-sso-admin (>=1.35.0,<1.36.0)"] -sso-oidc = ["mypy-boto3-sso-oidc (>=1.35.0,<1.36.0)"] -stepfunctions = ["mypy-boto3-stepfunctions (>=1.35.0,<1.36.0)"] -storagegateway = ["mypy-boto3-storagegateway (>=1.35.0,<1.36.0)"] -sts = ["mypy-boto3-sts (>=1.35.0,<1.36.0)"] -supplychain = ["mypy-boto3-supplychain (>=1.35.0,<1.36.0)"] -support = ["mypy-boto3-support (>=1.35.0,<1.36.0)"] -support-app = ["mypy-boto3-support-app (>=1.35.0,<1.36.0)"] -swf = ["mypy-boto3-swf (>=1.35.0,<1.36.0)"] -synthetics = ["mypy-boto3-synthetics (>=1.35.0,<1.36.0)"] -taxsettings = ["mypy-boto3-taxsettings (>=1.35.0,<1.36.0)"] -textract = ["mypy-boto3-textract (>=1.35.0,<1.36.0)"] -timestream-influxdb = ["mypy-boto3-timestream-influxdb (>=1.35.0,<1.36.0)"] -timestream-query = ["mypy-boto3-timestream-query (>=1.35.0,<1.36.0)"] -timestream-write = ["mypy-boto3-timestream-write (>=1.35.0,<1.36.0)"] -tnb = ["mypy-boto3-tnb (>=1.35.0,<1.36.0)"] -transcribe = ["mypy-boto3-transcribe (>=1.35.0,<1.36.0)"] -transfer = ["mypy-boto3-transfer (>=1.35.0,<1.36.0)"] -translate = ["mypy-boto3-translate (>=1.35.0,<1.36.0)"] -trustedadvisor = ["mypy-boto3-trustedadvisor (>=1.35.0,<1.36.0)"] -verifiedpermissions = ["mypy-boto3-verifiedpermissions (>=1.35.0,<1.36.0)"] -voice-id = ["mypy-boto3-voice-id (>=1.35.0,<1.36.0)"] -vpc-lattice = ["mypy-boto3-vpc-lattice (>=1.35.0,<1.36.0)"] -waf = ["mypy-boto3-waf (>=1.35.0,<1.36.0)"] -waf-regional = ["mypy-boto3-waf-regional (>=1.35.0,<1.36.0)"] -wafv2 = ["mypy-boto3-wafv2 (>=1.35.0,<1.36.0)"] -wellarchitected = ["mypy-boto3-wellarchitected (>=1.35.0,<1.36.0)"] -wisdom = ["mypy-boto3-wisdom (>=1.35.0,<1.36.0)"] -workdocs = ["mypy-boto3-workdocs (>=1.35.0,<1.36.0)"] -workmail = ["mypy-boto3-workmail (>=1.35.0,<1.36.0)"] -workmailmessageflow = ["mypy-boto3-workmailmessageflow (>=1.35.0,<1.36.0)"] -workspaces = ["mypy-boto3-workspaces (>=1.35.0,<1.36.0)"] -workspaces-thin-client = ["mypy-boto3-workspaces-thin-client (>=1.35.0,<1.36.0)"] -workspaces-web = ["mypy-boto3-workspaces-web (>=1.35.0,<1.36.0)"] -xray = ["mypy-boto3-xray (>=1.35.0,<1.36.0)"] +accessanalyzer = ["mypy-boto3-accessanalyzer (>=1.36.0,<1.37.0)"] +account = ["mypy-boto3-account (>=1.36.0,<1.37.0)"] +acm = ["mypy-boto3-acm (>=1.36.0,<1.37.0)"] +acm-pca = ["mypy-boto3-acm-pca (>=1.36.0,<1.37.0)"] +all = ["mypy-boto3-accessanalyzer (>=1.36.0,<1.37.0)", "mypy-boto3-account (>=1.36.0,<1.37.0)", "mypy-boto3-acm (>=1.36.0,<1.37.0)", "mypy-boto3-acm-pca (>=1.36.0,<1.37.0)", "mypy-boto3-amp (>=1.36.0,<1.37.0)", "mypy-boto3-amplify (>=1.36.0,<1.37.0)", "mypy-boto3-amplifybackend (>=1.36.0,<1.37.0)", "mypy-boto3-amplifyuibuilder (>=1.36.0,<1.37.0)", "mypy-boto3-apigateway (>=1.36.0,<1.37.0)", "mypy-boto3-apigatewaymanagementapi (>=1.36.0,<1.37.0)", "mypy-boto3-apigatewayv2 (>=1.36.0,<1.37.0)", "mypy-boto3-appconfig (>=1.36.0,<1.37.0)", "mypy-boto3-appconfigdata (>=1.36.0,<1.37.0)", "mypy-boto3-appfabric (>=1.36.0,<1.37.0)", "mypy-boto3-appflow (>=1.36.0,<1.37.0)", "mypy-boto3-appintegrations (>=1.36.0,<1.37.0)", "mypy-boto3-application-autoscaling (>=1.36.0,<1.37.0)", "mypy-boto3-application-insights (>=1.36.0,<1.37.0)", "mypy-boto3-application-signals (>=1.36.0,<1.37.0)", "mypy-boto3-applicationcostprofiler (>=1.36.0,<1.37.0)", "mypy-boto3-appmesh (>=1.36.0,<1.37.0)", "mypy-boto3-apprunner (>=1.36.0,<1.37.0)", "mypy-boto3-appstream (>=1.36.0,<1.37.0)", "mypy-boto3-appsync (>=1.36.0,<1.37.0)", "mypy-boto3-apptest (>=1.36.0,<1.37.0)", "mypy-boto3-arc-zonal-shift (>=1.36.0,<1.37.0)", "mypy-boto3-artifact (>=1.36.0,<1.37.0)", "mypy-boto3-athena (>=1.36.0,<1.37.0)", "mypy-boto3-auditmanager (>=1.36.0,<1.37.0)", "mypy-boto3-autoscaling (>=1.36.0,<1.37.0)", "mypy-boto3-autoscaling-plans (>=1.36.0,<1.37.0)", "mypy-boto3-b2bi (>=1.36.0,<1.37.0)", "mypy-boto3-backup (>=1.36.0,<1.37.0)", "mypy-boto3-backup-gateway (>=1.36.0,<1.37.0)", "mypy-boto3-backupsearch (>=1.36.0,<1.37.0)", "mypy-boto3-batch (>=1.36.0,<1.37.0)", "mypy-boto3-bcm-data-exports (>=1.36.0,<1.37.0)", "mypy-boto3-bcm-pricing-calculator (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-agent (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-agent-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-data-automation (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-data-automation-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-billing (>=1.36.0,<1.37.0)", "mypy-boto3-billingconductor (>=1.36.0,<1.37.0)", "mypy-boto3-braket (>=1.36.0,<1.37.0)", "mypy-boto3-budgets (>=1.36.0,<1.37.0)", "mypy-boto3-ce (>=1.36.0,<1.37.0)", "mypy-boto3-chatbot (>=1.36.0,<1.37.0)", "mypy-boto3-chime (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-identity (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-media-pipelines (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-meetings (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-messaging (>=1.36.0,<1.37.0)", "mypy-boto3-chime-sdk-voice (>=1.36.0,<1.37.0)", "mypy-boto3-cleanrooms (>=1.36.0,<1.37.0)", "mypy-boto3-cleanroomsml (>=1.36.0,<1.37.0)", "mypy-boto3-cloud9 (>=1.36.0,<1.37.0)", "mypy-boto3-cloudcontrol (>=1.36.0,<1.37.0)", "mypy-boto3-clouddirectory (>=1.36.0,<1.37.0)", "mypy-boto3-cloudformation (>=1.36.0,<1.37.0)", "mypy-boto3-cloudfront (>=1.36.0,<1.37.0)", "mypy-boto3-cloudfront-keyvaluestore (>=1.36.0,<1.37.0)", "mypy-boto3-cloudhsm (>=1.36.0,<1.37.0)", "mypy-boto3-cloudhsmv2 (>=1.36.0,<1.37.0)", "mypy-boto3-cloudsearch (>=1.36.0,<1.37.0)", "mypy-boto3-cloudsearchdomain (>=1.36.0,<1.37.0)", "mypy-boto3-cloudtrail (>=1.36.0,<1.37.0)", "mypy-boto3-cloudtrail-data (>=1.36.0,<1.37.0)", "mypy-boto3-cloudwatch (>=1.36.0,<1.37.0)", "mypy-boto3-codeartifact (>=1.36.0,<1.37.0)", "mypy-boto3-codebuild (>=1.36.0,<1.37.0)", "mypy-boto3-codecatalyst (>=1.36.0,<1.37.0)", "mypy-boto3-codecommit (>=1.36.0,<1.37.0)", "mypy-boto3-codeconnections (>=1.36.0,<1.37.0)", "mypy-boto3-codedeploy (>=1.36.0,<1.37.0)", "mypy-boto3-codeguru-reviewer (>=1.36.0,<1.37.0)", "mypy-boto3-codeguru-security (>=1.36.0,<1.37.0)", "mypy-boto3-codeguruprofiler (>=1.36.0,<1.37.0)", "mypy-boto3-codepipeline (>=1.36.0,<1.37.0)", "mypy-boto3-codestar-connections (>=1.36.0,<1.37.0)", "mypy-boto3-codestar-notifications (>=1.36.0,<1.37.0)", "mypy-boto3-cognito-identity (>=1.36.0,<1.37.0)", "mypy-boto3-cognito-idp (>=1.36.0,<1.37.0)", "mypy-boto3-cognito-sync (>=1.36.0,<1.37.0)", "mypy-boto3-comprehend (>=1.36.0,<1.37.0)", "mypy-boto3-comprehendmedical (>=1.36.0,<1.37.0)", "mypy-boto3-compute-optimizer (>=1.36.0,<1.37.0)", "mypy-boto3-config (>=1.36.0,<1.37.0)", "mypy-boto3-connect (>=1.36.0,<1.37.0)", "mypy-boto3-connect-contact-lens (>=1.36.0,<1.37.0)", "mypy-boto3-connectcampaigns (>=1.36.0,<1.37.0)", "mypy-boto3-connectcampaignsv2 (>=1.36.0,<1.37.0)", "mypy-boto3-connectcases (>=1.36.0,<1.37.0)", "mypy-boto3-connectparticipant (>=1.36.0,<1.37.0)", "mypy-boto3-controlcatalog (>=1.36.0,<1.37.0)", "mypy-boto3-controltower (>=1.36.0,<1.37.0)", "mypy-boto3-cost-optimization-hub (>=1.36.0,<1.37.0)", "mypy-boto3-cur (>=1.36.0,<1.37.0)", "mypy-boto3-customer-profiles (>=1.36.0,<1.37.0)", "mypy-boto3-databrew (>=1.36.0,<1.37.0)", "mypy-boto3-dataexchange (>=1.36.0,<1.37.0)", "mypy-boto3-datapipeline (>=1.36.0,<1.37.0)", "mypy-boto3-datasync (>=1.36.0,<1.37.0)", "mypy-boto3-datazone (>=1.36.0,<1.37.0)", "mypy-boto3-dax (>=1.36.0,<1.37.0)", "mypy-boto3-deadline (>=1.36.0,<1.37.0)", "mypy-boto3-detective (>=1.36.0,<1.37.0)", "mypy-boto3-devicefarm (>=1.36.0,<1.37.0)", "mypy-boto3-devops-guru (>=1.36.0,<1.37.0)", "mypy-boto3-directconnect (>=1.36.0,<1.37.0)", "mypy-boto3-discovery (>=1.36.0,<1.37.0)", "mypy-boto3-dlm (>=1.36.0,<1.37.0)", "mypy-boto3-dms (>=1.36.0,<1.37.0)", "mypy-boto3-docdb (>=1.36.0,<1.37.0)", "mypy-boto3-docdb-elastic (>=1.36.0,<1.37.0)", "mypy-boto3-drs (>=1.36.0,<1.37.0)", "mypy-boto3-ds (>=1.36.0,<1.37.0)", "mypy-boto3-ds-data (>=1.36.0,<1.37.0)", "mypy-boto3-dsql (>=1.36.0,<1.37.0)", "mypy-boto3-dynamodb (>=1.36.0,<1.37.0)", "mypy-boto3-dynamodbstreams (>=1.36.0,<1.37.0)", "mypy-boto3-ebs (>=1.36.0,<1.37.0)", "mypy-boto3-ec2 (>=1.36.0,<1.37.0)", "mypy-boto3-ec2-instance-connect (>=1.36.0,<1.37.0)", "mypy-boto3-ecr (>=1.36.0,<1.37.0)", "mypy-boto3-ecr-public (>=1.36.0,<1.37.0)", "mypy-boto3-ecs (>=1.36.0,<1.37.0)", "mypy-boto3-efs (>=1.36.0,<1.37.0)", "mypy-boto3-eks (>=1.36.0,<1.37.0)", "mypy-boto3-eks-auth (>=1.36.0,<1.37.0)", "mypy-boto3-elastic-inference (>=1.36.0,<1.37.0)", "mypy-boto3-elasticache (>=1.36.0,<1.37.0)", "mypy-boto3-elasticbeanstalk (>=1.36.0,<1.37.0)", "mypy-boto3-elastictranscoder (>=1.36.0,<1.37.0)", "mypy-boto3-elb (>=1.36.0,<1.37.0)", "mypy-boto3-elbv2 (>=1.36.0,<1.37.0)", "mypy-boto3-emr (>=1.36.0,<1.37.0)", "mypy-boto3-emr-containers (>=1.36.0,<1.37.0)", "mypy-boto3-emr-serverless (>=1.36.0,<1.37.0)", "mypy-boto3-entityresolution (>=1.36.0,<1.37.0)", "mypy-boto3-es (>=1.36.0,<1.37.0)", "mypy-boto3-events (>=1.36.0,<1.37.0)", "mypy-boto3-evidently (>=1.36.0,<1.37.0)", "mypy-boto3-finspace (>=1.36.0,<1.37.0)", "mypy-boto3-finspace-data (>=1.36.0,<1.37.0)", "mypy-boto3-firehose (>=1.36.0,<1.37.0)", "mypy-boto3-fis (>=1.36.0,<1.37.0)", "mypy-boto3-fms (>=1.36.0,<1.37.0)", "mypy-boto3-forecast (>=1.36.0,<1.37.0)", "mypy-boto3-forecastquery (>=1.36.0,<1.37.0)", "mypy-boto3-frauddetector (>=1.36.0,<1.37.0)", "mypy-boto3-freetier (>=1.36.0,<1.37.0)", "mypy-boto3-fsx (>=1.36.0,<1.37.0)", "mypy-boto3-gamelift (>=1.36.0,<1.37.0)", "mypy-boto3-geo-maps (>=1.36.0,<1.37.0)", "mypy-boto3-geo-places (>=1.36.0,<1.37.0)", "mypy-boto3-geo-routes (>=1.36.0,<1.37.0)", "mypy-boto3-glacier (>=1.36.0,<1.37.0)", "mypy-boto3-globalaccelerator (>=1.36.0,<1.37.0)", "mypy-boto3-glue (>=1.36.0,<1.37.0)", "mypy-boto3-grafana (>=1.36.0,<1.37.0)", "mypy-boto3-greengrass (>=1.36.0,<1.37.0)", "mypy-boto3-greengrassv2 (>=1.36.0,<1.37.0)", "mypy-boto3-groundstation (>=1.36.0,<1.37.0)", "mypy-boto3-guardduty (>=1.36.0,<1.37.0)", "mypy-boto3-health (>=1.36.0,<1.37.0)", "mypy-boto3-healthlake (>=1.36.0,<1.37.0)", "mypy-boto3-iam (>=1.36.0,<1.37.0)", "mypy-boto3-identitystore (>=1.36.0,<1.37.0)", "mypy-boto3-imagebuilder (>=1.36.0,<1.37.0)", "mypy-boto3-importexport (>=1.36.0,<1.37.0)", "mypy-boto3-inspector (>=1.36.0,<1.37.0)", "mypy-boto3-inspector-scan (>=1.36.0,<1.37.0)", "mypy-boto3-inspector2 (>=1.36.0,<1.37.0)", "mypy-boto3-internetmonitor (>=1.36.0,<1.37.0)", "mypy-boto3-invoicing (>=1.36.0,<1.37.0)", "mypy-boto3-iot (>=1.36.0,<1.37.0)", "mypy-boto3-iot-data (>=1.36.0,<1.37.0)", "mypy-boto3-iot-jobs-data (>=1.36.0,<1.37.0)", "mypy-boto3-iotanalytics (>=1.36.0,<1.37.0)", "mypy-boto3-iotdeviceadvisor (>=1.36.0,<1.37.0)", "mypy-boto3-iotevents (>=1.36.0,<1.37.0)", "mypy-boto3-iotevents-data (>=1.36.0,<1.37.0)", "mypy-boto3-iotfleethub (>=1.36.0,<1.37.0)", "mypy-boto3-iotfleetwise (>=1.36.0,<1.37.0)", "mypy-boto3-iotsecuretunneling (>=1.36.0,<1.37.0)", "mypy-boto3-iotsitewise (>=1.36.0,<1.37.0)", "mypy-boto3-iotthingsgraph (>=1.36.0,<1.37.0)", "mypy-boto3-iottwinmaker (>=1.36.0,<1.37.0)", "mypy-boto3-iotwireless (>=1.36.0,<1.37.0)", "mypy-boto3-ivs (>=1.36.0,<1.37.0)", "mypy-boto3-ivs-realtime (>=1.36.0,<1.37.0)", "mypy-boto3-ivschat (>=1.36.0,<1.37.0)", "mypy-boto3-kafka (>=1.36.0,<1.37.0)", "mypy-boto3-kafkaconnect (>=1.36.0,<1.37.0)", "mypy-boto3-kendra (>=1.36.0,<1.37.0)", "mypy-boto3-kendra-ranking (>=1.36.0,<1.37.0)", "mypy-boto3-keyspaces (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis-video-archived-media (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis-video-media (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis-video-signaling (>=1.36.0,<1.37.0)", "mypy-boto3-kinesis-video-webrtc-storage (>=1.36.0,<1.37.0)", "mypy-boto3-kinesisanalytics (>=1.36.0,<1.37.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.36.0,<1.37.0)", "mypy-boto3-kinesisvideo (>=1.36.0,<1.37.0)", "mypy-boto3-kms (>=1.36.0,<1.37.0)", "mypy-boto3-lakeformation (>=1.36.0,<1.37.0)", "mypy-boto3-lambda (>=1.36.0,<1.37.0)", "mypy-boto3-launch-wizard (>=1.36.0,<1.37.0)", "mypy-boto3-lex-models (>=1.36.0,<1.37.0)", "mypy-boto3-lex-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-lexv2-models (>=1.36.0,<1.37.0)", "mypy-boto3-lexv2-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-license-manager (>=1.36.0,<1.37.0)", "mypy-boto3-license-manager-linux-subscriptions (>=1.36.0,<1.37.0)", "mypy-boto3-license-manager-user-subscriptions (>=1.36.0,<1.37.0)", "mypy-boto3-lightsail (>=1.36.0,<1.37.0)", "mypy-boto3-location (>=1.36.0,<1.37.0)", "mypy-boto3-logs (>=1.36.0,<1.37.0)", "mypy-boto3-lookoutequipment (>=1.36.0,<1.37.0)", "mypy-boto3-lookoutmetrics (>=1.36.0,<1.37.0)", "mypy-boto3-lookoutvision (>=1.36.0,<1.37.0)", "mypy-boto3-m2 (>=1.36.0,<1.37.0)", "mypy-boto3-machinelearning (>=1.36.0,<1.37.0)", "mypy-boto3-macie2 (>=1.36.0,<1.37.0)", "mypy-boto3-mailmanager (>=1.36.0,<1.37.0)", "mypy-boto3-managedblockchain (>=1.36.0,<1.37.0)", "mypy-boto3-managedblockchain-query (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-agreement (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-catalog (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-deployment (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-entitlement (>=1.36.0,<1.37.0)", "mypy-boto3-marketplace-reporting (>=1.36.0,<1.37.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.36.0,<1.37.0)", "mypy-boto3-mediaconnect (>=1.36.0,<1.37.0)", "mypy-boto3-mediaconvert (>=1.36.0,<1.37.0)", "mypy-boto3-medialive (>=1.36.0,<1.37.0)", "mypy-boto3-mediapackage (>=1.36.0,<1.37.0)", "mypy-boto3-mediapackage-vod (>=1.36.0,<1.37.0)", "mypy-boto3-mediapackagev2 (>=1.36.0,<1.37.0)", "mypy-boto3-mediastore (>=1.36.0,<1.37.0)", "mypy-boto3-mediastore-data (>=1.36.0,<1.37.0)", "mypy-boto3-mediatailor (>=1.36.0,<1.37.0)", "mypy-boto3-medical-imaging (>=1.36.0,<1.37.0)", "mypy-boto3-memorydb (>=1.36.0,<1.37.0)", "mypy-boto3-meteringmarketplace (>=1.36.0,<1.37.0)", "mypy-boto3-mgh (>=1.36.0,<1.37.0)", "mypy-boto3-mgn (>=1.36.0,<1.37.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.36.0,<1.37.0)", "mypy-boto3-migrationhub-config (>=1.36.0,<1.37.0)", "mypy-boto3-migrationhuborchestrator (>=1.36.0,<1.37.0)", "mypy-boto3-migrationhubstrategy (>=1.36.0,<1.37.0)", "mypy-boto3-mq (>=1.36.0,<1.37.0)", "mypy-boto3-mturk (>=1.36.0,<1.37.0)", "mypy-boto3-mwaa (>=1.36.0,<1.37.0)", "mypy-boto3-neptune (>=1.36.0,<1.37.0)", "mypy-boto3-neptune-graph (>=1.36.0,<1.37.0)", "mypy-boto3-neptunedata (>=1.36.0,<1.37.0)", "mypy-boto3-network-firewall (>=1.36.0,<1.37.0)", "mypy-boto3-networkflowmonitor (>=1.36.0,<1.37.0)", "mypy-boto3-networkmanager (>=1.36.0,<1.37.0)", "mypy-boto3-networkmonitor (>=1.36.0,<1.37.0)", "mypy-boto3-notifications (>=1.36.0,<1.37.0)", "mypy-boto3-notificationscontacts (>=1.36.0,<1.37.0)", "mypy-boto3-oam (>=1.36.0,<1.37.0)", "mypy-boto3-observabilityadmin (>=1.36.0,<1.37.0)", "mypy-boto3-omics (>=1.36.0,<1.37.0)", "mypy-boto3-opensearch (>=1.36.0,<1.37.0)", "mypy-boto3-opensearchserverless (>=1.36.0,<1.37.0)", "mypy-boto3-opsworks (>=1.36.0,<1.37.0)", "mypy-boto3-opsworkscm (>=1.36.0,<1.37.0)", "mypy-boto3-organizations (>=1.36.0,<1.37.0)", "mypy-boto3-osis (>=1.36.0,<1.37.0)", "mypy-boto3-outposts (>=1.36.0,<1.37.0)", "mypy-boto3-panorama (>=1.36.0,<1.37.0)", "mypy-boto3-partnercentral-selling (>=1.36.0,<1.37.0)", "mypy-boto3-payment-cryptography (>=1.36.0,<1.37.0)", "mypy-boto3-payment-cryptography-data (>=1.36.0,<1.37.0)", "mypy-boto3-pca-connector-ad (>=1.36.0,<1.37.0)", "mypy-boto3-pca-connector-scep (>=1.36.0,<1.37.0)", "mypy-boto3-pcs (>=1.36.0,<1.37.0)", "mypy-boto3-personalize (>=1.36.0,<1.37.0)", "mypy-boto3-personalize-events (>=1.36.0,<1.37.0)", "mypy-boto3-personalize-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-pi (>=1.36.0,<1.37.0)", "mypy-boto3-pinpoint (>=1.36.0,<1.37.0)", "mypy-boto3-pinpoint-email (>=1.36.0,<1.37.0)", "mypy-boto3-pinpoint-sms-voice (>=1.36.0,<1.37.0)", "mypy-boto3-pinpoint-sms-voice-v2 (>=1.36.0,<1.37.0)", "mypy-boto3-pipes (>=1.36.0,<1.37.0)", "mypy-boto3-polly (>=1.36.0,<1.37.0)", "mypy-boto3-pricing (>=1.36.0,<1.37.0)", "mypy-boto3-privatenetworks (>=1.36.0,<1.37.0)", "mypy-boto3-proton (>=1.36.0,<1.37.0)", "mypy-boto3-qapps (>=1.36.0,<1.37.0)", "mypy-boto3-qbusiness (>=1.36.0,<1.37.0)", "mypy-boto3-qconnect (>=1.36.0,<1.37.0)", "mypy-boto3-qldb (>=1.36.0,<1.37.0)", "mypy-boto3-qldb-session (>=1.36.0,<1.37.0)", "mypy-boto3-quicksight (>=1.36.0,<1.37.0)", "mypy-boto3-ram (>=1.36.0,<1.37.0)", "mypy-boto3-rbin (>=1.36.0,<1.37.0)", "mypy-boto3-rds (>=1.36.0,<1.37.0)", "mypy-boto3-rds-data (>=1.36.0,<1.37.0)", "mypy-boto3-redshift (>=1.36.0,<1.37.0)", "mypy-boto3-redshift-data (>=1.36.0,<1.37.0)", "mypy-boto3-redshift-serverless (>=1.36.0,<1.37.0)", "mypy-boto3-rekognition (>=1.36.0,<1.37.0)", "mypy-boto3-repostspace (>=1.36.0,<1.37.0)", "mypy-boto3-resiliencehub (>=1.36.0,<1.37.0)", "mypy-boto3-resource-explorer-2 (>=1.36.0,<1.37.0)", "mypy-boto3-resource-groups (>=1.36.0,<1.37.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.36.0,<1.37.0)", "mypy-boto3-robomaker (>=1.36.0,<1.37.0)", "mypy-boto3-rolesanywhere (>=1.36.0,<1.37.0)", "mypy-boto3-route53 (>=1.36.0,<1.37.0)", "mypy-boto3-route53-recovery-cluster (>=1.36.0,<1.37.0)", "mypy-boto3-route53-recovery-control-config (>=1.36.0,<1.37.0)", "mypy-boto3-route53-recovery-readiness (>=1.36.0,<1.37.0)", "mypy-boto3-route53domains (>=1.36.0,<1.37.0)", "mypy-boto3-route53profiles (>=1.36.0,<1.37.0)", "mypy-boto3-route53resolver (>=1.36.0,<1.37.0)", "mypy-boto3-rum (>=1.36.0,<1.37.0)", "mypy-boto3-s3 (>=1.36.0,<1.37.0)", "mypy-boto3-s3control (>=1.36.0,<1.37.0)", "mypy-boto3-s3outposts (>=1.36.0,<1.37.0)", "mypy-boto3-s3tables (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-edge (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-geospatial (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-metrics (>=1.36.0,<1.37.0)", "mypy-boto3-sagemaker-runtime (>=1.36.0,<1.37.0)", "mypy-boto3-savingsplans (>=1.36.0,<1.37.0)", "mypy-boto3-scheduler (>=1.36.0,<1.37.0)", "mypy-boto3-schemas (>=1.36.0,<1.37.0)", "mypy-boto3-sdb (>=1.36.0,<1.37.0)", "mypy-boto3-secretsmanager (>=1.36.0,<1.37.0)", "mypy-boto3-security-ir (>=1.36.0,<1.37.0)", "mypy-boto3-securityhub (>=1.36.0,<1.37.0)", "mypy-boto3-securitylake (>=1.36.0,<1.37.0)", "mypy-boto3-serverlessrepo (>=1.36.0,<1.37.0)", "mypy-boto3-service-quotas (>=1.36.0,<1.37.0)", "mypy-boto3-servicecatalog (>=1.36.0,<1.37.0)", "mypy-boto3-servicecatalog-appregistry (>=1.36.0,<1.37.0)", "mypy-boto3-servicediscovery (>=1.36.0,<1.37.0)", "mypy-boto3-ses (>=1.36.0,<1.37.0)", "mypy-boto3-sesv2 (>=1.36.0,<1.37.0)", "mypy-boto3-shield (>=1.36.0,<1.37.0)", "mypy-boto3-signer (>=1.36.0,<1.37.0)", "mypy-boto3-simspaceweaver (>=1.36.0,<1.37.0)", "mypy-boto3-sms (>=1.36.0,<1.37.0)", "mypy-boto3-sms-voice (>=1.36.0,<1.37.0)", "mypy-boto3-snow-device-management (>=1.36.0,<1.37.0)", "mypy-boto3-snowball (>=1.36.0,<1.37.0)", "mypy-boto3-sns (>=1.36.0,<1.37.0)", "mypy-boto3-socialmessaging (>=1.36.0,<1.37.0)", "mypy-boto3-sqs (>=1.36.0,<1.37.0)", "mypy-boto3-ssm (>=1.36.0,<1.37.0)", "mypy-boto3-ssm-contacts (>=1.36.0,<1.37.0)", "mypy-boto3-ssm-incidents (>=1.36.0,<1.37.0)", "mypy-boto3-ssm-quicksetup (>=1.36.0,<1.37.0)", "mypy-boto3-ssm-sap (>=1.36.0,<1.37.0)", "mypy-boto3-sso (>=1.36.0,<1.37.0)", "mypy-boto3-sso-admin (>=1.36.0,<1.37.0)", "mypy-boto3-sso-oidc (>=1.36.0,<1.37.0)", "mypy-boto3-stepfunctions (>=1.36.0,<1.37.0)", "mypy-boto3-storagegateway (>=1.36.0,<1.37.0)", "mypy-boto3-sts (>=1.36.0,<1.37.0)", "mypy-boto3-supplychain (>=1.36.0,<1.37.0)", "mypy-boto3-support (>=1.36.0,<1.37.0)", "mypy-boto3-support-app (>=1.36.0,<1.37.0)", "mypy-boto3-swf (>=1.36.0,<1.37.0)", "mypy-boto3-synthetics (>=1.36.0,<1.37.0)", "mypy-boto3-taxsettings (>=1.36.0,<1.37.0)", "mypy-boto3-textract (>=1.36.0,<1.37.0)", "mypy-boto3-timestream-influxdb (>=1.36.0,<1.37.0)", "mypy-boto3-timestream-query (>=1.36.0,<1.37.0)", "mypy-boto3-timestream-write (>=1.36.0,<1.37.0)", "mypy-boto3-tnb (>=1.36.0,<1.37.0)", "mypy-boto3-transcribe (>=1.36.0,<1.37.0)", "mypy-boto3-transfer (>=1.36.0,<1.37.0)", "mypy-boto3-translate (>=1.36.0,<1.37.0)", "mypy-boto3-trustedadvisor (>=1.36.0,<1.37.0)", "mypy-boto3-verifiedpermissions (>=1.36.0,<1.37.0)", "mypy-boto3-voice-id (>=1.36.0,<1.37.0)", "mypy-boto3-vpc-lattice (>=1.36.0,<1.37.0)", "mypy-boto3-waf (>=1.36.0,<1.37.0)", "mypy-boto3-waf-regional (>=1.36.0,<1.37.0)", "mypy-boto3-wafv2 (>=1.36.0,<1.37.0)", "mypy-boto3-wellarchitected (>=1.36.0,<1.37.0)", "mypy-boto3-wisdom (>=1.36.0,<1.37.0)", "mypy-boto3-workdocs (>=1.36.0,<1.37.0)", "mypy-boto3-workmail (>=1.36.0,<1.37.0)", "mypy-boto3-workmailmessageflow (>=1.36.0,<1.37.0)", "mypy-boto3-workspaces (>=1.36.0,<1.37.0)", "mypy-boto3-workspaces-thin-client (>=1.36.0,<1.37.0)", "mypy-boto3-workspaces-web (>=1.36.0,<1.37.0)", "mypy-boto3-xray (>=1.36.0,<1.37.0)"] +amp = ["mypy-boto3-amp (>=1.36.0,<1.37.0)"] +amplify = ["mypy-boto3-amplify (>=1.36.0,<1.37.0)"] +amplifybackend = ["mypy-boto3-amplifybackend (>=1.36.0,<1.37.0)"] +amplifyuibuilder = ["mypy-boto3-amplifyuibuilder (>=1.36.0,<1.37.0)"] +apigateway = ["mypy-boto3-apigateway (>=1.36.0,<1.37.0)"] +apigatewaymanagementapi = ["mypy-boto3-apigatewaymanagementapi (>=1.36.0,<1.37.0)"] +apigatewayv2 = ["mypy-boto3-apigatewayv2 (>=1.36.0,<1.37.0)"] +appconfig = ["mypy-boto3-appconfig (>=1.36.0,<1.37.0)"] +appconfigdata = ["mypy-boto3-appconfigdata (>=1.36.0,<1.37.0)"] +appfabric = ["mypy-boto3-appfabric (>=1.36.0,<1.37.0)"] +appflow = ["mypy-boto3-appflow (>=1.36.0,<1.37.0)"] +appintegrations = ["mypy-boto3-appintegrations (>=1.36.0,<1.37.0)"] +application-autoscaling = ["mypy-boto3-application-autoscaling (>=1.36.0,<1.37.0)"] +application-insights = ["mypy-boto3-application-insights (>=1.36.0,<1.37.0)"] +application-signals = ["mypy-boto3-application-signals (>=1.36.0,<1.37.0)"] +applicationcostprofiler = ["mypy-boto3-applicationcostprofiler (>=1.36.0,<1.37.0)"] +appmesh = ["mypy-boto3-appmesh (>=1.36.0,<1.37.0)"] +apprunner = ["mypy-boto3-apprunner (>=1.36.0,<1.37.0)"] +appstream = ["mypy-boto3-appstream (>=1.36.0,<1.37.0)"] +appsync = ["mypy-boto3-appsync (>=1.36.0,<1.37.0)"] +apptest = ["mypy-boto3-apptest (>=1.36.0,<1.37.0)"] +arc-zonal-shift = ["mypy-boto3-arc-zonal-shift (>=1.36.0,<1.37.0)"] +artifact = ["mypy-boto3-artifact (>=1.36.0,<1.37.0)"] +athena = ["mypy-boto3-athena (>=1.36.0,<1.37.0)"] +auditmanager = ["mypy-boto3-auditmanager (>=1.36.0,<1.37.0)"] +autoscaling = ["mypy-boto3-autoscaling (>=1.36.0,<1.37.0)"] +autoscaling-plans = ["mypy-boto3-autoscaling-plans (>=1.36.0,<1.37.0)"] +b2bi = ["mypy-boto3-b2bi (>=1.36.0,<1.37.0)"] +backup = ["mypy-boto3-backup (>=1.36.0,<1.37.0)"] +backup-gateway = ["mypy-boto3-backup-gateway (>=1.36.0,<1.37.0)"] +backupsearch = ["mypy-boto3-backupsearch (>=1.36.0,<1.37.0)"] +batch = ["mypy-boto3-batch (>=1.36.0,<1.37.0)"] +bcm-data-exports = ["mypy-boto3-bcm-data-exports (>=1.36.0,<1.37.0)"] +bcm-pricing-calculator = ["mypy-boto3-bcm-pricing-calculator (>=1.36.0,<1.37.0)"] +bedrock = ["mypy-boto3-bedrock (>=1.36.0,<1.37.0)"] +bedrock-agent = ["mypy-boto3-bedrock-agent (>=1.36.0,<1.37.0)"] +bedrock-agent-runtime = ["mypy-boto3-bedrock-agent-runtime (>=1.36.0,<1.37.0)"] +bedrock-data-automation = ["mypy-boto3-bedrock-data-automation (>=1.36.0,<1.37.0)"] +bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime (>=1.36.0,<1.37.0)"] +bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] +billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] +billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] +boto3 = ["boto3 (==1.36.1)"] +braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] +budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] +ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] +chatbot = ["mypy-boto3-chatbot (>=1.36.0,<1.37.0)"] +chime = ["mypy-boto3-chime (>=1.36.0,<1.37.0)"] +chime-sdk-identity = ["mypy-boto3-chime-sdk-identity (>=1.36.0,<1.37.0)"] +chime-sdk-media-pipelines = ["mypy-boto3-chime-sdk-media-pipelines (>=1.36.0,<1.37.0)"] +chime-sdk-meetings = ["mypy-boto3-chime-sdk-meetings (>=1.36.0,<1.37.0)"] +chime-sdk-messaging = ["mypy-boto3-chime-sdk-messaging (>=1.36.0,<1.37.0)"] +chime-sdk-voice = ["mypy-boto3-chime-sdk-voice (>=1.36.0,<1.37.0)"] +cleanrooms = ["mypy-boto3-cleanrooms (>=1.36.0,<1.37.0)"] +cleanroomsml = ["mypy-boto3-cleanroomsml (>=1.36.0,<1.37.0)"] +cloud9 = ["mypy-boto3-cloud9 (>=1.36.0,<1.37.0)"] +cloudcontrol = ["mypy-boto3-cloudcontrol (>=1.36.0,<1.37.0)"] +clouddirectory = ["mypy-boto3-clouddirectory (>=1.36.0,<1.37.0)"] +cloudformation = ["mypy-boto3-cloudformation (>=1.36.0,<1.37.0)"] +cloudfront = ["mypy-boto3-cloudfront (>=1.36.0,<1.37.0)"] +cloudfront-keyvaluestore = ["mypy-boto3-cloudfront-keyvaluestore (>=1.36.0,<1.37.0)"] +cloudhsm = ["mypy-boto3-cloudhsm (>=1.36.0,<1.37.0)"] +cloudhsmv2 = ["mypy-boto3-cloudhsmv2 (>=1.36.0,<1.37.0)"] +cloudsearch = ["mypy-boto3-cloudsearch (>=1.36.0,<1.37.0)"] +cloudsearchdomain = ["mypy-boto3-cloudsearchdomain (>=1.36.0,<1.37.0)"] +cloudtrail = ["mypy-boto3-cloudtrail (>=1.36.0,<1.37.0)"] +cloudtrail-data = ["mypy-boto3-cloudtrail-data (>=1.36.0,<1.37.0)"] +cloudwatch = ["mypy-boto3-cloudwatch (>=1.36.0,<1.37.0)"] +codeartifact = ["mypy-boto3-codeartifact (>=1.36.0,<1.37.0)"] +codebuild = ["mypy-boto3-codebuild (>=1.36.0,<1.37.0)"] +codecatalyst = ["mypy-boto3-codecatalyst (>=1.36.0,<1.37.0)"] +codecommit = ["mypy-boto3-codecommit (>=1.36.0,<1.37.0)"] +codeconnections = ["mypy-boto3-codeconnections (>=1.36.0,<1.37.0)"] +codedeploy = ["mypy-boto3-codedeploy (>=1.36.0,<1.37.0)"] +codeguru-reviewer = ["mypy-boto3-codeguru-reviewer (>=1.36.0,<1.37.0)"] +codeguru-security = ["mypy-boto3-codeguru-security (>=1.36.0,<1.37.0)"] +codeguruprofiler = ["mypy-boto3-codeguruprofiler (>=1.36.0,<1.37.0)"] +codepipeline = ["mypy-boto3-codepipeline (>=1.36.0,<1.37.0)"] +codestar-connections = ["mypy-boto3-codestar-connections (>=1.36.0,<1.37.0)"] +codestar-notifications = ["mypy-boto3-codestar-notifications (>=1.36.0,<1.37.0)"] +cognito-identity = ["mypy-boto3-cognito-identity (>=1.36.0,<1.37.0)"] +cognito-idp = ["mypy-boto3-cognito-idp (>=1.36.0,<1.37.0)"] +cognito-sync = ["mypy-boto3-cognito-sync (>=1.36.0,<1.37.0)"] +comprehend = ["mypy-boto3-comprehend (>=1.36.0,<1.37.0)"] +comprehendmedical = ["mypy-boto3-comprehendmedical (>=1.36.0,<1.37.0)"] +compute-optimizer = ["mypy-boto3-compute-optimizer (>=1.36.0,<1.37.0)"] +config = ["mypy-boto3-config (>=1.36.0,<1.37.0)"] +connect = ["mypy-boto3-connect (>=1.36.0,<1.37.0)"] +connect-contact-lens = ["mypy-boto3-connect-contact-lens (>=1.36.0,<1.37.0)"] +connectcampaigns = ["mypy-boto3-connectcampaigns (>=1.36.0,<1.37.0)"] +connectcampaignsv2 = ["mypy-boto3-connectcampaignsv2 (>=1.36.0,<1.37.0)"] +connectcases = ["mypy-boto3-connectcases (>=1.36.0,<1.37.0)"] +connectparticipant = ["mypy-boto3-connectparticipant (>=1.36.0,<1.37.0)"] +controlcatalog = ["mypy-boto3-controlcatalog (>=1.36.0,<1.37.0)"] +controltower = ["mypy-boto3-controltower (>=1.36.0,<1.37.0)"] +cost-optimization-hub = ["mypy-boto3-cost-optimization-hub (>=1.36.0,<1.37.0)"] +cur = ["mypy-boto3-cur (>=1.36.0,<1.37.0)"] +customer-profiles = ["mypy-boto3-customer-profiles (>=1.36.0,<1.37.0)"] +databrew = ["mypy-boto3-databrew (>=1.36.0,<1.37.0)"] +dataexchange = ["mypy-boto3-dataexchange (>=1.36.0,<1.37.0)"] +datapipeline = ["mypy-boto3-datapipeline (>=1.36.0,<1.37.0)"] +datasync = ["mypy-boto3-datasync (>=1.36.0,<1.37.0)"] +datazone = ["mypy-boto3-datazone (>=1.36.0,<1.37.0)"] +dax = ["mypy-boto3-dax (>=1.36.0,<1.37.0)"] +deadline = ["mypy-boto3-deadline (>=1.36.0,<1.37.0)"] +detective = ["mypy-boto3-detective (>=1.36.0,<1.37.0)"] +devicefarm = ["mypy-boto3-devicefarm (>=1.36.0,<1.37.0)"] +devops-guru = ["mypy-boto3-devops-guru (>=1.36.0,<1.37.0)"] +directconnect = ["mypy-boto3-directconnect (>=1.36.0,<1.37.0)"] +discovery = ["mypy-boto3-discovery (>=1.36.0,<1.37.0)"] +dlm = ["mypy-boto3-dlm (>=1.36.0,<1.37.0)"] +dms = ["mypy-boto3-dms (>=1.36.0,<1.37.0)"] +docdb = ["mypy-boto3-docdb (>=1.36.0,<1.37.0)"] +docdb-elastic = ["mypy-boto3-docdb-elastic (>=1.36.0,<1.37.0)"] +drs = ["mypy-boto3-drs (>=1.36.0,<1.37.0)"] +ds = ["mypy-boto3-ds (>=1.36.0,<1.37.0)"] +ds-data = ["mypy-boto3-ds-data (>=1.36.0,<1.37.0)"] +dsql = ["mypy-boto3-dsql (>=1.36.0,<1.37.0)"] +dynamodb = ["mypy-boto3-dynamodb (>=1.36.0,<1.37.0)"] +dynamodbstreams = ["mypy-boto3-dynamodbstreams (>=1.36.0,<1.37.0)"] +ebs = ["mypy-boto3-ebs (>=1.36.0,<1.37.0)"] +ec2 = ["mypy-boto3-ec2 (>=1.36.0,<1.37.0)"] +ec2-instance-connect = ["mypy-boto3-ec2-instance-connect (>=1.36.0,<1.37.0)"] +ecr = ["mypy-boto3-ecr (>=1.36.0,<1.37.0)"] +ecr-public = ["mypy-boto3-ecr-public (>=1.36.0,<1.37.0)"] +ecs = ["mypy-boto3-ecs (>=1.36.0,<1.37.0)"] +efs = ["mypy-boto3-efs (>=1.36.0,<1.37.0)"] +eks = ["mypy-boto3-eks (>=1.36.0,<1.37.0)"] +eks-auth = ["mypy-boto3-eks-auth (>=1.36.0,<1.37.0)"] +elastic-inference = ["mypy-boto3-elastic-inference (>=1.36.0,<1.37.0)"] +elasticache = ["mypy-boto3-elasticache (>=1.36.0,<1.37.0)"] +elasticbeanstalk = ["mypy-boto3-elasticbeanstalk (>=1.36.0,<1.37.0)"] +elastictranscoder = ["mypy-boto3-elastictranscoder (>=1.36.0,<1.37.0)"] +elb = ["mypy-boto3-elb (>=1.36.0,<1.37.0)"] +elbv2 = ["mypy-boto3-elbv2 (>=1.36.0,<1.37.0)"] +emr = ["mypy-boto3-emr (>=1.36.0,<1.37.0)"] +emr-containers = ["mypy-boto3-emr-containers (>=1.36.0,<1.37.0)"] +emr-serverless = ["mypy-boto3-emr-serverless (>=1.36.0,<1.37.0)"] +entityresolution = ["mypy-boto3-entityresolution (>=1.36.0,<1.37.0)"] +es = ["mypy-boto3-es (>=1.36.0,<1.37.0)"] +essential = ["mypy-boto3-cloudformation (>=1.36.0,<1.37.0)", "mypy-boto3-dynamodb (>=1.36.0,<1.37.0)", "mypy-boto3-ec2 (>=1.36.0,<1.37.0)", "mypy-boto3-lambda (>=1.36.0,<1.37.0)", "mypy-boto3-rds (>=1.36.0,<1.37.0)", "mypy-boto3-s3 (>=1.36.0,<1.37.0)", "mypy-boto3-sqs (>=1.36.0,<1.37.0)"] +events = ["mypy-boto3-events (>=1.36.0,<1.37.0)"] +evidently = ["mypy-boto3-evidently (>=1.36.0,<1.37.0)"] +finspace = ["mypy-boto3-finspace (>=1.36.0,<1.37.0)"] +finspace-data = ["mypy-boto3-finspace-data (>=1.36.0,<1.37.0)"] +firehose = ["mypy-boto3-firehose (>=1.36.0,<1.37.0)"] +fis = ["mypy-boto3-fis (>=1.36.0,<1.37.0)"] +fms = ["mypy-boto3-fms (>=1.36.0,<1.37.0)"] +forecast = ["mypy-boto3-forecast (>=1.36.0,<1.37.0)"] +forecastquery = ["mypy-boto3-forecastquery (>=1.36.0,<1.37.0)"] +frauddetector = ["mypy-boto3-frauddetector (>=1.36.0,<1.37.0)"] +freetier = ["mypy-boto3-freetier (>=1.36.0,<1.37.0)"] +fsx = ["mypy-boto3-fsx (>=1.36.0,<1.37.0)"] +full = ["boto3-stubs-full (>=1.36.0,<1.37.0)"] +gamelift = ["mypy-boto3-gamelift (>=1.36.0,<1.37.0)"] +geo-maps = ["mypy-boto3-geo-maps (>=1.36.0,<1.37.0)"] +geo-places = ["mypy-boto3-geo-places (>=1.36.0,<1.37.0)"] +geo-routes = ["mypy-boto3-geo-routes (>=1.36.0,<1.37.0)"] +glacier = ["mypy-boto3-glacier (>=1.36.0,<1.37.0)"] +globalaccelerator = ["mypy-boto3-globalaccelerator (>=1.36.0,<1.37.0)"] +glue = ["mypy-boto3-glue (>=1.36.0,<1.37.0)"] +grafana = ["mypy-boto3-grafana (>=1.36.0,<1.37.0)"] +greengrass = ["mypy-boto3-greengrass (>=1.36.0,<1.37.0)"] +greengrassv2 = ["mypy-boto3-greengrassv2 (>=1.36.0,<1.37.0)"] +groundstation = ["mypy-boto3-groundstation (>=1.36.0,<1.37.0)"] +guardduty = ["mypy-boto3-guardduty (>=1.36.0,<1.37.0)"] +health = ["mypy-boto3-health (>=1.36.0,<1.37.0)"] +healthlake = ["mypy-boto3-healthlake (>=1.36.0,<1.37.0)"] +iam = ["mypy-boto3-iam (>=1.36.0,<1.37.0)"] +identitystore = ["mypy-boto3-identitystore (>=1.36.0,<1.37.0)"] +imagebuilder = ["mypy-boto3-imagebuilder (>=1.36.0,<1.37.0)"] +importexport = ["mypy-boto3-importexport (>=1.36.0,<1.37.0)"] +inspector = ["mypy-boto3-inspector (>=1.36.0,<1.37.0)"] +inspector-scan = ["mypy-boto3-inspector-scan (>=1.36.0,<1.37.0)"] +inspector2 = ["mypy-boto3-inspector2 (>=1.36.0,<1.37.0)"] +internetmonitor = ["mypy-boto3-internetmonitor (>=1.36.0,<1.37.0)"] +invoicing = ["mypy-boto3-invoicing (>=1.36.0,<1.37.0)"] +iot = ["mypy-boto3-iot (>=1.36.0,<1.37.0)"] +iot-data = ["mypy-boto3-iot-data (>=1.36.0,<1.37.0)"] +iot-jobs-data = ["mypy-boto3-iot-jobs-data (>=1.36.0,<1.37.0)"] +iotanalytics = ["mypy-boto3-iotanalytics (>=1.36.0,<1.37.0)"] +iotdeviceadvisor = ["mypy-boto3-iotdeviceadvisor (>=1.36.0,<1.37.0)"] +iotevents = ["mypy-boto3-iotevents (>=1.36.0,<1.37.0)"] +iotevents-data = ["mypy-boto3-iotevents-data (>=1.36.0,<1.37.0)"] +iotfleethub = ["mypy-boto3-iotfleethub (>=1.36.0,<1.37.0)"] +iotfleetwise = ["mypy-boto3-iotfleetwise (>=1.36.0,<1.37.0)"] +iotsecuretunneling = ["mypy-boto3-iotsecuretunneling (>=1.36.0,<1.37.0)"] +iotsitewise = ["mypy-boto3-iotsitewise (>=1.36.0,<1.37.0)"] +iotthingsgraph = ["mypy-boto3-iotthingsgraph (>=1.36.0,<1.37.0)"] +iottwinmaker = ["mypy-boto3-iottwinmaker (>=1.36.0,<1.37.0)"] +iotwireless = ["mypy-boto3-iotwireless (>=1.36.0,<1.37.0)"] +ivs = ["mypy-boto3-ivs (>=1.36.0,<1.37.0)"] +ivs-realtime = ["mypy-boto3-ivs-realtime (>=1.36.0,<1.37.0)"] +ivschat = ["mypy-boto3-ivschat (>=1.36.0,<1.37.0)"] +kafka = ["mypy-boto3-kafka (>=1.36.0,<1.37.0)"] +kafkaconnect = ["mypy-boto3-kafkaconnect (>=1.36.0,<1.37.0)"] +kendra = ["mypy-boto3-kendra (>=1.36.0,<1.37.0)"] +kendra-ranking = ["mypy-boto3-kendra-ranking (>=1.36.0,<1.37.0)"] +keyspaces = ["mypy-boto3-keyspaces (>=1.36.0,<1.37.0)"] +kinesis = ["mypy-boto3-kinesis (>=1.36.0,<1.37.0)"] +kinesis-video-archived-media = ["mypy-boto3-kinesis-video-archived-media (>=1.36.0,<1.37.0)"] +kinesis-video-media = ["mypy-boto3-kinesis-video-media (>=1.36.0,<1.37.0)"] +kinesis-video-signaling = ["mypy-boto3-kinesis-video-signaling (>=1.36.0,<1.37.0)"] +kinesis-video-webrtc-storage = ["mypy-boto3-kinesis-video-webrtc-storage (>=1.36.0,<1.37.0)"] +kinesisanalytics = ["mypy-boto3-kinesisanalytics (>=1.36.0,<1.37.0)"] +kinesisanalyticsv2 = ["mypy-boto3-kinesisanalyticsv2 (>=1.36.0,<1.37.0)"] +kinesisvideo = ["mypy-boto3-kinesisvideo (>=1.36.0,<1.37.0)"] +kms = ["mypy-boto3-kms (>=1.36.0,<1.37.0)"] +lakeformation = ["mypy-boto3-lakeformation (>=1.36.0,<1.37.0)"] +lambda = ["mypy-boto3-lambda (>=1.36.0,<1.37.0)"] +launch-wizard = ["mypy-boto3-launch-wizard (>=1.36.0,<1.37.0)"] +lex-models = ["mypy-boto3-lex-models (>=1.36.0,<1.37.0)"] +lex-runtime = ["mypy-boto3-lex-runtime (>=1.36.0,<1.37.0)"] +lexv2-models = ["mypy-boto3-lexv2-models (>=1.36.0,<1.37.0)"] +lexv2-runtime = ["mypy-boto3-lexv2-runtime (>=1.36.0,<1.37.0)"] +license-manager = ["mypy-boto3-license-manager (>=1.36.0,<1.37.0)"] +license-manager-linux-subscriptions = ["mypy-boto3-license-manager-linux-subscriptions (>=1.36.0,<1.37.0)"] +license-manager-user-subscriptions = ["mypy-boto3-license-manager-user-subscriptions (>=1.36.0,<1.37.0)"] +lightsail = ["mypy-boto3-lightsail (>=1.36.0,<1.37.0)"] +location = ["mypy-boto3-location (>=1.36.0,<1.37.0)"] +logs = ["mypy-boto3-logs (>=1.36.0,<1.37.0)"] +lookoutequipment = ["mypy-boto3-lookoutequipment (>=1.36.0,<1.37.0)"] +lookoutmetrics = ["mypy-boto3-lookoutmetrics (>=1.36.0,<1.37.0)"] +lookoutvision = ["mypy-boto3-lookoutvision (>=1.36.0,<1.37.0)"] +m2 = ["mypy-boto3-m2 (>=1.36.0,<1.37.0)"] +machinelearning = ["mypy-boto3-machinelearning (>=1.36.0,<1.37.0)"] +macie2 = ["mypy-boto3-macie2 (>=1.36.0,<1.37.0)"] +mailmanager = ["mypy-boto3-mailmanager (>=1.36.0,<1.37.0)"] +managedblockchain = ["mypy-boto3-managedblockchain (>=1.36.0,<1.37.0)"] +managedblockchain-query = ["mypy-boto3-managedblockchain-query (>=1.36.0,<1.37.0)"] +marketplace-agreement = ["mypy-boto3-marketplace-agreement (>=1.36.0,<1.37.0)"] +marketplace-catalog = ["mypy-boto3-marketplace-catalog (>=1.36.0,<1.37.0)"] +marketplace-deployment = ["mypy-boto3-marketplace-deployment (>=1.36.0,<1.37.0)"] +marketplace-entitlement = ["mypy-boto3-marketplace-entitlement (>=1.36.0,<1.37.0)"] +marketplace-reporting = ["mypy-boto3-marketplace-reporting (>=1.36.0,<1.37.0)"] +marketplacecommerceanalytics = ["mypy-boto3-marketplacecommerceanalytics (>=1.36.0,<1.37.0)"] +mediaconnect = ["mypy-boto3-mediaconnect (>=1.36.0,<1.37.0)"] +mediaconvert = ["mypy-boto3-mediaconvert (>=1.36.0,<1.37.0)"] +medialive = ["mypy-boto3-medialive (>=1.36.0,<1.37.0)"] +mediapackage = ["mypy-boto3-mediapackage (>=1.36.0,<1.37.0)"] +mediapackage-vod = ["mypy-boto3-mediapackage-vod (>=1.36.0,<1.37.0)"] +mediapackagev2 = ["mypy-boto3-mediapackagev2 (>=1.36.0,<1.37.0)"] +mediastore = ["mypy-boto3-mediastore (>=1.36.0,<1.37.0)"] +mediastore-data = ["mypy-boto3-mediastore-data (>=1.36.0,<1.37.0)"] +mediatailor = ["mypy-boto3-mediatailor (>=1.36.0,<1.37.0)"] +medical-imaging = ["mypy-boto3-medical-imaging (>=1.36.0,<1.37.0)"] +memorydb = ["mypy-boto3-memorydb (>=1.36.0,<1.37.0)"] +meteringmarketplace = ["mypy-boto3-meteringmarketplace (>=1.36.0,<1.37.0)"] +mgh = ["mypy-boto3-mgh (>=1.36.0,<1.37.0)"] +mgn = ["mypy-boto3-mgn (>=1.36.0,<1.37.0)"] +migration-hub-refactor-spaces = ["mypy-boto3-migration-hub-refactor-spaces (>=1.36.0,<1.37.0)"] +migrationhub-config = ["mypy-boto3-migrationhub-config (>=1.36.0,<1.37.0)"] +migrationhuborchestrator = ["mypy-boto3-migrationhuborchestrator (>=1.36.0,<1.37.0)"] +migrationhubstrategy = ["mypy-boto3-migrationhubstrategy (>=1.36.0,<1.37.0)"] +mq = ["mypy-boto3-mq (>=1.36.0,<1.37.0)"] +mturk = ["mypy-boto3-mturk (>=1.36.0,<1.37.0)"] +mwaa = ["mypy-boto3-mwaa (>=1.36.0,<1.37.0)"] +neptune = ["mypy-boto3-neptune (>=1.36.0,<1.37.0)"] +neptune-graph = ["mypy-boto3-neptune-graph (>=1.36.0,<1.37.0)"] +neptunedata = ["mypy-boto3-neptunedata (>=1.36.0,<1.37.0)"] +network-firewall = ["mypy-boto3-network-firewall (>=1.36.0,<1.37.0)"] +networkflowmonitor = ["mypy-boto3-networkflowmonitor (>=1.36.0,<1.37.0)"] +networkmanager = ["mypy-boto3-networkmanager (>=1.36.0,<1.37.0)"] +networkmonitor = ["mypy-boto3-networkmonitor (>=1.36.0,<1.37.0)"] +notifications = ["mypy-boto3-notifications (>=1.36.0,<1.37.0)"] +notificationscontacts = ["mypy-boto3-notificationscontacts (>=1.36.0,<1.37.0)"] +oam = ["mypy-boto3-oam (>=1.36.0,<1.37.0)"] +observabilityadmin = ["mypy-boto3-observabilityadmin (>=1.36.0,<1.37.0)"] +omics = ["mypy-boto3-omics (>=1.36.0,<1.37.0)"] +opensearch = ["mypy-boto3-opensearch (>=1.36.0,<1.37.0)"] +opensearchserverless = ["mypy-boto3-opensearchserverless (>=1.36.0,<1.37.0)"] +opsworks = ["mypy-boto3-opsworks (>=1.36.0,<1.37.0)"] +opsworkscm = ["mypy-boto3-opsworkscm (>=1.36.0,<1.37.0)"] +organizations = ["mypy-boto3-organizations (>=1.36.0,<1.37.0)"] +osis = ["mypy-boto3-osis (>=1.36.0,<1.37.0)"] +outposts = ["mypy-boto3-outposts (>=1.36.0,<1.37.0)"] +panorama = ["mypy-boto3-panorama (>=1.36.0,<1.37.0)"] +partnercentral-selling = ["mypy-boto3-partnercentral-selling (>=1.36.0,<1.37.0)"] +payment-cryptography = ["mypy-boto3-payment-cryptography (>=1.36.0,<1.37.0)"] +payment-cryptography-data = ["mypy-boto3-payment-cryptography-data (>=1.36.0,<1.37.0)"] +pca-connector-ad = ["mypy-boto3-pca-connector-ad (>=1.36.0,<1.37.0)"] +pca-connector-scep = ["mypy-boto3-pca-connector-scep (>=1.36.0,<1.37.0)"] +pcs = ["mypy-boto3-pcs (>=1.36.0,<1.37.0)"] +personalize = ["mypy-boto3-personalize (>=1.36.0,<1.37.0)"] +personalize-events = ["mypy-boto3-personalize-events (>=1.36.0,<1.37.0)"] +personalize-runtime = ["mypy-boto3-personalize-runtime (>=1.36.0,<1.37.0)"] +pi = ["mypy-boto3-pi (>=1.36.0,<1.37.0)"] +pinpoint = ["mypy-boto3-pinpoint (>=1.36.0,<1.37.0)"] +pinpoint-email = ["mypy-boto3-pinpoint-email (>=1.36.0,<1.37.0)"] +pinpoint-sms-voice = ["mypy-boto3-pinpoint-sms-voice (>=1.36.0,<1.37.0)"] +pinpoint-sms-voice-v2 = ["mypy-boto3-pinpoint-sms-voice-v2 (>=1.36.0,<1.37.0)"] +pipes = ["mypy-boto3-pipes (>=1.36.0,<1.37.0)"] +polly = ["mypy-boto3-polly (>=1.36.0,<1.37.0)"] +pricing = ["mypy-boto3-pricing (>=1.36.0,<1.37.0)"] +privatenetworks = ["mypy-boto3-privatenetworks (>=1.36.0,<1.37.0)"] +proton = ["mypy-boto3-proton (>=1.36.0,<1.37.0)"] +qapps = ["mypy-boto3-qapps (>=1.36.0,<1.37.0)"] +qbusiness = ["mypy-boto3-qbusiness (>=1.36.0,<1.37.0)"] +qconnect = ["mypy-boto3-qconnect (>=1.36.0,<1.37.0)"] +qldb = ["mypy-boto3-qldb (>=1.36.0,<1.37.0)"] +qldb-session = ["mypy-boto3-qldb-session (>=1.36.0,<1.37.0)"] +quicksight = ["mypy-boto3-quicksight (>=1.36.0,<1.37.0)"] +ram = ["mypy-boto3-ram (>=1.36.0,<1.37.0)"] +rbin = ["mypy-boto3-rbin (>=1.36.0,<1.37.0)"] +rds = ["mypy-boto3-rds (>=1.36.0,<1.37.0)"] +rds-data = ["mypy-boto3-rds-data (>=1.36.0,<1.37.0)"] +redshift = ["mypy-boto3-redshift (>=1.36.0,<1.37.0)"] +redshift-data = ["mypy-boto3-redshift-data (>=1.36.0,<1.37.0)"] +redshift-serverless = ["mypy-boto3-redshift-serverless (>=1.36.0,<1.37.0)"] +rekognition = ["mypy-boto3-rekognition (>=1.36.0,<1.37.0)"] +repostspace = ["mypy-boto3-repostspace (>=1.36.0,<1.37.0)"] +resiliencehub = ["mypy-boto3-resiliencehub (>=1.36.0,<1.37.0)"] +resource-explorer-2 = ["mypy-boto3-resource-explorer-2 (>=1.36.0,<1.37.0)"] +resource-groups = ["mypy-boto3-resource-groups (>=1.36.0,<1.37.0)"] +resourcegroupstaggingapi = ["mypy-boto3-resourcegroupstaggingapi (>=1.36.0,<1.37.0)"] +robomaker = ["mypy-boto3-robomaker (>=1.36.0,<1.37.0)"] +rolesanywhere = ["mypy-boto3-rolesanywhere (>=1.36.0,<1.37.0)"] +route53 = ["mypy-boto3-route53 (>=1.36.0,<1.37.0)"] +route53-recovery-cluster = ["mypy-boto3-route53-recovery-cluster (>=1.36.0,<1.37.0)"] +route53-recovery-control-config = ["mypy-boto3-route53-recovery-control-config (>=1.36.0,<1.37.0)"] +route53-recovery-readiness = ["mypy-boto3-route53-recovery-readiness (>=1.36.0,<1.37.0)"] +route53domains = ["mypy-boto3-route53domains (>=1.36.0,<1.37.0)"] +route53profiles = ["mypy-boto3-route53profiles (>=1.36.0,<1.37.0)"] +route53resolver = ["mypy-boto3-route53resolver (>=1.36.0,<1.37.0)"] +rum = ["mypy-boto3-rum (>=1.36.0,<1.37.0)"] +s3 = ["mypy-boto3-s3 (>=1.36.0,<1.37.0)"] +s3control = ["mypy-boto3-s3control (>=1.36.0,<1.37.0)"] +s3outposts = ["mypy-boto3-s3outposts (>=1.36.0,<1.37.0)"] +s3tables = ["mypy-boto3-s3tables (>=1.36.0,<1.37.0)"] +sagemaker = ["mypy-boto3-sagemaker (>=1.36.0,<1.37.0)"] +sagemaker-a2i-runtime = ["mypy-boto3-sagemaker-a2i-runtime (>=1.36.0,<1.37.0)"] +sagemaker-edge = ["mypy-boto3-sagemaker-edge (>=1.36.0,<1.37.0)"] +sagemaker-featurestore-runtime = ["mypy-boto3-sagemaker-featurestore-runtime (>=1.36.0,<1.37.0)"] +sagemaker-geospatial = ["mypy-boto3-sagemaker-geospatial (>=1.36.0,<1.37.0)"] +sagemaker-metrics = ["mypy-boto3-sagemaker-metrics (>=1.36.0,<1.37.0)"] +sagemaker-runtime = ["mypy-boto3-sagemaker-runtime (>=1.36.0,<1.37.0)"] +savingsplans = ["mypy-boto3-savingsplans (>=1.36.0,<1.37.0)"] +scheduler = ["mypy-boto3-scheduler (>=1.36.0,<1.37.0)"] +schemas = ["mypy-boto3-schemas (>=1.36.0,<1.37.0)"] +sdb = ["mypy-boto3-sdb (>=1.36.0,<1.37.0)"] +secretsmanager = ["mypy-boto3-secretsmanager (>=1.36.0,<1.37.0)"] +security-ir = ["mypy-boto3-security-ir (>=1.36.0,<1.37.0)"] +securityhub = ["mypy-boto3-securityhub (>=1.36.0,<1.37.0)"] +securitylake = ["mypy-boto3-securitylake (>=1.36.0,<1.37.0)"] +serverlessrepo = ["mypy-boto3-serverlessrepo (>=1.36.0,<1.37.0)"] +service-quotas = ["mypy-boto3-service-quotas (>=1.36.0,<1.37.0)"] +servicecatalog = ["mypy-boto3-servicecatalog (>=1.36.0,<1.37.0)"] +servicecatalog-appregistry = ["mypy-boto3-servicecatalog-appregistry (>=1.36.0,<1.37.0)"] +servicediscovery = ["mypy-boto3-servicediscovery (>=1.36.0,<1.37.0)"] +ses = ["mypy-boto3-ses (>=1.36.0,<1.37.0)"] +sesv2 = ["mypy-boto3-sesv2 (>=1.36.0,<1.37.0)"] +shield = ["mypy-boto3-shield (>=1.36.0,<1.37.0)"] +signer = ["mypy-boto3-signer (>=1.36.0,<1.37.0)"] +simspaceweaver = ["mypy-boto3-simspaceweaver (>=1.36.0,<1.37.0)"] +sms = ["mypy-boto3-sms (>=1.36.0,<1.37.0)"] +sms-voice = ["mypy-boto3-sms-voice (>=1.36.0,<1.37.0)"] +snow-device-management = ["mypy-boto3-snow-device-management (>=1.36.0,<1.37.0)"] +snowball = ["mypy-boto3-snowball (>=1.36.0,<1.37.0)"] +sns = ["mypy-boto3-sns (>=1.36.0,<1.37.0)"] +socialmessaging = ["mypy-boto3-socialmessaging (>=1.36.0,<1.37.0)"] +sqs = ["mypy-boto3-sqs (>=1.36.0,<1.37.0)"] +ssm = ["mypy-boto3-ssm (>=1.36.0,<1.37.0)"] +ssm-contacts = ["mypy-boto3-ssm-contacts (>=1.36.0,<1.37.0)"] +ssm-incidents = ["mypy-boto3-ssm-incidents (>=1.36.0,<1.37.0)"] +ssm-quicksetup = ["mypy-boto3-ssm-quicksetup (>=1.36.0,<1.37.0)"] +ssm-sap = ["mypy-boto3-ssm-sap (>=1.36.0,<1.37.0)"] +sso = ["mypy-boto3-sso (>=1.36.0,<1.37.0)"] +sso-admin = ["mypy-boto3-sso-admin (>=1.36.0,<1.37.0)"] +sso-oidc = ["mypy-boto3-sso-oidc (>=1.36.0,<1.37.0)"] +stepfunctions = ["mypy-boto3-stepfunctions (>=1.36.0,<1.37.0)"] +storagegateway = ["mypy-boto3-storagegateway (>=1.36.0,<1.37.0)"] +sts = ["mypy-boto3-sts (>=1.36.0,<1.37.0)"] +supplychain = ["mypy-boto3-supplychain (>=1.36.0,<1.37.0)"] +support = ["mypy-boto3-support (>=1.36.0,<1.37.0)"] +support-app = ["mypy-boto3-support-app (>=1.36.0,<1.37.0)"] +swf = ["mypy-boto3-swf (>=1.36.0,<1.37.0)"] +synthetics = ["mypy-boto3-synthetics (>=1.36.0,<1.37.0)"] +taxsettings = ["mypy-boto3-taxsettings (>=1.36.0,<1.37.0)"] +textract = ["mypy-boto3-textract (>=1.36.0,<1.37.0)"] +timestream-influxdb = ["mypy-boto3-timestream-influxdb (>=1.36.0,<1.37.0)"] +timestream-query = ["mypy-boto3-timestream-query (>=1.36.0,<1.37.0)"] +timestream-write = ["mypy-boto3-timestream-write (>=1.36.0,<1.37.0)"] +tnb = ["mypy-boto3-tnb (>=1.36.0,<1.37.0)"] +transcribe = ["mypy-boto3-transcribe (>=1.36.0,<1.37.0)"] +transfer = ["mypy-boto3-transfer (>=1.36.0,<1.37.0)"] +translate = ["mypy-boto3-translate (>=1.36.0,<1.37.0)"] +trustedadvisor = ["mypy-boto3-trustedadvisor (>=1.36.0,<1.37.0)"] +verifiedpermissions = ["mypy-boto3-verifiedpermissions (>=1.36.0,<1.37.0)"] +voice-id = ["mypy-boto3-voice-id (>=1.36.0,<1.37.0)"] +vpc-lattice = ["mypy-boto3-vpc-lattice (>=1.36.0,<1.37.0)"] +waf = ["mypy-boto3-waf (>=1.36.0,<1.37.0)"] +waf-regional = ["mypy-boto3-waf-regional (>=1.36.0,<1.37.0)"] +wafv2 = ["mypy-boto3-wafv2 (>=1.36.0,<1.37.0)"] +wellarchitected = ["mypy-boto3-wellarchitected (>=1.36.0,<1.37.0)"] +wisdom = ["mypy-boto3-wisdom (>=1.36.0,<1.37.0)"] +workdocs = ["mypy-boto3-workdocs (>=1.36.0,<1.37.0)"] +workmail = ["mypy-boto3-workmail (>=1.36.0,<1.37.0)"] +workmailmessageflow = ["mypy-boto3-workmailmessageflow (>=1.36.0,<1.37.0)"] +workspaces = ["mypy-boto3-workspaces (>=1.36.0,<1.37.0)"] +workspaces-thin-client = ["mypy-boto3-workspaces-thin-client (>=1.36.0,<1.37.0)"] +workspaces-web = ["mypy-boto3-workspaces-web (>=1.36.0,<1.37.0)"] +xray = ["mypy-boto3-xray (>=1.36.0,<1.37.0)"] [[package]] name = "botocore" @@ -2529,13 +2529,13 @@ reports = ["lxml"] [[package]] name = "mypy-boto3-appconfig" -version = "1.35.93" -description = "Type annotations for boto3 AppConfig 1.35.93 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.0" +description = "Type annotations for boto3 AppConfig 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_appconfig-1.35.93-py3-none-any.whl", hash = "sha256:108ad0bfda450de4844c107f2f2c210a57d2eea5dc6ebf2b847baa1f195a9df8"}, - {file = "mypy_boto3_appconfig-1.35.93.tar.gz", hash = "sha256:638d91bff5bb7773fdb271a2d91947141b211b8ad729c0dd7dde9a4fe1e1e412"}, + {file = "mypy_boto3_appconfig-1.36.0-py3-none-any.whl", hash = "sha256:d627de43761a83991a0ab8cd10698d415f94dcc78a567433c7465fc8d1f5cc16"}, + {file = "mypy_boto3_appconfig-1.36.0.tar.gz", hash = "sha256:3f38cbd2d7d359da88dc996eeeafa4c1174847909e31a327dd77263dfdfd5424"}, ] [package.dependencies] @@ -2543,13 +2543,13 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-appconfigdata" -version = "1.35.93" -description = "Type annotations for boto3 AppConfigData 1.35.93 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.0" +description = "Type annotations for boto3 AppConfigData 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_appconfigdata-1.35.93-py3-none-any.whl", hash = "sha256:d93d5a1d7ed5e2caee3555157713ae5f1eaac29888b2e3fd73aba9694196b74f"}, - {file = "mypy_boto3_appconfigdata-1.35.93.tar.gz", hash = "sha256:010b2db1984e03e35e204d63100a6ebc0eca2a6830ef0ac5c60702f80ffd4ffb"}, + {file = "mypy_boto3_appconfigdata-1.36.0-py3-none-any.whl", hash = "sha256:68f02ce06ed9597b02154aff64655fc38c42919eda08fddb130ba17e9f70e9cb"}, + {file = "mypy_boto3_appconfigdata-1.36.0.tar.gz", hash = "sha256:3436d149833ea69b4260a0f352aac19258d4676c7a21087625906f7da98624c7"}, ] [package.dependencies] @@ -2557,13 +2557,13 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-cloudformation" -version = "1.35.93" -description = "Type annotations for boto3 CloudFormation 1.35.93 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.0" +description = "Type annotations for boto3 CloudFormation 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_cloudformation-1.35.93-py3-none-any.whl", hash = "sha256:4111913cb2c9fd9099ecd616212923312fde0c126ee41f5821759ae9df4272b9"}, - {file = "mypy_boto3_cloudformation-1.35.93.tar.gz", hash = "sha256:57dc112ff3e2ddc1e9e621e428490b904c0da8c1532d30e9fa2a19aefde9f719"}, + {file = "mypy_boto3_cloudformation-1.36.0-py3-none-any.whl", hash = "sha256:3f6cd81739aaf9634c4aa2b92579081038a76e4f2dec306d02eaaf558b332ce9"}, + {file = "mypy_boto3_cloudformation-1.36.0.tar.gz", hash = "sha256:acc2c7ae8920f1167be097f6151685fe5aee99be2f890075edf93e05d298e8b0"}, ] [package.dependencies] @@ -2571,13 +2571,13 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-cloudwatch" -version = "1.35.93" -description = "Type annotations for boto3 CloudWatch 1.35.93 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.0" +description = "Type annotations for boto3 CloudWatch 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_cloudwatch-1.35.93-py3-none-any.whl", hash = "sha256:bd9b66952a85a71b137db8f605c9bb1fa862337ea3e8f854c802ef4d386f86fb"}, - {file = "mypy_boto3_cloudwatch-1.35.93.tar.gz", hash = "sha256:2af0c2ab7ef69f49031e7487a4eaee1c06079ac8bd0a7a80b4e906da94aea496"}, + {file = "mypy_boto3_cloudwatch-1.36.0-py3-none-any.whl", hash = "sha256:2f6cb81c05a1b4be3510e0857b22913a241488bc08f55b0ad96e8b775c144891"}, + {file = "mypy_boto3_cloudwatch-1.36.0.tar.gz", hash = "sha256:a370d61522121ab457c443c338a652d0d3e1c22102d9db9f197fd5dcb7e656a4"}, ] [package.dependencies] @@ -2585,13 +2585,13 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-dynamodb" -version = "1.35.94" -description = "Type annotations for boto3 DynamoDB 1.35.94 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.0" +description = "Type annotations for boto3 DynamoDB 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_dynamodb-1.35.94-py3-none-any.whl", hash = "sha256:187c12a968dcc459bab3bb958becbfc22ddd4eca29ba69f9f4e00661b9dad86e"}, - {file = "mypy_boto3_dynamodb-1.35.94.tar.gz", hash = "sha256:9128bc9dfa574f1f6fe3991ec8c33b34626d26a767b961973a95f7610d8e98c1"}, + {file = "mypy_boto3_dynamodb-1.36.0-py3-none-any.whl", hash = "sha256:b782a817ce8956f8d53ac94c85f969dfe51451fc99f16a3b62776f1e0ed3f1ba"}, + {file = "mypy_boto3_dynamodb-1.36.0.tar.gz", hash = "sha256:1687e4689236a5391755126e86ec2596d408eb95408c31ac09a3d1eb289d516d"}, ] [package.dependencies] @@ -2599,13 +2599,13 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-lambda" -version = "1.35.93" -description = "Type annotations for boto3 Lambda 1.35.93 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.0" +description = "Type annotations for boto3 Lambda 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_lambda-1.35.93-py3-none-any.whl", hash = "sha256:6bcd623c827724cde0b21b30c328515811b178763b75f0701a641cc7aa3aa414"}, - {file = "mypy_boto3_lambda-1.35.93.tar.gz", hash = "sha256:c11b047743c7635ea8385abffaf97788a108b71479612e9b5e7d0bb19029d7a4"}, + {file = "mypy_boto3_lambda-1.36.0-py3-none-any.whl", hash = "sha256:8a6693be1352b51e232cee73f73ce36014d19b4777bdf6969c5e707aba424ca1"}, + {file = "mypy_boto3_lambda-1.36.0.tar.gz", hash = "sha256:5e9f23702060529aad216a3ce2a2368391a112df07909fbd3aa80d573d84893c"}, ] [package.dependencies] @@ -2613,13 +2613,13 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-logs" -version = "1.35.93" -description = "Type annotations for boto3 CloudWatchLogs 1.35.93 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.0" +description = "Type annotations for boto3 CloudWatchLogs 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_logs-1.35.93-py3-none-any.whl", hash = "sha256:cef85814d6f7390ef9ed61fa4872f9b3d63983e6d1640df36cac97b6daef3724"}, - {file = "mypy_boto3_logs-1.35.93.tar.gz", hash = "sha256:8ef2624e3d846695328182b647a86f85fcb4a78640ed15f716709f90622a369b"}, + {file = "mypy_boto3_logs-1.36.0-py3-none-any.whl", hash = "sha256:e6915823bef5f4c588005e729422a900365b9ea88b123c3750a97f31af2c9cbe"}, + {file = "mypy_boto3_logs-1.36.0.tar.gz", hash = "sha256:a10cc4d46927df1241868f0a4fff63d7fd5d2d04349663ed9d7790b8c9dbb9bc"}, ] [package.dependencies] @@ -2627,13 +2627,13 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-s3" -version = "1.35.93" -description = "Type annotations for boto3 S3 1.35.93 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.0" +description = "Type annotations for boto3 S3 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_s3-1.35.93-py3-none-any.whl", hash = "sha256:4cd3f1718fa0d8a54212c495cdff493bdcc6a8ae419d95428c60fb6bc7db7980"}, - {file = "mypy_boto3_s3-1.35.93.tar.gz", hash = "sha256:b4529e57a8d5f21d4c61fe650fa6764fee2ba7ab524a455a34ba2698ef6d27a8"}, + {file = "mypy_boto3_s3-1.36.0-py3-none-any.whl", hash = "sha256:a65ccb6be7b7ebf907887268d44975e435b1fc1164fc0a25de310e2b832f7e91"}, + {file = "mypy_boto3_s3-1.36.0.tar.gz", hash = "sha256:80a881847b0e1fbc5edcad8b2870c110e31e7ef128db42402b70c159b7e93d5a"}, ] [package.dependencies] @@ -2641,13 +2641,13 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-secretsmanager" -version = "1.35.93" -description = "Type annotations for boto3 SecretsManager 1.35.93 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.0" +description = "Type annotations for boto3 SecretsManager 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_secretsmanager-1.35.93-py3-none-any.whl", hash = "sha256:521075d42b6d05f0d7302d1837520e9111a84d6613152d32dc8cbb3cd6fceeec"}, - {file = "mypy_boto3_secretsmanager-1.35.93.tar.gz", hash = "sha256:b6c4bc88a5fe4143124272728d41342e01c778b406db9d647a20dad0de7d6f47"}, + {file = "mypy_boto3_secretsmanager-1.36.0-py3-none-any.whl", hash = "sha256:d7fd56b08afed32ce26f2663ec57f9ea074e1e5149a4388eccb46653e3cb5a66"}, + {file = "mypy_boto3_secretsmanager-1.36.0.tar.gz", hash = "sha256:6e1f91cd5b0c1f0533f8cfa91e4755855d39931475e7d1e23ee8dbb2e7163d18"}, ] [package.dependencies] @@ -2655,13 +2655,13 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-ssm" -version = "1.35.93" -description = "Type annotations for boto3 SSM 1.35.93 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.0" +description = "Type annotations for boto3 SSM 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_ssm-1.35.93-py3-none-any.whl", hash = "sha256:7c115ee920e994ffc12408685b4236f4ad72f64a971c380aa63be21becf297ad"}, - {file = "mypy_boto3_ssm-1.35.93.tar.gz", hash = "sha256:2e2610e33ca4a075595d30fa061ef2e54c9d9b6ced14a196316dcd032372dd8c"}, + {file = "mypy_boto3_ssm-1.36.0-py3-none-any.whl", hash = "sha256:c79a6a949f0b57e68bd48d3d15eb56b975633ffdfaa449d119831c205228cab6"}, + {file = "mypy_boto3_ssm-1.36.0.tar.gz", hash = "sha256:bbb9a9ce0e318cad2a53f8200102b4fdc547c7f33912146df82698c9ae40181f"}, ] [package.dependencies] @@ -2669,13 +2669,13 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-xray" -version = "1.35.93" -description = "Type annotations for boto3 XRay 1.35.93 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.0" +description = "Type annotations for boto3 XRay 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_xray-1.35.93-py3-none-any.whl", hash = "sha256:e80c2be40c5cb4851dc08c145101b4e52a6f471dab0fc5f488975f6e14f7cb93"}, - {file = "mypy_boto3_xray-1.35.93.tar.gz", hash = "sha256:7e0af9474f06da1923aa37c8639b051042cc3a56d1a36b0141124d9de7be6709"}, + {file = "mypy_boto3_xray-1.36.0-py3-none-any.whl", hash = "sha256:b92a06db10f623db4ec0641227f468b7a57c77f8e599846cfddace4b434f70a5"}, + {file = "mypy_boto3_xray-1.36.0.tar.gz", hash = "sha256:5ae2b4c333bf2881870ffb96f1d99cd5e7ee1706d071b6923dcd6de6ceb3ac0c"}, ] [package.dependencies] @@ -4419,4 +4419,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<4.0.0" -content-hash = "c836791b03240691cff46292b30968c8380fe64a3b77adacd6764141c7fc15d6" +content-hash = "49e653fc6545a9a9eacf40092df803a9c1d73cdceb1fa60c0e3314d6e2f9b0b7" diff --git a/pyproject.toml b/pyproject.toml index 8a1b1435c96..e454c2a4a77 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,7 +84,7 @@ typing-extensions = "^4.12.2" mkdocs-material = "^9.5.49" filelock = "^3.16.0" dirhash = "^0.5.0" -mypy-boto3-appconfigdata = "^1.35.93" +mypy-boto3-appconfigdata = "^1.36.0" ijson = "^3.3.0" typed-ast = { version = "^1.5.5", python = "< 3.8" } hvac = "^2.3.0" From 4a1141872a6f7b738dd493a7f3163749575002bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Jan 2025 10:50:43 -0300 Subject: [PATCH 09/52] chore(deps-dev): bump aws-cdk-lib from 2.175.1 to 2.176.0 (#5876) Bumps [aws-cdk-lib](https://github.com/aws/aws-cdk) from 2.175.1 to 2.176.0. - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.md) - [Commits](https://github.com/aws/aws-cdk/compare/v2.175.1...v2.176.0) --- updated-dependencies: - dependency-name: aws-cdk-lib dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 6d21adf4170..d9faecf44e7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -238,13 +238,13 @@ typeguard = ">=2.13.3,<4.3.0" [[package]] name = "aws-cdk-lib" -version = "2.175.1" +version = "2.176.0" description = "Version 2 of the AWS Cloud Development Kit library" optional = false python-versions = "~=3.8" files = [ - {file = "aws_cdk_lib-2.175.1-py3-none-any.whl", hash = "sha256:d66ac587a3571b6bfcf11b07f04f02ff3f12e42e87c8783aadb6043df7f638f6"}, - {file = "aws_cdk_lib-2.175.1.tar.gz", hash = "sha256:e7bafecb2b9de7e315f0c615a88bc91d226e1ddea3cdfaf4c72c6b6f48a78c74"}, + {file = "aws_cdk_lib-2.176.0-py3-none-any.whl", hash = "sha256:c362a92f06b6ea60a7eff7994d3994c462358e7a95ce3de01a28efab4f6d56b6"}, + {file = "aws_cdk_lib-2.176.0.tar.gz", hash = "sha256:87a39d2f42fd2ea8ba2bfa364355303953fb5cc2886479ca5acf09a14a9fd679"}, ] [package.dependencies] @@ -4419,4 +4419,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<4.0.0" -content-hash = "49e653fc6545a9a9eacf40092df803a9c1d73cdceb1fa60c0e3314d6e2f9b0b7" +content-hash = "6ec0f0477a16adf467d9a539e7be54a7ef69c8720d62a46baae8b44a6b074e18" diff --git a/pyproject.toml b/pyproject.toml index e454c2a4a77..0e3a0717235 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -72,7 +72,7 @@ xenon = "^0.9.3" mkdocs-git-revision-date-plugin = "^0.3.2" mike = "^2.1.2" pytest-xdist = "^3.6.1" -aws-cdk-lib = "^2.175.1" +aws-cdk-lib = "^2.176.0" "aws-cdk.aws-apigatewayv2-alpha" = "^2.38.1-alpha.0" "aws-cdk.aws-apigatewayv2-integrations-alpha" = "^2.38.1-alpha.0" "aws-cdk.aws-apigatewayv2-authorizers-alpha" = "^2.38.1-alpha.0" From cba8861f69d66af0047a2be1ce0feb53e5c93be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=20Falc=C3=A3o?= Date: Fri, 17 Jan 2025 11:23:56 -0300 Subject: [PATCH 10/52] fix(parser): make identitySource optional for ApiGatewayAuthorizerRequestV2 model (#5880) fix(parser): identitySource is optional for ApiGatewayAuthorizerRequestV2 Co-authored-by: Leandro Damascena --- aws_lambda_powertools/utilities/parser/models/apigwv2.py | 2 +- tests/unit/parser/_pydantic/test_apigwv2.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/apigwv2.py b/aws_lambda_powertools/utilities/parser/models/apigwv2.py index 943d42a8e01..540e7c1a30b 100644 --- a/aws_lambda_powertools/utilities/parser/models/apigwv2.py +++ b/aws_lambda_powertools/utilities/parser/models/apigwv2.py @@ -72,4 +72,4 @@ class APIGatewayProxyEventV2Model(BaseModel): class ApiGatewayAuthorizerRequestV2(APIGatewayProxyEventV2Model): type: Literal["REQUEST"] routeArn: str - identitySource: List[str] + identitySource: Optional[List[str]] = None diff --git a/tests/unit/parser/_pydantic/test_apigwv2.py b/tests/unit/parser/_pydantic/test_apigwv2.py index cec9e05bccd..ddb849bb68a 100644 --- a/tests/unit/parser/_pydantic/test_apigwv2.py +++ b/tests/unit/parser/_pydantic/test_apigwv2.py @@ -130,3 +130,12 @@ def test_apigw_v2_request_authorizer(): assert parsed_event.type == raw_event["type"] assert parsed_event.identitySource == raw_event["identitySource"] assert parsed_event.routeArn == raw_event["routeArn"] + + +def test_apigw_v2_request_authorizer_without_identity_source(): + raw_event = load_event("apiGatewayAuthorizerV2Event.json") + raw_event["identitySource"] = None + + parsed_event: ApiGatewayAuthorizerRequestV2 = ApiGatewayAuthorizerRequestV2(**raw_event) + + assert parsed_event.identitySource == raw_event["identitySource"] From 4182ad75318b8cf55d0615998b7e05d5176cb5e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:13:48 -0300 Subject: [PATCH 11/52] chore(deps-dev): bump ruff from 0.9.1 to 0.9.2 (#5877) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [ruff](https://github.com/astral-sh/ruff) from 0.9.1 to 0.9.2. - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.9.1...0.9.2) --- updated-dependencies: - dependency-name: ruff dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ana Falcão --- poetry.lock | 40 ++++++++++++++++++++-------------------- pyproject.toml | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/poetry.lock b/poetry.lock index d9faecf44e7..8f0870e2edb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3705,29 +3705,29 @@ files = [ [[package]] name = "ruff" -version = "0.9.1" +version = "0.9.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.9.1-py3-none-linux_armv6l.whl", hash = "sha256:84330dda7abcc270e6055551aca93fdde1b0685fc4fd358f26410f9349cf1743"}, - {file = "ruff-0.9.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3cae39ba5d137054b0e5b472aee3b78a7c884e61591b100aeb544bcd1fc38d4f"}, - {file = "ruff-0.9.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:50c647ff96f4ba288db0ad87048257753733763b409b2faf2ea78b45c8bb7fcb"}, - {file = "ruff-0.9.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0c8b149e9c7353cace7d698e1656ffcf1e36e50f8ea3b5d5f7f87ff9986a7ca"}, - {file = "ruff-0.9.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:beb3298604540c884d8b282fe7625651378e1986c25df51dec5b2f60cafc31ce"}, - {file = "ruff-0.9.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39d0174ccc45c439093971cc06ed3ac4dc545f5e8bdacf9f067adf879544d969"}, - {file = "ruff-0.9.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:69572926c0f0c9912288915214ca9b2809525ea263603370b9e00bed2ba56dbd"}, - {file = "ruff-0.9.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:937267afce0c9170d6d29f01fcd1f4378172dec6760a9f4dface48cdabf9610a"}, - {file = "ruff-0.9.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:186c2313de946f2c22bdf5954b8dd083e124bcfb685732cfb0beae0c47233d9b"}, - {file = "ruff-0.9.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f94942a3bb767675d9a051867c036655fe9f6c8a491539156a6f7e6b5f31831"}, - {file = "ruff-0.9.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:728d791b769cc28c05f12c280f99e8896932e9833fef1dd8756a6af2261fd1ab"}, - {file = "ruff-0.9.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2f312c86fb40c5c02b44a29a750ee3b21002bd813b5233facdaf63a51d9a85e1"}, - {file = "ruff-0.9.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ae017c3a29bee341ba584f3823f805abbe5fe9cd97f87ed07ecbf533c4c88366"}, - {file = "ruff-0.9.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5dc40a378a0e21b4cfe2b8a0f1812a6572fc7b230ef12cd9fac9161aa91d807f"}, - {file = "ruff-0.9.1-py3-none-win32.whl", hash = "sha256:46ebf5cc106cf7e7378ca3c28ce4293b61b449cd121b98699be727d40b79ba72"}, - {file = "ruff-0.9.1-py3-none-win_amd64.whl", hash = "sha256:342a824b46ddbcdddd3abfbb332fa7fcaac5488bf18073e841236aadf4ad5c19"}, - {file = "ruff-0.9.1-py3-none-win_arm64.whl", hash = "sha256:1cd76c7f9c679e6e8f2af8f778367dca82b95009bc7b1a85a47f1521ae524fa7"}, - {file = "ruff-0.9.1.tar.gz", hash = "sha256:fd2b25ecaf907d6458fa842675382c8597b3c746a2dde6717fe3415425df0c17"}, + {file = "ruff-0.9.2-py3-none-linux_armv6l.whl", hash = "sha256:80605a039ba1454d002b32139e4970becf84b5fee3a3c3bf1c2af6f61a784347"}, + {file = "ruff-0.9.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9aab82bb20afd5f596527045c01e6ae25a718ff1784cb92947bff1f83068b00"}, + {file = "ruff-0.9.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fbd337bac1cfa96be615f6efcd4bc4d077edbc127ef30e2b8ba2a27e18c054d4"}, + {file = "ruff-0.9.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b35259b0cbf8daa22a498018e300b9bb0174c2bbb7bcba593935158a78054d"}, + {file = "ruff-0.9.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b6a9701d1e371bf41dca22015c3f89769da7576884d2add7317ec1ec8cb9c3c"}, + {file = "ruff-0.9.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cc53e68b3c5ae41e8faf83a3b89f4a5d7b2cb666dff4b366bb86ed2a85b481f"}, + {file = "ruff-0.9.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8efd9da7a1ee314b910da155ca7e8953094a7c10d0c0a39bfde3fcfd2a015684"}, + {file = "ruff-0.9.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3292c5a22ea9a5f9a185e2d131dc7f98f8534a32fb6d2ee7b9944569239c648d"}, + {file = "ruff-0.9.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a605fdcf6e8b2d39f9436d343d1f0ff70c365a1e681546de0104bef81ce88df"}, + {file = "ruff-0.9.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c547f7f256aa366834829a08375c297fa63386cbe5f1459efaf174086b564247"}, + {file = "ruff-0.9.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d18bba3d3353ed916e882521bc3e0af403949dbada344c20c16ea78f47af965e"}, + {file = "ruff-0.9.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b338edc4610142355ccf6b87bd356729b62bf1bc152a2fad5b0c7dc04af77bfe"}, + {file = "ruff-0.9.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:492a5e44ad9b22a0ea98cf72e40305cbdaf27fac0d927f8bc9e1df316dcc96eb"}, + {file = "ruff-0.9.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:af1e9e9fe7b1f767264d26b1075ac4ad831c7db976911fa362d09b2d0356426a"}, + {file = "ruff-0.9.2-py3-none-win32.whl", hash = "sha256:71cbe22e178c5da20e1514e1e01029c73dc09288a8028a5d3446e6bba87a5145"}, + {file = "ruff-0.9.2-py3-none-win_amd64.whl", hash = "sha256:c5e1d6abc798419cf46eed03f54f2e0c3adb1ad4b801119dedf23fcaf69b55b5"}, + {file = "ruff-0.9.2-py3-none-win_arm64.whl", hash = "sha256:a1b63fa24149918f8b37cef2ee6fff81f24f0d74b6f0bdc37bc3e1f2143e41c6"}, + {file = "ruff-0.9.2.tar.gz", hash = "sha256:b5eceb334d55fae5f316f783437392642ae18e16dcf4f1858d55d3c2a0f8f5d0"}, ] [[package]] @@ -4419,4 +4419,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<4.0.0" -content-hash = "6ec0f0477a16adf467d9a539e7be54a7ef69c8720d62a46baae8b44a6b074e18" +content-hash = "67ec31308bb1f311dbf91732cc75668fabc333ebfa96f48bb19b45c3da5296aa" diff --git a/pyproject.toml b/pyproject.toml index 0e3a0717235..48b4f8c5632 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -117,7 +117,7 @@ types-python-dateutil = "^2.8.19.6" aws-cdk-aws-appsync-alpha = "^2.59.0a0" httpx = ">=0.23.3,<0.29.0" sentry-sdk = ">=1.22.2,<3.0.0" -ruff = ">=0.5.1,<0.9.2" +ruff = ">=0.5.1,<0.9.3" retry2 = "^0.9.5" pytest-socket = ">=0.6,<0.8" types-redis = "^4.6.0.7" From f483d85ff029d6771481f1d0a9eac1b3e631ad83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:14:30 -0300 Subject: [PATCH 12/52] chore(deps-dev): bump aws-cdk from 2.175.1 to 2.176.0 (#5878) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [aws-cdk](https://github.com/aws/aws-cdk/tree/HEAD/packages/aws-cdk) from 2.175.1 to 2.176.0. - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.md) - [Commits](https://github.com/aws/aws-cdk/commits/v2.176.0/packages/aws-cdk) --- updated-dependencies: - dependency-name: aws-cdk dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ana Falcão --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2acb80fe6b5..00ca5e80dfe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,13 +11,13 @@ "package-lock.json": "^1.0.0" }, "devDependencies": { - "aws-cdk": "^2.175.1" + "aws-cdk": "^2.176.0" } }, "node_modules/aws-cdk": { - "version": "2.175.1", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.175.1.tgz", - "integrity": "sha512-duvy0FtGAAYqJi/x0MjBfCp60ZlDYl0X5/GrADwMz4AfHQ8aTXCyaVsdJuCxz0ZMHSNaFRuCNkAlc2Xu43zQmQ==", + "version": "2.176.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.176.0.tgz", + "integrity": "sha512-yRjIXzK2ddznwuSjasWAViYBtBSQbEu6GHlylaC3GHsIUPhrK3KguqIuhdlxjMeiQ1Fvok8REDLCReZJdrSLLg==", "dev": true, "bin": { "cdk": "bin/cdk" diff --git a/package.json b/package.json index 7dc1ceb80e8..a45d2e72095 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "aws-lambda-powertools-python-e2e", "version": "1.0.0", "devDependencies": { - "aws-cdk": "^2.175.1" + "aws-cdk": "^2.176.0" }, "dependencies": { "package-lock.json": "^1.0.0" From 4a8d4e88af69c28b423fcdf2f79b8456d2019000 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Jan 2025 17:56:13 -0300 Subject: [PATCH 13/52] chore(deps-dev): bump boto3-stubs from 1.36.1 to 1.36.2 (#5881) Bumps [boto3-stubs](https://github.com/youtype/mypy_boto3_builder) from 1.36.1 to 1.36.2. - [Release notes](https://github.com/youtype/mypy_boto3_builder/releases) - [Commits](https://github.com/youtype/mypy_boto3_builder/commits) --- updated-dependencies: - dependency-name: boto3-stubs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8f0870e2edb..1d33bdb5324 100644 --- a/poetry.lock +++ b/poetry.lock @@ -434,13 +434,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.1" -description = "Type annotations for boto3 1.36.1 generated with mypy-boto3-builder 8.8.0" +version = "1.36.2" +description = "Type annotations for boto3 1.36.2 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.36.1-py3-none-any.whl", hash = "sha256:ddc44b30598067a6c20bd8df4e72cf4155be8dc29fb2cd3e7ed26149cf7dd69a"}, - {file = "boto3_stubs-1.36.1.tar.gz", hash = "sha256:d7cbf8aab4eacf0988a879243bbb5cd3139f08f83e82c9556c3412d71373840f"}, + {file = "boto3_stubs-1.36.2-py3-none-any.whl", hash = "sha256:3bc33c96f10c5121cc49332bfa276a832274e737ff90b8e7b3226dff48037b57"}, + {file = "boto3_stubs-1.36.2.tar.gz", hash = "sha256:f401e585cc7df4ddfb3e02fb95c5ecf86e7d41561c3efb802ba4608e1ad4b660"}, ] [package.dependencies] @@ -507,7 +507,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.1)"] +boto3 = ["boto3 (==1.36.2)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] From 57becbbf489e98cf0dbae1402c00a585253a1384 Mon Sep 17 00:00:00 2001 From: xdxindustries <43797905+xdxindustries@users.noreply.github.com> Date: Mon, 20 Jan 2025 02:24:57 -0800 Subject: [PATCH 14/52] fix(event_handler): fix forward references resolution in OpenAPI (#5885) fix(event_handler): fix typo in OpenAPI type resolution parser" Co-authored-by: Jason Tuck --- aws_lambda_powertools/event_handler/openapi/dependant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/event_handler/openapi/dependant.py b/aws_lambda_powertools/event_handler/openapi/dependant.py index e4f2f822ce1..f4d0551b739 100644 --- a/aws_lambda_powertools/event_handler/openapi/dependant.py +++ b/aws_lambda_powertools/event_handler/openapi/dependant.py @@ -106,7 +106,7 @@ def get_typed_signature(call: Callable[..., Any]) -> inspect.Signature: signature = inspect.signature(call) # Gets the global namespace for the call. This is used to resolve forward references. - globalns = getattr(call, "__global__", {}) + globalns = getattr(call, "__globals__", {}) typed_params = [ inspect.Parameter( From 465afe54f1def949cc60178533852f170c02e363 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 10:27:16 +0000 Subject: [PATCH 15/52] chore(deps-dev): bump aws-cdk-aws-lambda-python-alpha from 2.175.1a0 to 2.176.0a0 (#5882) chore(deps-dev): bump aws-cdk-aws-lambda-python-alpha Bumps [aws-cdk-aws-lambda-python-alpha](https://github.com/aws/aws-cdk) from 2.175.1a0 to 2.176.0a0. - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.md) - [Commits](https://github.com/aws/aws-cdk/commits) --- updated-dependencies: - dependency-name: aws-cdk-aws-lambda-python-alpha dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 10 +++++----- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1d33bdb5324..30c1ba7e9bf 100644 --- a/poetry.lock +++ b/poetry.lock @@ -204,17 +204,17 @@ typeguard = ">=2.13.3,<2.14.0" [[package]] name = "aws-cdk-aws-lambda-python-alpha" -version = "2.175.1a0" +version = "2.176.0a0" description = "The CDK Construct Library for AWS Lambda in Python" optional = false python-versions = "~=3.8" files = [ - {file = "aws_cdk.aws_lambda_python_alpha-2.175.1a0-py3-none-any.whl", hash = "sha256:77b414e5df4754b65827538df2dc036d3bcac33ead87af4569d0a380e9bb9827"}, - {file = "aws_cdk_aws_lambda_python_alpha-2.175.1a0.tar.gz", hash = "sha256:2d70da0bc40a29ba464415bccf0eafeef1f0fb5d58f3138455539e6a604afcb5"}, + {file = "aws_cdk.aws_lambda_python_alpha-2.176.0a0-py3-none-any.whl", hash = "sha256:d7a9223393b815e9b2d2e69f06c216b8e12e577f8ab58aeb56cb05c92de7f7bb"}, + {file = "aws_cdk_aws_lambda_python_alpha-2.176.0a0.tar.gz", hash = "sha256:0a2737e098e88a553a284f688c7621067cebf32ba21ad3e8e7911bb70ce67049"}, ] [package.dependencies] -aws-cdk-lib = ">=2.175.1,<3.0.0" +aws-cdk-lib = ">=2.176.0,<3.0.0" constructs = ">=10.0.0,<11.0.0" jsii = ">=1.104.0,<2.0.0" publication = ">=0.0.3" @@ -4419,4 +4419,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<4.0.0" -content-hash = "67ec31308bb1f311dbf91732cc75668fabc333ebfa96f48bb19b45c3da5296aa" +content-hash = "439521a7221d64379271522458208c25c2a2a561101e24ff47307c3ab9fb3ea2" diff --git a/pyproject.toml b/pyproject.toml index 48b4f8c5632..180f22b1ee8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -76,7 +76,7 @@ aws-cdk-lib = "^2.176.0" "aws-cdk.aws-apigatewayv2-alpha" = "^2.38.1-alpha.0" "aws-cdk.aws-apigatewayv2-integrations-alpha" = "^2.38.1-alpha.0" "aws-cdk.aws-apigatewayv2-authorizers-alpha" = "^2.38.1-alpha.0" -"aws-cdk.aws-lambda-python-alpha" = "^2.174.1a0" +"aws-cdk.aws-lambda-python-alpha" = "^2.176.0a0" "cdklabs.generative-ai-cdk-constructs" = "^0.1.289" pytest-benchmark = "^4.0.0" types-requests = "^2.31.0" From fea7687f181df23e177f1abc209bf463a931dc3a Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 20 Jan 2025 13:29:01 +0000 Subject: [PATCH 16/52] fix(event_handler): add tests for PEP 563 compatibility with OpenAPI (#5886) Adding tests with OpenAPI and PEP563 --- .../handlers/openapi_handler_with_pep563.py | 36 ++++++ tests/e2e/event_handler/infrastructure.py | 11 +- tests/e2e/event_handler/test_openapi.py | 17 +++ .../_pydantic/test_openapi_with_pep563.py | 120 ++++++++++++++++++ 4 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 tests/e2e/event_handler/handlers/openapi_handler_with_pep563.py create mode 100644 tests/functional/event_handler/_pydantic/test_openapi_with_pep563.py diff --git a/tests/e2e/event_handler/handlers/openapi_handler_with_pep563.py b/tests/e2e/event_handler/handlers/openapi_handler_with_pep563.py new file mode 100644 index 00000000000..a6f0ba29a8b --- /dev/null +++ b/tests/e2e/event_handler/handlers/openapi_handler_with_pep563.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +from pydantic import BaseModel, Field + +from aws_lambda_powertools.event_handler import ( + APIGatewayRestResolver, +) + + +class Todo(BaseModel): + id: int = Field(examples=[1]) + title: str = Field(examples=["Example 1"]) + priority: float = Field(examples=[0.5]) + completed: bool = Field(examples=[True]) + + +app = APIGatewayRestResolver(enable_validation=True) + + +@app.get("/openapi_schema_with_pep563") +def openapi_schema(): + return app.get_openapi_json_schema( + title="Powertools e2e API", + version="1.0.0", + description="This is a sample Powertools e2e API", + openapi_extensions={"x-amazon-apigateway-gateway-responses": {"DEFAULT_4XX"}}, + ) + + +@app.get("/") +def handler() -> Todo: + return Todo(id=0, title="", priority=0.0, completed=False) + + +def lambda_handler(event, context): + return app.resolve(event, context) diff --git a/tests/e2e/event_handler/infrastructure.py b/tests/e2e/event_handler/infrastructure.py index 9d7dbc46c40..142034e89b2 100644 --- a/tests/e2e/event_handler/infrastructure.py +++ b/tests/e2e/event_handler/infrastructure.py @@ -18,7 +18,13 @@ def create_resources(self): functions = self.create_lambda_functions(function_props={"timeout": Duration.seconds(10)}) self._create_alb(function=[functions["AlbHandler"], functions["AlbHandlerWithBodyNone"]]) - self._create_api_gateway_rest(function=[functions["ApiGatewayRestHandler"], functions["OpenapiHandler"]]) + self._create_api_gateway_rest( + function=[ + functions["ApiGatewayRestHandler"], + functions["OpenapiHandler"], + functions["OpenapiHandlerWithPep563"], + ], + ) self._create_api_gateway_http(function=functions["ApiGatewayHttpHandler"]) self._create_lambda_function_url(function=functions["LambdaFunctionUrlHandler"]) @@ -92,6 +98,9 @@ def _create_api_gateway_rest(self, function: List[Function]): openapi_schema = apigw.root.add_resource("openapi_schema") openapi_schema.add_method("GET", apigwv1.LambdaIntegration(function[1], proxy=True)) + openapi_schema = apigw.root.add_resource("openapi_schema_with_pep563") + openapi_schema.add_method("GET", apigwv1.LambdaIntegration(function[2], proxy=True)) + CfnOutput(self.stack, "APIGatewayRestUrl", value=apigw.url) def _create_lambda_function_url(self, function: Function): diff --git a/tests/e2e/event_handler/test_openapi.py b/tests/e2e/event_handler/test_openapi.py index d69c3b142b2..3a8d6b3c008 100644 --- a/tests/e2e/event_handler/test_openapi.py +++ b/tests/e2e/event_handler/test_openapi.py @@ -25,3 +25,20 @@ def test_get_openapi_schema(apigw_rest_endpoint): assert "Powertools e2e API" in response.text assert "x-amazon-apigateway-gateway-responses" in response.text assert response.status_code == 200 + + +def test_get_openapi_schema_with_pep563(apigw_rest_endpoint): + # GIVEN + url = f"{apigw_rest_endpoint}openapi_schema_with_pep563" + + # WHEN + response = data_fetcher.get_http_response( + Request( + method="GET", + url=url, + ), + ) + + assert "Powertools e2e API" in response.text + assert "x-amazon-apigateway-gateway-responses" in response.text + assert response.status_code == 200 diff --git a/tests/functional/event_handler/_pydantic/test_openapi_with_pep563.py b/tests/functional/event_handler/_pydantic/test_openapi_with_pep563.py new file mode 100644 index 00000000000..1855aef45e2 --- /dev/null +++ b/tests/functional/event_handler/_pydantic/test_openapi_with_pep563.py @@ -0,0 +1,120 @@ +from __future__ import annotations + +from pydantic import BaseModel, Field +from typing_extensions import Annotated + +from aws_lambda_powertools.event_handler.api_gateway import APIGatewayRestResolver +from aws_lambda_powertools.event_handler.openapi.models import ( + ParameterInType, + Schema, +) +from aws_lambda_powertools.event_handler.openapi.params import ( + Body, + Query, +) + +JSON_CONTENT_TYPE = "application/json" + + +class Todo(BaseModel): + id: int = Field(examples=[1]) + title: str = Field(examples=["Example 1"]) + priority: float = Field(examples=[0.5]) + completed: bool = Field(examples=[True]) + + +def test_openapi_with_pep563_and_input_model(): + app = APIGatewayRestResolver() + + @app.get("/users", summary="Get Users", operation_id="GetUsers", description="Get paginated users", tags=["Users"]) + def handler( + count: Annotated[ + int, + Query(gt=0, lt=100, examples=["Example 1"]), + ] = 1, + ): + print(count) + raise NotImplementedError() + + schema = app.get_openapi_schema() + + get = schema.paths["/users"].get + assert len(get.parameters) == 1 + assert get.summary == "Get Users" + assert get.operationId == "GetUsers" + assert get.description == "Get paginated users" + assert get.tags == ["Users"] + + parameter = get.parameters[0] + assert parameter.required is False + assert parameter.name == "count" + assert parameter.in_ == ParameterInType.query + assert parameter.schema_.type == "integer" + assert parameter.schema_.default == 1 + assert parameter.schema_.title == "Count" + assert parameter.schema_.exclusiveMinimum == 0 + assert parameter.schema_.exclusiveMaximum == 100 + assert len(parameter.schema_.examples) == 1 + assert parameter.schema_.examples[0] == "Example 1" + + +def test_openapi_with_pep563_and_output_model(): + + app = APIGatewayRestResolver() + + @app.get("/") + def handler() -> Todo: + return Todo(id=0, title="", priority=0.0, completed=False) + + schema = app.get_openapi_schema() + assert "Todo" in schema.components.schemas + todo_schema = schema.components.schemas["Todo"] + assert isinstance(todo_schema, Schema) + + assert "id" in todo_schema.properties + id_property = todo_schema.properties["id"] + assert id_property.examples == [1] + + assert "title" in todo_schema.properties + title_property = todo_schema.properties["title"] + assert title_property.examples == ["Example 1"] + + assert "priority" in todo_schema.properties + priority_property = todo_schema.properties["priority"] + assert priority_property.examples == [0.5] + + assert "completed" in todo_schema.properties + completed_property = todo_schema.properties["completed"] + assert completed_property.examples == [True] + + +def test_openapi_with_pep563_and_annotated_body(): + + app = APIGatewayRestResolver() + + @app.post("/todo") + def create_todo( + todo_create_request: Annotated[Todo, Body(title="New Todo")], + ) -> dict: + return {"message": f"Created todo {todo_create_request.title}"} + + schema = app.get_openapi_schema() + assert "Todo" in schema.components.schemas + todo_schema = schema.components.schemas["Todo"] + assert isinstance(todo_schema, Schema) + + assert "id" in todo_schema.properties + id_property = todo_schema.properties["id"] + assert id_property.examples == [1] + + assert "title" in todo_schema.properties + title_property = todo_schema.properties["title"] + assert title_property.examples == ["Example 1"] + + assert "priority" in todo_schema.properties + priority_property = todo_schema.properties["priority"] + assert priority_property.examples == [0.5] + + assert "completed" in todo_schema.properties + completed_property = todo_schema.properties["completed"] + assert completed_property.examples == [True] From 076a913f26592cbe0474d1259dc4d68baa51dda8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 21:19:26 +0000 Subject: [PATCH 17/52] chore(deps-dev): bump mkdocs-material from 9.5.49 to 9.5.50 (#5889) Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.5.49 to 9.5.50. - [Release notes](https://github.com/squidfunk/mkdocs-material/releases) - [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG) - [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.49...9.5.50) --- updated-dependencies: - dependency-name: mkdocs-material dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 10 +++++----- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 30c1ba7e9bf..47ad17330be 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2385,13 +2385,13 @@ mkdocs = ">=0.17" [[package]] name = "mkdocs-material" -version = "9.5.49" +version = "9.5.50" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.49-py3-none-any.whl", hash = "sha256:c3c2d8176b18198435d3a3e119011922f3e11424074645c24019c2dcf08a360e"}, - {file = "mkdocs_material-9.5.49.tar.gz", hash = "sha256:3671bb282b4f53a1c72e08adbe04d2481a98f85fed392530051f80ff94a9621d"}, + {file = "mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385"}, + {file = "mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825"}, ] [package.dependencies] @@ -2408,7 +2408,7 @@ regex = ">=2022.4" requests = ">=2.26,<3.0" [package.extras] -git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<3)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"] imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"] recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] @@ -4419,4 +4419,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<4.0.0" -content-hash = "439521a7221d64379271522458208c25c2a2a561101e24ff47307c3ab9fb3ea2" +content-hash = "198f3cd5201ae1516918619dd67ed5d34da80ffd20b2954bfa97a53363cfa830" diff --git a/pyproject.toml b/pyproject.toml index 180f22b1ee8..001eeaefa41 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -81,7 +81,7 @@ aws-cdk-lib = "^2.176.0" pytest-benchmark = "^4.0.0" types-requests = "^2.31.0" typing-extensions = "^4.12.2" -mkdocs-material = "^9.5.49" +mkdocs-material = "^9.5.50" filelock = "^3.16.0" dirhash = "^0.5.0" mypy-boto3-appconfigdata = "^1.36.0" From d82537c1a7a93b61066ccc5a11fd344bd68d8f66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 21:20:24 +0000 Subject: [PATCH 18/52] chore(deps): bump squidfunk/mkdocs-material from `ba73db5` to `41942f7` in /docs (#5890) chore(deps): bump squidfunk/mkdocs-material in /docs Bumps squidfunk/mkdocs-material from `ba73db5` to `41942f7`. --- updated-dependencies: - dependency-name: squidfunk/mkdocs-material dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- docs/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index fbefcd12263..2da27006b13 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,5 +1,5 @@ # v9.1.18 -FROM squidfunk/mkdocs-material@sha256:ba73db5ab937632760a59742ba89e199ca6122cfad4ca21d1f27125fefa31a33 +FROM squidfunk/mkdocs-material@sha256:41942f7a2f5163aacd0e866e076d95db4f26550b97d76c1594c04250cbb580e9 # pip-compile --generate-hashes --output-file=requirements.txt requirements.in COPY requirements.txt /tmp/ RUN pip install --require-hashes -r /tmp/requirements.txt From e96608e983bc8bb5fe0b654aeab83dd9020622c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=20Falc=C3=A3o?= Date: Tue, 21 Jan 2025 11:27:55 -0300 Subject: [PATCH 19/52] feat(logger): add context manager for logger keys (#5883) * add context manager to logger * Passing the method implementation to the formatter class * modify logger tests * add examples to doc --------- Co-authored-by: Leandro Damascena --- aws_lambda_powertools/logging/formatter.py | 32 +++++- aws_lambda_powertools/logging/logger.py | 32 ++++-- docs/core/logger.md | 19 ++++ examples/logger/src/append_context_keys.json | 18 +++ examples/logger/src/append_context_keys.py | 13 +++ .../required_dependencies/test_logger.py | 103 ++++++++++++++++++ 6 files changed, 206 insertions(+), 11 deletions(-) create mode 100644 examples/logger/src/append_context_keys.json create mode 100644 examples/logger/src/append_context_keys.py diff --git a/aws_lambda_powertools/logging/formatter.py b/aws_lambda_powertools/logging/formatter.py index 0a497e8244a..824c5c0ef16 100644 --- a/aws_lambda_powertools/logging/formatter.py +++ b/aws_lambda_powertools/logging/formatter.py @@ -7,10 +7,11 @@ import time import traceback from abc import ABCMeta, abstractmethod +from contextlib import contextmanager from contextvars import ContextVar from datetime import datetime, timezone from functools import partial -from typing import TYPE_CHECKING, Any, Callable, Iterable +from typing import TYPE_CHECKING, Any, Callable, Generator, Iterable from aws_lambda_powertools.shared import constants from aws_lambda_powertools.shared.functions import powertools_dev_is_set @@ -62,6 +63,10 @@ def clear_state(self) -> None: """Removes any previously added logging keys""" raise NotImplementedError() + @contextmanager + def append_context_keys(self, **additional_keys: Any) -> Generator[None, None, None]: + yield + # These specific thread-safe methods are necessary to manage shared context in concurrent environments. # They prevent race conditions and ensure data consistency across multiple threads. def thread_safe_append_keys(self, **additional_keys) -> None: @@ -263,6 +268,31 @@ def clear_state(self) -> None: self.log_format = dict.fromkeys(self.log_record_order) self.log_format.update(**self.keys_combined) + @contextmanager + def append_context_keys(self, **additional_keys: Any) -> Generator[None, None, None]: + """ + Context manager to temporarily add logging keys. + + Parameters: + ----------- + **keys: Any + Key-value pairs to include in the log context during the lifespan of the context manager. + + Example: + -------- + >>> logger = Logger(service="example_service") + >>> with logger.append_context_keys(user_id="123", operation="process"): + >>> logger.info("Log with context") + >>> logger.info("Log without context") + """ + # Add keys to the context + self.append_keys(**additional_keys) + try: + yield + finally: + # Remove the keys after exiting the context + self.remove_keys(additional_keys.keys()) + # These specific thread-safe methods are necessary to manage shared context in concurrent environments. # They prevent race conditions and ensure data consistency across multiple threads. def thread_safe_append_keys(self, **additional_keys) -> None: diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index acefe9757c6..c242f5c9bd4 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -7,16 +7,8 @@ import random import sys import warnings -from typing import ( - IO, - TYPE_CHECKING, - Any, - Callable, - Iterable, - Mapping, - TypeVar, - overload, -) +from contextlib import contextmanager +from typing import IO, TYPE_CHECKING, Any, Callable, Generator, Iterable, Mapping, TypeVar, overload from aws_lambda_powertools.logging.constants import ( LOGGER_ATTRIBUTE_PRECONFIGURED, @@ -589,6 +581,26 @@ def get_current_keys(self) -> dict[str, Any]: def remove_keys(self, keys: Iterable[str]) -> None: self.registered_formatter.remove_keys(keys) + @contextmanager + def append_context_keys(self, **additional_keys: Any) -> Generator[None, None, None]: + """ + Context manager to temporarily add logging keys. + + Parameters: + ----------- + **keys: Any + Key-value pairs to include in the log context during the lifespan of the context manager. + + Example: + -------- + >>> logger = Logger(service="example_service") + >>> with logger.append_context_keys(user_id="123", operation="process"): + >>> logger.info("Log with context") + >>> logger.info("Log without context") + """ + with self.registered_formatter.append_context_keys(**additional_keys): + yield + # These specific thread-safe methods are necessary to manage shared context in concurrent environments. # They prevent race conditions and ensure data consistency across multiple threads. def thread_safe_append_keys(self, **additional_keys: object) -> None: diff --git a/docs/core/logger.md b/docs/core/logger.md index 818d5a6589b..9915f7cc4b4 100644 --- a/docs/core/logger.md +++ b/docs/core/logger.md @@ -187,6 +187,25 @@ You can append your own keys to your existing Logger via `append_keys(**addition This example will add `order_id` if its value is not empty, and in subsequent invocations where `order_id` might not be present it'll remove it from the Logger. +#### append_context_keys method + +???+ warning + `append_context_keys` is not thread-safe. + +The append_context_keys method allows temporary modification of a Logger instance's context without creating a new logger. It's useful for adding context keys to specific workflows while maintaining the logger's overall state and simplicity. + +=== "append_context_keys.py" + + ```python hl_lines="7 8" + --8<-- "examples/logger/src/append_context_keys.py" + ``` + +=== "append_context_keys_output.json" + + ```json hl_lines="8 9" + --8<-- "examples/logger/src/append_context_keys.json" + ``` + #### ephemeral metadata You can pass an arbitrary number of keyword arguments (kwargs) to all log level's methods, e.g. `logger.info, logger.warning`. diff --git a/examples/logger/src/append_context_keys.json b/examples/logger/src/append_context_keys.json new file mode 100644 index 00000000000..97770a657fa --- /dev/null +++ b/examples/logger/src/append_context_keys.json @@ -0,0 +1,18 @@ +[ + { + "level": "INFO", + "location": "lambda_handler:8", + "message": "Log with context", + "timestamp": "2024-03-21T10:30:00.123Z", + "service": "example_service", + "user_id": "123", + "operation": "process" + }, + { + "level": "INFO", + "location": "lambda_handler:10", + "message": "Log without context", + "timestamp": "2024-03-21T10:30:00.124Z", + "service": "example_service" + } +] \ No newline at end of file diff --git a/examples/logger/src/append_context_keys.py b/examples/logger/src/append_context_keys.py new file mode 100644 index 00000000000..704735eeb9a --- /dev/null +++ b/examples/logger/src/append_context_keys.py @@ -0,0 +1,13 @@ +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.typing import LambdaContext + +logger = Logger(service="example_service") + + +def lambda_handler(event: dict, context: LambdaContext) -> str: + with logger.append_context_keys(user_id="123", operation="process"): + logger.info("Log with context") + + logger.info("Log without context") + + return "hello world" diff --git a/tests/functional/logger/required_dependencies/test_logger.py b/tests/functional/logger/required_dependencies/test_logger.py index e86dba27eb6..70f08f1bbdd 100644 --- a/tests/functional/logger/required_dependencies/test_logger.py +++ b/tests/functional/logger/required_dependencies/test_logger.py @@ -1114,3 +1114,106 @@ def test_logger_json_unicode(stdout, service_name): assert log["message"] == non_ascii_chars assert log[japanese_field] == japanese_string + + +def test_append_context_keys_adds_and_removes_keys(stdout, service_name): + # GIVEN a Logger is initialized + logger = Logger(service=service_name, stream=stdout) + test_keys = {"user_id": "123", "operation": "test"} + + # WHEN context keys are added + with logger.append_context_keys(**test_keys): + logger.info("message with context keys") + logger.info("message without context keys") + + # THEN context keys should only be present in the first log statement + with_context_log, without_context_log = capture_multiple_logging_statements_output(stdout) + + assert "user_id" in with_context_log + assert test_keys["user_id"] == with_context_log["user_id"] + assert "user_id" not in without_context_log + + +def test_append_context_keys_handles_empty_dict(stdout, service_name): + # GIVEN a Logger is initialized + logger = Logger(service=service_name, stream=stdout) + + # WHEN context is added with no keys + with logger.append_context_keys(): + logger.info("message with empty context") + + # THEN log should contain only default keys + log_output = capture_logging_output(stdout) + assert set(log_output.keys()) == {"service", "timestamp", "level", "message", "location"} + + +def test_append_context_keys_handles_exception(stdout, service_name): + # GIVEN a Logger is initialized + logger = Logger(service=service_name, stream=stdout) + test_user_id = "128" + + # WHEN an exception occurs within the context + exception_raised = False + try: + with logger.append_context_keys(user_id=test_user_id): + logger.info("message before exception") + raise ValueError("Test exception") + except ValueError: + exception_raised = True + logger.info("message after exception") + + # THEN verify the exception was raised and handled + assert exception_raised, "Expected ValueError to be raised" + + +def test_append_context_keys_nested_contexts(stdout, service_name): + # GIVEN a Logger is initialized + logger = Logger(service=service_name, stream=stdout) + + # WHEN nested contexts are used + with logger.append_context_keys(level1="outer"): + logger.info("outer context message") + with logger.append_context_keys(level2="inner"): + logger.info("nested context message") + logger.info("back to outer context message") + logger.info("no context message") + + # THEN logs should contain appropriate context keys + outer, nested, back_outer, no_context = capture_multiple_logging_statements_output(stdout) + + assert outer["level1"] == "outer" + assert "level2" not in outer + + assert nested["level1"] == "outer" + assert nested["level2"] == "inner" + + assert back_outer["level1"] == "outer" + assert "level2" not in back_outer + + assert "level1" not in no_context + assert "level2" not in no_context + + +def test_append_context_keys_with_formatter(stdout, service_name): + # GIVEN a Logger is initialized with a custom formatter + class CustomFormatter(BasePowertoolsFormatter): + def append_keys(self, **additional_keys): + pass + + def clear_state(self) -> None: + pass + + def remove_keys(self, keys: Iterable[str]) -> None: + pass + + custom_formatter = CustomFormatter() + logger = Logger(service=service_name, stream=stdout, logger_formatter=custom_formatter) + test_keys = {"request_id": "id", "context": "value"} + + # WHEN context keys are added + with logger.append_context_keys(**test_keys): + logger.info("message with context") + + # THEN the context keys should not persist + current_keys = logger.get_current_keys() + assert current_keys == {} From b74a659d83b38a022955976c8c8ba7d01b20b505 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 18:34:45 -0300 Subject: [PATCH 20/52] chore(deps-dev): bump boto3-stubs from 1.36.2 to 1.36.3 (#5894) Bumps [boto3-stubs](https://github.com/youtype/mypy_boto3_builder) from 1.36.2 to 1.36.3. - [Release notes](https://github.com/youtype/mypy_boto3_builder/releases) - [Commits](https://github.com/youtype/mypy_boto3_builder/commits) --- updated-dependencies: - dependency-name: boto3-stubs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 47ad17330be..10719f2dfdc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -434,13 +434,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.2" -description = "Type annotations for boto3 1.36.2 generated with mypy-boto3-builder 8.8.0" +version = "1.36.3" +description = "Type annotations for boto3 1.36.3 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.36.2-py3-none-any.whl", hash = "sha256:3bc33c96f10c5121cc49332bfa276a832274e737ff90b8e7b3226dff48037b57"}, - {file = "boto3_stubs-1.36.2.tar.gz", hash = "sha256:f401e585cc7df4ddfb3e02fb95c5ecf86e7d41561c3efb802ba4608e1ad4b660"}, + {file = "boto3_stubs-1.36.3-py3-none-any.whl", hash = "sha256:aa89073b98a071fa05a080ec11d7912667dc157bd89dd5b7e323bd9ecc67e77e"}, + {file = "boto3_stubs-1.36.3.tar.gz", hash = "sha256:f4a0ac68202e699486f7fb7283985edd1709300633ba29feb4c79ce488ce59fe"}, ] [package.dependencies] @@ -507,7 +507,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.2)"] +boto3 = ["boto3 (==1.36.3)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] From bb2481489114d3015168742bb8c0cd89140388db Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 22 Jan 2025 11:31:21 +0000 Subject: [PATCH 21/52] docs(event_handler): demonstrate handling optional security routes (#5895) * Adding example on how to work with optional security routes * Adding example on how to work with optional security routes --- docs/core/event_handler/api_gateway.md | 8 ++++ .../security_schemes_global_and_optional.py | 48 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 examples/event_handler_rest/src/security_schemes_global_and_optional.py diff --git a/docs/core/event_handler/api_gateway.md b/docs/core/event_handler/api_gateway.md index 39554c21e40..1f9618839f9 100644 --- a/docs/core/event_handler/api_gateway.md +++ b/docs/core/event_handler/api_gateway.md @@ -1103,6 +1103,14 @@ Security schemes are declared at the top-level first. You can reference them glo 1. Using the oauth security scheme defined bellow, scoped to the "admin" role. +=== "Global security schemes and optional security per route" + + ```python title="security_schemes_global_and_optional.py" hl_lines="22 37-46" + --8<-- "examples/event_handler_rest/src/security_schemes_global_and_optional.py" + ``` + + 1. To make security optional in a specific route, an empty security requirement ({}) can be included in the array. + OpenAPI 3 lets you describe APIs protected using the following security schemes: | Security Scheme | Type | Description | diff --git a/examples/event_handler_rest/src/security_schemes_global_and_optional.py b/examples/event_handler_rest/src/security_schemes_global_and_optional.py new file mode 100644 index 00000000000..2a890efd5e4 --- /dev/null +++ b/examples/event_handler_rest/src/security_schemes_global_and_optional.py @@ -0,0 +1,48 @@ +from aws_lambda_powertools import Logger, Tracer +from aws_lambda_powertools.event_handler import ( + APIGatewayRestResolver, +) +from aws_lambda_powertools.event_handler.openapi.models import ( + OAuth2, + OAuthFlowAuthorizationCode, + OAuthFlows, +) + +tracer = Tracer() +logger = Logger() + +app = APIGatewayRestResolver(enable_validation=True) + + +@app.get("/protected", security=[{"oauth": ["admin"]}]) +def protected() -> dict: + return {"hello": "world"} + + +@app.get("/unprotected", security=[{}]) # (1)! +def unprotected() -> dict: + return {"hello": "world"} + + +@logger.inject_lambda_context +@tracer.capture_lambda_handler +def lambda_handler(event, context): + return app.resolve(event, context) + + +if __name__ == "__main__": + print( + app.get_openapi_json_schema( + title="My API", + security_schemes={ + "oauth": OAuth2( + flows=OAuthFlows( + authorizationCode=OAuthFlowAuthorizationCode( + authorizationUrl="https://xxx.amazoncognito.com/oauth2/authorize", + tokenUrl="https://xxx.amazoncognito.com/oauth2/token", + ), + ), + ), + }, + ), + ) From e84c49049cb8e8d3965d490fdcecc14659ebf0fa Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 22 Jan 2025 22:22:40 +0000 Subject: [PATCH 22/52] chore(ci): make `pyproject.toml` fully compatible with Poetryv2 (#5902) Full support for Poetryv2 --- poetry.lock | 620 ++++++++++++++++++++++++++++++++++--------------- pyproject.toml | 41 ++-- 2 files changed, 450 insertions(+), 211 deletions(-) diff --git a/poetry.lock b/poetry.lock index 10719f2dfdc..be979c1005d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. [[package]] name = "annotated-types" @@ -6,10 +6,12 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] +markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} @@ -20,6 +22,7 @@ version = "4.5.2" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f"}, {file = "anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b"}, @@ -42,6 +45,7 @@ version = "3.5.3" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "argcomplete-3.5.3-py3-none-any.whl", hash = "sha256:2ab2c4a215c59fd6caaff41a869480a23e8f6a5f910b266c1808037f4e375b61"}, {file = "argcomplete-3.5.3.tar.gz", hash = "sha256:c12bf50eded8aebb298c7b7da7a5ff3ee24dffd9f5281867dfe1424b58c55392"}, @@ -56,10 +60,12 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] +markers = {main = "extra == \"redis\" and python_full_version < \"3.11.3\"", dev = "python_full_version < \"3.11.3\""} [[package]] name = "attrs" @@ -67,10 +73,12 @@ version = "24.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] +markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] @@ -82,13 +90,14 @@ tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "aws-cdk-asset-awscli-v1" -version = "2.2.218" +version = "2.2.220" description = "A library that contains the AWS CLI for use in Lambda Layers" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ - {file = "aws_cdk.asset_awscli_v1-2.2.218-py3-none-any.whl", hash = "sha256:82efa0f11788c23c77e42a2bc0d29cae8accf79e00cfd4464efd5f7c25a18673"}, - {file = "aws_cdk_asset_awscli_v1-2.2.218.tar.gz", hash = "sha256:3543f1f2ace5898087516fc0ac510825245d413fd79c50b331f8045b13ddab65"}, + {file = "aws_cdk.asset_awscli_v1-2.2.220-py3-none-any.whl", hash = "sha256:aef8284470bee3e1e0b5d706961c952dba88d50981ba6a21fa8b5cb3e9c4d5b6"}, + {file = "aws_cdk_asset_awscli_v1-2.2.220.tar.gz", hash = "sha256:8e5e1290dc77b15cffe51134be0bf2b613ae8f3f9859fd4137359bbda431b0d3"}, ] [package.dependencies] @@ -102,6 +111,7 @@ version = "2.1.3" description = "A Lambda Layer that contains kubectl v1.20" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.asset_kubectl_v20-2.1.3-py3-none-any.whl", hash = "sha256:d5612e5bd03c215a28ce53193b1144ecf4e93b3b6779563c046a8a74d83a3979"}, {file = "aws_cdk_asset_kubectl_v20-2.1.3.tar.gz", hash = "sha256:237cd8530d9e8be0bbc7159af927dbb6b7f91bf3f4099c8ef4d9a213b34264be"}, @@ -118,6 +128,7 @@ version = "2.1.0" description = "@aws-cdk/asset-node-proxy-agent-v6" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.asset_node_proxy_agent_v6-2.1.0-py3-none-any.whl", hash = "sha256:24a388b69a44d03bae6dbf864c4e25ba650d4b61c008b4568b94ffbb9a69e40e"}, {file = "aws_cdk_asset_node_proxy_agent_v6-2.1.0.tar.gz", hash = "sha256:1f292c0631f86708ba4ee328b3a2b229f7e46ea1c79fbde567ee9eb119c2b0e2"}, @@ -134,6 +145,7 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-alpha-2.114.1a0.tar.gz", hash = "sha256:9e8c3131f4fa3e0926eb3d76aeacd578a6aa51f95b39c10a86112c991bb75864"}, {file = "aws_cdk.aws_apigatewayv2_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:a101ce56d846976ad1c8020054dfe73fd9f45afdbe71f2a297acc84c1a201403"}, @@ -152,6 +164,7 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-authorizers" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-authorizers-alpha-2.114.1a0.tar.gz", hash = "sha256:ee290e2ed0f1506dbbb12b3b8963f50b379121759077002c265977fbaf18fd9f"}, {file = "aws_cdk.aws_apigatewayv2_authorizers_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:2576e1ce06dab314020bff50f5d59b8715a7adf18106eac811028c22f61c9baa"}, @@ -171,6 +184,7 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-integrations" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-integrations-alpha-2.114.1a0.tar.gz", hash = "sha256:19e1824b577683e7d3c2b01fd58c176ebe4c7b8d1b4af4cfdc3893d3ffbac9af"}, {file = "aws_cdk.aws_apigatewayv2_integrations_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:1e440a70e6b4cbe077c95ffdd3fd0cfb3962f90762ea2e973eaa2ab7719ccb2c"}, @@ -190,6 +204,7 @@ version = "2.59.0a0" description = "The CDK Construct Library for AWS::AppSync" optional = false python-versions = "~=3.7" +groups = ["dev"] files = [ {file = "aws-cdk.aws-appsync-alpha-2.59.0a0.tar.gz", hash = "sha256:f5c7773b70b759efd576561dc3d71af5762a6f7cbc9ee9eef5e538c7ab3dccc7"}, {file = "aws_cdk.aws_appsync_alpha-2.59.0a0-py3-none-any.whl", hash = "sha256:ecc235f1f70d404c8d03cf250be0227becd14c468f8c43b6d9df334a1d60c8e2"}, @@ -208,6 +223,7 @@ version = "2.176.0a0" description = "The CDK Construct Library for AWS Lambda in Python" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.aws_lambda_python_alpha-2.176.0a0-py3-none-any.whl", hash = "sha256:d7a9223393b815e9b2d2e69f06c216b8e12e577f8ab58aeb56cb05c92de7f7bb"}, {file = "aws_cdk_aws_lambda_python_alpha-2.176.0a0.tar.gz", hash = "sha256:0a2737e098e88a553a284f688c7621067cebf32ba21ad3e8e7911bb70ce67049"}, @@ -222,13 +238,14 @@ typeguard = ">=2.13.3,<4.3.0" [[package]] name = "aws-cdk-cloud-assembly-schema" -version = "39.1.44" +version = "39.2.2" description = "Cloud Assembly Schema" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ - {file = "aws_cdk.cloud_assembly_schema-39.1.44-py3-none-any.whl", hash = "sha256:13fac9f8e4fcae8209b5e2241e07e4a060de64e4ad41a49d38eebc5f2be4465c"}, - {file = "aws_cdk_cloud_assembly_schema-39.1.44.tar.gz", hash = "sha256:e2f84176c1f47cd49b84f6c09e3401cbcec6431448fb675032429a86519ad1f0"}, + {file = "aws_cdk.cloud_assembly_schema-39.2.2-py3-none-any.whl", hash = "sha256:c2f10edd7765a4ff0e28508c5e63798c3f89699242a4755d1984472acf6acaf2"}, + {file = "aws_cdk_cloud_assembly_schema-39.2.2.tar.gz", hash = "sha256:ae2140bc3ffbc306d8e931d5a70bc5c573b1e047838d29d8e7d13dfa97ea4ea8"}, ] [package.dependencies] @@ -242,6 +259,7 @@ version = "2.176.0" description = "Version 2 of the AWS Cloud Development Kit library" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk_lib-2.176.0-py3-none-any.whl", hash = "sha256:c362a92f06b6ea60a7eff7994d3994c462358e7a95ce3de01a28efab4f6d56b6"}, {file = "aws_cdk_lib-2.176.0.tar.gz", hash = "sha256:87a39d2f42fd2ea8ba2bfa364355303953fb5cc2886479ca5acf09a14a9fd679"}, @@ -263,6 +281,8 @@ version = "4.0.0" description = "AWS Encryption SDK implementation for Python" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "aws-encryption-sdk-4.0.0.tar.gz", hash = "sha256:57df8b5c1b9f18db4373c6e8e65563791063a71be93d0849950ed365272db354"}, {file = "aws_encryption_sdk-4.0.0-py2.py3-none-any.whl", hash = "sha256:a94483785dff2cd166ccb8f3a15cdfe5cba7a3717f6604543c816a3a32f7c412"}, @@ -283,6 +303,7 @@ version = "0.4.3" description = "AWS signature version 4 signing process for the python requests module" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "aws-requests-auth-0.4.3.tar.gz", hash = "sha256:33593372018b960a31dbbe236f89421678b885c35f0b6a7abfae35bb77e069b2"}, {file = "aws_requests_auth-0.4.3-py2.py3-none-any.whl", hash = "sha256:646bc37d62140ea1c709d20148f5d43197e6bd2d63909eb36fa4bb2345759977"}, @@ -297,6 +318,7 @@ version = "1.94.0" description = "AWS SAM Translator is a library that transform SAM templates into AWS CloudFormation templates" optional = false python-versions = "!=4.0,<=4.0,>=3.8" +groups = ["dev"] files = [ {file = "aws_sam_translator-1.94.0-py3-none-any.whl", hash = "sha256:100e33eeffcfa81f7c45cadeb0ee29596ce829f6b4d2745140f04fa19a41f539"}, {file = "aws_sam_translator-1.94.0.tar.gz", hash = "sha256:8ec258d9f7ece72ef91c81f4edb45a2db064c16844b6afac90c575893beaa391"}, @@ -317,6 +339,8 @@ version = "2.14.0" description = "The AWS X-Ray SDK for Python (the SDK) enables Python developers to record and emit information from within their applications to the AWS X-Ray service." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"tracer\" or extra == \"all\"" files = [ {file = "aws_xray_sdk-2.14.0-py2.py3-none-any.whl", hash = "sha256:cfbe6feea3d26613a2a869d14c9246a844285c97087ad8f296f901633554ad94"}, {file = "aws_xray_sdk-2.14.0.tar.gz", hash = "sha256:aab843c331af9ab9ba5cefb3a303832a19db186140894a523edafc024cc0493c"}, @@ -332,6 +356,7 @@ version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, @@ -349,6 +374,7 @@ version = "1.7.10" description = "Security oriented static analyser for python code." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "bandit-1.7.10-py3-none-any.whl", hash = "sha256:665721d7bebbb4485a339c55161ac0eedde27d51e638000d91c8c2d68343ad02"}, {file = "bandit-1.7.10.tar.gz", hash = "sha256:59ed5caf5d92b6ada4bf65bc6437feea4a9da1093384445fed4d472acc6cff7b"}, @@ -373,6 +399,7 @@ version = "24.8.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, @@ -415,32 +442,34 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.35.97" +version = "1.36.4" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "boto3-1.35.97-py3-none-any.whl", hash = "sha256:8e49416216a6e3a62c2a0c44fba4dd2852c85472e7b702516605b1363867d220"}, - {file = "boto3-1.35.97.tar.gz", hash = "sha256:7d398f66a11e67777c189d1f58c0a75d9d60f98d0ee51b8817e828930bf19e4e"}, + {file = "boto3-1.36.4-py3-none-any.whl", hash = "sha256:9f8f699e75ec63fcc98c4dd7290997c7c06c68d3ac8161ad4735fe71f5fe945c"}, + {file = "boto3-1.36.4.tar.gz", hash = "sha256:eeceeb74ef8b65634d358c27aa074917f4449dc828f79301f1075232618eb502"}, ] [package.dependencies] -botocore = ">=1.35.97,<1.36.0" +botocore = ">=1.36.4,<1.37.0" jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.10.0,<0.11.0" +s3transfer = ">=0.11.0,<0.12.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.3" -description = "Type annotations for boto3 1.36.3 generated with mypy-boto3-builder 8.8.0" +version = "1.36.4" +description = "Type annotations for boto3 1.36.4 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "boto3_stubs-1.36.3-py3-none-any.whl", hash = "sha256:aa89073b98a071fa05a080ec11d7912667dc157bd89dd5b7e323bd9ecc67e77e"}, - {file = "boto3_stubs-1.36.3.tar.gz", hash = "sha256:f4a0ac68202e699486f7fb7283985edd1709300633ba29feb4c79ce488ce59fe"}, + {file = "boto3_stubs-1.36.4-py3-none-any.whl", hash = "sha256:3d4e9a8a4d7163bcdb6514b92e901706ce4f522dc8aeab8b4e157fa9e0138e49"}, + {file = "boto3_stubs-1.36.4.tar.gz", hash = "sha256:36db2481d1a0291a2c05c30756fd83514c8d461f8dbc2915cb0c7cf06dc9ed70"}, ] [package.dependencies] @@ -507,7 +536,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.3)"] +boto3 = ["boto3 (==1.36.4)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] @@ -870,35 +899,37 @@ xray = ["mypy-boto3-xray (>=1.36.0,<1.37.0)"] [[package]] name = "botocore" -version = "1.35.97" +version = "1.36.4" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "botocore-1.35.97-py3-none-any.whl", hash = "sha256:fed4f156b1a9b8ece53738f702ba5851b8c6216b4952de326547f349cc494f14"}, - {file = "botocore-1.35.97.tar.gz", hash = "sha256:88f2fab29192ffe2f2115d5bafbbd823ff4b6eb2774296e03ec8b5b0fe074f61"}, + {file = "botocore-1.36.4-py3-none-any.whl", hash = "sha256:3f183aa7bb0c1ba02171143a05f28a4438abdf89dd6b8c0a7727040375a90520"}, + {file = "botocore-1.36.4.tar.gz", hash = "sha256:ef54f5e3316040b6ff775941e6ed052c3230dda0079d17d9f9e3c757375f2027"}, ] [package.dependencies] jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ - {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, + {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, ] [package.extras] -crt = ["awscrt (==0.22.0)"] +crt = ["awscrt (==0.23.4)"] [[package]] name = "botocore-stubs" -version = "1.35.97" +version = "1.36.4" description = "Type annotations and code completion for botocore" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "botocore_stubs-1.35.97-py3-none-any.whl", hash = "sha256:5427684c2248ad3db66c83b96e2486ebbacf13d7ba648a5acad7f422a086c419"}, - {file = "botocore_stubs-1.35.97.tar.gz", hash = "sha256:aae08ea4a2aa3c360cfd783f8e4c713db64351b429baee148820d5b0a6d9221a"}, + {file = "botocore_stubs-1.36.4-py3-none-any.whl", hash = "sha256:bbbd1b061b68bdc6d474ad9dfbf7f56386f416b297862347ae735f2272a78e4b"}, + {file = "botocore_stubs-1.36.4.tar.gz", hash = "sha256:cc1677029f32d98c9e080885e2098424fd6afd41d6d3380f96d42c29e73e30b5"}, ] [package.dependencies] @@ -909,17 +940,19 @@ botocore = ["botocore"] [[package]] name = "bytecode" -version = "0.16.0" +version = "0.16.1" description = "Python module to generate and modify bytecode" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ - {file = "bytecode-0.16.0-py3-none-any.whl", hash = "sha256:76080b7c0eb9e7e17f961d61fd06e933aa47f3b753770a3249537439d8203a25"}, - {file = "bytecode-0.16.0.tar.gz", hash = "sha256:06676a3c3bccc9d3dc73ee625650ea57df2bc117358826f4f290f0e1faa42292"}, + {file = "bytecode-0.16.1-py3-none-any.whl", hash = "sha256:1d4b61ed6bade4bff44127c8283bef8131a664ce4dbe09d64a88caf329939f35"}, + {file = "bytecode-0.16.1.tar.gz", hash = "sha256:8fbbb637c880f339e564858bc6c7984ede67ae97bc71343379a535a9a4baf398"}, ] [package.dependencies] -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} +typing_extensions = {version = "*", markers = "python_version < \"3.10\""} [[package]] name = "cattrs" @@ -927,6 +960,7 @@ version = "24.1.2" description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, @@ -953,6 +987,7 @@ version = "2.34.23" description = "Check CDK v2 applications for best practices using a combination on available rule packs." optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "cdk_nag-2.34.23-py3-none-any.whl", hash = "sha256:e5f0ebb366d3fc6fa9124da94fb890a682eb5db69db70bbed6f44ebf0886427a"}, {file = "cdk_nag-2.34.23.tar.gz", hash = "sha256:ef7b1414e7ff6d14723d239beaea46ef4ddab32a28d802e7daa18d9677df80a1"}, @@ -971,6 +1006,7 @@ version = "0.1.289" description = "AWS Generative AI CDK Constructs is a library for well-architected generative AI patterns." optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "cdklabs.generative_ai_cdk_constructs-0.1.289-py3-none-any.whl", hash = "sha256:66d7be4f3c2700436720786cee4809a3774328305f5aa2939e2c01fd6ab83acb"}, {file = "cdklabs_generative_ai_cdk_constructs-0.1.289.tar.gz", hash = "sha256:82addba364c18fbc5acc7e12a0372f37c4855b7b53517d2fe8bd4b3fc8e945d8"}, @@ -990,6 +1026,7 @@ version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, @@ -1001,6 +1038,7 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -1070,6 +1108,7 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] +markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = "*" @@ -1080,6 +1119,7 @@ version = "1.22.5" description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cfn_lint-1.22.5-py3-none-any.whl", hash = "sha256:18309e59cc03ff18b02676688df7eb1a17f5276da3776f31946fc0d9aa9b8fe7"}, {file = "cfn_lint-1.22.5.tar.gz", hash = "sha256:8b4f55e283143e99d8d331627637226c291cecfb936606f7aab2d940e71e566d"}, @@ -1106,6 +1146,7 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -1207,6 +1248,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -1221,6 +1263,7 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -1232,6 +1275,7 @@ version = "6.9.0" description = "Add colours to the output of Python's logging module." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff"}, {file = "colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2"}, @@ -1249,6 +1293,7 @@ version = "10.4.2" description = "A programming model for software-defined state" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "constructs-10.4.2-py3-none-any.whl", hash = "sha256:1f0f59b004edebfde0f826340698b8c34611f57848139b7954904c61645f13c1"}, {file = "constructs-10.4.2.tar.gz", hash = "sha256:ce54724360fffe10bab27d8a081844eb81f5ace7d7c62c84b719c49f164d5307"}, @@ -1265,6 +1310,7 @@ version = "7.6.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, @@ -1352,6 +1398,7 @@ version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -1381,6 +1428,7 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] +markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1401,6 +1449,8 @@ version = "0.50.2" description = "The Datadog Python library" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "datadog-0.50.2-py2.py3-none-any.whl", hash = "sha256:f3297858564b624efbd9ce43e4ea1c2c21e1f0477ab6d446060b536a1d9e431e"}, {file = "datadog-0.50.2.tar.gz", hash = "sha256:17725774bf2bb0a48f1d096d92707492c187f24ae08960af0b0c2fa97958fd51"}, @@ -1415,6 +1465,8 @@ version = "6.104.0" description = "The Datadog AWS Lambda Library" optional = true python-versions = "<4,>=3.8.0" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "datadog_lambda-6.104.0-py3-none-any.whl", hash = "sha256:72092f9057764515ef1e2fdf1cf25f82bfa70296411af9121db896e4a35fdf6e"}, {file = "datadog_lambda-6.104.0.tar.gz", hash = "sha256:eeb2ff0e4387812e7caf17e501d93fea3d85e3f9bb79581fb37556580d5a1c46"}, @@ -1431,80 +1483,92 @@ dev = ["boto3 (>=1.34.0,<2.0.0)", "flake8 (>=5.0.4,<6.0.0)", "pytest (>=8.0.0,<9 [[package]] name = "ddtrace" -version = "2.18.1" +version = "2.19.1" description = "Datadog APM client library" optional = true python-versions = ">=3.7" -files = [ - {file = "ddtrace-2.18.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:c55c4970868996c1c1893259e94f0233dd87a3f5342ad27c711dba8a4a18071f"}, - {file = "ddtrace-2.18.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:0a84d60ddc11c8de13900127c5d4ef8ad450b8dd06cc8db446f024b0c6d5015b"}, - {file = "ddtrace-2.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e9b315eb03174ed85d6eead72364b7fd99b5e004e598bbf4670759659bf367b"}, - {file = "ddtrace-2.18.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c62a0db263944a1b8b5676e0f33e216aae7febfa134b8c99025b6bf4a1aff8d3"}, - {file = "ddtrace-2.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14360fc302489f2132ee18b5f6c24debbb21f955e3cb946050398d0c1595df17"}, - {file = "ddtrace-2.18.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6fdeb9e2260765b496f26dcafe747ab365ddc47637b697872757db430dde6be"}, - {file = "ddtrace-2.18.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:caf4867f702ae6b83f27c797800309c7154a8cee00cf4b97c668d995f0cf9f0d"}, - {file = "ddtrace-2.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5d2f9bdc53ee00c32f4451a368c29d0173231c195a521c12524e0dfbdddefdfa"}, - {file = "ddtrace-2.18.1-cp310-cp310-win32.whl", hash = "sha256:641f77eed9d5ff5fbc3078b7b11e6210a0ee96d4d7599cccb1756961c4eef948"}, - {file = "ddtrace-2.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:70c03403704b20b38b27dfacfd9c071a779610049449577fceefaa4fcf7fa081"}, - {file = "ddtrace-2.18.1-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:4422de0e528ba965324fe96670081731eec66db2742984e3893e642e8898fa23"}, - {file = "ddtrace-2.18.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:f502695c8771ffecf52a27abaffc81c832a0146aab3c397a91abf6d7b09e9528"}, - {file = "ddtrace-2.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09772884c2a95bfecaa6c05644d773dcb135f04340c561a7465d6b6d28b10edf"}, - {file = "ddtrace-2.18.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9829e01e5401823976a9c413c4a19672fcf6538444421c67ab0e719b8d83235c"}, - {file = "ddtrace-2.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f174b33d2d944dca90ff5be0bec95c98606d82f954c3acd805e4f484d2ffd5"}, - {file = "ddtrace-2.18.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bcbd3c75fc0ac2e2f48493b6451b8f34b55c28691011ddfcd9799730a461879b"}, - {file = "ddtrace-2.18.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a3d3a60dfcccadad9f97c7cb9cee803b68d1e2a9160cef44f4dc907b3be22a3b"}, - {file = "ddtrace-2.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:74500caa641266d8e19e9ad4259b503fc97b0855bc144f8515caf9df96855f6f"}, - {file = "ddtrace-2.18.1-cp311-cp311-win32.whl", hash = "sha256:15a37b22ffb20071ba20f8861eda9732de91a36664d7587ad59370d17aa79d85"}, - {file = "ddtrace-2.18.1-cp311-cp311-win_amd64.whl", hash = "sha256:04351f2bad1a02c9bc7c8459e354baedd6bd4041dc142f611375be199912449c"}, - {file = "ddtrace-2.18.1-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:3bc030edeed2cf37cef67b9e7a9d00c2298ac779b091574899832a7938f67f53"}, - {file = "ddtrace-2.18.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:1b1bd03574a089d9bd7ca9e43ac12a9c685e53a01e8037649837ca437a6b6d50"}, - {file = "ddtrace-2.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c7b96d7a5dcc54e469dfcfb61bccc53019010cbd1be51bdff48988fe715a83"}, - {file = "ddtrace-2.18.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22b42396bbf23cf7d30319936e3e62ba5b571692a62eef58e8d8a10e1b50c710"}, - {file = "ddtrace-2.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65185a80a95114d54310c329dca3ff6c8131cf0b770b3819b9aa627749bff3e"}, - {file = "ddtrace-2.18.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:70e1227183cd07c247326da0db7b033110d6b05b4107ee5c8541a1bd859df8fd"}, - {file = "ddtrace-2.18.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a91efe0a1a4f758f1ad74fa6cd238f2ed5e960f15695c1062effc11c4a6bd0eb"}, - {file = "ddtrace-2.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:906a1b9aa3a9c1d3565c5381f1c8793dee7e2f80292c9aa285cfa6ebff3efbb9"}, - {file = "ddtrace-2.18.1-cp312-cp312-win32.whl", hash = "sha256:620d543b2dce68b6bc6cf4524378e013244938b5ea0d9d1457ec351bb7f09009"}, - {file = "ddtrace-2.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:a90f7cb8b55e257c2db4cba612b049eaf75d65db80b4fdb3e96af1ab906813d7"}, - {file = "ddtrace-2.18.1-cp37-cp37m-macosx_12_0_x86_64.whl", hash = "sha256:8d99e32c28a75dfec09fe96ac99c9d7dfc7388c55a4549f43d925aa9110b8865"}, - {file = "ddtrace-2.18.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34a74acf4cdc46f075948ecf59c7a2dfa8e6aea34f1f4cb29fd5c1a0f37c95e5"}, - {file = "ddtrace-2.18.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68db9541c238b548e769358f255e072f6311078e423e051c29e78b5fad17af15"}, - {file = "ddtrace-2.18.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ceabfd3bc9bc772a2dfe605c16d063bf91b4ac66c2033efc4211dfe3aa0243b"}, - {file = "ddtrace-2.18.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:500a40e5501f04340e4a50c31e10788a764278bd016e7c523c455980dc0f5cb1"}, - {file = "ddtrace-2.18.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ccee8a36f6fef598161299111d845a83352c2d69646b2befdd6337b307dc9962"}, - {file = "ddtrace-2.18.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:6adc5faf5807b7e17a320546b3a362e36ca7e53d862f07cb8c133ec5af3216ce"}, - {file = "ddtrace-2.18.1-cp37-cp37m-win32.whl", hash = "sha256:686c1ec683cb28e24d8746afd00e50cdd723ce19d86af26257174c58a06a28d6"}, - {file = "ddtrace-2.18.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2a5ec887bce8c2718f8a3f50fb2daa708aac973105735cd3f74d55f2ce69a220"}, - {file = "ddtrace-2.18.1-cp38-cp38-macosx_12_0_universal2.whl", hash = "sha256:8d61d5d5b2be99c711dfb19d2e7d5b9864bb9a2b1051405bc38bc707b1c8dab2"}, - {file = "ddtrace-2.18.1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:8394525f0f588ebd8a6b90da9916088237fe00973f462ec59514e55a232072a7"}, - {file = "ddtrace-2.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32e35dba7ff39b8cd30cf27079ae2442bf57fdd1fb2f8df6977b97e6d2088b52"}, - {file = "ddtrace-2.18.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:968117040d319e10d4128314aebd3780dd06b4757c6d6b7de78036598ff9cbc8"}, - {file = "ddtrace-2.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c6a860655d4e2d0b6b8ad4db0a737731198c95ee7151262e2b415d7d4e77e0b"}, - {file = "ddtrace-2.18.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:30a93b83e75bd25be1b20217295fb6e7000f2bf34ec32ff3abe00e3a7903b471"}, - {file = "ddtrace-2.18.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c9498e544f68cabaeb9aa9bdeb974405f7bced8a5c552d0f6477b686f6ffad96"}, - {file = "ddtrace-2.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:99db67cceaacd192596bd18de78ca90be19a3ecaa5875cc0014a72905bb622e7"}, - {file = "ddtrace-2.18.1-cp38-cp38-win32.whl", hash = "sha256:6fd148ade68f5321358adf52c1e9a5c9a82501c10886582e4e57fca6fdfbeeb7"}, - {file = "ddtrace-2.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:88cae70b85bb10fe2d7cfdf6fab7ccfb74163ebcc8f380c3fe4e59b7ed668d82"}, - {file = "ddtrace-2.18.1-cp39-cp39-macosx_12_0_universal2.whl", hash = "sha256:41cea5049a0115660c9484b4156ad1151c51f4e6d92251922c54f7008c1954aa"}, - {file = "ddtrace-2.18.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:4618d0fc75f9f7b794647b7ce794e4ddd74d377467bd4e5be4f548214205ca4d"}, - {file = "ddtrace-2.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0a0dbe72234b73c176d4d91aa6ddccda89e89bd554cd910cadeb9dd4500670"}, - {file = "ddtrace-2.18.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:173ae0a67c502add96c4d93b6c11db22de1879017318f75fc51a0f8897f2379c"}, - {file = "ddtrace-2.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328b6dc3462ca83ce9d2171eed765d8b0ed2c54e75dde10b8d9d364a00f637a4"}, - {file = "ddtrace-2.18.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:92c6d5c706f1d64e240791a365ec319a3eb51acc293b40546c501e2188b77d09"}, - {file = "ddtrace-2.18.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e2fc0bde27c86cf25bf53152b7107b1670d45ef6395a563160de56785ee4864"}, - {file = "ddtrace-2.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f67bdeffb774e7596c22f3d6307bad9d5cd9bd6b533392f4d98e91909c2ea02a"}, - {file = "ddtrace-2.18.1-cp39-cp39-win32.whl", hash = "sha256:ba4f5a51a02a668d7c5cd7c7a30e48ab3d28c179e5729c5425e7349e74ce5060"}, - {file = "ddtrace-2.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:0019ca4349cfc50116d8c1194c38de58eb0b3abdd1b253e646f09f23b4afc54c"}, - {file = "ddtrace-2.18.1.tar.gz", hash = "sha256:859d10ecf4cd2b9a58c2af38cf95d77bbaaca3c8f2527f0120f796d8afd57c53"}, +groups = ["main"] +markers = "extra == \"datadog\"" +files = [ + {file = "ddtrace-2.19.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:c6bc63fcc10c3128c91d245c5e677fd204ff10e67c3c75d26f28d34b6436bd15"}, + {file = "ddtrace-2.19.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:a8a5f66e2cfce6868a625efb9e1954bc08b484e9edb67fc2d051c6a05c991bf7"}, + {file = "ddtrace-2.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b878ba8c53c8894bf21eb7f71253af43da7ee2096f1b2d4ad93f7078fbd9e6a"}, + {file = "ddtrace-2.19.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8bd12d40a86c5567b9da4cc6180e75cd6da4fbfe3ee75d5e03197325912b986"}, + {file = "ddtrace-2.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87e5c897e3d0a60aba9beb36f0ef3db8477544b3f41dd990dbd89e505f1cb36c"}, + {file = "ddtrace-2.19.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4050e59b42e340672523830e58702fdb2b8977a5f627c49047fb7e754bd15827"}, + {file = "ddtrace-2.19.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2f3155ce3b36c616ff7ec9a66ddc3be57fba0d4703b439312b4e2d984f7bcc68"}, + {file = "ddtrace-2.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ff2eb2c9054d74c2d072215a3e01348c51915da940de71072ac187538273183c"}, + {file = "ddtrace-2.19.1-cp310-cp310-win32.whl", hash = "sha256:45434237e8aaf6d4e8ed6dae746a9fd01eea162367a85c46ff588cf386cc7c75"}, + {file = "ddtrace-2.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b7f860dfa8136f1953b0b129b7fafe7c60c0cf3ec4d0f7068f23f55e0567679"}, + {file = "ddtrace-2.19.1-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:03d9b8b64d98371823d22b14663a0704d263e5b67cef3590d4867db0cd1c5fcc"}, + {file = "ddtrace-2.19.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:514990e82f4da61b1c2f0c88f03f704701484f2982d6f514da368baa7a7f7121"}, + {file = "ddtrace-2.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:606bfcab7e9edb81a00f558cad76168b0f9bb995e9d3485b9297f7c18898c65c"}, + {file = "ddtrace-2.19.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:949f86469698650c2b4eab0881338408c1ac090df1dc792c0fc0b5fd928b39c8"}, + {file = "ddtrace-2.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa32c91ced9d72bb4c18c59c81516a3f12e2b1f3b0511b54eb3b3b3b0a36c8a5"}, + {file = "ddtrace-2.19.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:26c632967748f625e2bacf313eaea94b607fd08337aa94e5a3efc08a105e1646"}, + {file = "ddtrace-2.19.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:507d4ebd509d407fe2133d19efc9923f551d4063ba8d9f62a4de7f1ac7dbe51a"}, + {file = "ddtrace-2.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:835d891b152e848bbdb0e2098c806a9344075bdf8d7ad1f84ab07fe3477a408c"}, + {file = "ddtrace-2.19.1-cp311-cp311-win32.whl", hash = "sha256:49638d9e011fca10c44f227ca1e6051d95d84719179947f02a9ab7a898782340"}, + {file = "ddtrace-2.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:0a94c1b9645382b625e2d40158ae2c8035450d45456edc1c794152e24adb7572"}, + {file = "ddtrace-2.19.1-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:9f61efa4bd35065b9d1ebcaa8d0c38aa07a69e815141bb78c29f47f9c366162e"}, + {file = "ddtrace-2.19.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:650556e47507a1956f4790c5d2aa8c8e67161c9a6e2957a1b2c1271570079ff6"}, + {file = "ddtrace-2.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:619d3f615a4e1c85e021f9c058811d5e8e6491dd19cb3c594c877173abab9be7"}, + {file = "ddtrace-2.19.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587e3697986fece1a5bfc992d4e94fad6c527d48768d10675765b50ef22a260f"}, + {file = "ddtrace-2.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a441ed49b5f673934508ea0bfd041c605939b4a56c989301af5d1d7b58b163f"}, + {file = "ddtrace-2.19.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:248279640bc696bc85ccec8137b3749b530ec77f3772a5ab1cf35dae9fc3185c"}, + {file = "ddtrace-2.19.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a6f302e6dcb650cc37de3e5d329142c1adba095bd5072f5318ff599aded4f12b"}, + {file = "ddtrace-2.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:40bbc851c997577dc33aac65f77332c4dde8886c718b619772bd7e5823400155"}, + {file = "ddtrace-2.19.1-cp312-cp312-win32.whl", hash = "sha256:d5c20848ff667424c89995c2623538a215030992839c390fa5017278053d3cdd"}, + {file = "ddtrace-2.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:e71bd1567d157fa8bfb6f8ad97b3951d8cb892567d87e448c3f2bb94e9f405fe"}, + {file = "ddtrace-2.19.1-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:ed9e06f51c97116b7fef5d5768e4defbc42927e4308272f2483ed24ae275e0f3"}, + {file = "ddtrace-2.19.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:ae73f9efda7c230cb93efe1a28a097cab82f2792cae05c6739a500c64b98f512"}, + {file = "ddtrace-2.19.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75e77c63e172d4a05f5b76b3b024ba28e2d9a1fbd931fc9b52f3726d8c9e78c3"}, + {file = "ddtrace-2.19.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6f23d3a066513c3db1b2cbe0b63bda0629b8cdbfbb9ef34f45a0478688abe29"}, + {file = "ddtrace-2.19.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7abf200a82165d0b49abc94c070e2dc6083cd689c00f5ddb260b9609e3f3982"}, + {file = "ddtrace-2.19.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8c2e23da18956c3f078931171c920c82792b5b8f5b779f2c9d743bcba6eebe6e"}, + {file = "ddtrace-2.19.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b633f149f83e1b8e376602c09ee99c4d6d264fa1510a7b61a937db7e631e1c69"}, + {file = "ddtrace-2.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f2587d376b9c35c6f7fabc5a1167c3eb1deb4726e801fdca6adcf2fb1c2c545"}, + {file = "ddtrace-2.19.1-cp37-cp37m-macosx_12_0_x86_64.whl", hash = "sha256:5fc57b3adf0fe89be4a5c5870894933d01b2a8bed6e55c0d192612a47fc6fcf1"}, + {file = "ddtrace-2.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c70546e3f19f3173023d5d324d86f10bd113b45c3ba4214401eb35d36475576"}, + {file = "ddtrace-2.19.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99efa02a24d0027fddb8434e6aceb2a6540362d24ce06f20da2ec582b80ffa6"}, + {file = "ddtrace-2.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d3d8412de4270044fdce3759eac0f4be93c60564fdf84b1c7d65a937d53720f"}, + {file = "ddtrace-2.19.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d0aafd871773c2e28519040c69790fab38ca8731dde07cef64ffa3722253f07b"}, + {file = "ddtrace-2.19.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:e1e250eb470930b65c1cbd197bac5dcc9d6e8e0a37bf52bd8de33b95e444c075"}, + {file = "ddtrace-2.19.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:2f6a7b5812fb92d63a8f55ba24346b3d07ac76519250ed86b0bde98f8bb3e384"}, + {file = "ddtrace-2.19.1-cp37-cp37m-win32.whl", hash = "sha256:04199d69f9352e9463aa51fb4b08f11c7bfade0bf4f50dec597cf6577588c47c"}, + {file = "ddtrace-2.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08c95895cada1a6da8fdbe1c9a2e8eb2bb29e6df97cba33a1804c059605bf6ad"}, + {file = "ddtrace-2.19.1-cp38-cp38-macosx_12_0_universal2.whl", hash = "sha256:03086fa9bad36a4fef5fdf33d2a7a872e77d4d85742391c5ad47fd7a719f3f7f"}, + {file = "ddtrace-2.19.1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:57286262e57988582697d1a3d50ef86876d04b41ea2f420e67f37e5ca57dcf1e"}, + {file = "ddtrace-2.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11b4ee4627ea4df619f26d1947da83ea64b2f887eab790c56a8a1c866ac16a56"}, + {file = "ddtrace-2.19.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf285714e274c6fe6e776d753cd5cfdcbaa72542f2053e89b6eba87584db25e"}, + {file = "ddtrace-2.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83f43e492cd16be18dbc0cab860bbd4066b6cb6bed374ce9eea4854fff56876"}, + {file = "ddtrace-2.19.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a30bb5903c8bd695522a78d2cbc6b0e7189cd126fab63f3356acce8e78e453fa"}, + {file = "ddtrace-2.19.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:93e52c2ab8ed4e112a19b93a56929b5eb3281ad6e5bc950e925d8a2eae3ab6a3"}, + {file = "ddtrace-2.19.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93408fb44289b318e6894635beb336a28ee4ce260b0db18b1391535bf833aeb1"}, + {file = "ddtrace-2.19.1-cp38-cp38-win32.whl", hash = "sha256:b26d04c8f5d0c0fcb665fe1069e2b06ecb8f2cfbbacc255bb641e44a00e47390"}, + {file = "ddtrace-2.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:dfbd8470ec8a81368f62847b90f9d0cdf804d311a737e4dc5127cbb6d87201b9"}, + {file = "ddtrace-2.19.1-cp39-cp39-macosx_12_0_universal2.whl", hash = "sha256:749e5aa0cf2e3c0dc63b4b325c733d8d1505785fecf0194b5752d23adb6f4916"}, + {file = "ddtrace-2.19.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0bccc189f799af9d25050fcbe626d10552e0a0d9989f853c195edbf49bd36199"}, + {file = "ddtrace-2.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61798b40fea57d7f59d7179e31b0f04b2e5901f06dc7b8abade3f72a50b4b119"}, + {file = "ddtrace-2.19.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cc20ff3fb82bc614585ed32c4af81bf48b5fdfe4c474283df009982721c5552"}, + {file = "ddtrace-2.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64eaaf159ca310ce7dddde27c595503d1b9da9a1b6be668f411a2b02fba1ab29"}, + {file = "ddtrace-2.19.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:355dd017cf1b28e69df35996175bba5f7823e1d7368eec1b263b43a18976643e"}, + {file = "ddtrace-2.19.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:19e96324bb27af311c180013aedcc1aa1b341c281d902a7ca2c52a68804eb1ea"}, + {file = "ddtrace-2.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:da95970736a920a6ce7a359d0adcb30b9711bbc21c2a1d898fdb8f87f9b0005d"}, + {file = "ddtrace-2.19.1-cp39-cp39-win32.whl", hash = "sha256:3f5ac6c515ddee38c8ce7cc1227d5a88dfb715f8502ef952ee4356a311f13ba5"}, + {file = "ddtrace-2.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:82a0b87cb214dfec2d25f70a2a18e89788bcc23a2f0f3cff1e750a842474c994"}, + {file = "ddtrace-2.19.1.tar.gz", hash = "sha256:b4558abcbc10e0b5c71cf54c490f5791163cd071e7bfdecce56db56f02ffd0a3"}, ] [package.dependencies] bytecode = [ - {version = ">=0.15.0", markers = "python_version >= \"3.12.0\""}, - {version = ">=0.14.0", markers = "python_version ~= \"3.11.0\""}, {version = ">=0.13.0", markers = "python_version < \"3.11.0\""}, + {version = ">=0.16.0", markers = "python_version >= \"3.13.0\""}, + {version = ">=0.15.0", markers = "python_version ~= \"3.12.0\""}, + {version = ">=0.14.0", markers = "python_version ~= \"3.11.0\""}, ] envier = ">=0.5,<1.0" +legacy-cgi = {version = ">=2.0.0", markers = "python_version >= \"3.13.0\""} opentelemetry-api = ">=1" protobuf = ">=3" typing_extensions = "*" @@ -1521,6 +1585,7 @@ version = "5.1.1" description = "Decorators for Humans" optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -1532,6 +1597,8 @@ version = "1.2.15" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320"}, {file = "deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"}, @@ -1549,6 +1616,7 @@ version = "2.1.0" description = "A library to handle automated deprecations" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, @@ -1563,6 +1631,7 @@ version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -1578,6 +1647,7 @@ version = "0.5.0" description = "Python module and CLI for hashing of file system directories." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "dirhash-0.5.0-py3-none-any.whl", hash = "sha256:523dfd6b058c64f45b31604376926c6e2bd2ea301d0df23095d4055674e38b09"}, {file = "dirhash-0.5.0.tar.gz", hash = "sha256:e60760f0ab2e935d8cb088923ea2c6492398dca42cec785df778985fd4cd5386"}, @@ -1592,6 +1662,7 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -1603,6 +1674,7 @@ version = "7.1.0" description = "A Python library for the Docker Engine API." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"}, {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"}, @@ -1625,6 +1697,8 @@ version = "0.6.1" description = "Python application configuration via the environment" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "envier-0.6.1-py3-none-any.whl", hash = "sha256:73609040a76be48bbcb97074d9969666484aa0de706183a6e9ef773156a8a6a9"}, {file = "envier-0.6.1.tar.gz", hash = "sha256:3309a01bb3d8850c9e7a31a5166d5a836846db2faecb79b9cb32654dd50ca9f9"}, @@ -1639,6 +1713,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1653,6 +1729,7 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1667,6 +1744,8 @@ version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"validation\" or extra == \"all\"" files = [ {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, @@ -1681,6 +1760,7 @@ version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, @@ -1697,6 +1777,7 @@ version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, @@ -1714,6 +1795,7 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1728,6 +1810,7 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1746,6 +1829,7 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -1757,6 +1841,7 @@ version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, @@ -1778,6 +1863,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1802,6 +1888,7 @@ version = "2.3.0" description = "HashiCorp Vault API client" optional = false python-versions = "<4.0,>=3.8" +groups = ["dev"] files = [ {file = "hvac-2.3.0-py3-none-any.whl", hash = "sha256:a3afc5710760b6ee9b3571769df87a0333da45da05a5f9f963e1d3925a84be7d"}, {file = "hvac-2.3.0.tar.gz", hash = "sha256:1b85e3320e8642dd82f234db63253cda169a817589e823713dc5fca83119b1e2"}, @@ -1819,6 +1906,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1833,6 +1921,7 @@ version = "3.3.0" description = "Iterative JSON parser with standard Python iterator interfaces" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7f7a5250599c366369fbf3bc4e176f5daa28eb6bc7d6130d02462ed335361675"}, {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f87a7e52f79059f9c58f6886c262061065eb6f7554a587be7ed3aa63e6b71b34"}, @@ -1936,10 +2025,12 @@ version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] +markers = {main = "extra == \"datadog\""} [package.dependencies] zipp = ">=3.20" @@ -1959,6 +2050,7 @@ version = "6.4.5" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, @@ -1981,6 +2073,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1992,6 +2085,7 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -2006,6 +2100,7 @@ version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -2023,6 +2118,7 @@ version = "1.0.1" description = "JSON Matching Expressions" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, @@ -2034,6 +2130,7 @@ version = "1.106.0" description = "Python client for jsii runtime" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "jsii-1.106.0-py3-none-any.whl", hash = "sha256:5a44d7c3a5a326fa3d9befdb3770b380057e0a61e3804e7c4907f70d76afaaa2"}, {file = "jsii-1.106.0.tar.gz", hash = "sha256:c79c47899f53a7c3c4b20f80d3cd306628fe9ed1852eee970324c71eba1d974e"}, @@ -2054,6 +2151,7 @@ version = "1.33" description = "Apply JSON-Patches (RFC 6902)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +groups = ["dev"] files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, @@ -2068,10 +2166,10 @@ version = "1.7.0" description = "A final implementation of JSONPath for Python that aims to be standard compliant, including arithmetic and binary comparison operators and providing clear AST for metaprogramming." optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, - {file = "jsonpath_ng-1.7.0-py2-none-any.whl", hash = "sha256:898c93fc173f0c336784a3fa63d7434297544b7198124a68f9a3ef9597b0ae6e"}, - {file = "jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6"}, ] [package.dependencies] @@ -2083,6 +2181,7 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -2094,6 +2193,7 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -2117,6 +2217,7 @@ version = "2023.12.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, @@ -2126,12 +2227,26 @@ files = [ importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} referencing = ">=0.31.0" +[[package]] +name = "legacy-cgi" +version = "2.6.2" +description = "Fork of the standard library cgi and cgitb modules, being deprecated in PEP-594" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"datadog\" and python_version >= \"3.13.0\"" +files = [ + {file = "legacy_cgi-2.6.2-py3-none-any.whl", hash = "sha256:a7b83afb1baf6ebeb56522537c5943ef9813cf933f6715e88a803f7edbce0bff"}, + {file = "legacy_cgi-2.6.2.tar.gz", hash = "sha256:9952471ceb304043b104c22d00b4f333cac27a6abe446d8a528fc437cf13c85f"}, +] + [[package]] name = "mako" version = "1.3.8" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "Mako-1.3.8-py3-none-any.whl", hash = "sha256:42f48953c7eb91332040ff567eb7eea69b22e7a4affbc5ba8e845e8f730f6627"}, {file = "mako-1.3.8.tar.gz", hash = "sha256:577b97e414580d3e088d47c2dbbe9594aa7a5146ed2875d4dfa9075af2dd3cc8"}, @@ -2151,6 +2266,7 @@ version = "0.7.1" description = "Create Python CLI apps with little to no effort at all!" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "mando-0.7.1-py2.py3-none-any.whl", hash = "sha256:26ef1d70928b6057ee3ca12583d73c63e05c49de8972d620c278a7b206581a8a"}, {file = "mando-0.7.1.tar.gz", hash = "sha256:18baa999b4b613faefb00eac4efadcf14f510b59b924b66e08289aa1de8c3500"}, @@ -2168,6 +2284,7 @@ version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, @@ -2186,6 +2303,7 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -2210,6 +2328,7 @@ version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, @@ -2279,6 +2398,7 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -2290,6 +2410,7 @@ version = "1.3.4" description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -2301,6 +2422,7 @@ version = "2.1.3" description = "Manage multiple versions of your MkDocs-powered documentation" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "mike-2.1.3-py3-none-any.whl", hash = "sha256:d90c64077e84f06272437b464735130d380703a76a5738b152932884c60c062a"}, {file = "mike-2.1.3.tar.gz", hash = "sha256:abd79b8ea483fb0275b7972825d3082e5ae67a41820f8d8a0dc7a3f49944e810"}, @@ -2326,6 +2448,7 @@ version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, @@ -2357,6 +2480,7 @@ version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, @@ -2374,6 +2498,7 @@ version = "0.3.2" description = "MkDocs plugin for setting revision date from git per markdown file." optional = false python-versions = ">=3.4" +groups = ["dev"] files = [ {file = "mkdocs_git_revision_date_plugin-0.3.2-py3-none-any.whl", hash = "sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef"}, ] @@ -2389,6 +2514,7 @@ version = "9.5.50" description = "Documentation that simply works" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385"}, {file = "mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825"}, @@ -2418,6 +2544,7 @@ version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, @@ -2429,6 +2556,7 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2446,6 +2574,7 @@ version = "0.70.17" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ddb24e5bcdb64e90ec5543a1f05a39463068b6d3b804aa3f2a4e16ec28562d6"}, {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d729f55198a3579f6879766a6d9b72b42d4b320c0dcb7844afb774d75b573c62"}, @@ -2474,6 +2603,7 @@ version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, @@ -2533,6 +2663,7 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfig 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_appconfig-1.36.0-py3-none-any.whl", hash = "sha256:d627de43761a83991a0ab8cd10698d415f94dcc78a567433c7465fc8d1f5cc16"}, {file = "mypy_boto3_appconfig-1.36.0.tar.gz", hash = "sha256:3f38cbd2d7d359da88dc996eeeafa4c1174847909e31a327dd77263dfdfd5424"}, @@ -2547,6 +2678,7 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfigData 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_appconfigdata-1.36.0-py3-none-any.whl", hash = "sha256:68f02ce06ed9597b02154aff64655fc38c42919eda08fddb130ba17e9f70e9cb"}, {file = "mypy_boto3_appconfigdata-1.36.0.tar.gz", hash = "sha256:3436d149833ea69b4260a0f352aac19258d4676c7a21087625906f7da98624c7"}, @@ -2561,6 +2693,7 @@ version = "1.36.0" description = "Type annotations for boto3 CloudFormation 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_cloudformation-1.36.0-py3-none-any.whl", hash = "sha256:3f6cd81739aaf9634c4aa2b92579081038a76e4f2dec306d02eaaf558b332ce9"}, {file = "mypy_boto3_cloudformation-1.36.0.tar.gz", hash = "sha256:acc2c7ae8920f1167be097f6151685fe5aee99be2f890075edf93e05d298e8b0"}, @@ -2575,6 +2708,7 @@ version = "1.36.0" description = "Type annotations for boto3 CloudWatch 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_cloudwatch-1.36.0-py3-none-any.whl", hash = "sha256:2f6cb81c05a1b4be3510e0857b22913a241488bc08f55b0ad96e8b775c144891"}, {file = "mypy_boto3_cloudwatch-1.36.0.tar.gz", hash = "sha256:a370d61522121ab457c443c338a652d0d3e1c22102d9db9f197fd5dcb7e656a4"}, @@ -2589,6 +2723,7 @@ version = "1.36.0" description = "Type annotations for boto3 DynamoDB 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_dynamodb-1.36.0-py3-none-any.whl", hash = "sha256:b782a817ce8956f8d53ac94c85f969dfe51451fc99f16a3b62776f1e0ed3f1ba"}, {file = "mypy_boto3_dynamodb-1.36.0.tar.gz", hash = "sha256:1687e4689236a5391755126e86ec2596d408eb95408c31ac09a3d1eb289d516d"}, @@ -2603,6 +2738,7 @@ version = "1.36.0" description = "Type annotations for boto3 Lambda 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_lambda-1.36.0-py3-none-any.whl", hash = "sha256:8a6693be1352b51e232cee73f73ce36014d19b4777bdf6969c5e707aba424ca1"}, {file = "mypy_boto3_lambda-1.36.0.tar.gz", hash = "sha256:5e9f23702060529aad216a3ce2a2368391a112df07909fbd3aa80d573d84893c"}, @@ -2613,13 +2749,14 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-logs" -version = "1.36.0" -description = "Type annotations for boto3 CloudWatchLogs 1.36.0 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.3" +description = "Type annotations for boto3 CloudWatchLogs 1.36.3 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "mypy_boto3_logs-1.36.0-py3-none-any.whl", hash = "sha256:e6915823bef5f4c588005e729422a900365b9ea88b123c3750a97f31af2c9cbe"}, - {file = "mypy_boto3_logs-1.36.0.tar.gz", hash = "sha256:a10cc4d46927df1241868f0a4fff63d7fd5d2d04349663ed9d7790b8c9dbb9bc"}, + {file = "mypy_boto3_logs-1.36.3-py3-none-any.whl", hash = "sha256:553cb31261eb4484394af9ac965fa33b0d414e927c47768021a0a6ec89625f64"}, + {file = "mypy_boto3_logs-1.36.3.tar.gz", hash = "sha256:76d233632a36665094ac888a685fade150c10665ab4cad1b17265037fcadd098"}, ] [package.dependencies] @@ -2631,6 +2768,7 @@ version = "1.36.0" description = "Type annotations for boto3 S3 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_s3-1.36.0-py3-none-any.whl", hash = "sha256:a65ccb6be7b7ebf907887268d44975e435b1fc1164fc0a25de310e2b832f7e91"}, {file = "mypy_boto3_s3-1.36.0.tar.gz", hash = "sha256:80a881847b0e1fbc5edcad8b2870c110e31e7ef128db42402b70c159b7e93d5a"}, @@ -2645,6 +2783,7 @@ version = "1.36.0" description = "Type annotations for boto3 SecretsManager 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_secretsmanager-1.36.0-py3-none-any.whl", hash = "sha256:d7fd56b08afed32ce26f2663ec57f9ea074e1e5149a4388eccb46653e3cb5a66"}, {file = "mypy_boto3_secretsmanager-1.36.0.tar.gz", hash = "sha256:6e1f91cd5b0c1f0533f8cfa91e4755855d39931475e7d1e23ee8dbb2e7163d18"}, @@ -2659,6 +2798,7 @@ version = "1.36.0" description = "Type annotations for boto3 SSM 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_ssm-1.36.0-py3-none-any.whl", hash = "sha256:c79a6a949f0b57e68bd48d3d15eb56b975633ffdfaa449d119831c205228cab6"}, {file = "mypy_boto3_ssm-1.36.0.tar.gz", hash = "sha256:bbb9a9ce0e318cad2a53f8200102b4fdc547c7f33912146df82698c9ae40181f"}, @@ -2673,6 +2813,7 @@ version = "1.36.0" description = "Type annotations for boto3 XRay 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_xray-1.36.0-py3-none-any.whl", hash = "sha256:b92a06db10f623db4ec0641227f468b7a57c77f8e599846cfddace4b434f70a5"}, {file = "mypy_boto3_xray-1.36.0.tar.gz", hash = "sha256:5ae2b4c333bf2881870ffb96f1d99cd5e7ee1706d071b6923dcd6de6ceb3ac0c"}, @@ -2687,6 +2828,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -2698,6 +2840,7 @@ version = "3.1" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, @@ -2716,6 +2859,7 @@ version = "2024.10.9" description = "Flexible test automation." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "nox-2024.10.9-py3-none-any.whl", hash = "sha256:1d36f309a0a2a853e9bccb76bbef6bb118ba92fa92674d15604ca99adeb29eab"}, {file = "nox-2024.10.9.tar.gz", hash = "sha256:7aa9dc8d1c27e9f45ab046ffd1c3b2c4f7c91755304769df231308849ebded95"}, @@ -2738,6 +2882,8 @@ version = "1.29.0" description = "OpenTelemetry Python API" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "opentelemetry_api-1.29.0-py3-none-any.whl", hash = "sha256:5fcd94c4141cc49c736271f3e1efb777bebe9cc535759c54c936cca4f1b312b8"}, {file = "opentelemetry_api-1.29.0.tar.gz", hash = "sha256:d04a6cf78aad09614f52964ecb38021e248f5714dc32c2e0d8fd99517b4d69cf"}, @@ -2753,6 +2899,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -2764,6 +2911,7 @@ version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, @@ -2779,6 +2927,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -2790,6 +2939,7 @@ version = "6.1.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" +groups = ["dev"] files = [ {file = "pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"}, {file = "pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24"}, @@ -2801,6 +2951,7 @@ version = "0.11.0" description = "Auto-generate API documentation for Python projects." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pdoc3-0.11.0.tar.gz", hash = "sha256:12f28c6ee045ca8ad6a624b86d1982c51de20e83c0a721cd7b0933f44ae0a655"}, ] @@ -2815,6 +2966,8 @@ version = "1.3.10" description = "Resolve a name to an object." optional = false python-versions = ">=3.6" +groups = ["dev"] +markers = "python_version < \"3.9\"" files = [ {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, @@ -2826,6 +2979,7 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -2842,6 +2996,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -2857,6 +3012,8 @@ version = "3.11" description = "Python Lex & Yacc" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, @@ -2868,6 +3025,8 @@ version = "5.29.3" description = "" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, @@ -2888,6 +3047,7 @@ version = "0.0.3" description = "Publication helps you maintain public-api-friendly modules by preventing unintentional access to private implementation details via introspection." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "publication-0.0.3-py2.py3-none-any.whl", hash = "sha256:0248885351febc11d8a1098d5c8e3ab2dabcf3e8c0c96db1e17ecd12b53afbe6"}, {file = "publication-0.0.3.tar.gz", hash = "sha256:68416a0de76dddcdd2930d1c8ef853a743cc96c82416c4e4d3b5d901c6276dc4"}, @@ -2899,6 +3059,7 @@ version = "9.0.0" description = "Get CPU info with pure Python" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, @@ -2910,10 +3071,12 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] +markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" @@ -2921,10 +3084,12 @@ version = "2.10.5" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"}, {file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"}, ] +markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] annotated-types = ">=0.6.0" @@ -2941,6 +3106,7 @@ version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -3043,6 +3209,7 @@ files = [ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] +markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" @@ -3053,6 +3220,8 @@ version = "2.7.1" description = "Settings management using Pydantic" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"all\"" files = [ {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"}, {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"}, @@ -3073,6 +3242,7 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -3083,13 +3253,14 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymdown-extensions" -version = "10.14" +version = "10.14.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "pymdown_extensions-10.14-py3-none-any.whl", hash = "sha256:202481f716cc8250e4be8fce997781ebf7917701b59652458ee47f2401f818b5"}, - {file = "pymdown_extensions-10.14.tar.gz", hash = "sha256:741bd7c4ff961ba40b7528d32284c53bc436b8b1645e8e37c3e57770b8700a34"}, + {file = "pymdown_extensions-10.14.1-py3-none-any.whl", hash = "sha256:637951cbfbe9874ba28134fb3ce4b8bcadd6aca89ac4998ec29dcbafd554ae08"}, + {file = "pymdown_extensions-10.14.1.tar.gz", hash = "sha256:b65801996a0cd4f42a3110810c306c45b7313c09b0610a6f773730f2a9e3c96b"}, ] [package.dependencies] @@ -3105,6 +3276,7 @@ version = "3.1.4" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" +groups = ["dev"] files = [ {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, @@ -3119,6 +3291,7 @@ version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -3141,6 +3314,7 @@ version = "0.24.0" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"}, {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"}, @@ -3159,6 +3333,7 @@ version = "4.0.0" description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-benchmark-4.0.0.tar.gz", hash = "sha256:fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1"}, {file = "pytest_benchmark-4.0.0-py3-none-any.whl", hash = "sha256:fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6"}, @@ -3179,6 +3354,7 @@ version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, @@ -3197,6 +3373,7 @@ version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, @@ -3214,6 +3391,7 @@ version = "0.7.0" description = "Pytest Plugin to disable socket calls during tests" optional = false python-versions = ">=3.8,<4.0" +groups = ["dev"] files = [ {file = "pytest_socket-0.7.0-py3-none-any.whl", hash = "sha256:7e0f4642177d55d317bbd58fc68c6bd9048d6eadb2d46a89307fa9221336ce45"}, {file = "pytest_socket-0.7.0.tar.gz", hash = "sha256:71ab048cbbcb085c15a4423b73b619a8b35d6a307f46f78ea46be51b1b7e11b3"}, @@ -3228,6 +3406,7 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -3248,6 +3427,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -3262,6 +3442,8 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"all\"" files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -3276,6 +3458,8 @@ version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["dev"] +markers = "python_version < \"3.9\"" files = [ {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, @@ -3287,6 +3471,8 @@ version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" +groups = ["dev"] +markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, @@ -3314,6 +3500,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -3376,6 +3563,7 @@ version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, @@ -3390,6 +3578,7 @@ version = "6.0.1" description = "Code Metrics in Python" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "radon-6.0.1-py2.py3-none-any.whl", hash = "sha256:632cc032364a6f8bb1010a2f6a12d0f14bc7e5ede76585ef29dc0cecf4cd8859"}, {file = "radon-6.0.1.tar.gz", hash = "sha256:d1ac0053943a893878940fedc8b19ace70386fc9c9bf0a09229a44125ebf45b5"}, @@ -3408,10 +3597,12 @@ version = "5.2.1" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"}, {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"}, ] +markers = {main = "extra == \"redis\""} [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} @@ -3426,6 +3617,7 @@ version = "0.35.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, @@ -3441,6 +3633,7 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -3544,6 +3737,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -3565,6 +3759,7 @@ version = "0.9.5" description = "Easy to use retry decorator." optional = false python-versions = ">=2.6" +groups = ["dev"] files = [ {file = "retry2-0.9.5-py2.py3-none-any.whl", hash = "sha256:f7fee13b1e15d0611c462910a6aa72a8919823988dd0412152bc3719c89a4e55"}, ] @@ -3578,6 +3773,7 @@ version = "13.9.4" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, @@ -3597,6 +3793,7 @@ version = "0.20.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "rpds_py-0.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a649dfd735fff086e8a9d0503a9f0c7d01b7912a333c7ae77e1515c08c146dad"}, {file = "rpds_py-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f16bc1334853e91ddaaa1217045dd7be166170beec337576818461268a3de67f"}, @@ -3709,6 +3906,7 @@ version = "0.9.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "ruff-0.9.2-py3-none-linux_armv6l.whl", hash = "sha256:80605a039ba1454d002b32139e4970becf84b5fee3a3c3bf1c2af6f61a784347"}, {file = "ruff-0.9.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9aab82bb20afd5f596527045c01e6ae25a718ff1784cb92947bff1f83068b00"}, @@ -3732,20 +3930,21 @@ files = [ [[package]] name = "s3transfer" -version = "0.10.4" +version = "0.11.1" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "s3transfer-0.10.4-py3-none-any.whl", hash = "sha256:244a76a24355363a68164241438de1b72f8781664920260c48465896b712a41e"}, - {file = "s3transfer-0.10.4.tar.gz", hash = "sha256:29edc09801743c21eb5ecbc617a152df41d3c287f67b615f73e5f750583666a7"}, + {file = "s3transfer-0.11.1-py3-none-any.whl", hash = "sha256:8fa0aa48177be1f3425176dfe1ab85dcd3d962df603c3dbfc585e6bf857ef0ff"}, + {file = "s3transfer-0.11.1.tar.gz", hash = "sha256:3f25c900a367c8b7f7d8f9c34edc87e300bde424f779dc9f0a8ae4f9df9264f6"}, ] [package.dependencies] -botocore = ">=1.33.2,<2.0a.0" +botocore = ">=1.36.0,<2.0a.0" [package.extras] -crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] +crt = ["botocore[crt] (>=1.36.0,<2.0a.0)"] [[package]] name = "scantree" @@ -3753,6 +3952,7 @@ version = "0.0.4" description = "Flexible recursive directory iterator: scandir meets glob(\"**\", recursive=True)" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "scantree-0.0.4-py3-none-any.whl", hash = "sha256:7616ab65aa6b7f16fcf8e6fa1d9afaa99a27ab72bba05c61b691853b96763174"}, {file = "scantree-0.0.4.tar.gz", hash = "sha256:15bd5cb24483b04db2c70653604e8ea3522e98087db7e38ab8482f053984c0ac"}, @@ -3768,6 +3968,7 @@ version = "2.20.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "sentry_sdk-2.20.0-py2.py3-none-any.whl", hash = "sha256:c359a1edf950eb5e80cffd7d9111f3dbeef57994cb4415df37d39fda2cf22364"}, {file = "sentry_sdk-2.20.0.tar.gz", hash = "sha256:afa82713a92facf847df3c6f63cec71eb488d826a50965def3d7722aa6f0fdab"}, @@ -3823,6 +4024,7 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -3834,6 +4036,7 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -3845,6 +4048,7 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -3856,6 +4060,7 @@ version = "5.3.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "stevedore-5.3.0-py3-none-any.whl", hash = "sha256:1efd34ca08f474dad08d9b19e934a22c68bb6fe416926479ba29e5013bcc8f78"}, {file = "stevedore-5.3.0.tar.gz", hash = "sha256:9a64265f4060312828151c204efbe9b7a9852a0d9228756344dbc7e4023e375a"}, @@ -3870,6 +4075,7 @@ version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, @@ -3887,6 +4093,7 @@ version = "3.7.1" description = "Library provides lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "testcontainers-3.7.1-py2.py3-none-any.whl", hash = "sha256:7f48cef4bf0ccd78f1a4534d4b701a003a3bace851f24eae58a32f9e3f0aeba0"}, ] @@ -3921,6 +4128,8 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_full_version <= \"3.11.0a6\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -3962,6 +4171,7 @@ version = "2.13.3" description = "Run-time type checker for Python" optional = false python-versions = ">=3.5.3" +groups = ["dev"] files = [ {file = "typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1"}, {file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"}, @@ -3977,6 +4187,7 @@ version = "0.23.6" description = "Type annotations and code completion for awscrt" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_awscrt-0.23.6-py3-none-any.whl", hash = "sha256:fbf9c221af5607b24bf17f8431217ce8b9a27917139edbc984891eb63fd5a593"}, {file = "types_awscrt-0.23.6.tar.gz", hash = "sha256:405bce8c281f9e7c6c92a229225cc0bf10d30729a6a601123213389bd524b8b1"}, @@ -3988,6 +4199,7 @@ version = "1.16.0.20241221" description = "Typing stubs for cffi" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_cffi-1.16.0.20241221-py3-none-any.whl", hash = "sha256:e5b76b4211d7a9185f6ab8d06a106d56c7eb80af7cdb8bfcb4186ade10fb112f"}, {file = "types_cffi-1.16.0.20241221.tar.gz", hash = "sha256:1c96649618f4b6145f58231acb976e0b448be6b847f7ab733dabe62dfbff6591"}, @@ -4002,6 +4214,7 @@ version = "24.1.0.20240722" description = "Typing stubs for pyOpenSSL" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types-pyOpenSSL-24.1.0.20240722.tar.gz", hash = "sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39"}, {file = "types_pyOpenSSL-24.1.0.20240722-py3-none-any.whl", hash = "sha256:6a7a5d2ec042537934cfb4c9d4deb0e16c4c6250b09358df1f083682fe6fda54"}, @@ -4017,6 +4230,7 @@ version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, @@ -4028,6 +4242,7 @@ version = "4.6.0.20241004" description = "Typing stubs for redis" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types-redis-4.6.0.20241004.tar.gz", hash = "sha256:5f17d2b3f9091ab75384153bfa276619ffa1cf6a38da60e10d5e6749cc5b902e"}, {file = "types_redis-4.6.0.20241004-py3-none-any.whl", hash = "sha256:ef5da68cb827e5f606c8f9c0b49eeee4c2669d6d97122f301d3a55dc6a63f6ed"}, @@ -4043,6 +4258,7 @@ version = "2.31.0.6" description = "Typing stubs for requests" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, @@ -4053,13 +4269,14 @@ types-urllib3 = "*" [[package]] name = "types-s3transfer" -version = "0.10.4" +version = "0.11.1" description = "Type annotations and code completion for s3transfer" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "types_s3transfer-0.10.4-py3-none-any.whl", hash = "sha256:22ac1aabc98f9d7f2928eb3fb4d5c02bf7435687f0913345a97dd3b84d0c217d"}, - {file = "types_s3transfer-0.10.4.tar.gz", hash = "sha256:03123477e3064c81efe712bf9d372c7c72f2790711431f9baa59cf96ea607267"}, + {file = "types_s3transfer-0.11.1-py3-none-any.whl", hash = "sha256:ddb20d103361c2d7cf95e9e73468cdd12f049f503b1512e6fdfe5a66fa086d2d"}, + {file = "types_s3transfer-0.11.1.tar.gz", hash = "sha256:6ab89d4d76bcbf6d494582949963b4672347e8daa397d9790f3684b4fcf873c4"}, ] [[package]] @@ -4068,6 +4285,7 @@ version = "75.8.0.20250110" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480"}, {file = "types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271"}, @@ -4079,6 +4297,7 @@ version = "1.26.25.14" description = "Typing stubs for urllib3" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, @@ -4090,6 +4309,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -4101,6 +4321,8 @@ version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, @@ -4188,6 +4410,7 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, @@ -4204,6 +4427,7 @@ version = "0.1.0" description = "Flexible version handling" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, @@ -4214,13 +4438,14 @@ test = ["coverage", "flake8 (>=3.7)", "mypy", "pretend", "pytest"] [[package]] name = "virtualenv" -version = "20.28.1" +version = "20.29.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "virtualenv-20.28.1-py3-none-any.whl", hash = "sha256:412773c85d4dab0409b83ec36f7a6499e72eaf08c80e81e9576bca61831c71cb"}, - {file = "virtualenv-20.28.1.tar.gz", hash = "sha256:5d34ab240fdb5d21549b76f9e8ff3af28252f5499fb6d6f031adac4e5a8c5329"}, + {file = "virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779"}, + {file = "virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35"}, ] [package.dependencies] @@ -4238,6 +4463,7 @@ version = "4.0.2" description = "Filesystem events monitoring" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ede7f010f2239b97cc79e6cb3c249e72962404ae3865860855d5cbe708b0fd22"}, {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2cffa171445b0efa0726c561eca9a27d00a1f2b83846dbd5a4f639c4f8ca8e1"}, @@ -4281,84 +4507,93 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wrapt" -version = "1.17.1" +version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" -files = [ - {file = "wrapt-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9176057c60438c2ce2284cdefc2b3ee5eddc8c87cd6e24c558d9f5c64298fa4a"}, - {file = "wrapt-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e0f0e731e0ca1583befd3af71b9f90d64ded1535da7b80181cb9e907cc10bbae"}, - {file = "wrapt-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:144ed42a4ec3aca5d6f1524f99ee49493bbd0d9c66c24da7ec44b4661dca4dcc"}, - {file = "wrapt-1.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8a7b0699a381226d81d75b48ea58414beb5891ba8982bdc8e42912f766de074"}, - {file = "wrapt-1.17.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b20fcef5a3ee410671a5a59472e1ff9dda21cfbe5dfd15e23ee4b99ac455c8e"}, - {file = "wrapt-1.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b9a58a1cbdc0588ed4c8ab0c191002d5d831a58c3bad88523fe471ea97eaf57d"}, - {file = "wrapt-1.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:50bbfa7a92da7540426c774e09d6901e44d8f9b513b276ebae03ae244f0c6dbf"}, - {file = "wrapt-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09f5141599eaf36d6cc0b760ad87c2ab6b8618d009b2922639266676775a73a6"}, - {file = "wrapt-1.17.1-cp310-cp310-win32.whl", hash = "sha256:589f24449fd58508533c4a69b2a0f45e9e3419b86b43a0607e2fdb989c6f2552"}, - {file = "wrapt-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eca3a1afa9820785b79cb137c68ca38c2f77cfedc3120115da42e1d5800907e"}, - {file = "wrapt-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:da0d0c1c4bd55f9ace919454776dbf0821f537b9a77f739f0c3e34b14728b3b3"}, - {file = "wrapt-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cd7649f0c493d35f9aad9790bbecd7b6fd2e2f7141f6cb1e1e9bb7a681d6d0a4"}, - {file = "wrapt-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0aad4f54b3155d673a5c4706a71a0a84f3d415b2fc8a2a399a964d70f18846a2"}, - {file = "wrapt-1.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ebea3ebb6a394f50f150a52e279508e91c8770625ac8fcb5d8cf35995a320f2"}, - {file = "wrapt-1.17.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e2986a65eba7c399d7ad1ccd204562d4ffe6e937344fe5a49eb5a83858f797"}, - {file = "wrapt-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:67c30d3fe245adb0eb1061a0e526905970a0dabe7c5fba5078e0ee9d19f28167"}, - {file = "wrapt-1.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6fd88935b12b59a933ef45facb57575095f205d30d0ae8dd1a3b485bc4fa2fbd"}, - {file = "wrapt-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec3e763e7ca8dcba0792fc3e8ff7061186f59e9aafe4438e6bb1f635a6ab0901"}, - {file = "wrapt-1.17.1-cp311-cp311-win32.whl", hash = "sha256:d792631942a102d6d4f71e4948aceb307310ac0a0af054be6d28b4f79583e0f1"}, - {file = "wrapt-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:3dfd4738a630eddfcb7ff6c8e9fe863df3821f9c991dec73821e05450074ae09"}, - {file = "wrapt-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b1a4c8edd038fee0ce67bf119b16eaa45d22a52bbaf7d0a17d2312eb0003b1bb"}, - {file = "wrapt-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:181a844005c9818792212a32e004cb4c6bd8e35cae8e97b1a39a1918d95cef58"}, - {file = "wrapt-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21ffcf16f5c243a626b0f8da637948e3d5984e3bc0c1bc500ad990e88e974e3b"}, - {file = "wrapt-1.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb33799b7582bb73787b9903b70595f8eff67eecc9455f668ed01adf53f9eea"}, - {file = "wrapt-1.17.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57e932ad1908b53e9ad67a746432f02bc8473a9ee16e26a47645a2b224fba5fd"}, - {file = "wrapt-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b8bd35c15bc82c5cbe397e8196fa57a17ce5d3f30e925a6fd39e4c5bb02fdcff"}, - {file = "wrapt-1.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:93018dbb956e0ad99ea2fa2c3c22f033549dcb1f56ad9f4555dfe25e49688c5d"}, - {file = "wrapt-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5bd9186d52cf3d36bf1823be0e85297e4dbad909bc6dd495ce0d272806d84a7"}, - {file = "wrapt-1.17.1-cp312-cp312-win32.whl", hash = "sha256:d609f0ab0603bbcbf2de906b366b9f9bec75c32b4493550a940de658cc2ce512"}, - {file = "wrapt-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:2c160bb8815787646b27a0c8575a26a4d6bf6abd7c5eb250ad3f2d38b29cb2cb"}, - {file = "wrapt-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:99e544e6ce26f89ad5acc6f407bc4daf7c1d42321e836f5c768f834100bdf35c"}, - {file = "wrapt-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:78da796b74f2c8e0af021ee99feb3bff7cb46f8e658fe25c20e66be1080db4a2"}, - {file = "wrapt-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f1bc359f6c52e53565e7af24b423e7a1eea97d155f38ac9e90e95303514710b"}, - {file = "wrapt-1.17.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cbead724daa13cae46e8ab3bb24938d8514d123f34345535b184f3eb1b7ad717"}, - {file = "wrapt-1.17.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdf7b0e3d3713331c0bb9daac47cd10e5aa60d060e53696f50de4e560bd5617f"}, - {file = "wrapt-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f17e8d926f63aed65ff949682c922f96d00f65c2e852c24272232313fa7823d5"}, - {file = "wrapt-1.17.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9e04f3bd30e0b23c0ca7e1d4084e7d28b6d7d2feb8b7bc69b496fe881280579b"}, - {file = "wrapt-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5660e470edfa15ae7ef407272c642d29e9962777a6b30bfa8fc0da2173dc9afd"}, - {file = "wrapt-1.17.1-cp313-cp313-win32.whl", hash = "sha256:a992f9e019145e84616048556546edeaba68e05e1c1ffbe8391067a63cdadb0c"}, - {file = "wrapt-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:5c2e24ba455af4b0a237a890ea6ed9bafd01fac2c47095f87c53ea3344215d43"}, - {file = "wrapt-1.17.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88623fd957ba500d8bb0f7427a76496d99313ca2f9e932481c0882e034cf1add"}, - {file = "wrapt-1.17.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:162d5f15bdd3b8037e06540902227ef9e0f298496c0afaadd9e2875851446693"}, - {file = "wrapt-1.17.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bb82447ddae4e3d9b51f40c494f66e6cbd8fb0e8e8b993678416535c67f9a0d"}, - {file = "wrapt-1.17.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ce4cff3922707048d754e365c4ebf41a3bcbf29b329349bf85d51873c7c7e9e"}, - {file = "wrapt-1.17.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fdc4e73a3fa0c25eed4d836d9732226f0326957cb075044a7f252b465299433"}, - {file = "wrapt-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bca1c0824f824bcd97b4b179dd55dcad1dab419252be2b2faebbcacefa3b27b2"}, - {file = "wrapt-1.17.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:6d44b14f3a2f6343a07c90344850b7af5515538ce3a5d01f9c87d8bae9bd8724"}, - {file = "wrapt-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:169033329022739c6f0d8cd3031a113953b0ba500f3d5978904bdd40baec4568"}, - {file = "wrapt-1.17.1-cp313-cp313t-win32.whl", hash = "sha256:52f0907287d9104112dbebda46af4db0793fcc4c64c8a867099212d116b6db64"}, - {file = "wrapt-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:7966f98fa36933333d8a1c3d8552aa3d0735001901a4aabcfbd5a502b4ef14fe"}, - {file = "wrapt-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:27a49f217839bf559d436308bae8fc4a9dd0ac98ffdb9d6aeb3f00385b0fb72c"}, - {file = "wrapt-1.17.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:50a4e3b45e62b1ccb96b3fc0e427f1b458ff2e0def34ae084de88418157a09d1"}, - {file = "wrapt-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c0c08434fe2af6e40c5c75c036d7e3c7e7f499079fc479e740d9586b09fb0d"}, - {file = "wrapt-1.17.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15f96fe5e2efdc613983327240ae89cf6368c07eeb0f194d240e9549aa1ea739"}, - {file = "wrapt-1.17.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14f78f8c313884f889c6696af62aa881af302a989a7c0df398d2b541fa53e8a9"}, - {file = "wrapt-1.17.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d87334b521ab0e2564902c0b10039dee8670485e9d397fe97c34b88801f474f7"}, - {file = "wrapt-1.17.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97eaff096fcb467e0f486f3bf354c1072245c2045859d71ba71158717ec97dcc"}, - {file = "wrapt-1.17.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13887d1415dc0e213a9adeb9026ae1f427023f77110d988fbd478643490aa40c"}, - {file = "wrapt-1.17.1-cp38-cp38-win32.whl", hash = "sha256:823a262d967cbdf835787039b873ff551e36c14658bdc2e43267968b67f61f88"}, - {file = "wrapt-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:889587664d245dae75c752b643061f922e8a590d43a4cd088eca415ca83f2d13"}, - {file = "wrapt-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:997e8f9b984e4263993d3baf3329367e7c7673b63789bc761718a6f9ed68653d"}, - {file = "wrapt-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bac64f57a5a7926ebc9ab519fb9eba1fc6dcd1f65d7f45937b2ce38da65c2270"}, - {file = "wrapt-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7aa07603d67007c15b33d20095cc9276f3e127bfb1b8106b3e84ec6907d137e"}, - {file = "wrapt-1.17.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c53ef8936c4d587cb96bb1cf0d076e822fa38266c2b646837ef60465da8db22e"}, - {file = "wrapt-1.17.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72053cc4706dac537d5a772135dc3e1de5aff52883f49994c1757c1b2dc9db2"}, - {file = "wrapt-1.17.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0ee037e4cc9d039efe712b13c483f4efa2c3499642369e01570b3bb1842eea3f"}, - {file = "wrapt-1.17.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20888d886186d19eab53816db2e615950b1ce7dbd5c239107daf2c8a6a4a03c6"}, - {file = "wrapt-1.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1c119802ae432b8c5d55dd5253825d09c1dca1c97ffc7b32c53ecdb348712f64"}, - {file = "wrapt-1.17.1-cp39-cp39-win32.whl", hash = "sha256:3260178f3bc006acae93378bfd6dbf33c9249de93cc1b78d8cc7b7416f4ea99a"}, - {file = "wrapt-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:18fb16fb6bb75f4ec6272829007f3129a9a5264d0230372f9651e5f75cfec552"}, - {file = "wrapt-1.17.1-py3-none-any.whl", hash = "sha256:f3117feb1fc479eaf84b549d3f229d5d2abdb823f003bc2a1c6dd70072912fa0"}, - {file = "wrapt-1.17.1.tar.gz", hash = "sha256:16b2fdfa09a74a3930175b6d9d7d008022aa72a4f02de2b3eecafcc1adfd3cfe"}, -] +groups = ["main", "dev"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] +markers = {main = "extra == \"tracer\" or extra == \"all\" or extra == \"datadog\" or extra == \"datamasking\""} [[package]] name = "xenon" @@ -4366,6 +4601,7 @@ version = "0.9.3" description = "Monitor code metrics for Python on your CI server" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "xenon-0.9.3-py2.py3-none-any.whl", hash = "sha256:6e2c2c251cc5e9d01fe984e623499b13b2140fcbf74d6c03a613fa43a9347097"}, {file = "xenon-0.9.3.tar.gz", hash = "sha256:4a7538d8ba08aa5d79055fb3e0b2393c0bd6d7d16a4ab0fcdef02ef1f10a43fa"}, @@ -4382,6 +4618,8 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -4393,10 +4631,12 @@ version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] +markers = {main = "extra == \"datadog\""} [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] @@ -4417,6 +4657,6 @@ tracer = ["aws-xray-sdk"] validation = ["fastjsonschema"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = ">=3.8,<4.0.0" -content-hash = "198f3cd5201ae1516918619dd67ed5d34da80ffd20b2954bfa97a53363cfa830" +content-hash = "d6a3ba5548c6aefbc5eb0e3858b651f36881144d0d2e533d507990e82263ff00" diff --git a/pyproject.toml b/pyproject.toml index 001eeaefa41..a631644ec8d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,7 +56,26 @@ datadog-lambda = { version = ">=4.77,<7.0", optional = true } aws-encryption-sdk = { version = ">=3.1.1,<5.0.0", optional = true } jsonpath-ng = { version = "^1.6.0", optional = true } -[tool.poetry.dev-dependencies] + +[tool.poetry.extras] +parser = ["pydantic"] +validation = ["fastjsonschema"] +tracer = ["aws-xray-sdk"] +redis = ["redis"] +all = [ + "pydantic", + "pydantic-settings", + "aws-xray-sdk", + "fastjsonschema", + "aws-encryption-sdk", + "jsonpath-ng" +] +# allow customers to run code locally without emulators (SAM CLI, etc.) +aws-sdk = ["boto3"] +datadog = ["datadog-lambda"] +datamasking = ["aws-encryption-sdk", "jsonpath-ng"] + +[tool.poetry.group.dev.dependencies] coverage = { extras = ["toml"], version = "^7.6" } pytest = "^8.3.4" black = "^24.8" @@ -91,26 +110,6 @@ hvac = "^2.3.0" aws-requests-auth = "^0.4.3" urllib3 = "<2" requests = ">=2.32.0" - -[tool.poetry.extras] -parser = ["pydantic"] -validation = ["fastjsonschema"] -tracer = ["aws-xray-sdk"] -redis = ["redis"] -all = [ - "pydantic", - "pydantic-settings", - "aws-xray-sdk", - "fastjsonschema", - "aws-encryption-sdk", - "jsonpath-ng" -] -# allow customers to run code locally without emulators (SAM CLI, etc.) -aws-sdk = ["boto3"] -datadog = ["datadog-lambda"] -datamasking = ["aws-encryption-sdk", "jsonpath-ng"] - -[tool.poetry.group.dev.dependencies] cfn-lint = "1.22.5" mypy = "^1.1.1" types-python-dateutil = "^2.8.19.6" From 54f9738e44c4bbe29bf410351e266a04f1ea061a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Jan 2025 22:28:19 +0000 Subject: [PATCH 23/52] chore(deps-dev): bump cfn-lint from 1.22.5 to 1.22.6 (#5900) Bumps [cfn-lint](https://github.com/aws-cloudformation/cfn-lint) from 1.22.5 to 1.22.6. - [Release notes](https://github.com/aws-cloudformation/cfn-lint/releases) - [Changelog](https://github.com/aws-cloudformation/cfn-lint/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws-cloudformation/cfn-lint/compare/v1.22.5...v1.22.6) --- updated-dependencies: - dependency-name: cfn-lint dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 232 +++---------------------------------------------- pyproject.toml | 2 +- 2 files changed, 11 insertions(+), 223 deletions(-) diff --git a/poetry.lock b/poetry.lock index be979c1005d..902a64f0b23 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "annotated-types" @@ -6,12 +6,10 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] -markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} @@ -22,7 +20,6 @@ version = "4.5.2" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f"}, {file = "anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b"}, @@ -45,7 +42,6 @@ version = "3.5.3" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "argcomplete-3.5.3-py3-none-any.whl", hash = "sha256:2ab2c4a215c59fd6caaff41a869480a23e8f6a5f910b266c1808037f4e375b61"}, {file = "argcomplete-3.5.3.tar.gz", hash = "sha256:c12bf50eded8aebb298c7b7da7a5ff3ee24dffd9f5281867dfe1424b58c55392"}, @@ -60,12 +56,10 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] -markers = {main = "extra == \"redis\" and python_full_version < \"3.11.3\"", dev = "python_full_version < \"3.11.3\""} [[package]] name = "attrs" @@ -73,12 +67,10 @@ version = "24.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] -markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] @@ -94,7 +86,6 @@ version = "2.2.220" description = "A library that contains the AWS CLI for use in Lambda Layers" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.asset_awscli_v1-2.2.220-py3-none-any.whl", hash = "sha256:aef8284470bee3e1e0b5d706961c952dba88d50981ba6a21fa8b5cb3e9c4d5b6"}, {file = "aws_cdk_asset_awscli_v1-2.2.220.tar.gz", hash = "sha256:8e5e1290dc77b15cffe51134be0bf2b613ae8f3f9859fd4137359bbda431b0d3"}, @@ -111,7 +102,6 @@ version = "2.1.3" description = "A Lambda Layer that contains kubectl v1.20" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.asset_kubectl_v20-2.1.3-py3-none-any.whl", hash = "sha256:d5612e5bd03c215a28ce53193b1144ecf4e93b3b6779563c046a8a74d83a3979"}, {file = "aws_cdk_asset_kubectl_v20-2.1.3.tar.gz", hash = "sha256:237cd8530d9e8be0bbc7159af927dbb6b7f91bf3f4099c8ef4d9a213b34264be"}, @@ -128,7 +118,6 @@ version = "2.1.0" description = "@aws-cdk/asset-node-proxy-agent-v6" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.asset_node_proxy_agent_v6-2.1.0-py3-none-any.whl", hash = "sha256:24a388b69a44d03bae6dbf864c4e25ba650d4b61c008b4568b94ffbb9a69e40e"}, {file = "aws_cdk_asset_node_proxy_agent_v6-2.1.0.tar.gz", hash = "sha256:1f292c0631f86708ba4ee328b3a2b229f7e46ea1c79fbde567ee9eb119c2b0e2"}, @@ -145,7 +134,6 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-alpha-2.114.1a0.tar.gz", hash = "sha256:9e8c3131f4fa3e0926eb3d76aeacd578a6aa51f95b39c10a86112c991bb75864"}, {file = "aws_cdk.aws_apigatewayv2_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:a101ce56d846976ad1c8020054dfe73fd9f45afdbe71f2a297acc84c1a201403"}, @@ -164,7 +152,6 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-authorizers" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-authorizers-alpha-2.114.1a0.tar.gz", hash = "sha256:ee290e2ed0f1506dbbb12b3b8963f50b379121759077002c265977fbaf18fd9f"}, {file = "aws_cdk.aws_apigatewayv2_authorizers_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:2576e1ce06dab314020bff50f5d59b8715a7adf18106eac811028c22f61c9baa"}, @@ -184,7 +171,6 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-integrations" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-integrations-alpha-2.114.1a0.tar.gz", hash = "sha256:19e1824b577683e7d3c2b01fd58c176ebe4c7b8d1b4af4cfdc3893d3ffbac9af"}, {file = "aws_cdk.aws_apigatewayv2_integrations_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:1e440a70e6b4cbe077c95ffdd3fd0cfb3962f90762ea2e973eaa2ab7719ccb2c"}, @@ -204,7 +190,6 @@ version = "2.59.0a0" description = "The CDK Construct Library for AWS::AppSync" optional = false python-versions = "~=3.7" -groups = ["dev"] files = [ {file = "aws-cdk.aws-appsync-alpha-2.59.0a0.tar.gz", hash = "sha256:f5c7773b70b759efd576561dc3d71af5762a6f7cbc9ee9eef5e538c7ab3dccc7"}, {file = "aws_cdk.aws_appsync_alpha-2.59.0a0-py3-none-any.whl", hash = "sha256:ecc235f1f70d404c8d03cf250be0227becd14c468f8c43b6d9df334a1d60c8e2"}, @@ -223,7 +208,6 @@ version = "2.176.0a0" description = "The CDK Construct Library for AWS Lambda in Python" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.aws_lambda_python_alpha-2.176.0a0-py3-none-any.whl", hash = "sha256:d7a9223393b815e9b2d2e69f06c216b8e12e577f8ab58aeb56cb05c92de7f7bb"}, {file = "aws_cdk_aws_lambda_python_alpha-2.176.0a0.tar.gz", hash = "sha256:0a2737e098e88a553a284f688c7621067cebf32ba21ad3e8e7911bb70ce67049"}, @@ -242,7 +226,6 @@ version = "39.2.2" description = "Cloud Assembly Schema" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.cloud_assembly_schema-39.2.2-py3-none-any.whl", hash = "sha256:c2f10edd7765a4ff0e28508c5e63798c3f89699242a4755d1984472acf6acaf2"}, {file = "aws_cdk_cloud_assembly_schema-39.2.2.tar.gz", hash = "sha256:ae2140bc3ffbc306d8e931d5a70bc5c573b1e047838d29d8e7d13dfa97ea4ea8"}, @@ -259,7 +242,6 @@ version = "2.176.0" description = "Version 2 of the AWS Cloud Development Kit library" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk_lib-2.176.0-py3-none-any.whl", hash = "sha256:c362a92f06b6ea60a7eff7994d3994c462358e7a95ce3de01a28efab4f6d56b6"}, {file = "aws_cdk_lib-2.176.0.tar.gz", hash = "sha256:87a39d2f42fd2ea8ba2bfa364355303953fb5cc2886479ca5acf09a14a9fd679"}, @@ -281,8 +263,6 @@ version = "4.0.0" description = "AWS Encryption SDK implementation for Python" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "aws-encryption-sdk-4.0.0.tar.gz", hash = "sha256:57df8b5c1b9f18db4373c6e8e65563791063a71be93d0849950ed365272db354"}, {file = "aws_encryption_sdk-4.0.0-py2.py3-none-any.whl", hash = "sha256:a94483785dff2cd166ccb8f3a15cdfe5cba7a3717f6604543c816a3a32f7c412"}, @@ -303,7 +283,6 @@ version = "0.4.3" description = "AWS signature version 4 signing process for the python requests module" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "aws-requests-auth-0.4.3.tar.gz", hash = "sha256:33593372018b960a31dbbe236f89421678b885c35f0b6a7abfae35bb77e069b2"}, {file = "aws_requests_auth-0.4.3-py2.py3-none-any.whl", hash = "sha256:646bc37d62140ea1c709d20148f5d43197e6bd2d63909eb36fa4bb2345759977"}, @@ -318,7 +297,6 @@ version = "1.94.0" description = "AWS SAM Translator is a library that transform SAM templates into AWS CloudFormation templates" optional = false python-versions = "!=4.0,<=4.0,>=3.8" -groups = ["dev"] files = [ {file = "aws_sam_translator-1.94.0-py3-none-any.whl", hash = "sha256:100e33eeffcfa81f7c45cadeb0ee29596ce829f6b4d2745140f04fa19a41f539"}, {file = "aws_sam_translator-1.94.0.tar.gz", hash = "sha256:8ec258d9f7ece72ef91c81f4edb45a2db064c16844b6afac90c575893beaa391"}, @@ -339,8 +317,6 @@ version = "2.14.0" description = "The AWS X-Ray SDK for Python (the SDK) enables Python developers to record and emit information from within their applications to the AWS X-Ray service." optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"tracer\" or extra == \"all\"" files = [ {file = "aws_xray_sdk-2.14.0-py2.py3-none-any.whl", hash = "sha256:cfbe6feea3d26613a2a869d14c9246a844285c97087ad8f296f901633554ad94"}, {file = "aws_xray_sdk-2.14.0.tar.gz", hash = "sha256:aab843c331af9ab9ba5cefb3a303832a19db186140894a523edafc024cc0493c"}, @@ -356,7 +332,6 @@ version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, @@ -374,7 +349,6 @@ version = "1.7.10" description = "Security oriented static analyser for python code." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "bandit-1.7.10-py3-none-any.whl", hash = "sha256:665721d7bebbb4485a339c55161ac0eedde27d51e638000d91c8c2d68343ad02"}, {file = "bandit-1.7.10.tar.gz", hash = "sha256:59ed5caf5d92b6ada4bf65bc6437feea4a9da1093384445fed4d472acc6cff7b"}, @@ -399,7 +373,6 @@ version = "24.8.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, @@ -446,7 +419,6 @@ version = "1.36.4" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "boto3-1.36.4-py3-none-any.whl", hash = "sha256:9f8f699e75ec63fcc98c4dd7290997c7c06c68d3ac8161ad4735fe71f5fe945c"}, {file = "boto3-1.36.4.tar.gz", hash = "sha256:eeceeb74ef8b65634d358c27aa074917f4449dc828f79301f1075232618eb502"}, @@ -466,7 +438,6 @@ version = "1.36.4" description = "Type annotations for boto3 1.36.4 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "boto3_stubs-1.36.4-py3-none-any.whl", hash = "sha256:3d4e9a8a4d7163bcdb6514b92e901706ce4f522dc8aeab8b4e157fa9e0138e49"}, {file = "boto3_stubs-1.36.4.tar.gz", hash = "sha256:36db2481d1a0291a2c05c30756fd83514c8d461f8dbc2915cb0c7cf06dc9ed70"}, @@ -903,7 +874,6 @@ version = "1.36.4" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "botocore-1.36.4-py3-none-any.whl", hash = "sha256:3f183aa7bb0c1ba02171143a05f28a4438abdf89dd6b8c0a7727040375a90520"}, {file = "botocore-1.36.4.tar.gz", hash = "sha256:ef54f5e3316040b6ff775941e6ed052c3230dda0079d17d9f9e3c757375f2027"}, @@ -913,8 +883,8 @@ files = [ jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ - {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, + {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, ] [package.extras] @@ -926,7 +896,6 @@ version = "1.36.4" description = "Type annotations and code completion for botocore" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "botocore_stubs-1.36.4-py3-none-any.whl", hash = "sha256:bbbd1b061b68bdc6d474ad9dfbf7f56386f416b297862347ae735f2272a78e4b"}, {file = "botocore_stubs-1.36.4.tar.gz", hash = "sha256:cc1677029f32d98c9e080885e2098424fd6afd41d6d3380f96d42c29e73e30b5"}, @@ -944,8 +913,6 @@ version = "0.16.1" description = "Python module to generate and modify bytecode" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "bytecode-0.16.1-py3-none-any.whl", hash = "sha256:1d4b61ed6bade4bff44127c8283bef8131a664ce4dbe09d64a88caf329939f35"}, {file = "bytecode-0.16.1.tar.gz", hash = "sha256:8fbbb637c880f339e564858bc6c7984ede67ae97bc71343379a535a9a4baf398"}, @@ -960,7 +927,6 @@ version = "24.1.2" description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, @@ -987,7 +953,6 @@ version = "2.34.23" description = "Check CDK v2 applications for best practices using a combination on available rule packs." optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "cdk_nag-2.34.23-py3-none-any.whl", hash = "sha256:e5f0ebb366d3fc6fa9124da94fb890a682eb5db69db70bbed6f44ebf0886427a"}, {file = "cdk_nag-2.34.23.tar.gz", hash = "sha256:ef7b1414e7ff6d14723d239beaea46ef4ddab32a28d802e7daa18d9677df80a1"}, @@ -1006,7 +971,6 @@ version = "0.1.289" description = "AWS Generative AI CDK Constructs is a library for well-architected generative AI patterns." optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "cdklabs.generative_ai_cdk_constructs-0.1.289-py3-none-any.whl", hash = "sha256:66d7be4f3c2700436720786cee4809a3774328305f5aa2939e2c01fd6ab83acb"}, {file = "cdklabs_generative_ai_cdk_constructs-0.1.289.tar.gz", hash = "sha256:82addba364c18fbc5acc7e12a0372f37c4855b7b53517d2fe8bd4b3fc8e945d8"}, @@ -1026,7 +990,6 @@ version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, @@ -1038,7 +1001,6 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -1108,21 +1070,19 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] -markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = "*" [[package]] name = "cfn-lint" -version = "1.22.5" +version = "1.22.6" description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ - {file = "cfn_lint-1.22.5-py3-none-any.whl", hash = "sha256:18309e59cc03ff18b02676688df7eb1a17f5276da3776f31946fc0d9aa9b8fe7"}, - {file = "cfn_lint-1.22.5.tar.gz", hash = "sha256:8b4f55e283143e99d8d331627637226c291cecfb936606f7aab2d940e71e566d"}, + {file = "cfn_lint-1.22.6-py3-none-any.whl", hash = "sha256:70e8cc71ed12608964bdc1749c48140164d1fd65c30f3a5eaff4f9ee3396d908"}, + {file = "cfn_lint-1.22.6.tar.gz", hash = "sha256:0652daf9e86d823f6513d430d233682b940806b6aad74cba2e4dc07de9603d84"}, ] [package.dependencies] @@ -1146,7 +1106,6 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -1248,7 +1207,6 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -1263,7 +1221,6 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -1275,7 +1232,6 @@ version = "6.9.0" description = "Add colours to the output of Python's logging module." optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff"}, {file = "colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2"}, @@ -1293,7 +1249,6 @@ version = "10.4.2" description = "A programming model for software-defined state" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "constructs-10.4.2-py3-none-any.whl", hash = "sha256:1f0f59b004edebfde0f826340698b8c34611f57848139b7954904c61645f13c1"}, {file = "constructs-10.4.2.tar.gz", hash = "sha256:ce54724360fffe10bab27d8a081844eb81f5ace7d7c62c84b719c49f164d5307"}, @@ -1310,7 +1265,6 @@ version = "7.6.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, @@ -1398,7 +1352,6 @@ version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -1428,7 +1381,6 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] -markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1449,8 +1401,6 @@ version = "0.50.2" description = "The Datadog Python library" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "datadog-0.50.2-py2.py3-none-any.whl", hash = "sha256:f3297858564b624efbd9ce43e4ea1c2c21e1f0477ab6d446060b536a1d9e431e"}, {file = "datadog-0.50.2.tar.gz", hash = "sha256:17725774bf2bb0a48f1d096d92707492c187f24ae08960af0b0c2fa97958fd51"}, @@ -1465,8 +1415,6 @@ version = "6.104.0" description = "The Datadog AWS Lambda Library" optional = true python-versions = "<4,>=3.8.0" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "datadog_lambda-6.104.0-py3-none-any.whl", hash = "sha256:72092f9057764515ef1e2fdf1cf25f82bfa70296411af9121db896e4a35fdf6e"}, {file = "datadog_lambda-6.104.0.tar.gz", hash = "sha256:eeb2ff0e4387812e7caf17e501d93fea3d85e3f9bb79581fb37556580d5a1c46"}, @@ -1487,8 +1435,6 @@ version = "2.19.1" description = "Datadog APM client library" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "ddtrace-2.19.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:c6bc63fcc10c3128c91d245c5e677fd204ff10e67c3c75d26f28d34b6436bd15"}, {file = "ddtrace-2.19.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:a8a5f66e2cfce6868a625efb9e1954bc08b484e9edb67fc2d051c6a05c991bf7"}, @@ -1562,10 +1508,10 @@ files = [ [package.dependencies] bytecode = [ - {version = ">=0.13.0", markers = "python_version < \"3.11.0\""}, {version = ">=0.16.0", markers = "python_version >= \"3.13.0\""}, {version = ">=0.15.0", markers = "python_version ~= \"3.12.0\""}, {version = ">=0.14.0", markers = "python_version ~= \"3.11.0\""}, + {version = ">=0.13.0", markers = "python_version < \"3.11.0\""}, ] envier = ">=0.5,<1.0" legacy-cgi = {version = ">=2.0.0", markers = "python_version >= \"3.13.0\""} @@ -1585,7 +1531,6 @@ version = "5.1.1" description = "Decorators for Humans" optional = false python-versions = ">=3.5" -groups = ["dev"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -1597,8 +1542,6 @@ version = "1.2.15" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320"}, {file = "deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"}, @@ -1616,7 +1559,6 @@ version = "2.1.0" description = "A library to handle automated deprecations" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, @@ -1631,7 +1573,6 @@ version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -1647,7 +1588,6 @@ version = "0.5.0" description = "Python module and CLI for hashing of file system directories." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "dirhash-0.5.0-py3-none-any.whl", hash = "sha256:523dfd6b058c64f45b31604376926c6e2bd2ea301d0df23095d4055674e38b09"}, {file = "dirhash-0.5.0.tar.gz", hash = "sha256:e60760f0ab2e935d8cb088923ea2c6492398dca42cec785df778985fd4cd5386"}, @@ -1662,7 +1602,6 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -1674,7 +1613,6 @@ version = "7.1.0" description = "A Python library for the Docker Engine API." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"}, {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"}, @@ -1697,8 +1635,6 @@ version = "0.6.1" description = "Python application configuration via the environment" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "envier-0.6.1-py3-none-any.whl", hash = "sha256:73609040a76be48bbcb97074d9969666484aa0de706183a6e9ef773156a8a6a9"}, {file = "envier-0.6.1.tar.gz", hash = "sha256:3309a01bb3d8850c9e7a31a5166d5a836846db2faecb79b9cb32654dd50ca9f9"}, @@ -1713,8 +1649,6 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1729,7 +1663,6 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1744,8 +1677,6 @@ version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"validation\" or extra == \"all\"" files = [ {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, @@ -1760,7 +1691,6 @@ version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, @@ -1777,7 +1707,6 @@ version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, @@ -1795,7 +1724,6 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1810,7 +1738,6 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1829,7 +1756,6 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -1841,7 +1767,6 @@ version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, @@ -1863,7 +1788,6 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1888,7 +1812,6 @@ version = "2.3.0" description = "HashiCorp Vault API client" optional = false python-versions = "<4.0,>=3.8" -groups = ["dev"] files = [ {file = "hvac-2.3.0-py3-none-any.whl", hash = "sha256:a3afc5710760b6ee9b3571769df87a0333da45da05a5f9f963e1d3925a84be7d"}, {file = "hvac-2.3.0.tar.gz", hash = "sha256:1b85e3320e8642dd82f234db63253cda169a817589e823713dc5fca83119b1e2"}, @@ -1906,7 +1829,6 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1921,7 +1843,6 @@ version = "3.3.0" description = "Iterative JSON parser with standard Python iterator interfaces" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7f7a5250599c366369fbf3bc4e176f5daa28eb6bc7d6130d02462ed335361675"}, {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f87a7e52f79059f9c58f6886c262061065eb6f7554a587be7ed3aa63e6b71b34"}, @@ -2025,12 +1946,10 @@ version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] -markers = {main = "extra == \"datadog\""} [package.dependencies] zipp = ">=3.20" @@ -2050,7 +1969,6 @@ version = "6.4.5" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, @@ -2073,7 +1991,6 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -2085,7 +2002,6 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" -groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -2100,7 +2016,6 @@ version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -2118,7 +2033,6 @@ version = "1.0.1" description = "JSON Matching Expressions" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, @@ -2130,7 +2044,6 @@ version = "1.106.0" description = "Python client for jsii runtime" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "jsii-1.106.0-py3-none-any.whl", hash = "sha256:5a44d7c3a5a326fa3d9befdb3770b380057e0a61e3804e7c4907f70d76afaaa2"}, {file = "jsii-1.106.0.tar.gz", hash = "sha256:c79c47899f53a7c3c4b20f80d3cd306628fe9ed1852eee970324c71eba1d974e"}, @@ -2151,7 +2064,6 @@ version = "1.33" description = "Apply JSON-Patches (RFC 6902)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -groups = ["dev"] files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, @@ -2166,10 +2078,10 @@ version = "1.7.0" description = "A final implementation of JSONPath for Python that aims to be standard compliant, including arithmetic and binary comparison operators and providing clear AST for metaprogramming." optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, + {file = "jsonpath_ng-1.7.0-py2-none-any.whl", hash = "sha256:898c93fc173f0c336784a3fa63d7434297544b7198124a68f9a3ef9597b0ae6e"}, + {file = "jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6"}, ] [package.dependencies] @@ -2181,7 +2093,6 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -2193,7 +2104,6 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -2217,7 +2127,6 @@ version = "2023.12.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, @@ -2233,8 +2142,6 @@ version = "2.6.2" description = "Fork of the standard library cgi and cgitb modules, being deprecated in PEP-594" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"datadog\" and python_version >= \"3.13.0\"" files = [ {file = "legacy_cgi-2.6.2-py3-none-any.whl", hash = "sha256:a7b83afb1baf6ebeb56522537c5943ef9813cf933f6715e88a803f7edbce0bff"}, {file = "legacy_cgi-2.6.2.tar.gz", hash = "sha256:9952471ceb304043b104c22d00b4f333cac27a6abe446d8a528fc437cf13c85f"}, @@ -2246,7 +2153,6 @@ version = "1.3.8" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "Mako-1.3.8-py3-none-any.whl", hash = "sha256:42f48953c7eb91332040ff567eb7eea69b22e7a4affbc5ba8e845e8f730f6627"}, {file = "mako-1.3.8.tar.gz", hash = "sha256:577b97e414580d3e088d47c2dbbe9594aa7a5146ed2875d4dfa9075af2dd3cc8"}, @@ -2266,7 +2172,6 @@ version = "0.7.1" description = "Create Python CLI apps with little to no effort at all!" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "mando-0.7.1-py2.py3-none-any.whl", hash = "sha256:26ef1d70928b6057ee3ca12583d73c63e05c49de8972d620c278a7b206581a8a"}, {file = "mando-0.7.1.tar.gz", hash = "sha256:18baa999b4b613faefb00eac4efadcf14f510b59b924b66e08289aa1de8c3500"}, @@ -2284,7 +2189,6 @@ version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, @@ -2303,7 +2207,6 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -2328,7 +2231,6 @@ version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, @@ -2398,7 +2300,6 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -2410,7 +2311,6 @@ version = "1.3.4" description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -2422,7 +2322,6 @@ version = "2.1.3" description = "Manage multiple versions of your MkDocs-powered documentation" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "mike-2.1.3-py3-none-any.whl", hash = "sha256:d90c64077e84f06272437b464735130d380703a76a5738b152932884c60c062a"}, {file = "mike-2.1.3.tar.gz", hash = "sha256:abd79b8ea483fb0275b7972825d3082e5ae67a41820f8d8a0dc7a3f49944e810"}, @@ -2448,7 +2347,6 @@ version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, @@ -2480,7 +2378,6 @@ version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, @@ -2498,7 +2395,6 @@ version = "0.3.2" description = "MkDocs plugin for setting revision date from git per markdown file." optional = false python-versions = ">=3.4" -groups = ["dev"] files = [ {file = "mkdocs_git_revision_date_plugin-0.3.2-py3-none-any.whl", hash = "sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef"}, ] @@ -2514,7 +2410,6 @@ version = "9.5.50" description = "Documentation that simply works" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385"}, {file = "mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825"}, @@ -2544,7 +2439,6 @@ version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, @@ -2556,7 +2450,6 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2574,7 +2467,6 @@ version = "0.70.17" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ddb24e5bcdb64e90ec5543a1f05a39463068b6d3b804aa3f2a4e16ec28562d6"}, {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d729f55198a3579f6879766a6d9b72b42d4b320c0dcb7844afb774d75b573c62"}, @@ -2603,7 +2495,6 @@ version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, @@ -2663,7 +2554,6 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfig 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_appconfig-1.36.0-py3-none-any.whl", hash = "sha256:d627de43761a83991a0ab8cd10698d415f94dcc78a567433c7465fc8d1f5cc16"}, {file = "mypy_boto3_appconfig-1.36.0.tar.gz", hash = "sha256:3f38cbd2d7d359da88dc996eeeafa4c1174847909e31a327dd77263dfdfd5424"}, @@ -2678,7 +2568,6 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfigData 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_appconfigdata-1.36.0-py3-none-any.whl", hash = "sha256:68f02ce06ed9597b02154aff64655fc38c42919eda08fddb130ba17e9f70e9cb"}, {file = "mypy_boto3_appconfigdata-1.36.0.tar.gz", hash = "sha256:3436d149833ea69b4260a0f352aac19258d4676c7a21087625906f7da98624c7"}, @@ -2693,7 +2582,6 @@ version = "1.36.0" description = "Type annotations for boto3 CloudFormation 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_cloudformation-1.36.0-py3-none-any.whl", hash = "sha256:3f6cd81739aaf9634c4aa2b92579081038a76e4f2dec306d02eaaf558b332ce9"}, {file = "mypy_boto3_cloudformation-1.36.0.tar.gz", hash = "sha256:acc2c7ae8920f1167be097f6151685fe5aee99be2f890075edf93e05d298e8b0"}, @@ -2708,7 +2596,6 @@ version = "1.36.0" description = "Type annotations for boto3 CloudWatch 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_cloudwatch-1.36.0-py3-none-any.whl", hash = "sha256:2f6cb81c05a1b4be3510e0857b22913a241488bc08f55b0ad96e8b775c144891"}, {file = "mypy_boto3_cloudwatch-1.36.0.tar.gz", hash = "sha256:a370d61522121ab457c443c338a652d0d3e1c22102d9db9f197fd5dcb7e656a4"}, @@ -2723,7 +2610,6 @@ version = "1.36.0" description = "Type annotations for boto3 DynamoDB 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_dynamodb-1.36.0-py3-none-any.whl", hash = "sha256:b782a817ce8956f8d53ac94c85f969dfe51451fc99f16a3b62776f1e0ed3f1ba"}, {file = "mypy_boto3_dynamodb-1.36.0.tar.gz", hash = "sha256:1687e4689236a5391755126e86ec2596d408eb95408c31ac09a3d1eb289d516d"}, @@ -2738,7 +2624,6 @@ version = "1.36.0" description = "Type annotations for boto3 Lambda 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_lambda-1.36.0-py3-none-any.whl", hash = "sha256:8a6693be1352b51e232cee73f73ce36014d19b4777bdf6969c5e707aba424ca1"}, {file = "mypy_boto3_lambda-1.36.0.tar.gz", hash = "sha256:5e9f23702060529aad216a3ce2a2368391a112df07909fbd3aa80d573d84893c"}, @@ -2753,7 +2638,6 @@ version = "1.36.3" description = "Type annotations for boto3 CloudWatchLogs 1.36.3 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_logs-1.36.3-py3-none-any.whl", hash = "sha256:553cb31261eb4484394af9ac965fa33b0d414e927c47768021a0a6ec89625f64"}, {file = "mypy_boto3_logs-1.36.3.tar.gz", hash = "sha256:76d233632a36665094ac888a685fade150c10665ab4cad1b17265037fcadd098"}, @@ -2768,7 +2652,6 @@ version = "1.36.0" description = "Type annotations for boto3 S3 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_s3-1.36.0-py3-none-any.whl", hash = "sha256:a65ccb6be7b7ebf907887268d44975e435b1fc1164fc0a25de310e2b832f7e91"}, {file = "mypy_boto3_s3-1.36.0.tar.gz", hash = "sha256:80a881847b0e1fbc5edcad8b2870c110e31e7ef128db42402b70c159b7e93d5a"}, @@ -2783,7 +2666,6 @@ version = "1.36.0" description = "Type annotations for boto3 SecretsManager 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_secretsmanager-1.36.0-py3-none-any.whl", hash = "sha256:d7fd56b08afed32ce26f2663ec57f9ea074e1e5149a4388eccb46653e3cb5a66"}, {file = "mypy_boto3_secretsmanager-1.36.0.tar.gz", hash = "sha256:6e1f91cd5b0c1f0533f8cfa91e4755855d39931475e7d1e23ee8dbb2e7163d18"}, @@ -2798,7 +2680,6 @@ version = "1.36.0" description = "Type annotations for boto3 SSM 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_ssm-1.36.0-py3-none-any.whl", hash = "sha256:c79a6a949f0b57e68bd48d3d15eb56b975633ffdfaa449d119831c205228cab6"}, {file = "mypy_boto3_ssm-1.36.0.tar.gz", hash = "sha256:bbb9a9ce0e318cad2a53f8200102b4fdc547c7f33912146df82698c9ae40181f"}, @@ -2813,7 +2694,6 @@ version = "1.36.0" description = "Type annotations for boto3 XRay 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_xray-1.36.0-py3-none-any.whl", hash = "sha256:b92a06db10f623db4ec0641227f468b7a57c77f8e599846cfddace4b434f70a5"}, {file = "mypy_boto3_xray-1.36.0.tar.gz", hash = "sha256:5ae2b4c333bf2881870ffb96f1d99cd5e7ee1706d071b6923dcd6de6ceb3ac0c"}, @@ -2828,7 +2708,6 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" -groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -2840,7 +2719,6 @@ version = "3.1" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, @@ -2859,7 +2737,6 @@ version = "2024.10.9" description = "Flexible test automation." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "nox-2024.10.9-py3-none-any.whl", hash = "sha256:1d36f309a0a2a853e9bccb76bbef6bb118ba92fa92674d15604ca99adeb29eab"}, {file = "nox-2024.10.9.tar.gz", hash = "sha256:7aa9dc8d1c27e9f45ab046ffd1c3b2c4f7c91755304769df231308849ebded95"}, @@ -2882,8 +2759,6 @@ version = "1.29.0" description = "OpenTelemetry Python API" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "opentelemetry_api-1.29.0-py3-none-any.whl", hash = "sha256:5fcd94c4141cc49c736271f3e1efb777bebe9cc535759c54c936cca4f1b312b8"}, {file = "opentelemetry_api-1.29.0.tar.gz", hash = "sha256:d04a6cf78aad09614f52964ecb38021e248f5714dc32c2e0d8fd99517b4d69cf"}, @@ -2899,7 +2774,6 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -2911,7 +2785,6 @@ version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, @@ -2927,7 +2800,6 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -2939,7 +2811,6 @@ version = "6.1.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" -groups = ["dev"] files = [ {file = "pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"}, {file = "pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24"}, @@ -2951,7 +2822,6 @@ version = "0.11.0" description = "Auto-generate API documentation for Python projects." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "pdoc3-0.11.0.tar.gz", hash = "sha256:12f28c6ee045ca8ad6a624b86d1982c51de20e83c0a721cd7b0933f44ae0a655"}, ] @@ -2966,8 +2836,6 @@ version = "1.3.10" description = "Resolve a name to an object." optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "python_version < \"3.9\"" files = [ {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, @@ -2979,7 +2847,6 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -2996,7 +2863,6 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -3012,8 +2878,6 @@ version = "3.11" description = "Python Lex & Yacc" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, @@ -3025,8 +2889,6 @@ version = "5.29.3" description = "" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, @@ -3047,7 +2909,6 @@ version = "0.0.3" description = "Publication helps you maintain public-api-friendly modules by preventing unintentional access to private implementation details via introspection." optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "publication-0.0.3-py2.py3-none-any.whl", hash = "sha256:0248885351febc11d8a1098d5c8e3ab2dabcf3e8c0c96db1e17ecd12b53afbe6"}, {file = "publication-0.0.3.tar.gz", hash = "sha256:68416a0de76dddcdd2930d1c8ef853a743cc96c82416c4e4d3b5d901c6276dc4"}, @@ -3059,7 +2920,6 @@ version = "9.0.0" description = "Get CPU info with pure Python" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, @@ -3071,12 +2931,10 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] -markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" @@ -3084,12 +2942,10 @@ version = "2.10.5" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"}, {file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"}, ] -markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] annotated-types = ">=0.6.0" @@ -3106,7 +2962,6 @@ version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -3209,7 +3064,6 @@ files = [ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] -markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" @@ -3220,8 +3074,6 @@ version = "2.7.1" description = "Settings management using Pydantic" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"all\"" files = [ {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"}, {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"}, @@ -3242,7 +3094,6 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -3257,7 +3108,6 @@ version = "10.14.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pymdown_extensions-10.14.1-py3-none-any.whl", hash = "sha256:637951cbfbe9874ba28134fb3ce4b8bcadd6aca89ac4998ec29dcbafd554ae08"}, {file = "pymdown_extensions-10.14.1.tar.gz", hash = "sha256:b65801996a0cd4f42a3110810c306c45b7313c09b0610a6f773730f2a9e3c96b"}, @@ -3276,7 +3126,6 @@ version = "3.1.4" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" -groups = ["dev"] files = [ {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, @@ -3291,7 +3140,6 @@ version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -3314,7 +3162,6 @@ version = "0.24.0" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"}, {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"}, @@ -3333,7 +3180,6 @@ version = "4.0.0" description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "pytest-benchmark-4.0.0.tar.gz", hash = "sha256:fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1"}, {file = "pytest_benchmark-4.0.0-py3-none-any.whl", hash = "sha256:fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6"}, @@ -3354,7 +3200,6 @@ version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, @@ -3373,7 +3218,6 @@ version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, @@ -3391,7 +3235,6 @@ version = "0.7.0" description = "Pytest Plugin to disable socket calls during tests" optional = false python-versions = ">=3.8,<4.0" -groups = ["dev"] files = [ {file = "pytest_socket-0.7.0-py3-none-any.whl", hash = "sha256:7e0f4642177d55d317bbd58fc68c6bd9048d6eadb2d46a89307fa9221336ce45"}, {file = "pytest_socket-0.7.0.tar.gz", hash = "sha256:71ab048cbbcb085c15a4423b73b619a8b35d6a307f46f78ea46be51b1b7e11b3"}, @@ -3406,7 +3249,6 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -3427,7 +3269,6 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -3442,8 +3283,6 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"all\"" files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -3458,8 +3297,6 @@ version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version < \"3.9\"" files = [ {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, @@ -3471,8 +3308,6 @@ version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" -groups = ["dev"] -markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, @@ -3500,7 +3335,6 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -3563,7 +3397,6 @@ version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, @@ -3578,7 +3411,6 @@ version = "6.0.1" description = "Code Metrics in Python" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "radon-6.0.1-py2.py3-none-any.whl", hash = "sha256:632cc032364a6f8bb1010a2f6a12d0f14bc7e5ede76585ef29dc0cecf4cd8859"}, {file = "radon-6.0.1.tar.gz", hash = "sha256:d1ac0053943a893878940fedc8b19ace70386fc9c9bf0a09229a44125ebf45b5"}, @@ -3597,12 +3429,10 @@ version = "5.2.1" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"}, {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"}, ] -markers = {main = "extra == \"redis\""} [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} @@ -3617,7 +3447,6 @@ version = "0.35.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, @@ -3633,7 +3462,6 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -3737,7 +3565,6 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -3759,7 +3586,6 @@ version = "0.9.5" description = "Easy to use retry decorator." optional = false python-versions = ">=2.6" -groups = ["dev"] files = [ {file = "retry2-0.9.5-py2.py3-none-any.whl", hash = "sha256:f7fee13b1e15d0611c462910a6aa72a8919823988dd0412152bc3719c89a4e55"}, ] @@ -3773,7 +3599,6 @@ version = "13.9.4" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" -groups = ["dev"] files = [ {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, @@ -3793,7 +3618,6 @@ version = "0.20.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "rpds_py-0.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a649dfd735fff086e8a9d0503a9f0c7d01b7912a333c7ae77e1515c08c146dad"}, {file = "rpds_py-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f16bc1334853e91ddaaa1217045dd7be166170beec337576818461268a3de67f"}, @@ -3906,7 +3730,6 @@ version = "0.9.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "ruff-0.9.2-py3-none-linux_armv6l.whl", hash = "sha256:80605a039ba1454d002b32139e4970becf84b5fee3a3c3bf1c2af6f61a784347"}, {file = "ruff-0.9.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9aab82bb20afd5f596527045c01e6ae25a718ff1784cb92947bff1f83068b00"}, @@ -3934,7 +3757,6 @@ version = "0.11.1" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "s3transfer-0.11.1-py3-none-any.whl", hash = "sha256:8fa0aa48177be1f3425176dfe1ab85dcd3d962df603c3dbfc585e6bf857ef0ff"}, {file = "s3transfer-0.11.1.tar.gz", hash = "sha256:3f25c900a367c8b7f7d8f9c34edc87e300bde424f779dc9f0a8ae4f9df9264f6"}, @@ -3952,7 +3774,6 @@ version = "0.0.4" description = "Flexible recursive directory iterator: scandir meets glob(\"**\", recursive=True)" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "scantree-0.0.4-py3-none-any.whl", hash = "sha256:7616ab65aa6b7f16fcf8e6fa1d9afaa99a27ab72bba05c61b691853b96763174"}, {file = "scantree-0.0.4.tar.gz", hash = "sha256:15bd5cb24483b04db2c70653604e8ea3522e98087db7e38ab8482f053984c0ac"}, @@ -3968,7 +3789,6 @@ version = "2.20.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "sentry_sdk-2.20.0-py2.py3-none-any.whl", hash = "sha256:c359a1edf950eb5e80cffd7d9111f3dbeef57994cb4415df37d39fda2cf22364"}, {file = "sentry_sdk-2.20.0.tar.gz", hash = "sha256:afa82713a92facf847df3c6f63cec71eb488d826a50965def3d7722aa6f0fdab"}, @@ -4024,7 +3844,6 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -4036,7 +3855,6 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -4048,7 +3866,6 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -4060,7 +3877,6 @@ version = "5.3.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "stevedore-5.3.0-py3-none-any.whl", hash = "sha256:1efd34ca08f474dad08d9b19e934a22c68bb6fe416926479ba29e5013bcc8f78"}, {file = "stevedore-5.3.0.tar.gz", hash = "sha256:9a64265f4060312828151c204efbe9b7a9852a0d9228756344dbc7e4023e375a"}, @@ -4075,7 +3891,6 @@ version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, @@ -4093,7 +3908,6 @@ version = "3.7.1" description = "Library provides lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "testcontainers-3.7.1-py2.py3-none-any.whl", hash = "sha256:7f48cef4bf0ccd78f1a4534d4b701a003a3bace851f24eae58a32f9e3f0aeba0"}, ] @@ -4128,8 +3942,6 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_full_version <= \"3.11.0a6\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -4171,7 +3983,6 @@ version = "2.13.3" description = "Run-time type checker for Python" optional = false python-versions = ">=3.5.3" -groups = ["dev"] files = [ {file = "typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1"}, {file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"}, @@ -4187,7 +3998,6 @@ version = "0.23.6" description = "Type annotations and code completion for awscrt" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_awscrt-0.23.6-py3-none-any.whl", hash = "sha256:fbf9c221af5607b24bf17f8431217ce8b9a27917139edbc984891eb63fd5a593"}, {file = "types_awscrt-0.23.6.tar.gz", hash = "sha256:405bce8c281f9e7c6c92a229225cc0bf10d30729a6a601123213389bd524b8b1"}, @@ -4199,7 +4009,6 @@ version = "1.16.0.20241221" description = "Typing stubs for cffi" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_cffi-1.16.0.20241221-py3-none-any.whl", hash = "sha256:e5b76b4211d7a9185f6ab8d06a106d56c7eb80af7cdb8bfcb4186ade10fb112f"}, {file = "types_cffi-1.16.0.20241221.tar.gz", hash = "sha256:1c96649618f4b6145f58231acb976e0b448be6b847f7ab733dabe62dfbff6591"}, @@ -4214,7 +4023,6 @@ version = "24.1.0.20240722" description = "Typing stubs for pyOpenSSL" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types-pyOpenSSL-24.1.0.20240722.tar.gz", hash = "sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39"}, {file = "types_pyOpenSSL-24.1.0.20240722-py3-none-any.whl", hash = "sha256:6a7a5d2ec042537934cfb4c9d4deb0e16c4c6250b09358df1f083682fe6fda54"}, @@ -4230,7 +4038,6 @@ version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, @@ -4242,7 +4049,6 @@ version = "4.6.0.20241004" description = "Typing stubs for redis" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types-redis-4.6.0.20241004.tar.gz", hash = "sha256:5f17d2b3f9091ab75384153bfa276619ffa1cf6a38da60e10d5e6749cc5b902e"}, {file = "types_redis-4.6.0.20241004-py3-none-any.whl", hash = "sha256:ef5da68cb827e5f606c8f9c0b49eeee4c2669d6d97122f301d3a55dc6a63f6ed"}, @@ -4258,7 +4064,6 @@ version = "2.31.0.6" description = "Typing stubs for requests" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, @@ -4273,7 +4078,6 @@ version = "0.11.1" description = "Type annotations and code completion for s3transfer" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_s3transfer-0.11.1-py3-none-any.whl", hash = "sha256:ddb20d103361c2d7cf95e9e73468cdd12f049f503b1512e6fdfe5a66fa086d2d"}, {file = "types_s3transfer-0.11.1.tar.gz", hash = "sha256:6ab89d4d76bcbf6d494582949963b4672347e8daa397d9790f3684b4fcf873c4"}, @@ -4285,7 +4089,6 @@ version = "75.8.0.20250110" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480"}, {file = "types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271"}, @@ -4297,7 +4100,6 @@ version = "1.26.25.14" description = "Typing stubs for urllib3" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, @@ -4309,7 +4111,6 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -4321,8 +4122,6 @@ version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, @@ -4410,7 +4209,6 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, @@ -4427,7 +4225,6 @@ version = "0.1.0" description = "Flexible version handling" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, @@ -4442,7 +4239,6 @@ version = "20.29.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779"}, {file = "virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35"}, @@ -4463,7 +4259,6 @@ version = "4.0.2" description = "Filesystem events monitoring" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ede7f010f2239b97cc79e6cb3c249e72962404ae3865860855d5cbe708b0fd22"}, {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2cffa171445b0efa0726c561eca9a27d00a1f2b83846dbd5a4f639c4f8ca8e1"}, @@ -4511,7 +4306,6 @@ version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -4593,7 +4387,6 @@ files = [ {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, ] -markers = {main = "extra == \"tracer\" or extra == \"all\" or extra == \"datadog\" or extra == \"datamasking\""} [[package]] name = "xenon" @@ -4601,7 +4394,6 @@ version = "0.9.3" description = "Monitor code metrics for Python on your CI server" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "xenon-0.9.3-py2.py3-none-any.whl", hash = "sha256:6e2c2c251cc5e9d01fe984e623499b13b2140fcbf74d6c03a613fa43a9347097"}, {file = "xenon-0.9.3.tar.gz", hash = "sha256:4a7538d8ba08aa5d79055fb3e0b2393c0bd6d7d16a4ab0fcdef02ef1f10a43fa"}, @@ -4618,8 +4410,6 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -4631,12 +4421,10 @@ version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] -markers = {main = "extra == \"datadog\""} [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] @@ -4657,6 +4445,6 @@ tracer = ["aws-xray-sdk"] validation = ["fastjsonschema"] [metadata] -lock-version = "2.1" +lock-version = "2.0" python-versions = ">=3.8,<4.0.0" -content-hash = "d6a3ba5548c6aefbc5eb0e3858b651f36881144d0d2e533d507990e82263ff00" +content-hash = "57395816640f2e2e3fbaa8e338b4f64fa243d0ce0b644af3407bfeb7dba0d79a" diff --git a/pyproject.toml b/pyproject.toml index a631644ec8d..c45c4ef48ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -110,7 +110,7 @@ hvac = "^2.3.0" aws-requests-auth = "^0.4.3" urllib3 = "<2" requests = ">=2.32.0" -cfn-lint = "1.22.5" +cfn-lint = "1.22.6" mypy = "^1.1.1" types-python-dateutil = "^2.8.19.6" aws-cdk-aws-appsync-alpha = "^2.59.0a0" From 792892e03a53b9a12fb79951f9e2cb4fe8fea167 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Thu, 23 Jan 2025 11:07:04 +0000 Subject: [PATCH 24/52] feat(idempotency): add support for custom Idempotency key prefix (#5898) * Adding support for custom prefix in Idempotency key * Refactoring parameter --- .../utilities/idempotency/base.py | 11 +++- .../utilities/idempotency/idempotency.py | 9 ++++ .../utilities/idempotency/persistence/base.py | 17 +++++-- docs/utilities/idempotency.md | 26 +++++++++- ...king_with_custom_idempotency_key_prefix.py | 39 ++++++++++++++ ...ustom_idempotency_key_prefix_standalone.py | 46 +++++++++++++++++ .../idempotency/_boto3/test_idempotency.py | 51 ++++++++++++++----- 7 files changed, 180 insertions(+), 19 deletions(-) create mode 100644 examples/idempotency/src/working_with_custom_idempotency_key_prefix.py create mode 100644 examples/idempotency/src/working_with_custom_idempotency_key_prefix_standalone.py diff --git a/aws_lambda_powertools/utilities/idempotency/base.py b/aws_lambda_powertools/utilities/idempotency/base.py index 6978cd778de..0841fb7500f 100644 --- a/aws_lambda_powertools/utilities/idempotency/base.py +++ b/aws_lambda_powertools/utilities/idempotency/base.py @@ -74,6 +74,7 @@ def __init__( config: IdempotencyConfig, persistence_store: BasePersistenceLayer, output_serializer: BaseIdempotencySerializer | None = None, + key_prefix: str | None = None, function_args: tuple | None = None, function_kwargs: dict | None = None, ): @@ -91,6 +92,8 @@ def __init__( output_serializer: BaseIdempotencySerializer | None Serializer to transform the data to and from a dictionary. If not supplied, no serialization is done via the NoOpSerializer + key_prefix: str | Optional + Custom prefix for idempotency key: key_prefix#hash function_args: tuple | None Function arguments function_kwargs: dict | None @@ -102,8 +105,14 @@ def __init__( self.fn_args = function_args self.fn_kwargs = function_kwargs self.config = config + self.key_prefix = key_prefix + + persistence_store.configure( + config=config, + function_name=f"{self.function.__module__}.{self.function.__qualname__}", + key_prefix=self.key_prefix, + ) - persistence_store.configure(config, f"{self.function.__module__}.{self.function.__qualname__}") self.persistence_store = persistence_store def handle(self) -> Any: diff --git a/aws_lambda_powertools/utilities/idempotency/idempotency.py b/aws_lambda_powertools/utilities/idempotency/idempotency.py index 401820b3e54..1305d0a5405 100644 --- a/aws_lambda_powertools/utilities/idempotency/idempotency.py +++ b/aws_lambda_powertools/utilities/idempotency/idempotency.py @@ -40,6 +40,7 @@ def idempotent( context: LambdaContext, persistence_store: BasePersistenceLayer, config: IdempotencyConfig | None = None, + key_prefix: str | None = None, **kwargs, ) -> Any: """ @@ -57,6 +58,8 @@ def idempotent( Instance of BasePersistenceLayer to store data config: IdempotencyConfig Configuration + key_prefix: str | Optional + Custom prefix for idempotency key: key_prefix#hash Examples -------- @@ -94,6 +97,7 @@ def idempotent( function_payload=event, config=config, persistence_store=persistence_store, + key_prefix=key_prefix, function_args=args, function_kwargs=kwargs, ) @@ -108,6 +112,7 @@ def idempotent_function( persistence_store: BasePersistenceLayer, config: IdempotencyConfig | None = None, output_serializer: BaseIdempotencySerializer | type[BaseIdempotencyModelSerializer] | None = None, + key_prefix: str | None = None, **kwargs: Any, ) -> Any: """ @@ -128,6 +133,8 @@ def idempotent_function( If not supplied, no serialization is done via the NoOpSerializer. In case a serializer of type inheriting BaseIdempotencyModelSerializer is given, the serializer is derived from the function return type. + key_prefix: str | Optional + Custom prefix for idempotency key: key_prefix#hash Examples -------- @@ -154,6 +161,7 @@ def process_order(customer_id: str, order: dict, **kwargs): persistence_store=persistence_store, config=config, output_serializer=output_serializer, + key_prefix=key_prefix, **kwargs, ), ) @@ -191,6 +199,7 @@ def decorate(*args, **kwargs): config=config, persistence_store=persistence_store, output_serializer=output_serializer, + key_prefix=key_prefix, function_args=args, function_kwargs=kwargs, ) diff --git a/aws_lambda_powertools/utilities/idempotency/persistence/base.py b/aws_lambda_powertools/utilities/idempotency/persistence/base.py index 6cdf534b6e2..2803e6f0f3a 100644 --- a/aws_lambda_powertools/utilities/idempotency/persistence/base.py +++ b/aws_lambda_powertools/utilities/idempotency/persistence/base.py @@ -54,7 +54,12 @@ def __init__(self): self.use_local_cache = False self.hash_function = hashlib.md5 - def configure(self, config: IdempotencyConfig, function_name: str | None = None) -> None: + def configure( + self, + config: IdempotencyConfig, + function_name: str | None = None, + key_prefix: str | None = None, + ) -> None: """ Initialize the base persistence layer from the configuration settings @@ -64,8 +69,12 @@ def configure(self, config: IdempotencyConfig, function_name: str | None = None) Idempotency configuration settings function_name: str, Optional The name of the function being decorated + key_prefix: str | Optional + Custom prefix for idempotency key: key_prefix#hash """ - self.function_name = f"{os.getenv(constants.LAMBDA_FUNCTION_NAME_ENV, 'test-func')}.{function_name or ''}" + self.function_name = ( + key_prefix or f"{os.getenv(constants.LAMBDA_FUNCTION_NAME_ENV, 'test-func')}.{function_name or ''}" + ) if self.configured: # Prevent being reconfigured multiple times @@ -75,9 +84,7 @@ def configure(self, config: IdempotencyConfig, function_name: str | None = None) self.event_key_jmespath = config.event_key_jmespath if config.event_key_jmespath: self.event_key_compiled_jmespath = jmespath.compile(config.event_key_jmespath) - self.jmespath_options = config.jmespath_options - if not self.jmespath_options: - self.jmespath_options = {"custom_functions": PowertoolsFunctions()} + self.jmespath_options = config.jmespath_options or {"custom_functions": PowertoolsFunctions()} if config.payload_validation_jmespath: self.validation_key_jmespath = jmespath.compile(config.payload_validation_jmespath) self.payload_validation_enabled = True diff --git a/docs/utilities/idempotency.md b/docs/utilities/idempotency.md index cfe85877961..97ffd38903b 100644 --- a/docs/utilities/idempotency.md +++ b/docs/utilities/idempotency.md @@ -18,7 +18,9 @@ The idempotency utility allows you to retry operations within a time window with The property of idempotency means that an operation does not cause additional side effects if it is called more than once with the same input parameters. -**Idempotency key** is a combination of **(a)** Lambda function name, **(b)** fully qualified name of your function, and **(c)** a hash of the entire payload or part(s) of the payload you specify. + +**Idempotency key** By default, this is a combination of **(a)** Lambda function name, **(b)** fully qualified name of your function, and **(c)** a hash of the entire payload or part(s) of the payload you specify. However, you can customize the key generation by using **(a)** a [custom prefix name](#customizing-the-idempotency-key-generation), while still incorporating **(c)** a hash of the entire payload or part(s) of the payload you specify. + **Idempotent request** is an operation with the same input previously processed that is not expired in your persistent storage or in-memory cache. @@ -356,6 +358,28 @@ You can change this expiration window with the **`expires_after_seconds`** param A record might still be valid (`COMPLETE`) when we retrieved, but in some rare cases it might expire a second later. A record could also be [cached in memory](#using-in-memory-cache). You might also want to have idempotent transactions that should expire in seconds. +### Customizing the Idempotency key generation + +!!! warning "Warning: Changing the idempotency key generation will invalidate existing idempotency records" + +Use **`key_prefix`** parameter in the `@idempotent` or `@idempotent_function` decorators to define a custom prefix for your Idempotency Key. This allows you to decouple idempotency key name from function names. It can be useful during application refactoring, for example. + +=== "Using a custom prefix in Lambda Handler" + + ```python hl_lines="25" + --8<-- "examples/idempotency/src/working_with_custom_idempotency_key_prefix.py" + ``` + + 1. The Idempotency record will be something like `my_custom_prefix#c4ca4238a0b923820dcc509a6f75849b` + +=== "Using a custom prefix in standalone functions" + + ```python hl_lines="32" + --8<-- "examples/idempotency/src/working_with_custom_idempotency_key_prefix_standalone.py" + ``` + + 1. The Idempotency record will be something like `my_custom_prefix#c4ca4238a0b923820dcc509a6f75849b` + ### Lambda timeouts !!! note "You can skip this section if you are using the [`@idempotent` decorator](#idempotent-decorator)" diff --git a/examples/idempotency/src/working_with_custom_idempotency_key_prefix.py b/examples/idempotency/src/working_with_custom_idempotency_key_prefix.py new file mode 100644 index 00000000000..eacc2d3254b --- /dev/null +++ b/examples/idempotency/src/working_with_custom_idempotency_key_prefix.py @@ -0,0 +1,39 @@ +import os +from dataclasses import dataclass, field +from uuid import uuid4 + +from aws_lambda_powertools.utilities.idempotency import ( + DynamoDBPersistenceLayer, + idempotent, +) +from aws_lambda_powertools.utilities.typing import LambdaContext + +table = os.getenv("IDEMPOTENCY_TABLE", "") +persistence_layer = DynamoDBPersistenceLayer(table_name=table) + + +@dataclass +class Payment: + user_id: str + product_id: str + payment_id: str = field(default_factory=lambda: f"{uuid4()}") + + +class PaymentError(Exception): ... + + +@idempotent(persistence_store=persistence_layer, key_prefix="my_custom_prefix") # (1)! +def lambda_handler(event: dict, context: LambdaContext): + try: + payment: Payment = create_subscription_payment(event) + return { + "payment_id": payment.payment_id, + "message": "success", + "statusCode": 200, + } + except Exception as exc: + raise PaymentError(f"Error creating payment {str(exc)}") + + +def create_subscription_payment(event: dict) -> Payment: + return Payment(**event) diff --git a/examples/idempotency/src/working_with_custom_idempotency_key_prefix_standalone.py b/examples/idempotency/src/working_with_custom_idempotency_key_prefix_standalone.py new file mode 100644 index 00000000000..2fb8bd92275 --- /dev/null +++ b/examples/idempotency/src/working_with_custom_idempotency_key_prefix_standalone.py @@ -0,0 +1,46 @@ +import os +from dataclasses import dataclass + +from aws_lambda_powertools.utilities.idempotency import ( + DynamoDBPersistenceLayer, + IdempotencyConfig, + idempotent_function, +) +from aws_lambda_powertools.utilities.typing import LambdaContext + +table = os.getenv("IDEMPOTENCY_TABLE", "") +dynamodb = DynamoDBPersistenceLayer(table_name=table) +config = IdempotencyConfig(event_key_jmespath="order_id") # see Choosing a payload subset section + + +@dataclass +class OrderItem: + sku: str + description: str + + +@dataclass +class Order: + item: OrderItem + order_id: int + + +@idempotent_function( + data_keyword_argument="order", + config=config, + persistence_store=dynamodb, + key_prefix="my_custom_prefix", # (1)! +) +def process_order(order: Order): + return f"processed order {order.order_id}" + + +def lambda_handler(event: dict, context: LambdaContext): + # see Lambda timeouts section + config.register_lambda_context(context) + + order_item = OrderItem(sku="fake", description="sample") + order = Order(item=order_item, order_id=1) + + # `order` parameter must be called as a keyword argument to work + process_order(order=order) diff --git a/tests/functional/idempotency/_boto3/test_idempotency.py b/tests/functional/idempotency/_boto3/test_idempotency.py index f2214e2fd65..f92fb639350 100644 --- a/tests/functional/idempotency/_boto3/test_idempotency.py +++ b/tests/functional/idempotency/_boto3/test_idempotency.py @@ -1,4 +1,5 @@ import copy +import dataclasses import datetime import warnings from typing import Any, Optional @@ -59,13 +60,6 @@ TESTS_MODULE_PREFIX = "test-func.tests.functional.idempotency._boto3.test_idempotency" -def get_dataclasses_lib(): - """Python 3.6 doesn't support dataclasses natively""" - import dataclasses - - return dataclasses - - # Using parametrize to run test twice, with two separate instances of persistence store. One instance with caching # enabled, and one without. @pytest.mark.parametrize("idempotency_config", [{"use_local_cache": False}, {"use_local_cache": True}], indirect=True) @@ -1313,7 +1307,6 @@ def record_handler(record): @pytest.mark.parametrize("output_serializer_type", ["explicit", "deduced"]) def test_idempotent_function_serialization_dataclass(output_serializer_type: str): # GIVEN - dataclasses = get_dataclasses_lib() config = IdempotencyConfig(use_local_cache=True) mock_event = {"customer_id": "fake", "transaction_id": "fake-id"} idempotency_key = f"{TESTS_MODULE_PREFIX}.test_idempotent_function_serialization_dataclass..collect_payment#{hash_idempotency_key(mock_event)}" # noqa E501 @@ -1359,7 +1352,6 @@ def collect_payment(payment: PaymentInput) -> PaymentOutput: def test_idempotent_function_serialization_dataclass_failure_no_return_type(): # GIVEN - dataclasses = get_dataclasses_lib() config = IdempotencyConfig(use_local_cache=True) mock_event = {"customer_id": "fake", "transaction_id": "fake-id"} idempotency_key = f"{TESTS_MODULE_PREFIX}.test_idempotent_function_serialization_pydantic_failure_no_return_type..collect_payment#{hash_idempotency_key(mock_event)}" # noqa E501 @@ -1655,7 +1647,6 @@ def test_invalid_dynamodb_persistence_layer(): def test_idempotent_function_dataclasses(): # Scenario _prepare_data should convert a python dataclasses to a dict - dataclasses = get_dataclasses_lib() @dataclasses.dataclass class Foo: @@ -1670,7 +1661,6 @@ class Foo: def test_idempotent_function_dataclass_with_jmespath(): # GIVEN - dataclasses = get_dataclasses_lib() config = IdempotencyConfig(event_key_jmespath="transaction_id", use_local_cache=True) mock_event = {"customer_id": "fake", "transaction_id": "fake-id"} idempotency_key = f"{TESTS_MODULE_PREFIX}.test_idempotent_function_dataclass_with_jmespath..collect_payment#{hash_idempotency_key(mock_event['transaction_id'])}" # noqa E501 @@ -2019,7 +2009,6 @@ def lambda_handler(event, context): @pytest.mark.parametrize("output_serializer_type", ["explicit", "deduced"]) def test_idempotent_function_serialization_dataclass_with_optional_return(output_serializer_type: str): # GIVEN - dataclasses = get_dataclasses_lib() config = IdempotencyConfig(use_local_cache=True) mock_event = {"customer_id": "fake", "transaction_id": "fake-id"} idempotency_key = f"{TESTS_MODULE_PREFIX}.test_idempotent_function_serialization_dataclass_with_optional_return..collect_payment#{hash_idempotency_key(mock_event)}" # noqa E501 @@ -2061,3 +2050,41 @@ def collect_payment(payment: PaymentInput) -> Optional[PaymentOutput]: assert isinstance(second_call, PaymentOutput) assert second_call.customer_id == payment.customer_id assert second_call.transaction_id == payment.transaction_id + + +def test_idempotent_function_with_custom_prefix_standalone_function(): + # Scenario to validate we can use idempotent_function with any function + mock_event = {"data": "value"} + idempotency_key = f"my-custom-prefix#{hash_idempotency_key(mock_event)}" + persistence_layer = MockPersistenceLayer(expected_idempotency_key=idempotency_key) + expected_result = {"message": "Foo"} + + @idempotent_function( + persistence_store=persistence_layer, + data_keyword_argument="record", + key_prefix="my-custom-prefix", + ) + def record_handler(record): + return expected_result + + # WHEN calling the function + result = record_handler(record=mock_event) + # THEN we expect the function to execute successfully + assert result == expected_result + + +def test_idempotent_function_with_custom_prefix_lambda_handler(lambda_context): + # Scenario to validate we can use idempotent_function with any function + mock_event = {"data": "value"} + idempotency_key = f"my-custom-prefix#{hash_idempotency_key(mock_event)}" + persistence_layer = MockPersistenceLayer(expected_idempotency_key=idempotency_key) + expected_result = {"message": "Foo"} + + @idempotent(persistence_store=persistence_layer, key_prefix="my-custom-prefix") + def lambda_handler(record, context): + return expected_result + + # WHEN calling the function + result = lambda_handler(mock_event, lambda_context) + # THEN we expect the function to execute successfully + assert result == expected_result From 553e73359211869f026d7a97bc1967045313705c Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Thu, 23 Jan 2025 12:42:14 +0000 Subject: [PATCH 25/52] chore(ci): drop support for Python 3.8 (#5896) * Dropping Python 3.8 * Dropping Python 3.8 * Dropping Python 3.8 * Dropping Python 3.8 --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 - .github/ISSUE_TEMPLATE/static_typing.yml | 1 - .github/workflows/layer_govcloud.yml | 3 - .github/workflows/layer_govcloud_verify.yml | 3 - .github/workflows/publish_v3_layer.yml | 4 +- .github/workflows/quality_check.yml | 2 +- .../reusable_deploy_v3_layer_stack.yml | 4 +- .github/workflows/reusable_deploy_v3_sar.yml | 4 +- .github/workflows/run-e2e-tests.yml | 2 +- .github/workflows/update_ssm.yml | 6 +- .../idempotency/serialization/functions.py | 2 +- benchmark/template.yaml | 2 +- docs/automation.md | 11 +- docs/contributing/setup.md | 2 +- docs/includes/_layer_homepage_arm64.md | 34 - docs/includes/_layer_homepage_x86.md | 35 - docs/index.md | 2 +- docs/upgrade.md | 8 +- layer/sar/template.txt | 3 +- layer_v3/docker/Dockerfile | 2 +- layer_v3/docker/install_libraries.sh | 2 +- layer_v3/layer/canary_stack.py | 4 +- layer_v3/layer/layer_stack.py | 2 - .../unit/test_new_cdk_constructor_stack.py | 2 - layer_v3/poetry.lock | 183 ++- layer_v3/pyproject.toml | 3 +- poetry.lock | 1019 ++++++++++------- pyproject.toml | 4 +- tests/e2e/utils/infrastructure.py | 5 +- 29 files changed, 752 insertions(+), 603 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 3ca04a2bca4..77c028f7fed 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -58,7 +58,6 @@ body: attributes: label: AWS Lambda function runtime options: - - "3.8" - "3.9" - "3.10" - "3.11" diff --git a/.github/ISSUE_TEMPLATE/static_typing.yml b/.github/ISSUE_TEMPLATE/static_typing.yml index 35856589a2b..83bfd3dc361 100644 --- a/.github/ISSUE_TEMPLATE/static_typing.yml +++ b/.github/ISSUE_TEMPLATE/static_typing.yml @@ -25,7 +25,6 @@ body: attributes: label: AWS Lambda function runtime options: - - "3.8" - "3.9" - "3.10" - "3.11" diff --git a/.github/workflows/layer_govcloud.yml b/.github/workflows/layer_govcloud.yml index 9d1be514a27..3a98ceca223 100644 --- a/.github/workflows/layer_govcloud.yml +++ b/.github/workflows/layer_govcloud.yml @@ -48,7 +48,6 @@ jobs: strategy: matrix: layer: - - AWSLambdaPowertoolsPythonV3-python38 - AWSLambdaPowertoolsPythonV3-python39 - AWSLambdaPowertoolsPythonV3-python310 - AWSLambdaPowertoolsPythonV3-python311 @@ -94,7 +93,6 @@ jobs: strategy: matrix: layer: - - AWSLambdaPowertoolsPythonV3-python38 - AWSLambdaPowertoolsPythonV3-python39 - AWSLambdaPowertoolsPythonV3-python310 - AWSLambdaPowertoolsPythonV3-python311 @@ -163,7 +161,6 @@ jobs: strategy: matrix: layer: - - AWSLambdaPowertoolsPythonV3-python38 - AWSLambdaPowertoolsPythonV3-python39 - AWSLambdaPowertoolsPythonV3-python310 - AWSLambdaPowertoolsPythonV3-python311 diff --git a/.github/workflows/layer_govcloud_verify.yml b/.github/workflows/layer_govcloud_verify.yml index 736077698a5..2395183c111 100644 --- a/.github/workflows/layer_govcloud_verify.yml +++ b/.github/workflows/layer_govcloud_verify.yml @@ -28,7 +28,6 @@ jobs: strategy: matrix: layer: - - AWSLambdaPowertoolsPythonV3-python38 - AWSLambdaPowertoolsPythonV3-python39 - AWSLambdaPowertoolsPythonV3-python310 - AWSLambdaPowertoolsPythonV3-python311 @@ -59,7 +58,6 @@ jobs: strategy: matrix: layer: - - AWSLambdaPowertoolsPythonV3-python38 - AWSLambdaPowertoolsPythonV3-python39 - AWSLambdaPowertoolsPythonV3-python310 - AWSLambdaPowertoolsPythonV3-python311 @@ -91,7 +89,6 @@ jobs: strategy: matrix: layer: - - AWSLambdaPowertoolsPythonV3-python38 - AWSLambdaPowertoolsPythonV3-python39 - AWSLambdaPowertoolsPythonV3-python310 - AWSLambdaPowertoolsPythonV3-python311 diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index 6f537f6b9cb..2fc3072275c 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -2,7 +2,7 @@ name: Deploy v3 layer to all regions # PROCESS # -# 1. Compile Layer using cdk-aws-lambda-powertools-layer CDK construct for Python3.8-3.12 and x86_64/ARM architectures (uses custom runner as it's CPU heavy) +# 1. Compile Layer using cdk-aws-lambda-powertools-layer CDK construct for Python3.9-3.13 and x86_64/ARM architectures (uses custom runner as it's CPU heavy) # 2. Kick off pipeline for beta, prod, and canary releases # 3. Create PR to update trunk so staged docs also point to the latest Layer ARN, when merged # 4. Builds and publishes docs with latest Layer ARN using given version (generally coming from release) @@ -85,7 +85,7 @@ jobs: strategy: max-parallel: 5 matrix: - python-version: ["3.8","3.9","3.10","3.11","3.12","3.13"] + python-version: ["3.9","3.10","3.11","3.12","3.13"] defaults: run: working-directory: ./layer_v3 diff --git a/.github/workflows/quality_check.yml b/.github/workflows/quality_check.yml index b0f92c44334..4b6a7fa2c8c 100644 --- a/.github/workflows/quality_check.yml +++ b/.github/workflows/quality_check.yml @@ -46,7 +46,7 @@ jobs: strategy: max-parallel: 4 matrix: - python-version: ["3.8","3.9","3.10","3.11","3.12","3.13"] + python-version: ["3.9","3.10","3.11","3.12","3.13"] env: PYTHON: "${{ matrix.python-version }}" permissions: diff --git a/.github/workflows/reusable_deploy_v3_layer_stack.yml b/.github/workflows/reusable_deploy_v3_layer_stack.yml index 28782ae7efd..94dfec662ce 100644 --- a/.github/workflows/reusable_deploy_v3_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v3_layer_stack.yml @@ -3,7 +3,7 @@ name: Deploy CDK Layer v3 stack # PROCESS # # 1. Split what AWS regions support ARM vs regions that Lambda support ARM -# 2. We build the Lambda layer for 3.8 to 3.12 Python runtime and both x86_64 and arm64 (see `matrix` section) +# 2. We build the Lambda layer for 3.9 to 3.13 Python runtime and both x86_64 and arm64 (see `matrix` section) # 3. Deploy previously built layer for each AWS commercial region # 4. Export all published Layers as JSON # 5. Deploy Canaries to every deployed region to test whether Powertools can be imported etc. @@ -78,7 +78,7 @@ jobs: "eu-north-1", "eu-south-1", "eu-south-2", "eu-west-1", "eu-west-2", "eu-west-3", "il-central-1", "me-central-1", "me-south-1", "sa-east-1", "us-east-1", "us-east-2", "us-west-1", "us-west-2"] - python-version: ["3.8","3.9","3.10","3.11","3.12","3.13"] + python-version: ["3.9","3.10","3.11","3.12","3.13"] include: - region: "af-south-1" has_arm64_support: "true" diff --git a/.github/workflows/reusable_deploy_v3_sar.yml b/.github/workflows/reusable_deploy_v3_sar.yml index 8c319d0b695..b5d110e95d6 100644 --- a/.github/workflows/reusable_deploy_v3_sar.yml +++ b/.github/workflows/reusable_deploy_v3_sar.yml @@ -4,7 +4,7 @@ name: Deploy V3 SAR # # 1. This workflow starts after the layer artifact is produced on `publish_v3_layer` # 2. We use the same layer artifact to ensure the SAR app is consistent with the published Lambda Layer -# 3. We publish the SAR for 3.8 to 3.13 Python runtime and both x86_64 and arm64 (see `matrix` section) +# 3. We publish the SAR for 3.9 to 3.13 Python runtime and both x86_64 and arm64 (see `matrix` section) # 4. We use `sam package` and `sam publish` to publish the SAR app # 5. We remove the previous Canary stack (if present) and deploy a new one to test the SAR App. We retain the Canary in the account for debugging purposes # 6. Finally the published SAR app is made public on the PROD environment @@ -72,7 +72,7 @@ jobs: strategy: matrix: architecture: ["x86_64", "arm64"] - python-version: ["3.8","3.9","3.10","3.11","3.12","3.13"] + python-version: ["3.9","3.10","3.11","3.12","3.13"] steps: - name: checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml index 42e1aacd311..361a6ac8eb4 100644 --- a/.github/workflows/run-e2e-tests.yml +++ b/.github/workflows/run-e2e-tests.yml @@ -48,7 +48,7 @@ jobs: strategy: fail-fast: false # needed so if a version fails, the others will still be able to complete and cleanup matrix: - version: ["3.8", "3.9", "3.10", "3.11", "3.12","3.13"] + version: ["3.9", "3.10", "3.11", "3.12","3.13"] if: ${{ github.actor != 'dependabot[bot]' && github.repository == 'aws-powertools/powertools-lambda-python' }} steps: - name: "Checkout" diff --git a/.github/workflows/update_ssm.yml b/.github/workflows/update_ssm.yml index 7200cec529e..2f8492dcb89 100644 --- a/.github/workflows/update_ssm.yml +++ b/.github/workflows/update_ssm.yml @@ -11,7 +11,7 @@ run-name: SSM Parameters - Python # * layer_version: this is sequential layer version from the ARN # # A successful parameter would look similar to: -# /aws/service/powertools/python/arm64/python3.8/3.1.0 +# /aws/service/powertools/python/arm64/python3.13/3.1.0 # And will have a value of: # arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:4 @@ -75,14 +75,12 @@ jobs: env: prefix: ${{ inputs.environment == 'beta' && '/aws/service/powertools/beta' || '/aws/service/powertools' }} run: | - aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.8/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.9/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.10/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.11/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.12/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.13/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:${{ inputs.layer_version }}" --type String --overwrite - aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.8/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.9/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.10/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.11/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:${{ inputs.layer_version }}" --type String --overwrite @@ -94,14 +92,12 @@ jobs: env: prefix: ${{ inputs.environment == 'beta' && '/aws/service/powertools/beta' || '/aws/service/powertools' }} run: | - aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.8/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.9/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.10/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.11/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.12/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.13/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:${{ inputs.layer_version }}" --type String --overwrite - aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.8/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.9/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.10/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.11/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:${{ inputs.layer_version }}" --type String --overwrite diff --git a/aws_lambda_powertools/utilities/idempotency/serialization/functions.py b/aws_lambda_powertools/utilities/idempotency/serialization/functions.py index 72a8d6940c9..b401bd96040 100644 --- a/aws_lambda_powertools/utilities/idempotency/serialization/functions.py +++ b/aws_lambda_powertools/utilities/idempotency/serialization/functions.py @@ -5,7 +5,7 @@ if sys.version_info >= (3, 10): from types import UnionType # Available in Python 3.10+ else: - UnionType = Union # Fallback for Python 3.8 and 3.9 + UnionType = Union # Fallback for Python 3.9 from aws_lambda_powertools.utilities.idempotency.exceptions import ( IdempotencyModelTypeError, diff --git a/benchmark/template.yaml b/benchmark/template.yaml index 578f6d61fbe..123c6bf9cb5 100644 --- a/benchmark/template.yaml +++ b/benchmark/template.yaml @@ -4,7 +4,7 @@ Transform: AWS::Serverless-2016-10-31 Globals: Function: Handler: main.handler - Runtime: python3.8 + Runtime: python3.13 MemorySize: 128 Tracing: Active Environment: diff --git a/docs/automation.md b/docs/automation.md index 35117e44f2a..918a062c11b 100644 --- a/docs/automation.md +++ b/docs/automation.md @@ -94,7 +94,7 @@ This is a snapshot of our automated checks at a glance. To build and deploy the Lambda Layers, we run a pipeline with the following steps: * We fetch the latest PyPi release and use it as the source for our layer. -* We build Python versions ranging from **3.8 to 3.13** for x86_64 and arm64 architectures. This is necessary because we use pre-compiled libraries like **Pydantic** and **Cryptography**, which require specific Python versions for each layer. +* We build Python versions ranging from **3.9 to 3.13** for x86_64 and arm64 architectures. This is necessary because we use pre-compiled libraries like **Pydantic** and **Cryptography**, which require specific Python versions for each layer. * We provide layer distributions for both the **x86_64** and **arm64** architectures. * For each Python version, we create a single CDK package containing both x86_64 and arm64 assets to optimize deployment performance. @@ -106,17 +106,13 @@ Next, we deploy these CDK Assets to the beta account across all AWS regions. Onc ```mermaid graph LR - Fetch[Fetch PyPi release] --> P38[Python 3.8] - Fetch --> P39[Python 3.9] + Fetch[Fetch PyPi release] --> P39[Python 3.9] Fetch --> P310[Python 3.10] Fetch --> P311[Python 3.11] Fetch --> P312[Python 3.12] Fetch --> P313[Python 3.13] subgraph build ["LAYER BUILD"] - P38 --> P38x86[build x86_64] - P38 --> P38arm64[build arm64] - P39 --> P39x86[build x86_64] P39 --> P39arm64[build arm64] P310 --> P310x86[build x86_64] @@ -127,8 +123,6 @@ graph LR P312 --> P312arm64[build arm64] P313 --> P313x86[build x86_64] P313 --> P313arm64[build arm64] - P38x86 --> CDKP1[CDK Package] - P38arm64 --> CDKP1[CDK Package] P39x86 --> CDKP2[CDK Package] P39arm64 --> CDKP2[CDK Package] P310x86 --> CDKP3[CDK Package] @@ -142,7 +136,6 @@ graph LR end subgraph beta ["BETA (all regions)"] - CDKP1 --> DeployBeta[Deploy to Beta] CDKP2 --> DeployBeta CDKP3 --> DeployBeta CDKP4 --> DeployBeta diff --git a/docs/contributing/setup.md b/docs/contributing/setup.md index 50533fad4b6..5d1430b5079 100644 --- a/docs/contributing/setup.md +++ b/docs/contributing/setup.md @@ -25,7 +25,7 @@ graph LR Unless you're using the pre-configured Cloud environment, you'll need the following installed: * [GitHub account](https://github.com/join){target="_blank" rel="nofollow"}. You'll need to be able to fork, clone, and contribute via pull request. -* [Python 3.8+](https://www.python.org/downloads/){target="_blank" rel="nofollow"}. Pick any version supported in [AWS Lambda runtime](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html). +* [Python 3.9+](https://www.python.org/downloads/){target="_blank" rel="nofollow"}. Pick any version supported in [AWS Lambda runtime](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html). * [Docker](https://docs.docker.com/engine/install/){target="_blank" rel="nofollow"}. We use it to run documentation linters and non-Python tooling. * [Fork the repository](https://github.com/aws-powertools/powertools-lambda-python/fork). You'll work against your fork of this repository. diff --git a/docs/includes/_layer_homepage_arm64.md b/docs/includes/_layer_homepage_arm64.md index 7d9b0dcaa19..b92ff1c19be 100644 --- a/docs/includes/_layer_homepage_arm64.md +++ b/docs/includes/_layer_homepage_arm64.md @@ -1,40 +1,6 @@ ??? note "Click to expand and copy any regional Lambda Layer ARN" - === "Python 3.8" - - | Region | Layer ARN | - | -------------------- | --------------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:6**{: .copyMe}:clipboard: | - === "Python 3.9" | Region | Layer ARN | diff --git a/docs/includes/_layer_homepage_x86.md b/docs/includes/_layer_homepage_x86.md index 329137bb10f..6bcc0de4a5b 100644 --- a/docs/includes/_layer_homepage_x86.md +++ b/docs/includes/_layer_homepage_x86.md @@ -1,41 +1,6 @@ ??? note "Click to expand and copy any regional Lambda Layer ARN" - === "Python 3.8" - - | Region | Layer ARN | - | -------------------- | --------------------------------------------------------------------------------------------------------- | - | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:6**{: .copyMe}:clipboard: | - === "Python 3.9" | Region | Layer ARN | diff --git a/docs/index.md b/docs/index.md index 23194e3c735..aff525011f7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -306,7 +306,7 @@ In this context, `[aws-sdk]` is an alias to the `boto3` package. Due to dependen ### Lambda Layer -[Lambda Layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html){target="_blank"} is a .zip file archive that can contain additional code, pre-packaged dependencies, data, or configuration files. We compile and optimize [all dependencies](#install) for Python versions from **3.8 to 3.13**, as well as for both **arm64 and x86_64** architectures, to ensure compatibility. We also remove duplicate dependencies [already available in the Lambda runtime](https://github.com/aws-powertools/powertools-lambda-layer-cdk/blob/d24716744f7d1f37617b4998c992c4c067e19e64/layer/Python/Dockerfile#L36){target="_blank"} to achieve the most optimal size. +[Lambda Layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html){target="_blank"} is a .zip file archive that can contain additional code, pre-packaged dependencies, data, or configuration files. We compile and optimize [all dependencies](#install) for Python versions from **3.9 to 3.13**, as well as for both **arm64 and x86_64** architectures, to ensure compatibility. We also remove duplicate dependencies [already available in the Lambda runtime](https://github.com/aws-powertools/powertools-lambda-layer-cdk/blob/d24716744f7d1f37617b4998c992c4c067e19e64/layer/Python/Dockerfile#L36){target="_blank"} to achieve the most optimal size. === "x86_64" --8<-- "docs/includes/_layer_homepage_x86.md" diff --git a/docs/upgrade.md b/docs/upgrade.md index 269c6e2b1d0..43243741103 100644 --- a/docs/upgrade.md +++ b/docs/upgrade.md @@ -31,7 +31,7 @@ We've made minimal breaking changes to make your transition to v3 as smooth as p Before you start, we suggest making a copy of your current working project or create a new branch with git. -1. **Upgrade** Python to at least v3.8. +1. **Upgrade** Python to at least v3.9. 2. **Ensure** you have the latest version via [Lambda Layer or PyPi](index.md#install){target="_blank"}. 3. **Review** the following sections to confirm if you need to make changes to your code. @@ -108,7 +108,7 @@ We have stopped exporting Pydantic objects directly from `aws_lambda_powertools. !!! note "No code changes required" -To give you better a better experience, we're now building Powertools for AWS Lambda (Python)'s Lambda layers for specific Python versions (`3.8-3.13`) and architectures (`x86_64` & `arm64`). +To give you better a better experience, we're now building Powertools for AWS Lambda (Python)'s Lambda layers for specific Python versions (`3.9-3.13`) and architectures (`x86_64` & `arm64`). This also allows us to include architecture-specific versions of both Pydantic v2 and AWS Encryption SDK and give you a more streamlined setup. @@ -116,13 +116,11 @@ To take advantage of the new layers, you need to update your functions or deploy | Architecture | Python version | Layer ARN | | ------------ | -------------- | --------------------------------------------------------------------------------------------------- | -| x86_64 | 3.8 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-x86_64:{version} | | x86_64 | 3.9 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:{version} | | x86_64 | 3.10 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:{version} | | x86_64 | 3.11 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:{version} | | x86_64 | 3.12 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:{version} | | x86_64 | 3.13 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:{version} | -| arm64 | 3.8 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python38-arm64:{version} | | arm64 | 3.9 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:{version} | | arm64 | 3.10 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:{version} | | arm64 | 3.11 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:{version} | @@ -290,7 +288,7 @@ def handler(event: dict, context: LambdaContext) -> dict: We refactored our codebase to align with Python guidelines and eliminated the use of `aws_lambda_powertools.shared.types` imports. -Instead, we now utilize types from the standard `typing` library, which are compatible with Python versions 3.8 and above, or from `typing_extensions` (included as a required dependency) for additional type support. +Instead, we now utilize types from the standard `typing` library, which are compatible with Python versions 3.9 and above, or from `typing_extensions` (included as a required dependency) for additional type support. ```diff -# BEFORE - v2 diff --git a/layer/sar/template.txt b/layer/sar/template.txt index f5912621fdf..c4e4d2f5128 100644 --- a/layer/sar/template.txt +++ b/layer/sar/template.txt @@ -14,7 +14,7 @@ Metadata: SourceCodeUrl: https://github.com/aws-powertools/powertools-lambda-python Transform: AWS::Serverless-2016-10-31 -Description: AWS Lambda Layer for aws-lambda-powertools with python 3.13, 3.12, 3.11, 3.10, 3.9 or 3.8 +Description: AWS Lambda Layer for aws-lambda-powertools with python 3.13, 3.12, 3.11, 3.10 or 3.9 Resources: LambdaLayer: @@ -29,7 +29,6 @@ Resources: - python3.11 - python3.10 - python3.9 - - python3.8 LicenseInfo: 'Available under the Apache-2.0 license.' RetentionPolicy: Retain diff --git a/layer_v3/docker/Dockerfile b/layer_v3/docker/Dockerfile index b77ed7497c8..9cf1c5666f0 100644 --- a/layer_v3/docker/Dockerfile +++ b/layer_v3/docker/Dockerfile @@ -19,7 +19,7 @@ WORKDIR /tmp # PACKAGE_SUFFIX = ' @ git+https://github.com/awslabs/aws-lambda-powertools-python@develop' # PACKAGE_SUFFIX = '' -# PYTHON_VERSION = 3.8, 3.9, 3.10, 3.11, 3.12, and 3.13 +# PYTHON_VERSION = 3.9, 3.10, 3.11, 3.12, and 3.13 # Installing libs based on base image; We must use dnf for AL2023 (Python 3.12+) COPY install_libraries.sh . diff --git a/layer_v3/docker/install_libraries.sh b/layer_v3/docker/install_libraries.sh index 919a2b6f316..f233fb794f4 100644 --- a/layer_v3/docker/install_libraries.sh +++ b/layer_v3/docker/install_libraries.sh @@ -1,6 +1,6 @@ #!/bin/sh -al2_versions=("3.8" "3.9" "3.10" "3.11") +al2_versions=("3.9" "3.10" "3.11") # Flag to indicate if the version is al2 or not is_al2=0 diff --git a/layer_v3/layer/canary_stack.py b/layer_v3/layer/canary_stack.py index 5f1e87cb3c6..1f9346e9d3d 100644 --- a/layer_v3/layer/canary_stack.py +++ b/layer_v3/layer/canary_stack.py @@ -131,9 +131,7 @@ def __init__( PolicyStatement(effect=Effect.ALLOW, actions=["lambda:GetFunction"], resources=["*"]), ) - if python_version == "python3.8": - runtime = Runtime.PYTHON_3_8 - elif python_version == "python3.9": + if python_version == "python3.9": runtime = Runtime.PYTHON_3_9 elif python_version == "python3.10": runtime = Runtime.PYTHON_3_10 diff --git a/layer_v3/layer/layer_stack.py b/layer_v3/layer/layer_stack.py index 4d79507cbdf..feb8a10dc2b 100644 --- a/layer_v3/layer/layer_stack.py +++ b/layer_v3/layer/layer_stack.py @@ -83,8 +83,6 @@ def __init__( layer_name_x86_64 = f"AWSLambdaPowertoolsPythonV3-{python_version_normalized}-x86_64" layer_name_arm64 = f"AWSLambdaPowertoolsPythonV3-{python_version_normalized}-arm64" - if python_version == "python3.8": - python_version = Runtime.PYTHON_3_8 if python_version == "python3.9": python_version = Runtime.PYTHON_3_9 if python_version == "python3.10": diff --git a/layer_v3/layer_constructors/tests/unit/test_new_cdk_constructor_stack.py b/layer_v3/layer_constructors/tests/unit/test_new_cdk_constructor_stack.py index df518ca87e0..d673a8c29d8 100644 --- a/layer_v3/layer_constructors/tests/unit/test_new_cdk_constructor_stack.py +++ b/layer_v3/layer_constructors/tests/unit/test_new_cdk_constructor_stack.py @@ -25,7 +25,6 @@ def test_with_no_configuration_constructor(): @pytest.mark.parametrize( "python_version", [ - lambda_.Runtime.PYTHON_3_8, lambda_.Runtime.PYTHON_3_9, lambda_.Runtime.PYTHON_3_10, lambda_.Runtime.PYTHON_3_11, @@ -62,7 +61,6 @@ def test_with_different_python_version_x86_64(python_version): @pytest.mark.parametrize( "python_version", [ - lambda_.Runtime.PYTHON_3_8, lambda_.Runtime.PYTHON_3_9, lambda_.Runtime.PYTHON_3_10, lambda_.Runtime.PYTHON_3_11, diff --git a/layer_v3/poetry.lock b/layer_v3/poetry.lock index d54fb164c05..500adc58fea 100644 --- a/layer_v3/poetry.lock +++ b/layer_v3/poetry.lock @@ -1,37 +1,39 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. [[package]] name = "attrs" -version = "24.2.0" +version = "24.3.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, - {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, + {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, + {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "aws-cdk-asset-awscli-v1" -version = "2.2.211" +version = "2.2.220" description = "A library that contains the AWS CLI for use in Lambda Layers" optional = false python-versions = "~=3.8" +groups = ["main"] files = [ - {file = "aws_cdk.asset_awscli_v1-2.2.211-py3-none-any.whl", hash = "sha256:8237a2a2a1d38cb5982d6ec0dbf1d5c7a4b62c2071d1d058b03440b3af401076"}, - {file = "aws_cdk_asset_awscli_v1-2.2.211.tar.gz", hash = "sha256:d3fc198b4673b6c2b5978192f4b4764352bb14b5b4b85a96dedc0f47c768c2f3"}, + {file = "aws_cdk.asset_awscli_v1-2.2.220-py3-none-any.whl", hash = "sha256:aef8284470bee3e1e0b5d706961c952dba88d50981ba6a21fa8b5cb3e9c4d5b6"}, + {file = "aws_cdk_asset_awscli_v1-2.2.220.tar.gz", hash = "sha256:8e5e1290dc77b15cffe51134be0bf2b613ae8f3f9859fd4137359bbda431b0d3"}, ] [package.dependencies] -jsii = ">=1.104.0,<2.0.0" +jsii = ">=1.106.0,<2.0.0" publication = ">=0.0.3" typeguard = ">=2.13.3,<4.3.0" @@ -41,6 +43,7 @@ version = "2.1.3" description = "A Lambda Layer that contains kubectl v1.20" optional = false python-versions = "~=3.8" +groups = ["main"] files = [ {file = "aws_cdk.asset_kubectl_v20-2.1.3-py3-none-any.whl", hash = "sha256:d5612e5bd03c215a28ce53193b1144ecf4e93b3b6779563c046a8a74d83a3979"}, {file = "aws_cdk_asset_kubectl_v20-2.1.3.tar.gz", hash = "sha256:237cd8530d9e8be0bbc7159af927dbb6b7f91bf3f4099c8ef4d9a213b34264be"}, @@ -57,6 +60,7 @@ version = "2.1.0" description = "@aws-cdk/asset-node-proxy-agent-v6" optional = false python-versions = "~=3.8" +groups = ["main"] files = [ {file = "aws_cdk.asset_node_proxy_agent_v6-2.1.0-py3-none-any.whl", hash = "sha256:24a388b69a44d03bae6dbf864c4e25ba650d4b61c008b4568b94ffbb9a69e40e"}, {file = "aws_cdk_asset_node_proxy_agent_v6-2.1.0.tar.gz", hash = "sha256:1f292c0631f86708ba4ee328b3a2b229f7e46ea1c79fbde567ee9eb119c2b0e2"}, @@ -69,36 +73,38 @@ typeguard = ">=2.13.3,<5.0.0" [[package]] name = "aws-cdk-cloud-assembly-schema" -version = "38.0.1" +version = "39.2.2" description = "Cloud Assembly Schema" optional = false python-versions = "~=3.8" +groups = ["main"] files = [ - {file = "aws_cdk.cloud_assembly_schema-38.0.1-py3-none-any.whl", hash = "sha256:92613b46213b460681e9424f09b77f06ff059eb1c773092540364ef82fcecf55"}, - {file = "aws_cdk_cloud_assembly_schema-38.0.1.tar.gz", hash = "sha256:7c75861adc41f7b959910d4b3b191ea242815402e599dbfa31934892838ae25e"}, + {file = "aws_cdk.cloud_assembly_schema-39.2.2-py3-none-any.whl", hash = "sha256:c2f10edd7765a4ff0e28508c5e63798c3f89699242a4755d1984472acf6acaf2"}, + {file = "aws_cdk_cloud_assembly_schema-39.2.2.tar.gz", hash = "sha256:ae2140bc3ffbc306d8e931d5a70bc5c573b1e047838d29d8e7d13dfa97ea4ea8"}, ] [package.dependencies] -jsii = ">=1.103.1,<2.0.0" +jsii = ">=1.106.0,<2.0.0" publication = ">=0.0.3" -typeguard = ">=2.13.3,<5.0.0" +typeguard = ">=2.13.3,<4.3.0" [[package]] name = "aws-cdk-lib" -version = "2.167.0" +version = "2.176.0" description = "Version 2 of the AWS Cloud Development Kit library" optional = false python-versions = "~=3.8" +groups = ["main"] files = [ - {file = "aws_cdk_lib-2.167.0-py3-none-any.whl", hash = "sha256:0af251de961332ab0a54c0c1b31d1cc26677ddd6be7b5f94ee38477a0b541cc4"}, - {file = "aws_cdk_lib-2.167.0.tar.gz", hash = "sha256:2873d1285ce6ceae810783db16d1a9f6533604b995237da05bdc5ba69b9af5f5"}, + {file = "aws_cdk_lib-2.176.0-py3-none-any.whl", hash = "sha256:c362a92f06b6ea60a7eff7994d3994c462358e7a95ce3de01a28efab4f6d56b6"}, + {file = "aws_cdk_lib-2.176.0.tar.gz", hash = "sha256:87a39d2f42fd2ea8ba2bfa364355303953fb5cc2886479ca5acf09a14a9fd679"}, ] [package.dependencies] "aws-cdk.asset-awscli-v1" = ">=2.2.208,<3.0.0" "aws-cdk.asset-kubectl-v20" = ">=2.1.3,<3.0.0" "aws-cdk.asset-node-proxy-agent-v6" = ">=2.1.0,<3.0.0" -"aws-cdk.cloud-assembly-schema" = ">=38.0.1,<39.0.0" +"aws-cdk.cloud-assembly-schema" = ">=39.0.1,<40.0.0" constructs = ">=10.0.0,<11.0.0" jsii = ">=1.104.0,<2.0.0" publication = ">=0.0.3" @@ -106,32 +112,34 @@ typeguard = ">=2.13.3,<4.3.0" [[package]] name = "boto3" -version = "1.35.60" +version = "1.36.3" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "boto3-1.35.60-py3-none-any.whl", hash = "sha256:a34d28de1a1f6ca6ec3edd05c26db16e422293d8f9dcd94f308059a434596753"}, - {file = "boto3-1.35.60.tar.gz", hash = "sha256:e573504c67c3e438fd4b0222119ed1a73b644c78eb3b6dee0b36a6c70ecf7677"}, + {file = "boto3-1.36.3-py3-none-any.whl", hash = "sha256:f9843a5d06f501d66ada06f5a5417f671823af2cf319e36ceefa1bafaaaaa953"}, + {file = "boto3-1.36.3.tar.gz", hash = "sha256:53a5307f6a3526ee2f8590e3c45efa504a3ea4532c1bfe4926c0c19bf188d141"}, ] [package.dependencies] -botocore = ">=1.35.60,<1.36.0" +botocore = ">=1.36.3,<1.37.0" jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.10.0,<0.11.0" +s3transfer = ">=0.11.0,<0.12.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.35.60" +version = "1.36.3" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "botocore-1.35.60-py3-none-any.whl", hash = "sha256:ddccfc39a0a55ac0321191a36d29c2ea9be2c96ceefb3928dd3c91c79c494d50"}, - {file = "botocore-1.35.60.tar.gz", hash = "sha256:378f53037d817bed2c04a006b7319745e664030182211429c924647273b29bc9"}, + {file = "botocore-1.36.3-py3-none-any.whl", hash = "sha256:536ab828e6f90dbb000e3702ac45fd76642113ae2db1b7b1373ad24104e89255"}, + {file = "botocore-1.36.3.tar.gz", hash = "sha256:775b835e979da5c96548ed1a0b798101a145aec3cd46541d62e27dda5a94d7f8"}, ] [package.dependencies] @@ -143,7 +151,7 @@ urllib3 = [ ] [package.extras] -crt = ["awscrt (==0.22.0)"] +crt = ["awscrt (==0.23.4)"] [[package]] name = "cattrs" @@ -151,6 +159,7 @@ version = "24.1.2" description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, @@ -177,6 +186,8 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] +markers = "sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -188,6 +199,7 @@ version = "10.4.2" description = "A programming model for software-defined state" optional = false python-versions = "~=3.8" +groups = ["main"] files = [ {file = "constructs-10.4.2-py3-none-any.whl", hash = "sha256:1f0f59b004edebfde0f826340698b8c34611f57848139b7954904c61645f13c1"}, {file = "constructs-10.4.2.tar.gz", hash = "sha256:ce54724360fffe10bab27d8a081844eb81f5ace7d7c62c84b719c49f164d5307"}, @@ -204,6 +216,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -214,13 +228,14 @@ test = ["pytest (>=6)"] [[package]] name = "importlib-resources" -version = "6.4.5" +version = "6.5.2" description = "Read resources from Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, - {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, + {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, + {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, ] [package.dependencies] @@ -240,6 +255,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -251,6 +267,7 @@ version = "1.0.1" description = "JSON Matching Expressions" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, @@ -258,13 +275,14 @@ files = [ [[package]] name = "jsii" -version = "1.104.0" +version = "1.106.0" description = "Python client for jsii runtime" optional = false python-versions = "~=3.8" +groups = ["main"] files = [ - {file = "jsii-1.104.0-py3-none-any.whl", hash = "sha256:c1da4d21be208db7dd341bc8fd9c4cdbaa5ff1a3cec7ce4f5f4e3ce89bc949cc"}, - {file = "jsii-1.104.0.tar.gz", hash = "sha256:1e9b3e49797450258d473c16052258f2291bde4dd410d30c21e325c000c10a0c"}, + {file = "jsii-1.106.0-py3-none-any.whl", hash = "sha256:5a44d7c3a5a326fa3d9befdb3770b380057e0a61e3804e7c4907f70d76afaaa2"}, + {file = "jsii-1.106.0.tar.gz", hash = "sha256:c79c47899f53a7c3c4b20f80d3cd306628fe9ed1852eee970324c71eba1d974e"}, ] [package.dependencies] @@ -273,7 +291,7 @@ cattrs = ">=1.8,<24.2" importlib-resources = ">=5.2.0" publication = ">=0.0.3" python-dateutil = "*" -typeguard = ">=2.13.3,<4.3.0" +typeguard = ">=2.13.3,<4.5.0" typing-extensions = ">=3.8,<5.0" [[package]] @@ -282,6 +300,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -293,6 +312,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -308,6 +328,7 @@ version = "0.0.3" description = "Publication helps you maintain public-api-friendly modules by preventing unintentional access to private implementation details via introspection." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "publication-0.0.3-py2.py3-none-any.whl", hash = "sha256:0248885351febc11d8a1098d5c8e3ab2dabcf3e8c0c96db1e17ecd12b53afbe6"}, {file = "publication-0.0.3.tar.gz", hash = "sha256:68416a0de76dddcdd2930d1c8ef853a743cc96c82416c4e4d3b5d901c6276dc4"}, @@ -319,6 +340,7 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -341,6 +363,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -351,41 +374,75 @@ six = ">=1.5" [[package]] name = "s3transfer" -version = "0.10.3" +version = "0.11.1" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "s3transfer-0.10.3-py3-none-any.whl", hash = "sha256:263ed587a5803c6c708d3ce44dc4dfedaab4c1a32e8329bab818933d79ddcf5d"}, - {file = "s3transfer-0.10.3.tar.gz", hash = "sha256:4f50ed74ab84d474ce614475e0b8d5047ff080810aac5d01ea25231cfc944b0c"}, + {file = "s3transfer-0.11.1-py3-none-any.whl", hash = "sha256:8fa0aa48177be1f3425176dfe1ab85dcd3d962df603c3dbfc585e6bf857ef0ff"}, + {file = "s3transfer-0.11.1.tar.gz", hash = "sha256:3f25c900a367c8b7f7d8f9c34edc87e300bde424f779dc9f0a8ae4f9df9264f6"}, ] [package.dependencies] -botocore = ">=1.33.2,<2.0a.0" +botocore = ">=1.36.0,<2.0a.0" [package.extras] -crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] +crt = ["botocore[crt] (>=1.36.0,<2.0a.0)"] [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] name = "tomli" -version = "2.1.0" +version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version < \"3.11\"" files = [ - {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, - {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] @@ -394,6 +451,7 @@ version = "2.13.3" description = "Run-time type checker for Python" optional = false python-versions = ">=3.5.3" +groups = ["main"] files = [ {file = "typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1"}, {file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"}, @@ -409,6 +467,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -420,6 +479,8 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["dev"] +markers = "python_version < \"3.10\"" files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, @@ -432,13 +493,15 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "urllib3" -version = "2.2.3" +version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["dev"] +markers = "python_version >= \"3.10\"" files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] @@ -449,13 +512,15 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "zipp" -version = "3.20.2" +version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version < \"3.10\"" files = [ - {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, - {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] @@ -467,6 +532,6 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", type = ["pytest-mypy"] [metadata] -lock-version = "2.0" -python-versions = "^3.8" -content-hash = "464e9008c513dc7aabd5e5285358b4447f791c62668f713c2fc7a5e71b494fd5" +lock-version = "2.1" +python-versions = "^3.9" +content-hash = "39b7fd578888d8083580e1a0ec2fe0b944342d8bef111661001243bb3e393b8b" diff --git a/layer_v3/pyproject.toml b/layer_v3/pyproject.toml index 30a148bc76e..075fcac3d0d 100644 --- a/layer_v3/pyproject.toml +++ b/layer_v3/pyproject.toml @@ -3,10 +3,11 @@ name = "aws-lambda-powertools-python-layer" version = "3.0.0" description = "Powertools for AWS Lambda (Python) Lambda Layers" authors = ["Powertools for AWS Maintainers "] +package-mode = false license = "MIT" [tool.poetry.dependencies] -python = "^3.8" +python = "^3.9" aws-cdk-lib = "^2.167.0" [tool.poetry.dev-dependencies] diff --git a/poetry.lock b/poetry.lock index 902a64f0b23..07a924bee40 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. [[package]] name = "annotated-types" @@ -6,34 +6,34 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] - -[package.dependencies] -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} +markers = {main = "extra == \"parser\" or extra == \"all\""} [[package]] name = "anyio" -version = "4.5.2" +version = "4.8.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f"}, - {file = "anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b"}, + {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, + {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, ] [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] trio = ["trio (>=0.26.1)"] [[package]] @@ -42,6 +42,7 @@ version = "3.5.3" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "argcomplete-3.5.3-py3-none-any.whl", hash = "sha256:2ab2c4a215c59fd6caaff41a869480a23e8f6a5f910b266c1808037f4e375b61"}, {file = "argcomplete-3.5.3.tar.gz", hash = "sha256:c12bf50eded8aebb298c7b7da7a5ff3ee24dffd9f5281867dfe1424b58c55392"}, @@ -56,10 +57,12 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] +markers = {main = "extra == \"redis\" and python_full_version < \"3.11.3\"", dev = "python_full_version < \"3.11.3\""} [[package]] name = "attrs" @@ -67,10 +70,12 @@ version = "24.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] +markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] @@ -86,6 +91,7 @@ version = "2.2.220" description = "A library that contains the AWS CLI for use in Lambda Layers" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.asset_awscli_v1-2.2.220-py3-none-any.whl", hash = "sha256:aef8284470bee3e1e0b5d706961c952dba88d50981ba6a21fa8b5cb3e9c4d5b6"}, {file = "aws_cdk_asset_awscli_v1-2.2.220.tar.gz", hash = "sha256:8e5e1290dc77b15cffe51134be0bf2b613ae8f3f9859fd4137359bbda431b0d3"}, @@ -102,6 +108,7 @@ version = "2.1.3" description = "A Lambda Layer that contains kubectl v1.20" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.asset_kubectl_v20-2.1.3-py3-none-any.whl", hash = "sha256:d5612e5bd03c215a28ce53193b1144ecf4e93b3b6779563c046a8a74d83a3979"}, {file = "aws_cdk_asset_kubectl_v20-2.1.3.tar.gz", hash = "sha256:237cd8530d9e8be0bbc7159af927dbb6b7f91bf3f4099c8ef4d9a213b34264be"}, @@ -118,6 +125,7 @@ version = "2.1.0" description = "@aws-cdk/asset-node-proxy-agent-v6" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.asset_node_proxy_agent_v6-2.1.0-py3-none-any.whl", hash = "sha256:24a388b69a44d03bae6dbf864c4e25ba650d4b61c008b4568b94ffbb9a69e40e"}, {file = "aws_cdk_asset_node_proxy_agent_v6-2.1.0.tar.gz", hash = "sha256:1f292c0631f86708ba4ee328b3a2b229f7e46ea1c79fbde567ee9eb119c2b0e2"}, @@ -134,6 +142,7 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-alpha-2.114.1a0.tar.gz", hash = "sha256:9e8c3131f4fa3e0926eb3d76aeacd578a6aa51f95b39c10a86112c991bb75864"}, {file = "aws_cdk.aws_apigatewayv2_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:a101ce56d846976ad1c8020054dfe73fd9f45afdbe71f2a297acc84c1a201403"}, @@ -152,6 +161,7 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-authorizers" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-authorizers-alpha-2.114.1a0.tar.gz", hash = "sha256:ee290e2ed0f1506dbbb12b3b8963f50b379121759077002c265977fbaf18fd9f"}, {file = "aws_cdk.aws_apigatewayv2_authorizers_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:2576e1ce06dab314020bff50f5d59b8715a7adf18106eac811028c22f61c9baa"}, @@ -171,6 +181,7 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-integrations" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-integrations-alpha-2.114.1a0.tar.gz", hash = "sha256:19e1824b577683e7d3c2b01fd58c176ebe4c7b8d1b4af4cfdc3893d3ffbac9af"}, {file = "aws_cdk.aws_apigatewayv2_integrations_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:1e440a70e6b4cbe077c95ffdd3fd0cfb3962f90762ea2e973eaa2ab7719ccb2c"}, @@ -190,6 +201,7 @@ version = "2.59.0a0" description = "The CDK Construct Library for AWS::AppSync" optional = false python-versions = "~=3.7" +groups = ["dev"] files = [ {file = "aws-cdk.aws-appsync-alpha-2.59.0a0.tar.gz", hash = "sha256:f5c7773b70b759efd576561dc3d71af5762a6f7cbc9ee9eef5e538c7ab3dccc7"}, {file = "aws_cdk.aws_appsync_alpha-2.59.0a0-py3-none-any.whl", hash = "sha256:ecc235f1f70d404c8d03cf250be0227becd14c468f8c43b6d9df334a1d60c8e2"}, @@ -208,6 +220,7 @@ version = "2.176.0a0" description = "The CDK Construct Library for AWS Lambda in Python" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.aws_lambda_python_alpha-2.176.0a0-py3-none-any.whl", hash = "sha256:d7a9223393b815e9b2d2e69f06c216b8e12e577f8ab58aeb56cb05c92de7f7bb"}, {file = "aws_cdk_aws_lambda_python_alpha-2.176.0a0.tar.gz", hash = "sha256:0a2737e098e88a553a284f688c7621067cebf32ba21ad3e8e7911bb70ce67049"}, @@ -222,13 +235,14 @@ typeguard = ">=2.13.3,<4.3.0" [[package]] name = "aws-cdk-cloud-assembly-schema" -version = "39.2.2" +version = "39.2.3" description = "Cloud Assembly Schema" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ - {file = "aws_cdk.cloud_assembly_schema-39.2.2-py3-none-any.whl", hash = "sha256:c2f10edd7765a4ff0e28508c5e63798c3f89699242a4755d1984472acf6acaf2"}, - {file = "aws_cdk_cloud_assembly_schema-39.2.2.tar.gz", hash = "sha256:ae2140bc3ffbc306d8e931d5a70bc5c573b1e047838d29d8e7d13dfa97ea4ea8"}, + {file = "aws_cdk.cloud_assembly_schema-39.2.3-py3-none-any.whl", hash = "sha256:50df7151a131b82c9a7ab8ab9c9a2780a712e774f5418c86d1d27e13051dac17"}, + {file = "aws_cdk_cloud_assembly_schema-39.2.3.tar.gz", hash = "sha256:c809a4a92f0c2f92318cf1a6541f83ecd43d99dbad648f1160943209af8fbdbb"}, ] [package.dependencies] @@ -242,6 +256,7 @@ version = "2.176.0" description = "Version 2 of the AWS Cloud Development Kit library" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk_lib-2.176.0-py3-none-any.whl", hash = "sha256:c362a92f06b6ea60a7eff7994d3994c462358e7a95ce3de01a28efab4f6d56b6"}, {file = "aws_cdk_lib-2.176.0.tar.gz", hash = "sha256:87a39d2f42fd2ea8ba2bfa364355303953fb5cc2886479ca5acf09a14a9fd679"}, @@ -263,6 +278,8 @@ version = "4.0.0" description = "AWS Encryption SDK implementation for Python" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "aws-encryption-sdk-4.0.0.tar.gz", hash = "sha256:57df8b5c1b9f18db4373c6e8e65563791063a71be93d0849950ed365272db354"}, {file = "aws_encryption_sdk-4.0.0-py2.py3-none-any.whl", hash = "sha256:a94483785dff2cd166ccb8f3a15cdfe5cba7a3717f6604543c816a3a32f7c412"}, @@ -283,6 +300,7 @@ version = "0.4.3" description = "AWS signature version 4 signing process for the python requests module" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "aws-requests-auth-0.4.3.tar.gz", hash = "sha256:33593372018b960a31dbbe236f89421678b885c35f0b6a7abfae35bb77e069b2"}, {file = "aws_requests_auth-0.4.3-py2.py3-none-any.whl", hash = "sha256:646bc37d62140ea1c709d20148f5d43197e6bd2d63909eb36fa4bb2345759977"}, @@ -297,6 +315,7 @@ version = "1.94.0" description = "AWS SAM Translator is a library that transform SAM templates into AWS CloudFormation templates" optional = false python-versions = "!=4.0,<=4.0,>=3.8" +groups = ["dev"] files = [ {file = "aws_sam_translator-1.94.0-py3-none-any.whl", hash = "sha256:100e33eeffcfa81f7c45cadeb0ee29596ce829f6b4d2745140f04fa19a41f539"}, {file = "aws_sam_translator-1.94.0.tar.gz", hash = "sha256:8ec258d9f7ece72ef91c81f4edb45a2db064c16844b6afac90c575893beaa391"}, @@ -317,6 +336,8 @@ version = "2.14.0" description = "The AWS X-Ray SDK for Python (the SDK) enables Python developers to record and emit information from within their applications to the AWS X-Ray service." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"tracer\" or extra == \"all\"" files = [ {file = "aws_xray_sdk-2.14.0-py2.py3-none-any.whl", hash = "sha256:cfbe6feea3d26613a2a869d14c9246a844285c97087ad8f296f901633554ad94"}, {file = "aws_xray_sdk-2.14.0.tar.gz", hash = "sha256:aab843c331af9ab9ba5cefb3a303832a19db186140894a523edafc024cc0493c"}, @@ -332,26 +353,25 @@ version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] -[package.dependencies] -pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} - [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "bandit" -version = "1.7.10" +version = "1.8.2" description = "Security oriented static analyser for python code." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "bandit-1.7.10-py3-none-any.whl", hash = "sha256:665721d7bebbb4485a339c55161ac0eedde27d51e638000d91c8c2d68343ad02"}, - {file = "bandit-1.7.10.tar.gz", hash = "sha256:59ed5caf5d92b6ada4bf65bc6437feea4a9da1093384445fed4d472acc6cff7b"}, + {file = "bandit-1.8.2-py3-none-any.whl", hash = "sha256:df6146ad73dd30e8cbda4e29689ddda48364e36ff655dbfc86998401fcf1721f"}, + {file = "bandit-1.8.2.tar.gz", hash = "sha256:e00ad5a6bc676c0954669fe13818024d66b70e42cf5adb971480cf3b671e835f"}, ] [package.dependencies] @@ -369,33 +389,34 @@ yaml = ["PyYAML"] [[package]] name = "black" -version = "24.8.0" +version = "24.10.0" description = "The uncompromising code formatter." optional = false -python-versions = ">=3.8" -files = [ - {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, - {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, - {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, - {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, - {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, - {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, - {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, - {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, - {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, - {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, - {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, - {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, - {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, - {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, - {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, - {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, - {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, - {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, - {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, - {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, - {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, - {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, + {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, + {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, + {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, + {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, + {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, + {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, + {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, + {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, + {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, + {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, + {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, + {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, + {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, + {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, + {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, + {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, + {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, + {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, + {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, + {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, + {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, ] [package.dependencies] @@ -409,7 +430,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -419,6 +440,7 @@ version = "1.36.4" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "boto3-1.36.4-py3-none-any.whl", hash = "sha256:9f8f699e75ec63fcc98c4dd7290997c7c06c68d3ac8161ad4735fe71f5fe945c"}, {file = "boto3-1.36.4.tar.gz", hash = "sha256:eeceeb74ef8b65634d358c27aa074917f4449dc828f79301f1075232618eb502"}, @@ -438,6 +460,7 @@ version = "1.36.4" description = "Type annotations for boto3 1.36.4 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "boto3_stubs-1.36.4-py3-none-any.whl", hash = "sha256:3d4e9a8a4d7163bcdb6514b92e901706ce4f522dc8aeab8b4e157fa9e0138e49"}, {file = "boto3_stubs-1.36.4.tar.gz", hash = "sha256:36db2481d1a0291a2c05c30756fd83514c8d461f8dbc2915cb0c7cf06dc9ed70"}, @@ -874,6 +897,7 @@ version = "1.36.4" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "botocore-1.36.4-py3-none-any.whl", hash = "sha256:3f183aa7bb0c1ba02171143a05f28a4438abdf89dd6b8c0a7727040375a90520"}, {file = "botocore-1.36.4.tar.gz", hash = "sha256:ef54f5e3316040b6ff775941e6ed052c3230dda0079d17d9f9e3c757375f2027"}, @@ -883,8 +907,8 @@ files = [ jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ - {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, + {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, ] [package.extras] @@ -896,6 +920,7 @@ version = "1.36.4" description = "Type annotations and code completion for botocore" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "botocore_stubs-1.36.4-py3-none-any.whl", hash = "sha256:bbbd1b061b68bdc6d474ad9dfbf7f56386f416b297862347ae735f2272a78e4b"}, {file = "botocore_stubs-1.36.4.tar.gz", hash = "sha256:cc1677029f32d98c9e080885e2098424fd6afd41d6d3380f96d42c29e73e30b5"}, @@ -913,6 +938,8 @@ version = "0.16.1" description = "Python module to generate and modify bytecode" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "bytecode-0.16.1-py3-none-any.whl", hash = "sha256:1d4b61ed6bade4bff44127c8283bef8131a664ce4dbe09d64a88caf329939f35"}, {file = "bytecode-0.16.1.tar.gz", hash = "sha256:8fbbb637c880f339e564858bc6c7984ede67ae97bc71343379a535a9a4baf398"}, @@ -927,6 +954,7 @@ version = "24.1.2" description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, @@ -949,19 +977,20 @@ ujson = ["ujson (>=5.7.0)"] [[package]] name = "cdk-nag" -version = "2.34.23" +version = "2.34.24" description = "Check CDK v2 applications for best practices using a combination on available rule packs." optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ - {file = "cdk_nag-2.34.23-py3-none-any.whl", hash = "sha256:e5f0ebb366d3fc6fa9124da94fb890a682eb5db69db70bbed6f44ebf0886427a"}, - {file = "cdk_nag-2.34.23.tar.gz", hash = "sha256:ef7b1414e7ff6d14723d239beaea46ef4ddab32a28d802e7daa18d9677df80a1"}, + {file = "cdk_nag-2.34.24-py3-none-any.whl", hash = "sha256:9cafae19bfa8386e3a27f4c00f5a628714eb7cf82eb0ca6e41d8647b756f433b"}, + {file = "cdk_nag-2.34.24.tar.gz", hash = "sha256:6c332ce7e0b2882af9740b6eab132943112e8e059a7dc5cf36d644fc97ed8f17"}, ] [package.dependencies] aws-cdk-lib = ">=2.156.0,<3.0.0" constructs = ">=10.0.5,<11.0.0" -jsii = ">=1.105.0,<2.0.0" +jsii = ">=1.106.0,<2.0.0" publication = ">=0.0.3" typeguard = ">=2.13.3,<4.3.0" @@ -971,6 +1000,7 @@ version = "0.1.289" description = "AWS Generative AI CDK Constructs is a library for well-architected generative AI patterns." optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "cdklabs.generative_ai_cdk_constructs-0.1.289-py3-none-any.whl", hash = "sha256:66d7be4f3c2700436720786cee4809a3774328305f5aa2939e2c01fd6ab83acb"}, {file = "cdklabs_generative_ai_cdk_constructs-0.1.289.tar.gz", hash = "sha256:82addba364c18fbc5acc7e12a0372f37c4855b7b53517d2fe8bd4b3fc8e945d8"}, @@ -990,6 +1020,7 @@ version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, @@ -1001,6 +1032,7 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -1070,6 +1102,7 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] +markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = "*" @@ -1080,6 +1113,7 @@ version = "1.22.6" description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cfn_lint-1.22.6-py3-none-any.whl", hash = "sha256:70e8cc71ed12608964bdc1749c48140164d1fd65c30f3a5eaff4f9ee3396d908"}, {file = "cfn_lint-1.22.6.tar.gz", hash = "sha256:0652daf9e86d823f6513d430d233682b940806b6aad74cba2e4dc07de9603d84"}, @@ -1106,6 +1140,7 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -1207,6 +1242,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -1221,6 +1257,7 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -1232,6 +1269,7 @@ version = "6.9.0" description = "Add colours to the output of Python's logging module." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff"}, {file = "colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2"}, @@ -1249,6 +1287,7 @@ version = "10.4.2" description = "A programming model for software-defined state" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "constructs-10.4.2-py3-none-any.whl", hash = "sha256:1f0f59b004edebfde0f826340698b8c34611f57848139b7954904c61645f13c1"}, {file = "constructs-10.4.2.tar.gz", hash = "sha256:ce54724360fffe10bab27d8a081844eb81f5ace7d7c62c84b719c49f164d5307"}, @@ -1261,83 +1300,74 @@ typeguard = ">=2.13.3,<2.14.0" [[package]] name = "coverage" -version = "7.6.1" +version = "7.6.10" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.8" -files = [ - {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, - {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, - {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, - {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, - {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, - {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, - {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, - {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, - {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, - {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, - {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, - {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, - {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, - {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, - {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, - {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, - {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, + {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5"}, + {file = "coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244"}, + {file = "coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e"}, + {file = "coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3"}, + {file = "coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377"}, + {file = "coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8"}, + {file = "coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609"}, + {file = "coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853"}, + {file = "coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852"}, + {file = "coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359"}, + {file = "coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247"}, + {file = "coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9"}, + {file = "coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694"}, + {file = "coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6"}, + {file = "coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e"}, + {file = "coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe"}, + {file = "coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2"}, + {file = "coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312"}, + {file = "coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d"}, + {file = "coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a"}, + {file = "coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d"}, + {file = "coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18"}, + {file = "coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59"}, + {file = "coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f"}, + {file = "coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23"}, ] [package.dependencies] @@ -1352,6 +1382,7 @@ version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -1381,6 +1412,7 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] +markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1401,6 +1433,8 @@ version = "0.50.2" description = "The Datadog Python library" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "datadog-0.50.2-py2.py3-none-any.whl", hash = "sha256:f3297858564b624efbd9ce43e4ea1c2c21e1f0477ab6d446060b536a1d9e431e"}, {file = "datadog-0.50.2.tar.gz", hash = "sha256:17725774bf2bb0a48f1d096d92707492c187f24ae08960af0b0c2fa97958fd51"}, @@ -1415,6 +1449,8 @@ version = "6.104.0" description = "The Datadog AWS Lambda Library" optional = true python-versions = "<4,>=3.8.0" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "datadog_lambda-6.104.0-py3-none-any.whl", hash = "sha256:72092f9057764515ef1e2fdf1cf25f82bfa70296411af9121db896e4a35fdf6e"}, {file = "datadog_lambda-6.104.0.tar.gz", hash = "sha256:eeb2ff0e4387812e7caf17e501d93fea3d85e3f9bb79581fb37556580d5a1c46"}, @@ -1435,6 +1471,8 @@ version = "2.19.1" description = "Datadog APM client library" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "ddtrace-2.19.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:c6bc63fcc10c3128c91d245c5e677fd204ff10e67c3c75d26f28d34b6436bd15"}, {file = "ddtrace-2.19.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:a8a5f66e2cfce6868a625efb9e1954bc08b484e9edb67fc2d051c6a05c991bf7"}, @@ -1508,10 +1546,10 @@ files = [ [package.dependencies] bytecode = [ + {version = ">=0.13.0", markers = "python_version < \"3.11.0\""}, {version = ">=0.16.0", markers = "python_version >= \"3.13.0\""}, {version = ">=0.15.0", markers = "python_version ~= \"3.12.0\""}, {version = ">=0.14.0", markers = "python_version ~= \"3.11.0\""}, - {version = ">=0.13.0", markers = "python_version < \"3.11.0\""}, ] envier = ">=0.5,<1.0" legacy-cgi = {version = ">=2.0.0", markers = "python_version >= \"3.13.0\""} @@ -1531,6 +1569,7 @@ version = "5.1.1" description = "Decorators for Humans" optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -1542,6 +1581,8 @@ version = "1.2.15" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320"}, {file = "deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"}, @@ -1559,6 +1600,7 @@ version = "2.1.0" description = "A library to handle automated deprecations" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, @@ -1573,6 +1615,7 @@ version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -1588,6 +1631,7 @@ version = "0.5.0" description = "Python module and CLI for hashing of file system directories." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "dirhash-0.5.0-py3-none-any.whl", hash = "sha256:523dfd6b058c64f45b31604376926c6e2bd2ea301d0df23095d4055674e38b09"}, {file = "dirhash-0.5.0.tar.gz", hash = "sha256:e60760f0ab2e935d8cb088923ea2c6492398dca42cec785df778985fd4cd5386"}, @@ -1602,6 +1646,7 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -1613,6 +1658,7 @@ version = "7.1.0" description = "A Python library for the Docker Engine API." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"}, {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"}, @@ -1635,6 +1681,8 @@ version = "0.6.1" description = "Python application configuration via the environment" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "envier-0.6.1-py3-none-any.whl", hash = "sha256:73609040a76be48bbcb97074d9969666484aa0de706183a6e9ef773156a8a6a9"}, {file = "envier-0.6.1.tar.gz", hash = "sha256:3309a01bb3d8850c9e7a31a5166d5a836846db2faecb79b9cb32654dd50ca9f9"}, @@ -1649,6 +1697,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1663,6 +1713,7 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1677,6 +1728,8 @@ version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"validation\" or extra == \"all\"" files = [ {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, @@ -1687,18 +1740,19 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.16.1" +version = "3.17.0" description = "A platform independent file lock." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, - {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, + {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"}, + {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"}, ] [package.extras] -docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] typing = ["typing-extensions (>=4.12.2)"] [[package]] @@ -1707,6 +1761,7 @@ version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, @@ -1724,6 +1779,7 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1738,6 +1794,7 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1756,6 +1813,7 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -1767,6 +1825,7 @@ version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, @@ -1788,6 +1847,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1812,6 +1872,7 @@ version = "2.3.0" description = "HashiCorp Vault API client" optional = false python-versions = "<4.0,>=3.8" +groups = ["dev"] files = [ {file = "hvac-2.3.0-py3-none-any.whl", hash = "sha256:a3afc5710760b6ee9b3571769df87a0333da45da05a5f9f963e1d3925a84be7d"}, {file = "hvac-2.3.0.tar.gz", hash = "sha256:1b85e3320e8642dd82f234db63253cda169a817589e823713dc5fca83119b1e2"}, @@ -1829,6 +1890,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1843,6 +1905,7 @@ version = "3.3.0" description = "Iterative JSON parser with standard Python iterator interfaces" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7f7a5250599c366369fbf3bc4e176f5daa28eb6bc7d6130d02462ed335361675"}, {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f87a7e52f79059f9c58f6886c262061065eb6f7554a587be7ed3aa63e6b71b34"}, @@ -1942,13 +2005,14 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.5.0" +version = "8.6.1" description = "Read metadata from Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, - {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, + {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, + {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, ] [package.dependencies] @@ -1960,18 +2024,19 @@ cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] [[package]] name = "importlib-resources" -version = "6.4.5" +version = "6.5.2" description = "Read resources from Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, - {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, + {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, + {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, ] [package.dependencies] @@ -1991,6 +2056,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -2002,6 +2068,7 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -2016,6 +2083,7 @@ version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -2033,6 +2101,7 @@ version = "1.0.1" description = "JSON Matching Expressions" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, @@ -2044,6 +2113,7 @@ version = "1.106.0" description = "Python client for jsii runtime" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "jsii-1.106.0-py3-none-any.whl", hash = "sha256:5a44d7c3a5a326fa3d9befdb3770b380057e0a61e3804e7c4907f70d76afaaa2"}, {file = "jsii-1.106.0.tar.gz", hash = "sha256:c79c47899f53a7c3c4b20f80d3cd306628fe9ed1852eee970324c71eba1d974e"}, @@ -2064,6 +2134,7 @@ version = "1.33" description = "Apply JSON-Patches (RFC 6902)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +groups = ["dev"] files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, @@ -2078,10 +2149,10 @@ version = "1.7.0" description = "A final implementation of JSONPath for Python that aims to be standard compliant, including arithmetic and binary comparison operators and providing clear AST for metaprogramming." optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, - {file = "jsonpath_ng-1.7.0-py2-none-any.whl", hash = "sha256:898c93fc173f0c336784a3fa63d7434297544b7198124a68f9a3ef9597b0ae6e"}, - {file = "jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6"}, ] [package.dependencies] @@ -2093,6 +2164,7 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -2104,6 +2176,7 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -2111,9 +2184,7 @@ files = [ [package.dependencies] attrs = ">=22.2.0" -importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} jsonschema-specifications = ">=2023.03.6" -pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} referencing = ">=0.28.4" rpds-py = ">=0.7.1" @@ -2123,17 +2194,17 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2023.12.1" +version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, ] [package.dependencies] -importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} referencing = ">=0.31.0" [[package]] @@ -2142,6 +2213,8 @@ version = "2.6.2" description = "Fork of the standard library cgi and cgitb modules, being deprecated in PEP-594" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"datadog\" and python_version >= \"3.13.0\"" files = [ {file = "legacy_cgi-2.6.2-py3-none-any.whl", hash = "sha256:a7b83afb1baf6ebeb56522537c5943ef9813cf933f6715e88a803f7edbce0bff"}, {file = "legacy_cgi-2.6.2.tar.gz", hash = "sha256:9952471ceb304043b104c22d00b4f333cac27a6abe446d8a528fc437cf13c85f"}, @@ -2153,6 +2226,7 @@ version = "1.3.8" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "Mako-1.3.8-py3-none-any.whl", hash = "sha256:42f48953c7eb91332040ff567eb7eea69b22e7a4affbc5ba8e845e8f730f6627"}, {file = "mako-1.3.8.tar.gz", hash = "sha256:577b97e414580d3e088d47c2dbbe9594aa7a5146ed2875d4dfa9075af2dd3cc8"}, @@ -2172,6 +2246,7 @@ version = "0.7.1" description = "Create Python CLI apps with little to no effort at all!" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "mando-0.7.1-py2.py3-none-any.whl", hash = "sha256:26ef1d70928b6057ee3ca12583d73c63e05c49de8972d620c278a7b206581a8a"}, {file = "mando-0.7.1.tar.gz", hash = "sha256:18baa999b4b613faefb00eac4efadcf14f510b59b924b66e08289aa1de8c3500"}, @@ -2189,6 +2264,7 @@ version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, @@ -2207,6 +2283,7 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -2227,71 +2304,73 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] @@ -2300,6 +2379,7 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -2311,6 +2391,7 @@ version = "1.3.4" description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -2322,6 +2403,7 @@ version = "2.1.3" description = "Manage multiple versions of your MkDocs-powered documentation" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "mike-2.1.3-py3-none-any.whl", hash = "sha256:d90c64077e84f06272437b464735130d380703a76a5738b152932884c60c062a"}, {file = "mike-2.1.3.tar.gz", hash = "sha256:abd79b8ea483fb0275b7972825d3082e5ae67a41820f8d8a0dc7a3f49944e810"}, @@ -2347,6 +2429,7 @@ version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, @@ -2378,6 +2461,7 @@ version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, @@ -2395,6 +2479,7 @@ version = "0.3.2" description = "MkDocs plugin for setting revision date from git per markdown file." optional = false python-versions = ">=3.4" +groups = ["dev"] files = [ {file = "mkdocs_git_revision_date_plugin-0.3.2-py3-none-any.whl", hash = "sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef"}, ] @@ -2410,6 +2495,7 @@ version = "9.5.50" description = "Documentation that simply works" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385"}, {file = "mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825"}, @@ -2439,6 +2525,7 @@ version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, @@ -2450,6 +2537,7 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2467,6 +2555,7 @@ version = "0.70.17" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ddb24e5bcdb64e90ec5543a1f05a39463068b6d3b804aa3f2a4e16ec28562d6"}, {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d729f55198a3579f6879766a6d9b72b42d4b320c0dcb7844afb774d75b573c62"}, @@ -2495,6 +2584,7 @@ version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, @@ -2554,6 +2644,7 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfig 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_appconfig-1.36.0-py3-none-any.whl", hash = "sha256:d627de43761a83991a0ab8cd10698d415f94dcc78a567433c7465fc8d1f5cc16"}, {file = "mypy_boto3_appconfig-1.36.0.tar.gz", hash = "sha256:3f38cbd2d7d359da88dc996eeeafa4c1174847909e31a327dd77263dfdfd5424"}, @@ -2568,6 +2659,7 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfigData 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_appconfigdata-1.36.0-py3-none-any.whl", hash = "sha256:68f02ce06ed9597b02154aff64655fc38c42919eda08fddb130ba17e9f70e9cb"}, {file = "mypy_boto3_appconfigdata-1.36.0.tar.gz", hash = "sha256:3436d149833ea69b4260a0f352aac19258d4676c7a21087625906f7da98624c7"}, @@ -2582,6 +2674,7 @@ version = "1.36.0" description = "Type annotations for boto3 CloudFormation 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_cloudformation-1.36.0-py3-none-any.whl", hash = "sha256:3f6cd81739aaf9634c4aa2b92579081038a76e4f2dec306d02eaaf558b332ce9"}, {file = "mypy_boto3_cloudformation-1.36.0.tar.gz", hash = "sha256:acc2c7ae8920f1167be097f6151685fe5aee99be2f890075edf93e05d298e8b0"}, @@ -2596,6 +2689,7 @@ version = "1.36.0" description = "Type annotations for boto3 CloudWatch 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_cloudwatch-1.36.0-py3-none-any.whl", hash = "sha256:2f6cb81c05a1b4be3510e0857b22913a241488bc08f55b0ad96e8b775c144891"}, {file = "mypy_boto3_cloudwatch-1.36.0.tar.gz", hash = "sha256:a370d61522121ab457c443c338a652d0d3e1c22102d9db9f197fd5dcb7e656a4"}, @@ -2610,6 +2704,7 @@ version = "1.36.0" description = "Type annotations for boto3 DynamoDB 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_dynamodb-1.36.0-py3-none-any.whl", hash = "sha256:b782a817ce8956f8d53ac94c85f969dfe51451fc99f16a3b62776f1e0ed3f1ba"}, {file = "mypy_boto3_dynamodb-1.36.0.tar.gz", hash = "sha256:1687e4689236a5391755126e86ec2596d408eb95408c31ac09a3d1eb289d516d"}, @@ -2624,6 +2719,7 @@ version = "1.36.0" description = "Type annotations for boto3 Lambda 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_lambda-1.36.0-py3-none-any.whl", hash = "sha256:8a6693be1352b51e232cee73f73ce36014d19b4777bdf6969c5e707aba424ca1"}, {file = "mypy_boto3_lambda-1.36.0.tar.gz", hash = "sha256:5e9f23702060529aad216a3ce2a2368391a112df07909fbd3aa80d573d84893c"}, @@ -2638,6 +2734,7 @@ version = "1.36.3" description = "Type annotations for boto3 CloudWatchLogs 1.36.3 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_logs-1.36.3-py3-none-any.whl", hash = "sha256:553cb31261eb4484394af9ac965fa33b0d414e927c47768021a0a6ec89625f64"}, {file = "mypy_boto3_logs-1.36.3.tar.gz", hash = "sha256:76d233632a36665094ac888a685fade150c10665ab4cad1b17265037fcadd098"}, @@ -2652,6 +2749,7 @@ version = "1.36.0" description = "Type annotations for boto3 S3 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_s3-1.36.0-py3-none-any.whl", hash = "sha256:a65ccb6be7b7ebf907887268d44975e435b1fc1164fc0a25de310e2b832f7e91"}, {file = "mypy_boto3_s3-1.36.0.tar.gz", hash = "sha256:80a881847b0e1fbc5edcad8b2870c110e31e7ef128db42402b70c159b7e93d5a"}, @@ -2666,6 +2764,7 @@ version = "1.36.0" description = "Type annotations for boto3 SecretsManager 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_secretsmanager-1.36.0-py3-none-any.whl", hash = "sha256:d7fd56b08afed32ce26f2663ec57f9ea074e1e5149a4388eccb46653e3cb5a66"}, {file = "mypy_boto3_secretsmanager-1.36.0.tar.gz", hash = "sha256:6e1f91cd5b0c1f0533f8cfa91e4755855d39931475e7d1e23ee8dbb2e7163d18"}, @@ -2680,6 +2779,7 @@ version = "1.36.0" description = "Type annotations for boto3 SSM 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_ssm-1.36.0-py3-none-any.whl", hash = "sha256:c79a6a949f0b57e68bd48d3d15eb56b975633ffdfaa449d119831c205228cab6"}, {file = "mypy_boto3_ssm-1.36.0.tar.gz", hash = "sha256:bbb9a9ce0e318cad2a53f8200102b4fdc547c7f33912146df82698c9ae40181f"}, @@ -2694,6 +2794,7 @@ version = "1.36.0" description = "Type annotations for boto3 XRay 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_xray-1.36.0-py3-none-any.whl", hash = "sha256:b92a06db10f623db4ec0641227f468b7a57c77f8e599846cfddace4b434f70a5"}, {file = "mypy_boto3_xray-1.36.0.tar.gz", hash = "sha256:5ae2b4c333bf2881870ffb96f1d99cd5e7ee1706d071b6923dcd6de6ceb3ac0c"}, @@ -2708,6 +2809,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -2715,21 +2817,22 @@ files = [ [[package]] name = "networkx" -version = "3.1" +version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, - {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, + {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, + {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, ] [package.extras] -default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] -developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] -doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] -extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] -test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] +default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "nox" @@ -2737,6 +2840,7 @@ version = "2024.10.9" description = "Flexible test automation." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "nox-2024.10.9-py3-none-any.whl", hash = "sha256:1d36f309a0a2a853e9bccb76bbef6bb118ba92fa92674d15604ca99adeb29eab"}, {file = "nox-2024.10.9.tar.gz", hash = "sha256:7aa9dc8d1c27e9f45ab046ffd1c3b2c4f7c91755304769df231308849ebded95"}, @@ -2755,18 +2859,20 @@ uv = ["uv (>=0.1.6)"] [[package]] name = "opentelemetry-api" -version = "1.29.0" +version = "1.16.0" description = "OpenTelemetry Python API" optional = true -python-versions = ">=3.8" +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ - {file = "opentelemetry_api-1.29.0-py3-none-any.whl", hash = "sha256:5fcd94c4141cc49c736271f3e1efb777bebe9cc535759c54c936cca4f1b312b8"}, - {file = "opentelemetry_api-1.29.0.tar.gz", hash = "sha256:d04a6cf78aad09614f52964ecb38021e248f5714dc32c2e0d8fd99517b4d69cf"}, + {file = "opentelemetry_api-1.16.0-py3-none-any.whl", hash = "sha256:79e8f0cf88dbdd36b6abf175d2092af1efcaa2e71552d0d2b3b181a9707bf4bc"}, + {file = "opentelemetry_api-1.16.0.tar.gz", hash = "sha256:4b0e895a3b1f5e1908043ebe492d33e33f9ccdbe6d02d3994c2f8721a63ddddb"}, ] [package.dependencies] deprecated = ">=1.2.6" -importlib-metadata = ">=6.0,<=8.5.0" +setuptools = ">=16.0" [[package]] name = "packaging" @@ -2774,6 +2880,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -2785,6 +2892,7 @@ version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, @@ -2800,6 +2908,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -2811,6 +2920,7 @@ version = "6.1.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" +groups = ["dev"] files = [ {file = "pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"}, {file = "pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24"}, @@ -2818,35 +2928,27 @@ files = [ [[package]] name = "pdoc3" -version = "0.11.0" +version = "0.11.5" description = "Auto-generate API documentation for Python projects." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "pdoc3-0.11.0.tar.gz", hash = "sha256:12f28c6ee045ca8ad6a624b86d1982c51de20e83c0a721cd7b0933f44ae0a655"}, + {file = "pdoc3-0.11.5-py3-none-any.whl", hash = "sha256:b614436239716e1655e538f68a42c62a0bac566e70ddd86c58bc66d6a9ec90a0"}, + {file = "pdoc3-0.11.5.tar.gz", hash = "sha256:fc40607e3f46860ba42c02d30075fe1a52c039b77ffa8e86c1cbc4a8078841b3"}, ] [package.dependencies] mako = "*" markdown = ">=3.0" -[[package]] -name = "pkgutil-resolve-name" -version = "1.3.10" -description = "Resolve a name to an object." -optional = false -python-versions = ">=3.6" -files = [ - {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, - {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, -] - [[package]] name = "platformdirs" version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -2863,6 +2965,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -2878,6 +2981,8 @@ version = "3.11" description = "Python Lex & Yacc" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, @@ -2889,6 +2994,8 @@ version = "5.29.3" description = "" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, @@ -2909,6 +3016,7 @@ version = "0.0.3" description = "Publication helps you maintain public-api-friendly modules by preventing unintentional access to private implementation details via introspection." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "publication-0.0.3-py2.py3-none-any.whl", hash = "sha256:0248885351febc11d8a1098d5c8e3ab2dabcf3e8c0c96db1e17ecd12b53afbe6"}, {file = "publication-0.0.3.tar.gz", hash = "sha256:68416a0de76dddcdd2930d1c8ef853a743cc96c82416c4e4d3b5d901c6276dc4"}, @@ -2920,6 +3028,7 @@ version = "9.0.0" description = "Get CPU info with pure Python" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, @@ -2931,10 +3040,12 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] +markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" @@ -2942,10 +3053,12 @@ version = "2.10.5" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"}, {file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"}, ] +markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] annotated-types = ">=0.6.0" @@ -2962,6 +3075,7 @@ version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -3064,6 +3178,7 @@ files = [ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] +markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" @@ -3074,6 +3189,8 @@ version = "2.7.1" description = "Settings management using Pydantic" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"all\"" files = [ {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"}, {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"}, @@ -3094,6 +3211,7 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -3108,6 +3226,7 @@ version = "10.14.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pymdown_extensions-10.14.1-py3-none-any.whl", hash = "sha256:637951cbfbe9874ba28134fb3ce4b8bcadd6aca89ac4998ec29dcbafd554ae08"}, {file = "pymdown_extensions-10.14.1.tar.gz", hash = "sha256:b65801996a0cd4f42a3110810c306c45b7313c09b0610a6f773730f2a9e3c96b"}, @@ -3122,13 +3241,14 @@ extra = ["pygments (>=2.19.1)"] [[package]] name = "pyparsing" -version = "3.1.4" +version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, - {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, + {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, + {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, ] [package.extras] @@ -3140,6 +3260,7 @@ version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -3162,6 +3283,7 @@ version = "0.24.0" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"}, {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"}, @@ -3180,6 +3302,7 @@ version = "4.0.0" description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-benchmark-4.0.0.tar.gz", hash = "sha256:fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1"}, {file = "pytest_benchmark-4.0.0-py3-none-any.whl", hash = "sha256:fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6"}, @@ -3200,6 +3323,7 @@ version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, @@ -3218,6 +3342,7 @@ version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, @@ -3235,6 +3360,7 @@ version = "0.7.0" description = "Pytest Plugin to disable socket calls during tests" optional = false python-versions = ">=3.8,<4.0" +groups = ["dev"] files = [ {file = "pytest_socket-0.7.0-py3-none-any.whl", hash = "sha256:7e0f4642177d55d317bbd58fc68c6bd9048d6eadb2d46a89307fa9221336ce45"}, {file = "pytest_socket-0.7.0.tar.gz", hash = "sha256:71ab048cbbcb085c15a4423b73b619a8b35d6a307f46f78ea46be51b1b7e11b3"}, @@ -3249,6 +3375,7 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -3269,6 +3396,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -3283,6 +3411,8 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"all\"" files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -3291,23 +3421,14 @@ files = [ [package.extras] cli = ["click (>=5.0)"] -[[package]] -name = "pytz" -version = "2024.2" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, - {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, -] - [[package]] name = "pywin32" version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" +groups = ["dev"] +markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, @@ -3335,6 +3456,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -3397,6 +3519,7 @@ version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, @@ -3411,6 +3534,7 @@ version = "6.0.1" description = "Code Metrics in Python" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "radon-6.0.1-py2.py3-none-any.whl", hash = "sha256:632cc032364a6f8bb1010a2f6a12d0f14bc7e5ede76585ef29dc0cecf4cd8859"}, {file = "radon-6.0.1.tar.gz", hash = "sha256:d1ac0053943a893878940fedc8b19ace70386fc9c9bf0a09229a44125ebf45b5"}, @@ -3429,10 +3553,12 @@ version = "5.2.1" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"}, {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"}, ] +markers = {main = "extra == \"redis\""} [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} @@ -3443,18 +3569,20 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)" [[package]] name = "referencing" -version = "0.35.1" +version = "0.36.1" description = "JSON Referencing + Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, - {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, + {file = "referencing-0.36.1-py3-none-any.whl", hash = "sha256:363d9c65f080d0d70bc41c721dce3c7f3e77fc09f269cd5c8813da18069a6794"}, + {file = "referencing-0.36.1.tar.gz", hash = "sha256:ca2e6492769e3602957e9b831b94211599d2aade9477f5d44110d2530cf9aade"}, ] [package.dependencies] attrs = ">=22.2.0" rpds-py = ">=0.7.0" +typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} [[package]] name = "regex" @@ -3462,6 +3590,7 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -3565,6 +3694,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -3586,6 +3716,7 @@ version = "0.9.5" description = "Easy to use retry decorator." optional = false python-versions = ">=2.6" +groups = ["dev"] files = [ {file = "retry2-0.9.5-py2.py3-none-any.whl", hash = "sha256:f7fee13b1e15d0611c462910a6aa72a8919823988dd0412152bc3719c89a4e55"}, ] @@ -3599,6 +3730,7 @@ version = "13.9.4" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, @@ -3614,114 +3746,115 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.20.1" +version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false -python-versions = ">=3.8" -files = [ - {file = "rpds_py-0.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a649dfd735fff086e8a9d0503a9f0c7d01b7912a333c7ae77e1515c08c146dad"}, - {file = "rpds_py-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f16bc1334853e91ddaaa1217045dd7be166170beec337576818461268a3de67f"}, - {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14511a539afee6f9ab492b543060c7491c99924314977a55c98bfa2ee29ce78c"}, - {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3ccb8ac2d3c71cda472b75af42818981bdacf48d2e21c36331b50b4f16930163"}, - {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c142b88039b92e7e0cb2552e8967077e3179b22359e945574f5e2764c3953dcf"}, - {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f19169781dddae7478a32301b499b2858bc52fc45a112955e798ee307e294977"}, - {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13c56de6518e14b9bf6edde23c4c39dac5b48dcf04160ea7bce8fca8397cdf86"}, - {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:925d176a549f4832c6f69fa6026071294ab5910e82a0fe6c6228fce17b0706bd"}, - {file = "rpds_py-0.20.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:78f0b6877bfce7a3d1ff150391354a410c55d3cdce386f862926a4958ad5ab7e"}, - {file = "rpds_py-0.20.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3dd645e2b0dcb0fd05bf58e2e54c13875847687d0b71941ad2e757e5d89d4356"}, - {file = "rpds_py-0.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4f676e21db2f8c72ff0936f895271e7a700aa1f8d31b40e4e43442ba94973899"}, - {file = "rpds_py-0.20.1-cp310-none-win32.whl", hash = "sha256:648386ddd1e19b4a6abab69139b002bc49ebf065b596119f8f37c38e9ecee8ff"}, - {file = "rpds_py-0.20.1-cp310-none-win_amd64.whl", hash = "sha256:d9ecb51120de61e4604650666d1f2b68444d46ae18fd492245a08f53ad2b7711"}, - {file = "rpds_py-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:762703bdd2b30983c1d9e62b4c88664df4a8a4d5ec0e9253b0231171f18f6d75"}, - {file = "rpds_py-0.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0b581f47257a9fce535c4567782a8976002d6b8afa2c39ff616edf87cbeff712"}, - {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842c19a6ce894493563c3bd00d81d5100e8e57d70209e84d5491940fdb8b9e3a"}, - {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42cbde7789f5c0bcd6816cb29808e36c01b960fb5d29f11e052215aa85497c93"}, - {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c8e9340ce5a52f95fa7d3b552b35c7e8f3874d74a03a8a69279fd5fca5dc751"}, - {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ba6f89cac95c0900d932c9efb7f0fb6ca47f6687feec41abcb1bd5e2bd45535"}, - {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a916087371afd9648e1962e67403c53f9c49ca47b9680adbeef79da3a7811b0"}, - {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:200a23239781f46149e6a415f1e870c5ef1e712939fe8fa63035cd053ac2638e"}, - {file = "rpds_py-0.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:58b1d5dd591973d426cbb2da5e27ba0339209832b2f3315928c9790e13f159e8"}, - {file = "rpds_py-0.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6b73c67850ca7cae0f6c56f71e356d7e9fa25958d3e18a64927c2d930859b8e4"}, - {file = "rpds_py-0.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d8761c3c891cc51e90bc9926d6d2f59b27beaf86c74622c8979380a29cc23ac3"}, - {file = "rpds_py-0.20.1-cp311-none-win32.whl", hash = "sha256:cd945871335a639275eee904caef90041568ce3b42f402c6959b460d25ae8732"}, - {file = "rpds_py-0.20.1-cp311-none-win_amd64.whl", hash = "sha256:7e21b7031e17c6b0e445f42ccc77f79a97e2687023c5746bfb7a9e45e0921b84"}, - {file = "rpds_py-0.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:36785be22066966a27348444b40389f8444671630063edfb1a2eb04318721e17"}, - {file = "rpds_py-0.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:142c0a5124d9bd0e2976089484af5c74f47bd3298f2ed651ef54ea728d2ea42c"}, - {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbddc10776ca7ebf2a299c41a4dde8ea0d8e3547bfd731cb87af2e8f5bf8962d"}, - {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15a842bb369e00295392e7ce192de9dcbf136954614124a667f9f9f17d6a216f"}, - {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be5ef2f1fc586a7372bfc355986226484e06d1dc4f9402539872c8bb99e34b01"}, - {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbcf360c9e3399b056a238523146ea77eeb2a596ce263b8814c900263e46031a"}, - {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd27a66740ffd621d20b9a2f2b5ee4129a56e27bfb9458a3bcc2e45794c96cb"}, - {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0b937b2a1988f184a3e9e577adaa8aede21ec0b38320d6009e02bd026db04fa"}, - {file = "rpds_py-0.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6889469bfdc1eddf489729b471303739bf04555bb151fe8875931f8564309afc"}, - {file = "rpds_py-0.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:19b73643c802f4eaf13d97f7855d0fb527fbc92ab7013c4ad0e13a6ae0ed23bd"}, - {file = "rpds_py-0.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3c6afcf2338e7f374e8edc765c79fbcb4061d02b15dd5f8f314a4af2bdc7feb5"}, - {file = "rpds_py-0.20.1-cp312-none-win32.whl", hash = "sha256:dc73505153798c6f74854aba69cc75953888cf9866465196889c7cdd351e720c"}, - {file = "rpds_py-0.20.1-cp312-none-win_amd64.whl", hash = "sha256:8bbe951244a838a51289ee53a6bae3a07f26d4e179b96fc7ddd3301caf0518eb"}, - {file = "rpds_py-0.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6ca91093a4a8da4afae7fe6a222c3b53ee4eef433ebfee4d54978a103435159e"}, - {file = "rpds_py-0.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b9c2fe36d1f758b28121bef29ed1dee9b7a2453e997528e7d1ac99b94892527c"}, - {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f009c69bc8c53db5dfab72ac760895dc1f2bc1b62ab7408b253c8d1ec52459fc"}, - {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6740a3e8d43a32629bb9b009017ea5b9e713b7210ba48ac8d4cb6d99d86c8ee8"}, - {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:32b922e13d4c0080d03e7b62991ad7f5007d9cd74e239c4b16bc85ae8b70252d"}, - {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe00a9057d100e69b4ae4a094203a708d65b0f345ed546fdef86498bf5390982"}, - {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fe9b04b6fa685bd39237d45fad89ba19e9163a1ccaa16611a812e682913496"}, - {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa7ac11e294304e615b43f8c441fee5d40094275ed7311f3420d805fde9b07b4"}, - {file = "rpds_py-0.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aa97af1558a9bef4025f8f5d8c60d712e0a3b13a2fe875511defc6ee77a1ab7"}, - {file = "rpds_py-0.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:483b29f6f7ffa6af845107d4efe2e3fa8fb2693de8657bc1849f674296ff6a5a"}, - {file = "rpds_py-0.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37fe0f12aebb6a0e3e17bb4cd356b1286d2d18d2e93b2d39fe647138458b4bcb"}, - {file = "rpds_py-0.20.1-cp313-none-win32.whl", hash = "sha256:a624cc00ef2158e04188df5e3016385b9353638139a06fb77057b3498f794782"}, - {file = "rpds_py-0.20.1-cp313-none-win_amd64.whl", hash = "sha256:b71b8666eeea69d6363248822078c075bac6ed135faa9216aa85f295ff009b1e"}, - {file = "rpds_py-0.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5b48e790e0355865197ad0aca8cde3d8ede347831e1959e158369eb3493d2191"}, - {file = "rpds_py-0.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3e310838a5801795207c66c73ea903deda321e6146d6f282e85fa7e3e4854804"}, - {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249280b870e6a42c0d972339e9cc22ee98730a99cd7f2f727549af80dd5a963"}, - {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e79059d67bea28b53d255c1437b25391653263f0e69cd7dec170d778fdbca95e"}, - {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b431c777c9653e569986ecf69ff4a5dba281cded16043d348bf9ba505486f36"}, - {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da584ff96ec95e97925174eb8237e32f626e7a1a97888cdd27ee2f1f24dd0ad8"}, - {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a0629ec053fc013808a85178524e3cb63a61dbc35b22499870194a63578fb9"}, - {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fbf15aff64a163db29a91ed0868af181d6f68ec1a3a7d5afcfe4501252840bad"}, - {file = "rpds_py-0.20.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:07924c1b938798797d60c6308fa8ad3b3f0201802f82e4a2c41bb3fafb44cc28"}, - {file = "rpds_py-0.20.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4a5a844f68776a7715ecb30843b453f07ac89bad393431efbf7accca3ef599c1"}, - {file = "rpds_py-0.20.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:518d2ca43c358929bf08f9079b617f1c2ca6e8848f83c1225c88caeac46e6cbc"}, - {file = "rpds_py-0.20.1-cp38-none-win32.whl", hash = "sha256:3aea7eed3e55119635a74bbeb80b35e776bafccb70d97e8ff838816c124539f1"}, - {file = "rpds_py-0.20.1-cp38-none-win_amd64.whl", hash = "sha256:7dca7081e9a0c3b6490a145593f6fe3173a94197f2cb9891183ef75e9d64c425"}, - {file = "rpds_py-0.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b41b6321805c472f66990c2849e152aff7bc359eb92f781e3f606609eac877ad"}, - {file = "rpds_py-0.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a90c373ea2975519b58dece25853dbcb9779b05cc46b4819cb1917e3b3215b6"}, - {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16d4477bcb9fbbd7b5b0e4a5d9b493e42026c0bf1f06f723a9353f5153e75d30"}, - {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84b8382a90539910b53a6307f7c35697bc7e6ffb25d9c1d4e998a13e842a5e83"}, - {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4888e117dd41b9d34194d9e31631af70d3d526efc363085e3089ab1a62c32ed1"}, - {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5265505b3d61a0f56618c9b941dc54dc334dc6e660f1592d112cd103d914a6db"}, - {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e75ba609dba23f2c95b776efb9dd3f0b78a76a151e96f96cc5b6b1b0004de66f"}, - {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1791ff70bc975b098fe6ecf04356a10e9e2bd7dc21fa7351c1742fdeb9b4966f"}, - {file = "rpds_py-0.20.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d126b52e4a473d40232ec2052a8b232270ed1f8c9571aaf33f73a14cc298c24f"}, - {file = "rpds_py-0.20.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c14937af98c4cc362a1d4374806204dd51b1e12dded1ae30645c298e5a5c4cb1"}, - {file = "rpds_py-0.20.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3d089d0b88996df627693639d123c8158cff41c0651f646cd8fd292c7da90eaf"}, - {file = "rpds_py-0.20.1-cp39-none-win32.whl", hash = "sha256:653647b8838cf83b2e7e6a0364f49af96deec64d2a6578324db58380cff82aca"}, - {file = "rpds_py-0.20.1-cp39-none-win_amd64.whl", hash = "sha256:fa41a64ac5b08b292906e248549ab48b69c5428f3987b09689ab2441f267d04d"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a07ced2b22f0cf0b55a6a510078174c31b6d8544f3bc00c2bcee52b3d613f74"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:68cb0a499f2c4a088fd2f521453e22ed3527154136a855c62e148b7883b99f9a"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa3060d885657abc549b2a0f8e1b79699290e5d83845141717c6c90c2df38311"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95f3b65d2392e1c5cec27cff08fdc0080270d5a1a4b2ea1d51d5f4a2620ff08d"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cc3712a4b0b76a1d45a9302dd2f53ff339614b1c29603a911318f2357b04dd2"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d4eea0761e37485c9b81400437adb11c40e13ef513375bbd6973e34100aeb06"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f5179583d7a6cdb981151dd349786cbc318bab54963a192692d945dd3f6435d"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fbb0ffc754490aff6dabbf28064be47f0f9ca0b9755976f945214965b3ace7e"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a94e52537a0e0a85429eda9e49f272ada715506d3b2431f64b8a3e34eb5f3e75"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:92b68b79c0da2a980b1c4197e56ac3dd0c8a149b4603747c4378914a68706979"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:93da1d3db08a827eda74356f9f58884adb254e59b6664f64cc04cdff2cc19b0d"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:754bbed1a4ca48479e9d4182a561d001bbf81543876cdded6f695ec3d465846b"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ca449520e7484534a2a44faf629362cae62b660601432d04c482283c47eaebab"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9c4cb04a16b0f199a8c9bf807269b2f63b7b5b11425e4a6bd44bd6961d28282c"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63804105143c7e24cee7db89e37cb3f3941f8e80c4379a0b355c52a52b6780"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:55cd1fa4ecfa6d9f14fbd97ac24803e6f73e897c738f771a9fe038f2f11ff07c"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f8f741b6292c86059ed175d80eefa80997125b7c478fb8769fd9ac8943a16c0"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fc212779bf8411667234b3cdd34d53de6c2b8b8b958e1e12cb473a5f367c338"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ad56edabcdb428c2e33bbf24f255fe2b43253b7d13a2cdbf05de955217313e6"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a3a1e9ee9728b2c1734f65d6a1d376c6f2f6fdcc13bb007a08cc4b1ff576dc5"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e13de156137b7095442b288e72f33503a469aa1980ed856b43c353ac86390519"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:07f59760ef99f31422c49038964b31c4dfcfeb5d2384ebfc71058a7c9adae2d2"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:59240685e7da61fb78f65a9f07f8108e36a83317c53f7b276b4175dc44151684"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:83cba698cfb3c2c5a7c3c6bac12fe6c6a51aae69513726be6411076185a8b24a"}, - {file = "rpds_py-0.20.1.tar.gz", hash = "sha256:e1791c4aabd117653530dccd24108fa03cc6baf21f58b950d0a73c3b3b29a350"}, +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, + {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf"}, + {file = "rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652"}, + {file = "rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a"}, + {file = "rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64"}, + {file = "rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7"}, + {file = "rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627"}, + {file = "rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f"}, + {file = "rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de"}, + {file = "rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520"}, + {file = "rpds_py-0.22.3-cp39-cp39-win32.whl", hash = "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9"}, + {file = "rpds_py-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6"}, + {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, ] [[package]] @@ -3730,6 +3863,7 @@ version = "0.9.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "ruff-0.9.2-py3-none-linux_armv6l.whl", hash = "sha256:80605a039ba1454d002b32139e4970becf84b5fee3a3c3bf1c2af6f61a784347"}, {file = "ruff-0.9.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9aab82bb20afd5f596527045c01e6ae25a718ff1784cb92947bff1f83068b00"}, @@ -3757,6 +3891,7 @@ version = "0.11.1" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "s3transfer-0.11.1-py3-none-any.whl", hash = "sha256:8fa0aa48177be1f3425176dfe1ab85dcd3d962df603c3dbfc585e6bf857ef0ff"}, {file = "s3transfer-0.11.1.tar.gz", hash = "sha256:3f25c900a367c8b7f7d8f9c34edc87e300bde424f779dc9f0a8ae4f9df9264f6"}, @@ -3774,6 +3909,7 @@ version = "0.0.4" description = "Flexible recursive directory iterator: scandir meets glob(\"**\", recursive=True)" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "scantree-0.0.4-py3-none-any.whl", hash = "sha256:7616ab65aa6b7f16fcf8e6fa1d9afaa99a27ab72bba05c61b691853b96763174"}, {file = "scantree-0.0.4.tar.gz", hash = "sha256:15bd5cb24483b04db2c70653604e8ea3522e98087db7e38ab8482f053984c0ac"}, @@ -3789,6 +3925,7 @@ version = "2.20.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "sentry_sdk-2.20.0-py2.py3-none-any.whl", hash = "sha256:c359a1edf950eb5e80cffd7d9111f3dbeef57994cb4415df37d39fda2cf22364"}, {file = "sentry_sdk-2.20.0.tar.gz", hash = "sha256:afa82713a92facf847df3c6f63cec71eb488d826a50965def3d7722aa6f0fdab"}, @@ -3838,12 +3975,35 @@ starlite = ["starlite (>=1.48)"] tornado = ["tornado (>=6)"] unleash = ["UnleashClient (>=6.0.1)"] +[[package]] +name = "setuptools" +version = "75.8.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"datadog\"" +files = [ + {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, + {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] +core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] + [[package]] name = "six" version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -3855,6 +4015,7 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -3866,6 +4027,7 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -3873,13 +4035,14 @@ files = [ [[package]] name = "stevedore" -version = "5.3.0" +version = "5.4.0" description = "Manage dynamic plugins for Python applications" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "stevedore-5.3.0-py3-none-any.whl", hash = "sha256:1efd34ca08f474dad08d9b19e934a22c68bb6fe416926479ba29e5013bcc8f78"}, - {file = "stevedore-5.3.0.tar.gz", hash = "sha256:9a64265f4060312828151c204efbe9b7a9852a0d9228756344dbc7e4023e375a"}, + {file = "stevedore-5.4.0-py3-none-any.whl", hash = "sha256:b0be3c4748b3ea7b854b265dcb4caa891015e442416422be16f8b31756107857"}, + {file = "stevedore-5.4.0.tar.gz", hash = "sha256:79e92235ecb828fe952b6b8b0c6c87863248631922c8e8e0fa5b17b232c4514d"}, ] [package.dependencies] @@ -3891,6 +4054,7 @@ version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, @@ -3908,6 +4072,7 @@ version = "3.7.1" description = "Library provides lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "testcontainers-3.7.1-py2.py3-none-any.whl", hash = "sha256:7f48cef4bf0ccd78f1a4534d4b701a003a3bace851f24eae58a32f9e3f0aeba0"}, ] @@ -3942,6 +4107,8 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_full_version <= \"3.11.0a6\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -3983,6 +4150,7 @@ version = "2.13.3" description = "Run-time type checker for Python" optional = false python-versions = ">=3.5.3" +groups = ["dev"] files = [ {file = "typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1"}, {file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"}, @@ -3998,6 +4166,7 @@ version = "0.23.6" description = "Type annotations and code completion for awscrt" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_awscrt-0.23.6-py3-none-any.whl", hash = "sha256:fbf9c221af5607b24bf17f8431217ce8b9a27917139edbc984891eb63fd5a593"}, {file = "types_awscrt-0.23.6.tar.gz", hash = "sha256:405bce8c281f9e7c6c92a229225cc0bf10d30729a6a601123213389bd524b8b1"}, @@ -4009,6 +4178,7 @@ version = "1.16.0.20241221" description = "Typing stubs for cffi" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_cffi-1.16.0.20241221-py3-none-any.whl", hash = "sha256:e5b76b4211d7a9185f6ab8d06a106d56c7eb80af7cdb8bfcb4186ade10fb112f"}, {file = "types_cffi-1.16.0.20241221.tar.gz", hash = "sha256:1c96649618f4b6145f58231acb976e0b448be6b847f7ab733dabe62dfbff6591"}, @@ -4023,6 +4193,7 @@ version = "24.1.0.20240722" description = "Typing stubs for pyOpenSSL" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types-pyOpenSSL-24.1.0.20240722.tar.gz", hash = "sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39"}, {file = "types_pyOpenSSL-24.1.0.20240722-py3-none-any.whl", hash = "sha256:6a7a5d2ec042537934cfb4c9d4deb0e16c4c6250b09358df1f083682fe6fda54"}, @@ -4038,6 +4209,7 @@ version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, @@ -4049,6 +4221,7 @@ version = "4.6.0.20241004" description = "Typing stubs for redis" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types-redis-4.6.0.20241004.tar.gz", hash = "sha256:5f17d2b3f9091ab75384153bfa276619ffa1cf6a38da60e10d5e6749cc5b902e"}, {file = "types_redis-4.6.0.20241004-py3-none-any.whl", hash = "sha256:ef5da68cb827e5f606c8f9c0b49eeee4c2669d6d97122f301d3a55dc6a63f6ed"}, @@ -4064,6 +4237,7 @@ version = "2.31.0.6" description = "Typing stubs for requests" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, @@ -4078,6 +4252,7 @@ version = "0.11.1" description = "Type annotations and code completion for s3transfer" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_s3transfer-0.11.1-py3-none-any.whl", hash = "sha256:ddb20d103361c2d7cf95e9e73468cdd12f049f503b1512e6fdfe5a66fa086d2d"}, {file = "types_s3transfer-0.11.1.tar.gz", hash = "sha256:6ab89d4d76bcbf6d494582949963b4672347e8daa397d9790f3684b4fcf873c4"}, @@ -4089,6 +4264,7 @@ version = "75.8.0.20250110" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480"}, {file = "types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271"}, @@ -4100,6 +4276,7 @@ version = "1.26.25.14" description = "Typing stubs for urllib3" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, @@ -4111,6 +4288,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -4122,6 +4300,8 @@ version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, @@ -4209,6 +4389,7 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, @@ -4225,6 +4406,7 @@ version = "0.1.0" description = "Flexible version handling" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, @@ -4239,6 +4421,7 @@ version = "20.29.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779"}, {file = "virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35"}, @@ -4255,46 +4438,42 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "watchdog" -version = "4.0.2" +version = "6.0.0" description = "Filesystem events monitoring" optional = false -python-versions = ">=3.8" -files = [ - {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ede7f010f2239b97cc79e6cb3c249e72962404ae3865860855d5cbe708b0fd22"}, - {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2cffa171445b0efa0726c561eca9a27d00a1f2b83846dbd5a4f639c4f8ca8e1"}, - {file = "watchdog-4.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c50f148b31b03fbadd6d0b5980e38b558046b127dc483e5e4505fcef250f9503"}, - {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c7d4bf585ad501c5f6c980e7be9c4f15604c7cc150e942d82083b31a7548930"}, - {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:914285126ad0b6eb2258bbbcb7b288d9dfd655ae88fa28945be05a7b475a800b"}, - {file = "watchdog-4.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:984306dc4720da5498b16fc037b36ac443816125a3705dfde4fd90652d8028ef"}, - {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1cdcfd8142f604630deef34722d695fb455d04ab7cfe9963055df1fc69e6727a"}, - {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7ab624ff2f663f98cd03c8b7eedc09375a911794dfea6bf2a359fcc266bff29"}, - {file = "watchdog-4.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:132937547a716027bd5714383dfc40dc66c26769f1ce8a72a859d6a48f371f3a"}, - {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd67c7df93eb58f360c43802acc945fa8da70c675b6fa37a241e17ca698ca49b"}, - {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcfd02377be80ef3b6bc4ce481ef3959640458d6feaae0bd43dd90a43da90a7d"}, - {file = "watchdog-4.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:980b71510f59c884d684b3663d46e7a14b457c9611c481e5cef08f4dd022eed7"}, - {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:aa160781cafff2719b663c8a506156e9289d111d80f3387cf3af49cedee1f040"}, - {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f6ee8dedd255087bc7fe82adf046f0b75479b989185fb0bdf9a98b612170eac7"}, - {file = "watchdog-4.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0b4359067d30d5b864e09c8597b112fe0a0a59321a0f331498b013fb097406b4"}, - {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:770eef5372f146997638d737c9a3c597a3b41037cfbc5c41538fc27c09c3a3f9"}, - {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eeea812f38536a0aa859972d50c76e37f4456474b02bd93674d1947cf1e39578"}, - {file = "watchdog-4.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b2c45f6e1e57ebb4687690c05bc3a2c1fb6ab260550c4290b8abb1335e0fd08b"}, - {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:10b6683df70d340ac3279eff0b2766813f00f35a1d37515d2c99959ada8f05fa"}, - {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7c739888c20f99824f7aa9d31ac8a97353e22d0c0e54703a547a218f6637eb3"}, - {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c100d09ac72a8a08ddbf0629ddfa0b8ee41740f9051429baa8e31bb903ad7508"}, - {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f5315a8c8dd6dd9425b974515081fc0aadca1d1d61e078d2246509fd756141ee"}, - {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2d468028a77b42cc685ed694a7a550a8d1771bb05193ba7b24006b8241a571a1"}, - {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f15edcae3830ff20e55d1f4e743e92970c847bcddc8b7509bcd172aa04de506e"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:936acba76d636f70db8f3c66e76aa6cb5136a936fc2a5088b9ce1c7a3508fc83"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:e252f8ca942a870f38cf785aef420285431311652d871409a64e2a0a52a2174c"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:0e83619a2d5d436a7e58a1aea957a3c1ccbf9782c43c0b4fed80580e5e4acd1a"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:88456d65f207b39f1981bf772e473799fcdc10801062c36fd5ad9f9d1d463a73"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:32be97f3b75693a93c683787a87a0dc8db98bb84701539954eef991fb35f5fbc"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:c82253cfc9be68e3e49282831afad2c1f6593af80c0daf1287f6a92657986757"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c0b14488bd336c5b1845cee83d3e631a1f8b4e9c5091ec539406e4a324f882d8"}, - {file = "watchdog-4.0.2-py3-none-win32.whl", hash = "sha256:0d8a7e523ef03757a5aa29f591437d64d0d894635f8a50f370fe37f913ce4e19"}, - {file = "watchdog-4.0.2-py3-none-win_amd64.whl", hash = "sha256:c344453ef3bf875a535b0488e3ad28e341adbd5a9ffb0f7d62cefacc8824ef2b"}, - {file = "watchdog-4.0.2-py3-none-win_ia64.whl", hash = "sha256:baececaa8edff42cd16558a639a9b0ddf425f93d892e8392a56bf904f5eff22c"}, - {file = "watchdog-4.0.2.tar.gz", hash = "sha256:b4dfbb6c49221be4535623ea4474a4d6ee0a9cef4a80b20c28db4d858b64e270"}, +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, + {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, + {file = "watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c"}, + {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881"}, + {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11"}, + {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa"}, + {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2"}, + {file = "watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a"}, + {file = "watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680"}, + {file = "watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f"}, + {file = "watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282"}, ] [package.extras] @@ -4306,6 +4485,7 @@ version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -4387,6 +4567,7 @@ files = [ {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, ] +markers = {main = "extra == \"tracer\" or extra == \"all\" or extra == \"datadog\" or extra == \"datamasking\""} [[package]] name = "xenon" @@ -4394,6 +4575,7 @@ version = "0.9.3" description = "Monitor code metrics for Python on your CI server" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "xenon-0.9.3-py2.py3-none-any.whl", hash = "sha256:6e2c2c251cc5e9d01fe984e623499b13b2140fcbf74d6c03a613fa43a9347097"}, {file = "xenon-0.9.3.tar.gz", hash = "sha256:4a7538d8ba08aa5d79055fb3e0b2393c0bd6d7d16a4ab0fcdef02ef1f10a43fa"}, @@ -4410,6 +4592,8 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -4417,13 +4601,14 @@ files = [ [[package]] name = "zipp" -version = "3.20.2" +version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, - {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] @@ -4445,6 +4630,6 @@ tracer = ["aws-xray-sdk"] validation = ["fastjsonschema"] [metadata] -lock-version = "2.0" -python-versions = ">=3.8,<4.0.0" -content-hash = "57395816640f2e2e3fbaa8e338b4f64fa243d0ce0b644af3407bfeb7dba0d79a" +lock-version = "2.1" +python-versions = ">=3.9,<4.0.0" +content-hash = "9e537cd6a43226f5123e4a4903d8b3d90e28da7430d8cbd33931bdbcc9674330" diff --git a/pyproject.toml b/pyproject.toml index c45c4ef48ba..6b554ed4828 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,6 @@ classifiers = [ "Intended Audience :: Developers", "License :: OSI Approved :: MIT No Attribution License (MIT-0)", "Natural Language :: English", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", @@ -39,7 +38,7 @@ license = "MIT" "Releases" = "https://github.com/aws-powertools/powertools-lambda-python/releases" [tool.poetry.dependencies] -python = ">=3.8,<4.0.0" +python = ">=3.9,<4.0.0" # Required libraries installed by default jmespath = "^1.0.1" @@ -105,7 +104,6 @@ filelock = "^3.16.0" dirhash = "^0.5.0" mypy-boto3-appconfigdata = "^1.36.0" ijson = "^3.3.0" -typed-ast = { version = "^1.5.5", python = "< 3.8" } hvac = "^2.3.0" aws-requests-auth = "^0.4.3" urllib3 = "<2" diff --git a/tests/e2e/utils/infrastructure.py b/tests/e2e/utils/infrastructure.py index a78ba1884e8..85bfd9fd41c 100644 --- a/tests/e2e/utils/infrastructure.py +++ b/tests/e2e/utils/infrastructure.py @@ -113,7 +113,6 @@ def create_lambda_functions( "aws-lambda-powertools-e2e-test", layer_version_name="aws-lambda-powertools-e2e-test", compatible_runtimes=[ - Runtime.PYTHON_3_8, Runtime.PYTHON_3_9, Runtime.PYTHON_3_10, Runtime.PYTHON_3_11, @@ -250,9 +249,7 @@ def _create_temp_cdk_app(self): def _determine_runtime_version(self) -> Runtime: """Determine Python runtime version based on the current Python interpreter""" version = sys.version_info - if version.major == 3 and version.minor == 8: - return Runtime.PYTHON_3_8 - elif version.major == 3 and version.minor == 9: + if version.major == 3 and version.minor == 9: return Runtime.PYTHON_3_9 elif version.major == 3 and version.minor == 10: return Runtime.PYTHON_3_10 From 7a05f43006e4295117dc0cff84f29a6c80ac3d32 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Thu, 23 Jan 2025 13:55:09 +0000 Subject: [PATCH 26/52] feat(parser): add AWS Transfer Family model (#5906) --- .../utilities/parser/models/__init__.py | 2 ++ .../parser/models/transfer_family.py | 12 +++++++++ docs/utilities/parser.md | 5 ++-- tests/events/TransferFamily.json | 7 ++++++ .../_pydantic/test_aws_transfer_family.py | 25 +++++++++++++++++++ 5 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 aws_lambda_powertools/utilities/parser/models/transfer_family.py create mode 100644 tests/events/TransferFamily.json create mode 100644 tests/unit/parser/_pydantic/test_aws_transfer_family.py diff --git a/aws_lambda_powertools/utilities/parser/models/__init__.py b/aws_lambda_powertools/utilities/parser/models/__init__.py index 7c409ef6b83..559930af945 100644 --- a/aws_lambda_powertools/utilities/parser/models/__init__.py +++ b/aws_lambda_powertools/utilities/parser/models/__init__.py @@ -109,6 +109,7 @@ ) from .sns import SnsModel, SnsNotificationModel, SnsRecordModel from .sqs import SqsAttributesModel, SqsModel, SqsMsgAttributeModel, SqsRecordModel +from .transfer_family import TransferFamily from .vpc_lattice import VpcLatticeModel from .vpc_latticev2 import VpcLatticeV2Model @@ -179,6 +180,7 @@ "SqsAttributesModel", "S3SqsEventNotificationModel", "S3SqsEventNotificationRecordModel", + "TransferFamily", "APIGatewayProxyEventModel", "APIGatewayEventRequestContext", "APIGatewayEventAuthorizer", diff --git a/aws_lambda_powertools/utilities/parser/models/transfer_family.py b/aws_lambda_powertools/utilities/parser/models/transfer_family.py new file mode 100644 index 00000000000..9ae46b0c39c --- /dev/null +++ b/aws_lambda_powertools/utilities/parser/models/transfer_family.py @@ -0,0 +1,12 @@ +from typing import Literal, Optional + +from pydantic import BaseModel, Field +from pydantic.networks import IPvAnyAddress + + +class TransferFamily(BaseModel): + username: str + password: Optional[str] = None + protocol: Literal["SFTP", "FTP", "FTPS"] + server_id: str = Field(..., alias="serverId") + source_ip: IPvAnyAddress = Field(..., alias="sourceIp") diff --git a/docs/utilities/parser.md b/docs/utilities/parser.md index 4cf11a32769..8ab87a303d7 100644 --- a/docs/utilities/parser.md +++ b/docs/utilities/parser.md @@ -108,8 +108,8 @@ The example above uses `SqsModel`. Other built-in models can be found below. | **ApiGatewayAuthorizerRequest** | Lambda Event Source payload for Amazon API Gateway Lambda Authorizer with Request | | **APIGatewayProxyEventV2Model** | Lambda Event Source payload for Amazon API Gateway v2 payload | | **ApiGatewayAuthorizerRequestV2** | Lambda Event Source payload for Amazon API Gateway v2 Lambda Authorizer | -| **APIGatewayWebSocketMessageEventModel** | Lambda Event Source payload for Amazon API Gateway WebSocket API message body | -| **APIGatewayWebSocketConnectEventModel** | Lambda Event Source payload for Amazon API Gateway WebSocket API $connect message | +| **APIGatewayWebSocketMessageEventModel** | Lambda Event Source payload for Amazon API Gateway WebSocket API message body | +| **APIGatewayWebSocketConnectEventModel** | Lambda Event Source payload for Amazon API Gateway WebSocket API $connect message | | **APIGatewayWebSocketDisconnectEventModel** | Lambda Event Source payload for Amazon API Gateway WebSocket API $disconnect message | | **BedrockAgentEventModel** | Lambda Event Source payload for Bedrock Agents | | **CloudFormationCustomResourceCreateModel** | Lambda Event Source payload for AWS CloudFormation `CREATE` operation | @@ -132,6 +132,7 @@ The example above uses `SqsModel`. Other built-in models can be found below. | **SesModel** | Lambda Event Source payload for Amazon Simple Email Service | | **SnsModel** | Lambda Event Source payload for Amazon Simple Notification Service | | **SqsModel** | Lambda Event Source payload for Amazon SQS | +| **TransferFamily** | Lambda Event Source payload for AWS Transfer Family custom identity provider | | **VpcLatticeModel** | Lambda Event Source payload for Amazon VPC Lattice | | **VpcLatticeV2Model** | Lambda Event Source payload for Amazon VPC Lattice v2 payload | diff --git a/tests/events/TransferFamily.json b/tests/events/TransferFamily.json new file mode 100644 index 00000000000..c329071e8a5 --- /dev/null +++ b/tests/events/TransferFamily.json @@ -0,0 +1,7 @@ +{ + "username": "value", + "password": "value", + "protocol": "SFTP", + "serverId": "s-abcd123456", + "sourceIp": "192.168.0.100" +} diff --git a/tests/unit/parser/_pydantic/test_aws_transfer_family.py b/tests/unit/parser/_pydantic/test_aws_transfer_family.py new file mode 100644 index 00000000000..7316dacdd8e --- /dev/null +++ b/tests/unit/parser/_pydantic/test_aws_transfer_family.py @@ -0,0 +1,25 @@ +from aws_lambda_powertools.utilities.parser.models import TransferFamily +from tests.functional.utils import load_event + + +def test_aws_transfer_family_model(): + raw_event = load_event("TransferFamily.json") + parsed_event = TransferFamily(**raw_event) + + assert parsed_event.username == raw_event["username"] + assert parsed_event.password == raw_event["password"] + assert parsed_event.protocol == raw_event["protocol"] + assert parsed_event.server_id == raw_event["serverId"] + assert str(parsed_event.source_ip) == raw_event["sourceIp"] + + +def test_aws_transfer_family_model_without_password(): + raw_event = load_event("TransferFamily.json") + del raw_event["password"] + parsed_event = TransferFamily(**raw_event) + + assert parsed_event.username == raw_event["username"] + assert parsed_event.password is None + assert parsed_event.protocol == raw_event["protocol"] + assert parsed_event.server_id == raw_event["serverId"] + assert str(parsed_event.source_ip) == raw_event["sourceIp"] From a43718030b5b3fcb403d813d9e53de0cb272ff6e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:10:49 +0000 Subject: [PATCH 27/52] chore(deps-dev): bump pytest-cov from 5.0.0 to 6.0.0 (#5908) Bumps [pytest-cov](https://github.com/pytest-dev/pytest-cov) from 5.0.0 to 6.0.0. - [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest-cov/compare/v5.0.0...v6.0.0) --- updated-dependencies: - dependency-name: pytest-cov dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 232 +++---------------------------------------------- pyproject.toml | 2 +- 2 files changed, 13 insertions(+), 221 deletions(-) diff --git a/poetry.lock b/poetry.lock index 07a924bee40..d43394eea25 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "annotated-types" @@ -6,12 +6,10 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] -markers = {main = "extra == \"parser\" or extra == \"all\""} [[package]] name = "anyio" @@ -19,7 +17,6 @@ version = "4.8.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, @@ -42,7 +39,6 @@ version = "3.5.3" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "argcomplete-3.5.3-py3-none-any.whl", hash = "sha256:2ab2c4a215c59fd6caaff41a869480a23e8f6a5f910b266c1808037f4e375b61"}, {file = "argcomplete-3.5.3.tar.gz", hash = "sha256:c12bf50eded8aebb298c7b7da7a5ff3ee24dffd9f5281867dfe1424b58c55392"}, @@ -57,12 +53,10 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] -markers = {main = "extra == \"redis\" and python_full_version < \"3.11.3\"", dev = "python_full_version < \"3.11.3\""} [[package]] name = "attrs" @@ -70,12 +64,10 @@ version = "24.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] -markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] @@ -91,7 +83,6 @@ version = "2.2.220" description = "A library that contains the AWS CLI for use in Lambda Layers" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.asset_awscli_v1-2.2.220-py3-none-any.whl", hash = "sha256:aef8284470bee3e1e0b5d706961c952dba88d50981ba6a21fa8b5cb3e9c4d5b6"}, {file = "aws_cdk_asset_awscli_v1-2.2.220.tar.gz", hash = "sha256:8e5e1290dc77b15cffe51134be0bf2b613ae8f3f9859fd4137359bbda431b0d3"}, @@ -108,7 +99,6 @@ version = "2.1.3" description = "A Lambda Layer that contains kubectl v1.20" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.asset_kubectl_v20-2.1.3-py3-none-any.whl", hash = "sha256:d5612e5bd03c215a28ce53193b1144ecf4e93b3b6779563c046a8a74d83a3979"}, {file = "aws_cdk_asset_kubectl_v20-2.1.3.tar.gz", hash = "sha256:237cd8530d9e8be0bbc7159af927dbb6b7f91bf3f4099c8ef4d9a213b34264be"}, @@ -125,7 +115,6 @@ version = "2.1.0" description = "@aws-cdk/asset-node-proxy-agent-v6" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.asset_node_proxy_agent_v6-2.1.0-py3-none-any.whl", hash = "sha256:24a388b69a44d03bae6dbf864c4e25ba650d4b61c008b4568b94ffbb9a69e40e"}, {file = "aws_cdk_asset_node_proxy_agent_v6-2.1.0.tar.gz", hash = "sha256:1f292c0631f86708ba4ee328b3a2b229f7e46ea1c79fbde567ee9eb119c2b0e2"}, @@ -142,7 +131,6 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-alpha-2.114.1a0.tar.gz", hash = "sha256:9e8c3131f4fa3e0926eb3d76aeacd578a6aa51f95b39c10a86112c991bb75864"}, {file = "aws_cdk.aws_apigatewayv2_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:a101ce56d846976ad1c8020054dfe73fd9f45afdbe71f2a297acc84c1a201403"}, @@ -161,7 +149,6 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-authorizers" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-authorizers-alpha-2.114.1a0.tar.gz", hash = "sha256:ee290e2ed0f1506dbbb12b3b8963f50b379121759077002c265977fbaf18fd9f"}, {file = "aws_cdk.aws_apigatewayv2_authorizers_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:2576e1ce06dab314020bff50f5d59b8715a7adf18106eac811028c22f61c9baa"}, @@ -181,7 +168,6 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-integrations" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-integrations-alpha-2.114.1a0.tar.gz", hash = "sha256:19e1824b577683e7d3c2b01fd58c176ebe4c7b8d1b4af4cfdc3893d3ffbac9af"}, {file = "aws_cdk.aws_apigatewayv2_integrations_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:1e440a70e6b4cbe077c95ffdd3fd0cfb3962f90762ea2e973eaa2ab7719ccb2c"}, @@ -201,7 +187,6 @@ version = "2.59.0a0" description = "The CDK Construct Library for AWS::AppSync" optional = false python-versions = "~=3.7" -groups = ["dev"] files = [ {file = "aws-cdk.aws-appsync-alpha-2.59.0a0.tar.gz", hash = "sha256:f5c7773b70b759efd576561dc3d71af5762a6f7cbc9ee9eef5e538c7ab3dccc7"}, {file = "aws_cdk.aws_appsync_alpha-2.59.0a0-py3-none-any.whl", hash = "sha256:ecc235f1f70d404c8d03cf250be0227becd14c468f8c43b6d9df334a1d60c8e2"}, @@ -220,7 +205,6 @@ version = "2.176.0a0" description = "The CDK Construct Library for AWS Lambda in Python" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.aws_lambda_python_alpha-2.176.0a0-py3-none-any.whl", hash = "sha256:d7a9223393b815e9b2d2e69f06c216b8e12e577f8ab58aeb56cb05c92de7f7bb"}, {file = "aws_cdk_aws_lambda_python_alpha-2.176.0a0.tar.gz", hash = "sha256:0a2737e098e88a553a284f688c7621067cebf32ba21ad3e8e7911bb70ce67049"}, @@ -239,7 +223,6 @@ version = "39.2.3" description = "Cloud Assembly Schema" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk.cloud_assembly_schema-39.2.3-py3-none-any.whl", hash = "sha256:50df7151a131b82c9a7ab8ab9c9a2780a712e774f5418c86d1d27e13051dac17"}, {file = "aws_cdk_cloud_assembly_schema-39.2.3.tar.gz", hash = "sha256:c809a4a92f0c2f92318cf1a6541f83ecd43d99dbad648f1160943209af8fbdbb"}, @@ -256,7 +239,6 @@ version = "2.176.0" description = "Version 2 of the AWS Cloud Development Kit library" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "aws_cdk_lib-2.176.0-py3-none-any.whl", hash = "sha256:c362a92f06b6ea60a7eff7994d3994c462358e7a95ce3de01a28efab4f6d56b6"}, {file = "aws_cdk_lib-2.176.0.tar.gz", hash = "sha256:87a39d2f42fd2ea8ba2bfa364355303953fb5cc2886479ca5acf09a14a9fd679"}, @@ -278,8 +260,6 @@ version = "4.0.0" description = "AWS Encryption SDK implementation for Python" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "aws-encryption-sdk-4.0.0.tar.gz", hash = "sha256:57df8b5c1b9f18db4373c6e8e65563791063a71be93d0849950ed365272db354"}, {file = "aws_encryption_sdk-4.0.0-py2.py3-none-any.whl", hash = "sha256:a94483785dff2cd166ccb8f3a15cdfe5cba7a3717f6604543c816a3a32f7c412"}, @@ -300,7 +280,6 @@ version = "0.4.3" description = "AWS signature version 4 signing process for the python requests module" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "aws-requests-auth-0.4.3.tar.gz", hash = "sha256:33593372018b960a31dbbe236f89421678b885c35f0b6a7abfae35bb77e069b2"}, {file = "aws_requests_auth-0.4.3-py2.py3-none-any.whl", hash = "sha256:646bc37d62140ea1c709d20148f5d43197e6bd2d63909eb36fa4bb2345759977"}, @@ -315,7 +294,6 @@ version = "1.94.0" description = "AWS SAM Translator is a library that transform SAM templates into AWS CloudFormation templates" optional = false python-versions = "!=4.0,<=4.0,>=3.8" -groups = ["dev"] files = [ {file = "aws_sam_translator-1.94.0-py3-none-any.whl", hash = "sha256:100e33eeffcfa81f7c45cadeb0ee29596ce829f6b4d2745140f04fa19a41f539"}, {file = "aws_sam_translator-1.94.0.tar.gz", hash = "sha256:8ec258d9f7ece72ef91c81f4edb45a2db064c16844b6afac90c575893beaa391"}, @@ -336,8 +314,6 @@ version = "2.14.0" description = "The AWS X-Ray SDK for Python (the SDK) enables Python developers to record and emit information from within their applications to the AWS X-Ray service." optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"tracer\" or extra == \"all\"" files = [ {file = "aws_xray_sdk-2.14.0-py2.py3-none-any.whl", hash = "sha256:cfbe6feea3d26613a2a869d14c9246a844285c97087ad8f296f901633554ad94"}, {file = "aws_xray_sdk-2.14.0.tar.gz", hash = "sha256:aab843c331af9ab9ba5cefb3a303832a19db186140894a523edafc024cc0493c"}, @@ -353,7 +329,6 @@ version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, @@ -368,7 +343,6 @@ version = "1.8.2" description = "Security oriented static analyser for python code." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "bandit-1.8.2-py3-none-any.whl", hash = "sha256:df6146ad73dd30e8cbda4e29689ddda48364e36ff655dbfc86998401fcf1721f"}, {file = "bandit-1.8.2.tar.gz", hash = "sha256:e00ad5a6bc676c0954669fe13818024d66b70e42cf5adb971480cf3b671e835f"}, @@ -393,7 +367,6 @@ version = "24.10.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, @@ -440,7 +413,6 @@ version = "1.36.4" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "boto3-1.36.4-py3-none-any.whl", hash = "sha256:9f8f699e75ec63fcc98c4dd7290997c7c06c68d3ac8161ad4735fe71f5fe945c"}, {file = "boto3-1.36.4.tar.gz", hash = "sha256:eeceeb74ef8b65634d358c27aa074917f4449dc828f79301f1075232618eb502"}, @@ -460,7 +432,6 @@ version = "1.36.4" description = "Type annotations for boto3 1.36.4 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "boto3_stubs-1.36.4-py3-none-any.whl", hash = "sha256:3d4e9a8a4d7163bcdb6514b92e901706ce4f522dc8aeab8b4e157fa9e0138e49"}, {file = "boto3_stubs-1.36.4.tar.gz", hash = "sha256:36db2481d1a0291a2c05c30756fd83514c8d461f8dbc2915cb0c7cf06dc9ed70"}, @@ -897,7 +868,6 @@ version = "1.36.4" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "botocore-1.36.4-py3-none-any.whl", hash = "sha256:3f183aa7bb0c1ba02171143a05f28a4438abdf89dd6b8c0a7727040375a90520"}, {file = "botocore-1.36.4.tar.gz", hash = "sha256:ef54f5e3316040b6ff775941e6ed052c3230dda0079d17d9f9e3c757375f2027"}, @@ -907,8 +877,8 @@ files = [ jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ - {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, + {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, ] [package.extras] @@ -920,7 +890,6 @@ version = "1.36.4" description = "Type annotations and code completion for botocore" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "botocore_stubs-1.36.4-py3-none-any.whl", hash = "sha256:bbbd1b061b68bdc6d474ad9dfbf7f56386f416b297862347ae735f2272a78e4b"}, {file = "botocore_stubs-1.36.4.tar.gz", hash = "sha256:cc1677029f32d98c9e080885e2098424fd6afd41d6d3380f96d42c29e73e30b5"}, @@ -938,8 +907,6 @@ version = "0.16.1" description = "Python module to generate and modify bytecode" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "bytecode-0.16.1-py3-none-any.whl", hash = "sha256:1d4b61ed6bade4bff44127c8283bef8131a664ce4dbe09d64a88caf329939f35"}, {file = "bytecode-0.16.1.tar.gz", hash = "sha256:8fbbb637c880f339e564858bc6c7984ede67ae97bc71343379a535a9a4baf398"}, @@ -954,7 +921,6 @@ version = "24.1.2" description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, @@ -981,7 +947,6 @@ version = "2.34.24" description = "Check CDK v2 applications for best practices using a combination on available rule packs." optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "cdk_nag-2.34.24-py3-none-any.whl", hash = "sha256:9cafae19bfa8386e3a27f4c00f5a628714eb7cf82eb0ca6e41d8647b756f433b"}, {file = "cdk_nag-2.34.24.tar.gz", hash = "sha256:6c332ce7e0b2882af9740b6eab132943112e8e059a7dc5cf36d644fc97ed8f17"}, @@ -1000,7 +965,6 @@ version = "0.1.289" description = "AWS Generative AI CDK Constructs is a library for well-architected generative AI patterns." optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "cdklabs.generative_ai_cdk_constructs-0.1.289-py3-none-any.whl", hash = "sha256:66d7be4f3c2700436720786cee4809a3774328305f5aa2939e2c01fd6ab83acb"}, {file = "cdklabs_generative_ai_cdk_constructs-0.1.289.tar.gz", hash = "sha256:82addba364c18fbc5acc7e12a0372f37c4855b7b53517d2fe8bd4b3fc8e945d8"}, @@ -1020,7 +984,6 @@ version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, @@ -1032,7 +995,6 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -1102,7 +1064,6 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] -markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = "*" @@ -1113,7 +1074,6 @@ version = "1.22.6" description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "cfn_lint-1.22.6-py3-none-any.whl", hash = "sha256:70e8cc71ed12608964bdc1749c48140164d1fd65c30f3a5eaff4f9ee3396d908"}, {file = "cfn_lint-1.22.6.tar.gz", hash = "sha256:0652daf9e86d823f6513d430d233682b940806b6aad74cba2e4dc07de9603d84"}, @@ -1140,7 +1100,6 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -1242,7 +1201,6 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -1257,7 +1215,6 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -1269,7 +1226,6 @@ version = "6.9.0" description = "Add colours to the output of Python's logging module." optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff"}, {file = "colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2"}, @@ -1287,7 +1243,6 @@ version = "10.4.2" description = "A programming model for software-defined state" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "constructs-10.4.2-py3-none-any.whl", hash = "sha256:1f0f59b004edebfde0f826340698b8c34611f57848139b7954904c61645f13c1"}, {file = "constructs-10.4.2.tar.gz", hash = "sha256:ce54724360fffe10bab27d8a081844eb81f5ace7d7c62c84b719c49f164d5307"}, @@ -1304,7 +1259,6 @@ version = "7.6.10" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, @@ -1382,7 +1336,6 @@ version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -1412,7 +1365,6 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] -markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1433,8 +1385,6 @@ version = "0.50.2" description = "The Datadog Python library" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "datadog-0.50.2-py2.py3-none-any.whl", hash = "sha256:f3297858564b624efbd9ce43e4ea1c2c21e1f0477ab6d446060b536a1d9e431e"}, {file = "datadog-0.50.2.tar.gz", hash = "sha256:17725774bf2bb0a48f1d096d92707492c187f24ae08960af0b0c2fa97958fd51"}, @@ -1449,8 +1399,6 @@ version = "6.104.0" description = "The Datadog AWS Lambda Library" optional = true python-versions = "<4,>=3.8.0" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "datadog_lambda-6.104.0-py3-none-any.whl", hash = "sha256:72092f9057764515ef1e2fdf1cf25f82bfa70296411af9121db896e4a35fdf6e"}, {file = "datadog_lambda-6.104.0.tar.gz", hash = "sha256:eeb2ff0e4387812e7caf17e501d93fea3d85e3f9bb79581fb37556580d5a1c46"}, @@ -1471,8 +1419,6 @@ version = "2.19.1" description = "Datadog APM client library" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "ddtrace-2.19.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:c6bc63fcc10c3128c91d245c5e677fd204ff10e67c3c75d26f28d34b6436bd15"}, {file = "ddtrace-2.19.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:a8a5f66e2cfce6868a625efb9e1954bc08b484e9edb67fc2d051c6a05c991bf7"}, @@ -1546,10 +1492,10 @@ files = [ [package.dependencies] bytecode = [ - {version = ">=0.13.0", markers = "python_version < \"3.11.0\""}, {version = ">=0.16.0", markers = "python_version >= \"3.13.0\""}, {version = ">=0.15.0", markers = "python_version ~= \"3.12.0\""}, {version = ">=0.14.0", markers = "python_version ~= \"3.11.0\""}, + {version = ">=0.13.0", markers = "python_version < \"3.11.0\""}, ] envier = ">=0.5,<1.0" legacy-cgi = {version = ">=2.0.0", markers = "python_version >= \"3.13.0\""} @@ -1569,7 +1515,6 @@ version = "5.1.1" description = "Decorators for Humans" optional = false python-versions = ">=3.5" -groups = ["dev"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -1581,8 +1526,6 @@ version = "1.2.15" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320"}, {file = "deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"}, @@ -1600,7 +1543,6 @@ version = "2.1.0" description = "A library to handle automated deprecations" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, @@ -1615,7 +1557,6 @@ version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -1631,7 +1572,6 @@ version = "0.5.0" description = "Python module and CLI for hashing of file system directories." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "dirhash-0.5.0-py3-none-any.whl", hash = "sha256:523dfd6b058c64f45b31604376926c6e2bd2ea301d0df23095d4055674e38b09"}, {file = "dirhash-0.5.0.tar.gz", hash = "sha256:e60760f0ab2e935d8cb088923ea2c6492398dca42cec785df778985fd4cd5386"}, @@ -1646,7 +1586,6 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -1658,7 +1597,6 @@ version = "7.1.0" description = "A Python library for the Docker Engine API." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"}, {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"}, @@ -1681,8 +1619,6 @@ version = "0.6.1" description = "Python application configuration via the environment" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "envier-0.6.1-py3-none-any.whl", hash = "sha256:73609040a76be48bbcb97074d9969666484aa0de706183a6e9ef773156a8a6a9"}, {file = "envier-0.6.1.tar.gz", hash = "sha256:3309a01bb3d8850c9e7a31a5166d5a836846db2faecb79b9cb32654dd50ca9f9"}, @@ -1697,8 +1633,6 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1713,7 +1647,6 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1728,8 +1661,6 @@ version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"validation\" or extra == \"all\"" files = [ {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, @@ -1744,7 +1675,6 @@ version = "3.17.0" description = "A platform independent file lock." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"}, {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"}, @@ -1761,7 +1691,6 @@ version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, @@ -1779,7 +1708,6 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1794,7 +1722,6 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1813,7 +1740,6 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -1825,7 +1751,6 @@ version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, @@ -1847,7 +1772,6 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1872,7 +1796,6 @@ version = "2.3.0" description = "HashiCorp Vault API client" optional = false python-versions = "<4.0,>=3.8" -groups = ["dev"] files = [ {file = "hvac-2.3.0-py3-none-any.whl", hash = "sha256:a3afc5710760b6ee9b3571769df87a0333da45da05a5f9f963e1d3925a84be7d"}, {file = "hvac-2.3.0.tar.gz", hash = "sha256:1b85e3320e8642dd82f234db63253cda169a817589e823713dc5fca83119b1e2"}, @@ -1890,7 +1813,6 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1905,7 +1827,6 @@ version = "3.3.0" description = "Iterative JSON parser with standard Python iterator interfaces" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7f7a5250599c366369fbf3bc4e176f5daa28eb6bc7d6130d02462ed335361675"}, {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f87a7e52f79059f9c58f6886c262061065eb6f7554a587be7ed3aa63e6b71b34"}, @@ -2009,7 +1930,6 @@ version = "8.6.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, @@ -2033,7 +1953,6 @@ version = "6.5.2" description = "Read resources from Python packages" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, @@ -2056,7 +1975,6 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -2068,7 +1986,6 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" -groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -2083,7 +2000,6 @@ version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -2101,7 +2017,6 @@ version = "1.0.1" description = "JSON Matching Expressions" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, @@ -2113,7 +2028,6 @@ version = "1.106.0" description = "Python client for jsii runtime" optional = false python-versions = "~=3.8" -groups = ["dev"] files = [ {file = "jsii-1.106.0-py3-none-any.whl", hash = "sha256:5a44d7c3a5a326fa3d9befdb3770b380057e0a61e3804e7c4907f70d76afaaa2"}, {file = "jsii-1.106.0.tar.gz", hash = "sha256:c79c47899f53a7c3c4b20f80d3cd306628fe9ed1852eee970324c71eba1d974e"}, @@ -2134,7 +2048,6 @@ version = "1.33" description = "Apply JSON-Patches (RFC 6902)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -groups = ["dev"] files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, @@ -2149,10 +2062,10 @@ version = "1.7.0" description = "A final implementation of JSONPath for Python that aims to be standard compliant, including arithmetic and binary comparison operators and providing clear AST for metaprogramming." optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, + {file = "jsonpath_ng-1.7.0-py2-none-any.whl", hash = "sha256:898c93fc173f0c336784a3fa63d7434297544b7198124a68f9a3ef9597b0ae6e"}, + {file = "jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6"}, ] [package.dependencies] @@ -2164,7 +2077,6 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -2176,7 +2088,6 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -2198,7 +2109,6 @@ version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, @@ -2213,8 +2123,6 @@ version = "2.6.2" description = "Fork of the standard library cgi and cgitb modules, being deprecated in PEP-594" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"datadog\" and python_version >= \"3.13.0\"" files = [ {file = "legacy_cgi-2.6.2-py3-none-any.whl", hash = "sha256:a7b83afb1baf6ebeb56522537c5943ef9813cf933f6715e88a803f7edbce0bff"}, {file = "legacy_cgi-2.6.2.tar.gz", hash = "sha256:9952471ceb304043b104c22d00b4f333cac27a6abe446d8a528fc437cf13c85f"}, @@ -2226,7 +2134,6 @@ version = "1.3.8" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "Mako-1.3.8-py3-none-any.whl", hash = "sha256:42f48953c7eb91332040ff567eb7eea69b22e7a4affbc5ba8e845e8f730f6627"}, {file = "mako-1.3.8.tar.gz", hash = "sha256:577b97e414580d3e088d47c2dbbe9594aa7a5146ed2875d4dfa9075af2dd3cc8"}, @@ -2246,7 +2153,6 @@ version = "0.7.1" description = "Create Python CLI apps with little to no effort at all!" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "mando-0.7.1-py2.py3-none-any.whl", hash = "sha256:26ef1d70928b6057ee3ca12583d73c63e05c49de8972d620c278a7b206581a8a"}, {file = "mando-0.7.1.tar.gz", hash = "sha256:18baa999b4b613faefb00eac4efadcf14f510b59b924b66e08289aa1de8c3500"}, @@ -2264,7 +2170,6 @@ version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, @@ -2283,7 +2188,6 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -2308,7 +2212,6 @@ version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -2379,7 +2282,6 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -2391,7 +2293,6 @@ version = "1.3.4" description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -2403,7 +2304,6 @@ version = "2.1.3" description = "Manage multiple versions of your MkDocs-powered documentation" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "mike-2.1.3-py3-none-any.whl", hash = "sha256:d90c64077e84f06272437b464735130d380703a76a5738b152932884c60c062a"}, {file = "mike-2.1.3.tar.gz", hash = "sha256:abd79b8ea483fb0275b7972825d3082e5ae67a41820f8d8a0dc7a3f49944e810"}, @@ -2429,7 +2329,6 @@ version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, @@ -2461,7 +2360,6 @@ version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, @@ -2479,7 +2377,6 @@ version = "0.3.2" description = "MkDocs plugin for setting revision date from git per markdown file." optional = false python-versions = ">=3.4" -groups = ["dev"] files = [ {file = "mkdocs_git_revision_date_plugin-0.3.2-py3-none-any.whl", hash = "sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef"}, ] @@ -2495,7 +2392,6 @@ version = "9.5.50" description = "Documentation that simply works" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385"}, {file = "mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825"}, @@ -2525,7 +2421,6 @@ version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, @@ -2537,7 +2432,6 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2555,7 +2449,6 @@ version = "0.70.17" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ddb24e5bcdb64e90ec5543a1f05a39463068b6d3b804aa3f2a4e16ec28562d6"}, {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d729f55198a3579f6879766a6d9b72b42d4b320c0dcb7844afb774d75b573c62"}, @@ -2584,7 +2477,6 @@ version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, @@ -2644,7 +2536,6 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfig 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_appconfig-1.36.0-py3-none-any.whl", hash = "sha256:d627de43761a83991a0ab8cd10698d415f94dcc78a567433c7465fc8d1f5cc16"}, {file = "mypy_boto3_appconfig-1.36.0.tar.gz", hash = "sha256:3f38cbd2d7d359da88dc996eeeafa4c1174847909e31a327dd77263dfdfd5424"}, @@ -2659,7 +2550,6 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfigData 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_appconfigdata-1.36.0-py3-none-any.whl", hash = "sha256:68f02ce06ed9597b02154aff64655fc38c42919eda08fddb130ba17e9f70e9cb"}, {file = "mypy_boto3_appconfigdata-1.36.0.tar.gz", hash = "sha256:3436d149833ea69b4260a0f352aac19258d4676c7a21087625906f7da98624c7"}, @@ -2674,7 +2564,6 @@ version = "1.36.0" description = "Type annotations for boto3 CloudFormation 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_cloudformation-1.36.0-py3-none-any.whl", hash = "sha256:3f6cd81739aaf9634c4aa2b92579081038a76e4f2dec306d02eaaf558b332ce9"}, {file = "mypy_boto3_cloudformation-1.36.0.tar.gz", hash = "sha256:acc2c7ae8920f1167be097f6151685fe5aee99be2f890075edf93e05d298e8b0"}, @@ -2689,7 +2578,6 @@ version = "1.36.0" description = "Type annotations for boto3 CloudWatch 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_cloudwatch-1.36.0-py3-none-any.whl", hash = "sha256:2f6cb81c05a1b4be3510e0857b22913a241488bc08f55b0ad96e8b775c144891"}, {file = "mypy_boto3_cloudwatch-1.36.0.tar.gz", hash = "sha256:a370d61522121ab457c443c338a652d0d3e1c22102d9db9f197fd5dcb7e656a4"}, @@ -2704,7 +2592,6 @@ version = "1.36.0" description = "Type annotations for boto3 DynamoDB 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_dynamodb-1.36.0-py3-none-any.whl", hash = "sha256:b782a817ce8956f8d53ac94c85f969dfe51451fc99f16a3b62776f1e0ed3f1ba"}, {file = "mypy_boto3_dynamodb-1.36.0.tar.gz", hash = "sha256:1687e4689236a5391755126e86ec2596d408eb95408c31ac09a3d1eb289d516d"}, @@ -2719,7 +2606,6 @@ version = "1.36.0" description = "Type annotations for boto3 Lambda 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_lambda-1.36.0-py3-none-any.whl", hash = "sha256:8a6693be1352b51e232cee73f73ce36014d19b4777bdf6969c5e707aba424ca1"}, {file = "mypy_boto3_lambda-1.36.0.tar.gz", hash = "sha256:5e9f23702060529aad216a3ce2a2368391a112df07909fbd3aa80d573d84893c"}, @@ -2734,7 +2620,6 @@ version = "1.36.3" description = "Type annotations for boto3 CloudWatchLogs 1.36.3 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_logs-1.36.3-py3-none-any.whl", hash = "sha256:553cb31261eb4484394af9ac965fa33b0d414e927c47768021a0a6ec89625f64"}, {file = "mypy_boto3_logs-1.36.3.tar.gz", hash = "sha256:76d233632a36665094ac888a685fade150c10665ab4cad1b17265037fcadd098"}, @@ -2749,7 +2634,6 @@ version = "1.36.0" description = "Type annotations for boto3 S3 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_s3-1.36.0-py3-none-any.whl", hash = "sha256:a65ccb6be7b7ebf907887268d44975e435b1fc1164fc0a25de310e2b832f7e91"}, {file = "mypy_boto3_s3-1.36.0.tar.gz", hash = "sha256:80a881847b0e1fbc5edcad8b2870c110e31e7ef128db42402b70c159b7e93d5a"}, @@ -2764,7 +2648,6 @@ version = "1.36.0" description = "Type annotations for boto3 SecretsManager 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_secretsmanager-1.36.0-py3-none-any.whl", hash = "sha256:d7fd56b08afed32ce26f2663ec57f9ea074e1e5149a4388eccb46653e3cb5a66"}, {file = "mypy_boto3_secretsmanager-1.36.0.tar.gz", hash = "sha256:6e1f91cd5b0c1f0533f8cfa91e4755855d39931475e7d1e23ee8dbb2e7163d18"}, @@ -2779,7 +2662,6 @@ version = "1.36.0" description = "Type annotations for boto3 SSM 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_ssm-1.36.0-py3-none-any.whl", hash = "sha256:c79a6a949f0b57e68bd48d3d15eb56b975633ffdfaa449d119831c205228cab6"}, {file = "mypy_boto3_ssm-1.36.0.tar.gz", hash = "sha256:bbb9a9ce0e318cad2a53f8200102b4fdc547c7f33912146df82698c9ae40181f"}, @@ -2794,7 +2676,6 @@ version = "1.36.0" description = "Type annotations for boto3 XRay 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_boto3_xray-1.36.0-py3-none-any.whl", hash = "sha256:b92a06db10f623db4ec0641227f468b7a57c77f8e599846cfddace4b434f70a5"}, {file = "mypy_boto3_xray-1.36.0.tar.gz", hash = "sha256:5ae2b4c333bf2881870ffb96f1d99cd5e7ee1706d071b6923dcd6de6ceb3ac0c"}, @@ -2809,7 +2690,6 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" -groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -2821,7 +2701,6 @@ version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, @@ -2840,7 +2719,6 @@ version = "2024.10.9" description = "Flexible test automation." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "nox-2024.10.9-py3-none-any.whl", hash = "sha256:1d36f309a0a2a853e9bccb76bbef6bb118ba92fa92674d15604ca99adeb29eab"}, {file = "nox-2024.10.9.tar.gz", hash = "sha256:7aa9dc8d1c27e9f45ab046ffd1c3b2c4f7c91755304769df231308849ebded95"}, @@ -2863,8 +2741,6 @@ version = "1.16.0" description = "OpenTelemetry Python API" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "opentelemetry_api-1.16.0-py3-none-any.whl", hash = "sha256:79e8f0cf88dbdd36b6abf175d2092af1efcaa2e71552d0d2b3b181a9707bf4bc"}, {file = "opentelemetry_api-1.16.0.tar.gz", hash = "sha256:4b0e895a3b1f5e1908043ebe492d33e33f9ccdbe6d02d3994c2f8721a63ddddb"}, @@ -2880,7 +2756,6 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -2892,7 +2767,6 @@ version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, @@ -2908,7 +2782,6 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -2920,7 +2793,6 @@ version = "6.1.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" -groups = ["dev"] files = [ {file = "pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"}, {file = "pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24"}, @@ -2932,7 +2804,6 @@ version = "0.11.5" description = "Auto-generate API documentation for Python projects." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pdoc3-0.11.5-py3-none-any.whl", hash = "sha256:b614436239716e1655e538f68a42c62a0bac566e70ddd86c58bc66d6a9ec90a0"}, {file = "pdoc3-0.11.5.tar.gz", hash = "sha256:fc40607e3f46860ba42c02d30075fe1a52c039b77ffa8e86c1cbc4a8078841b3"}, @@ -2948,7 +2819,6 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -2965,7 +2835,6 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -2981,8 +2850,6 @@ version = "3.11" description = "Python Lex & Yacc" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, @@ -2994,8 +2861,6 @@ version = "5.29.3" description = "" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, @@ -3016,7 +2881,6 @@ version = "0.0.3" description = "Publication helps you maintain public-api-friendly modules by preventing unintentional access to private implementation details via introspection." optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "publication-0.0.3-py2.py3-none-any.whl", hash = "sha256:0248885351febc11d8a1098d5c8e3ab2dabcf3e8c0c96db1e17ecd12b53afbe6"}, {file = "publication-0.0.3.tar.gz", hash = "sha256:68416a0de76dddcdd2930d1c8ef853a743cc96c82416c4e4d3b5d901c6276dc4"}, @@ -3028,7 +2892,6 @@ version = "9.0.0" description = "Get CPU info with pure Python" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, @@ -3040,12 +2903,10 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] -markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" @@ -3053,12 +2914,10 @@ version = "2.10.5" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"}, {file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"}, ] -markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] annotated-types = ">=0.6.0" @@ -3075,7 +2934,6 @@ version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -3178,7 +3036,6 @@ files = [ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] -markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" @@ -3189,8 +3046,6 @@ version = "2.7.1" description = "Settings management using Pydantic" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"all\"" files = [ {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"}, {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"}, @@ -3211,7 +3066,6 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -3226,7 +3080,6 @@ version = "10.14.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pymdown_extensions-10.14.1-py3-none-any.whl", hash = "sha256:637951cbfbe9874ba28134fb3ce4b8bcadd6aca89ac4998ec29dcbafd554ae08"}, {file = "pymdown_extensions-10.14.1.tar.gz", hash = "sha256:b65801996a0cd4f42a3110810c306c45b7313c09b0610a6f773730f2a9e3c96b"}, @@ -3245,7 +3098,6 @@ version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, @@ -3260,7 +3112,6 @@ version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -3283,7 +3134,6 @@ version = "0.24.0" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"}, {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"}, @@ -3302,7 +3152,6 @@ version = "4.0.0" description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "pytest-benchmark-4.0.0.tar.gz", hash = "sha256:fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1"}, {file = "pytest_benchmark-4.0.0-py3-none-any.whl", hash = "sha256:fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6"}, @@ -3319,18 +3168,17 @@ histogram = ["pygal", "pygaljs"] [[package]] name = "pytest-cov" -version = "5.0.0" +version = "6.0.0" description = "Pytest plugin for measuring coverage." optional = false -python-versions = ">=3.8" -groups = ["dev"] +python-versions = ">=3.9" files = [ - {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, - {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, + {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, + {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, ] [package.dependencies] -coverage = {version = ">=5.2.1", extras = ["toml"]} +coverage = {version = ">=7.5", extras = ["toml"]} pytest = ">=4.6" [package.extras] @@ -3342,7 +3190,6 @@ version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, @@ -3360,7 +3207,6 @@ version = "0.7.0" description = "Pytest Plugin to disable socket calls during tests" optional = false python-versions = ">=3.8,<4.0" -groups = ["dev"] files = [ {file = "pytest_socket-0.7.0-py3-none-any.whl", hash = "sha256:7e0f4642177d55d317bbd58fc68c6bd9048d6eadb2d46a89307fa9221336ce45"}, {file = "pytest_socket-0.7.0.tar.gz", hash = "sha256:71ab048cbbcb085c15a4423b73b619a8b35d6a307f46f78ea46be51b1b7e11b3"}, @@ -3375,7 +3221,6 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -3396,7 +3241,6 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -3411,8 +3255,6 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"all\"" files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -3427,8 +3269,6 @@ version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" -groups = ["dev"] -markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, @@ -3456,7 +3296,6 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -3519,7 +3358,6 @@ version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, @@ -3534,7 +3372,6 @@ version = "6.0.1" description = "Code Metrics in Python" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "radon-6.0.1-py2.py3-none-any.whl", hash = "sha256:632cc032364a6f8bb1010a2f6a12d0f14bc7e5ede76585ef29dc0cecf4cd8859"}, {file = "radon-6.0.1.tar.gz", hash = "sha256:d1ac0053943a893878940fedc8b19ace70386fc9c9bf0a09229a44125ebf45b5"}, @@ -3553,12 +3390,10 @@ version = "5.2.1" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"}, {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"}, ] -markers = {main = "extra == \"redis\""} [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} @@ -3573,7 +3408,6 @@ version = "0.36.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "referencing-0.36.1-py3-none-any.whl", hash = "sha256:363d9c65f080d0d70bc41c721dce3c7f3e77fc09f269cd5c8813da18069a6794"}, {file = "referencing-0.36.1.tar.gz", hash = "sha256:ca2e6492769e3602957e9b831b94211599d2aade9477f5d44110d2530cf9aade"}, @@ -3590,7 +3424,6 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -3694,7 +3527,6 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -3716,7 +3548,6 @@ version = "0.9.5" description = "Easy to use retry decorator." optional = false python-versions = ">=2.6" -groups = ["dev"] files = [ {file = "retry2-0.9.5-py2.py3-none-any.whl", hash = "sha256:f7fee13b1e15d0611c462910a6aa72a8919823988dd0412152bc3719c89a4e55"}, ] @@ -3730,7 +3561,6 @@ version = "13.9.4" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" -groups = ["dev"] files = [ {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, @@ -3750,7 +3580,6 @@ version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, @@ -3863,7 +3692,6 @@ version = "0.9.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "ruff-0.9.2-py3-none-linux_armv6l.whl", hash = "sha256:80605a039ba1454d002b32139e4970becf84b5fee3a3c3bf1c2af6f61a784347"}, {file = "ruff-0.9.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9aab82bb20afd5f596527045c01e6ae25a718ff1784cb92947bff1f83068b00"}, @@ -3891,7 +3719,6 @@ version = "0.11.1" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "s3transfer-0.11.1-py3-none-any.whl", hash = "sha256:8fa0aa48177be1f3425176dfe1ab85dcd3d962df603c3dbfc585e6bf857ef0ff"}, {file = "s3transfer-0.11.1.tar.gz", hash = "sha256:3f25c900a367c8b7f7d8f9c34edc87e300bde424f779dc9f0a8ae4f9df9264f6"}, @@ -3909,7 +3736,6 @@ version = "0.0.4" description = "Flexible recursive directory iterator: scandir meets glob(\"**\", recursive=True)" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "scantree-0.0.4-py3-none-any.whl", hash = "sha256:7616ab65aa6b7f16fcf8e6fa1d9afaa99a27ab72bba05c61b691853b96763174"}, {file = "scantree-0.0.4.tar.gz", hash = "sha256:15bd5cb24483b04db2c70653604e8ea3522e98087db7e38ab8482f053984c0ac"}, @@ -3925,7 +3751,6 @@ version = "2.20.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "sentry_sdk-2.20.0-py2.py3-none-any.whl", hash = "sha256:c359a1edf950eb5e80cffd7d9111f3dbeef57994cb4415df37d39fda2cf22364"}, {file = "sentry_sdk-2.20.0.tar.gz", hash = "sha256:afa82713a92facf847df3c6f63cec71eb488d826a50965def3d7722aa6f0fdab"}, @@ -3981,8 +3806,6 @@ version = "75.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, @@ -4003,7 +3826,6 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -4015,7 +3837,6 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -4027,7 +3848,6 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -4039,7 +3859,6 @@ version = "5.4.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "stevedore-5.4.0-py3-none-any.whl", hash = "sha256:b0be3c4748b3ea7b854b265dcb4caa891015e442416422be16f8b31756107857"}, {file = "stevedore-5.4.0.tar.gz", hash = "sha256:79e92235ecb828fe952b6b8b0c6c87863248631922c8e8e0fa5b17b232c4514d"}, @@ -4054,7 +3873,6 @@ version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, @@ -4072,7 +3890,6 @@ version = "3.7.1" description = "Library provides lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "testcontainers-3.7.1-py2.py3-none-any.whl", hash = "sha256:7f48cef4bf0ccd78f1a4534d4b701a003a3bace851f24eae58a32f9e3f0aeba0"}, ] @@ -4107,8 +3924,6 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_full_version <= \"3.11.0a6\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -4150,7 +3965,6 @@ version = "2.13.3" description = "Run-time type checker for Python" optional = false python-versions = ">=3.5.3" -groups = ["dev"] files = [ {file = "typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1"}, {file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"}, @@ -4166,7 +3980,6 @@ version = "0.23.6" description = "Type annotations and code completion for awscrt" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_awscrt-0.23.6-py3-none-any.whl", hash = "sha256:fbf9c221af5607b24bf17f8431217ce8b9a27917139edbc984891eb63fd5a593"}, {file = "types_awscrt-0.23.6.tar.gz", hash = "sha256:405bce8c281f9e7c6c92a229225cc0bf10d30729a6a601123213389bd524b8b1"}, @@ -4178,7 +3991,6 @@ version = "1.16.0.20241221" description = "Typing stubs for cffi" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_cffi-1.16.0.20241221-py3-none-any.whl", hash = "sha256:e5b76b4211d7a9185f6ab8d06a106d56c7eb80af7cdb8bfcb4186ade10fb112f"}, {file = "types_cffi-1.16.0.20241221.tar.gz", hash = "sha256:1c96649618f4b6145f58231acb976e0b448be6b847f7ab733dabe62dfbff6591"}, @@ -4193,7 +4005,6 @@ version = "24.1.0.20240722" description = "Typing stubs for pyOpenSSL" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types-pyOpenSSL-24.1.0.20240722.tar.gz", hash = "sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39"}, {file = "types_pyOpenSSL-24.1.0.20240722-py3-none-any.whl", hash = "sha256:6a7a5d2ec042537934cfb4c9d4deb0e16c4c6250b09358df1f083682fe6fda54"}, @@ -4209,7 +4020,6 @@ version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, @@ -4221,7 +4031,6 @@ version = "4.6.0.20241004" description = "Typing stubs for redis" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types-redis-4.6.0.20241004.tar.gz", hash = "sha256:5f17d2b3f9091ab75384153bfa276619ffa1cf6a38da60e10d5e6749cc5b902e"}, {file = "types_redis-4.6.0.20241004-py3-none-any.whl", hash = "sha256:ef5da68cb827e5f606c8f9c0b49eeee4c2669d6d97122f301d3a55dc6a63f6ed"}, @@ -4237,7 +4046,6 @@ version = "2.31.0.6" description = "Typing stubs for requests" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, @@ -4252,7 +4060,6 @@ version = "0.11.1" description = "Type annotations and code completion for s3transfer" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_s3transfer-0.11.1-py3-none-any.whl", hash = "sha256:ddb20d103361c2d7cf95e9e73468cdd12f049f503b1512e6fdfe5a66fa086d2d"}, {file = "types_s3transfer-0.11.1.tar.gz", hash = "sha256:6ab89d4d76bcbf6d494582949963b4672347e8daa397d9790f3684b4fcf873c4"}, @@ -4264,7 +4071,6 @@ version = "75.8.0.20250110" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480"}, {file = "types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271"}, @@ -4276,7 +4082,6 @@ version = "1.26.25.14" description = "Typing stubs for urllib3" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, @@ -4288,7 +4093,6 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -4300,8 +4104,6 @@ version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, @@ -4389,7 +4191,6 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, @@ -4406,7 +4207,6 @@ version = "0.1.0" description = "Flexible version handling" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, @@ -4421,7 +4221,6 @@ version = "20.29.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779"}, {file = "virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35"}, @@ -4442,7 +4241,6 @@ version = "6.0.0" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, @@ -4485,7 +4283,6 @@ version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -4567,7 +4364,6 @@ files = [ {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, ] -markers = {main = "extra == \"tracer\" or extra == \"all\" or extra == \"datadog\" or extra == \"datamasking\""} [[package]] name = "xenon" @@ -4575,7 +4371,6 @@ version = "0.9.3" description = "Monitor code metrics for Python on your CI server" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "xenon-0.9.3-py2.py3-none-any.whl", hash = "sha256:6e2c2c251cc5e9d01fe984e623499b13b2140fcbf74d6c03a613fa43a9347097"}, {file = "xenon-0.9.3.tar.gz", hash = "sha256:4a7538d8ba08aa5d79055fb3e0b2393c0bd6d7d16a4ab0fcdef02ef1f10a43fa"}, @@ -4592,8 +4387,6 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"datadog\"" files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -4605,7 +4398,6 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, @@ -4630,6 +4422,6 @@ tracer = ["aws-xray-sdk"] validation = ["fastjsonschema"] [metadata] -lock-version = "2.1" +lock-version = "2.0" python-versions = ">=3.9,<4.0.0" -content-hash = "9e537cd6a43226f5123e4a4903d8b3d90e28da7430d8cbd33931bdbcc9674330" +content-hash = "45e848a0b8b3eb352a932680cbd52c7f64f9691bc41e163f5079ff4db53e6cb0" diff --git a/pyproject.toml b/pyproject.toml index 6b554ed4828..8b4bd022026 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,7 +80,7 @@ pytest = "^8.3.4" black = "^24.8" boto3 = "^1.26.164" isort = "^5.13.2" -pytest-cov = "^5.0.0" +pytest-cov = ">=5,<7" pytest-mock = "^3.14.0" pdoc3 = "^0.11.0" pytest-asyncio = "^0.24.0" From 06b6bfc12770cb48e74bcd1cbe15dce96b0089a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:20:57 +0000 Subject: [PATCH 28/52] chore(deps-dev): bump ruff from 0.9.2 to 0.9.3 (#5911) Bumps [ruff](https://github.com/astral-sh/ruff) from 0.9.2 to 0.9.3. - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.9.2...0.9.3) --- updated-dependencies: - dependency-name: ruff dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 40 ++++++++++++++++++++-------------------- pyproject.toml | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/poetry.lock b/poetry.lock index d43394eea25..86b74804698 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3688,29 +3688,29 @@ files = [ [[package]] name = "ruff" -version = "0.9.2" +version = "0.9.3" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.9.2-py3-none-linux_armv6l.whl", hash = "sha256:80605a039ba1454d002b32139e4970becf84b5fee3a3c3bf1c2af6f61a784347"}, - {file = "ruff-0.9.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9aab82bb20afd5f596527045c01e6ae25a718ff1784cb92947bff1f83068b00"}, - {file = "ruff-0.9.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fbd337bac1cfa96be615f6efcd4bc4d077edbc127ef30e2b8ba2a27e18c054d4"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b35259b0cbf8daa22a498018e300b9bb0174c2bbb7bcba593935158a78054d"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b6a9701d1e371bf41dca22015c3f89769da7576884d2add7317ec1ec8cb9c3c"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cc53e68b3c5ae41e8faf83a3b89f4a5d7b2cb666dff4b366bb86ed2a85b481f"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8efd9da7a1ee314b910da155ca7e8953094a7c10d0c0a39bfde3fcfd2a015684"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3292c5a22ea9a5f9a185e2d131dc7f98f8534a32fb6d2ee7b9944569239c648d"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a605fdcf6e8b2d39f9436d343d1f0ff70c365a1e681546de0104bef81ce88df"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c547f7f256aa366834829a08375c297fa63386cbe5f1459efaf174086b564247"}, - {file = "ruff-0.9.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d18bba3d3353ed916e882521bc3e0af403949dbada344c20c16ea78f47af965e"}, - {file = "ruff-0.9.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b338edc4610142355ccf6b87bd356729b62bf1bc152a2fad5b0c7dc04af77bfe"}, - {file = "ruff-0.9.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:492a5e44ad9b22a0ea98cf72e40305cbdaf27fac0d927f8bc9e1df316dcc96eb"}, - {file = "ruff-0.9.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:af1e9e9fe7b1f767264d26b1075ac4ad831c7db976911fa362d09b2d0356426a"}, - {file = "ruff-0.9.2-py3-none-win32.whl", hash = "sha256:71cbe22e178c5da20e1514e1e01029c73dc09288a8028a5d3446e6bba87a5145"}, - {file = "ruff-0.9.2-py3-none-win_amd64.whl", hash = "sha256:c5e1d6abc798419cf46eed03f54f2e0c3adb1ad4b801119dedf23fcaf69b55b5"}, - {file = "ruff-0.9.2-py3-none-win_arm64.whl", hash = "sha256:a1b63fa24149918f8b37cef2ee6fff81f24f0d74b6f0bdc37bc3e1f2143e41c6"}, - {file = "ruff-0.9.2.tar.gz", hash = "sha256:b5eceb334d55fae5f316f783437392642ae18e16dcf4f1858d55d3c2a0f8f5d0"}, + {file = "ruff-0.9.3-py3-none-linux_armv6l.whl", hash = "sha256:7f39b879064c7d9670197d91124a75d118d00b0990586549949aae80cdc16624"}, + {file = "ruff-0.9.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a187171e7c09efa4b4cc30ee5d0d55a8d6c5311b3e1b74ac5cb96cc89bafc43c"}, + {file = "ruff-0.9.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c59ab92f8e92d6725b7ded9d4a31be3ef42688a115c6d3da9457a5bda140e2b4"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc153c25e715be41bb228bc651c1e9b1a88d5c6e5ed0194fa0dfea02b026439"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:646909a1e25e0dc28fbc529eab8eb7bb583079628e8cbe738192853dbbe43af5"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a5a46e09355695fbdbb30ed9889d6cf1c61b77b700a9fafc21b41f097bfbba4"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c4bb09d2bbb394e3730d0918c00276e79b2de70ec2a5231cd4ebb51a57df9ba1"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96a87ec31dc1044d8c2da2ebbed1c456d9b561e7d087734336518181b26b3aa5"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb7554aca6f842645022fe2d301c264e6925baa708b392867b7a62645304df4"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabc332b7075a914ecea912cd1f3d4370489c8018f2c945a30bcc934e3bc06a6"}, + {file = "ruff-0.9.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:33866c3cc2a575cbd546f2cd02bdd466fed65118e4365ee538a3deffd6fcb730"}, + {file = "ruff-0.9.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:006e5de2621304c8810bcd2ee101587712fa93b4f955ed0985907a36c427e0c2"}, + {file = "ruff-0.9.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ba6eea4459dbd6b1be4e6bfc766079fb9b8dd2e5a35aff6baee4d9b1514ea519"}, + {file = "ruff-0.9.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:90230a6b8055ad47d3325e9ee8f8a9ae7e273078a66401ac66df68943ced029b"}, + {file = "ruff-0.9.3-py3-none-win32.whl", hash = "sha256:eabe5eb2c19a42f4808c03b82bd313fc84d4e395133fb3fc1b1516170a31213c"}, + {file = "ruff-0.9.3-py3-none-win_amd64.whl", hash = "sha256:040ceb7f20791dfa0e78b4230ee9dce23da3b64dd5848e40e3bf3ab76468dcf4"}, + {file = "ruff-0.9.3-py3-none-win_arm64.whl", hash = "sha256:800d773f6d4d33b0a3c60e2c6ae8f4c202ea2de056365acfa519aa48acf28e0b"}, + {file = "ruff-0.9.3.tar.gz", hash = "sha256:8293f89985a090ebc3ed1064df31f3b4b56320cdfcec8b60d3295bddb955c22a"}, ] [[package]] @@ -4424,4 +4424,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0.0" -content-hash = "45e848a0b8b3eb352a932680cbd52c7f64f9691bc41e163f5079ff4db53e6cb0" +content-hash = "8398ae6e6f63b27b2c54c6748b4cfb2c868b9a03c0afe632ce6ddeae69aafd84" diff --git a/pyproject.toml b/pyproject.toml index 8b4bd022026..d13acd6db31 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -114,7 +114,7 @@ types-python-dateutil = "^2.8.19.6" aws-cdk-aws-appsync-alpha = "^2.59.0a0" httpx = ">=0.23.3,<0.29.0" sentry-sdk = ">=1.22.2,<3.0.0" -ruff = ">=0.5.1,<0.9.3" +ruff = ">=0.5.1,<0.9.4" retry2 = "^0.9.5" pytest-socket = ">=0.6,<0.8" types-redis = "^4.6.0.7" From 060c4d2ca949ad39bb69b494c4865d7f770332e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:25:03 +0000 Subject: [PATCH 29/52] chore(deps-dev): bump pytest-benchmark from 4.0.0 to 5.1.0 (#5909) Bumps [pytest-benchmark](https://github.com/ionelmc/pytest-benchmark) from 4.0.0 to 5.1.0. - [Changelog](https://github.com/ionelmc/pytest-benchmark/blob/master/CHANGELOG.rst) - [Commits](https://github.com/ionelmc/pytest-benchmark/compare/v4.0.0...v5.1.0) --- updated-dependencies: - dependency-name: pytest-benchmark dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 14 +++++++------- pyproject.toml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index 86b74804698..7e103c270f1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3148,23 +3148,23 @@ testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] [[package]] name = "pytest-benchmark" -version = "4.0.0" +version = "5.1.0" description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "pytest-benchmark-4.0.0.tar.gz", hash = "sha256:fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1"}, - {file = "pytest_benchmark-4.0.0-py3-none-any.whl", hash = "sha256:fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6"}, + {file = "pytest-benchmark-5.1.0.tar.gz", hash = "sha256:9ea661cdc292e8231f7cd4c10b0319e56a2118e2c09d9f50e1b3d150d2aca105"}, + {file = "pytest_benchmark-5.1.0-py3-none-any.whl", hash = "sha256:922de2dfa3033c227c96da942d1878191afa135a29485fb942e85dff1c592c89"}, ] [package.dependencies] py-cpuinfo = "*" -pytest = ">=3.8" +pytest = ">=8.1" [package.extras] aspect = ["aspectlib"] elasticsearch = ["elasticsearch"] -histogram = ["pygal", "pygaljs"] +histogram = ["pygal", "pygaljs", "setuptools"] [[package]] name = "pytest-cov" @@ -4424,4 +4424,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0.0" -content-hash = "8398ae6e6f63b27b2c54c6748b4cfb2c868b9a03c0afe632ce6ddeae69aafd84" +content-hash = "fe3b05a62fd4f33445f9882cad62d5312e0da49a06d0d9a3dcb48305e20cdc76" diff --git a/pyproject.toml b/pyproject.toml index d13acd6db31..2e904c96767 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -96,7 +96,7 @@ aws-cdk-lib = "^2.176.0" "aws-cdk.aws-apigatewayv2-authorizers-alpha" = "^2.38.1-alpha.0" "aws-cdk.aws-lambda-python-alpha" = "^2.176.0a0" "cdklabs.generative-ai-cdk-constructs" = "^0.1.289" -pytest-benchmark = "^4.0.0" +pytest-benchmark = ">=4,<6" types-requests = "^2.31.0" typing-extensions = "^4.12.2" mkdocs-material = "^9.5.50" From fd855bf17de55a7495d9bce660999be0e7919c13 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:50:40 +0000 Subject: [PATCH 30/52] chore(deps-dev): bump testcontainers from 3.7.1 to 4.9.1 (#5907) Bumps [testcontainers](https://github.com/testcontainers/testcontainers-python) from 3.7.1 to 4.9.1. - [Release notes](https://github.com/testcontainers/testcontainers-python/releases) - [Changelog](https://github.com/testcontainers/testcontainers-python/blob/main/CHANGELOG.md) - [Commits](https://github.com/testcontainers/testcontainers-python/compare/v3.7.1...testcontainers-v4.9.1) --- updated-dependencies: - dependency-name: testcontainers dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 72 +++++++++++++++++++++++++++----------------------- pyproject.toml | 2 +- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7e103c270f1..1425cd0261a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1537,20 +1537,6 @@ wrapt = ">=1.10,<2" [package.extras] dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "jinja2 (>=3.0.3,<3.1.0)", "setuptools", "sphinx (<2)", "tox"] -[[package]] -name = "deprecation" -version = "2.1.0" -description = "A library to handle automated deprecations" -optional = false -python-versions = "*" -files = [ - {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, - {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, -] - -[package.dependencies] -packaging = "*" - [[package]] name = "dill" version = "0.3.9" @@ -3253,7 +3239,7 @@ six = ">=1.5" name = "python-dotenv" version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" -optional = true +optional = false python-versions = ">=3.8" files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, @@ -3886,37 +3872,57 @@ dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] [[package]] name = "testcontainers" -version = "3.7.1" -description = "Library provides lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container" +version = "4.9.1" +description = "Python library for throwaway instances of anything that can run in a Docker container" optional = false -python-versions = ">=3.7" +python-versions = "<4.0,>=3.9" files = [ - {file = "testcontainers-3.7.1-py2.py3-none-any.whl", hash = "sha256:7f48cef4bf0ccd78f1a4534d4b701a003a3bace851f24eae58a32f9e3f0aeba0"}, + {file = "testcontainers-4.9.1-py3-none-any.whl", hash = "sha256:315fb94b42a383872df530aa45319745278ef0cc18b9cfcdc231a75d14afa5a0"}, + {file = "testcontainers-4.9.1.tar.gz", hash = "sha256:37fe9a222549ddb788463935965b16f91809e9a8d654f437d6a59eac9b77f76f"}, ] [package.dependencies] -deprecation = "*" -docker = ">=4.0.0" -redis = {version = "*", optional = true, markers = "extra == \"redis\""} +docker = "*" +python-dotenv = "*" +redis = {version = "*", optional = true, markers = "extra == \"generic\" or extra == \"redis\""} +typing-extensions = "*" +urllib3 = "*" wrapt = "*" [package.extras] -arangodb = ["python-arango"] -azurite = ["azure-storage-blob"] +arangodb = ["python-arango (>=7.8,<8.0)"] +aws = ["boto3", "httpx"] +azurite = ["azure-storage-blob (>=12.19,<13.0)"] +chroma = ["chromadb-client"] clickhouse = ["clickhouse-driver"] -docker-compose = ["docker-compose"] -google-cloud-pubsub = ["google-cloud-pubsub (<2)"] -kafka = ["kafka-python"] +cosmosdb = ["azure-cosmos"] +db2 = ["ibm_db_sa", "sqlalchemy"] +generic = ["httpx", "redis"] +google = ["google-cloud-datastore (>=2)", "google-cloud-pubsub (>=2)"] +influxdb = ["influxdb", "influxdb-client"] +k3s = ["kubernetes", "pyyaml"] keycloak = ["python-keycloak"] -mongo = ["pymongo"] -mssqlserver = ["pymssql"] -mysql = ["pymysql", "sqlalchemy"] +localstack = ["boto3"] +mailpit = ["cryptography"] +minio = ["minio"] +mongodb = ["pymongo"] +mssql = ["pymssql", "sqlalchemy"] +mysql = ["pymysql[rsa]", "sqlalchemy"] +nats = ["nats-py"] neo4j = ["neo4j"] -oracle = ["cx-Oracle", "sqlalchemy"] -postgresql = ["psycopg2-binary", "sqlalchemy"] +opensearch = ["opensearch-py"] +oracle = ["oracledb", "sqlalchemy"] +oracle-free = ["oracledb", "sqlalchemy"] +qdrant = ["qdrant-client"] rabbitmq = ["pika"] redis = ["redis"] +registry = ["bcrypt"] +scylla = ["cassandra-driver (==3.29.1)"] selenium = ["selenium"] +sftp = ["cryptography"] +test-module-import = ["httpx"] +trino = ["trino"] +weaviate = ["weaviate-client (>=4.5.4,<5.0.0)"] [[package]] name = "tomli" @@ -4424,4 +4430,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0.0" -content-hash = "fe3b05a62fd4f33445f9882cad62d5312e0da49a06d0d9a3dcb48305e20cdc76" +content-hash = "8cab6b378f9056bd9fc0dd7eb8bb79ac7b57385ab059e59652da96e1a3a7eb61" diff --git a/pyproject.toml b/pyproject.toml index 2e904c96767..671b31b0000 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -118,7 +118,7 @@ ruff = ">=0.5.1,<0.9.4" retry2 = "^0.9.5" pytest-socket = ">=0.6,<0.8" types-redis = "^4.6.0.7" -testcontainers = { extras = ["redis"], version = "^3.7.1" } +testcontainers = { extras = ["redis"], version = ">=3.7.1,<5.0.0" } multiprocess = "^0.70.16" boto3-stubs = {extras = ["appconfig", "appconfigdata", "cloudformation", "cloudwatch", "dynamodb", "lambda", "logs", "s3", "secretsmanager", "ssm", "xray"], version = "^1.34.139"} nox = "^2024.4.15" From 5517f1d4cd04dba8d7121cb6d820e5ead2b19910 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Jan 2025 08:35:46 +0000 Subject: [PATCH 31/52] chore(deps-dev): bump cfn-lint from 1.22.6 to 1.22.7 (#5910) Bumps [cfn-lint](https://github.com/aws-cloudformation/cfn-lint) from 1.22.6 to 1.22.7. - [Release notes](https://github.com/aws-cloudformation/cfn-lint/releases) - [Changelog](https://github.com/aws-cloudformation/cfn-lint/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws-cloudformation/cfn-lint/compare/v1.22.6...v1.22.7) --- updated-dependencies: - dependency-name: cfn-lint dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1425cd0261a..fe73c5cfe20 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1070,13 +1070,13 @@ pycparser = "*" [[package]] name = "cfn-lint" -version = "1.22.6" +version = "1.22.7" description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved" optional = false python-versions = ">=3.8" files = [ - {file = "cfn_lint-1.22.6-py3-none-any.whl", hash = "sha256:70e8cc71ed12608964bdc1749c48140164d1fd65c30f3a5eaff4f9ee3396d908"}, - {file = "cfn_lint-1.22.6.tar.gz", hash = "sha256:0652daf9e86d823f6513d430d233682b940806b6aad74cba2e4dc07de9603d84"}, + {file = "cfn_lint-1.22.7-py3-none-any.whl", hash = "sha256:6ae732fd11cba6b01ce577fe4d985c407166010faf385eb5b30236916b02ad29"}, + {file = "cfn_lint-1.22.7.tar.gz", hash = "sha256:0cd99a217c3f197939b15dd0badfa49e90142d315c78e644f07bb8d943dd1b3e"}, ] [package.dependencies] @@ -4430,4 +4430,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0.0" -content-hash = "8cab6b378f9056bd9fc0dd7eb8bb79ac7b57385ab059e59652da96e1a3a7eb61" +content-hash = "c3c5d4004da5f472f4276af465232be3dcc07d9f98b1d4f5c662c1ad1603c857" diff --git a/pyproject.toml b/pyproject.toml index 671b31b0000..401083980a9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -108,7 +108,7 @@ hvac = "^2.3.0" aws-requests-auth = "^0.4.3" urllib3 = "<2" requests = ">=2.32.0" -cfn-lint = "1.22.6" +cfn-lint = "1.22.7" mypy = "^1.1.1" types-python-dateutil = "^2.8.19.6" aws-cdk-aws-appsync-alpha = "^2.59.0a0" From 3688e6ea955a91d1f0d3e75284f4358247d8a705 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Jan 2025 07:49:00 -0300 Subject: [PATCH 32/52] chore(ci): changelog rebuild (#5913) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 101 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 85 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f9e68e3dd3..e4d6aea60f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,45 +6,113 @@ ## Bug Fixes +* **event_handler:** add tests for PEP 563 compatibility with OpenAPI ([#5886](https://github.com/aws-powertools/powertools-lambda-python/issues/5886)) +* **event_handler:** fix forward references resolution in OpenAPI ([#5885](https://github.com/aws-powertools/powertools-lambda-python/issues/5885)) +* **parser:** make identitySource optional for ApiGatewayAuthorizerRequestV2 model ([#5880](https://github.com/aws-powertools/powertools-lambda-python/issues/5880)) + +## Documentation + +* **event_handler:** demonstrate handling optional security routes ([#5895](https://github.com/aws-powertools/powertools-lambda-python/issues/5895)) +* **layer:** update layer version number - v3.4.1 ([#5869](https://github.com/aws-powertools/powertools-lambda-python/issues/5869)) + +## Features + +* **idempotency:** add support for custom Idempotency key prefix ([#5898](https://github.com/aws-powertools/powertools-lambda-python/issues/5898)) +* **logger:** add context manager for logger keys ([#5883](https://github.com/aws-powertools/powertools-lambda-python/issues/5883)) +* **parser:** add AWS Transfer Family model ([#5906](https://github.com/aws-powertools/powertools-lambda-python/issues/5906)) + +## Maintenance + +* **ci:** make `pyproject.toml` fully compatible with Poetryv2 ([#5902](https://github.com/aws-powertools/powertools-lambda-python/issues/5902)) +* **ci:** adjust token permission ([#5867](https://github.com/aws-powertools/powertools-lambda-python/issues/5867)) +* **ci:** new pre-release 3.4.2a0 ([#5873](https://github.com/aws-powertools/powertools-lambda-python/issues/5873)) +* **ci:** fix permissions for gh pages ([#5866](https://github.com/aws-powertools/powertools-lambda-python/issues/5866)) +* **ci:** drop support for Python 3.8 ([#5896](https://github.com/aws-powertools/powertools-lambda-python/issues/5896)) +* **deps:** bump squidfunk/mkdocs-material from `ba73db5` to `41942f7` in /docs ([#5890](https://github.com/aws-powertools/powertools-lambda-python/issues/5890)) +* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.175.1a0 to 2.176.0a0 ([#5882](https://github.com/aws-powertools/powertools-lambda-python/issues/5882)) +* **deps-dev:** bump cfn-lint from 1.22.5 to 1.22.6 ([#5900](https://github.com/aws-powertools/powertools-lambda-python/issues/5900)) +* **deps-dev:** bump boto3-stubs from 1.36.2 to 1.36.3 ([#5894](https://github.com/aws-powertools/powertools-lambda-python/issues/5894)) +* **deps-dev:** bump pytest-cov from 5.0.0 to 6.0.0 ([#5908](https://github.com/aws-powertools/powertools-lambda-python/issues/5908)) +* **deps-dev:** bump mkdocs-material from 9.5.49 to 9.5.50 ([#5889](https://github.com/aws-powertools/powertools-lambda-python/issues/5889)) +* **deps-dev:** bump ruff from 0.9.2 to 0.9.3 ([#5911](https://github.com/aws-powertools/powertools-lambda-python/issues/5911)) +* **deps-dev:** bump boto3-stubs from 1.36.1 to 1.36.2 ([#5881](https://github.com/aws-powertools/powertools-lambda-python/issues/5881)) +* **deps-dev:** bump aws-cdk from 2.175.1 to 2.176.0 ([#5878](https://github.com/aws-powertools/powertools-lambda-python/issues/5878)) +* **deps-dev:** bump ruff from 0.9.1 to 0.9.2 ([#5877](https://github.com/aws-powertools/powertools-lambda-python/issues/5877)) +* **deps-dev:** bump aws-cdk-lib from 2.175.1 to 2.176.0 ([#5876](https://github.com/aws-powertools/powertools-lambda-python/issues/5876)) +* **deps-dev:** bump mypy-boto3-appconfigdata from 1.35.93 to 1.36.0 in the boto-typing group ([#5875](https://github.com/aws-powertools/powertools-lambda-python/issues/5875)) +* **deps-dev:** bump sentry-sdk from 2.19.2 to 2.20.0 ([#5870](https://github.com/aws-powertools/powertools-lambda-python/issues/5870)) +* **deps-dev:** bump boto3-stubs from 1.35.97 to 1.35.99 ([#5874](https://github.com/aws-powertools/powertools-lambda-python/issues/5874)) +* **deps-dev:** bump cfn-lint from 1.22.4 to 1.22.5 ([#5872](https://github.com/aws-powertools/powertools-lambda-python/issues/5872)) +* **deps-dev:** bump pytest-benchmark from 4.0.0 to 5.1.0 ([#5909](https://github.com/aws-powertools/powertools-lambda-python/issues/5909)) +* **deps-dev:** bump testcontainers from 3.7.1 to 4.9.1 ([#5907](https://github.com/aws-powertools/powertools-lambda-python/issues/5907)) +* **deps-dev:** bump cfn-lint from 1.22.6 to 1.22.7 ([#5910](https://github.com/aws-powertools/powertools-lambda-python/issues/5910)) + + + +## [v3.4.1] - 2025-01-14 +## Bug Fixes + * **appsync:** enhance consistency for custom resolver field naming in AppSync ([#5801](https://github.com/aws-powertools/powertools-lambda-python/issues/5801)) * **idempotency:** add support for Optional type when serializing output ([#5590](https://github.com/aws-powertools/powertools-lambda-python/issues/5590)) ## Documentation +* **community:** data masking blog post ([#5831](https://github.com/aws-powertools/powertools-lambda-python/issues/5831)) * **home:** fix date typo and shorten message. ([#5798](https://github.com/aws-powertools/powertools-lambda-python/issues/5798)) * **layer:** update layer version number - v3.4.0 ([#5785](https://github.com/aws-powertools/powertools-lambda-python/issues/5785)) ## Maintenance +* version bump +* **ci:** new pre-release 3.4.1a7 ([#5816](https://github.com/aws-powertools/powertools-lambda-python/issues/5816)) * **ci:** new pre-release 3.4.1a0 ([#5783](https://github.com/aws-powertools/powertools-lambda-python/issues/5783)) +* **ci:** change token permissions ([#5862](https://github.com/aws-powertools/powertools-lambda-python/issues/5862)) +* **ci:** change token permissions / update aws-credentials action ([#5861](https://github.com/aws-powertools/powertools-lambda-python/issues/5861)) +* **ci:** fix dependency resolution ([#5859](https://github.com/aws-powertools/powertools-lambda-python/issues/5859)) +* **ci:** fix dependency resolution ([#5858](https://github.com/aws-powertools/powertools-lambda-python/issues/5858)) +* **ci:** change token permissions ([#5865](https://github.com/aws-powertools/powertools-lambda-python/issues/5865)) * **ci:** new pre-release 3.4.1a1 ([#5789](https://github.com/aws-powertools/powertools-lambda-python/issues/5789)) -* **ci:** new pre-release 3.4.1a9 ([#5822](https://github.com/aws-powertools/powertools-lambda-python/issues/5822)) * **ci:** new pre-release 3.4.1a2 ([#5791](https://github.com/aws-powertools/powertools-lambda-python/issues/5791)) -* **ci:** new pre-release 3.4.1a8 ([#5818](https://github.com/aws-powertools/powertools-lambda-python/issues/5818)) -* **ci:** new pre-release 3.4.1a7 ([#5816](https://github.com/aws-powertools/powertools-lambda-python/issues/5816)) -* **ci:** new pre-release 3.4.1a6 ([#5813](https://github.com/aws-powertools/powertools-lambda-python/issues/5813)) -* **ci:** new pre-release 3.4.1a5 ([#5807](https://github.com/aws-powertools/powertools-lambda-python/issues/5807)) * **ci:** new pre-release 3.4.1a3 ([#5794](https://github.com/aws-powertools/powertools-lambda-python/issues/5794)) +* **ci:** new pre-release 3.4.1a10 ([#5845](https://github.com/aws-powertools/powertools-lambda-python/issues/5845)) * **ci:** new pre-release 3.4.1a4 ([#5796](https://github.com/aws-powertools/powertools-lambda-python/issues/5796)) -* **deps:** bump pydantic-settings from 2.7.0 to 2.7.1 ([#5815](https://github.com/aws-powertools/powertools-lambda-python/issues/5815)) +* **ci:** new pre-release 3.4.1a5 ([#5807](https://github.com/aws-powertools/powertools-lambda-python/issues/5807)) +* **ci:** new pre-release 3.4.1a8 ([#5818](https://github.com/aws-powertools/powertools-lambda-python/issues/5818)) +* **ci:** new pre-release 3.4.1a6 ([#5813](https://github.com/aws-powertools/powertools-lambda-python/issues/5813)) +* **ci:** new pre-release 3.4.1a9 ([#5822](https://github.com/aws-powertools/powertools-lambda-python/issues/5822)) +* **deps:** bump pydantic from 2.10.4 to 2.10.5 ([#5848](https://github.com/aws-powertools/powertools-lambda-python/issues/5848)) * **deps:** bump jinja2 from 3.1.4 to 3.1.5 in /docs ([#5787](https://github.com/aws-powertools/powertools-lambda-python/issues/5787)) +* **deps:** bump pydantic-settings from 2.7.0 to 2.7.1 ([#5815](https://github.com/aws-powertools/powertools-lambda-python/issues/5815)) +* **deps-dev:** bump ruff from 0.8.4 to 0.8.6 ([#5833](https://github.com/aws-powertools/powertools-lambda-python/issues/5833)) * **deps-dev:** bump boto3-stubs from 1.35.90 to 1.35.92 ([#5827](https://github.com/aws-powertools/powertools-lambda-python/issues/5827)) -* **deps-dev:** bump mypy from 1.14.0 to 1.14.1 ([#5812](https://github.com/aws-powertools/powertools-lambda-python/issues/5812)) -* **deps-dev:** bump boto3-stubs from 1.35.89 to 1.35.90 ([#5809](https://github.com/aws-powertools/powertools-lambda-python/issues/5809)) -* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.287 to 0.1.288 ([#5793](https://github.com/aws-powertools/powertools-lambda-python/issues/5793)) -* **deps-dev:** bump cfn-lint from 1.22.2 to 1.22.3 ([#5810](https://github.com/aws-powertools/powertools-lambda-python/issues/5810)) +* **deps-dev:** bump aws-cdk from 2.173.4 to 2.174.0 ([#5832](https://github.com/aws-powertools/powertools-lambda-python/issues/5832)) * **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.173.2a0 to 2.173.4a0 ([#5811](https://github.com/aws-powertools/powertools-lambda-python/issues/5811)) +* **deps-dev:** bump cfn-lint from 1.22.2 to 1.22.3 ([#5810](https://github.com/aws-powertools/powertools-lambda-python/issues/5810)) +* **deps-dev:** bump boto3-stubs from 1.35.89 to 1.35.90 ([#5809](https://github.com/aws-powertools/powertools-lambda-python/issues/5809)) +* **deps-dev:** bump mypy from 1.14.0 to 1.14.1 ([#5812](https://github.com/aws-powertools/powertools-lambda-python/issues/5812)) +* **deps-dev:** bump boto3-stubs from 1.35.92 to 1.35.93 ([#5835](https://github.com/aws-powertools/powertools-lambda-python/issues/5835)) * **deps-dev:** bump aws-cdk-lib from 2.173.4 to 2.174.1 ([#5838](https://github.com/aws-powertools/powertools-lambda-python/issues/5838)) +* **deps-dev:** bump mypy-boto3-appconfigdata from 1.35.0 to 1.35.93 in the boto-typing group ([#5840](https://github.com/aws-powertools/powertools-lambda-python/issues/5840)) +* **deps-dev:** bump aws-cdk-lib from 2.173.2 to 2.173.4 ([#5803](https://github.com/aws-powertools/powertools-lambda-python/issues/5803)) +* **deps-dev:** bump aws-cdk from 2.173.2 to 2.173.4 ([#5802](https://github.com/aws-powertools/powertools-lambda-python/issues/5802)) * **deps-dev:** bump boto3-stubs from 1.35.87 to 1.35.89 ([#5804](https://github.com/aws-powertools/powertools-lambda-python/issues/5804)) * **deps-dev:** bump jinja2 from 3.1.4 to 3.1.5 ([#5788](https://github.com/aws-powertools/powertools-lambda-python/issues/5788)) -* **deps-dev:** bump aws-cdk from 2.173.2 to 2.173.4 ([#5802](https://github.com/aws-powertools/powertools-lambda-python/issues/5802)) +* **deps-dev:** bump aws-cdk from 2.174.0 to 2.174.1 ([#5841](https://github.com/aws-powertools/powertools-lambda-python/issues/5841)) +* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.173.4a0 to 2.174.1a0 ([#5842](https://github.com/aws-powertools/powertools-lambda-python/issues/5842)) +* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.287 to 0.1.288 ([#5793](https://github.com/aws-powertools/powertools-lambda-python/issues/5793)) +* **deps-dev:** bump boto3-stubs from 1.35.93 to 1.35.94 ([#5844](https://github.com/aws-powertools/powertools-lambda-python/issues/5844)) +* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.288 to 0.1.289 ([#5843](https://github.com/aws-powertools/powertools-lambda-python/issues/5843)) +* **deps-dev:** bump boto3-stubs from 1.35.94 to 1.35.95 ([#5847](https://github.com/aws-powertools/powertools-lambda-python/issues/5847)) +* **deps-dev:** bump cfn-lint from 1.22.3 to 1.22.4 ([#5849](https://github.com/aws-powertools/powertools-lambda-python/issues/5849)) +* **deps-dev:** bump boto3-stubs from 1.35.95 to 1.35.96 ([#5850](https://github.com/aws-powertools/powertools-lambda-python/issues/5850)) +* **deps-dev:** bump boto3-stubs from 1.35.96 to 1.35.97 ([#5852](https://github.com/aws-powertools/powertools-lambda-python/issues/5852)) * **deps-dev:** bump boto3-stubs from 1.35.86 to 1.35.87 ([#5786](https://github.com/aws-powertools/powertools-lambda-python/issues/5786)) -* **deps-dev:** bump aws-cdk from 2.173.4 to 2.174.0 ([#5832](https://github.com/aws-powertools/powertools-lambda-python/issues/5832)) -* **deps-dev:** bump ruff from 0.8.4 to 0.8.6 ([#5833](https://github.com/aws-powertools/powertools-lambda-python/issues/5833)) +* **deps-dev:** bump aws-cdk from 2.174.1 to 2.175.0 ([#5854](https://github.com/aws-powertools/powertools-lambda-python/issues/5854)) +* **deps-dev:** bump aws-cdk from 2.175.0 to 2.175.1 ([#5863](https://github.com/aws-powertools/powertools-lambda-python/issues/5863)) * **deps-dev:** bump boto3-stubs from 1.35.85 to 1.35.86 ([#5780](https://github.com/aws-powertools/powertools-lambda-python/issues/5780)) * **deps-dev:** bump mypy from 1.13.0 to 1.14.0 ([#5779](https://github.com/aws-powertools/powertools-lambda-python/issues/5779)) -* **deps-dev:** bump boto3-stubs from 1.35.92 to 1.35.93 ([#5835](https://github.com/aws-powertools/powertools-lambda-python/issues/5835)) -* **deps-dev:** bump aws-cdk-lib from 2.173.2 to 2.173.4 ([#5803](https://github.com/aws-powertools/powertools-lambda-python/issues/5803)) +* **deps-dev:** bump ruff from 0.8.6 to 0.9.1 ([#5853](https://github.com/aws-powertools/powertools-lambda-python/issues/5853)) +* **deps-dev:** bump aws-cdk-lib from 2.174.1 to 2.175.1 ([#5856](https://github.com/aws-powertools/powertools-lambda-python/issues/5856)) @@ -5853,7 +5921,8 @@ * Merge pull request [#5](https://github.com/aws-powertools/powertools-lambda-python/issues/5) from jfuss/feat/python38 -[Unreleased]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.4.0...HEAD +[Unreleased]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.4.1...HEAD +[v3.4.1]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.4.0...v3.4.1 [v3.4.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.3.0...v3.4.0 [v3.3.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.2.0...v3.3.0 [v3.2.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.1.0...v3.2.0 From 015f923d98371a687bbd117d706b64ec103038ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=20Falc=C3=A3o?= Date: Fri, 24 Jan 2025 17:39:22 -0300 Subject: [PATCH 33/52] docs(data_classes): improve Event Source Data Classes documentation (#5916) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * rewrite data classes docs * update examples up to CloudFormation Custom Resource * continue fixing the doc examples * examples up to lambda function url * complete all examples * fix mypy and use events from tests * fix highlight kinesis event --------- Signed-off-by: Ana Falcão --- docs/media/utilities_data_classes.png | Bin 317980 -> 161851 bytes docs/utilities/data_classes.md | 1179 +++++------------ .../events/active_mq_event_example.json | 27 + .../event_sources/events/apigw_event.json | 20 + .../aws_config_rule_scheduled.json | 0 .../{src => events}/debugging_event.json | 0 .../{src => events}/debugging_output.json | 0 .../event_sources/events/s3ObjectEvent.json | 29 + .../{src => events}/vpc_lattice_payload.json | 0 .../vpc_lattice_v2_payload.json | 0 .../event_sources/src/active_mq_example.py | 18 + examples/event_sources/src/albEvent.py | 9 + examples/event_sources/src/apigw_auth_v2.py | 30 + .../src/apigw_authorizer_request.py | 29 + .../src/apigw_authorizer_token.py | 29 + .../src/apigw_proxy_decorator.py | 9 + examples/event_sources/src/apigw_proxy_v2.py | 9 + .../event_sources/src/appSyncAuthorizer.py | 33 + examples/event_sources/src/appSyncResolver.py | 57 + examples/event_sources/src/aws_config_rule.py | 3 +- .../src/aws_config_rule_item_changed.json | 13 - .../src/aws_config_rule_oversized.json | 12 - ...edrock_agent_event.py => bedrock_agent.py} | 3 +- .../event_sources/src/cloudWatchDashboard.py | 31 + .../cloudformation_custom_resource_handler.py | 28 +- examples/event_sources/src/cloudwatch_logs.py | 18 + .../event_sources/src/code_pipeline_job.py | 10 + .../src/codedeploy_lifecycle_hook.py | 9 + .../event_sources/src/cognito_create_auth.py | 11 + .../event_sources/src/cognito_define_auth.py | 30 + .../src/cognito_post_confirmation.py | 9 + .../event_sources/src/cognito_verify_auth.py | 10 + .../event_sources/src/connect_contact_flow.py | 14 + .../src/dynamodb_multiple_records.py | 13 + examples/event_sources/src/dynamodb_stream.py | 16 + .../event_sources/src/eventBridgeEvent.py | 11 + .../src/getting_started_data_classes.py | 9 + examples/event_sources/src/kafka_event.py | 12 + .../src/kinesisStreamCloudWatchLogs.py | 17 + .../src/kinesis_batch_example.py | 29 + examples/event_sources/src/kinesis_streams.py | 40 + .../event_sources/src/lambdaFunctionUrl.py | 7 + .../event_sources/src/rabbit_mq_example.py | 21 + examples/event_sources/src/s3Event.py | 18 + examples/event_sources/src/s3_event_bridge.py | 13 + .../event_sources/src/s3_object_lambda.py | 31 + .../src/secrets_manager_event.json | 5 - examples/event_sources/src/ses_event.py | 13 + examples/event_sources/src/sns_event.py | 13 + examples/event_sources/src/sqs_event.py | 13 + 50 files changed, 1070 insertions(+), 890 deletions(-) create mode 100644 examples/event_sources/events/active_mq_event_example.json create mode 100644 examples/event_sources/events/apigw_event.json rename examples/event_sources/{src => events}/aws_config_rule_scheduled.json (100%) rename examples/event_sources/{src => events}/debugging_event.json (100%) rename examples/event_sources/{src => events}/debugging_output.json (100%) create mode 100644 examples/event_sources/events/s3ObjectEvent.json rename examples/event_sources/{src => events}/vpc_lattice_payload.json (100%) rename examples/event_sources/{src => events}/vpc_lattice_v2_payload.json (100%) create mode 100644 examples/event_sources/src/active_mq_example.py create mode 100644 examples/event_sources/src/albEvent.py create mode 100644 examples/event_sources/src/apigw_auth_v2.py create mode 100644 examples/event_sources/src/apigw_authorizer_request.py create mode 100644 examples/event_sources/src/apigw_authorizer_token.py create mode 100644 examples/event_sources/src/apigw_proxy_decorator.py create mode 100644 examples/event_sources/src/apigw_proxy_v2.py create mode 100644 examples/event_sources/src/appSyncAuthorizer.py create mode 100644 examples/event_sources/src/appSyncResolver.py delete mode 100644 examples/event_sources/src/aws_config_rule_item_changed.json delete mode 100644 examples/event_sources/src/aws_config_rule_oversized.json rename examples/event_sources/src/{bedrock_agent_event.py => bedrock_agent.py} (83%) create mode 100644 examples/event_sources/src/cloudWatchDashboard.py create mode 100644 examples/event_sources/src/cloudwatch_logs.py create mode 100644 examples/event_sources/src/code_pipeline_job.py create mode 100644 examples/event_sources/src/codedeploy_lifecycle_hook.py create mode 100644 examples/event_sources/src/cognito_create_auth.py create mode 100644 examples/event_sources/src/cognito_define_auth.py create mode 100644 examples/event_sources/src/cognito_post_confirmation.py create mode 100644 examples/event_sources/src/cognito_verify_auth.py create mode 100644 examples/event_sources/src/connect_contact_flow.py create mode 100644 examples/event_sources/src/dynamodb_multiple_records.py create mode 100644 examples/event_sources/src/dynamodb_stream.py create mode 100644 examples/event_sources/src/eventBridgeEvent.py create mode 100644 examples/event_sources/src/getting_started_data_classes.py create mode 100644 examples/event_sources/src/kafka_event.py create mode 100644 examples/event_sources/src/kinesisStreamCloudWatchLogs.py create mode 100644 examples/event_sources/src/kinesis_batch_example.py create mode 100644 examples/event_sources/src/kinesis_streams.py create mode 100644 examples/event_sources/src/lambdaFunctionUrl.py create mode 100644 examples/event_sources/src/rabbit_mq_example.py create mode 100644 examples/event_sources/src/s3Event.py create mode 100644 examples/event_sources/src/s3_event_bridge.py create mode 100644 examples/event_sources/src/s3_object_lambda.py delete mode 100644 examples/event_sources/src/secrets_manager_event.json create mode 100644 examples/event_sources/src/ses_event.py create mode 100644 examples/event_sources/src/sns_event.py create mode 100644 examples/event_sources/src/sqs_event.py diff --git a/docs/media/utilities_data_classes.png b/docs/media/utilities_data_classes.png index 94ed83bde976e32c1a22e20b1b37a33f3ff826cc..bb224772355e5260bbb070f508813cd0713268a6 100644 GIT binary patch literal 161851 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

e2QAv~(SyRm3!0#VWt=q+B95*7}AD)#YR$ zUrP}25boutDHrp0ZAQ)UVi(GM881YbA7b@*Pw;d{yb@Nj?6P^Cjv=mYAEXW=0cw4; z*_AU7xKz~C#(jScm;4!kYme5MBxr5y0URo#1)i4z3e2xjHx7db3_)uWnz%afBG^6t z9=kK`+X%W*@F1OEZqJzlZ0>yK9;$J&OJ3$GSO(H^6tFyEHiI4=UetT*USkDrKfd^F zwy9dl!FX4{+a4sa7sa5Sm&1(MQHV}g2z*mD2!p;ov4YVA8?$I6y!>EQxAf;-sj(;7 z--=K1+H{n-7eO(}rH9ZyZwpyl|B*1#^*XLBtl&qgGMdyIc~C3dcSl3TbQOLd(q7o@ zXlXW`6OG3ni%tNPa`p=z!Rm+|yZ2dBRt4h{X&L%K@q z561+*-9JglAdNDj2;WK(9sD#tOxSdp(T#UVq+;hTxIkbww6Px(|UR z$;lf(HL3oZ?SJKDRP$|C*M1IVSO+-v9DtY{k|uL^ZJ5_59~Y0NMbQtF0t2n4dRs75 zQFdeHY4O5Zxzwspx%T#rpZvT3JvV@rl$S3&AMlSy{^!(f%n?7tPT`^!g1^t8|Jz48 zQIWj+?ES^Hjq=|=kyixF)KOOP9e=H~jqUWW|MRli0gv+a;M?Wh|5#=l&-#!5$=9MY zCM25rfA;P?D1=ncZ693ucVqTnUgNq1`&dh*-tWKsx+Iv%S QZ-Rfva2m=Pis!xm5C4H%%m4rY literal 317980 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

IS?H!4!a007AQ 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

wCMs}KB3q7E8Ns}D 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 diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index 4cd738fad70..2574d119acd 100644 --- a/docs/utilities/data_classes.md +++ b/docs/utilities/data_classes.md @@ -5,115 +5,105 @@ description: Utility -Event Source Data Classes utility provides classes self-describing Lambda event sources. +Event Source Data Classes provides self-describing and strongly-typed classes for various AWS Lambda event sources. ## Key features * Type hinting and code completion for common event types * Helper functions for decoding/deserializing nested fields * Docstrings for fields contained in event schemas - -**Background** - -When authoring Lambda functions, you often need to understand the schema of the event dictionary which is passed to the -handler. There are several common event types which follow a specific schema, depending on the service triggering the -Lambda function. +* Standardized attribute-based access to event properties ## Getting started -### Utilizing the data classes +???+ tip + All examples shared in this documentation are available within the [project repository](https://github.com/aws-powertools/powertools-lambda-python/tree/develop/examples){target="_blank"}. + +There are two ways to use Event Source Data Classes in your Lambda functions. -The classes are initialized by passing in the Lambda event object into the constructor of the appropriate data class or -by using the `event_source` decorator. +**Method 1: Direct Initialization** -For example, if your Lambda function is being triggered by an API Gateway proxy integration, you can use the -`APIGatewayProxyEvent` class. +You can initialize the appropriate data class by passing the Lambda event object to its constructor. === "app.py" ```python hl_lines="1 4" - from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEvent - - def lambda_handler(event: dict, context): - event = APIGatewayProxyEvent(event) - if 'helloworld' in event.path and event.http_method == 'GET': - do_something_with(event.body, user) + --8<-- "examples/event_sources/src/getting_started_data_classes.py" ``` -Same example as above, but using the `event_source` decorator - -=== "app.py" - - ```python hl_lines="1 3" - from aws_lambda_powertools.utilities.data_classes import event_source, APIGatewayProxyEvent +=== "API Gateway Proxy Example Event" - @event_source(data_class=APIGatewayProxyEvent) - def lambda_handler(event: APIGatewayProxyEvent, context): - if 'helloworld' in event.path and event.http_method == 'GET': - do_something_with(event.body, user) + ```json hl_lines="3-4" + --8<-- "examples/event_sources/events/apigw_event.json" ``` -Log Data Event for Troubleshooting +**Method 2: Using the event_source Decorator** + +Alternatively, you can use the `event_source` decorator to automatically parse the event. === "app.py" - ```python hl_lines="4 8" - from aws_lambda_powertools.utilities.data_classes import event_source, APIGatewayProxyEvent - from aws_lambda_powertools.logging.logger import Logger + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/apigw_proxy_decorator.py" + ``` - logger = Logger(service="hello_logs", level="DEBUG") +=== "API Gateway Proxy Example Event" - @event_source(data_class=APIGatewayProxyEvent) - def lambda_handler(event: APIGatewayProxyEvent, context): - logger.debug(event) + ```json hl_lines="3-4" + --8<-- "examples/event_sources/events/apigw_event.json" ``` -**Autocomplete with self-documented properties and methods** +### Autocomplete with self-documented properties and methods + +Event Source Data Classes has the ability to leverage IDE autocompletion and inline documentation. +When using the APIGatewayProxyEvent class, for example, the IDE will offer autocomplete suggestions for various properties and methods. ![Utilities Data Classes](../media/utilities_data_classes.png) ## Supported event sources -| Event Source | Data_class | -|-------------------------------------------------------------------------------|----------------------------------------------------| -| [Active MQ](#active-mq) | `ActiveMQEvent` | -| [API Gateway Authorizer](#api-gateway-authorizer) | `APIGatewayAuthorizerRequestEvent` | -| [API Gateway Authorizer V2](#api-gateway-authorizer-v2) | `APIGatewayAuthorizerEventV2` | -| [API Gateway Proxy](#api-gateway-proxy) | `APIGatewayProxyEvent` | -| [API Gateway Proxy V2](#api-gateway-proxy-v2) | `APIGatewayProxyEventV2` | -| [Application Load Balancer](#application-load-balancer) | `ALBEvent` | -| [AppSync Authorizer](#appsync-authorizer) | `AppSyncAuthorizerEvent` | -| [AppSync Resolver](#appsync-resolver) | `AppSyncResolverEvent` | -| [AWS Config Rule](#aws-config-rule) | `AWSConfigRuleEvent` | -| [Bedrock Agent](#bedrock-agent) | `BedrockAgent` | -| [CloudFormation Custom Resource](#cloudformation-custom-resource) | `CloudFormationCustomResourceEvent` | -| [CloudWatch Alarm State Change Action](#cloudwatch-alarm-state-change-action) | `CloudWatchAlarmEvent` | -| [CloudWatch Dashboard Custom Widget](#cloudwatch-dashboard-custom-widget) | `CloudWatchDashboardCustomWidgetEvent` | -| [CloudWatch Logs](#cloudwatch-logs) | `CloudWatchLogsEvent` | -| [CodeDeploy Lifecycle Hook](#codedeploy-lifecycle-hook) | `CodeDeployLifecycleHookEvent` | -| [CodePipeline Job Event](#codepipeline-job) | `CodePipelineJobEvent` | -| [Cognito User Pool](#cognito-user-pool) | Multiple available under `cognito_user_pool_event` | -| [Connect Contact Flow](#connect-contact-flow) | `ConnectContactFlowEvent` | -| [DynamoDB streams](#dynamodb-streams) | `DynamoDBStreamEvent`, `DynamoDBRecordEventName` | -| [EventBridge](#eventbridge) | `EventBridgeEvent` | -| [Kafka](#kafka) | `KafkaEvent` | -| [Kinesis Data Stream](#kinesis-streams) | `KinesisStreamEvent` | -| [Kinesis Firehose Delivery Stream](#kinesis-firehose-delivery-stream) | `KinesisFirehoseEvent` | -| [Lambda Function URL](#lambda-function-url) | `LambdaFunctionUrlEvent` | -| [Rabbit MQ](#rabbit-mq) | `RabbitMQEvent` | -| [S3](#s3) | `S3Event` | -| [S3 Batch Operations](#s3-batch-operations) | `S3BatchOperationEvent` | -| [S3 Object Lambda](#s3-object-lambda) | `S3ObjectLambdaEvent` | -| [S3 EventBridge Notification](#s3-eventbridge-notification) | `S3EventBridgeNotificationEvent` | -| [SES](#ses) | `SESEvent` | -| [SNS](#sns) | `SNSEvent` | -| [SQS](#sqs) | `SQSEvent` | -| [VPC Lattice V2](#vpc-lattice-v2) | `VPCLatticeV2Event` | -| [VPC Lattice V1](#vpc-lattice-v1) | `VPCLatticeEvent` | +Each event source is linked to its corresponding GitHub file with the full set of properties, methods, and docstrings specific to each event type. + +| Event Source | Data_class | Properties | +|--------------|------------|------------| +| [Active MQ](#active-mq) | `ActiveMQEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/active_mq_event.py) | +| [API Gateway Authorizer](#api-gateway-authorizer) | `APIGatewayAuthorizerRequestEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py) | +| [API Gateway Authorizer V2](#api-gateway-authorizer-v2) | `APIGatewayAuthorizerEventV2` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py) | +| [API Gateway Proxy](#api-gateway-proxy) | `APIGatewayProxyEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py) | +| [API Gateway Proxy V2](#api-gateway-proxy-v2) | `APIGatewayProxyEventV2` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py) | +| [Application Load Balancer](#application-load-balancer) | `ALBEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/alb_event.py) | +| [AppSync Authorizer](#appsync-authorizer) | `AppSyncAuthorizerEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py) | +| [AppSync Resolver](#appsync-resolver) | `AppSyncResolverEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py) | +| [AWS Config Rule](#aws-config-rule) | `AWSConfigRuleEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/aws_config_rule_event.py) | +| [Bedrock Agent](#bedrock-agent) | `BedrockAgent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py) | +| [CloudFormation Custom Resource](#cloudformation-custom-resource) | `CloudFormationCustomResourceEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/cloudformation_custom_resource_event.py) | +| [CloudWatch Alarm State Change Action](#cloudwatch-alarm-state-change-action) | `CloudWatchAlarmEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/cloud_watch_alarm_event.py) | +| [CloudWatch Dashboard Custom Widget](#cloudwatch-dashboard-custom-widget) | `CloudWatchDashboardCustomWidgetEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/cloud_watch_custom_widget_event.py) | +| [CloudWatch Logs](#cloudwatch-logs) | `CloudWatchLogsEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/cloud_watch_logs_event.py) | +| [CodeDeploy Lifecycle Hook](#codedeploy-lifecycle-hook) | `CodeDeployLifecycleHookEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/code_deploy_lifecycle_hook_event.py) | +| [CodePipeline Job Event](#codepipeline-job) | `CodePipelineJobEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/code_pipeline_job_event.py) | +| [Cognito User Pool](#cognito-user-pool) | Multiple available under `cognito_user_pool_event` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py) | +| [Connect Contact Flow](#connect-contact-flow) | `ConnectContactFlowEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/connect_contact_flow_event.py) | +| [DynamoDB streams](#dynamodb-streams) | `DynamoDBStreamEvent`, `DynamoDBRecordEventName` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py) | +| [EventBridge](#eventbridge) | `EventBridgeEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/event_bridge_event.py) | +| [Kafka](#kafka) | `KafkaEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/kafka_event.py) | +| [Kinesis Data Stream](#kinesis-streams) | `KinesisStreamEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py) | +| [Kinesis Firehose Delivery Stream](#kinesis-firehose-delivery-stream) | `KinesisFirehoseEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py) | +| [Lambda Function URL](#lambda-function-url) | `LambdaFunctionUrlEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/lambda_function_url_event.py) | +| [Rabbit MQ](#rabbit-mq) | `RabbitMQEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/rabbit_mq_event.py) | +| [S3](#s3) | `S3Event` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/s3_event.py) | +| [S3 Batch Operations](#s3-batch-operations) | `S3BatchOperationEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/s3_batch_operation_event.py) | +| [S3 Object Lambda](#s3-object-lambda) | `S3ObjectLambdaEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/s3_object_event.py) | +| [S3 EventBridge Notification](#s3-eventbridge-notification) | `S3EventBridgeNotificationEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/s3_event.py) | +| [SES](#ses) | `SESEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/ses_event.py) | +| [SNS](#sns) | `SNSEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/sns_event.py) | +| [SQS](#sqs) | `SQSEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/sqs_event.py) | +| [VPC Lattice V2](#vpc-lattice-v2) | `VPCLatticeV2Event` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py) | +| [VPC Lattice V1](#vpc-lattice-v1) | `VPCLatticeEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py) | ???+ info - The examples provided below are far from exhaustive - the data classes themselves are designed to provide a form of - documentation inherently (via autocompletion, types and docstrings). + The examples showcase a subset of Event Source Data Classes capabilities - for comprehensive details, leverage your IDE's + autocompletion, refer to type hints and docstrings, and explore the [full API reference](https://docs.powertools.aws.dev/lambda/python/latest/api/utilities/data_classes/) for complete property listings of each event source. ### Active MQ @@ -123,155 +113,61 @@ for more details. === "app.py" - ```python hl_lines="4-5 9-10" - from typing import Dict - - from aws_lambda_powertools import Logger - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.active_mq_event import ActiveMQEvent + ```python hl_lines="5 10" + --8<-- "examples/event_sources/src/active_mq_example.py" + ``` - logger = Logger() +=== "Active MQ Example Event" - @event_source(data_class=ActiveMQEvent) - def lambda_handler(event: ActiveMQEvent, context): - for message in event.messages: - logger.debug(f"MessageID: {message.message_id}") - data: Dict = message.json_data - logger.debug("Process json in base64 encoded data str", data) + ```json hl_lines="6 9 18 21" + --8<-- "tests/events/activeMQEvent.json" ``` ### API Gateway Authorizer -> New in 1.20.0 - It is used for [API Gateway Rest API Lambda Authorizer payload](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html){target="_blank"}. Use **`APIGatewayAuthorizerRequestEvent`** for type `REQUEST` and **`APIGatewayAuthorizerTokenEvent`** for type `TOKEN`. -=== "app_type_request.py" - - This example uses the `APIGatewayAuthorizerResponse` to decline a given request if the user is not found. - - When the user is found, it includes the user details in the request context that will be available to the back-end, and returns a full access policy for admin users. - - ```python hl_lines="2-6 29 36-42 47 49" - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( - DENY_ALL_RESPONSE, - APIGatewayAuthorizerRequestEvent, - APIGatewayAuthorizerResponse, - HttpVerb, - ) - from secrets import compare_digest - - - def get_user_by_token(token): - if compare_digest(token, "admin-foo"): - return {"id": 0, "name": "Admin", "isAdmin": True} - elif compare_digest(token, "regular-foo"): - return {"id": 1, "name": "Joe"} - else: - return None - - - @event_source(data_class=APIGatewayAuthorizerRequestEvent) - def handler(event: APIGatewayAuthorizerRequestEvent, context): - user = get_user_by_token(event.headers["Authorization"]) - - if user is None: - # No user was found - # to return 401 - `{"message":"Unauthorized"}`, but pollutes lambda error count metrics - # raise Exception("Unauthorized") - # to return 403 - `{"message":"Forbidden"}` - return DENY_ALL_RESPONSE - - # parse the `methodArn` as an `APIGatewayRouteArn` - arn = event.parsed_arn - - # Create the response builder from parts of the `methodArn` - # and set the logged in user id and context - policy = APIGatewayAuthorizerResponse( - principal_id=user["id"], - context=user, - region=arn.region, - aws_account_id=arn.aws_account_id, - api_id=arn.api_id, - stage=arn.stage, - ) - - # Conditional IAM Policy - if user.get("isAdmin", False): - policy.allow_all_routes() - else: - policy.allow_route(HttpVerb.GET.value, "/user-profile") - - return policy.asdict() - ``` -=== "app_type_token.py" - - ```python hl_lines="2-5 12-18 21 23-24" - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( - APIGatewayAuthorizerTokenEvent, - APIGatewayAuthorizerResponse, - ) - - - @event_source(data_class=APIGatewayAuthorizerTokenEvent) - def handler(event: APIGatewayAuthorizerTokenEvent, context): - arn = event.parsed_arn - - policy = APIGatewayAuthorizerResponse( - principal_id="user", - region=arn.region, - aws_account_id=arn.aws_account_id, - api_id=arn.api_id, - stage=arn.stage - ) - - if event.authorization_token == "42": - policy.allow_all_routes() - else: - policy.deny_all_routes() - return policy.asdict() +=== "app.py" + + ```python hl_lines="2-4 8" + --8<-- "examples/event_sources/src/apigw_authorizer_request.py" ``` -### API Gateway Authorizer V2 +=== "API Gateway Authorizer Request Example Event" -> New in 1.20.0 + ```json hl_lines="3 11" + --8<-- "tests/events/apiGatewayAuthorizerRequestEvent.json" + ``` -It is used for [API Gateway HTTP API Lambda Authorizer payload version 2](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-lambda-authorizer.html){target="_blank"}. -See also [this blog post](https://aws.amazon.com/blogs/compute/introducing-iam-and-lambda-authorizers-for-amazon-api-gateway-http-apis/){target="_blank"} for more details. +=== "app_token.py" -=== "app.py" + ```python hl_lines="2-4 8" + --8<-- "examples/event_sources/src/apigw_authorizer_token.py" + ``` - This example looks up user details via `x-token` header. It uses `APIGatewayAuthorizerResponseV2` to return a deny policy when user is not found or authorized. +=== "API Gateway Authorizer Token Example Event" - ```python hl_lines="2-5 21 24" - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( - APIGatewayAuthorizerEventV2, - APIGatewayAuthorizerResponseV2, - ) - from secrets import compare_digest + ```json hl_lines="2 3" + --8<-- "tests/events/apiGatewayAuthorizerTokenEvent.json" + ``` +### API Gateway Authorizer V2 - def get_user_by_token(token): - if compare_digest(token, "Foo"): - return {"name": "Foo"} - return None +It is used for [API Gateway HTTP API Lambda Authorizer payload version 2](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-lambda-authorizer.html){target="_blank"}. +See also [this blog post](https://aws.amazon.com/blogs/compute/introducing-iam-and-lambda-authorizers-for-amazon-api-gateway-http-apis/){target="_blank"} for more details. +=== "app.py" - @event_source(data_class=APIGatewayAuthorizerEventV2) - def handler(event: APIGatewayAuthorizerEventV2, context): - user = get_user_by_token(event.headers["x-token"]) + ```python hl_lines="4-6 16" + --8<-- "examples/event_sources/src/apigw_auth_v2.py" + ``` - if user is None: - # No user was found, so we return not authorized - return APIGatewayAuthorizerResponseV2().asdict() +=== "API Gateway Authorizer V2 Example Event" - # Found the user and setting the details in the context - return APIGatewayAuthorizerResponseV2(authorize=True, context=user).asdict() + ```json + --8<-- "tests/events/apiGatewayAuthorizerV2Event.json" ``` ### API Gateway Proxy @@ -280,16 +176,14 @@ It is used for either API Gateway REST API or HTTP API using v1 proxy event. === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, APIGatewayProxyEvent + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/apigw_proxy_decorator.py" + ``` + +=== "API Gateway Proxy Example Event" - @event_source(data_class=APIGatewayProxyEvent) - def lambda_handler(event: APIGatewayProxyEvent, context): - if "helloworld" in event.path and event.http_method == "GET": - request_context = event.request_context - identity = request_context.identity - user = identity.user - do_something_with(event.json_body, user) + ```json hl_lines="3 4" + --8<-- "examples/event_sources/events/apigw_event.json" ``` ### API Gateway Proxy V2 @@ -298,245 +192,126 @@ It is used for HTTP API using v2 proxy event. === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, APIGatewayProxyEventV2 + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/apigw_proxy_v2.py" + ``` + +=== "API Gateway Proxy V2 Example Event" - @event_source(data_class=APIGatewayProxyEventV2) - def lambda_handler(event: APIGatewayProxyEventV2, context): - if "helloworld" in event.path and event.http_method == "POST": - do_something_with(event.json_body, event.query_string_parameters) + ```json + --8<-- "tests/events/apiGatewayProxyV2Event.json" ``` ### Application Load Balancer -Is it used for Application load balancer event. +Is it used for [Application load balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) event. === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, ALBEvent + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/albEvent.py" + ``` + +=== "Application Load Balancer Example Event" - @event_source(data_class=ALBEvent) - def lambda_handler(event: ALBEvent, context): - if "helloworld" in event.path and event.http_method == "POST": - do_something_with(event.json_body, event.query_string_parameters) + ```json hl_lines="7 8" + --8<-- "tests/events/albEvent.json" ``` ### AppSync Authorizer -> New in 1.20.0 - Used when building an [AWS_LAMBDA Authorization](https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html#aws-lambda-authorization){target="_blank"} with AppSync. See blog post [Introducing Lambda authorization for AWS AppSync GraphQL APIs](https://aws.amazon.com/blogs/mobile/appsync-lambda-auth/){target="_blank"} or read the Amplify documentation on using [AWS Lambda for authorization](https://docs.amplify.aws/lib/graphqlapi/authz/q/platform/js#aws-lambda){target="_blank"} with AppSync. -In this example extract the `requestId` as the `correlation_id` for logging, used `@event_source` decorator and builds the AppSync authorizer using the `AppSyncAuthorizerResponse` helper. - === "app.py" - ```python - from typing import Dict - - from aws_lambda_powertools.logging import correlation_paths - from aws_lambda_powertools.logging.logger import Logger - from aws_lambda_powertools.utilities.data_classes.appsync_authorizer_event import ( - AppSyncAuthorizerEvent, - AppSyncAuthorizerResponse, - ) - from aws_lambda_powertools.utilities.data_classes.event_source import event_source - - logger = Logger() - - - def get_user_by_token(token: str): - """Look a user by token""" - ... - - - @logger.inject_lambda_context(correlation_id_path=correlation_paths.APPSYNC_AUTHORIZER) - @event_source(data_class=AppSyncAuthorizerEvent) - def lambda_handler(event: AppSyncAuthorizerEvent, context) -> Dict: - user = get_user_by_token(event.authorization_token) + ```python hl_lines="5-7 20" + --8<-- "examples/event_sources/src/appSyncAuthorizer.py" + ``` - if not user: - # No user found, return not authorized - return AppSyncAuthorizerResponse().asdict() +=== "AppSync Authorizer Example Event" - return AppSyncAuthorizerResponse( - authorize=True, - resolver_context={"id": user.id}, - # Only allow admins to delete events - deny_fields=None if user.is_admin else ["Mutation.deleteEvent"], - ).asdict() + ```json + --8<-- "tests/events/appSyncAuthorizerEvent.json" ``` ### AppSync Resolver -> New in 1.12.0 - Used when building Lambda GraphQL Resolvers with [Amplify GraphQL Transform Library](https://docs.amplify.aws/cli/graphql-transformer/function){target="_blank"} (`@function`), and [AppSync Direct Lambda Resolvers](https://aws.amazon.com/blogs/mobile/appsync-direct-lambda/){target="_blank"}. -In this example, we also use the new Logger `correlation_id` and built-in `correlation_paths` to extract, if available, X-Ray Trace ID in AppSync request headers: +The example serves as an AppSync resolver for the `locations` field of the `Merchant` type. It uses the `@event_source` decorator to parse the AppSync event, handles pagination and filtering for locations, and demonstrates `AppSyncIdentityCognito`. === "app.py" - ```python hl_lines="2-5 12 14 19 21 29-30" - from aws_lambda_powertools.logging import Logger, correlation_paths - from aws_lambda_powertools.utilities.data_classes.appsync_resolver_event import ( - AppSyncResolverEvent, - AppSyncIdentityCognito - ) - - logger = Logger() - - def get_locations(name: str = None, size: int = 0, page: int = 0): - """Your resolver logic here""" - - @logger.inject_lambda_context(correlation_id_path=correlation_paths.APPSYNC_RESOLVER) - def lambda_handler(event, context): - event: AppSyncResolverEvent = AppSyncResolverEvent(event) - - # Case insensitive look up of request headers - x_forwarded_for = event.headers.get("x-forwarded-for") - - # Support for AppSyncIdentityCognito or AppSyncIdentityIAM identity types - assert isinstance(event.identity, AppSyncIdentityCognito) - identity: AppSyncIdentityCognito = event.identity - - # Logging with correlation_id - logger.debug({ - "x-forwarded-for": x_forwarded_for, - "username": identity.username - }) - - if event.type_name == "Merchant" and event.field_name == "locations": - return get_locations(**event.arguments) - - raise ValueError(f"Unsupported field resolver: {event.field_name}") - - ``` - -=== "Example AppSync Event" - - ```json hl_lines="2-8 14 19 20" - { - "typeName": "Merchant", - "fieldName": "locations", - "arguments": { - "page": 2, - "size": 1, - "name": "value" - }, - "identity": { - "claims": { - "iat": 1615366261 - ... - }, - "username": "mike", - ... - }, - "request": { - "headers": { - "x-amzn-trace-id": "Root=1-60488877-0b0c4e6727ab2a1c545babd0", - "x-forwarded-for": "127.0.0.1" - ... - } - }, - ... - } - ``` - -=== "Example CloudWatch Log" - - ```json hl_lines="5 6 16" - { - "level":"DEBUG", - "location":"lambda_handler:22", - "message":{ - "x-forwarded-for":"127.0.0.1", - "username":"mike" - }, - "timestamp":"2021-03-10 12:38:40,062", - "service":"service_undefined", - "sampling_rate":0.0, - "cold_start":true, - "function_name":"func_name", - "function_memory_size":512, - "function_arn":"func_arn", - "function_request_id":"6735a29c-c000-4ae3-94e6-1f1c934f7f94", - "correlation_id":"Root=1-60488877-0b0c4e6727ab2a1c545babd0" - } + ```python hl_lines="2-4 9" + --8<-- "examples/event_sources/src/appSyncResolver.py" + ``` + +=== "AppSync Resolver Example Event" + + ```json + --8<-- "tests/events/appSyncResolverEvent.json" ``` ### AWS Config Rule -=== "aws_config_rule.py" - ```python hl_lines="3 11" +The example utilizes AWSConfigRuleEvent to parse the incoming event. The function logs the message type of the invoking event and returns a simple success response. The example event receives a Scheduled Event Notification, but could also be ItemChanged and Oversized. + +=== "app.py" + ```python hl_lines="2-3 10" --8<-- "examples/event_sources/src/aws_config_rule.py" ``` -=== "Event - ItemChanged" +=== "ScheduledNotification Example Event" ```json - --8<-- "examples/event_sources/src/aws_config_rule_item_changed.json" - ``` -=== "Event - Oversized" - ```json - --8<-- "examples/event_sources/src/aws_config_rule_oversized.json" - ``` -=== "Event - ScheduledNotification" - ```json - --8<-- "examples/event_sources/src/aws_config_rule_scheduled.json" + --8<-- "tests/events/awsConfigRuleScheduled.json" ``` ### Bedrock Agent +The example handles [Bedrock Agent event](https://aws.amazon.com/bedrock/agents/) with `BedrockAgentEvent` to parse the incoming event. The function logs the action group and input text, then returns a structured response compatible with Bedrock Agent's expected format, including a mock response body. + === "app.py" - ```python hl_lines="2 8 10" - --8<-- "examples/event_sources/src/bedrock_agent_event.py" + ```python hl_lines="2 7" + --8<-- "examples/event_sources/src/bedrock_agent.py" + ``` + +=== "Bedrock Agent Example Event" + ```json + --8<-- "tests/events/bedrockAgentEvent.json" ``` ### CloudFormation Custom Resource +The example focuses on the `Create` request type, generating a unique physical resource ID and logging the process. The function is structured to potentially handle `Update` and `Delete` operations as well. + === "app.py" - ```python hl_lines="11 13 15 17 19" + ```python hl_lines="2-3 11 15 21" --8<-- "examples/event_sources/src/cloudformation_custom_resource_handler.py" ``` -### CloudWatch Dashboard Custom Widget - -=== "app.py" - - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, CloudWatchDashboardCustomWidgetEvent - - const DOCS = ` - ## Echo - A simple echo script. Anything passed in \`\`\`echo\`\`\` parameter is returned as the content of custom widget. +=== "CloudFormation Custom Resource Example Event" + ```json + --8<-- "tests/events/cloudformationCustomResourceCreate.json" + ``` - ### Widget parameters - | Param | Description | - | -------- | ------------------------ | - | **echo** | The content to echo back | +### CloudWatch Dashboard Custom Widget - ### Example parameters - \`\`\` yaml - echo:

Hello world

- \`\`\` - ` +Thie example for `CloudWatchDashboardCustomWidgetEvent` logs the dashboard name, extracts key information like widget ID and time range, and returns a formatted response with a title and markdown content. Read more about [custom widgets for Cloudwatch dashboard](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/add_custom_widget_samples.html). - @event_source(data_class=CloudWatchDashboardCustomWidgetEvent) - def lambda_handler(event: CloudWatchDashboardCustomWidgetEvent, context): +=== "app.py" - if event.describe: - return DOCS + ```python hl_lines="2 7" + --8<-- "examples/event_sources/src/cloudWatchDashboard.py" + ``` - # You can directly return HTML or JSON content - # Alternatively, you can return markdown that will be rendered by CloudWatch - echo = event.widget_context.params["echo"] - return { "markdown": f"# {echo}" } +=== "CloudWatch Dashboard Example Event" + ```json + --8<-- "tests/events/cloudWatchDashboardEvent.json" ``` ### CloudWatch Alarm State Change Action @@ -550,6 +325,11 @@ You can use the `CloudWathAlarmEvent` data class to access the fields containing --8<-- "examples/event_sources/src/cloudwatch_alarm_event.py" ``` +=== "CloudWatch Alarm Example Event" + ```json + --8<-- "tests/events/cloudWatchAlarmEventSingleMetric.json" + ``` + ### CloudWatch Logs CloudWatch Logs events by default are compressed and base64 encoded. You can use the helper function provided to decode, @@ -557,16 +337,13 @@ decompress and parse json data from the event. === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, CloudWatchLogsEvent - from aws_lambda_powertools.utilities.data_classes.cloud_watch_logs_event import CloudWatchLogsDecodedData + ```python hl_lines="2-3 8" + --8<-- "examples/event_sources/src/cloudwatch_logs.py" + ``` - @event_source(data_class=CloudWatchLogsEvent) - def lambda_handler(event: CloudWatchLogsEvent, context): - decompressed_log: CloudWatchLogsDecodedData = event.parse_logs_data() - log_events = decompressed_log.log_events - for event in log_events: - do_something_with(event.timestamp, event.message) +=== "CloudWatch Logs Example Event" + ```json + --8<-- "tests/events/cloudWatchLogEvent.json" ``` #### Kinesis integration @@ -575,45 +352,26 @@ decompress and parse json data from the event. === "app.py" - ```python hl_lines="5-6 11" - from typing import List - - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.cloud_watch_logs_event import CloudWatchLogsDecodedData - from aws_lambda_powertools.utilities.data_classes.kinesis_stream_event import ( - KinesisStreamEvent, extract_cloudwatch_logs_from_event) - + ```python hl_lines="5-7 11" + --8<-- "examples/event_sources/src/kinesisStreamCloudWatchLogs.py" + ``` - @event_source(data_class=KinesisStreamEvent) - def simple_handler(event: KinesisStreamEvent, context): - logs: List[CloudWatchLogsDecodedData] = extract_cloudwatch_logs_from_event(event) - for log in logs: - if log.message_type == "DATA_MESSAGE": - return "success" - return "nothing to be processed" +=== "Kinesis Stream CloudWatch Logs Example Event" + ```json + --8<-- "tests/events/kinesisStreamCloudWatchLogsEvent.json" ``` Alternatively, you can use `extract_cloudwatch_logs_from_record` to seamless integrate with the [Batch utility](./batch.md){target="_blank"} for more robust log processing. === "app.py" - ```python hl_lines="3-4 10" - from aws_lambda_powertools.utilities.batch import (BatchProcessor, EventType, - batch_processor) - from aws_lambda_powertools.utilities.data_classes.kinesis_stream_event import ( - KinesisStreamRecord, extract_cloudwatch_logs_from_record) - - processor = BatchProcessor(event_type=EventType.KinesisDataStreams) - - - def record_handler(record: KinesisStreamRecord): - log = extract_cloudwatch_logs_from_record(record) - return log.message_type == "DATA_MESSAGE" - + ```python hl_lines="7-9 18" + --8<-- "examples/event_sources/src/kinesis_batch_example.py" + ``` - @batch_processor(record_handler=record_handler, processor=processor) - def lambda_handler(event, context): - return processor.response() +=== "Kinesis Stream CloudWatch Logs Example Event" + ```json + --8<-- "tests/events/kinesisStreamCloudWatchLogsEvent.json" ``` ### CodeDeploy LifeCycle Hook @@ -623,77 +381,27 @@ CodeDeploy triggers Lambdas with this event when defined in to test applications at different stages of deployment. === "app.py" - ```python - from aws_lambda_powertools import Logger - from aws_lambda_powertools.utilities.data_classes import ( - event_source, - CodeDeployLifecycleHookEvent, - ) - logger = Logger() + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/codedeploy_lifecycle_hook.py" + ``` - def lambda_handler( - event: CodeDeployLifecycleHookEvent, context: LambdaContext - ) -> None: - deployment_id = event.deployment_id - lifecycle_event_hook_execution_id = event.lifecycle_event_hook_execution_id +=== "CodeDeploy LifeCycle Hook Example Event" + ```json + --8<-- "tests/events/codeDeployLifecycleHookEvent.json" ``` ### CodePipeline Job -Data classes and utility functions to help create continuous delivery pipelines tasks with AWS Lambda +Data classes and utility functions to help create continuous delivery pipelines tasks with AWS Lambda. === "app.py" - - ```python - from aws_lambda_powertools import Logger - from aws_lambda_powertools.utilities.data_classes import event_source, CodePipelineJobEvent - - logger = Logger() - - @event_source(data_class=CodePipelineJobEvent) - def lambda_handler(event, context): - """The Lambda function handler - - If a continuing job then checks the CloudFormation stack status - and updates the job accordingly. - - If a new job then kick of an update or creation of the target - CloudFormation stack. - """ - - # Extract the Job ID - job_id = event.get_id - - # Extract the params - params: dict = event.decoded_user_parameters - stack = params["stack"] - artifact_name = params["artifact"] - template_file = params["file"] - - try: - if event.data.continuation_token: - # If we're continuing then the create/update has already been triggered - # we just need to check if it has finished. - check_stack_update_status(job_id, stack) - else: - template = event.get_artifact(artifact_name, template_file) - # Kick off a stack update or create - result = start_update_or_create(job_id, stack, template) - artifact: io.BytesIO = zip_data(result) - event.put_artifact( - artifact_name=event.data.output_artifacts[0].name, - body=artifact, - content_type="application/zip" - ) - except Exception as e: - # If any other exceptions which we didn't expect are raised - # then fail the job and log the exception message. - logger.exception("Function failed due to exception.") - put_job_failure(job_id, "Function exception: " + str(e)) - - logger.debug("Function complete.") - return "Complete." + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/code_pipeline_job.py" + ``` +=== "CodePipeline Job Example Event" + ```json hl_lines="3 19" + --8<-- "tests/events/codePipelineEvent.json" ``` ### Cognito User Pool @@ -717,18 +425,19 @@ can be imported from `aws_lambda_powertools.data_classes.cognito_user_pool_event | Custom Email Sender | `data_classes.cognito_user_pool_event.CustomEmailSenderTriggerEvent` | | Custom SMS Sender | `data_classes.cognito_user_pool_event.CustomSMSSenderTriggerEvent` | +Some examples for the Cognito User Pools Lambda triggers sources: + #### Post Confirmation Example === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import PostConfirmationTriggerEvent - - def lambda_handler(event, context): - event: PostConfirmationTriggerEvent = PostConfirmationTriggerEvent(event) + ```python hl_lines="1 5" + --8<-- "examples/event_sources/src/cognito_post_confirmation.py" + ``` - user_attributes = event.request.user_attributes - do_something_with(user_attributes) +=== "Cognito Post Confirmation Example Event" + ```json hl_lines="12-14" + --8<-- "tests/events/cognitoPostConfirmationEvent.json" ``` #### Define Auth Challenge Example @@ -740,152 +449,13 @@ This example is based on the AWS Cognito docs for [Define Auth Challenge Lambda === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import DefineAuthChallengeTriggerEvent - - def handler(event: dict, context) -> dict: - event: DefineAuthChallengeTriggerEvent = DefineAuthChallengeTriggerEvent(event) - if ( - len(event.request.session) == 1 - and event.request.session[0].challenge_name == "SRP_A" - ): - event.response.issue_tokens = False - event.response.fail_authentication = False - event.response.challenge_name = "PASSWORD_VERIFIER" - elif ( - len(event.request.session) == 2 - and event.request.session[1].challenge_name == "PASSWORD_VERIFIER" - and event.request.session[1].challenge_result - ): - event.response.issue_tokens = False - event.response.fail_authentication = False - event.response.challenge_name = "CUSTOM_CHALLENGE" - elif ( - len(event.request.session) == 3 - and event.request.session[2].challenge_name == "CUSTOM_CHALLENGE" - and event.request.session[2].challenge_result - ): - event.response.issue_tokens = True - event.response.fail_authentication = False - else: - event.response.issue_tokens = False - event.response.fail_authentication = True - - return event.raw_event - ``` -=== "SPR_A response" - - ```json hl_lines="25-27" - { - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "DefineAuthChallenge_Authentication", - "request": { - "userAttributes": { - "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", - "email_verified": "true", - "name": "First Last", - "email": "define-auth@mail.com" - }, - "session": [ - { - "challengeName": "SRP_A", - "challengeResult": true - } - ] - }, - "response": { - "issueTokens": false, - "failAuthentication": false, - "challengeName": "PASSWORD_VERIFIER" - } - } - ``` -=== "PASSWORD_VERIFIER success response" - - ```json hl_lines="30-32" - { - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "DefineAuthChallenge_Authentication", - "request": { - "userAttributes": { - "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", - "email_verified": "true", - "name": "First Last", - "email": "define-auth@mail.com" - }, - "session": [ - { - "challengeName": "SRP_A", - "challengeResult": true - }, - { - "challengeName": "PASSWORD_VERIFIER", - "challengeResult": true - } - ] - }, - "response": { - "issueTokens": false, - "failAuthentication": false, - "challengeName": "CUSTOM_CHALLENGE" - } - } - - ``` -=== "CUSTOM_CHALLENGE success response" - - ```json hl_lines="34 35" - { - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "DefineAuthChallenge_Authentication", - "request": { - "userAttributes": { - "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", - "email_verified": "true", - "name": "First Last", - "email": "define-auth@mail.com" - }, - "session": [ - { - "challengeName": "SRP_A", - "challengeResult": true - }, - { - "challengeName": "PASSWORD_VERIFIER", - "challengeResult": true - }, - { - "challengeName": "CUSTOM_CHALLENGE", - "challengeResult": true - } - ] - }, - "response": { - "issueTokens": true, - "failAuthentication": false - } - } + ```python hl_lines="1 5" + --8<-- "examples/event_sources/src/cognito_define_auth.py" + ``` + +=== "Cognito Define Auth Challengen Example Event" + ```json + --8<-- "tests/events/cognitoDefineAuthChallengeEvent.json" ``` #### Create Auth Challenge Example @@ -894,17 +464,13 @@ This example is based on the AWS Cognito docs for [Create Auth Challenge Lambda === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import CreateAuthChallengeTriggerEvent + ```python hl_lines="2 5" + --8<-- "examples/event_sources/src/cognito_create_auth.py" + ``` - @event_source(data_class=CreateAuthChallengeTriggerEvent) - def handler(event: CreateAuthChallengeTriggerEvent, context) -> dict: - if event.request.challenge_name == "CUSTOM_CHALLENGE": - event.response.public_challenge_parameters = {"captchaUrl": "url/123.jpg"} - event.response.private_challenge_parameters = {"answer": "5"} - event.response.challenge_metadata = "CAPTCHA_CHALLENGE" - return event.raw_event +=== "Cognito Create Auth Challengen Example Event" + ```json + --8<-- "tests/events/cognitoCreateAuthChallengeEvent.json" ``` #### Verify Auth Challenge Response Example @@ -913,38 +479,28 @@ This example is based on the AWS Cognito docs for [Verify Auth Challenge Respons === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import VerifyAuthChallengeResponseTriggerEvent + ```python hl_lines="2 5" + --8<-- "examples/event_sources/src/cognito_verify_auth.py" + ``` - @event_source(data_class=VerifyAuthChallengeResponseTriggerEvent) - def handler(event: VerifyAuthChallengeResponseTriggerEvent, context) -> dict: - event.response.answer_correct = ( - event.request.private_challenge_parameters.get("answer") == event.request.challenge_answer - ) - return event.raw_event +=== "Cognito Verify Auth Challengen Example Event" + ```json + --8<-- "tests/events/cognitoVerifyAuthChallengeResponseEvent.json" ``` ### Connect Contact Flow -> New in 1.11.0 +The example integrates with [Amazon Connect](https://docs.aws.amazon.com/connect/latest/adminguide/what-is-amazon-connect.html) by handling contact flow events. The function converts the event into a `ConnectContactFlowEvent` object, providing a structured representation of the contact flow data. === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes.connect_contact_flow_event import ( - ConnectContactFlowChannel, - ConnectContactFlowEndpointType, - ConnectContactFlowEvent, - ConnectContactFlowInitiationMethod, - ) + ```python hl_lines="1-5 10" + --8<-- "examples/event_sources/src/connect_contact_flow.py" + ``` - def lambda_handler(event, context): - event: ConnectContactFlowEvent = ConnectContactFlowEvent(event) - assert event.contact_data.attributes == {"Language": "en-US"} - assert event.contact_data.channel == ConnectContactFlowChannel.VOICE - assert event.contact_data.customer_endpoint.endpoint_type == ConnectContactFlowEndpointType.TELEPHONE_NUMBER - assert event.contact_data.initiation_method == ConnectContactFlowInitiationMethod.API +=== "Connect Contact Flow Example Event" + ```json + --8<-- "tests/events/connectContactFlowEventAll.json" ``` ### DynamoDB Streams @@ -954,49 +510,31 @@ The DynamoDB data class utility provides the base class for `DynamoDBStreamEvent The class automatically deserializes DynamoDB types into their equivalent Python types. === "app.py" - - ```python - from aws_lambda_powertools.utilities.data_classes.dynamo_db_stream_event import ( - DynamoDBStreamEvent, - DynamoDBRecordEventName - ) - - def lambda_handler(event, context): - event: DynamoDBStreamEvent = DynamoDBStreamEvent(event) - - # Multiple records can be delivered in a single event - for record in event.records: - if record.event_name == DynamoDBRecordEventName.MODIFY: - do_something_with(record.dynamodb.new_image) - do_something_with(record.dynamodb.old_image) + ```python hl_lines="1-3 8" + --8<-- "examples/event_sources/src/dynamodb_stream.py" ``` - -=== "multiple_records_types.py" - - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, DynamoDBStreamEvent - from aws_lambda_powertools.utilities.typing import LambdaContext - - - @event_source(data_class=DynamoDBStreamEvent) - def lambda_handler(event: DynamoDBStreamEvent, context: LambdaContext): - for record in event.records: - # {"N": "123.45"} => Decimal("123.45") - key: str = record.dynamodb.keys["id"] - print(key) +=== "app_multiple_records.py" + ```python hl_lines="1 5" + --8<-- "examples/event_sources/src/dynamodb_multiple_records.py" + ``` +=== "DynamoDB Streams Example Event" + ```json + --8<-- "tests/events/dynamoStreamEvent.json" ``` ### EventBridge -=== "app.py" + When an event matching a defined rule occurs in EventBridge, it can [automatically trigger a Lambda function](https://docs.aws.amazon.com/lambda/latest/dg/with-eventbridge-scheduler.html), passing the event data as input. - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, EventBridgeEvent +=== "app.py" - @event_source(data_class=EventBridgeEvent) - def lambda_handler(event: EventBridgeEvent, context): - do_something_with(event.detail) + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/eventBridgeEvent.py" + ``` +=== "EventBridge Example Event" + ```json + --8<-- "tests/events/eventBridgeEvent.json" ``` ### Kafka @@ -1005,14 +543,13 @@ This example is based on the AWS docs for [Amazon MSK](https://docs.aws.amazon.c === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, KafkaEvent - - @event_source(data_class=KafkaEvent) - def lambda_handler(event: KafkaEvent, context): - for record in event.records: - do_something_with(record.decoded_key, record.json_value) + ```python hl_lines="1 8" + --8<-- "examples/event_sources/src/kafka_event.py" + ``` +=== "Kafka Example Event" + ```json + --8<-- "tests/events/kafkaEventMsk.json" ``` ### Kinesis streams @@ -1022,20 +559,13 @@ or plain text, depending on the original payload. === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, KinesisStreamEvent - - @event_source(data_class=KinesisStreamEvent) - def lambda_handler(event: KinesisStreamEvent, context): - kinesis_record = next(event.records).kinesis - - # if data was delivered as text - data = kinesis_record.data_as_text() - - # if data was delivered as json - data = kinesis_record.data_as_json() + ```python hl_lines="4 11" + --8<-- "examples/event_sources/src/kinesis_streams.py" + ``` - do_something_with(data) +=== "Kinesis streams Example Event" + ```json + --8<-- "tests/events/kinesisStreamEvent.json" ``` ### Kinesis Firehose delivery stream @@ -1050,7 +580,7 @@ To do that, you can use `KinesisFirehoseDataTransformationResponse` class along === "Transforming streaming records" - ```python hl_lines="2-3 12 28" + ```python hl_lines="2-3 10 12" --8<-- "examples/event_sources/src/kinesis_firehose_delivery_stream.py" ``` @@ -1059,7 +589,7 @@ To do that, you can use `KinesisFirehoseDataTransformationResponse` class along === "Dropping invalid records" - ```python hl_lines="5-6 16 34" + ```python hl_lines="5-6 14 16" --8<-- "examples/event_sources/src/kinesis_firehose_response_drop.py" ``` @@ -1067,68 +597,62 @@ To do that, you can use `KinesisFirehoseDataTransformationResponse` class along === "Indicating a processing failure" - ```python hl_lines="2-3 33" + ```python hl_lines="2-3 11 33" --8<-- "examples/event_sources/src/kinesis_firehose_response_exception.py" ``` 1. This record will now be sent to your [S3 bucket in the `processing-failed` folder](https://docs.aws.amazon.com/firehose/latest/dev/data-transformation.html#data-transformation-failure-handling){target="_blank"}. +=== "kinesisFirehoseEvent.json" + ```json + --8<-- "tests/events/kinesisFirehoseKinesisEvent.json" + ``` + ### Lambda Function URL +[Lambda Function URLs](https://docs.aws.amazon.com/lambda/latest/dg/urls-invocation.html) provide a direct HTTP endpoint for invoking Lambda functions. This feature allows functions to receive and process HTTP requests without the need for additional services like API Gateway. + === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, LambdaFunctionUrlEvent + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/lambdaFunctionUrl.py" + ``` - @event_source(data_class=LambdaFunctionUrlEvent) - def lambda_handler(event: LambdaFunctionUrlEvent, context): - do_something_with(event.body) +=== "Lambda Function URL Example Event" + ```json + --8<-- "tests/events/lambdaFunctionUrlEvent.json" ``` ### Rabbit MQ -It is used for [Rabbit MQ payloads](https://docs.aws.amazon.com/lambda/latest/dg/with-mq.html){target="_blank"}, also see +It is used for [Rabbit MQ payloads](https://docs.aws.amazon.com/lambda/latest/dg/with-mq.html){target="_blank"}. See the [blog post](https://aws.amazon.com/blogs/compute/using-amazon-mq-for-rabbitmq-as-an-event-source-for-lambda/){target="_blank"} for more details. === "app.py" - ```python hl_lines="4-5 9-10" - from typing import Dict - - from aws_lambda_powertools import Logger - from aws_lambda_powertools.utilities.data_classes import event_source - from aws_lambda_powertools.utilities.data_classes.rabbit_mq_event import RabbitMQEvent - - logger = Logger() + ```python hl_lines="5 10" + --8<-- "examples/event_sources/src/rabbit_mq_example.py" + ``` - @event_source(data_class=RabbitMQEvent) - def lambda_handler(event: RabbitMQEvent, context): - for queue_name, messages in event.rmq_messages_by_queue.items(): - logger.debug(f"Messages for queue: {queue_name}") - for message in messages: - logger.debug(f"MessageID: {message.basic_properties.message_id}") - data: Dict = message.json_data - logger.debug("Process json in base64 encoded data str", data) +=== "Rabbit MQ Example Event" + ```json + --8<-- "tests/events/rabbitMQEvent.json" ``` ### S3 -=== "app.py" - - ```python - from urllib.parse import unquote_plus - from aws_lambda_powertools.utilities.data_classes import event_source, S3Event +Integration with Amazon S3 enables automatic, serverless processing of object-level events in S3 buckets. When triggered by actions like object creation or deletion, Lambda functions receive detailed event information, allowing for real-time file processing, data transformations, and automated workflows. - @event_source(data_class=S3Event) - def lambda_handler(event: S3Event, context): - bucket_name = event.bucket_name +=== "app.py" - # Multiple records can be delivered in a single event - for record in event.records: - object_key = unquote_plus(record.s3.get_object.key) + ```python hl_lines="3 6" + --8<-- "examples/event_sources/src/s3Event.py" + ``` - do_something_with(f"{bucket_name}/{object_key}") +=== "S3 Example Event" + ```json + --8<-- "tests/events/s3Event.json" ``` ### S3 Batch Operations @@ -1141,54 +665,42 @@ This example is based on the AWS S3 Batch Operations documentation [Example Lamb --8<-- "examples/event_sources/src/s3_batch_operation.py" ``` +=== "S3 Batch Operations Example Event" + + ```json + --8<-- "tests/events/s3BatchOperationEventSchemaV2.json" + ``` + ### S3 Object Lambda This example is based on the AWS Blog post [Introducing Amazon S3 Object Lambda – Use Your Code to Process Data as It Is Being Retrieved from S3](https://aws.amazon.com/blogs/aws/introducing-amazon-s3-object-lambda-use-your-code-to-process-data-as-it-is-being-retrieved-from-s3/){target="_blank"}. === "app.py" - ```python hl_lines="5-6 12 14" - import boto3 - import requests - - from aws_lambda_powertools import Logger - from aws_lambda_powertools.logging.correlation_paths import S3_OBJECT_LAMBDA - from aws_lambda_powertools.utilities.data_classes.s3_object_event import S3ObjectLambdaEvent - - logger = Logger() - session = boto3.session.Session() - s3 = session.client("s3") - - @logger.inject_lambda_context(correlation_id_path=S3_OBJECT_LAMBDA, log_event=True) - def lambda_handler(event, context): - event = S3ObjectLambdaEvent(event) - - # Get object from S3 - response = requests.get(event.input_s3_url) - original_object = response.content.decode("utf-8") - - # Make changes to the object about to be returned - transformed_object = original_object.upper() + ```python hl_lines="5 6 13 15" + --8<-- "examples/event_sources/src/s3_object_lambda.py" + ``` - # Write object back to S3 Object Lambda - s3.write_get_object_response( - Body=transformed_object, RequestRoute=event.request_route, RequestToken=event.request_token - ) +=== "S3 Object Lambda Example Event" - return {"status_code": 200} + ```json + --8<-- "examples/event_sources/events/s3ObjectEvent.json" ``` ### S3 EventBridge Notification +[S3 EventBridge notifications](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventBridge.html) enhance Lambda's ability to process S3 events by routing them through Amazon EventBridge. This integration offers advanced filtering, multiple destination support, and standardized CloudEvents format. + === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, S3EventBridgeNotificationEvent + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/s3_event_bridge.py" + ``` - @event_source(data_class=S3EventBridgeNotificationEvent) - def lambda_handler(event: S3EventBridgeNotificationEvent, context): - bucket_name = event.detail.bucket.name - file_key = event.detail.object.key +=== "S3 EventBridge Notification Example Event" + + ```json + --8<-- "tests/events/s3EventBridgeNotificationObjectCreatedEvent.json" ``` ### Secrets Manager @@ -1209,50 +721,50 @@ AWS Secrets Manager rotation uses an AWS Lambda function to update the secret. [ ### SES +The integration with Simple Email Service (SES) enables serverless email processing. When configured, SES can trigger Lambda functions in response to incoming emails or delivery status notifications. The Lambda function receives an SES event containing details like sender, recipients, and email content. + === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, SESEvent + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/ses_event.py" + ``` - @event_source(data_class=SESEvent) - def lambda_handler(event: SESEvent, context): - # Multiple records can be delivered in a single event - for record in event.records: - mail = record.ses.mail - common_headers = mail.common_headers +=== "SES Example Event" - do_something_with(common_headers.to, common_headers.subject) + ```json + --8<-- "tests/events/sesEvent.json" ``` ### SNS +The integration with Simple Notification Service (SNS) enables serverless message processing. When configured, SNS can trigger Lambda functions in response to published messages or notifications. The Lambda function receives an SNS event containing details like the message body, subject, and metadata. + === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, SNSEvent + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/sns_event.py" + ``` - @event_source(data_class=SNSEvent) - def lambda_handler(event: SNSEvent, context): - # Multiple records can be delivered in a single event - for record in event.records: - message = record.sns.message - subject = record.sns.subject +=== "SNS Example Event" - do_something_with(subject, message) + ```json + --8<-- "tests/events/snsEvent.json" ``` ### SQS +The integration with Simple Queue Service (SQS) enables serverless queue processing. When configured, SQS can trigger Lambda functions in response to messages in the queue. The Lambda function receives an SQS event containing details like message body, attributes, and metadata. + === "app.py" - ```python - from aws_lambda_powertools.utilities.data_classes import event_source, SQSEvent + ```python hl_lines="1 4" + --8<-- "examples/event_sources/src/sqs_event.py" + ``` + +=== "SQS Example Event" - @event_source(data_class=SQSEvent) - def lambda_handler(event: SQSEvent, context): - # Multiple records can be delivered in a single event - for record in event.records: - do_something_with(record.body) + ```json + --8<-- "tests/events/sqsEvent.json" ``` ### VPC Lattice V2 @@ -1270,7 +782,7 @@ You can register your Lambda functions as targets within an Amazon VPC Lattice s === "Lattice Example Event" ```json - --8<-- "examples/event_sources/src/vpc_lattice_v2_payload.json" + --8<-- "examples/event_sources/events/vpc_lattice_v2_payload.json" ``` ### VPC Lattice V1 @@ -1288,7 +800,7 @@ You can register your Lambda functions as targets within an Amazon VPC Lattice s === "Lattice Example Event" ```json - --8<-- "examples/event_sources/src/vpc_lattice_payload.json" + --8<-- "examples/event_sources/events/vpc_lattice_payload.json" ``` ## Advanced @@ -1308,10 +820,9 @@ However, certain events may contain sensitive fields such as `secret_access_key` === "debugging_event.json" ```json hl_lines="28 29" - --8<-- "examples/event_sources/src/debugging_event.json" + --8<-- "examples/event_sources/events/debugging_event.json" ``` === "debugging_output.json" ```json hl_lines="16 17 18" - --8<-- "examples/event_sources/src/debugging_output.json" - ``` + --8<-- "examples/event_sources/events/debugging_output.json" ``` diff --git a/examples/event_sources/events/active_mq_event_example.json b/examples/event_sources/events/active_mq_event_example.json new file mode 100644 index 00000000000..50da9596682 --- /dev/null +++ b/examples/event_sources/events/active_mq_event_example.json @@ -0,0 +1,27 @@ +{ + "eventSource": "aws:mq", + "eventSourceArn": "arn:aws:mq:us-east-2:111122223333:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8", + "messages": [ + { + "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-east-2.amazonaws.com-37557-1234520418293-4:1:1:1:1", + "messageType": "jms/text-message", + "destination": { + "physicalName": "testQueue" + }, + "data": "QUJDOkFBQUE=", + "timestamp": 1598827811958, + "properties": { + "index": "1" + } + }, + { + "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-east-2.amazonaws.com-37557-1234520418293-4:1:1:1:2", + "messageType": "jms/bytes-message", + "destination": { + "physicalName": "testQueue2" + }, + "data": "LQaGQ82S48k=", + "timestamp": 1598827811959 + } + ] +} \ No newline at end of file diff --git a/examples/event_sources/events/apigw_event.json b/examples/event_sources/events/apigw_event.json new file mode 100644 index 00000000000..dc0efd36604 --- /dev/null +++ b/examples/event_sources/events/apigw_event.json @@ -0,0 +1,20 @@ +{ + "resource": "/helloworld", + "path": "/hello", + "httpMethod": "GET", + "headers": { + "Accept": "*/*", + "Host": "api.example.com" + }, + "queryStringParameters": { + "name": "John" + }, + "pathParameters": null, + "stageVariables": null, + "requestContext": { + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "stage": "prod" + }, + "body": null, + "isBase64Encoded": false +} \ No newline at end of file diff --git a/examples/event_sources/src/aws_config_rule_scheduled.json b/examples/event_sources/events/aws_config_rule_scheduled.json similarity index 100% rename from examples/event_sources/src/aws_config_rule_scheduled.json rename to examples/event_sources/events/aws_config_rule_scheduled.json diff --git a/examples/event_sources/src/debugging_event.json b/examples/event_sources/events/debugging_event.json similarity index 100% rename from examples/event_sources/src/debugging_event.json rename to examples/event_sources/events/debugging_event.json diff --git a/examples/event_sources/src/debugging_output.json b/examples/event_sources/events/debugging_output.json similarity index 100% rename from examples/event_sources/src/debugging_output.json rename to examples/event_sources/events/debugging_output.json diff --git a/examples/event_sources/events/s3ObjectEvent.json b/examples/event_sources/events/s3ObjectEvent.json new file mode 100644 index 00000000000..afec46fecca --- /dev/null +++ b/examples/event_sources/events/s3ObjectEvent.json @@ -0,0 +1,29 @@ +{ + "xAmzRequestId": "1a5ed718-5f53-471d-b6fe-5cf62d88d02a", + "getObjectContext": { + "inputS3Url": "https://myap-123412341234.s3-accesspoint.us-east-1.amazonaws.com/s3.txt?X-Amz-Security-Token=...", + "outputRoute": "io-iad-cell001", + "outputToken": "..." + }, + "configuration": { + "accessPointArn": "arn:aws:s3-object-lambda:us-east-1:123412341234:accesspoint/myolap", + "supportingAccessPointArn": "arn:aws:s3:us-east-1:123412341234:accesspoint/myap", + "payload": "test" + }, + "userRequest": { + "url": "/s3.txt", + "headers": { + "Host": "myolap-123412341234.s3-object-lambda.us-east-1.amazonaws.com", + "Accept-Encoding": "identity", + "X-Amz-Content-SHA256": "e3b0c44297fc1c149afbf4c8995fb92427ae41e4649b934ca495991b7852b855" + } + }, + "userIdentity": { + "type": "IAMUser", + "principalId": "...", + "arn": "arn:aws:iam::123412341234:user/myuser", + "accountId": "123412341234", + "accessKeyId": "..." + }, + "protocolVersion": "1.00" +} \ No newline at end of file diff --git a/examples/event_sources/src/vpc_lattice_payload.json b/examples/event_sources/events/vpc_lattice_payload.json similarity index 100% rename from examples/event_sources/src/vpc_lattice_payload.json rename to examples/event_sources/events/vpc_lattice_payload.json diff --git a/examples/event_sources/src/vpc_lattice_v2_payload.json b/examples/event_sources/events/vpc_lattice_v2_payload.json similarity index 100% rename from examples/event_sources/src/vpc_lattice_v2_payload.json rename to examples/event_sources/events/vpc_lattice_v2_payload.json diff --git a/examples/event_sources/src/active_mq_example.py b/examples/event_sources/src/active_mq_example.py new file mode 100644 index 00000000000..983233606ec --- /dev/null +++ b/examples/event_sources/src/active_mq_example.py @@ -0,0 +1,18 @@ +import json + +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.active_mq_event import ActiveMQEvent + +logger = Logger() + + +@event_source(data_class=ActiveMQEvent) +def lambda_handler(event: ActiveMQEvent, context): + for message in event.messages: + msg = message.message_id + msg_pn = message.destination_physicalname + + logger.info(f"Message ID: {msg} and physical name: {msg_pn}") + + return {"statusCode": 200, "body": json.dumps("Processing complete")} diff --git a/examples/event_sources/src/albEvent.py b/examples/event_sources/src/albEvent.py new file mode 100644 index 00000000000..fd2b6aef05b --- /dev/null +++ b/examples/event_sources/src/albEvent.py @@ -0,0 +1,9 @@ +from aws_lambda_powertools.utilities.data_classes import ALBEvent, event_source + + +@event_source(data_class=ALBEvent) +def lambda_handler(event: ALBEvent, context): + if "lambda" in event.path and event.http_method == "GET": + return {"statusCode": 200, "body": f"Hello from path: {event.path}"} + else: + return {"statusCode": 400, "body": "No Hello from path"} diff --git a/examples/event_sources/src/apigw_auth_v2.py b/examples/event_sources/src/apigw_auth_v2.py new file mode 100644 index 00000000000..128c7a57a6a --- /dev/null +++ b/examples/event_sources/src/apigw_auth_v2.py @@ -0,0 +1,30 @@ +from secrets import compare_digest + +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( + APIGatewayAuthorizerEventV2, + APIGatewayAuthorizerResponseV2, +) + + +def get_user_by_token(token): + if compare_digest(token, "value"): + return {"name": "Foo"} + return None + + +@event_source(data_class=APIGatewayAuthorizerEventV2) +def lambda_handler(event: APIGatewayAuthorizerEventV2, context): + user = get_user_by_token(event.headers.get("Authorization")) + + if user is None: + # No user was found, so we return not authorized + return APIGatewayAuthorizerResponseV2(authorize=False).asdict() + + # Found the user and setting the details in the context + response = APIGatewayAuthorizerResponseV2( + authorize=True, + context=user, + ) + + return response.asdict() diff --git a/examples/event_sources/src/apigw_authorizer_request.py b/examples/event_sources/src/apigw_authorizer_request.py new file mode 100644 index 00000000000..e0d81196af2 --- /dev/null +++ b/examples/event_sources/src/apigw_authorizer_request.py @@ -0,0 +1,29 @@ +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( + APIGatewayAuthorizerRequestEvent, + APIGatewayAuthorizerResponse, +) + + +@event_source(data_class=APIGatewayAuthorizerRequestEvent) +def lambda_handler(event: APIGatewayAuthorizerRequestEvent, context): + # Simple auth check (replace with your actual auth logic) + is_authorized = event.headers.get("HeaderAuth1") == "headerValue1" + + if not is_authorized: + return {"principalId": "", "policyDocument": {"Version": "2012-10-17", "Statement": []}} + + arn = event.parsed_arn + + policy = APIGatewayAuthorizerResponse( + principal_id="user", + context={"user": "example"}, + region=arn.region, + aws_account_id=arn.aws_account_id, + api_id=arn.api_id, + stage=arn.stage, + ) + + policy.allow_all_routes() + + return policy.asdict() diff --git a/examples/event_sources/src/apigw_authorizer_token.py b/examples/event_sources/src/apigw_authorizer_token.py new file mode 100644 index 00000000000..e27eded5c7a --- /dev/null +++ b/examples/event_sources/src/apigw_authorizer_token.py @@ -0,0 +1,29 @@ +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import ( + APIGatewayAuthorizerResponse, + APIGatewayAuthorizerTokenEvent, +) + + +@event_source(data_class=APIGatewayAuthorizerTokenEvent) +def lambda_handler(event: APIGatewayAuthorizerTokenEvent, context): + # Simple token check (replace with your actual token validation logic) + is_valid_token = event.authorization_token == "allow" + + if not is_valid_token: + return {"principalId": "", "policyDocument": {"Version": "2012-10-17", "Statement": []}} + + arn = event.parsed_arn + + policy = APIGatewayAuthorizerResponse( + principal_id="user", + context={"user": "example"}, + region=arn.region, + aws_account_id=arn.aws_account_id, + api_id=arn.api_id, + stage=arn.stage, + ) + + policy.allow_all_routes() + + return policy.asdict() diff --git a/examples/event_sources/src/apigw_proxy_decorator.py b/examples/event_sources/src/apigw_proxy_decorator.py new file mode 100644 index 00000000000..81db0b1a6aa --- /dev/null +++ b/examples/event_sources/src/apigw_proxy_decorator.py @@ -0,0 +1,9 @@ +from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEvent, event_source + + +@event_source(data_class=APIGatewayProxyEvent) +def lambda_handler(event: APIGatewayProxyEvent, context): + if "hello" in event.path and event.http_method == "GET": + return {"statusCode": 200, "body": f"Hello from path: {event.path}"} + else: + return {"statusCode": 400, "body": "No Hello from path"} diff --git a/examples/event_sources/src/apigw_proxy_v2.py b/examples/event_sources/src/apigw_proxy_v2.py new file mode 100644 index 00000000000..fb468973e15 --- /dev/null +++ b/examples/event_sources/src/apigw_proxy_v2.py @@ -0,0 +1,9 @@ +from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEventV2, event_source + + +@event_source(data_class=APIGatewayProxyEventV2) +def lambda_handler(event: APIGatewayProxyEventV2, context): + if "hello" in event.path and event.http_method == "POST": + return {"statusCode": 200, "body": f"Hello from path: {event.path}"} + else: + return {"statusCode": 400, "body": "No Hello from path"} diff --git a/examples/event_sources/src/appSyncAuthorizer.py b/examples/event_sources/src/appSyncAuthorizer.py new file mode 100644 index 00000000000..012f7beb016 --- /dev/null +++ b/examples/event_sources/src/appSyncAuthorizer.py @@ -0,0 +1,33 @@ +from typing import Dict + +from aws_lambda_powertools.logging import correlation_paths +from aws_lambda_powertools.logging.logger import Logger +from aws_lambda_powertools.utilities.data_classes.appsync_authorizer_event import ( + AppSyncAuthorizerEvent, + AppSyncAuthorizerResponse, +) +from aws_lambda_powertools.utilities.data_classes.event_source import event_source + +logger = Logger() + + +def get_user_by_token(token: str): + """Look a user by token""" + ... + + +@logger.inject_lambda_context(correlation_id_path=correlation_paths.APPSYNC_AUTHORIZER) +@event_source(data_class=AppSyncAuthorizerEvent) +def lambda_handler(event: AppSyncAuthorizerEvent, context) -> Dict: + user = get_user_by_token(event.authorization_token) + + if not user: + # No user found, return not authorized + return AppSyncAuthorizerResponse().asdict() + + return AppSyncAuthorizerResponse( + authorize=True, + resolver_context={"id": user.id}, + # Only allow admins to delete events + deny_fields=None if user.is_admin else ["Mutation.deleteEvent"], + ).asdict() diff --git a/examples/event_sources/src/appSyncResolver.py b/examples/event_sources/src/appSyncResolver.py new file mode 100644 index 00000000000..6884b0649fd --- /dev/null +++ b/examples/event_sources/src/appSyncResolver.py @@ -0,0 +1,57 @@ +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.appsync_resolver_event import ( + AppSyncIdentityCognito, + AppSyncResolverEvent, +) +from aws_lambda_powertools.utilities.typing import LambdaContext + + +@event_source(data_class=AppSyncResolverEvent) +def lambda_handler(event: AppSyncResolverEvent, context: LambdaContext): + # Access the AppSync event details + type_name = event.type_name + field_name = event.field_name + arguments = event.arguments + source = event.source + + print(f"Resolving field '{field_name}' for type '{type_name}'") + print(f"Arguments: {arguments}") + print(f"Source: {source}") + + # Check if the identity is Cognito-based + if isinstance(event.identity, AppSyncIdentityCognito): + user_id = event.identity.sub + username = event.identity.username + print(f"Request from Cognito user: {username} (ID: {user_id})") + else: + print("Request is not from a Cognito-authenticated user") + + if type_name == "Merchant" and field_name == "locations": + page = arguments.get("page", 1) + size = arguments.get("size", 10) + name_filter = arguments.get("name") + + # Here you would typically fetch locations from a database + # This is a mock implementation + locations = [ + {"id": "1", "name": "Location 1", "address": "123 Main St"}, + {"id": "2", "name": "Location 2", "address": "456 Elm St"}, + {"id": "3", "name": "Location 3", "address": "789 Oak St"}, + ] + + # Apply name filter if provided + if name_filter: + locations = [loc for loc in locations if name_filter.lower() in loc["name"].lower()] + + # Apply pagination + start = (page - 1) * size + end = start + size + paginated_locations = locations[start:end] + + return { + "items": paginated_locations, + "totalCount": len(locations), + "nextToken": str(page + 1) if end < len(locations) else None, + } + else: + raise Exception(f"Unhandled field: {field_name} for type: {type_name}") diff --git a/examples/event_sources/src/aws_config_rule.py b/examples/event_sources/src/aws_config_rule.py index b81ae39bd25..07d87999982 100644 --- a/examples/event_sources/src/aws_config_rule.py +++ b/examples/event_sources/src/aws_config_rule.py @@ -3,13 +3,12 @@ AWSConfigRuleEvent, event_source, ) -from aws_lambda_powertools.utilities.typing import LambdaContext logger = Logger() @event_source(data_class=AWSConfigRuleEvent) -def lambda_handler(event: AWSConfigRuleEvent, context: LambdaContext): +def lambda_handler(event: AWSConfigRuleEvent, context): message_type = event.invoking_event.message_type logger.info(f"Logging {message_type} event rule", invoke_event=event.raw_invoking_event) diff --git a/examples/event_sources/src/aws_config_rule_item_changed.json b/examples/event_sources/src/aws_config_rule_item_changed.json deleted file mode 100644 index cbf7abf67aa..00000000000 --- a/examples/event_sources/src/aws_config_rule_item_changed.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version":"1.0", - "invokingEvent":"{\"configurationItemDiff\":{\"changedProperties\":{\"Configuration.InstanceType\":{\"previousValue\":\"t2.micro\",\"updatedValue\":\"t2.medium\",\"changeType\":\"UPDATE\"},\"Configuration.State.Name\":{\"previousValue\":\"running\",\"updatedValue\":\"stopped\",\"changeType\":\"UPDATE\"},\"Configuration.StateTransitionReason\":{\"previousValue\":\"\",\"updatedValue\":\"User initiated (2023-04-27 15:01:07 GMT)\",\"changeType\":\"UPDATE\"},\"Configuration.StateReason\":{\"previousValue\":null,\"updatedValue\":{\"code\":\"Client.UserInitiatedShutdown\",\"message\":\"Client.UserInitiatedShutdown: User initiated shutdown\"},\"changeType\":\"CREATE\"},\"Configuration.CpuOptions.CoreCount\":{\"previousValue\":1,\"updatedValue\":2,\"changeType\":\"UPDATE\"}},\"changeType\":\"UPDATE\"},\"configurationItem\":{\"relatedEvents\":[],\"relationships\":[{\"resourceId\":\"eipalloc-0ebb4367662263cc1\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::EIP\",\"name\":\"Is attached to ElasticIp\"},{\"resourceId\":\"eni-034dd31c4b17ada8c\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::NetworkInterface\",\"name\":\"Contains NetworkInterface\"},{\"resourceId\":\"eni-09a604c0ec356b06f\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::NetworkInterface\",\"name\":\"Contains NetworkInterface\"},{\"resourceId\":\"sg-0fb295a327d9b4835\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::SecurityGroup\",\"name\":\"Is associated with SecurityGroup\"},{\"resourceId\":\"subnet-cad1f2f4\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::Subnet\",\"name\":\"Is contained in Subnet\"},{\"resourceId\":\"vol-0a288b5eb9fea4b30\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::Volume\",\"name\":\"Is attached to Volume\"},{\"resourceId\":\"vpc-2d96be57\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::VPC\",\"name\":\"Is contained in Vpc\"}],\"configuration\":{\"amiLaunchIndex\":0,\"imageId\":\"ami-09d95fab7fff3776c\",\"instanceId\":\"i-042dd005362091826\",\"instanceType\":\"t2.medium\",\"kernelId\":null,\"keyName\":\"mihaec2\",\"launchTime\":\"2023-04-27T14:57:16.000Z\",\"monitoring\":{\"state\":\"disabled\"},\"placement\":{\"availabilityZone\":\"us-east-1e\",\"affinity\":null,\"groupName\":\"\",\"partitionNumber\":null,\"hostId\":null,\"tenancy\":\"default\",\"spreadDomain\":null,\"hostResourceGroupArn\":null},\"platform\":null,\"privateDnsName\":\"ip-172-31-78-41.ec2.internal\",\"privateIpAddress\":\"172.31.78.41\",\"productCodes\":[],\"publicDnsName\":\"ec2-3-232-229-57.compute-1.amazonaws.com\",\"publicIpAddress\":\"3.232.229.57\",\"ramdiskId\":null,\"state\":{\"code\":80,\"name\":\"stopped\"},\"stateTransitionReason\":\"User initiated (2023-04-27 15:01:07 GMT)\",\"subnetId\":\"subnet-cad1f2f4\",\"vpcId\":\"vpc-2d96be57\",\"architecture\":\"x86_64\",\"blockDeviceMappings\":[{\"deviceName\":\"/dev/xvda\",\"ebs\":{\"attachTime\":\"2020-05-30T15:21:58.000Z\",\"deleteOnTermination\":true,\"status\":\"attached\",\"volumeId\":\"vol-0a288b5eb9fea4b30\"}}],\"clientToken\":\"\",\"ebsOptimized\":false,\"enaSupport\":true,\"hypervisor\":\"xen\",\"iamInstanceProfile\":{\"arn\":\"arn:aws:iam::0123456789012:instance-profile/AmazonSSMRoleForInstancesQuickSetup\",\"id\":\"AIPAS5S4WFUBL72S3QXW5\"},\"instanceLifecycle\":null,\"elasticGpuAssociations\":[],\"elasticInferenceAcceleratorAssociations\":[],\"networkInterfaces\":[{\"association\":{\"carrierIp\":null,\"ipOwnerId\":\"0123456789012\",\"publicDnsName\":\"ec2-3-232-229-57.compute-1.amazonaws.com\",\"publicIp\":\"3.232.229.57\"},\"attachment\":{\"attachTime\":\"2020-05-30T15:21:57.000Z\",\"attachmentId\":\"eni-attach-0a7e75dc9c1c291a0\",\"deleteOnTermination\":true,\"deviceIndex\":0,\"status\":\"attached\",\"networkCardIndex\":0},\"description\":\"\",\"groups\":[{\"groupName\":\"minhaec2\",\"groupId\":\"sg-0fb295a327d9b4835\"}],\"ipv6Addresses\":[],\"macAddress\":\"06:cf:00:c2:17:db\",\"networkInterfaceId\":\"eni-034dd31c4b17ada8c\",\"ownerId\":\"0123456789012\",\"privateDnsName\":\"ip-172-31-78-41.ec2.internal\",\"privateIpAddress\":\"172.31.78.41\",\"privateIpAddresses\":[{\"association\":{\"carrierIp\":null,\"ipOwnerId\":\"0123456789012\",\"publicDnsName\":\"ec2-3-232-229-57.compute-1.amazonaws.com\",\"publicIp\":\"3.232.229.57\"},\"primary\":true,\"privateDnsName\":\"ip-172-31-78-41.ec2.internal\",\"privateIpAddress\":\"172.31.78.41\"}],\"sourceDestCheck\":true,\"status\":\"in-use\",\"subnetId\":\"subnet-cad1f2f4\",\"vpcId\":\"vpc-2d96be57\",\"interfaceType\":\"interface\"},{\"association\":null,\"attachment\":{\"attachTime\":\"2020-11-26T23:46:04.000Z\",\"attachmentId\":\"eni-attach-0e6d150ebbd19966e\",\"deleteOnTermination\":false,\"deviceIndex\":1,\"status\":\"attached\",\"networkCardIndex\":0},\"description\":\"MINHAEC2AAAAAA\",\"groups\":[{\"groupName\":\"minhaec2\",\"groupId\":\"sg-0fb295a327d9b4835\"},{\"groupName\":\"default\",\"groupId\":\"sg-88105fa0\"}],\"ipv6Addresses\":[],\"macAddress\":\"06:0a:62:00:64:5f\",\"networkInterfaceId\":\"eni-09a604c0ec356b06f\",\"ownerId\":\"0123456789012\",\"privateDnsName\":\"ip-172-31-70-9.ec2.internal\",\"privateIpAddress\":\"172.31.70.9\",\"privateIpAddresses\":[{\"association\":null,\"primary\":true,\"privateDnsName\":\"ip-172-31-70-9.ec2.internal\",\"privateIpAddress\":\"172.31.70.9\"}],\"sourceDestCheck\":true,\"status\":\"in-use\",\"subnetId\":\"subnet-cad1f2f4\",\"vpcId\":\"vpc-2d96be57\",\"interfaceType\":\"interface\"}],\"outpostArn\":null,\"rootDeviceName\":\"/dev/xvda\",\"rootDeviceType\":\"ebs\",\"securityGroups\":[{\"groupName\":\"minhaec2\",\"groupId\":\"sg-0fb295a327d9b4835\"}],\"sourceDestCheck\":true,\"spotInstanceRequestId\":null,\"sriovNetSupport\":null,\"stateReason\":{\"code\":\"Client.UserInitiatedShutdown\",\"message\":\"Client.UserInitiatedShutdown: User initiated shutdown\"},\"tags\":[{\"key\":\"projeto\",\"value\":\"meetup\"},{\"key\":\"Name\",\"value\":\"Minha\"},{\"key\":\"CentroCusto\",\"value\":\"TI\"},{\"key\":\"Setor\",\"value\":\"Desenvolvimento\"}],\"virtualizationType\":\"hvm\",\"cpuOptions\":{\"coreCount\":2,\"threadsPerCore\":1},\"capacityReservationId\":null,\"capacityReservationSpecification\":{\"capacityReservationPreference\":\"open\",\"capacityReservationTarget\":null},\"hibernationOptions\":{\"configured\":false},\"licenses\":[],\"metadataOptions\":{\"state\":\"applied\",\"httpTokens\":\"optional\",\"httpPutResponseHopLimit\":1,\"httpEndpoint\":\"enabled\"},\"enclaveOptions\":{\"enabled\":false},\"bootMode\":null},\"supplementaryConfiguration\":{},\"tags\":{\"projeto\":\"meetup\",\"Setor\":\"Desenvolvimento\",\"CentroCusto\":\"TI\",\"Name\":\"Minha\"},\"configurationItemVersion\":\"1.3\",\"configurationItemCaptureTime\":\"2023-04-27T15:03:11.636Z\",\"configurationStateId\":1682607791636,\"awsAccountId\":\"0123456789012\",\"configurationItemStatus\":\"OK\",\"resourceType\":\"AWS::EC2::Instance\",\"resourceId\":\"i-042dd005362091826\",\"resourceName\":null,\"ARN\":\"arn:aws:ec2:us-east-1:0123456789012:instance/i-042dd005362091826\",\"awsRegion\":\"us-east-1\",\"availabilityZone\":\"us-east-1e\",\"configurationStateMd5Hash\":\"\",\"resourceCreationTime\":\"2023-04-27T14:57:16.000Z\"},\"notificationCreationTime\":\"2023-04-27T15:03:13.332Z\",\"messageType\":\"ConfigurationItemChangeNotification\",\"recordVersion\":\"1.3\"}", - "ruleParameters":"{\"desiredInstanceType\": \"t2.micro\"}", - "resultToken":"eyJlbmNyeXB0ZWREYXRhIjpbLTQxLDEsLTU3LC0zMCwtMTIxLDUzLDUyLDQ1LC01NywtOCw3MywtODEsLTExNiwtMTAyLC01MiwxMTIsLTQ3LDU4LDY1LC0xMjcsMTAyLDUsLTY5LDQ0LC0xNSwxMTQsNDEsLTksMTExLC0zMCw2NSwtNzUsLTM1LDU0LDEwNSwtODksODYsNDAsLTEwNSw5OCw2NSwtMTE5LC02OSwyNCw2NiwtMjAsODAsLTExMiwtNzgsLTgwLDQzLC01NywzMCwtMjUsODIsLTEwLDMsLTQsLTg1LC01MywtMzcsLTkwLC04OCwtOTgsLTk4LC00MSwxOSwxMTYsNjIsLTIzLC0xMjEsLTEwOCw1NywtNTgsLTUyLDI5LDEwMSwxMjIsLTU2LC03MSwtODEsLTQ3LDc3LC0yMiwtMTI0LC0zLC04NiwtMTIyLC00MCwtODksLTEwMSw1NywtMTI3LC0zNywtMzcsLTMxLC05OCwtMzEsMTEsLTEyNSwwLDEwOCwtMzIsNjQsNjIsLTIyLDAsNDcsLTEwNiwtMTAwLDEwNCwxNCw1OCwxMjIsLTEwLC01MCwtOTAsLTgwLC01MCwtNSw2NSwwLC0yNSw4NSw4Miw3LDkzLDEyMiwtODIsLTExNiwtNzksLTQ0LDcyLC03MywtNjksMTQsLTU2LDk0LDkwLDExNCwtMjksLTExOSwtNzEsODgsMTA3LDEwNywxMTAsLTcsMTI3LC0xMjUsLTU3LC0xMjYsLTEyMCw2OSwtMTI3LC03NiwtMTE5LDcxLDEsLTY4LDEwNywxMTMsLTU2LDg3LC0xMDIsLTE2LDEwOCwtMTA3LC00MywtOTQsLTEwNiwzLDkwLDE0LDcyLC0xMiwtMTE2LC03Myw4MCwtMTIyLDQ0LC0xMDQsMTIsNzQsNTcsLTEwLC0xMDUsLTExMiwtMzYsMjgsLTQ1LDk3LDExLC00OSwtMTEsNjEsMzYsLTE3LC03NCw1MCw0LC0yNiwxMDQsLTI4LC0xMjUsMjQsNzAsLTg1LC00Niw5MiwtMTAzLC00MSwtMTA2LDY5LDEyMiwyMSwtMjUsODAsOTksLTkzLC01NiwtMjUsLTQ3LC0xMjMsLTU5LC0xMjQsLTUyLC0xNiwxMjcsLTM4LC0xNiwxMDEsMTE5LDEwNywyNywxMCwtNDYsLTg3LC0xMiwtMzksMTQsNDUsMiw3MCwxMDcsMTA0LC00LC02OSwtMTIsNTksLTEyNiwtOTEsMTI3LDU0LDEwNiwtMTI2LC0xMTYsLTEwMiw3Miw4MSw1MCw3NSwtNTEsMTA4LDQxLC0zLC02LC00NSwxMDMsLTg2LDM3LC00NiwtMzIsLTExMSwxMjQsMTExLDg3LDU0LC03NiwxMjIsLTUsLTM2LC04OCw5LC0xMTMsMTE2LC01OSw4Myw3NywyOCwxMiwtNjUsLTExMywtNzksLTEyOCw4MiwtMTE4LC04MywtMTI0LDMxLDk5LC05MCwtOTksMTYsLTEyMywyMSwtMTE0LC05OCwtMTE2LC0xMTksMiwtNzMsNDYsODIsLTEzLDU0LDcxLC00MiwyNSw3NCw3MywtODYsOTQsNDYsOTksOTMsLTgyLDU1LDY1LC05OCw0OSwtNjAsMTEyLDEwMSwyMiw2OSwtMTYsNzcsLTk0LC01OSwtNDYsMTE1LDMwLC00Myw5Myw4OCwtMjgsMzgsNiw4NCwzMSwtMTAxLDMyLC0yMiwtNjMsLTk1LDExNCwtNzUsMTE0LDM2LC04NCw0MCwtNDQsLTEzLDU5LDcyLC0xLC0xMDMsMzEsMTA1LDY5LDY5LDc3LC02NCwtNTYsMTE4LDEzLC0xMTQsODAsOTksLTUzLDI1LDQyLDk0LDczLC04MCwyNSwzOCwyNCwtMTcsNjYsLTExOCwtMjMsMTE5LDkwLDEyMSwxMTgsLTUxLDUxLC0xMiwtNzYsLTUxLDksLTIxLDExNCwtMzcsLTY0LC0yLC0xMjYsLTk1LDYzLDczLC00MSwtMzQsLTkwLC0yMiw1OSwtNzksMzAsLTQsLTEsLTUsMTIsMzksLTk5LC0xMDUsLTEwNCwtNjEsNjUsLTc0LDE5LC0xMywtNjAsLTI4LC04LDQsLTgsMTIxLC0xMTgsMTIyLC02NSwtMjEsMjMsMTcsLTg0LDQwLC05MiwxNCwtMTI2LC02MCwtNzksLTUzLDM3LC04Myw2NSwxMDQsLTM2LC02MCwtMTEwLC0zMywtMTE3LDYsMTA3LDEsLTMsOTMsNzgsLTk1LC0xMjIsNTMsMTA4LC00OSwtNDksMjQsLTY1LDgzLDEyNSwtNzcsLTE5LC04MSwzNCwtNjcsLTQzLC03MCwtMjYsMTgsMTA0LDY1LDQsLTEyNiw0NCwtMTE5LDUyLC00NiwyMiw2NywxMTMsMTE4LC0zMywzNCwtOTYsMTIxLDE5LC0yLC0zNSwwLC04MiwxNyw2NiwtMjcsNjksLTM2LC0xNCw1NiwtOTcsLTE2LDEyMywyOCwtOTUsLTMyLC02MywtNjksNzAsNjQsLTMzLC0xMDAsNDMsLTExMywxMDUsMTAwLDEwOCwtNjAsNDAsLTIsLTk2LC0xMjQsMzcsLTQ1LC0xMjQsLTY4LC02OSwtMTIzLDE3LC02LDg2LC01OSwtOTQsMTEwLDczLDU3LC0xMTYsMTA3LC00MSwtOTQsLTExOCwtMTI2LDEwLC04MCwtNzAsMTAyLDg4LC0xMjYsODcsLTI3LC0xMDEsLTk0LC0zNSwtMTA2LC02LC03MiwtODYsNTAsMTE2LC0yOCw5MCwxMywtMTIwLDYsMjcsOTIsNTYsLTkwLDM5LDQ5LC0xMywtODYsLTI1LC04NiwxMTMsLTEzLDQxLC0xMTksOTQsLTk0LC0xMDMsLTgzLC02MCwxMjcsLTE1LC0zOSwxMTksLTk1LDI3LDQ0LDExNiwxMDksNywtMTAyLC0xNyw0OCwtODIsLTMxLC04LC02OSwzNSw5NCw1NCwtNTUsMSwtMTE5LDU3LC0xMDgsLTMsLTkxLC0xMjIsLTUzLC04OCw0LC05NywtMzUsMTI2LDExOSw1OSwtMSw4NSw3MywtNTgsLTEyMCwtNjQsMTE5LC0xMTIsOTIsMTksOSwtNjYsLTkyLDEwOCwtMTEsLTQyLDExMSwtMTA0LC0xMjAsMjcsLTEwMywtNjksMTksMTExLDEyLDIzLDEwNyw1NCw0MSwtMjYsNjAsLTMxLC01XSwibWF0ZXJpYWxTZXRTZXJpYWxOdW1iZXIiOjEsIml2UGFyYW1ldGVyU3BlYyI6eyJpdiI6Wy05NSwzMiwxMDgsOTEsMzUsLTgyLC0zNywyNCwtNDQsLTExNSwtODIsLTEyOCwtMTIyLDMsNTMsLTI0XX19", - "eventLeftScope":false, - "executionRoleArn":"arn:aws:iam::0123456789012:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig", - "configRuleArn":"arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", - "configRuleName":"MyRule", - "configRuleId":"config-rule-i9y8j9", - "accountId":"0123456789012", - "evaluationMode":"DETECTIVE" - } diff --git a/examples/event_sources/src/aws_config_rule_oversized.json b/examples/event_sources/src/aws_config_rule_oversized.json deleted file mode 100644 index 5eaef4e0015..00000000000 --- a/examples/event_sources/src/aws_config_rule_oversized.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "invokingEvent": "{\"configurationItemSummary\": {\"changeType\": \"UPDATE\",\"configurationItemVersion\": \"1.2\",\"configurationItemCaptureTime\":\"2016-10-06T16:46:16.261Z\",\"configurationStateId\": 0,\"awsAccountId\":\"123456789012\",\"configurationItemStatus\": \"OK\",\"resourceType\": \"AWS::EC2::Instance\",\"resourceId\":\"i-00000000\",\"resourceName\":null,\"ARN\":\"arn:aws:ec2:us-west-2:123456789012:instance/i-00000000\",\"awsRegion\": \"us-west-2\",\"availabilityZone\":\"us-west-2a\",\"configurationStateMd5Hash\":\"8f1ee69b287895a0f8bc5753eca68e96\",\"resourceCreationTime\":\"2016-10-06T16:46:10.489Z\"},\"messageType\":\"OversizedConfigurationItemChangeNotification\", \"notificationCreationTime\": \"2016-10-06T16:46:16.261Z\", \"recordVersion\": \"1.0\"}", - "ruleParameters": "{\"myParameterKey\":\"myParameterValue\"}", - "resultToken": "myResultToken", - "eventLeftScope": false, - "executionRoleArn": "arn:aws:iam::123456789012:role/config-role", - "configRuleArn": "arn:aws:config:us-east-2:123456789012:config-rule/config-rule-ec2-managed-instance-inventory", - "configRuleName": "change-triggered-config-rule", - "configRuleId": "config-rule-0123456", - "accountId": "123456789012", - "version": "1.0" -} diff --git a/examples/event_sources/src/bedrock_agent_event.py b/examples/event_sources/src/bedrock_agent.py similarity index 83% rename from examples/event_sources/src/bedrock_agent_event.py rename to examples/event_sources/src/bedrock_agent.py index b16d3c86bad..31d5684fa08 100644 --- a/examples/event_sources/src/bedrock_agent_event.py +++ b/examples/event_sources/src/bedrock_agent.py @@ -1,12 +1,11 @@ from aws_lambda_powertools import Logger from aws_lambda_powertools.utilities.data_classes import BedrockAgentEvent, event_source -from aws_lambda_powertools.utilities.typing import LambdaContext logger = Logger() @event_source(data_class=BedrockAgentEvent) -def lambda_handler(event: BedrockAgentEvent, context: LambdaContext) -> dict: +def lambda_handler(event: BedrockAgentEvent, context) -> dict: input_text = event.input_text logger.info(f"Bedrock Agent {event.action_group} invoked with input", input_text=input_text) diff --git a/examples/event_sources/src/cloudWatchDashboard.py b/examples/event_sources/src/cloudWatchDashboard.py new file mode 100644 index 00000000000..ff8b896a806 --- /dev/null +++ b/examples/event_sources/src/cloudWatchDashboard.py @@ -0,0 +1,31 @@ +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.data_classes import CloudWatchDashboardCustomWidgetEvent, event_source + +logger = Logger() + + +@event_source(data_class=CloudWatchDashboardCustomWidgetEvent) +def lambda_handler(event: CloudWatchDashboardCustomWidgetEvent, context): + if event.widget_context is None: + logger.warning("No widget context provided") + return {"title": "Error", "markdown": "Widget context is missing"} + + logger.info(f"Processing custom widget for dashboard: {event.widget_context.dashboard_name}") + + # Access specific event properties + widget_id = event.widget_context.widget_id + time_range = event.widget_context.time_range + + if time_range is None: + logger.warning("No time range provided") + return {"title": f"Custom Widget {widget_id}", "markdown": "Time range is missing"} + + # Your custom widget logic here + return { + "title": f"Custom Widget {widget_id}", + "markdown": f""" + Dashboard: {event.widget_context.dashboard_name} + Time Range: {time_range.start} to {time_range.end} + Theme: {event.widget_context.theme or 'default'} + """, + } diff --git a/examples/event_sources/src/cloudformation_custom_resource_handler.py b/examples/event_sources/src/cloudformation_custom_resource_handler.py index fa5b85d54df..87fa2bd1ab9 100644 --- a/examples/event_sources/src/cloudformation_custom_resource_handler.py +++ b/examples/event_sources/src/cloudformation_custom_resource_handler.py @@ -13,31 +13,15 @@ def lambda_handler(event: CloudFormationCustomResourceEvent, context: LambdaCont request_type = event.request_type if request_type == "Create": - return on_create(event) - if request_type == "Update": - return on_update(event) - if request_type == "Delete": - return on_delete(event) + return on_create(event, context) + else: + raise ValueError(f"Invalid request type: {request_type}") -def on_create(event: CloudFormationCustomResourceEvent): +def on_create(event: CloudFormationCustomResourceEvent, context: LambdaContext): props = event.resource_properties logger.info(f"Create new resource with props {props}.") - # Add your create code here ... - physical_id = ... + physical_id = f"MyResource-{context.aws_request_id}" - return {"PhysicalResourceId": physical_id} - - -def on_update(event: CloudFormationCustomResourceEvent): - physical_id = event.physical_resource_id - props = event.resource_properties - logger.info(f"Update resource {physical_id} with props {props}.") - # ... - - -def on_delete(event: CloudFormationCustomResourceEvent): - physical_id = event.physical_resource_id - logger.info(f"Delete resource {physical_id}.") - # ... + return {"PhysicalResourceId": physical_id, "Data": {"Message": "Resource created successfully"}} diff --git a/examples/event_sources/src/cloudwatch_logs.py b/examples/event_sources/src/cloudwatch_logs.py new file mode 100644 index 00000000000..95890275595 --- /dev/null +++ b/examples/event_sources/src/cloudwatch_logs.py @@ -0,0 +1,18 @@ +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.data_classes import CloudWatchLogsEvent, event_source +from aws_lambda_powertools.utilities.data_classes.cloud_watch_logs_event import CloudWatchLogsDecodedData + +logger = Logger() + + +@event_source(data_class=CloudWatchLogsEvent) +def lambda_handler(event: CloudWatchLogsEvent, context): + decompressed_log: CloudWatchLogsDecodedData = event.parse_logs_data() + + logger.info(f"Log group: {decompressed_log.log_group}") + logger.info(f"Log stream: {decompressed_log.log_stream}") + + for log_event in decompressed_log.log_events: + logger.info(f"Timestamp: {log_event.timestamp}, Message: {log_event.message}") + + return {"statusCode": 200, "body": f"Processed {len(decompressed_log.log_events)} log events"} diff --git a/examples/event_sources/src/code_pipeline_job.py b/examples/event_sources/src/code_pipeline_job.py new file mode 100644 index 00000000000..39db6e60b9e --- /dev/null +++ b/examples/event_sources/src/code_pipeline_job.py @@ -0,0 +1,10 @@ +from aws_lambda_powertools.utilities.data_classes import CodePipelineJobEvent, event_source + + +@event_source(data_class=CodePipelineJobEvent) +def lambda_handler(event: CodePipelineJobEvent, context): + job_id = event.get_id + + input_bucket = event.input_bucket_name + + return {"statusCode": 200, "body": f"Processed job {job_id} from bucket {input_bucket}"} diff --git a/examples/event_sources/src/codedeploy_lifecycle_hook.py b/examples/event_sources/src/codedeploy_lifecycle_hook.py new file mode 100644 index 00000000000..6da54d185fc --- /dev/null +++ b/examples/event_sources/src/codedeploy_lifecycle_hook.py @@ -0,0 +1,9 @@ +from aws_lambda_powertools.utilities.data_classes import CodeDeployLifecycleHookEvent, event_source + + +@event_source(data_class=CodeDeployLifecycleHookEvent) +def lambda_handler(event: CodeDeployLifecycleHookEvent, context): + deployment_id = event.deployment_id + lifecycle_event_hook_execution_id = event.lifecycle_event_hook_execution_id + + return {"deployment_id": deployment_id, "lifecycle_event_hook_execution_id": lifecycle_event_hook_execution_id} diff --git a/examples/event_sources/src/cognito_create_auth.py b/examples/event_sources/src/cognito_create_auth.py new file mode 100644 index 00000000000..9f57743f053 --- /dev/null +++ b/examples/event_sources/src/cognito_create_auth.py @@ -0,0 +1,11 @@ +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import CreateAuthChallengeTriggerEvent + + +@event_source(data_class=CreateAuthChallengeTriggerEvent) +def handler(event: CreateAuthChallengeTriggerEvent, context) -> dict: + if event.request.challenge_name == "CUSTOM_CHALLENGE": + event.response.public_challenge_parameters = {"captchaUrl": "url/123.jpg"} + event.response.private_challenge_parameters = {"answer": "5"} + event.response.challenge_metadata = "CAPTCHA_CHALLENGE" + return event.raw_event diff --git a/examples/event_sources/src/cognito_define_auth.py b/examples/event_sources/src/cognito_define_auth.py new file mode 100644 index 00000000000..2f7d197bb26 --- /dev/null +++ b/examples/event_sources/src/cognito_define_auth.py @@ -0,0 +1,30 @@ +from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import DefineAuthChallengeTriggerEvent + + +def lambda_handler(event, context) -> dict: + event_obj: DefineAuthChallengeTriggerEvent = DefineAuthChallengeTriggerEvent(event) + + if len(event_obj.request.session) == 1 and event_obj.request.session[0].challenge_name == "SRP_A": + event_obj.response.issue_tokens = False + event_obj.response.fail_authentication = False + event_obj.response.challenge_name = "PASSWORD_VERIFIER" + elif ( + len(event_obj.request.session) == 2 + and event_obj.request.session[1].challenge_name == "PASSWORD_VERIFIER" + and event_obj.request.session[1].challenge_result + ): + event_obj.response.issue_tokens = False + event_obj.response.fail_authentication = False + event_obj.response.challenge_name = "CUSTOM_CHALLENGE" + elif ( + len(event_obj.request.session) == 3 + and event_obj.request.session[2].challenge_name == "CUSTOM_CHALLENGE" + and event_obj.request.session[2].challenge_result + ): + event_obj.response.issue_tokens = True + event_obj.response.fail_authentication = False + else: + event_obj.response.issue_tokens = False + event_obj.response.fail_authentication = True + + return event_obj.raw_event diff --git a/examples/event_sources/src/cognito_post_confirmation.py b/examples/event_sources/src/cognito_post_confirmation.py new file mode 100644 index 00000000000..51ecc2de43f --- /dev/null +++ b/examples/event_sources/src/cognito_post_confirmation.py @@ -0,0 +1,9 @@ +from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import PostConfirmationTriggerEvent + + +def lambda_handler(event, context): + event: PostConfirmationTriggerEvent = PostConfirmationTriggerEvent(event) + + user_attributes = event.request.user_attributes + + return {"statusCode": 200, "body": f"User attributes: {user_attributes}"} diff --git a/examples/event_sources/src/cognito_verify_auth.py b/examples/event_sources/src/cognito_verify_auth.py new file mode 100644 index 00000000000..ae15942246e --- /dev/null +++ b/examples/event_sources/src/cognito_verify_auth.py @@ -0,0 +1,10 @@ +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.cognito_user_pool_event import VerifyAuthChallengeResponseTriggerEvent + + +@event_source(data_class=VerifyAuthChallengeResponseTriggerEvent) +def lambda_handler(event: VerifyAuthChallengeResponseTriggerEvent, context) -> dict: + event.response.answer_correct = ( + event.request.private_challenge_parameters.get("answer") == event.request.challenge_answer + ) + return event.raw_event diff --git a/examples/event_sources/src/connect_contact_flow.py b/examples/event_sources/src/connect_contact_flow.py new file mode 100644 index 00000000000..53d120a4c4b --- /dev/null +++ b/examples/event_sources/src/connect_contact_flow.py @@ -0,0 +1,14 @@ +from aws_lambda_powertools.utilities.data_classes.connect_contact_flow_event import ( + ConnectContactFlowChannel, + ConnectContactFlowEndpointType, + ConnectContactFlowEvent, + ConnectContactFlowInitiationMethod, +) + + +def lambda_handler(event, context): + event: ConnectContactFlowEvent = ConnectContactFlowEvent(event) + assert event.contact_data.attributes == {"Language": "en-US"} + assert event.contact_data.channel == ConnectContactFlowChannel.VOICE + assert event.contact_data.customer_endpoint.endpoint_type == ConnectContactFlowEndpointType.TELEPHONE_NUMBER + assert event.contact_data.initiation_method == ConnectContactFlowInitiationMethod.API diff --git a/examples/event_sources/src/dynamodb_multiple_records.py b/examples/event_sources/src/dynamodb_multiple_records.py new file mode 100644 index 00000000000..8436dcfc827 --- /dev/null +++ b/examples/event_sources/src/dynamodb_multiple_records.py @@ -0,0 +1,13 @@ +from aws_lambda_powertools.utilities.data_classes import DynamoDBStreamEvent, event_source +from aws_lambda_powertools.utilities.typing import LambdaContext + + +@event_source(data_class=DynamoDBStreamEvent) +def lambda_handler(event: DynamoDBStreamEvent, context: LambdaContext): + processed_keys = [] + for record in event.records: + if record.dynamodb and record.dynamodb.keys and "Id" in record.dynamodb.keys: + key = record.dynamodb.keys["Id"] + processed_keys.append(key) + + return {"statusCode": 200, "body": f"Processed keys: {processed_keys}"} diff --git a/examples/event_sources/src/dynamodb_stream.py b/examples/event_sources/src/dynamodb_stream.py new file mode 100644 index 00000000000..e317ddac8d4 --- /dev/null +++ b/examples/event_sources/src/dynamodb_stream.py @@ -0,0 +1,16 @@ +from aws_lambda_powertools.utilities.data_classes.dynamo_db_stream_event import ( + DynamoDBRecordEventName, + DynamoDBStreamEvent, +) + + +def lambda_handler(event, context): + event: DynamoDBStreamEvent = DynamoDBStreamEvent(event) + + # Multiple records can be delivered in a single event + for record in event.records: + if record.event_name == DynamoDBRecordEventName.MODIFY: + pass + elif record.event_name == DynamoDBRecordEventName.INSERT: + pass + return "success" diff --git a/examples/event_sources/src/eventBridgeEvent.py b/examples/event_sources/src/eventBridgeEvent.py new file mode 100644 index 00000000000..5bd9c165824 --- /dev/null +++ b/examples/event_sources/src/eventBridgeEvent.py @@ -0,0 +1,11 @@ +from aws_lambda_powertools.utilities.data_classes import EventBridgeEvent, event_source + + +@event_source(data_class=EventBridgeEvent) +def lambda_handler(event: EventBridgeEvent, context): + detail_type = event.detail_type + state = event.detail.get("state") + + # Do something + + return {"detail_type": detail_type, "state": state} diff --git a/examples/event_sources/src/getting_started_data_classes.py b/examples/event_sources/src/getting_started_data_classes.py new file mode 100644 index 00000000000..64119fc4c0f --- /dev/null +++ b/examples/event_sources/src/getting_started_data_classes.py @@ -0,0 +1,9 @@ +from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEvent + + +def lambda_handler(event: dict, context): + api_event = APIGatewayProxyEvent(event) + if "hello" in api_event.path and api_event.http_method == "GET": + return {"statusCode": 200, "body": f"Hello from path: {api_event.path}"} + else: + return {"statusCode": 400, "body": "No Hello from path"} diff --git a/examples/event_sources/src/kafka_event.py b/examples/event_sources/src/kafka_event.py new file mode 100644 index 00000000000..c6f62e243eb --- /dev/null +++ b/examples/event_sources/src/kafka_event.py @@ -0,0 +1,12 @@ +from aws_lambda_powertools.utilities.data_classes import KafkaEvent, event_source + + +def do_something_with(key: str, value: str): + print(f"key: {key}, value: {value}") + + +@event_source(data_class=KafkaEvent) +def lambda_handler(event: KafkaEvent, context): + for record in event.records: + do_something_with(record.topic, record.value) + return "success" diff --git a/examples/event_sources/src/kinesisStreamCloudWatchLogs.py b/examples/event_sources/src/kinesisStreamCloudWatchLogs.py new file mode 100644 index 00000000000..fa6fccf2b17 --- /dev/null +++ b/examples/event_sources/src/kinesisStreamCloudWatchLogs.py @@ -0,0 +1,17 @@ +from typing import List + +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.cloud_watch_logs_event import CloudWatchLogsDecodedData +from aws_lambda_powertools.utilities.data_classes.kinesis_stream_event import ( + KinesisStreamEvent, + extract_cloudwatch_logs_from_event, +) + + +@event_source(data_class=KinesisStreamEvent) +def lambda_handler(event: KinesisStreamEvent, context): + logs: List[CloudWatchLogsDecodedData] = extract_cloudwatch_logs_from_event(event) + for log in logs: + if log.message_type == "DATA_MESSAGE": + return "success" + return "nothing to be processed" diff --git a/examples/event_sources/src/kinesis_batch_example.py b/examples/event_sources/src/kinesis_batch_example.py new file mode 100644 index 00000000000..0a7366fdd8b --- /dev/null +++ b/examples/event_sources/src/kinesis_batch_example.py @@ -0,0 +1,29 @@ +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.batch import ( + BatchProcessor, + EventType, + process_partial_response, +) +from aws_lambda_powertools.utilities.data_classes.kinesis_stream_event import ( + KinesisStreamRecord, + extract_cloudwatch_logs_from_record, +) + +logger = Logger() + +processor = BatchProcessor(event_type=EventType.KinesisDataStreams) + + +def record_handler(record: KinesisStreamRecord): + log = extract_cloudwatch_logs_from_record(record) + logger.info(f"Message type: {log.message_type}") + return log.message_type == "DATA_MESSAGE" + + +def lambda_handler(event, context): + return process_partial_response( + event=event, + record_handler=record_handler, + processor=processor, + context=context, + ) diff --git a/examples/event_sources/src/kinesis_streams.py b/examples/event_sources/src/kinesis_streams.py new file mode 100644 index 00000000000..630190c5807 --- /dev/null +++ b/examples/event_sources/src/kinesis_streams.py @@ -0,0 +1,40 @@ +import json +from typing import Any, Dict, Union + +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.data_classes import KinesisStreamEvent, event_source +from aws_lambda_powertools.utilities.typing import LambdaContext + +logger = Logger() + + +@event_source(data_class=KinesisStreamEvent) +def lambda_handler(event: KinesisStreamEvent, context: LambdaContext): + for record in event.records: + kinesis_record = record.kinesis + + payload: Union[Dict[str, Any], str] + + try: + # Try to parse as JSON first + payload = kinesis_record.data_as_json() + logger.info("Received JSON data from Kinesis") + except json.JSONDecodeError: + # If JSON parsing fails, get as text + payload = kinesis_record.data_as_text() + logger.info("Received text data from Kinesis") + + process_data(payload) + + return {"statusCode": 200, "body": "Processed all records successfully"} + + +def process_data(data: Union[Dict[str, Any], str]) -> None: + if isinstance(data, dict): + # Handle JSON data + logger.info(f"Processing JSON data: {data}") + # Add your JSON processing logic here + else: + # Handle text data + logger.info(f"Processing text data: {data}") + # Add your text processing logic here diff --git a/examples/event_sources/src/lambdaFunctionUrl.py b/examples/event_sources/src/lambdaFunctionUrl.py new file mode 100644 index 00000000000..f518d825680 --- /dev/null +++ b/examples/event_sources/src/lambdaFunctionUrl.py @@ -0,0 +1,7 @@ +from aws_lambda_powertools.utilities.data_classes import LambdaFunctionUrlEvent, event_source + + +@event_source(data_class=LambdaFunctionUrlEvent) +def lambda_handler(event: LambdaFunctionUrlEvent, context): + if event.request_context.http.method == "GET": + return {"statusCode": 200, "body": "Hello World!"} diff --git a/examples/event_sources/src/rabbit_mq_example.py b/examples/event_sources/src/rabbit_mq_example.py new file mode 100644 index 00000000000..998f012fdba --- /dev/null +++ b/examples/event_sources/src/rabbit_mq_example.py @@ -0,0 +1,21 @@ +from typing import Dict + +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.data_classes import event_source +from aws_lambda_powertools.utilities.data_classes.rabbit_mq_event import RabbitMQEvent + +logger = Logger() + + +@event_source(data_class=RabbitMQEvent) +def lambda_handler(event: RabbitMQEvent, context): + for queue_name, messages in event.rmq_messages_by_queue.items(): + logger.debug(f"Messages for queue: {queue_name}") + for message in messages: + logger.debug(f"MessageID: {message.basic_properties.message_id}") + data: Dict = message.json_data + logger.debug(f"Process json in base64 encoded data str {data}") + return { + "queue_name": queue_name, + "message_id": message.basic_properties.message_id, + } diff --git a/examples/event_sources/src/s3Event.py b/examples/event_sources/src/s3Event.py new file mode 100644 index 00000000000..2307bdfc5e0 --- /dev/null +++ b/examples/event_sources/src/s3Event.py @@ -0,0 +1,18 @@ +from urllib.parse import unquote_plus + +from aws_lambda_powertools.utilities.data_classes import S3Event, event_source + + +@event_source(data_class=S3Event) +def lambda_handler(event: S3Event, context): + bucket_name = event.bucket_name + + # Multiple records can be delivered in a single event + for record in event.records: + object_key = unquote_plus(record.s3.get_object.key) + object_etag = record.s3.get_object.etag + return { + "bucket": bucket_name, + "object_key": object_key, + "object_etag": object_etag, + } diff --git a/examples/event_sources/src/s3_event_bridge.py b/examples/event_sources/src/s3_event_bridge.py new file mode 100644 index 00000000000..425c144bfd8 --- /dev/null +++ b/examples/event_sources/src/s3_event_bridge.py @@ -0,0 +1,13 @@ +from aws_lambda_powertools.utilities.data_classes import S3EventBridgeNotificationEvent, event_source + + +@event_source(data_class=S3EventBridgeNotificationEvent) +def lambda_handler(event: S3EventBridgeNotificationEvent, context): + bucket_name = event.detail.bucket.name + file_key = event.detail.object.key + if event.detail_type == "Object Created": + print(f"Object {file_key} created in bucket {bucket_name}") + return { + "bucket": bucket_name, + "file_key": file_key, + } diff --git a/examples/event_sources/src/s3_object_lambda.py b/examples/event_sources/src/s3_object_lambda.py new file mode 100644 index 00000000000..11e20287191 --- /dev/null +++ b/examples/event_sources/src/s3_object_lambda.py @@ -0,0 +1,31 @@ +import boto3 +import requests + +from aws_lambda_powertools import Logger +from aws_lambda_powertools.logging.correlation_paths import S3_OBJECT_LAMBDA +from aws_lambda_powertools.utilities.data_classes.s3_object_event import S3ObjectLambdaEvent + +logger = Logger() +session = boto3.session.Session() +s3 = session.client("s3") + + +@logger.inject_lambda_context(correlation_id_path=S3_OBJECT_LAMBDA, log_event=True) +def lambda_handler(event, context): + event = S3ObjectLambdaEvent(event) + + # Get object from S3 + response = requests.get(event.input_s3_url) + original_object = response.content.decode("utf-8") + + # Make changes to the object about to be returned + transformed_object = original_object.upper() + + # Write object back to S3 Object Lambda + s3.write_get_object_response( + Body=transformed_object, + RequestRoute=event.request_route, + RequestToken=event.request_token, + ) + + return {"status_code": 200} diff --git a/examples/event_sources/src/secrets_manager_event.json b/examples/event_sources/src/secrets_manager_event.json deleted file mode 100644 index 18e7dcd935b..00000000000 --- a/examples/event_sources/src/secrets_manager_event.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "SecretId":"arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3", - "ClientRequestToken":"550e8400-e29b-41d4-a716-446655440000", - "Step":"createSecret" -} diff --git a/examples/event_sources/src/ses_event.py b/examples/event_sources/src/ses_event.py new file mode 100644 index 00000000000..690bfd2f7bc --- /dev/null +++ b/examples/event_sources/src/ses_event.py @@ -0,0 +1,13 @@ +from aws_lambda_powertools.utilities.data_classes import SESEvent, event_source + + +@event_source(data_class=SESEvent) +def lambda_handler(event: SESEvent, context): + # Multiple records can be delivered in a single event + for record in event.records: + mail = record.ses.mail + common_headers = mail.common_headers + return { + "mail": mail, + "common_headers": common_headers, + } diff --git a/examples/event_sources/src/sns_event.py b/examples/event_sources/src/sns_event.py new file mode 100644 index 00000000000..a45e02b1e24 --- /dev/null +++ b/examples/event_sources/src/sns_event.py @@ -0,0 +1,13 @@ +from aws_lambda_powertools.utilities.data_classes import SNSEvent, event_source + + +@event_source(data_class=SNSEvent) +def lambda_handler(event: SNSEvent, context): + # Multiple records can be delivered in a single event + for record in event.records: + message = record.sns.message + subject = record.sns.subject + return { + "message": message, + "subject": subject, + } diff --git a/examples/event_sources/src/sqs_event.py b/examples/event_sources/src/sqs_event.py new file mode 100644 index 00000000000..b76b1bfd360 --- /dev/null +++ b/examples/event_sources/src/sqs_event.py @@ -0,0 +1,13 @@ +from aws_lambda_powertools.utilities.data_classes import SQSEvent, event_source + + +@event_source(data_class=SQSEvent) +def lambda_handler(event: SQSEvent, context): + # Multiple records can be delivered in a single event + for record in event.records: + message = record.body + message_id = record.message_id + return { + "message": message, + "message_id": message_id, + } From ff14f35cf01db01b177dec731ab4f2a65fb5f3c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 08:41:48 +0000 Subject: [PATCH 34/52] chore(deps): bump pydantic from 2.10.5 to 2.10.6 (#5918) Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.10.5 to 2.10.6. - [Release notes](https://github.com/pydantic/pydantic/releases) - [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md) - [Commits](https://github.com/pydantic/pydantic/compare/v2.10.5...v2.10.6) --- updated-dependencies: - dependency-name: pydantic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index fe73c5cfe20..9cb236ddf97 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2896,13 +2896,13 @@ files = [ [[package]] name = "pydantic" -version = "2.10.5" +version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"}, - {file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"}, + {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, + {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, ] [package.dependencies] From 417865d18b55ff77de5a71815eb0748f100176e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 08:42:28 +0000 Subject: [PATCH 35/52] chore(deps-dev): bump pytest-asyncio from 0.24.0 to 0.25.2 (#5920) Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.24.0 to 0.25.2. - [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases) - [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.24.0...v0.25.2) --- updated-dependencies: - dependency-name: pytest-asyncio dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 12 ++++++------ pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9cb236ddf97..8b0f52d5539 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3116,20 +3116,20 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments [[package]] name = "pytest-asyncio" -version = "0.24.0" +version = "0.25.2" description = "Pytest support for asyncio" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"}, - {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"}, + {file = "pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075"}, + {file = "pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f"}, ] [package.dependencies] pytest = ">=8.2,<9" [package.extras] -docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"] testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] [[package]] @@ -4430,4 +4430,4 @@ validation = ["fastjsonschema"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0.0" -content-hash = "c3c5d4004da5f472f4276af465232be3dcc07d9f98b1d4f5c662c1ad1603c857" +content-hash = "d9f1328c56d8cbad3242d4f5f5f7ca04482270605a7505994dfc2872847dff05" diff --git a/pyproject.toml b/pyproject.toml index 401083980a9..cd7576e1062 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,7 +83,7 @@ isort = "^5.13.2" pytest-cov = ">=5,<7" pytest-mock = "^3.14.0" pdoc3 = "^0.11.0" -pytest-asyncio = "^0.24.0" +pytest-asyncio = ">=0.24,<0.26" bandit = "^1.7.10" radon = "^6.0.1" xenon = "^0.9.3" From 0d062bcc471d2817ddda734e8147230798fc23b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 08:43:20 +0000 Subject: [PATCH 36/52] chore(deps-dev): bump boto3-stubs from 1.36.4 to 1.36.5 (#5919) Bumps [boto3-stubs](https://github.com/youtype/mypy_boto3_builder) from 1.36.4 to 1.36.5. - [Release notes](https://github.com/youtype/mypy_boto3_builder/releases) - [Commits](https://github.com/youtype/mypy_boto3_builder/commits) --- updated-dependencies: - dependency-name: boto3-stubs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8b0f52d5539..cc862f97e89 100644 --- a/poetry.lock +++ b/poetry.lock @@ -428,13 +428,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.4" -description = "Type annotations for boto3 1.36.4 generated with mypy-boto3-builder 8.8.0" +version = "1.36.5" +description = "Type annotations for boto3 1.36.5 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.36.4-py3-none-any.whl", hash = "sha256:3d4e9a8a4d7163bcdb6514b92e901706ce4f522dc8aeab8b4e157fa9e0138e49"}, - {file = "boto3_stubs-1.36.4.tar.gz", hash = "sha256:36db2481d1a0291a2c05c30756fd83514c8d461f8dbc2915cb0c7cf06dc9ed70"}, + {file = "boto3_stubs-1.36.5-py3-none-any.whl", hash = "sha256:0a1ac9e8a1d6e5f401f463c0dc4241d676b21f27ca17ce73771831edb7411ffa"}, + {file = "boto3_stubs-1.36.5.tar.gz", hash = "sha256:a262acbf3057ae8e1765efa4114eb1ca9cf6920c98411938322cad6155a8a150"}, ] [package.dependencies] @@ -501,7 +501,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.4)"] +boto3 = ["boto3 (==1.36.5)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] From 485293cf75a3aaf05c74ca977baf2d6e7d0c09df Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 08:43:46 +0000 Subject: [PATCH 37/52] chore(ci): changelog rebuild (#5922) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> Co-authored-by: Leandro Damascena --- CHANGELOG.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4d6aea60f1..185e194d75a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ ## Documentation +* **data_classes:** improve Event Source Data Classes documentation ([#5916](https://github.com/aws-powertools/powertools-lambda-python/issues/5916)) * **event_handler:** demonstrate handling optional security routes ([#5895](https://github.com/aws-powertools/powertools-lambda-python/issues/5895)) * **layer:** update layer version number - v3.4.1 ([#5869](https://github.com/aws-powertools/powertools-lambda-python/issues/5869)) @@ -23,18 +24,18 @@ ## Maintenance -* **ci:** make `pyproject.toml` fully compatible with Poetryv2 ([#5902](https://github.com/aws-powertools/powertools-lambda-python/issues/5902)) +* **ci:** drop support for Python 3.8 ([#5896](https://github.com/aws-powertools/powertools-lambda-python/issues/5896)) * **ci:** adjust token permission ([#5867](https://github.com/aws-powertools/powertools-lambda-python/issues/5867)) * **ci:** new pre-release 3.4.2a0 ([#5873](https://github.com/aws-powertools/powertools-lambda-python/issues/5873)) +* **ci:** make `pyproject.toml` fully compatible with Poetryv2 ([#5902](https://github.com/aws-powertools/powertools-lambda-python/issues/5902)) * **ci:** fix permissions for gh pages ([#5866](https://github.com/aws-powertools/powertools-lambda-python/issues/5866)) -* **ci:** drop support for Python 3.8 ([#5896](https://github.com/aws-powertools/powertools-lambda-python/issues/5896)) * **deps:** bump squidfunk/mkdocs-material from `ba73db5` to `41942f7` in /docs ([#5890](https://github.com/aws-powertools/powertools-lambda-python/issues/5890)) -* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.175.1a0 to 2.176.0a0 ([#5882](https://github.com/aws-powertools/powertools-lambda-python/issues/5882)) -* **deps-dev:** bump cfn-lint from 1.22.5 to 1.22.6 ([#5900](https://github.com/aws-powertools/powertools-lambda-python/issues/5900)) -* **deps-dev:** bump boto3-stubs from 1.36.2 to 1.36.3 ([#5894](https://github.com/aws-powertools/powertools-lambda-python/issues/5894)) * **deps-dev:** bump pytest-cov from 5.0.0 to 6.0.0 ([#5908](https://github.com/aws-powertools/powertools-lambda-python/issues/5908)) -* **deps-dev:** bump mkdocs-material from 9.5.49 to 9.5.50 ([#5889](https://github.com/aws-powertools/powertools-lambda-python/issues/5889)) * **deps-dev:** bump ruff from 0.9.2 to 0.9.3 ([#5911](https://github.com/aws-powertools/powertools-lambda-python/issues/5911)) +* **deps-dev:** bump boto3-stubs from 1.36.2 to 1.36.3 ([#5894](https://github.com/aws-powertools/powertools-lambda-python/issues/5894)) +* **deps-dev:** bump cfn-lint from 1.22.5 to 1.22.6 ([#5900](https://github.com/aws-powertools/powertools-lambda-python/issues/5900)) +* **deps-dev:** bump mkdocs-material from 9.5.49 to 9.5.50 ([#5889](https://github.com/aws-powertools/powertools-lambda-python/issues/5889)) +* **deps-dev:** bump pytest-benchmark from 4.0.0 to 5.1.0 ([#5909](https://github.com/aws-powertools/powertools-lambda-python/issues/5909)) * **deps-dev:** bump boto3-stubs from 1.36.1 to 1.36.2 ([#5881](https://github.com/aws-powertools/powertools-lambda-python/issues/5881)) * **deps-dev:** bump aws-cdk from 2.175.1 to 2.176.0 ([#5878](https://github.com/aws-powertools/powertools-lambda-python/issues/5878)) * **deps-dev:** bump ruff from 0.9.1 to 0.9.2 ([#5877](https://github.com/aws-powertools/powertools-lambda-python/issues/5877)) @@ -43,9 +44,9 @@ * **deps-dev:** bump sentry-sdk from 2.19.2 to 2.20.0 ([#5870](https://github.com/aws-powertools/powertools-lambda-python/issues/5870)) * **deps-dev:** bump boto3-stubs from 1.35.97 to 1.35.99 ([#5874](https://github.com/aws-powertools/powertools-lambda-python/issues/5874)) * **deps-dev:** bump cfn-lint from 1.22.4 to 1.22.5 ([#5872](https://github.com/aws-powertools/powertools-lambda-python/issues/5872)) -* **deps-dev:** bump pytest-benchmark from 4.0.0 to 5.1.0 ([#5909](https://github.com/aws-powertools/powertools-lambda-python/issues/5909)) * **deps-dev:** bump testcontainers from 3.7.1 to 4.9.1 ([#5907](https://github.com/aws-powertools/powertools-lambda-python/issues/5907)) * **deps-dev:** bump cfn-lint from 1.22.6 to 1.22.7 ([#5910](https://github.com/aws-powertools/powertools-lambda-python/issues/5910)) +* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.175.1a0 to 2.176.0a0 ([#5882](https://github.com/aws-powertools/powertools-lambda-python/issues/5882)) From 4485ebd6937d0c11a6b3f1e3961f3cbb6ddfa80f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 10:13:23 +0000 Subject: [PATCH 38/52] chore(deps-dev): bump boto3-stubs from 1.36.4 to 1.36.6 (#5923) Bumps [boto3-stubs](https://github.com/youtype/mypy_boto3_builder) from 1.36.4 to 1.36.6. - [Release notes](https://github.com/youtype/mypy_boto3_builder/releases) - [Commits](https://github.com/youtype/mypy_boto3_builder/commits) --- updated-dependencies: - dependency-name: boto3-stubs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index cc862f97e89..3dbc8258b85 100644 --- a/poetry.lock +++ b/poetry.lock @@ -428,13 +428,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.5" -description = "Type annotations for boto3 1.36.5 generated with mypy-boto3-builder 8.8.0" +version = "1.36.6" +description = "Type annotations for boto3 1.36.6 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.36.5-py3-none-any.whl", hash = "sha256:0a1ac9e8a1d6e5f401f463c0dc4241d676b21f27ca17ce73771831edb7411ffa"}, - {file = "boto3_stubs-1.36.5.tar.gz", hash = "sha256:a262acbf3057ae8e1765efa4114eb1ca9cf6920c98411938322cad6155a8a150"}, + {file = "boto3_stubs-1.36.6-py3-none-any.whl", hash = "sha256:fa601aa025e328848b6159d1e8c8cb374e4a8421f2514d962d5f468d26e92b37"}, + {file = "boto3_stubs-1.36.6.tar.gz", hash = "sha256:f5ec1a5a6ecb92912903631163482f6ce84f092d5bc36ec08f770700befccc7b"}, ] [package.dependencies] @@ -501,7 +501,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.5)"] +boto3 = ["boto3 (==1.36.6)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] From 43e34d66932252686b2443f20bdb35e620cde9c6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 10:14:24 +0000 Subject: [PATCH 39/52] chore(ci): changelog rebuild (#5924) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> Co-authored-by: Leandro Damascena --- CHANGELOG.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 185e194d75a..2271dfcdd01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,14 +29,17 @@ * **ci:** new pre-release 3.4.2a0 ([#5873](https://github.com/aws-powertools/powertools-lambda-python/issues/5873)) * **ci:** make `pyproject.toml` fully compatible with Poetryv2 ([#5902](https://github.com/aws-powertools/powertools-lambda-python/issues/5902)) * **ci:** fix permissions for gh pages ([#5866](https://github.com/aws-powertools/powertools-lambda-python/issues/5866)) +* **deps:** bump pydantic from 2.10.5 to 2.10.6 ([#5918](https://github.com/aws-powertools/powertools-lambda-python/issues/5918)) * **deps:** bump squidfunk/mkdocs-material from `ba73db5` to `41942f7` in /docs ([#5890](https://github.com/aws-powertools/powertools-lambda-python/issues/5890)) -* **deps-dev:** bump pytest-cov from 5.0.0 to 6.0.0 ([#5908](https://github.com/aws-powertools/powertools-lambda-python/issues/5908)) -* **deps-dev:** bump ruff from 0.9.2 to 0.9.3 ([#5911](https://github.com/aws-powertools/powertools-lambda-python/issues/5911)) -* **deps-dev:** bump boto3-stubs from 1.36.2 to 1.36.3 ([#5894](https://github.com/aws-powertools/powertools-lambda-python/issues/5894)) +* **deps-dev:** bump boto3-stubs from 1.36.1 to 1.36.2 ([#5881](https://github.com/aws-powertools/powertools-lambda-python/issues/5881)) +* **deps-dev:** bump testcontainers from 3.7.1 to 4.9.1 ([#5907](https://github.com/aws-powertools/powertools-lambda-python/issues/5907)) * **deps-dev:** bump cfn-lint from 1.22.5 to 1.22.6 ([#5900](https://github.com/aws-powertools/powertools-lambda-python/issues/5900)) +* **deps-dev:** bump cfn-lint from 1.22.6 to 1.22.7 ([#5910](https://github.com/aws-powertools/powertools-lambda-python/issues/5910)) +* **deps-dev:** bump boto3-stubs from 1.36.2 to 1.36.3 ([#5894](https://github.com/aws-powertools/powertools-lambda-python/issues/5894)) +* **deps-dev:** bump pytest-cov from 5.0.0 to 6.0.0 ([#5908](https://github.com/aws-powertools/powertools-lambda-python/issues/5908)) * **deps-dev:** bump mkdocs-material from 9.5.49 to 9.5.50 ([#5889](https://github.com/aws-powertools/powertools-lambda-python/issues/5889)) -* **deps-dev:** bump pytest-benchmark from 4.0.0 to 5.1.0 ([#5909](https://github.com/aws-powertools/powertools-lambda-python/issues/5909)) -* **deps-dev:** bump boto3-stubs from 1.36.1 to 1.36.2 ([#5881](https://github.com/aws-powertools/powertools-lambda-python/issues/5881)) +* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.175.1a0 to 2.176.0a0 ([#5882](https://github.com/aws-powertools/powertools-lambda-python/issues/5882)) +* **deps-dev:** bump ruff from 0.9.2 to 0.9.3 ([#5911](https://github.com/aws-powertools/powertools-lambda-python/issues/5911)) * **deps-dev:** bump aws-cdk from 2.175.1 to 2.176.0 ([#5878](https://github.com/aws-powertools/powertools-lambda-python/issues/5878)) * **deps-dev:** bump ruff from 0.9.1 to 0.9.2 ([#5877](https://github.com/aws-powertools/powertools-lambda-python/issues/5877)) * **deps-dev:** bump aws-cdk-lib from 2.175.1 to 2.176.0 ([#5876](https://github.com/aws-powertools/powertools-lambda-python/issues/5876)) @@ -44,9 +47,9 @@ * **deps-dev:** bump sentry-sdk from 2.19.2 to 2.20.0 ([#5870](https://github.com/aws-powertools/powertools-lambda-python/issues/5870)) * **deps-dev:** bump boto3-stubs from 1.35.97 to 1.35.99 ([#5874](https://github.com/aws-powertools/powertools-lambda-python/issues/5874)) * **deps-dev:** bump cfn-lint from 1.22.4 to 1.22.5 ([#5872](https://github.com/aws-powertools/powertools-lambda-python/issues/5872)) -* **deps-dev:** bump testcontainers from 3.7.1 to 4.9.1 ([#5907](https://github.com/aws-powertools/powertools-lambda-python/issues/5907)) -* **deps-dev:** bump cfn-lint from 1.22.6 to 1.22.7 ([#5910](https://github.com/aws-powertools/powertools-lambda-python/issues/5910)) -* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.175.1a0 to 2.176.0a0 ([#5882](https://github.com/aws-powertools/powertools-lambda-python/issues/5882)) +* **deps-dev:** bump pytest-asyncio from 0.24.0 to 0.25.2 ([#5920](https://github.com/aws-powertools/powertools-lambda-python/issues/5920)) +* **deps-dev:** bump boto3-stubs from 1.36.4 to 1.36.5 ([#5919](https://github.com/aws-powertools/powertools-lambda-python/issues/5919)) +* **deps-dev:** bump pytest-benchmark from 4.0.0 to 5.1.0 ([#5909](https://github.com/aws-powertools/powertools-lambda-python/issues/5909)) From b84a9b2ca62bb8e57aa9b76356b36e70c8259536 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 27 Jan 2025 11:33:56 +0000 Subject: [PATCH 40/52] feat(event_source): add AWS Transfer Family classes (#5912) * Adding TransferFamilyAuthorizer and TransferFamilyAuthorizerResponse class * Modify tests * Modify tests * Modify tests * Merging from develop --- .../utilities/data_classes/__init__.py | 3 + .../data_classes/transfer_family_event.py | 190 ++++++++++++++++++ .../utilities/parser/models/__init__.py | 4 +- .../parser/models/transfer_family.py | 2 +- docs/utilities/data_classes.md | 2 + docs/utilities/parser.md | 2 +- tests/events/TransferFamily.json | 7 - tests/events/transferFamilyAuthorizer.json | 7 + .../test_transfer_family_event.py | 142 +++++++++++++ ...sfer_family.py => test_transfer_family.py} | 14 +- 10 files changed, 355 insertions(+), 18 deletions(-) create mode 100644 aws_lambda_powertools/utilities/data_classes/transfer_family_event.py delete mode 100644 tests/events/TransferFamily.json create mode 100644 tests/events/transferFamilyAuthorizer.json create mode 100644 tests/unit/data_classes/required_dependencies/test_transfer_family_event.py rename tests/unit/parser/_pydantic/{test_aws_transfer_family.py => test_transfer_family.py} (66%) diff --git a/aws_lambda_powertools/utilities/data_classes/__init__.py b/aws_lambda_powertools/utilities/data_classes/__init__.py index 9952fadb9ae..8d20de7d192 100644 --- a/aws_lambda_powertools/utilities/data_classes/__init__.py +++ b/aws_lambda_powertools/utilities/data_classes/__init__.py @@ -45,6 +45,7 @@ from .ses_event import SESEvent from .sns_event import SNSEvent from .sqs_event import SQSEvent +from .transfer_family_event import TransferFamilyAuthorizer, TransferFamilyAuthorizerResponse from .vpc_lattice import VPCLatticeEvent, VPCLatticeEventV2 __all__ = [ @@ -87,4 +88,6 @@ "VPCLatticeEvent", "VPCLatticeEventV2", "CloudFormationCustomResourceEvent", + "TransferFamilyAuthorizerResponse", + "TransferFamilyAuthorizer", ] diff --git a/aws_lambda_powertools/utilities/data_classes/transfer_family_event.py b/aws_lambda_powertools/utilities/data_classes/transfer_family_event.py new file mode 100644 index 00000000000..eecc425e527 --- /dev/null +++ b/aws_lambda_powertools/utilities/data_classes/transfer_family_event.py @@ -0,0 +1,190 @@ +from __future__ import annotations + +from typing import Any, Literal + +from aws_lambda_powertools.utilities.data_classes.common import ( + DictWrapper, +) + + +class TransferFamilyAuthorizer(DictWrapper): + @property + def username(self) -> str: + """The username used for authentication""" + return self["username"] + + @property + def password(self) -> str | None: + """ + The password used for authentication. + None in case customer authenticating with certificates + """ + return self["password"] + + @property + def protocol(self) -> str: + """The protocol can be SFTP, FTP or FTPS""" + return self["protocol"] + + @property + def server_id(self) -> str: + """The AWS Transfer Family ServerID""" + return self["serverId"] + + @property + def source_ip(self) -> str: + """The customer IP used for connection""" + return self["sourceIp"] + + +class TransferFamilyAuthorizerResponse: + + def _build_authentication_response( + self, + role_arn: str, + policy: str | None = None, + home_directory: str | None = None, + home_directory_details: dict | None = None, + home_directory_type: Literal["LOGICAL", "PATH"] = "PATH", + user_gid: int | None = None, + user_uid: int | None = None, + public_keys: str | None = None, + ) -> dict[str, Any]: + + response: dict[str, Any] = {} + + if home_directory_type == "PATH": + if not home_directory: + raise ValueError("home_directory must be set when home_directory_type is PATH") + + response["HomeDirectory"] = home_directory + elif home_directory_type == "LOGICAL": + if not home_directory_details: + raise ValueError("home_directory_details must be set when home_directory_type is LOGICAL") + + response["HomeDirectoryDetails"] = [home_directory_details] + + else: + raise ValueError(f"Invalid home_directory_type: {home_directory_type}") + + if user_uid is not None: + response["PosixProfile"] = {"Gid": user_gid, "Uid": user_gid} + + if policy: + response["Policy"] = policy + + if public_keys: + response["PublicKeys"] = public_keys + + response["Role"] = role_arn + response["HomeDirectoryType"] = home_directory_type + + return response + + def build_authentication_response_efs( + self, + role_arn: str, + user_gid: int, + user_uid: int, + policy: str | None = None, + home_directory: str | None = None, + home_directory_details: dict | None = None, + home_directory_type: Literal["LOGICAL", "PATH"] = "PATH", + public_keys: str | None = None, + ) -> dict[str, Any]: + """ + Build an authentication response for AWS Transfer Family using EFS (Elastic File System). + + Parameters: + ----------- + role_arn : str + The Amazon Resource Name (ARN) of the IAM role. + user_gid : int + The group ID of the user. + user_uid : int + The user ID. + policy : str | None, optional + The IAM policy document. Defaults to None. + home_directory : str | None, optional + The home directory path. Required if home_directory_type is "PATH". Defaults to None. + home_directory_details : dict | None, optional + Details of the home directory. Required if home_directory_type is "LOGICAL". Defaults to None. + home_directory_type : Literal["LOGICAL", "PATH"], optional + The type of home directory. Must be either "LOGICAL" or "PATH". Defaults to "PATH". + public_keys : str | None, optional + The public keys associated with the user. Defaults to None. + + Returns: + -------- + dict[str, Any] + A dictionary containing the authentication response with various details such as + role ARN, policy, home directory information, and user details. + + Raises: + ------- + ValueError + If an invalid home_directory_type is provided or if required parameters are missing + for the specified home_directory_type. + """ + + return self._build_authentication_response( + role_arn=role_arn, + policy=policy, + home_directory=home_directory, + home_directory_details=home_directory_details, + home_directory_type=home_directory_type, + public_keys=public_keys, + user_gid=user_gid, + user_uid=user_uid, + ) + + def build_authentication_response_s3( + self, + role_arn: str, + policy: str | None = None, + home_directory: str | None = None, + home_directory_details: dict | None = None, + home_directory_type: Literal["LOGICAL", "PATH"] = "PATH", + public_keys: str | None = None, + ) -> dict[str, Any]: + """ + Build an authentication response for Amazon S3. + + This method constructs an authentication response tailored for S3 access, + likely by calling an internal method with the provided parameters. + + Parameters: + ----------- + role_arn : str + The Amazon Resource Name (ARN) of the IAM role for S3 access. + policy : str | None, optional + The IAM policy document for S3 access. Defaults to None. + home_directory : str | None, optional + The home directory path in S3. Required if home_directory_type is "PATH". Defaults to None. + home_directory_details : dict | None, optional + Details of the home directory in S3. Required if home_directory_type is "LOGICAL". Defaults to None. + home_directory_type : Literal["LOGICAL", "PATH"], optional + The type of home directory in S3. Must be either "LOGICAL" or "PATH". Defaults to "PATH". + public_keys : str | None, optional + The public keys associated with the user for S3 access. Defaults to None. + + Returns: + -------- + dict[str, Any] + A dictionary containing the authentication response with various details such as + role ARN, policy, home directory information, and potentially other S3-specific attributes. + + Raises: + ------- + ValueError + If an invalid home_directory_type is provided or if required parameters are missing + for the specified home_directory_type. + """ + return self._build_authentication_response( + role_arn=role_arn, + policy=policy, + home_directory=home_directory, + home_directory_details=home_directory_details, + home_directory_type=home_directory_type, + public_keys=public_keys, + ) diff --git a/aws_lambda_powertools/utilities/parser/models/__init__.py b/aws_lambda_powertools/utilities/parser/models/__init__.py index 559930af945..8d6be2f40e0 100644 --- a/aws_lambda_powertools/utilities/parser/models/__init__.py +++ b/aws_lambda_powertools/utilities/parser/models/__init__.py @@ -109,7 +109,7 @@ ) from .sns import SnsModel, SnsNotificationModel, SnsRecordModel from .sqs import SqsAttributesModel, SqsModel, SqsMsgAttributeModel, SqsRecordModel -from .transfer_family import TransferFamily +from .transfer_family import TransferFamilyAuthorizer from .vpc_lattice import VpcLatticeModel from .vpc_latticev2 import VpcLatticeV2Model @@ -180,7 +180,7 @@ "SqsAttributesModel", "S3SqsEventNotificationModel", "S3SqsEventNotificationRecordModel", - "TransferFamily", + "TransferFamilyAuthorizer", "APIGatewayProxyEventModel", "APIGatewayEventRequestContext", "APIGatewayEventAuthorizer", diff --git a/aws_lambda_powertools/utilities/parser/models/transfer_family.py b/aws_lambda_powertools/utilities/parser/models/transfer_family.py index 9ae46b0c39c..62cb49479bd 100644 --- a/aws_lambda_powertools/utilities/parser/models/transfer_family.py +++ b/aws_lambda_powertools/utilities/parser/models/transfer_family.py @@ -4,7 +4,7 @@ from pydantic.networks import IPvAnyAddress -class TransferFamily(BaseModel): +class TransferFamilyAuthorizer(BaseModel): username: str password: Optional[str] = None protocol: Literal["SFTP", "FTP", "FTPS"] diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index 2574d119acd..5d102e69784 100644 --- a/docs/utilities/data_classes.md +++ b/docs/utilities/data_classes.md @@ -98,6 +98,8 @@ Each event source is linked to its corresponding GitHub file with the full set o | [SES](#ses) | `SESEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/ses_event.py) | | [SNS](#sns) | `SNSEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/sns_event.py) | | [SQS](#sqs) | `SQSEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/sqs_event.py) | +| [TransferFamilyAuthorizer] | `TransferFamilyAuthorizer` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/transfer_family_event.py) | +| [TransferFamilyAuthorizerResponse] | `TransferFamilyAuthorizerResponse` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/transfer_family_event.py) | | [VPC Lattice V2](#vpc-lattice-v2) | `VPCLatticeV2Event` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py) | | [VPC Lattice V1](#vpc-lattice-v1) | `VPCLatticeEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py) | diff --git a/docs/utilities/parser.md b/docs/utilities/parser.md index 8ab87a303d7..a9433e123f9 100644 --- a/docs/utilities/parser.md +++ b/docs/utilities/parser.md @@ -132,7 +132,7 @@ The example above uses `SqsModel`. Other built-in models can be found below. | **SesModel** | Lambda Event Source payload for Amazon Simple Email Service | | **SnsModel** | Lambda Event Source payload for Amazon Simple Notification Service | | **SqsModel** | Lambda Event Source payload for Amazon SQS | -| **TransferFamily** | Lambda Event Source payload for AWS Transfer Family custom identity provider | +| **TransferFamilyAuthorizer** | Lambda Event Source payload for AWS Transfer Family Lambda authorizer | | **VpcLatticeModel** | Lambda Event Source payload for Amazon VPC Lattice | | **VpcLatticeV2Model** | Lambda Event Source payload for Amazon VPC Lattice v2 payload | diff --git a/tests/events/TransferFamily.json b/tests/events/TransferFamily.json deleted file mode 100644 index c329071e8a5..00000000000 --- a/tests/events/TransferFamily.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "username": "value", - "password": "value", - "protocol": "SFTP", - "serverId": "s-abcd123456", - "sourceIp": "192.168.0.100" -} diff --git a/tests/events/transferFamilyAuthorizer.json b/tests/events/transferFamilyAuthorizer.json new file mode 100644 index 00000000000..867c1f65209 --- /dev/null +++ b/tests/events/transferFamilyAuthorizer.json @@ -0,0 +1,7 @@ +{ + "username": "value", + "password": "value", + "protocol": "SFTP", + "serverId": "s-abcd123456", + "sourceIp": "192.168.0.100" +} diff --git a/tests/unit/data_classes/required_dependencies/test_transfer_family_event.py b/tests/unit/data_classes/required_dependencies/test_transfer_family_event.py new file mode 100644 index 00000000000..9a74c0398f9 --- /dev/null +++ b/tests/unit/data_classes/required_dependencies/test_transfer_family_event.py @@ -0,0 +1,142 @@ +import pytest + +from aws_lambda_powertools.utilities.data_classes.transfer_family_event import ( + TransferFamilyAuthorizer, + TransferFamilyAuthorizerResponse, +) +from tests.functional.utils import load_event + + +def test_transfer_family_authorizer_event(): + raw_event = load_event("transferFamilyAuthorizer.json") + parsed_event = TransferFamilyAuthorizer(raw_event) + + assert parsed_event.username == raw_event["username"] + assert parsed_event.password == raw_event["password"] + assert parsed_event.protocol == raw_event["protocol"] + assert parsed_event.server_id == raw_event["serverId"] + assert parsed_event.source_ip == raw_event["sourceIp"] + + +@pytest.mark.parametrize("home_directory_type", ["LOGICAL", "PATH"]) +def test_build_authentication_response_s3(home_directory_type): + + # GIVEN a Authorizer response + response = TransferFamilyAuthorizerResponse() + + role_arn = "arn:aws:iam::123456789012:role/S3Access" + policy = '{"Version": "2012-10-17", "Statement": [{"Effect": "Allow", "Action": "s3:*", "Resource": "*"}]}' + home_directory = "/bucket/user" if home_directory_type == "PATH" else None + home_directory_details = ( + {"Entry": "/", "Target": "/bucket/${transfer:UserName}"} if home_directory_type == "LOGICAL" else None + ) + public_keys = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0g+Z" + + # WHEN building an authentication response for S3 with different home directory types + response = response.build_authentication_response_s3( + role_arn=role_arn, + policy=policy, + home_directory=home_directory, + home_directory_details=home_directory_details, + home_directory_type=home_directory_type, + public_keys=public_keys, + ) + + # THEN the authentication response is correctly built + assert isinstance(response, dict) + assert response.get("Role") == role_arn + assert response.get("Policy") == policy + assert response.get("PublicKeys") == public_keys + + if home_directory_type == "PATH": + assert response.get("HomeDirectory") == home_directory + assert "HomeDirectoryDetails" not in response + else: + assert response.get("HomeDirectoryDetails") == [home_directory_details] + assert "HomeDirectory" not in response + + +@pytest.mark.parametrize("home_directory_type", ["LOGICAL", "PATH"]) +def test_build_authentication_response_efs(home_directory_type): + + # GIVEN a Authorizer response + response = TransferFamilyAuthorizerResponse() + + role_arn = "arn:aws:iam::123456789012:role/S3Access" + home_directory = "/bucket/user" if home_directory_type == "PATH" else None + home_directory_details = ( + {"Entry": "/", "Target": "/bucket/${transfer:UserName}"} if home_directory_type == "LOGICAL" else None + ) + + # WHEN building an authentication response for EFS with different home directory types + response = response.build_authentication_response_efs( + role_arn=role_arn, + home_directory=home_directory, + home_directory_details=home_directory_details, + home_directory_type=home_directory_type, + user_gid=0, + user_uid=0, + ) + + # THEN the authentication response is correctly built + assert isinstance(response, dict) + assert response.get("Role") == role_arn + + if home_directory_type == "PATH": + assert response.get("HomeDirectory") == home_directory + assert "HomeDirectoryDetails" not in response + else: + assert response.get("HomeDirectoryDetails") == [home_directory_details] + assert "HomeDirectory" not in response + + +def test_build_authentication_missing_home_directory(): + + # GIVEN a Authorizer response + response = TransferFamilyAuthorizerResponse() + + # WHEN home_directory_details is empty and type is LOGICAL + role_arn = "arn:aws:iam::123456789012:role/S3Access" + home_directory_details = {} + home_directory_type = "LOGICAL" + + # THEN must raise an exception + with pytest.raises(ValueError): + response = response.build_authentication_response_efs( + role_arn=role_arn, + home_directory_details=home_directory_details, + home_directory_type=home_directory_type, + user_gid=0, + user_uid=0, + ) + + +def test_build_authentication_response_invalid_type(): + # GIVEN a Authorizer response + response = TransferFamilyAuthorizerResponse() + + # WHEN set an invalid home_directory_type + invalid_type = "INVALID" + + # THEN must raise an exception + with pytest.raises(ValueError): + response.build_authentication_response_s3( + role_arn="arn:aws:iam::123456789012:role/S3Access", + home_directory_type=invalid_type, + ) + + +def test_build_authentication_response_missing_required_params(): + # GIVEN a Authorizer response + response = TransferFamilyAuthorizerResponse() + + # WHEN set a PATH without home_directory + home_directory_type = "PATH" + + # THEN must raise an exception + with pytest.raises(ValueError): + response.build_authentication_response_s3( + role_arn="arn:aws:iam::123456789012:role/S3Access", + home_directory_type=home_directory_type, + # Missing required home_directory for PATH type + ) diff --git a/tests/unit/parser/_pydantic/test_aws_transfer_family.py b/tests/unit/parser/_pydantic/test_transfer_family.py similarity index 66% rename from tests/unit/parser/_pydantic/test_aws_transfer_family.py rename to tests/unit/parser/_pydantic/test_transfer_family.py index 7316dacdd8e..b5e0252ffea 100644 --- a/tests/unit/parser/_pydantic/test_aws_transfer_family.py +++ b/tests/unit/parser/_pydantic/test_transfer_family.py @@ -1,10 +1,10 @@ -from aws_lambda_powertools.utilities.parser.models import TransferFamily +from aws_lambda_powertools.utilities.parser.models import TransferFamilyAuthorizer from tests.functional.utils import load_event -def test_aws_transfer_family_model(): - raw_event = load_event("TransferFamily.json") - parsed_event = TransferFamily(**raw_event) +def test_transfer_family_authorizer_model(): + raw_event = load_event("transferFamilyAuthorizer.json") + parsed_event = TransferFamilyAuthorizer(**raw_event) assert parsed_event.username == raw_event["username"] assert parsed_event.password == raw_event["password"] @@ -13,10 +13,10 @@ def test_aws_transfer_family_model(): assert str(parsed_event.source_ip) == raw_event["sourceIp"] -def test_aws_transfer_family_model_without_password(): - raw_event = load_event("TransferFamily.json") +def test_transfer_family_authorizer_model_without_password(): + raw_event = load_event("transferFamilyAuthorizer.json") del raw_event["password"] - parsed_event = TransferFamily(**raw_event) + parsed_event = TransferFamilyAuthorizer(**raw_event) assert parsed_event.username == raw_event["username"] assert parsed_event.password is None From 6baeec4f2a418404e6188082e2ccda6e9edf1f30 Mon Sep 17 00:00:00 2001 From: Alpha Date: Mon, 27 Jan 2025 16:35:19 +0000 Subject: [PATCH 41/52] docs(parser): improve documentation with Pydantic best practices (#5925) * docs: improve the doc for the customer from v2 library. * docs: improve the doc from PR Co-authored-by: Leandro Damascena Signed-off-by: Alpha --------- Signed-off-by: Alpha Co-authored-by: Leandro Damascena --- docs/utilities/parser.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/utilities/parser.md b/docs/utilities/parser.md index a9433e123f9..1df9c2342f1 100644 --- a/docs/utilities/parser.md +++ b/docs/utilities/parser.md @@ -259,6 +259,8 @@ If you run using a test event `{"message": "hello universe"}` you should expect `model_validator` can help when you have a complex validation mechanism. For example finding whether data has been omitted or comparing field values. +!!! tip "If you are still using the deprecated `root_validator` function, switch to `model_validator` for the latest Pydantic functionality." + ```python title="model_validator.py" hl_lines="1 12-17" --8<-- "examples/parser/src/model_validator.py" ``` From 5548985922088cd54529903f3e66d63abadc3a2c Mon Sep 17 00:00:00 2001 From: Katsuyuki Takahashi Date: Tue, 28 Jan 2025 05:54:52 +0900 Subject: [PATCH 42/52] fix(event_handler): fixes typo in variable name `fronzen_openapi_extensions` (#5929) fix(event_handler): frozen openapi extensions option #5297 --- aws_lambda_powertools/event_handler/api_gateway.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/event_handler/api_gateway.py b/aws_lambda_powertools/event_handler/api_gateway.py index f4ef22019e5..1485c563a06 100644 --- a/aws_lambda_powertools/event_handler/api_gateway.py +++ b/aws_lambda_powertools/event_handler/api_gateway.py @@ -2521,7 +2521,7 @@ def register_route(func: AnyCallableT) -> AnyCallableT: frozen_responses = _FrozenDict(responses) if responses else None frozen_tags = frozenset(tags) if tags else None frozen_security = _FrozenListDict(security) if security else None - fronzen_openapi_extensions = _FrozenDict(openapi_extensions) if openapi_extensions else None + frozen_openapi_extensions = _FrozenDict(openapi_extensions) if openapi_extensions else None route_key = ( rule, @@ -2537,7 +2537,7 @@ def register_route(func: AnyCallableT) -> AnyCallableT: operation_id, include_in_schema, frozen_security, - fronzen_openapi_extensions, + frozen_openapi_extensions, deprecated, ) From f68bb7454f2f786c9b6f7ef29473ae81089e879e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 18:12:26 -0300 Subject: [PATCH 43/52] chore(deps-dev): bump aws-cdk from 2.176.0 to 2.177.0 (#5930) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [aws-cdk](https://github.com/aws/aws-cdk/tree/HEAD/packages/aws-cdk) from 2.176.0 to 2.177.0. - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.md) - [Commits](https://github.com/aws/aws-cdk/commits/v2.177.0/packages/aws-cdk) --- updated-dependencies: - dependency-name: aws-cdk dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ana Falcão --- package-lock.json | 9 +++++---- package.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 00ca5e80dfe..533997328f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,14 +11,15 @@ "package-lock.json": "^1.0.0" }, "devDependencies": { - "aws-cdk": "^2.176.0" + "aws-cdk": "^2.177.0" } }, "node_modules/aws-cdk": { - "version": "2.176.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.176.0.tgz", - "integrity": "sha512-yRjIXzK2ddznwuSjasWAViYBtBSQbEu6GHlylaC3GHsIUPhrK3KguqIuhdlxjMeiQ1Fvok8REDLCReZJdrSLLg==", + "version": "2.177.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.177.0.tgz", + "integrity": "sha512-TiBoyE5wMB5q4jX1bELwkklgbs5eLY1Phjfnb4Mof0K9tOSRJ9UEq6xEamF0esMS+TuYU7a/ESTpmKX3iYqA3w==", "dev": true, + "license": "Apache-2.0", "bin": { "cdk": "bin/cdk" }, diff --git a/package.json b/package.json index a45d2e72095..fb58778db5a 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "aws-lambda-powertools-python-e2e", "version": "1.0.0", "devDependencies": { - "aws-cdk": "^2.176.0" + "aws-cdk": "^2.177.0" }, "dependencies": { "package-lock.json": "^1.0.0" From 93a0128efb821fd83bbf6c809a5518ba9f2310b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 19:01:25 -0300 Subject: [PATCH 44/52] chore(deps-dev): bump aws-cdk-lib from 2.176.0 to 2.177.0 (#5931) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [aws-cdk-lib](https://github.com/aws/aws-cdk) from 2.176.0 to 2.177.0. - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.md) - [Commits](https://github.com/aws/aws-cdk/compare/v2.176.0...v2.177.0) --- updated-dependencies: - dependency-name: aws-cdk-lib dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ana Falcão --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3dbc8258b85..c4e7710725d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -235,22 +235,22 @@ typeguard = ">=2.13.3,<4.3.0" [[package]] name = "aws-cdk-lib" -version = "2.176.0" +version = "2.177.0" description = "Version 2 of the AWS Cloud Development Kit library" optional = false python-versions = "~=3.8" files = [ - {file = "aws_cdk_lib-2.176.0-py3-none-any.whl", hash = "sha256:c362a92f06b6ea60a7eff7994d3994c462358e7a95ce3de01a28efab4f6d56b6"}, - {file = "aws_cdk_lib-2.176.0.tar.gz", hash = "sha256:87a39d2f42fd2ea8ba2bfa364355303953fb5cc2886479ca5acf09a14a9fd679"}, + {file = "aws_cdk_lib-2.177.0-py3-none-any.whl", hash = "sha256:acdf06aaf52367a64b4bf88381e8272cb7b5961c242020ace822c79749e53cac"}, + {file = "aws_cdk_lib-2.177.0.tar.gz", hash = "sha256:5e51c48da31555beb38243bb2882e98ee9fe1796466ba9f8d3088701b47965e5"}, ] [package.dependencies] "aws-cdk.asset-awscli-v1" = ">=2.2.208,<3.0.0" "aws-cdk.asset-kubectl-v20" = ">=2.1.3,<3.0.0" "aws-cdk.asset-node-proxy-agent-v6" = ">=2.1.0,<3.0.0" -"aws-cdk.cloud-assembly-schema" = ">=39.0.1,<40.0.0" +"aws-cdk.cloud-assembly-schema" = ">=39.2.0,<40.0.0" constructs = ">=10.0.0,<11.0.0" -jsii = ">=1.104.0,<2.0.0" +jsii = ">=1.106.0,<2.0.0" publication = ">=0.0.3" typeguard = ">=2.13.3,<4.3.0" From 98dbaa351296ccf17f762b3428600c55afa8f6f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 19:14:55 -0300 Subject: [PATCH 45/52] chore(deps-dev): bump boto3-stubs from 1.36.6 to 1.36.7 (#5932) Bumps [boto3-stubs](https://github.com/youtype/mypy_boto3_builder) from 1.36.6 to 1.36.7. - [Release notes](https://github.com/youtype/mypy_boto3_builder/releases) - [Commits](https://github.com/youtype/mypy_boto3_builder/commits) --- updated-dependencies: - dependency-name: boto3-stubs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index c4e7710725d..80e5467d156 100644 --- a/poetry.lock +++ b/poetry.lock @@ -428,13 +428,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.36.6" -description = "Type annotations for boto3 1.36.6 generated with mypy-boto3-builder 8.8.0" +version = "1.36.7" +description = "Type annotations for boto3 1.36.7 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.36.6-py3-none-any.whl", hash = "sha256:fa601aa025e328848b6159d1e8c8cb374e4a8421f2514d962d5f468d26e92b37"}, - {file = "boto3_stubs-1.36.6.tar.gz", hash = "sha256:f5ec1a5a6ecb92912903631163482f6ce84f092d5bc36ec08f770700befccc7b"}, + {file = "boto3_stubs-1.36.7-py3-none-any.whl", hash = "sha256:d5d3f1f537c4d317f1f11b1cb4ce8f427822204936e29419b43c709ec54758ea"}, + {file = "boto3_stubs-1.36.7.tar.gz", hash = "sha256:197bdbacd3a9085c6310a06f21616f30f6103ed8be67705962620ac4587ba1fb"}, ] [package.dependencies] @@ -501,7 +501,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime ( bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.36.0,<1.37.0)"] billing = ["mypy-boto3-billing (>=1.36.0,<1.37.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.36.0,<1.37.0)"] -boto3 = ["boto3 (==1.36.6)"] +boto3 = ["boto3 (==1.36.7)"] braket = ["mypy-boto3-braket (>=1.36.0,<1.37.0)"] budgets = ["mypy-boto3-budgets (>=1.36.0,<1.37.0)"] ce = ["mypy-boto3-ce (>=1.36.0,<1.37.0)"] From 50b0098f0862cf5b86dd85de399e986fa0f1be6e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 20:58:40 -0300 Subject: [PATCH 46/52] chore(deps-dev): bump aws-cdk-aws-lambda-python-alpha from 2.176.0a0 to 2.177.0a0 (#5933) chore(deps-dev): bump aws-cdk-aws-lambda-python-alpha Bumps [aws-cdk-aws-lambda-python-alpha](https://github.com/aws/aws-cdk) from 2.176.0a0 to 2.177.0a0. - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.md) - [Commits](https://github.com/aws/aws-cdk/commits) --- updated-dependencies: - dependency-name: aws-cdk-aws-lambda-python-alpha dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 80e5467d156..c497649b16a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -201,19 +201,19 @@ typeguard = ">=2.13.3,<2.14.0" [[package]] name = "aws-cdk-aws-lambda-python-alpha" -version = "2.176.0a0" +version = "2.177.0a0" description = "The CDK Construct Library for AWS Lambda in Python" optional = false python-versions = "~=3.8" files = [ - {file = "aws_cdk.aws_lambda_python_alpha-2.176.0a0-py3-none-any.whl", hash = "sha256:d7a9223393b815e9b2d2e69f06c216b8e12e577f8ab58aeb56cb05c92de7f7bb"}, - {file = "aws_cdk_aws_lambda_python_alpha-2.176.0a0.tar.gz", hash = "sha256:0a2737e098e88a553a284f688c7621067cebf32ba21ad3e8e7911bb70ce67049"}, + {file = "aws_cdk.aws_lambda_python_alpha-2.177.0a0-py3-none-any.whl", hash = "sha256:5aacc26970e30909b372fd2e8b98ce7197b8074d78ec4f1d900a8ddd02bc5114"}, + {file = "aws_cdk_aws_lambda_python_alpha-2.177.0a0.tar.gz", hash = "sha256:0137957603cd91b473de3a455bf4d95de4ba60c1ba9f25f62d3edeb965202c4e"}, ] [package.dependencies] -aws-cdk-lib = ">=2.176.0,<3.0.0" +aws-cdk-lib = ">=2.177.0,<3.0.0" constructs = ">=10.0.0,<11.0.0" -jsii = ">=1.104.0,<2.0.0" +jsii = ">=1.106.0,<2.0.0" publication = ">=0.0.3" typeguard = ">=2.13.3,<4.3.0" From baf3baf97c99a11c87a7154eeb719e03f8933acf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 10:09:25 +0000 Subject: [PATCH 47/52] chore(deps-dev): bump cdklabs-generative-ai-cdk-constructs from 0.1.289 to 0.1.290 (#5917) * chore(deps-dev): bump cdklabs-generative-ai-cdk-constructs Bumps [cdklabs-generative-ai-cdk-constructs](https://github.com/awslabs/generative-ai-cdk-constructs) from 0.1.289 to 0.1.290. - [Release notes](https://github.com/awslabs/generative-ai-cdk-constructs/releases) - [Changelog](https://github.com/awslabs/generative-ai-cdk-constructs/blob/main/CHANGELOG.md) - [Commits](https://github.com/awslabs/generative-ai-cdk-constructs/compare/v0.1.289...v0.1.290) --- updated-dependencies: - dependency-name: cdklabs-generative-ai-cdk-constructs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Fix mypy --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leandro Damascena --- .../cdk/bedrock_agent_stack.py | 28 +++++++------------ poetry.lock | 16 +++++------ 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/examples/event_handler_bedrock_agents/cdk/bedrock_agent_stack.py b/examples/event_handler_bedrock_agents/cdk/bedrock_agent_stack.py index 125951dd164..e6d427bc8c3 100644 --- a/examples/event_handler_bedrock_agents/cdk/bedrock_agent_stack.py +++ b/examples/event_handler_bedrock_agents/cdk/bedrock_agent_stack.py @@ -3,13 +3,7 @@ ) from aws_cdk.aws_lambda import Runtime from aws_cdk.aws_lambda_python_alpha import PythonFunction -from cdklabs.generative_ai_cdk_constructs.bedrock import ( - ActionGroupExecutor, - Agent, - AgentActionGroup, - ApiSchema, - BedrockFoundationModel, -) +from cdklabs.generative_ai_cdk_constructs import bedrock from constructs import Construct @@ -27,22 +21,20 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: handler="lambda_handler", ) - agent = Agent( + agent = bedrock.Agent( self, "Agent", - foundation_model=BedrockFoundationModel.ANTHROPIC_CLAUDE_INSTANT_V1_2, + foundation_model=bedrock.BedrockFoundationModel.ANTHROPIC_CLAUDE_INSTANT_V1_2, instruction="You are a helpful and friendly agent that answers questions about insurance claims.", ) - executor_group = ActionGroupExecutor(lambda_=action_group_function) - - action_group = AgentActionGroup( - self, - "ActionGroup", - action_group_name="InsureClaimsSupport", + action_group: bedrock.AgentActionGroup = bedrock.AgentActionGroup( + name="InsureClaimsSupport", description="Use these functions for insurance claims support", - action_group_executor=executor_group, - action_group_state="ENABLED", - api_schema=ApiSchema.from_asset("./lambda/openapi.json"), # (2)! + executor=bedrock.ActionGroupExecutor.fromlambda_function( + lambda_function=action_group_function, + ), + enabled=True, + api_schema=bedrock.ApiSchema.from_local_asset("./lambda/openapi.json"), # (2)! ) agent.add_action_group(action_group) diff --git a/poetry.lock b/poetry.lock index c497649b16a..b9c84e992d7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -943,13 +943,13 @@ ujson = ["ujson (>=5.7.0)"] [[package]] name = "cdk-nag" -version = "2.34.24" +version = "2.35.1" description = "Check CDK v2 applications for best practices using a combination on available rule packs." optional = false python-versions = "~=3.8" files = [ - {file = "cdk_nag-2.34.24-py3-none-any.whl", hash = "sha256:9cafae19bfa8386e3a27f4c00f5a628714eb7cf82eb0ca6e41d8647b756f433b"}, - {file = "cdk_nag-2.34.24.tar.gz", hash = "sha256:6c332ce7e0b2882af9740b6eab132943112e8e059a7dc5cf36d644fc97ed8f17"}, + {file = "cdk_nag-2.35.1-py3-none-any.whl", hash = "sha256:0bc6109bbc5f12ea72cf7e535ff0f8704cdb4e6344cd271eda82f3cde7a99bb4"}, + {file = "cdk_nag-2.35.1.tar.gz", hash = "sha256:1623c9173f4f10108d54ea5a5d98f129f79f78cab4b10f07d7c9651bbfd9652e"}, ] [package.dependencies] @@ -961,18 +961,18 @@ typeguard = ">=2.13.3,<4.3.0" [[package]] name = "cdklabs-generative-ai-cdk-constructs" -version = "0.1.289" +version = "0.1.290" description = "AWS Generative AI CDK Constructs is a library for well-architected generative AI patterns." optional = false python-versions = "~=3.8" files = [ - {file = "cdklabs.generative_ai_cdk_constructs-0.1.289-py3-none-any.whl", hash = "sha256:66d7be4f3c2700436720786cee4809a3774328305f5aa2939e2c01fd6ab83acb"}, - {file = "cdklabs_generative_ai_cdk_constructs-0.1.289.tar.gz", hash = "sha256:82addba364c18fbc5acc7e12a0372f37c4855b7b53517d2fe8bd4b3fc8e945d8"}, + {file = "cdklabs.generative_ai_cdk_constructs-0.1.290-py3-none-any.whl", hash = "sha256:3297a25ee2acbf6e70ee100a7e712023b076ea688820e53fa352b1c05a769cf0"}, + {file = "cdklabs_generative_ai_cdk_constructs-0.1.290.tar.gz", hash = "sha256:693f732e8552d28100b5da918a17cb19fd19b25b81040faf11688a24afbe42c0"}, ] [package.dependencies] -aws-cdk-lib = ">=2.174.0,<3.0.0" -cdk-nag = ">=2.34.23,<3.0.0" +aws-cdk-lib = ">=2.176.0,<3.0.0" +cdk-nag = ">=2.35.0,<3.0.0" constructs = ">=10.3.0,<11.0.0" jsii = ">=1.106.0,<2.0.0" publication = ">=0.0.3" From 3d85ebb8ec92ac4c30c463aac7bbbb5dc43638f2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 10:24:17 +0000 Subject: [PATCH 48/52] chore(ci): changelog rebuild (#5934) Co-authored-by: Powertools for AWS Lambda (Python) bot <151832416+aws-powertools-bot@users.noreply.github.com> Co-authored-by: Leandro Damascena --- CHANGELOG.md | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2271dfcdd01..3b64fd7bc13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ ## Bug Fixes +* **event_handler:** fixes typo in variable name `fronzen_openapi_extensions` ([#5929](https://github.com/aws-powertools/powertools-lambda-python/issues/5929)) * **event_handler:** add tests for PEP 563 compatibility with OpenAPI ([#5886](https://github.com/aws-powertools/powertools-lambda-python/issues/5886)) * **event_handler:** fix forward references resolution in OpenAPI ([#5885](https://github.com/aws-powertools/powertools-lambda-python/issues/5885)) * **parser:** make identitySource optional for ApiGatewayAuthorizerRequestV2 model ([#5880](https://github.com/aws-powertools/powertools-lambda-python/issues/5880)) @@ -15,31 +16,38 @@ * **data_classes:** improve Event Source Data Classes documentation ([#5916](https://github.com/aws-powertools/powertools-lambda-python/issues/5916)) * **event_handler:** demonstrate handling optional security routes ([#5895](https://github.com/aws-powertools/powertools-lambda-python/issues/5895)) * **layer:** update layer version number - v3.4.1 ([#5869](https://github.com/aws-powertools/powertools-lambda-python/issues/5869)) +* **parser:** improve documentation with Pydantic best practices ([#5925](https://github.com/aws-powertools/powertools-lambda-python/issues/5925)) ## Features +* **event_source:** add AWS Transfer Family classes ([#5912](https://github.com/aws-powertools/powertools-lambda-python/issues/5912)) * **idempotency:** add support for custom Idempotency key prefix ([#5898](https://github.com/aws-powertools/powertools-lambda-python/issues/5898)) * **logger:** add context manager for logger keys ([#5883](https://github.com/aws-powertools/powertools-lambda-python/issues/5883)) * **parser:** add AWS Transfer Family model ([#5906](https://github.com/aws-powertools/powertools-lambda-python/issues/5906)) ## Maintenance -* **ci:** drop support for Python 3.8 ([#5896](https://github.com/aws-powertools/powertools-lambda-python/issues/5896)) * **ci:** adjust token permission ([#5867](https://github.com/aws-powertools/powertools-lambda-python/issues/5867)) * **ci:** new pre-release 3.4.2a0 ([#5873](https://github.com/aws-powertools/powertools-lambda-python/issues/5873)) * **ci:** make `pyproject.toml` fully compatible with Poetryv2 ([#5902](https://github.com/aws-powertools/powertools-lambda-python/issues/5902)) * **ci:** fix permissions for gh pages ([#5866](https://github.com/aws-powertools/powertools-lambda-python/issues/5866)) -* **deps:** bump pydantic from 2.10.5 to 2.10.6 ([#5918](https://github.com/aws-powertools/powertools-lambda-python/issues/5918)) +* **ci:** drop support for Python 3.8 ([#5896](https://github.com/aws-powertools/powertools-lambda-python/issues/5896)) * **deps:** bump squidfunk/mkdocs-material from `ba73db5` to `41942f7` in /docs ([#5890](https://github.com/aws-powertools/powertools-lambda-python/issues/5890)) -* **deps-dev:** bump boto3-stubs from 1.36.1 to 1.36.2 ([#5881](https://github.com/aws-powertools/powertools-lambda-python/issues/5881)) -* **deps-dev:** bump testcontainers from 3.7.1 to 4.9.1 ([#5907](https://github.com/aws-powertools/powertools-lambda-python/issues/5907)) +* **deps:** bump pydantic from 2.10.5 to 2.10.6 ([#5918](https://github.com/aws-powertools/powertools-lambda-python/issues/5918)) * **deps-dev:** bump cfn-lint from 1.22.5 to 1.22.6 ([#5900](https://github.com/aws-powertools/powertools-lambda-python/issues/5900)) * **deps-dev:** bump cfn-lint from 1.22.6 to 1.22.7 ([#5910](https://github.com/aws-powertools/powertools-lambda-python/issues/5910)) -* **deps-dev:** bump boto3-stubs from 1.36.2 to 1.36.3 ([#5894](https://github.com/aws-powertools/powertools-lambda-python/issues/5894)) +* **deps-dev:** bump testcontainers from 3.7.1 to 4.9.1 ([#5907](https://github.com/aws-powertools/powertools-lambda-python/issues/5907)) +* **deps-dev:** bump pytest-benchmark from 4.0.0 to 5.1.0 ([#5909](https://github.com/aws-powertools/powertools-lambda-python/issues/5909)) +* **deps-dev:** bump ruff from 0.9.2 to 0.9.3 ([#5911](https://github.com/aws-powertools/powertools-lambda-python/issues/5911)) * **deps-dev:** bump pytest-cov from 5.0.0 to 6.0.0 ([#5908](https://github.com/aws-powertools/powertools-lambda-python/issues/5908)) +* **deps-dev:** bump pytest-asyncio from 0.24.0 to 0.25.2 ([#5920](https://github.com/aws-powertools/powertools-lambda-python/issues/5920)) +* **deps-dev:** bump boto3-stubs from 1.36.4 to 1.36.5 ([#5919](https://github.com/aws-powertools/powertools-lambda-python/issues/5919)) +* **deps-dev:** bump boto3-stubs from 1.36.4 to 1.36.6 ([#5923](https://github.com/aws-powertools/powertools-lambda-python/issues/5923)) +* **deps-dev:** bump boto3-stubs from 1.36.2 to 1.36.3 ([#5894](https://github.com/aws-powertools/powertools-lambda-python/issues/5894)) +* **deps-dev:** bump aws-cdk from 2.176.0 to 2.177.0 ([#5930](https://github.com/aws-powertools/powertools-lambda-python/issues/5930)) * **deps-dev:** bump mkdocs-material from 9.5.49 to 9.5.50 ([#5889](https://github.com/aws-powertools/powertools-lambda-python/issues/5889)) * **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.175.1a0 to 2.176.0a0 ([#5882](https://github.com/aws-powertools/powertools-lambda-python/issues/5882)) -* **deps-dev:** bump ruff from 0.9.2 to 0.9.3 ([#5911](https://github.com/aws-powertools/powertools-lambda-python/issues/5911)) +* **deps-dev:** bump boto3-stubs from 1.36.1 to 1.36.2 ([#5881](https://github.com/aws-powertools/powertools-lambda-python/issues/5881)) * **deps-dev:** bump aws-cdk from 2.175.1 to 2.176.0 ([#5878](https://github.com/aws-powertools/powertools-lambda-python/issues/5878)) * **deps-dev:** bump ruff from 0.9.1 to 0.9.2 ([#5877](https://github.com/aws-powertools/powertools-lambda-python/issues/5877)) * **deps-dev:** bump aws-cdk-lib from 2.175.1 to 2.176.0 ([#5876](https://github.com/aws-powertools/powertools-lambda-python/issues/5876)) @@ -47,9 +55,9 @@ * **deps-dev:** bump sentry-sdk from 2.19.2 to 2.20.0 ([#5870](https://github.com/aws-powertools/powertools-lambda-python/issues/5870)) * **deps-dev:** bump boto3-stubs from 1.35.97 to 1.35.99 ([#5874](https://github.com/aws-powertools/powertools-lambda-python/issues/5874)) * **deps-dev:** bump cfn-lint from 1.22.4 to 1.22.5 ([#5872](https://github.com/aws-powertools/powertools-lambda-python/issues/5872)) -* **deps-dev:** bump pytest-asyncio from 0.24.0 to 0.25.2 ([#5920](https://github.com/aws-powertools/powertools-lambda-python/issues/5920)) -* **deps-dev:** bump boto3-stubs from 1.36.4 to 1.36.5 ([#5919](https://github.com/aws-powertools/powertools-lambda-python/issues/5919)) -* **deps-dev:** bump pytest-benchmark from 4.0.0 to 5.1.0 ([#5909](https://github.com/aws-powertools/powertools-lambda-python/issues/5909)) +* **deps-dev:** bump aws-cdk-lib from 2.176.0 to 2.177.0 ([#5931](https://github.com/aws-powertools/powertools-lambda-python/issues/5931)) +* **deps-dev:** bump boto3-stubs from 1.36.6 to 1.36.7 ([#5932](https://github.com/aws-powertools/powertools-lambda-python/issues/5932)) +* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.176.0a0 to 2.177.0a0 ([#5933](https://github.com/aws-powertools/powertools-lambda-python/issues/5933)) From d28d7f7a45b06d0c356816f44eaceaf062afb34a Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 28 Jan 2025 10:59:58 +0000 Subject: [PATCH 49/52] chore(ci): update poetry version to v2 (#5936) Updating poetry version --- .github/workflows/pre-release.yml | 8 ++++---- .github/workflows/publish_v2_layer.yml | 2 +- .github/workflows/publish_v3_layer.yml | 2 +- .github/workflows/release-v3.yml | 8 ++++---- .github/workflows/release.yml | 8 ++++---- .github/workflows/reusable_deploy_v2_layer_stack.yml | 2 +- .github/workflows/reusable_deploy_v3_layer_stack.yml | 2 +- Makefile | 1 + 8 files changed, 17 insertions(+), 16 deletions(-) diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index a3abc001e4c..ea8d298ff5c 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -63,8 +63,8 @@ jobs: # We use a pinned version of Poetry to be certain it won't modify source code before we create a hash - name: Install poetry run: | - pipx install git+https://github.com/python-poetry/poetry@68b88e5390720a3dd84f02940ec5200bfce39ac6 # v1.5.0 - pipx inject poetry git+https://github.com/monim67/poetry-bumpversion@315fe3324a699fa12ec20e202eb7375d4327d1c4 # v0.3.1 + pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 + pipx inject poetry git+https://github.com/monim67/poetry-bumpversion@348de6f247222e2953d649932426e63492e0a6bf # v0.3.3 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: @@ -124,7 +124,7 @@ jobs: run: cat pyproject.toml - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@68b88e5390720a3dd84f02940ec5200bfce39ac6 # v1.5.0 + run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Set up Python uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 with: @@ -162,7 +162,7 @@ jobs: artifact_name: ${{ needs.seal.outputs.artifact_name }} - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@68b88e5390720a3dd84f02940ec5200bfce39ac6 # v1.5.0 + run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Set up Python uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 with: diff --git a/.github/workflows/publish_v2_layer.yml b/.github/workflows/publish_v2_layer.yml index 2cefd7aa792..59518cd0c54 100644 --- a/.github/workflows/publish_v2_layer.yml +++ b/.github/workflows/publish_v2_layer.yml @@ -99,7 +99,7 @@ jobs: artifact_name: ${{ inputs.source_code_artifact_name }} - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@68b88e5390720a3dd84f02940ec5200bfce39ac6 # v1.5.0 + run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Setup Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index 2fc3072275c..a0bafe5c8c2 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -102,7 +102,7 @@ jobs: artifact_name: ${{ inputs.source_code_artifact_name }} - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@68b88e5390720a3dd84f02940ec5200bfce39ac6 # v1.5.0 + run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Setup Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: diff --git a/.github/workflows/release-v3.yml b/.github/workflows/release-v3.yml index 11bbb188de3..a7bbaeaf660 100644 --- a/.github/workflows/release-v3.yml +++ b/.github/workflows/release-v3.yml @@ -87,8 +87,8 @@ jobs: # We use a pinned version of Poetry to be certain it won't modify source code before we create a hash - name: Install poetry run: | - pipx install git+https://github.com/python-poetry/poetry@68b88e5390720a3dd84f02940ec5200bfce39ac6 # v1.5.0 - pipx inject poetry git+https://github.com/monim67/poetry-bumpversion@315fe3324a699fa12ec20e202eb7375d4327d1c4 # v0.3.1 + pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 + pipx inject poetry git+https://github.com/monim67/poetry-bumpversion@348de6f247222e2953d649932426e63492e0a6bf # v0.3.3 - name: Bump package version id: versioning @@ -129,7 +129,7 @@ jobs: run: cat pyproject.toml - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@68b88e5390720a3dd84f02940ec5200bfce39ac6 # v1.5.0 + run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Set up Python uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 with: @@ -167,7 +167,7 @@ jobs: artifact_name: ${{ needs.seal.outputs.artifact_name }} - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@68b88e5390720a3dd84f02940ec5200bfce39ac6 # v1.5.0 + run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Set up Python uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5aa7f035602..7a4cdbe9bb6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -87,8 +87,8 @@ jobs: # We use a pinned version of Poetry to be certain it won't modify source code before we create a hash - name: Install poetry run: | - pipx install git+https://github.com/python-poetry/poetry@68b88e5390720a3dd84f02940ec5200bfce39ac6 # v1.5.0 - pipx inject poetry git+https://github.com/monim67/poetry-bumpversion@315fe3324a699fa12ec20e202eb7375d4327d1c4 # v0.3.1 + pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 + pipx inject poetry git+https://github.com/monim67/poetry-bumpversion@348de6f247222e2953d649932426e63492e0a6bf # v0.3.3 - name: Bump package version id: versioning @@ -129,7 +129,7 @@ jobs: run: cat pyproject.toml - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@68b88e5390720a3dd84f02940ec5200bfce39ac6 # v1.5.0 + run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Set up Python uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 with: @@ -167,7 +167,7 @@ jobs: artifact_name: ${{ needs.seal.outputs.artifact_name }} - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@68b88e5390720a3dd84f02940ec5200bfce39ac6 # v1.5.0 + run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Set up Python uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 with: diff --git a/.github/workflows/reusable_deploy_v2_layer_stack.yml b/.github/workflows/reusable_deploy_v2_layer_stack.yml index 1ccea4ac980..0ab175242cc 100644 --- a/.github/workflows/reusable_deploy_v2_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v2_layer_stack.yml @@ -151,7 +151,7 @@ jobs: artifact_name: ${{ inputs.source_code_artifact_name }} - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@68b88e5390720a3dd84f02940ec5200bfce39ac6 # v1.5.0 + run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 with: diff --git a/.github/workflows/reusable_deploy_v3_layer_stack.yml b/.github/workflows/reusable_deploy_v3_layer_stack.yml index 94dfec662ce..8aa7b5aa87e 100644 --- a/.github/workflows/reusable_deploy_v3_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v3_layer_stack.yml @@ -153,7 +153,7 @@ jobs: artifact_name: ${{ inputs.source_code_artifact_name }} - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@68b88e5390720a3dd84f02940ec5200bfce39ac6 # v1.5.0 + run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 with: diff --git a/Makefile b/Makefile index 3c201e61735..f9111bd9394 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,7 @@ dev: dev-quality-code: pip install --upgrade pip pre-commit poetry + @$(MAKE) dev-version-plugin poetry install --extras "all redis datamasking" pre-commit install From 2a7a9aa8db1261052021f44c76786ec5b14e48ca Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 28 Jan 2025 11:31:48 +0000 Subject: [PATCH 50/52] chore(ci): adding poetry export plugin to support v2 (#5938) * Adding export plygin * Adding export plygin * Adding export plygin * Adding export plugin --- poetry.lock | 443 ++++++++++++++++++++++++++++++++++++------------- pyproject.toml | 3 + 2 files changed, 328 insertions(+), 118 deletions(-) diff --git a/poetry.lock b/poetry.lock index b9c84e992d7..0cc1a03a5ae 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.0.0 and should not be changed by hand. [[package]] name = "annotated-types" @@ -6,10 +6,12 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] +markers = {main = "extra == \"parser\" or extra == \"all\""} [[package]] name = "anyio" @@ -17,6 +19,7 @@ version = "4.8.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, @@ -39,6 +42,7 @@ version = "3.5.3" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "argcomplete-3.5.3-py3-none-any.whl", hash = "sha256:2ab2c4a215c59fd6caaff41a869480a23e8f6a5f910b266c1808037f4e375b61"}, {file = "argcomplete-3.5.3.tar.gz", hash = "sha256:c12bf50eded8aebb298c7b7da7a5ff3ee24dffd9f5281867dfe1424b58c55392"}, @@ -53,10 +57,12 @@ version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] +markers = {main = "extra == \"redis\" and python_full_version < \"3.11.3\"", dev = "python_full_version < \"3.11.3\""} [[package]] name = "attrs" @@ -64,10 +70,12 @@ version = "24.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] +markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] @@ -79,13 +87,14 @@ tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "aws-cdk-asset-awscli-v1" -version = "2.2.220" +version = "2.2.221" description = "A library that contains the AWS CLI for use in Lambda Layers" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ - {file = "aws_cdk.asset_awscli_v1-2.2.220-py3-none-any.whl", hash = "sha256:aef8284470bee3e1e0b5d706961c952dba88d50981ba6a21fa8b5cb3e9c4d5b6"}, - {file = "aws_cdk_asset_awscli_v1-2.2.220.tar.gz", hash = "sha256:8e5e1290dc77b15cffe51134be0bf2b613ae8f3f9859fd4137359bbda431b0d3"}, + {file = "aws_cdk.asset_awscli_v1-2.2.221-py3-none-any.whl", hash = "sha256:66a83e4116b6a7a0041f99f7bca7d0ea354c9ab2e17a938a3dcec50f7272f5d9"}, + {file = "aws_cdk_asset_awscli_v1-2.2.221.tar.gz", hash = "sha256:7ea0366c8090dc396fed85baddbcf48ac4a088c1bf606cd776138e6526679108"}, ] [package.dependencies] @@ -99,6 +108,7 @@ version = "2.1.3" description = "A Lambda Layer that contains kubectl v1.20" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.asset_kubectl_v20-2.1.3-py3-none-any.whl", hash = "sha256:d5612e5bd03c215a28ce53193b1144ecf4e93b3b6779563c046a8a74d83a3979"}, {file = "aws_cdk_asset_kubectl_v20-2.1.3.tar.gz", hash = "sha256:237cd8530d9e8be0bbc7159af927dbb6b7f91bf3f4099c8ef4d9a213b34264be"}, @@ -115,6 +125,7 @@ version = "2.1.0" description = "@aws-cdk/asset-node-proxy-agent-v6" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.asset_node_proxy_agent_v6-2.1.0-py3-none-any.whl", hash = "sha256:24a388b69a44d03bae6dbf864c4e25ba650d4b61c008b4568b94ffbb9a69e40e"}, {file = "aws_cdk_asset_node_proxy_agent_v6-2.1.0.tar.gz", hash = "sha256:1f292c0631f86708ba4ee328b3a2b229f7e46ea1c79fbde567ee9eb119c2b0e2"}, @@ -131,6 +142,7 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-alpha-2.114.1a0.tar.gz", hash = "sha256:9e8c3131f4fa3e0926eb3d76aeacd578a6aa51f95b39c10a86112c991bb75864"}, {file = "aws_cdk.aws_apigatewayv2_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:a101ce56d846976ad1c8020054dfe73fd9f45afdbe71f2a297acc84c1a201403"}, @@ -149,6 +161,7 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-authorizers" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-authorizers-alpha-2.114.1a0.tar.gz", hash = "sha256:ee290e2ed0f1506dbbb12b3b8963f50b379121759077002c265977fbaf18fd9f"}, {file = "aws_cdk.aws_apigatewayv2_authorizers_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:2576e1ce06dab314020bff50f5d59b8715a7adf18106eac811028c22f61c9baa"}, @@ -168,6 +181,7 @@ version = "2.114.1a0" description = "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-apigatewayv2-integrations" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws-cdk.aws-apigatewayv2-integrations-alpha-2.114.1a0.tar.gz", hash = "sha256:19e1824b577683e7d3c2b01fd58c176ebe4c7b8d1b4af4cfdc3893d3ffbac9af"}, {file = "aws_cdk.aws_apigatewayv2_integrations_alpha-2.114.1a0-py3-none-any.whl", hash = "sha256:1e440a70e6b4cbe077c95ffdd3fd0cfb3962f90762ea2e973eaa2ab7719ccb2c"}, @@ -187,6 +201,7 @@ version = "2.59.0a0" description = "The CDK Construct Library for AWS::AppSync" optional = false python-versions = "~=3.7" +groups = ["dev"] files = [ {file = "aws-cdk.aws-appsync-alpha-2.59.0a0.tar.gz", hash = "sha256:f5c7773b70b759efd576561dc3d71af5762a6f7cbc9ee9eef5e538c7ab3dccc7"}, {file = "aws_cdk.aws_appsync_alpha-2.59.0a0-py3-none-any.whl", hash = "sha256:ecc235f1f70d404c8d03cf250be0227becd14c468f8c43b6d9df334a1d60c8e2"}, @@ -205,6 +220,7 @@ version = "2.177.0a0" description = "The CDK Construct Library for AWS Lambda in Python" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk.aws_lambda_python_alpha-2.177.0a0-py3-none-any.whl", hash = "sha256:5aacc26970e30909b372fd2e8b98ce7197b8074d78ec4f1d900a8ddd02bc5114"}, {file = "aws_cdk_aws_lambda_python_alpha-2.177.0a0.tar.gz", hash = "sha256:0137957603cd91b473de3a455bf4d95de4ba60c1ba9f25f62d3edeb965202c4e"}, @@ -219,13 +235,14 @@ typeguard = ">=2.13.3,<4.3.0" [[package]] name = "aws-cdk-cloud-assembly-schema" -version = "39.2.3" +version = "39.2.7" description = "Cloud Assembly Schema" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ - {file = "aws_cdk.cloud_assembly_schema-39.2.3-py3-none-any.whl", hash = "sha256:50df7151a131b82c9a7ab8ab9c9a2780a712e774f5418c86d1d27e13051dac17"}, - {file = "aws_cdk_cloud_assembly_schema-39.2.3.tar.gz", hash = "sha256:c809a4a92f0c2f92318cf1a6541f83ecd43d99dbad648f1160943209af8fbdbb"}, + {file = "aws_cdk.cloud_assembly_schema-39.2.7-py3-none-any.whl", hash = "sha256:80330f993605d65d00369f38cb8ac99ad757ef7158985656a77ac5b2712c565c"}, + {file = "aws_cdk_cloud_assembly_schema-39.2.7.tar.gz", hash = "sha256:980250fb7ef871ea12b58ebb91df5b83da10f69810917bdcd8e0c1d02411516c"}, ] [package.dependencies] @@ -239,6 +256,7 @@ version = "2.177.0" description = "Version 2 of the AWS Cloud Development Kit library" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "aws_cdk_lib-2.177.0-py3-none-any.whl", hash = "sha256:acdf06aaf52367a64b4bf88381e8272cb7b5961c242020ace822c79749e53cac"}, {file = "aws_cdk_lib-2.177.0.tar.gz", hash = "sha256:5e51c48da31555beb38243bb2882e98ee9fe1796466ba9f8d3088701b47965e5"}, @@ -260,6 +278,8 @@ version = "4.0.0" description = "AWS Encryption SDK implementation for Python" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "aws-encryption-sdk-4.0.0.tar.gz", hash = "sha256:57df8b5c1b9f18db4373c6e8e65563791063a71be93d0849950ed365272db354"}, {file = "aws_encryption_sdk-4.0.0-py2.py3-none-any.whl", hash = "sha256:a94483785dff2cd166ccb8f3a15cdfe5cba7a3717f6604543c816a3a32f7c412"}, @@ -280,6 +300,7 @@ version = "0.4.3" description = "AWS signature version 4 signing process for the python requests module" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "aws-requests-auth-0.4.3.tar.gz", hash = "sha256:33593372018b960a31dbbe236f89421678b885c35f0b6a7abfae35bb77e069b2"}, {file = "aws_requests_auth-0.4.3-py2.py3-none-any.whl", hash = "sha256:646bc37d62140ea1c709d20148f5d43197e6bd2d63909eb36fa4bb2345759977"}, @@ -294,6 +315,7 @@ version = "1.94.0" description = "AWS SAM Translator is a library that transform SAM templates into AWS CloudFormation templates" optional = false python-versions = "!=4.0,<=4.0,>=3.8" +groups = ["dev"] files = [ {file = "aws_sam_translator-1.94.0-py3-none-any.whl", hash = "sha256:100e33eeffcfa81f7c45cadeb0ee29596ce829f6b4d2745140f04fa19a41f539"}, {file = "aws_sam_translator-1.94.0.tar.gz", hash = "sha256:8ec258d9f7ece72ef91c81f4edb45a2db064c16844b6afac90c575893beaa391"}, @@ -314,6 +336,8 @@ version = "2.14.0" description = "The AWS X-Ray SDK for Python (the SDK) enables Python developers to record and emit information from within their applications to the AWS X-Ray service." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"tracer\" or extra == \"all\"" files = [ {file = "aws_xray_sdk-2.14.0-py2.py3-none-any.whl", hash = "sha256:cfbe6feea3d26613a2a869d14c9246a844285c97087ad8f296f901633554ad94"}, {file = "aws_xray_sdk-2.14.0.tar.gz", hash = "sha256:aab843c331af9ab9ba5cefb3a303832a19db186140894a523edafc024cc0493c"}, @@ -329,6 +353,7 @@ version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, @@ -343,6 +368,7 @@ version = "1.8.2" description = "Security oriented static analyser for python code." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "bandit-1.8.2-py3-none-any.whl", hash = "sha256:df6146ad73dd30e8cbda4e29689ddda48364e36ff655dbfc86998401fcf1721f"}, {file = "bandit-1.8.2.tar.gz", hash = "sha256:e00ad5a6bc676c0954669fe13818024d66b70e42cf5adb971480cf3b671e835f"}, @@ -367,6 +393,7 @@ version = "24.10.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, @@ -409,17 +436,18 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.36.4" +version = "1.36.7" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "boto3-1.36.4-py3-none-any.whl", hash = "sha256:9f8f699e75ec63fcc98c4dd7290997c7c06c68d3ac8161ad4735fe71f5fe945c"}, - {file = "boto3-1.36.4.tar.gz", hash = "sha256:eeceeb74ef8b65634d358c27aa074917f4449dc828f79301f1075232618eb502"}, + {file = "boto3-1.36.7-py3-none-any.whl", hash = "sha256:ab501f75557863e2d2c9fa731e4fe25c45f35e0d92ea0ee11a4eaa63929d3ede"}, + {file = "boto3-1.36.7.tar.gz", hash = "sha256:ae98634efa7b47ced1b0d7342e2940b32639eee913f33ab406590b8ed55ee94b"}, ] [package.dependencies] -botocore = ">=1.36.4,<1.37.0" +botocore = ">=1.36.7,<1.37.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.11.0,<0.12.0" @@ -432,6 +460,7 @@ version = "1.36.7" description = "Type annotations for boto3 1.36.7 generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "boto3_stubs-1.36.7-py3-none-any.whl", hash = "sha256:d5d3f1f537c4d317f1f11b1cb4ce8f427822204936e29419b43c709ec54758ea"}, {file = "boto3_stubs-1.36.7.tar.gz", hash = "sha256:197bdbacd3a9085c6310a06f21616f30f6103ed8be67705962620ac4587ba1fb"}, @@ -864,21 +893,22 @@ xray = ["mypy-boto3-xray (>=1.36.0,<1.37.0)"] [[package]] name = "botocore" -version = "1.36.4" +version = "1.36.7" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "botocore-1.36.4-py3-none-any.whl", hash = "sha256:3f183aa7bb0c1ba02171143a05f28a4438abdf89dd6b8c0a7727040375a90520"}, - {file = "botocore-1.36.4.tar.gz", hash = "sha256:ef54f5e3316040b6ff775941e6ed052c3230dda0079d17d9f9e3c757375f2027"}, + {file = "botocore-1.36.7-py3-none-any.whl", hash = "sha256:a6c6772d777af2957ac9975207fac1ccc4ce101408b85e9b5e3c5ba0bb949102"}, + {file = "botocore-1.36.7.tar.gz", hash = "sha256:9abc64bde5e7d8f814ea91d6fc0a8142511fc96427c19fe9209677c20a0c9e6e"}, ] [package.dependencies] jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ - {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, + {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, ] [package.extras] @@ -886,13 +916,14 @@ crt = ["awscrt (==0.23.4)"] [[package]] name = "botocore-stubs" -version = "1.36.4" +version = "1.36.7" description = "Type annotations and code completion for botocore" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "botocore_stubs-1.36.4-py3-none-any.whl", hash = "sha256:bbbd1b061b68bdc6d474ad9dfbf7f56386f416b297862347ae735f2272a78e4b"}, - {file = "botocore_stubs-1.36.4.tar.gz", hash = "sha256:cc1677029f32d98c9e080885e2098424fd6afd41d6d3380f96d42c29e73e30b5"}, + {file = "botocore_stubs-1.36.7-py3-none-any.whl", hash = "sha256:77052e3a86a3f77383c638db63379652bafac3a2b310954392e0cfb3dacd3dad"}, + {file = "botocore_stubs-1.36.7.tar.gz", hash = "sha256:51c51da5379d3e4c4cb7e3dbe8451f572ecbfe6a5ced3a76a6b958941ef72409"}, ] [package.dependencies] @@ -907,6 +938,8 @@ version = "0.16.1" description = "Python module to generate and modify bytecode" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "bytecode-0.16.1-py3-none-any.whl", hash = "sha256:1d4b61ed6bade4bff44127c8283bef8131a664ce4dbe09d64a88caf329939f35"}, {file = "bytecode-0.16.1.tar.gz", hash = "sha256:8fbbb637c880f339e564858bc6c7984ede67ae97bc71343379a535a9a4baf398"}, @@ -921,6 +954,7 @@ version = "24.1.2" description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, @@ -943,13 +977,14 @@ ujson = ["ujson (>=5.7.0)"] [[package]] name = "cdk-nag" -version = "2.35.1" +version = "2.35.2" description = "Check CDK v2 applications for best practices using a combination on available rule packs." optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ - {file = "cdk_nag-2.35.1-py3-none-any.whl", hash = "sha256:0bc6109bbc5f12ea72cf7e535ff0f8704cdb4e6344cd271eda82f3cde7a99bb4"}, - {file = "cdk_nag-2.35.1.tar.gz", hash = "sha256:1623c9173f4f10108d54ea5a5d98f129f79f78cab4b10f07d7c9651bbfd9652e"}, + {file = "cdk_nag-2.35.2-py3-none-any.whl", hash = "sha256:5348d4595622d67f841bbd7a490f28fa9fa3ae59193381e43b508780785b1004"}, + {file = "cdk_nag-2.35.2.tar.gz", hash = "sha256:af58a7ef38784c1398f856136f76057e68f74837fcd3bb655b78b4fba379ca60"}, ] [package.dependencies] @@ -965,6 +1000,7 @@ version = "0.1.290" description = "AWS Generative AI CDK Constructs is a library for well-architected generative AI patterns." optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "cdklabs.generative_ai_cdk_constructs-0.1.290-py3-none-any.whl", hash = "sha256:3297a25ee2acbf6e70ee100a7e712023b076ea688820e53fa352b1c05a769cf0"}, {file = "cdklabs_generative_ai_cdk_constructs-0.1.290.tar.gz", hash = "sha256:693f732e8552d28100b5da918a17cb19fd19b25b81040faf11688a24afbe42c0"}, @@ -984,6 +1020,7 @@ version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, @@ -995,6 +1032,7 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -1064,6 +1102,7 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] +markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = "*" @@ -1074,6 +1113,7 @@ version = "1.22.7" description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cfn_lint-1.22.7-py3-none-any.whl", hash = "sha256:6ae732fd11cba6b01ce577fe4d985c407166010faf385eb5b30236916b02ad29"}, {file = "cfn_lint-1.22.7.tar.gz", hash = "sha256:0cd99a217c3f197939b15dd0badfa49e90142d315c78e644f07bb8d943dd1b3e"}, @@ -1100,6 +1140,7 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -1201,6 +1242,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -1215,6 +1257,7 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -1226,6 +1269,7 @@ version = "6.9.0" description = "Add colours to the output of Python's logging module." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff"}, {file = "colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2"}, @@ -1243,6 +1287,7 @@ version = "10.4.2" description = "A programming model for software-defined state" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "constructs-10.4.2-py3-none-any.whl", hash = "sha256:1f0f59b004edebfde0f826340698b8c34611f57848139b7954904c61645f13c1"}, {file = "constructs-10.4.2.tar.gz", hash = "sha256:ce54724360fffe10bab27d8a081844eb81f5ace7d7c62c84b719c49f164d5307"}, @@ -1259,6 +1304,7 @@ version = "7.6.10" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, @@ -1336,6 +1382,7 @@ version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, @@ -1365,6 +1412,7 @@ files = [ {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] +markers = {main = "extra == \"all\" or extra == \"datamasking\""} [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} @@ -1381,13 +1429,15 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "datadog" -version = "0.50.2" +version = "0.51.0" description = "The Datadog Python library" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ - {file = "datadog-0.50.2-py2.py3-none-any.whl", hash = "sha256:f3297858564b624efbd9ce43e4ea1c2c21e1f0477ab6d446060b536a1d9e431e"}, - {file = "datadog-0.50.2.tar.gz", hash = "sha256:17725774bf2bb0a48f1d096d92707492c187f24ae08960af0b0c2fa97958fd51"}, + {file = "datadog-0.51.0-py2.py3-none-any.whl", hash = "sha256:a9764f091c96af4e0996d4400b168fc5fba380f911d6d672c9dcd4773e29ea3f"}, + {file = "datadog-0.51.0.tar.gz", hash = "sha256:3279534f831ae0b4ae2d8ce42ef038b4ab38e667d7ed6ff7437982d7a0cf5250"}, ] [package.dependencies] @@ -1399,6 +1449,8 @@ version = "6.104.0" description = "The Datadog AWS Lambda Library" optional = true python-versions = "<4,>=3.8.0" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "datadog_lambda-6.104.0-py3-none-any.whl", hash = "sha256:72092f9057764515ef1e2fdf1cf25f82bfa70296411af9121db896e4a35fdf6e"}, {file = "datadog_lambda-6.104.0.tar.gz", hash = "sha256:eeb2ff0e4387812e7caf17e501d93fea3d85e3f9bb79581fb37556580d5a1c46"}, @@ -1415,87 +1467,89 @@ dev = ["boto3 (>=1.34.0,<2.0.0)", "flake8 (>=5.0.4,<6.0.0)", "pytest (>=8.0.0,<9 [[package]] name = "ddtrace" -version = "2.19.1" +version = "2.20.0" description = "Datadog APM client library" optional = true python-versions = ">=3.7" -files = [ - {file = "ddtrace-2.19.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:c6bc63fcc10c3128c91d245c5e677fd204ff10e67c3c75d26f28d34b6436bd15"}, - {file = "ddtrace-2.19.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:a8a5f66e2cfce6868a625efb9e1954bc08b484e9edb67fc2d051c6a05c991bf7"}, - {file = "ddtrace-2.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b878ba8c53c8894bf21eb7f71253af43da7ee2096f1b2d4ad93f7078fbd9e6a"}, - {file = "ddtrace-2.19.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8bd12d40a86c5567b9da4cc6180e75cd6da4fbfe3ee75d5e03197325912b986"}, - {file = "ddtrace-2.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87e5c897e3d0a60aba9beb36f0ef3db8477544b3f41dd990dbd89e505f1cb36c"}, - {file = "ddtrace-2.19.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4050e59b42e340672523830e58702fdb2b8977a5f627c49047fb7e754bd15827"}, - {file = "ddtrace-2.19.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2f3155ce3b36c616ff7ec9a66ddc3be57fba0d4703b439312b4e2d984f7bcc68"}, - {file = "ddtrace-2.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ff2eb2c9054d74c2d072215a3e01348c51915da940de71072ac187538273183c"}, - {file = "ddtrace-2.19.1-cp310-cp310-win32.whl", hash = "sha256:45434237e8aaf6d4e8ed6dae746a9fd01eea162367a85c46ff588cf386cc7c75"}, - {file = "ddtrace-2.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b7f860dfa8136f1953b0b129b7fafe7c60c0cf3ec4d0f7068f23f55e0567679"}, - {file = "ddtrace-2.19.1-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:03d9b8b64d98371823d22b14663a0704d263e5b67cef3590d4867db0cd1c5fcc"}, - {file = "ddtrace-2.19.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:514990e82f4da61b1c2f0c88f03f704701484f2982d6f514da368baa7a7f7121"}, - {file = "ddtrace-2.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:606bfcab7e9edb81a00f558cad76168b0f9bb995e9d3485b9297f7c18898c65c"}, - {file = "ddtrace-2.19.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:949f86469698650c2b4eab0881338408c1ac090df1dc792c0fc0b5fd928b39c8"}, - {file = "ddtrace-2.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa32c91ced9d72bb4c18c59c81516a3f12e2b1f3b0511b54eb3b3b3b0a36c8a5"}, - {file = "ddtrace-2.19.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:26c632967748f625e2bacf313eaea94b607fd08337aa94e5a3efc08a105e1646"}, - {file = "ddtrace-2.19.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:507d4ebd509d407fe2133d19efc9923f551d4063ba8d9f62a4de7f1ac7dbe51a"}, - {file = "ddtrace-2.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:835d891b152e848bbdb0e2098c806a9344075bdf8d7ad1f84ab07fe3477a408c"}, - {file = "ddtrace-2.19.1-cp311-cp311-win32.whl", hash = "sha256:49638d9e011fca10c44f227ca1e6051d95d84719179947f02a9ab7a898782340"}, - {file = "ddtrace-2.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:0a94c1b9645382b625e2d40158ae2c8035450d45456edc1c794152e24adb7572"}, - {file = "ddtrace-2.19.1-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:9f61efa4bd35065b9d1ebcaa8d0c38aa07a69e815141bb78c29f47f9c366162e"}, - {file = "ddtrace-2.19.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:650556e47507a1956f4790c5d2aa8c8e67161c9a6e2957a1b2c1271570079ff6"}, - {file = "ddtrace-2.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:619d3f615a4e1c85e021f9c058811d5e8e6491dd19cb3c594c877173abab9be7"}, - {file = "ddtrace-2.19.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587e3697986fece1a5bfc992d4e94fad6c527d48768d10675765b50ef22a260f"}, - {file = "ddtrace-2.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a441ed49b5f673934508ea0bfd041c605939b4a56c989301af5d1d7b58b163f"}, - {file = "ddtrace-2.19.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:248279640bc696bc85ccec8137b3749b530ec77f3772a5ab1cf35dae9fc3185c"}, - {file = "ddtrace-2.19.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a6f302e6dcb650cc37de3e5d329142c1adba095bd5072f5318ff599aded4f12b"}, - {file = "ddtrace-2.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:40bbc851c997577dc33aac65f77332c4dde8886c718b619772bd7e5823400155"}, - {file = "ddtrace-2.19.1-cp312-cp312-win32.whl", hash = "sha256:d5c20848ff667424c89995c2623538a215030992839c390fa5017278053d3cdd"}, - {file = "ddtrace-2.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:e71bd1567d157fa8bfb6f8ad97b3951d8cb892567d87e448c3f2bb94e9f405fe"}, - {file = "ddtrace-2.19.1-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:ed9e06f51c97116b7fef5d5768e4defbc42927e4308272f2483ed24ae275e0f3"}, - {file = "ddtrace-2.19.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:ae73f9efda7c230cb93efe1a28a097cab82f2792cae05c6739a500c64b98f512"}, - {file = "ddtrace-2.19.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75e77c63e172d4a05f5b76b3b024ba28e2d9a1fbd931fc9b52f3726d8c9e78c3"}, - {file = "ddtrace-2.19.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6f23d3a066513c3db1b2cbe0b63bda0629b8cdbfbb9ef34f45a0478688abe29"}, - {file = "ddtrace-2.19.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7abf200a82165d0b49abc94c070e2dc6083cd689c00f5ddb260b9609e3f3982"}, - {file = "ddtrace-2.19.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8c2e23da18956c3f078931171c920c82792b5b8f5b779f2c9d743bcba6eebe6e"}, - {file = "ddtrace-2.19.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b633f149f83e1b8e376602c09ee99c4d6d264fa1510a7b61a937db7e631e1c69"}, - {file = "ddtrace-2.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f2587d376b9c35c6f7fabc5a1167c3eb1deb4726e801fdca6adcf2fb1c2c545"}, - {file = "ddtrace-2.19.1-cp37-cp37m-macosx_12_0_x86_64.whl", hash = "sha256:5fc57b3adf0fe89be4a5c5870894933d01b2a8bed6e55c0d192612a47fc6fcf1"}, - {file = "ddtrace-2.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c70546e3f19f3173023d5d324d86f10bd113b45c3ba4214401eb35d36475576"}, - {file = "ddtrace-2.19.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99efa02a24d0027fddb8434e6aceb2a6540362d24ce06f20da2ec582b80ffa6"}, - {file = "ddtrace-2.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d3d8412de4270044fdce3759eac0f4be93c60564fdf84b1c7d65a937d53720f"}, - {file = "ddtrace-2.19.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d0aafd871773c2e28519040c69790fab38ca8731dde07cef64ffa3722253f07b"}, - {file = "ddtrace-2.19.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:e1e250eb470930b65c1cbd197bac5dcc9d6e8e0a37bf52bd8de33b95e444c075"}, - {file = "ddtrace-2.19.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:2f6a7b5812fb92d63a8f55ba24346b3d07ac76519250ed86b0bde98f8bb3e384"}, - {file = "ddtrace-2.19.1-cp37-cp37m-win32.whl", hash = "sha256:04199d69f9352e9463aa51fb4b08f11c7bfade0bf4f50dec597cf6577588c47c"}, - {file = "ddtrace-2.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08c95895cada1a6da8fdbe1c9a2e8eb2bb29e6df97cba33a1804c059605bf6ad"}, - {file = "ddtrace-2.19.1-cp38-cp38-macosx_12_0_universal2.whl", hash = "sha256:03086fa9bad36a4fef5fdf33d2a7a872e77d4d85742391c5ad47fd7a719f3f7f"}, - {file = "ddtrace-2.19.1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:57286262e57988582697d1a3d50ef86876d04b41ea2f420e67f37e5ca57dcf1e"}, - {file = "ddtrace-2.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11b4ee4627ea4df619f26d1947da83ea64b2f887eab790c56a8a1c866ac16a56"}, - {file = "ddtrace-2.19.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf285714e274c6fe6e776d753cd5cfdcbaa72542f2053e89b6eba87584db25e"}, - {file = "ddtrace-2.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83f43e492cd16be18dbc0cab860bbd4066b6cb6bed374ce9eea4854fff56876"}, - {file = "ddtrace-2.19.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a30bb5903c8bd695522a78d2cbc6b0e7189cd126fab63f3356acce8e78e453fa"}, - {file = "ddtrace-2.19.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:93e52c2ab8ed4e112a19b93a56929b5eb3281ad6e5bc950e925d8a2eae3ab6a3"}, - {file = "ddtrace-2.19.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93408fb44289b318e6894635beb336a28ee4ce260b0db18b1391535bf833aeb1"}, - {file = "ddtrace-2.19.1-cp38-cp38-win32.whl", hash = "sha256:b26d04c8f5d0c0fcb665fe1069e2b06ecb8f2cfbbacc255bb641e44a00e47390"}, - {file = "ddtrace-2.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:dfbd8470ec8a81368f62847b90f9d0cdf804d311a737e4dc5127cbb6d87201b9"}, - {file = "ddtrace-2.19.1-cp39-cp39-macosx_12_0_universal2.whl", hash = "sha256:749e5aa0cf2e3c0dc63b4b325c733d8d1505785fecf0194b5752d23adb6f4916"}, - {file = "ddtrace-2.19.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0bccc189f799af9d25050fcbe626d10552e0a0d9989f853c195edbf49bd36199"}, - {file = "ddtrace-2.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61798b40fea57d7f59d7179e31b0f04b2e5901f06dc7b8abade3f72a50b4b119"}, - {file = "ddtrace-2.19.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cc20ff3fb82bc614585ed32c4af81bf48b5fdfe4c474283df009982721c5552"}, - {file = "ddtrace-2.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64eaaf159ca310ce7dddde27c595503d1b9da9a1b6be668f411a2b02fba1ab29"}, - {file = "ddtrace-2.19.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:355dd017cf1b28e69df35996175bba5f7823e1d7368eec1b263b43a18976643e"}, - {file = "ddtrace-2.19.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:19e96324bb27af311c180013aedcc1aa1b341c281d902a7ca2c52a68804eb1ea"}, - {file = "ddtrace-2.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:da95970736a920a6ce7a359d0adcb30b9711bbc21c2a1d898fdb8f87f9b0005d"}, - {file = "ddtrace-2.19.1-cp39-cp39-win32.whl", hash = "sha256:3f5ac6c515ddee38c8ce7cc1227d5a88dfb715f8502ef952ee4356a311f13ba5"}, - {file = "ddtrace-2.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:82a0b87cb214dfec2d25f70a2a18e89788bcc23a2f0f3cff1e750a842474c994"}, - {file = "ddtrace-2.19.1.tar.gz", hash = "sha256:b4558abcbc10e0b5c71cf54c490f5791163cd071e7bfdecce56db56f02ffd0a3"}, +groups = ["main"] +markers = "extra == \"datadog\"" +files = [ + {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e1dee099099b95acf7d0e552179925cfec58a52315cc914d153506367b195bc4"}, + {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:9d209bef14caafcd53be8c14e04741d86c08f76496c1bf755e2eaa38605ce3e0"}, + {file = "ddtrace-2.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f37966012078151713d61382de2a7ed710a8f375820e0db41930436b813b651"}, + {file = "ddtrace-2.20.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:879b963baf0b97d5ddd26185ab496b79efd25bbfdc2c25dbb1113ec19dc5abf9"}, + {file = "ddtrace-2.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e9b9a87c9df8a029fd3583ac660538dfa9d53207fee82b7f04749148bf8a3b"}, + {file = "ddtrace-2.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:eb76547a4bbf285d03ffc6e065bbad61761954741da2df0e4683d68d46ef2159"}, + {file = "ddtrace-2.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:194973afa1e357c68b6a6eceaabbddcef01130d167775126c2a15b3c1827f683"}, + {file = "ddtrace-2.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a71d2fc753b8fa2c3435b6f4d5f820d8deb51f49df59a4886b4da68b67f923d3"}, + {file = "ddtrace-2.20.0-cp310-cp310-win32.whl", hash = "sha256:567054d0c01dc552a8a24c4c9eeb98d778be720d2c4c9536acf1b86d6969a5e4"}, + {file = "ddtrace-2.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:d39f96e2fdfdf7ab43ee89a20d914f5ab12f8f361c390663eacb0e5da6e6e7fb"}, + {file = "ddtrace-2.20.0-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:0a1d7eaf6c9a5e0eabb8396f7d19faffc8f76a1ae37f34814c3432a9ca6f31da"}, + {file = "ddtrace-2.20.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:301a7787a34113b56cc9067a593c4717f6e158f2393883c30b59d0a37ebc06fa"}, + {file = "ddtrace-2.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d76ce49eb42588766db6756240d746441a66f03932547bfca9c62a8aecdbb38"}, + {file = "ddtrace-2.20.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a84d2e2411496c1b4ca3ce0cfb407d186cb3d13f1769c321fec30e677d815cd8"}, + {file = "ddtrace-2.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da47746a24242d805a800bca0a10b1354353e18b0bc4b6caf9c9c1724ba286b0"}, + {file = "ddtrace-2.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6f89e6003a738800beeb9948c847366976c73de2e24cc469b644a125f418c0a8"}, + {file = "ddtrace-2.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4fca20220bf668ebcac7051d28648b62aa95d2afeb5036ecad167cb454c7dcf1"}, + {file = "ddtrace-2.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1197e89fcaaca4ce419e3c812d04c73b8d16973202472cf3f674b4698b967697"}, + {file = "ddtrace-2.20.0-cp311-cp311-win32.whl", hash = "sha256:44bcd604a1d9095f4eb6813db6a677a208bd47884aff9ddc5aa46f596765f38e"}, + {file = "ddtrace-2.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:0a5f092df1ee4d0afe96502866ff0fb446a07c6a23d445ed616f1302c883e1d3"}, + {file = "ddtrace-2.20.0-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:f77103d36e6ab52cb45781766620d3874d0a728565afa7fd57f8ce2d5087e8e7"}, + {file = "ddtrace-2.20.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:d1cec952ce2ca9efbb34c8a9ee522e1cc588fe454b9115120b30fd5d0f821512"}, + {file = "ddtrace-2.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4a1da150e92b6d43047f2a91a7d3b7133207f94b82613625abf82662359b30e"}, + {file = "ddtrace-2.20.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91ab68c1facc6cf04085fdeea53210ed9928e95116809fd9bfe2dea54e83375d"}, + {file = "ddtrace-2.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fd7ec6410225e64ca875d1bc9bd6bd8489f52dd8558462fbb52447fb8f66ad3"}, + {file = "ddtrace-2.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57864590ddb84da4eb99332fe4b521e6fd747992178e3eabcf4f87406e908bb1"}, + {file = "ddtrace-2.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:37693555704a0cbd4a925e4ffe9c6df696146c85557c5f66ce3a7a88406772d9"}, + {file = "ddtrace-2.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ae5e802aaefc0cd3b63e3fd46e051a39e9f960a02e89f44a5bb820f445b736f9"}, + {file = "ddtrace-2.20.0-cp312-cp312-win32.whl", hash = "sha256:14fe4f583bec105c40e233c74fcbaea185658651c626ce1609750d83d93a00ae"}, + {file = "ddtrace-2.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:cfbc926ddfeece0312e82f9e00a68001647666d11ceb050a5bbe66ca8931e3d2"}, + {file = "ddtrace-2.20.0-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:eeca6b6bd48794d48de438981dccbc96a06366edde798c12b2b3348ca5e03717"}, + {file = "ddtrace-2.20.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:3f526e75d1b61019db2cd715e8c7298325e21c3584f8677a7decf37aa81e7284"}, + {file = "ddtrace-2.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96441189ccc772ef4871e23a35cec58a748c16ebfb2293eccaaa719dcbc368fd"}, + {file = "ddtrace-2.20.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d31d769f222c9a5bde1d4a594da1341014bf02db1a7194f5a41ed7e5c4c9fa8"}, + {file = "ddtrace-2.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54068dbf034e1f607ef5d58a9fa1b26bd78b4f3db0618ce0a3e9c4b04fff7209"}, + {file = "ddtrace-2.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62e86d9b00277fe2b9bdfbc51ca1bc34aa5c1200aa6bc5084c7eaaab28b022de"}, + {file = "ddtrace-2.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c83c2458de1cf1bbac48689c6541a85d54ad94ae6608961e1089cc2959a8c77a"}, + {file = "ddtrace-2.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:569d7a92a88ba9b2a203addea688b0585901534c92c2d148ef9f971b6d7b3805"}, + {file = "ddtrace-2.20.0-cp37-cp37m-macosx_12_0_x86_64.whl", hash = "sha256:df413d646fc14b4be51a15ed8e484bcdf3b21e370e2644a586283bcc7e0b2355"}, + {file = "ddtrace-2.20.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33e4406a436278722df193c93d49e662a8891e8a440fddb273dca9a56fa27947"}, + {file = "ddtrace-2.20.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d358bc7b4b1daa2d6e6bc697244b39db653ddd5ae139045941d3db28950bfe"}, + {file = "ddtrace-2.20.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a523924382d2f8f87731e4ad86bbf4721fba9eb807ed3b0c862db6d768e1e81c"}, + {file = "ddtrace-2.20.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:0af78a424e9d87250a8648a35b7de5653f27b3f6f6803c1b33780816a07e6d26"}, + {file = "ddtrace-2.20.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:2723378e670d27927f7d1ab878c8668fc392a5656a66453b9808e7c4025431fd"}, + {file = "ddtrace-2.20.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01f76fc9bf1413a188ddd59851eb3b668d3de936afed73a5914a817f36e11005"}, + {file = "ddtrace-2.20.0-cp37-cp37m-win32.whl", hash = "sha256:3a615ae95ef8f889304b2958655ac8cda23cf2f2c8faf5d8ff88bd14bdcf3fb4"}, + {file = "ddtrace-2.20.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b90333661ffd3460bae6dbbd7a5f35d8467cff36bd7a689a47b014edb19c0fe6"}, + {file = "ddtrace-2.20.0-cp38-cp38-macosx_12_0_universal2.whl", hash = "sha256:ab27596e82bdfe9c0c5580f6886ec943ae2fe615a446c22470f6a1f9742dec62"}, + {file = "ddtrace-2.20.0-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:e2de7371291283cba1afdd7e919a577637099da0d6872d33b4008e1cad6e1b8b"}, + {file = "ddtrace-2.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa4f90f472768aef8ce023a924505c9d1d09428fc9d6ab81bc0e3ab183e3ff48"}, + {file = "ddtrace-2.20.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05b68ba6fe4da5317396100669edf91b3d54b95ae979a2a22ca880cfcc6c249d"}, + {file = "ddtrace-2.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1512d07e6c7cde13ae251906d57d31613fe5ee99fab2894e90679053b4256953"}, + {file = "ddtrace-2.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dcadc60aa60e11f2db56065a834aaa5e52a9be02e8edc8d14aa7015fb54092ce"}, + {file = "ddtrace-2.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:698207d88941ea3e4e5f3add6071e6651caa12fcffe079359507391382251759"}, + {file = "ddtrace-2.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9f95a251f84725df055202d933b4a8fb39cefd51341e10cad17d2a8b4d64700e"}, + {file = "ddtrace-2.20.0-cp38-cp38-win32.whl", hash = "sha256:0b121285459693ae9f3c9ce54cc4be981a2e73d4c52b8a5eb038cf41df9974dd"}, + {file = "ddtrace-2.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:4c840dc91c622138a4a6abdbcbee56897d4c55d9e7bf16b1902ee676f20b22f2"}, + {file = "ddtrace-2.20.0-cp39-cp39-macosx_12_0_universal2.whl", hash = "sha256:c74d69e6a4cbd91f6fe411519d753f34893d6d40a68829b43485690df8a7f30f"}, + {file = "ddtrace-2.20.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:4902b64ba89a8e4008228e7a5007e20b2bb8071c6c7689abd47dddc159e2baf1"}, + {file = "ddtrace-2.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758ba828eddd144a4804af692869e7278376efa740932a7453e8fdc0ed6ef6a7"}, + {file = "ddtrace-2.20.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:37995326df811236c9d92d1b5713378a7f11270bf1e21c64914653a3e12d7d01"}, + {file = "ddtrace-2.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab7f1babd7a8e73edf70c957a5b3bbeb4c615b232a078a0fe4da566e1663d1aa"}, + {file = "ddtrace-2.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1cd1b240f465c98e226ab896b1b1c3696752d5eb1051a0aafb8a3db701d2ddc1"}, + {file = "ddtrace-2.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3a300515c3327af4fd5c6c83e6ca63cd0a20e4243381d4b712e3f406d9ddf201"}, + {file = "ddtrace-2.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f1ce886b112e0e8aa66ba8cf3593f00f7f6ae6b48dd09bd8ce90c59adad59d66"}, + {file = "ddtrace-2.20.0-cp39-cp39-win32.whl", hash = "sha256:bb77464849b092f93839d5c257df9eaeb018521ddea2deef97dfc6e3501a2516"}, + {file = "ddtrace-2.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:b95f14f0634fe3f02dcebb7b8a124207b3d44168fd0dfc6bfff1e4db93978089"}, + {file = "ddtrace-2.20.0.tar.gz", hash = "sha256:f185c6dd88cd04884f0ad27b37f14d837274e8fc4dc43407781334d92d41c3bc"}, ] [package.dependencies] bytecode = [ + {version = ">=0.13.0", markers = "python_version < \"3.11.0\""}, {version = ">=0.16.0", markers = "python_version >= \"3.13.0\""}, {version = ">=0.15.0", markers = "python_version ~= \"3.12.0\""}, {version = ">=0.14.0", markers = "python_version ~= \"3.11.0\""}, - {version = ">=0.13.0", markers = "python_version < \"3.11.0\""}, ] envier = ">=0.5,<1.0" legacy-cgi = {version = ">=2.0.0", markers = "python_version >= \"3.13.0\""} @@ -1515,6 +1569,7 @@ version = "5.1.1" description = "Decorators for Humans" optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -1522,20 +1577,22 @@ files = [ [[package]] name = "deprecated" -version = "1.2.15" +version = "1.2.18" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ - {file = "Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320"}, - {file = "deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"}, + {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"}, + {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"}, ] [package.dependencies] wrapt = ">=1.10,<2" [package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "jinja2 (>=3.0.3,<3.1.0)", "setuptools", "sphinx (<2)", "tox"] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools", "tox"] [[package]] name = "dill" @@ -1543,6 +1600,7 @@ version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -1558,6 +1616,7 @@ version = "0.5.0" description = "Python module and CLI for hashing of file system directories." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "dirhash-0.5.0-py3-none-any.whl", hash = "sha256:523dfd6b058c64f45b31604376926c6e2bd2ea301d0df23095d4055674e38b09"}, {file = "dirhash-0.5.0.tar.gz", hash = "sha256:e60760f0ab2e935d8cb088923ea2c6492398dca42cec785df778985fd4cd5386"}, @@ -1572,6 +1631,7 @@ version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -1583,6 +1643,7 @@ version = "7.1.0" description = "A Python library for the Docker Engine API." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"}, {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"}, @@ -1605,6 +1666,8 @@ version = "0.6.1" description = "Python application configuration via the environment" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "envier-0.6.1-py3-none-any.whl", hash = "sha256:73609040a76be48bbcb97074d9969666484aa0de706183a6e9ef773156a8a6a9"}, {file = "envier-0.6.1.tar.gz", hash = "sha256:3309a01bb3d8850c9e7a31a5166d5a836846db2faecb79b9cb32654dd50ca9f9"}, @@ -1619,6 +1682,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version < \"3.11.0\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1633,6 +1698,7 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1647,6 +1713,8 @@ version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"validation\" or extra == \"all\"" files = [ {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, @@ -1661,6 +1729,7 @@ version = "3.17.0" description = "A platform independent file lock." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"}, {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"}, @@ -1677,6 +1746,7 @@ version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, @@ -1694,6 +1764,7 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1708,6 +1779,7 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1726,6 +1798,7 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -1737,6 +1810,7 @@ version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, @@ -1758,6 +1832,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1782,6 +1857,7 @@ version = "2.3.0" description = "HashiCorp Vault API client" optional = false python-versions = "<4.0,>=3.8" +groups = ["dev"] files = [ {file = "hvac-2.3.0-py3-none-any.whl", hash = "sha256:a3afc5710760b6ee9b3571769df87a0333da45da05a5f9f963e1d3925a84be7d"}, {file = "hvac-2.3.0.tar.gz", hash = "sha256:1b85e3320e8642dd82f234db63253cda169a817589e823713dc5fca83119b1e2"}, @@ -1799,6 +1875,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1813,6 +1890,7 @@ version = "3.3.0" description = "Iterative JSON parser with standard Python iterator interfaces" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7f7a5250599c366369fbf3bc4e176f5daa28eb6bc7d6130d02462ed335361675"}, {file = "ijson-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f87a7e52f79059f9c58f6886c262061065eb6f7554a587be7ed3aa63e6b71b34"}, @@ -1916,6 +1994,7 @@ version = "8.6.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, @@ -1939,6 +2018,7 @@ version = "6.5.2" description = "Read resources from Python packages" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, @@ -1961,6 +2041,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1972,6 +2053,7 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -1986,6 +2068,7 @@ version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, @@ -2003,6 +2086,7 @@ version = "1.0.1" description = "JSON Matching Expressions" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, @@ -2014,6 +2098,7 @@ version = "1.106.0" description = "Python client for jsii runtime" optional = false python-versions = "~=3.8" +groups = ["dev"] files = [ {file = "jsii-1.106.0-py3-none-any.whl", hash = "sha256:5a44d7c3a5a326fa3d9befdb3770b380057e0a61e3804e7c4907f70d76afaaa2"}, {file = "jsii-1.106.0.tar.gz", hash = "sha256:c79c47899f53a7c3c4b20f80d3cd306628fe9ed1852eee970324c71eba1d974e"}, @@ -2034,6 +2119,7 @@ version = "1.33" description = "Apply JSON-Patches (RFC 6902)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +groups = ["dev"] files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, @@ -2048,10 +2134,10 @@ version = "1.7.0" description = "A final implementation of JSONPath for Python that aims to be standard compliant, including arithmetic and binary comparison operators and providing clear AST for metaprogramming." optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, - {file = "jsonpath_ng-1.7.0-py2-none-any.whl", hash = "sha256:898c93fc173f0c336784a3fa63d7434297544b7198124a68f9a3ef9597b0ae6e"}, - {file = "jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6"}, ] [package.dependencies] @@ -2063,6 +2149,7 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -2074,6 +2161,7 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -2095,6 +2183,7 @@ version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, @@ -2109,6 +2198,8 @@ version = "2.6.2" description = "Fork of the standard library cgi and cgitb modules, being deprecated in PEP-594" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"datadog\" and python_version >= \"3.13.0\"" files = [ {file = "legacy_cgi-2.6.2-py3-none-any.whl", hash = "sha256:a7b83afb1baf6ebeb56522537c5943ef9813cf933f6715e88a803f7edbce0bff"}, {file = "legacy_cgi-2.6.2.tar.gz", hash = "sha256:9952471ceb304043b104c22d00b4f333cac27a6abe446d8a528fc437cf13c85f"}, @@ -2120,6 +2211,7 @@ version = "1.3.8" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "Mako-1.3.8-py3-none-any.whl", hash = "sha256:42f48953c7eb91332040ff567eb7eea69b22e7a4affbc5ba8e845e8f730f6627"}, {file = "mako-1.3.8.tar.gz", hash = "sha256:577b97e414580d3e088d47c2dbbe9594aa7a5146ed2875d4dfa9075af2dd3cc8"}, @@ -2139,6 +2231,7 @@ version = "0.7.1" description = "Create Python CLI apps with little to no effort at all!" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "mando-0.7.1-py2.py3-none-any.whl", hash = "sha256:26ef1d70928b6057ee3ca12583d73c63e05c49de8972d620c278a7b206581a8a"}, {file = "mando-0.7.1.tar.gz", hash = "sha256:18baa999b4b613faefb00eac4efadcf14f510b59b924b66e08289aa1de8c3500"}, @@ -2156,6 +2249,7 @@ version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, @@ -2174,6 +2268,7 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -2198,6 +2293,7 @@ version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -2268,6 +2364,7 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -2279,6 +2376,7 @@ version = "1.3.4" description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -2290,6 +2388,7 @@ version = "2.1.3" description = "Manage multiple versions of your MkDocs-powered documentation" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "mike-2.1.3-py3-none-any.whl", hash = "sha256:d90c64077e84f06272437b464735130d380703a76a5738b152932884c60c062a"}, {file = "mike-2.1.3.tar.gz", hash = "sha256:abd79b8ea483fb0275b7972825d3082e5ae67a41820f8d8a0dc7a3f49944e810"}, @@ -2315,6 +2414,7 @@ version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, @@ -2346,6 +2446,7 @@ version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, @@ -2363,6 +2464,7 @@ version = "0.3.2" description = "MkDocs plugin for setting revision date from git per markdown file." optional = false python-versions = ">=3.4" +groups = ["dev"] files = [ {file = "mkdocs_git_revision_date_plugin-0.3.2-py3-none-any.whl", hash = "sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef"}, ] @@ -2378,6 +2480,7 @@ version = "9.5.50" description = "Documentation that simply works" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385"}, {file = "mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825"}, @@ -2407,6 +2510,7 @@ version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, @@ -2418,6 +2522,7 @@ version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2435,6 +2540,7 @@ version = "0.70.17" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ddb24e5bcdb64e90ec5543a1f05a39463068b6d3b804aa3f2a4e16ec28562d6"}, {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d729f55198a3579f6879766a6d9b72b42d4b320c0dcb7844afb774d75b573c62"}, @@ -2463,6 +2569,7 @@ version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, @@ -2522,6 +2629,7 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfig 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_appconfig-1.36.0-py3-none-any.whl", hash = "sha256:d627de43761a83991a0ab8cd10698d415f94dcc78a567433c7465fc8d1f5cc16"}, {file = "mypy_boto3_appconfig-1.36.0.tar.gz", hash = "sha256:3f38cbd2d7d359da88dc996eeeafa4c1174847909e31a327dd77263dfdfd5424"}, @@ -2536,6 +2644,7 @@ version = "1.36.0" description = "Type annotations for boto3 AppConfigData 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_appconfigdata-1.36.0-py3-none-any.whl", hash = "sha256:68f02ce06ed9597b02154aff64655fc38c42919eda08fddb130ba17e9f70e9cb"}, {file = "mypy_boto3_appconfigdata-1.36.0.tar.gz", hash = "sha256:3436d149833ea69b4260a0f352aac19258d4676c7a21087625906f7da98624c7"}, @@ -2550,6 +2659,7 @@ version = "1.36.0" description = "Type annotations for boto3 CloudFormation 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_cloudformation-1.36.0-py3-none-any.whl", hash = "sha256:3f6cd81739aaf9634c4aa2b92579081038a76e4f2dec306d02eaaf558b332ce9"}, {file = "mypy_boto3_cloudformation-1.36.0.tar.gz", hash = "sha256:acc2c7ae8920f1167be097f6151685fe5aee99be2f890075edf93e05d298e8b0"}, @@ -2564,6 +2674,7 @@ version = "1.36.0" description = "Type annotations for boto3 CloudWatch 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_cloudwatch-1.36.0-py3-none-any.whl", hash = "sha256:2f6cb81c05a1b4be3510e0857b22913a241488bc08f55b0ad96e8b775c144891"}, {file = "mypy_boto3_cloudwatch-1.36.0.tar.gz", hash = "sha256:a370d61522121ab457c443c338a652d0d3e1c22102d9db9f197fd5dcb7e656a4"}, @@ -2578,6 +2689,7 @@ version = "1.36.0" description = "Type annotations for boto3 DynamoDB 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_dynamodb-1.36.0-py3-none-any.whl", hash = "sha256:b782a817ce8956f8d53ac94c85f969dfe51451fc99f16a3b62776f1e0ed3f1ba"}, {file = "mypy_boto3_dynamodb-1.36.0.tar.gz", hash = "sha256:1687e4689236a5391755126e86ec2596d408eb95408c31ac09a3d1eb289d516d"}, @@ -2592,6 +2704,7 @@ version = "1.36.0" description = "Type annotations for boto3 Lambda 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_lambda-1.36.0-py3-none-any.whl", hash = "sha256:8a6693be1352b51e232cee73f73ce36014d19b4777bdf6969c5e707aba424ca1"}, {file = "mypy_boto3_lambda-1.36.0.tar.gz", hash = "sha256:5e9f23702060529aad216a3ce2a2368391a112df07909fbd3aa80d573d84893c"}, @@ -2606,6 +2719,7 @@ version = "1.36.3" description = "Type annotations for boto3 CloudWatchLogs 1.36.3 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_logs-1.36.3-py3-none-any.whl", hash = "sha256:553cb31261eb4484394af9ac965fa33b0d414e927c47768021a0a6ec89625f64"}, {file = "mypy_boto3_logs-1.36.3.tar.gz", hash = "sha256:76d233632a36665094ac888a685fade150c10665ab4cad1b17265037fcadd098"}, @@ -2620,6 +2734,7 @@ version = "1.36.0" description = "Type annotations for boto3 S3 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_s3-1.36.0-py3-none-any.whl", hash = "sha256:a65ccb6be7b7ebf907887268d44975e435b1fc1164fc0a25de310e2b832f7e91"}, {file = "mypy_boto3_s3-1.36.0.tar.gz", hash = "sha256:80a881847b0e1fbc5edcad8b2870c110e31e7ef128db42402b70c159b7e93d5a"}, @@ -2634,6 +2749,7 @@ version = "1.36.0" description = "Type annotations for boto3 SecretsManager 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_secretsmanager-1.36.0-py3-none-any.whl", hash = "sha256:d7fd56b08afed32ce26f2663ec57f9ea074e1e5149a4388eccb46653e3cb5a66"}, {file = "mypy_boto3_secretsmanager-1.36.0.tar.gz", hash = "sha256:6e1f91cd5b0c1f0533f8cfa91e4755855d39931475e7d1e23ee8dbb2e7163d18"}, @@ -2644,13 +2760,14 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-ssm" -version = "1.36.0" -description = "Type annotations for boto3 SSM 1.36.0 service generated with mypy-boto3-builder 8.8.0" +version = "1.36.6" +description = "Type annotations for boto3 SSM 1.36.6 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "mypy_boto3_ssm-1.36.0-py3-none-any.whl", hash = "sha256:c79a6a949f0b57e68bd48d3d15eb56b975633ffdfaa449d119831c205228cab6"}, - {file = "mypy_boto3_ssm-1.36.0.tar.gz", hash = "sha256:bbb9a9ce0e318cad2a53f8200102b4fdc547c7f33912146df82698c9ae40181f"}, + {file = "mypy_boto3_ssm-1.36.6-py3-none-any.whl", hash = "sha256:7f255428d79a8eb0adfde6f21b1b996275295d993157ffe0a6585bfea711583b"}, + {file = "mypy_boto3_ssm-1.36.6.tar.gz", hash = "sha256:edc819b7526ab35b105648603839d158b00146af5743fc7784db3227073e1973"}, ] [package.dependencies] @@ -2662,6 +2779,7 @@ version = "1.36.0" description = "Type annotations for boto3 XRay 1.36.0 service generated with mypy-boto3-builder 8.8.0" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_boto3_xray-1.36.0-py3-none-any.whl", hash = "sha256:b92a06db10f623db4ec0641227f468b7a57c77f8e599846cfddace4b434f70a5"}, {file = "mypy_boto3_xray-1.36.0.tar.gz", hash = "sha256:5ae2b4c333bf2881870ffb96f1d99cd5e7ee1706d071b6923dcd6de6ceb3ac0c"}, @@ -2676,6 +2794,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -2687,6 +2806,7 @@ version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, @@ -2705,6 +2825,7 @@ version = "2024.10.9" description = "Flexible test automation." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "nox-2024.10.9-py3-none-any.whl", hash = "sha256:1d36f309a0a2a853e9bccb76bbef6bb118ba92fa92674d15604ca99adeb29eab"}, {file = "nox-2024.10.9.tar.gz", hash = "sha256:7aa9dc8d1c27e9f45ab046ffd1c3b2c4f7c91755304769df231308849ebded95"}, @@ -2727,6 +2848,8 @@ version = "1.16.0" description = "OpenTelemetry Python API" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "opentelemetry_api-1.16.0-py3-none-any.whl", hash = "sha256:79e8f0cf88dbdd36b6abf175d2092af1efcaa2e71552d0d2b3b181a9707bf4bc"}, {file = "opentelemetry_api-1.16.0.tar.gz", hash = "sha256:4b0e895a3b1f5e1908043ebe492d33e33f9ccdbe6d02d3994c2f8721a63ddddb"}, @@ -2742,6 +2865,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -2753,6 +2877,7 @@ version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, @@ -2768,6 +2893,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -2779,6 +2905,7 @@ version = "6.1.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" +groups = ["dev"] files = [ {file = "pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"}, {file = "pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24"}, @@ -2790,6 +2917,7 @@ version = "0.11.5" description = "Auto-generate API documentation for Python projects." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pdoc3-0.11.5-py3-none-any.whl", hash = "sha256:b614436239716e1655e538f68a42c62a0bac566e70ddd86c58bc66d6a9ec90a0"}, {file = "pdoc3-0.11.5.tar.gz", hash = "sha256:fc40607e3f46860ba42c02d30075fe1a52c039b77ffa8e86c1cbc4a8078841b3"}, @@ -2805,6 +2933,7 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -2821,6 +2950,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -2836,6 +2966,8 @@ version = "3.11" description = "Python Lex & Yacc" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, @@ -2847,6 +2979,8 @@ version = "5.29.3" description = "" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, @@ -2867,6 +3001,7 @@ version = "0.0.3" description = "Publication helps you maintain public-api-friendly modules by preventing unintentional access to private implementation details via introspection." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "publication-0.0.3-py2.py3-none-any.whl", hash = "sha256:0248885351febc11d8a1098d5c8e3ab2dabcf3e8c0c96db1e17ecd12b53afbe6"}, {file = "publication-0.0.3.tar.gz", hash = "sha256:68416a0de76dddcdd2930d1c8ef853a743cc96c82416c4e4d3b5d901c6276dc4"}, @@ -2878,6 +3013,7 @@ version = "9.0.0" description = "Get CPU info with pure Python" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, @@ -2889,10 +3025,12 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] +markers = {main = "(extra == \"all\" or extra == \"datamasking\") and platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [[package]] name = "pydantic" @@ -2900,10 +3038,12 @@ version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, ] +markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] annotated-types = ">=0.6.0" @@ -2920,6 +3060,7 @@ version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -3022,6 +3163,7 @@ files = [ {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] +markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" @@ -3032,6 +3174,8 @@ version = "2.7.1" description = "Settings management using Pydantic" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"all\"" files = [ {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"}, {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"}, @@ -3052,6 +3196,7 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -3066,6 +3211,7 @@ version = "10.14.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pymdown_extensions-10.14.1-py3-none-any.whl", hash = "sha256:637951cbfbe9874ba28134fb3ce4b8bcadd6aca89ac4998ec29dcbafd554ae08"}, {file = "pymdown_extensions-10.14.1.tar.gz", hash = "sha256:b65801996a0cd4f42a3110810c306c45b7313c09b0610a6f773730f2a9e3c96b"}, @@ -3084,6 +3230,7 @@ version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, @@ -3098,6 +3245,7 @@ version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, @@ -3120,6 +3268,7 @@ version = "0.25.2" description = "Pytest support for asyncio" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075"}, {file = "pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f"}, @@ -3138,6 +3287,7 @@ version = "5.1.0" description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pytest-benchmark-5.1.0.tar.gz", hash = "sha256:9ea661cdc292e8231f7cd4c10b0319e56a2118e2c09d9f50e1b3d150d2aca105"}, {file = "pytest_benchmark-5.1.0-py3-none-any.whl", hash = "sha256:922de2dfa3033c227c96da942d1878191afa135a29485fb942e85dff1c592c89"}, @@ -3158,6 +3308,7 @@ version = "6.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, @@ -3176,6 +3327,7 @@ version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, @@ -3193,6 +3345,7 @@ version = "0.7.0" description = "Pytest Plugin to disable socket calls during tests" optional = false python-versions = ">=3.8,<4.0" +groups = ["dev"] files = [ {file = "pytest_socket-0.7.0-py3-none-any.whl", hash = "sha256:7e0f4642177d55d317bbd58fc68c6bd9048d6eadb2d46a89307fa9221336ce45"}, {file = "pytest_socket-0.7.0.tar.gz", hash = "sha256:71ab048cbbcb085c15a4423b73b619a8b35d6a307f46f78ea46be51b1b7e11b3"}, @@ -3207,6 +3360,7 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -3227,6 +3381,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -3241,10 +3396,12 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, ] +markers = {main = "extra == \"all\""} [package.extras] cli = ["click (>=5.0)"] @@ -3255,6 +3412,8 @@ version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" +groups = ["dev"] +markers = "sys_platform == \"win32\"" files = [ {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, @@ -3282,6 +3441,7 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -3344,6 +3504,7 @@ version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, @@ -3358,6 +3519,7 @@ version = "6.0.1" description = "Code Metrics in Python" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "radon-6.0.1-py2.py3-none-any.whl", hash = "sha256:632cc032364a6f8bb1010a2f6a12d0f14bc7e5ede76585ef29dc0cecf4cd8859"}, {file = "radon-6.0.1.tar.gz", hash = "sha256:d1ac0053943a893878940fedc8b19ace70386fc9c9bf0a09229a44125ebf45b5"}, @@ -3376,10 +3538,12 @@ version = "5.2.1" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"}, {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"}, ] +markers = {main = "extra == \"redis\""} [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} @@ -3390,13 +3554,14 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)" [[package]] name = "referencing" -version = "0.36.1" +version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "referencing-0.36.1-py3-none-any.whl", hash = "sha256:363d9c65f080d0d70bc41c721dce3c7f3e77fc09f269cd5c8813da18069a6794"}, - {file = "referencing-0.36.1.tar.gz", hash = "sha256:ca2e6492769e3602957e9b831b94211599d2aade9477f5d44110d2530cf9aade"}, + {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, + {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, ] [package.dependencies] @@ -3410,6 +3575,7 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -3513,6 +3679,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -3534,6 +3701,7 @@ version = "0.9.5" description = "Easy to use retry decorator." optional = false python-versions = ">=2.6" +groups = ["dev"] files = [ {file = "retry2-0.9.5-py2.py3-none-any.whl", hash = "sha256:f7fee13b1e15d0611c462910a6aa72a8919823988dd0412152bc3719c89a4e55"}, ] @@ -3547,6 +3715,7 @@ version = "13.9.4" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, @@ -3566,6 +3735,7 @@ version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, @@ -3678,6 +3848,7 @@ version = "0.9.3" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "ruff-0.9.3-py3-none-linux_armv6l.whl", hash = "sha256:7f39b879064c7d9670197d91124a75d118d00b0990586549949aae80cdc16624"}, {file = "ruff-0.9.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a187171e7c09efa4b4cc30ee5d0d55a8d6c5311b3e1b74ac5cb96cc89bafc43c"}, @@ -3701,13 +3872,14 @@ files = [ [[package]] name = "s3transfer" -version = "0.11.1" +version = "0.11.2" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "s3transfer-0.11.1-py3-none-any.whl", hash = "sha256:8fa0aa48177be1f3425176dfe1ab85dcd3d962df603c3dbfc585e6bf857ef0ff"}, - {file = "s3transfer-0.11.1.tar.gz", hash = "sha256:3f25c900a367c8b7f7d8f9c34edc87e300bde424f779dc9f0a8ae4f9df9264f6"}, + {file = "s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:be6ecb39fadd986ef1701097771f87e4d2f821f27f6071c872143884d2950fbc"}, + {file = "s3transfer-0.11.2.tar.gz", hash = "sha256:3b39185cb72f5acc77db1a58b6e25b977f28d20496b6e58d6813d75f464d632f"}, ] [package.dependencies] @@ -3722,6 +3894,7 @@ version = "0.0.4" description = "Flexible recursive directory iterator: scandir meets glob(\"**\", recursive=True)" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "scantree-0.0.4-py3-none-any.whl", hash = "sha256:7616ab65aa6b7f16fcf8e6fa1d9afaa99a27ab72bba05c61b691853b96763174"}, {file = "scantree-0.0.4.tar.gz", hash = "sha256:15bd5cb24483b04db2c70653604e8ea3522e98087db7e38ab8482f053984c0ac"}, @@ -3737,6 +3910,7 @@ version = "2.20.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "sentry_sdk-2.20.0-py2.py3-none-any.whl", hash = "sha256:c359a1edf950eb5e80cffd7d9111f3dbeef57994cb4415df37d39fda2cf22364"}, {file = "sentry_sdk-2.20.0.tar.gz", hash = "sha256:afa82713a92facf847df3c6f63cec71eb488d826a50965def3d7722aa6f0fdab"}, @@ -3792,6 +3966,8 @@ version = "75.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, @@ -3812,6 +3988,7 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -3823,6 +4000,7 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -3834,6 +4012,7 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -3845,6 +4024,7 @@ version = "5.4.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "stevedore-5.4.0-py3-none-any.whl", hash = "sha256:b0be3c4748b3ea7b854b265dcb4caa891015e442416422be16f8b31756107857"}, {file = "stevedore-5.4.0.tar.gz", hash = "sha256:79e92235ecb828fe952b6b8b0c6c87863248631922c8e8e0fa5b17b232c4514d"}, @@ -3859,6 +4039,7 @@ version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, @@ -3876,6 +4057,7 @@ version = "4.9.1" description = "Python library for throwaway instances of anything that can run in a Docker container" optional = false python-versions = "<4.0,>=3.9" +groups = ["dev"] files = [ {file = "testcontainers-4.9.1-py3-none-any.whl", hash = "sha256:315fb94b42a383872df530aa45319745278ef0cc18b9cfcdc231a75d14afa5a0"}, {file = "testcontainers-4.9.1.tar.gz", hash = "sha256:37fe9a222549ddb788463935965b16f91809e9a8d654f437d6a59eac9b77f76f"}, @@ -3930,6 +4112,8 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version < \"3.11.0\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -3971,6 +4155,7 @@ version = "2.13.3" description = "Run-time type checker for Python" optional = false python-versions = ">=3.5.3" +groups = ["dev"] files = [ {file = "typeguard-2.13.3-py3-none-any.whl", hash = "sha256:5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1"}, {file = "typeguard-2.13.3.tar.gz", hash = "sha256:00edaa8da3a133674796cf5ea87d9f4b4c367d77476e185e80251cc13dfbb8c4"}, @@ -3982,13 +4167,14 @@ test = ["mypy", "pytest", "typing-extensions"] [[package]] name = "types-awscrt" -version = "0.23.6" +version = "0.23.8" description = "Type annotations and code completion for awscrt" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "types_awscrt-0.23.6-py3-none-any.whl", hash = "sha256:fbf9c221af5607b24bf17f8431217ce8b9a27917139edbc984891eb63fd5a593"}, - {file = "types_awscrt-0.23.6.tar.gz", hash = "sha256:405bce8c281f9e7c6c92a229225cc0bf10d30729a6a601123213389bd524b8b1"}, + {file = "types_awscrt-0.23.8-py3-none-any.whl", hash = "sha256:d66b3817565769f5311b7e171a3c48d3dbf8a8f9c22f02686c2f003b6559a2a5"}, + {file = "types_awscrt-0.23.8.tar.gz", hash = "sha256:2141391a8f4d36cf098406c19d9060b34f13a558c22d4aadac250a0c57d12710"}, ] [[package]] @@ -3997,6 +4183,7 @@ version = "1.16.0.20241221" description = "Typing stubs for cffi" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_cffi-1.16.0.20241221-py3-none-any.whl", hash = "sha256:e5b76b4211d7a9185f6ab8d06a106d56c7eb80af7cdb8bfcb4186ade10fb112f"}, {file = "types_cffi-1.16.0.20241221.tar.gz", hash = "sha256:1c96649618f4b6145f58231acb976e0b448be6b847f7ab733dabe62dfbff6591"}, @@ -4011,6 +4198,7 @@ version = "24.1.0.20240722" description = "Typing stubs for pyOpenSSL" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types-pyOpenSSL-24.1.0.20240722.tar.gz", hash = "sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39"}, {file = "types_pyOpenSSL-24.1.0.20240722-py3-none-any.whl", hash = "sha256:6a7a5d2ec042537934cfb4c9d4deb0e16c4c6250b09358df1f083682fe6fda54"}, @@ -4026,6 +4214,7 @@ version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, @@ -4037,6 +4226,7 @@ version = "4.6.0.20241004" description = "Typing stubs for redis" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types-redis-4.6.0.20241004.tar.gz", hash = "sha256:5f17d2b3f9091ab75384153bfa276619ffa1cf6a38da60e10d5e6749cc5b902e"}, {file = "types_redis-4.6.0.20241004-py3-none-any.whl", hash = "sha256:ef5da68cb827e5f606c8f9c0b49eeee4c2669d6d97122f301d3a55dc6a63f6ed"}, @@ -4052,6 +4242,7 @@ version = "2.31.0.6" description = "Typing stubs for requests" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, @@ -4062,13 +4253,14 @@ types-urllib3 = "*" [[package]] name = "types-s3transfer" -version = "0.11.1" +version = "0.11.2" description = "Type annotations and code completion for s3transfer" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "types_s3transfer-0.11.1-py3-none-any.whl", hash = "sha256:ddb20d103361c2d7cf95e9e73468cdd12f049f503b1512e6fdfe5a66fa086d2d"}, - {file = "types_s3transfer-0.11.1.tar.gz", hash = "sha256:6ab89d4d76bcbf6d494582949963b4672347e8daa397d9790f3684b4fcf873c4"}, + {file = "types_s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:09c31cff8c79a433fcf703b840b66d1f694a6c70c410ef52015dd4fe07ee0ae2"}, + {file = "types_s3transfer-0.11.2.tar.gz", hash = "sha256:3ccb8b90b14434af2fb0d6c08500596d93f3a83fb804a2bb843d9bf4f7c2ca60"}, ] [[package]] @@ -4077,6 +4269,7 @@ version = "75.8.0.20250110" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480"}, {file = "types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271"}, @@ -4088,6 +4281,7 @@ version = "1.26.25.14" description = "Typing stubs for urllib3" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, @@ -4099,6 +4293,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -4110,6 +4305,8 @@ version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, @@ -4197,6 +4394,7 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, @@ -4213,6 +4411,7 @@ version = "0.1.0" description = "Flexible version handling" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, @@ -4227,6 +4426,7 @@ version = "20.29.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779"}, {file = "virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35"}, @@ -4247,6 +4447,7 @@ version = "6.0.0" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, @@ -4289,6 +4490,7 @@ version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -4370,6 +4572,7 @@ files = [ {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, ] +markers = {main = "extra == \"tracer\" or extra == \"all\" or extra == \"datadog\" or extra == \"datamasking\""} [[package]] name = "xenon" @@ -4377,6 +4580,7 @@ version = "0.9.3" description = "Monitor code metrics for Python on your CI server" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "xenon-0.9.3-py2.py3-none-any.whl", hash = "sha256:6e2c2c251cc5e9d01fe984e623499b13b2140fcbf74d6c03a613fa43a9347097"}, {file = "xenon-0.9.3.tar.gz", hash = "sha256:4a7538d8ba08aa5d79055fb3e0b2393c0bd6d7d16a4ab0fcdef02ef1f10a43fa"}, @@ -4393,6 +4597,8 @@ version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -4404,6 +4610,7 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, @@ -4428,6 +4635,6 @@ tracer = ["aws-xray-sdk"] validation = ["fastjsonschema"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = ">=3.9,<4.0.0" content-hash = "d9f1328c56d8cbad3242d4f5f5f7ca04482270605a7505994dfc2872847dff05" diff --git a/pyproject.toml b/pyproject.toml index cd7576e1062..26fa05c9273 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -134,6 +134,9 @@ omit = [ ] branch = true +[tool.poetry.requires-plugins] +poetry-plugin-export = "^1.9.0" + [tool.coverage.html] directory = "test_report" title = "Powertools for AWS Lambda (Python) Test Coverage" From 1816551a95bc3fffb097d3f060a7564b34724f19 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 28 Jan 2025 14:36:26 +0000 Subject: [PATCH 51/52] chore(ci): adding poetry export plugin to support v2 (#5941) Adding export plugin --- .github/workflows/publish_v3_layer.yml | 4 +++- .github/workflows/reusable_deploy_v3_layer_stack.yml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index a0bafe5c8c2..66cfd0b07c7 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -102,7 +102,9 @@ jobs: artifact_name: ${{ inputs.source_code_artifact_name }} - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 + run: | + pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 + pipx inject poetry git+https://github.com/python-poetry/poetry-plugin-export@8c83d26603ca94f2e203bfded7b6d7f530960e06 # v1.8.0 - name: Setup Node.js uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: diff --git a/.github/workflows/reusable_deploy_v3_layer_stack.yml b/.github/workflows/reusable_deploy_v3_layer_stack.yml index 8aa7b5aa87e..27bab40f0db 100644 --- a/.github/workflows/reusable_deploy_v3_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v3_layer_stack.yml @@ -153,7 +153,9 @@ jobs: artifact_name: ${{ inputs.source_code_artifact_name }} - name: Install poetry - run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 + run: | + pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1 + pipx inject poetry git+https://github.com/python-poetry/poetry-plugin-export@8c83d26603ca94f2e203bfded7b6d7f530960e06 # v1.8.0 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 with: From f70d4ed8649ca691615928be815a48470a917b80 Mon Sep 17 00:00:00 2001 From: "Powertools for AWS Lambda (Python) bot" <151832416+aws-powertools-bot@users.noreply.github.com> Date: Tue, 28 Jan 2025 14:43:09 +0000 Subject: [PATCH 52/52] chore: version bump --- aws_lambda_powertools/shared/version.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py index fedce557921..0dc016570a1 100644 --- a/aws_lambda_powertools/shared/version.py +++ b/aws_lambda_powertools/shared/version.py @@ -1,3 +1,3 @@ """Exposes version constant to avoid circular dependencies.""" -VERSION = "3.4.2a0" +VERSION = "3.5.0" diff --git a/pyproject.toml b/pyproject.toml index 26fa05c9273..66adab81eff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "3.4.2a0" +version = "3.5.0" description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity." authors = ["Amazon Web Services"] include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"]