Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: aws-powertools/powertools-lambda-python
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v1.26.6
Choose a base ref
...
head repository: aws-powertools/powertools-lambda-python
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v1.26.7
Choose a head ref
  • 17 commits
  • 45 files changed
  • 7 contributors

Commits on Jul 25, 2022

  1. chore(ci): update project with version 1.26.6

    Release bot committed Jul 25, 2022
    Copy the full SHA
    389e066 View commit details
  2. Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    626acc5 View commit details
  3. chore(ci): update project with version 1.26.6

    Release bot committed Jul 25, 2022
    Copy the full SHA
    227564f View commit details
  4. chore(ci): update project with version 1.26.6

    Release bot committed Jul 25, 2022
    Copy the full SHA
    bea30d7 View commit details
  5. Verified

    This commit was signed with the committer’s verified signature.
    heitorlessa Heitor Lessa
    Copy the full SHA
    3b6b03e View commit details
  6. Verified

    This commit was signed with the committer’s verified signature.
    heitorlessa Heitor Lessa
    Copy the full SHA
    6b536b0 View commit details
  7. Verified

    This commit was signed with the committer’s verified signature.
    heitorlessa Heitor Lessa
    Copy the full SHA
    c463232 View commit details

Commits on Jul 27, 2022

  1. fix(event_handlers): ImportError when importing Response from top-lev…

    …el event_handler (#1388)
    
    Co-authored-by: Victor Covalski <victor.covalski@contaswap.com>
    VictorCovalski and Victor Covalski authored Jul 27, 2022

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    279ba24 View commit details
  2. Verified

    This commit was signed with the committer’s verified signature.
    heitorlessa Heitor Lessa
    Copy the full SHA
    cbad51c View commit details
  3. Merge branch 'develop' of https://github.com/awslabs/aws-lambda-power…

    …tools-python into develop
    
    * 'develop' of https://github.com/awslabs/aws-lambda-powertools-python:
      fix(event_handlers): ImportError when importing Response from top-level event_handler (#1388)
    heitorlessa committed Jul 27, 2022

    Verified

    This commit was signed with the committer’s verified signature.
    heitorlessa Heitor Lessa
    Copy the full SHA
    9938c26 View commit details

Commits on Jul 28, 2022

  1. Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    c8c6167 View commit details
  2. Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    a0ddd46 View commit details
  3. Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    723effc View commit details
  4. chore(deps-dev): bump flake8-isort from 4.1.1 to 4.1.2.post0 (#1384)

    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    dependabot[bot] authored Jul 28, 2022

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    ec3b952 View commit details
  5. chore(deps): bump constructs from 10.1.1 to 10.1.59 (#1396)

    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    dependabot[bot] authored Jul 28, 2022

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    39c4a59 View commit details
  6. chore(deps): bump jsii from 1.57.0 to 1.63.1 (#1390)

    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    dependabot[bot] authored Jul 28, 2022

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    02e8b60 View commit details

Commits on Jul 29, 2022

  1. feat(idempotency): handle lambda timeout scenarios for INPROGRESS rec…

    …ords (#1387)
    
    Co-authored-by: heitorlessa <lessa@amazon.co.uk>
    rubenfonseca and heitorlessa authored Jul 29, 2022

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    160feae View commit details
Showing with 919 additions and 329 deletions.
  1. +1 −11 .github/scripts/label_related_issue.js
  2. +14 −0 .github/workflows/publish.yml
  3. +1 −1 .github/workflows/python_build.yml
  4. +55 −1 CHANGELOG.md
  5. +7 −6 MAINTAINERS.md
  6. +1 −1 Makefile
  7. +9 −1 aws_lambda_powertools/event_handler/__init__.py
  8. +1 −0 aws_lambda_powertools/event_handler/appsync.py
  9. +59 −59 aws_lambda_powertools/tracing/base.py
  10. +1 −1 aws_lambda_powertools/tracing/tracer.py
  11. +31 −1 aws_lambda_powertools/utilities/idempotency/base.py
  12. +10 −0 aws_lambda_powertools/utilities/idempotency/config.py
  13. +2 −0 aws_lambda_powertools/utilities/idempotency/idempotency.py
  14. +19 −1 aws_lambda_powertools/utilities/idempotency/persistence/base.py
  15. +53 −6 aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py
  16. +1 −1 docs/core/event_handler/api_gateway.md
  17. +10 −10 docs/core/event_handler/appsync.md
  18. +25 −25 docs/index.md
  19. BIN docs/media/idempotent_sequence.png
  20. BIN docs/media/idempotent_sequence_exception.png
  21. +166 −43 docs/utilities/idempotency.md
  22. +3 −2 examples/event_handler_graphql/src/assert_async_graphql_response.py
  23. +11 −4 examples/event_handler_graphql/src/assert_async_graphql_response_module.py
  24. +9 −2 examples/event_handler_graphql/src/assert_graphql_response_module.py
  25. +9 −2 examples/event_handler_graphql/src/async_resolvers.py
  26. +13 −6 examples/event_handler_graphql/src/custom_models.py
  27. +9 −2 examples/event_handler_graphql/src/getting_started_graphql_api_resolver.py
  28. +10 −3 examples/event_handler_graphql/src/graphql_transformer_merchant_info.py
  29. +12 −5 examples/event_handler_graphql/src/graphql_transformer_search_merchant.py
  30. +9 −2 examples/event_handler_graphql/src/nested_mappings.py
  31. +5 −5 examples/event_handler_graphql/src/scalar_functions.py
  32. +9 −2 examples/event_handler_graphql/src/split_operation_module.py
  33. +1 −1 examples/event_handler_rest/src/binary_responses.py
  34. +2 −3 examples/event_handler_rest/src/exception_handling.py
  35. +1 −1 examples/event_handler_rest/src/split_route_module.py
  36. +1 −1 examples/event_handler_rest/src/split_route_prefix_module.py
  37. +1 −1 examples/logger/src/bring_your_own_formatter_from_scratch.py
  38. +6 −6 layer/requirements.txt
  39. +9 −0 mypy.ini
  40. +49 −40 poetry.lock
  41. +4 −3 pyproject.toml
  42. +1 −1 tests/functional/event_handler/test_api_gateway.py
  43. +50 −28 tests/functional/idempotency/conftest.py
  44. +204 −35 tests/functional/idempotency/test_idempotency.py
  45. +25 −6 tests/functional/idempotency/utils.py
12 changes: 1 addition & 11 deletions .github/scripts/label_related_issue.js
Original file line number Diff line number Diff line change
@@ -40,7 +40,7 @@ module.exports = async ({github, context, core}) => {

try {
core.info(`Auto-labeling related issue ${issue} for release`)
await github.rest.issues.addLabels({
return await github.rest.issues.addLabels({
issue_number: issue,
owner: context.repo.owner,
repo: context.repo.repo,
@@ -50,14 +50,4 @@ module.exports = async ({github, context, core}) => {
core.setFailed(`Is this issue number (${issue}) valid? Perhaps a discussion?`);
throw new Error(error);
}

const { groups: {relatedIssueNumber} } = isMatch

core.info(`Auto-labeling related issue ${relatedIssueNumber} for release`)
return await github.rest.issues.addLabels({
issue_number: relatedIssueNumber,
owner: context.repo.owner,
repo: context.repo.repo,
labels: [relatedIssueNumber]
})
}
14 changes: 14 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -28,11 +28,19 @@ on:
description: "Version to be released in PyPi, Docs, and Lambda Layer, e.g. v1.26.4"
default: v1.26.4
required: true
skip_pypi:
description: "Skip publishing to PyPi as it can't publish more than once. Useful for semi-failed releases"
default: false
type: boolean
required: false

jobs:
release:
environment: release
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
outputs:
RELEASE_VERSION: ${{ steps.release_version.outputs.RELEASE_VERSION }}
env:
@@ -58,29 +66,35 @@ jobs:
- name: Install dependencies
run: make dev
- name: Run all tests, linting and baselines
if: ${{ !inputs.skip_pypi }}
run: make pr
- name: Bump package version
run: poetry version ${RELEASE_VERSION}
- name: Generate latest CHANGELOG
if: ${{ !inputs.skip_pypi }}
run: make changelog
- name: Setup git client
run: |
git config user.name "Release bot"
git config user.email aws-devax-open-source@amazon.com
- name: Push project metadata and changelog to trunk
if: ${{ !inputs.skip_pypi }}
run: |
git add CHANGELOG.md
git add pyproject.toml
git commit -m "chore(ci): update project with version ${RELEASE_VERSION}"
git push origin HEAD:refs/heads/develop
- name: Build python package and wheel
if: ${{ !inputs.skip_pypi }}
run: poetry build
- name: Upload to PyPi test
if: ${{ !inputs.skip_pypi }}
run: make release-test
env:
PYPI_USERNAME: __token__
PYPI_TEST_TOKEN: ${{ secrets.PYPI_TEST_TOKEN }}
- name: Upload to PyPi prod
if: ${{ !inputs.skip_pypi }}
run: make release-prod
env:
PYPI_USERNAME: __token__
2 changes: 1 addition & 1 deletion .github/workflows/python_build.yml
Original file line number Diff line number Diff line change
@@ -26,7 +26,7 @@ jobs:
strategy:
max-parallel: 4
matrix:
python-version: [3.6, 3.7, 3.8, 3.9]
python-version: [3.7, 3.8, 3.9]
env:
OS: ${{ matrix.os }}
PYTHON: ${{ matrix.python-version }}
56 changes: 55 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -4,6 +4,59 @@
<a name="unreleased"></a>
# Unreleased

## Maintenance

* **ci:** update project with version 1.26.6
* **ci:** add conditional to skip pypi release ([#1366](https://github.com/awslabs/aws-lambda-powertools-python/issues/1366))
* **ci:** update project with version 1.26.6


<a name="v1.26.6"></a>
## [v1.26.6] - 2022-07-25
## Bug Fixes

* **ci:** remove unsupported env in workflow_call
* **ci:** allow inherit secrets for reusable workflow
* **ci:** remove unused secret
* **ci:** label_related_issue unresolved var from history mixup
* **ci:** cond doesnt support two expr w/ env
* **ci:** only event is resolved in cond
* **ci:** unexpected symbol due to double quotes...
* **event_handlers:** handle lack of headers when using auto-compression feature ([#1325](https://github.com/awslabs/aws-lambda-powertools-python/issues/1325))

## Maintenance

* dummy for PR test
* print full event depth
* print full workflow event depth
* debug full event
* remove leftover from fork one more time
* **ci:** test env expr
* **ci:** test upstream job skip
* **ci:** lockdown workflow_run by origin ([#1350](https://github.com/awslabs/aws-lambda-powertools-python/issues/1350))
* **ci:** test default env
* **ci:** experiment hardening origin
* **ci:** experiment hardening origin
* **ci:** introduce codeowners ([#1352](https://github.com/awslabs/aws-lambda-powertools-python/issues/1352))
* **ci:** use OIDC and encrypt release secrets ([#1355](https://github.com/awslabs/aws-lambda-powertools-python/issues/1355))
* **ci:** remove core group from codeowners ([#1358](https://github.com/awslabs/aws-lambda-powertools-python/issues/1358))
* **ci:** confirm workflow_run event
* **ci:** use gh environment for beta and prod layer deploy ([#1356](https://github.com/awslabs/aws-lambda-powertools-python/issues/1356))
* **ci:** update project with version 1.26.5
* **deps:** bump constructs from 10.1.1 to 10.1.52 ([#1343](https://github.com/awslabs/aws-lambda-powertools-python/issues/1343))
* **deps-dev:** bump mypy-boto3-cloudwatch from 1.24.0 to 1.24.35 ([#1342](https://github.com/awslabs/aws-lambda-powertools-python/issues/1342))
* **governance:** update wording tech debt to summary in maintenance template
* **governance:** add new maintenance issue template for tech debt ([#1326](https://github.com/awslabs/aws-lambda-powertools-python/issues/1326))
* **layers:** layer canary stack should not hardcode resource name
* **layers:** replace layers account secret ([#1329](https://github.com/awslabs/aws-lambda-powertools-python/issues/1329))
* **layers:** expand to all aws commercial regions ([#1324](https://github.com/awslabs/aws-lambda-powertools-python/issues/1324))
* **layers:** bump to 1.26.5

## Pull Requests

* Merge pull request [#285](https://github.com/awslabs/aws-lambda-powertools-python/issues/285) from heitorlessa/chore/skip-dep-workflow
* Merge pull request [#284](https://github.com/awslabs/aws-lambda-powertools-python/issues/284) from heitorlessa/chore/dummy


<a name="v1.26.5"></a>
## [v1.26.5] - 2022-07-20
@@ -2067,7 +2120,8 @@
* Merge pull request [#5](https://github.com/awslabs/aws-lambda-powertools-python/issues/5) from jfuss/feat/python38


[Unreleased]: https://github.com/awslabs/aws-lambda-powertools-python/compare/v1.26.5...HEAD
[Unreleased]: https://github.com/awslabs/aws-lambda-powertools-python/compare/v1.26.6...HEAD
[v1.26.6]: https://github.com/awslabs/aws-lambda-powertools-python/compare/v1.26.5...v1.26.6
[v1.26.5]: https://github.com/awslabs/aws-lambda-powertools-python/compare/v1.26.4...v1.26.5
[v1.26.4]: https://github.com/awslabs/aws-lambda-powertools-python/compare/v1.26.3...v1.26.4
[v1.26.3]: https://github.com/awslabs/aws-lambda-powertools-python/compare/v1.26.2...v1.26.3
13 changes: 7 additions & 6 deletions MAINTAINERS.md
Original file line number Diff line number Diff line change
@@ -37,12 +37,13 @@ This is document explains who the maintainers are (see below), what they do in t

## Current Maintainers

| Maintainer | GitHub ID | Affiliation |
| ---------------- | --------------------------------------------- | ----------- |
| Heitor Lessa | [heitorlessa](https://github.com/heitorlessa) | Amazon |
| Alexander Melnyk | [am29d](https://github.com/am29d) | Amazon |
| Michal Ploski | [mploski](https://github.com/mploski) | Amazon |
| Simon Thulbourn | [sthulb](https://github.com/sthulb) | Amazon |
| Maintainer | GitHub ID | Affiliation |
| ---------------- | ----------------------------------------------- | ----------- |
| Heitor Lessa | [heitorlessa](https://github.com/heitorlessa) | Amazon |
| Alexander Melnyk | [am29d](https://github.com/am29d) | Amazon |
| Michal Ploski | [mploski](https://github.com/mploski) | Amazon |
| Simon Thulbourn | [sthulb](https://github.com/sthulb) | Amazon |
| Ruben Fonseca | [rubenfonseca](https://github.com/rubenfonseca) | Amazon |

## Emeritus

2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -99,4 +99,4 @@ changelog:
docker run -v "${PWD}":/workdir quay.io/git-chglog/git-chglog > CHANGELOG.md

mypy:
poetry run mypy --pretty aws_lambda_powertools
poetry run mypy --pretty aws_lambda_powertools examples
10 changes: 9 additions & 1 deletion aws_lambda_powertools/event_handler/__init__.py
Original file line number Diff line number Diff line change
@@ -2,7 +2,14 @@
Event handler decorators for common Lambda events
"""

from .api_gateway import ALBResolver, APIGatewayHttpResolver, ApiGatewayResolver, APIGatewayRestResolver, CORSConfig
from .api_gateway import (
ALBResolver,
APIGatewayHttpResolver,
ApiGatewayResolver,
APIGatewayRestResolver,
CORSConfig,
Response,
)
from .appsync import AppSyncResolver

__all__ = [
@@ -12,4 +19,5 @@
"ALBResolver",
"ApiGatewayResolver",
"CORSConfig",
"Response",
]
1 change: 1 addition & 0 deletions aws_lambda_powertools/event_handler/appsync.py
Original file line number Diff line number Diff line change
@@ -142,6 +142,7 @@ def lambda_handler(event, context):
ValueError
If we could not find a field resolver
"""
# Maintenance: revisit generics/overload to fix [attr-defined] in mypy usage
BaseRouter.current_event = data_model(event)
BaseRouter.lambda_context = context
resolver = self._get_resolver(BaseRouter.current_event.type_name, BaseRouter.current_event.field_name)
118 changes: 59 additions & 59 deletions aws_lambda_powertools/tracing/base.py
Original file line number Diff line number Diff line change
@@ -2,39 +2,34 @@
import numbers
import traceback
from contextlib import contextmanager
from typing import Any, AsyncContextManager, ContextManager, List, NoReturn, Optional, Set, Union
from typing import Any, Generator, List, NoReturn, Optional, Sequence, Union


class BaseProvider(abc.ABC):
@abc.abstractmethod # type: ignore
@contextmanager
def in_subsegment(self, name=None, **kwargs) -> ContextManager:
"""Return a subsegment context manger.
class BaseSegment(abc.ABC):
"""Holds common properties and methods on segment and subsegment."""

@abc.abstractmethod
def close(self, end_time: Optional[int] = None):
"""Close the trace entity by setting `end_time`
and flip the in progress flag to False.
Parameters
----------
name: str
Subsegment name
kwargs: Optional[dict]
Optional parameters to be propagated to segment
end_time: int
Time in epoch seconds, by default current time will be used.
"""

@abc.abstractmethod # type: ignore
@contextmanager
def in_subsegment_async(self, name=None, **kwargs) -> AsyncContextManager:
"""Return a subsegment async context manger.
@abc.abstractmethod
def add_subsegment(self, subsegment: Any):
"""Add input subsegment as a child subsegment."""

Parameters
----------
name: str
Subsegment name
kwargs: Optional[dict]
Optional parameters to be propagated to segment
"""
@abc.abstractmethod
def remove_subsegment(self, subsegment: Any):
"""Remove input subsegment from child subsegments."""

@abc.abstractmethod
def put_annotation(self, key: str, value: Union[str, numbers.Number, bool]) -> NoReturn:
"""Annotate current active trace entity with a key-value pair.
"""Annotate segment or subsegment with a key-value pair.
Note: Annotations will be indexed for later search query.
@@ -48,9 +43,8 @@ def put_annotation(self, key: str, value: Union[str, numbers.Number, bool]) -> N

@abc.abstractmethod
def put_metadata(self, key: str, value: Any, namespace: str = "default") -> NoReturn:
"""Add metadata to the current active trace entity.
Note: Metadata is not indexed but can be later retrieved by BatchGetTraces API.
"""Add metadata to segment or subsegment. Metadata is not indexed
but can be later retrieved by BatchGetTraces API.
Parameters
----------
@@ -63,45 +57,52 @@ def put_metadata(self, key: str, value: Any, namespace: str = "default") -> NoRe
"""

@abc.abstractmethod
def patch(self, modules: Set[str]) -> NoReturn:
"""Instrument a set of supported libraries
def add_exception(self, exception: BaseException, stack: List[traceback.StackSummary], remote: bool = False):
"""Add an exception to trace entities.
Parameters
----------
modules: Set[str]
Set of modules to be patched
"""

@abc.abstractmethod
def patch_all(self) -> NoReturn:
"""Instrument all supported libraries"""
exception: Exception
Caught exception
stack: List[traceback.StackSummary]
List of traceback summaries
Output from `traceback.extract_stack()`.
remote: bool
Whether it's a client error (False) or downstream service error (True), by default False
"""

class BaseSegment(abc.ABC):
"""Holds common properties and methods on segment and subsegment."""

class BaseProvider(abc.ABC):
@abc.abstractmethod
def close(self, end_time: Optional[int] = None):
"""Close the trace entity by setting `end_time`
and flip the in progress flag to False.
@contextmanager
def in_subsegment(self, name=None, **kwargs) -> Generator[BaseSegment, None, None]:
"""Return a subsegment context manger.
Parameters
----------
end_time: int
Time in epoch seconds, by default current time will be used.
name: str
Subsegment name
kwargs: Optional[dict]
Optional parameters to be propagated to segment
"""

@abc.abstractmethod
def add_subsegment(self, subsegment: Any):
"""Add input subsegment as a child subsegment."""
@contextmanager
def in_subsegment_async(self, name=None, **kwargs) -> Generator[BaseSegment, None, None]:
"""Return a subsegment async context manger.
@abc.abstractmethod
def remove_subsegment(self, subsegment: Any):
"""Remove input subsegment from child subsegments."""
Parameters
----------
name: str
Subsegment name
kwargs: Optional[dict]
Optional parameters to be propagated to segment
"""

@abc.abstractmethod
def put_annotation(self, key: str, value: Union[str, numbers.Number, bool]) -> NoReturn:
"""Annotate segment or subsegment with a key-value pair.
"""Annotate current active trace entity with a key-value pair.
Note: Annotations will be indexed for later search query.
@@ -115,8 +116,9 @@ def put_annotation(self, key: str, value: Union[str, numbers.Number, bool]) -> N

@abc.abstractmethod
def put_metadata(self, key: str, value: Any, namespace: str = "default") -> NoReturn:
"""Add metadata to segment or subsegment. Metadata is not indexed
but can be later retrieved by BatchGetTraces API.
"""Add metadata to the current active trace entity.
Note: Metadata is not indexed but can be later retrieved by BatchGetTraces API.
Parameters
----------
@@ -129,17 +131,15 @@ def put_metadata(self, key: str, value: Any, namespace: str = "default") -> NoRe
"""

@abc.abstractmethod
def add_exception(self, exception: BaseException, stack: List[traceback.StackSummary], remote: bool = False):
"""Add an exception to trace entities.
def patch(self, modules: Sequence[str]) -> NoReturn:
"""Instrument a set of supported libraries
Parameters
----------
exception: Exception
Caught exception
stack: List[traceback.StackSummary]
List of traceback summaries
Output from `traceback.extract_stack()`.
remote: bool
Whether it's a client error (False) or downstream service error (True), by default False
modules: Set[str]
Set of modules to be patched
"""

@abc.abstractmethod
def patch_all(self) -> NoReturn:
"""Instrument all supported libraries"""
Loading