Skip to content

chore(Python): Commit project files #1916

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 3, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,9 @@ specification_compliance_report.html
/.smithy.lsp.log

# logs
*.log
*.log

# Performance testing artifacts
*.png
*.dot
*.prof
92 changes: 92 additions & 0 deletions DynamoDbEncryption/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

CORES=2

ENABLE_EXTERN_PROCESSING=1
TRANSPILE_TESTS_IN_RUST=1

include ../SharedMakefile.mk
Expand Down Expand Up @@ -99,3 +100,94 @@ SERVICE_DEPS_DynamoDbEncryptionTransforms := \
DynamoDbEncryption/dafny/DynamoDbEncryption \
DynamoDbEncryption/dafny/StructuredEncryption \
DynamoDbEncryption/dafny/DynamoDbItemEncryptor

# Python

PYTHON_MODULE_NAME=aws_dbesdk_dynamodb

TRANSLATION_RECORD_PYTHON := \
--translation-record ../submodules/MaterialProviders/StandardLibrary/runtimes/python/src/smithy_dafny_standard_library/internaldafny/generated/dafny_src-py.dtr \
--translation-record ../submodules/MaterialProviders/ComAmazonawsKms/runtimes/python/src/aws_cryptography_internal_kms/internaldafny/generated/dafny_src-py.dtr \
--translation-record ../submodules/MaterialProviders/ComAmazonawsDynamodb/runtimes/python/src/aws_cryptography_internal_dynamodb/internaldafny/generated/dafny_src-py.dtr \
--translation-record ../submodules/MaterialProviders/AwsCryptographyPrimitives/runtimes/python/src/aws_cryptography_primitives/internaldafny/generated/dafny_src-py.dtr \
--translation-record ../submodules/MaterialProviders/AwsCryptographicMaterialProviders/runtimes/python/src/aws_cryptographic_material_providers/internaldafny/generated/dafny_src-py.dtr

PYTHON_DEPENDENCY_MODULE_NAMES := \
--dependency-library-name=aws.cryptography.primitives=aws_cryptography_primitives \
--dependency-library-name=com.amazonaws.kms=aws_cryptography_internal_kms \
--dependency-library-name=com.amazonaws.dynamodb=aws_cryptography_internal_dynamodb \
--dependency-library-name=aws.cryptography.materialProviders=aws_cryptographic_material_providers \
--dependency-library-name=aws.cryptography.keyStore=aws_cryptographic_material_providers \
--dependency-library-name=aws.cryptography.dbEncryptionSdk.structuredEncryption=aws_dbesdk_dynamodb \
--dependency-library-name=aws.cryptography.dbEncryptionSdk.dynamoDb=aws_dbesdk_dynamodb \
--dependency-library-name=aws.cryptography.dbEncryptionSdk.dynamoDb.itemEncryptor=aws_dbesdk_dynamodb \
--dependency-library-name=aws.cryptography.dbEncryptionSdk.dynamoDb.transforms=aws_dbesdk_dynamodb \

# Override default test_python to run tox environment for Dafny tests
test_python:
rm -rf runtimes/python/.tox
python3 -m tox -c runtimes/python -e dafnytests --verbose

# Constants for languages that drop extern names (Python, Go)

DYNAMODB_TYPES_FILE_PATH=dafny/DynamoDbEncryption/Model/AwsCryptographyDbEncryptionSdkDynamoDbTypes.dfy
DYNAMODB_TYPES_FILE_WITH_EXTERN_STRING="module {:extern \"software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny.types\" } AwsCryptographyDbEncryptionSdkDynamoDbTypes"
DYNAMODB_TYPES_FILE_WITHOUT_EXTERN_STRING="module AwsCryptographyDbEncryptionSdkDynamoDbTypes"

DYNAMODB_INDEX_FILE_PATH=dafny/DynamoDbEncryption/src/Index.dfy
DYNAMODB_INDEX_FILE_WITH_EXTERN_STRING="module {:extern \"software.amazon.cryptography.dbencryptionsdk.dynamodb.internaldafny\" } DynamoDbEncryption"
DYNAMODB_INDEX_FILE_WITHOUT_EXTERN_STRING="module DynamoDbEncryption"

ITEMENCRYPTOR_TYPES_FILE_PATH=dafny/DynamoDbItemEncryptor/Model/AwsCryptographyDbEncryptionSdkDynamoDbItemEncryptorTypes.dfy
ITEMENCRYPTOR_TYPES_FILE_WITH_EXTERN_STRING="module {:extern \"software.amazon.cryptography.dbencryptionsdk.dynamodb.itemencryptor.internaldafny.types\" } AwsCryptographyDbEncryptionSdkDynamoDbItemEncryptorTypes"
ITEMENCRYPTOR_TYPES_FILE_WITHOUT_EXTERN_STRING="module AwsCryptographyDbEncryptionSdkDynamoDbItemEncryptorTypes"

ITEMENCRYPTOR_INDEX_FILE_PATH=dafny/DynamoDbItemEncryptor/src/Index.dfy
ITEMENCRYPTOR_INDEX_FILE_WITH_EXTERN_STRING="module {:extern \"software.amazon.cryptography.dbencryptionsdk.dynamodb.itemencryptor.internaldafny\" } DynamoDbItemEncryptor"
ITEMENCRYPTOR_INDEX_FILE_WITHOUT_EXTERN_STRING="module DynamoDbItemEncryptor"

ITEMENCRYPTOR_LEGACY_FILE_PATH=dafny/DynamoDbItemEncryptor/src/InternalLegacyOverride.dfy
ITEMENCRYPTOR_LEGACY_FILE_WITH_EXTERN_STRING="module {:extern \"software.amazon.cryptography.dbencryptionsdk.dynamodb.itemencryptor.internaldafny.legacy\"} InternalLegacyOverride {"
ITEMENCRYPTOR_LEGACY_FILE_WITHOUT_EXTERN_STRING="module InternalLegacyOverride {"

TRANSFORMS_TYPES_FILE_PATH=dafny/DynamoDbEncryptionTransforms/Model/AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes.dfy
TRANSFORMS_TYPES_FILE_WITH_EXTERN_STRING="module {:extern \"software.amazon.cryptography.dbencryptionsdk.dynamodb.transforms.internaldafny.types\" } AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes"
TRANSFORMS_TYPES_FILE_WITHOUT_EXTERN_STRING="module AwsCryptographyDbEncryptionSdkDynamoDbTransformsTypes"

TRANSFORMS_INDEX_FILE_PATH=dafny/DynamoDbEncryptionTransforms/src/Index.dfy
TRANSFORMS_INDEX_FILE_WITH_EXTERN_STRING="module {:extern \"software.amazon.cryptography.dbencryptionsdk.dynamodb.transforms.internaldafny\" } DynamoDbEncryptionTransforms"
TRANSFORMS_INDEX_FILE_WITHOUT_EXTERN_STRING="module DynamoDbEncryptionTransforms"

STRUCTUREDENCRYPTION_TYPES_FILE_PATH=dafny/StructuredEncryption/Model/AwsCryptographyDbEncryptionSdkStructuredEncryptionTypes.dfy
STRUCTUREDENCRYPTION_TYPES_FILE_WITH_EXTERN_STRING="module {:extern \"software.amazon.cryptography.dbencryptionsdk.structuredencryption.internaldafny.types\" } AwsCryptographyDbEncryptionSdkStructuredEncryptionTypes"
STRUCTUREDENCRYPTION_TYPES_FILE_WITHOUT_EXTERN_STRING="module AwsCryptographyDbEncryptionSdkStructuredEncryptionTypes"

STRUCTUREDENCRYPTION_INDEX_FILE_PATH=dafny/StructuredEncryption/src/Index.dfy
STRUCTUREDENCRYPTION_INDEX_FILE_WITH_EXTERN_STRING="module {:extern \"software.amazon.cryptography.dbencryptionsdk.structuredencryption.internaldafny\" } StructuredEncryption"
STRUCTUREDENCRYPTION_INDEX_FILE_WITHOUT_EXTERN_STRING="module StructuredEncryption"

_sed_types_file_remove_extern:
$(MAKE) _sed_file SED_FILE_PATH=$(DYNAMODB_TYPES_FILE_PATH) SED_BEFORE_STRING=$(DYNAMODB_TYPES_FILE_WITH_EXTERN_STRING) SED_AFTER_STRING=$(DYNAMODB_TYPES_FILE_WITHOUT_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(ITEMENCRYPTOR_TYPES_FILE_PATH) SED_BEFORE_STRING=$(ITEMENCRYPTOR_TYPES_FILE_WITH_EXTERN_STRING) SED_AFTER_STRING=$(ITEMENCRYPTOR_TYPES_FILE_WITHOUT_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(TRANSFORMS_TYPES_FILE_PATH) SED_BEFORE_STRING=$(TRANSFORMS_TYPES_FILE_WITH_EXTERN_STRING) SED_AFTER_STRING=$(TRANSFORMS_TYPES_FILE_WITHOUT_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(STRUCTUREDENCRYPTION_TYPES_FILE_PATH) SED_BEFORE_STRING=$(STRUCTUREDENCRYPTION_TYPES_FILE_WITH_EXTERN_STRING) SED_AFTER_STRING=$(STRUCTUREDENCRYPTION_TYPES_FILE_WITHOUT_EXTERN_STRING)

_sed_index_file_remove_extern:
$(MAKE) _sed_file SED_FILE_PATH=$(DYNAMODB_INDEX_FILE_PATH) SED_BEFORE_STRING=$(DYNAMODB_INDEX_FILE_WITH_EXTERN_STRING) SED_AFTER_STRING=$(DYNAMODB_INDEX_FILE_WITHOUT_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(ITEMENCRYPTOR_INDEX_FILE_PATH) SED_BEFORE_STRING=$(ITEMENCRYPTOR_INDEX_FILE_WITH_EXTERN_STRING) SED_AFTER_STRING=$(ITEMENCRYPTOR_INDEX_FILE_WITHOUT_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(ITEMENCRYPTOR_LEGACY_FILE_PATH) SED_BEFORE_STRING=$(ITEMENCRYPTOR_LEGACY_FILE_WITH_EXTERN_STRING) SED_AFTER_STRING=$(ITEMENCRYPTOR_LEGACY_FILE_WITHOUT_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(TRANSFORMS_INDEX_FILE_PATH) SED_BEFORE_STRING=$(TRANSFORMS_INDEX_FILE_WITH_EXTERN_STRING) SED_AFTER_STRING=$(TRANSFORMS_INDEX_FILE_WITHOUT_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(STRUCTUREDENCRYPTION_INDEX_FILE_PATH) SED_BEFORE_STRING=$(STRUCTUREDENCRYPTION_INDEX_FILE_WITH_EXTERN_STRING) SED_AFTER_STRING=$(STRUCTUREDENCRYPTION_INDEX_FILE_WITHOUT_EXTERN_STRING)

_sed_types_file_add_extern:
$(MAKE) _sed_file SED_FILE_PATH=$(DYNAMODB_TYPES_FILE_PATH) SED_BEFORE_STRING=$(DYNAMODB_TYPES_FILE_WITHOUT_EXTERN_STRING) SED_AFTER_STRING=$(DYNAMODB_TYPES_FILE_WITH_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(ITEMENCRYPTOR_TYPES_FILE_PATH) SED_BEFORE_STRING=$(ITEMENCRYPTOR_TYPES_FILE_WITHOUT_EXTERN_STRING) SED_AFTER_STRING=$(ITEMENCRYPTOR_TYPES_FILE_WITH_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(TRANSFORMS_TYPES_FILE_PATH) SED_BEFORE_STRING=$(TRANSFORMS_TYPES_FILE_WITHOUT_EXTERN_STRING) SED_AFTER_STRING=$(TRANSFORMS_TYPES_FILE_WITH_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(STRUCTUREDENCRYPTION_TYPES_FILE_PATH) SED_BEFORE_STRING=$(STRUCTUREDENCRYPTION_TYPES_FILE_WITHOUT_EXTERN_STRING) SED_AFTER_STRING=$(STRUCTUREDENCRYPTION_TYPES_FILE_WITH_EXTERN_STRING)

_sed_index_file_add_extern:
$(MAKE) _sed_file SED_FILE_PATH=$(DYNAMODB_INDEX_FILE_PATH) SED_BEFORE_STRING=$(DYNAMODB_INDEX_FILE_WITHOUT_EXTERN_STRING) SED_AFTER_STRING=$(DYNAMODB_INDEX_FILE_WITH_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(ITEMENCRYPTOR_INDEX_FILE_PATH) SED_BEFORE_STRING=$(ITEMENCRYPTOR_INDEX_FILE_WITHOUT_EXTERN_STRING) SED_AFTER_STRING=$(ITEMENCRYPTOR_INDEX_FILE_WITH_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(ITEMENCRYPTOR_LEGACY_FILE_PATH) SED_BEFORE_STRING=$(ITEMENCRYPTOR_LEGACY_FILE_WITHOUT_EXTERN_STRING) SED_AFTER_STRING=$(ITEMENCRYPTOR_LEGACY_FILE_WITH_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(TRANSFORMS_INDEX_FILE_PATH) SED_BEFORE_STRING=$(TRANSFORMS_INDEX_FILE_WITHOUT_EXTERN_STRING) SED_AFTER_STRING=$(TRANSFORMS_INDEX_FILE_WITH_EXTERN_STRING)
$(MAKE) _sed_file SED_FILE_PATH=$(STRUCTUREDENCRYPTION_INDEX_FILE_PATH) SED_BEFORE_STRING=$(STRUCTUREDENCRYPTION_INDEX_FILE_WITHOUT_EXTERN_STRING) SED_AFTER_STRING=$(STRUCTUREDENCRYPTION_INDEX_FILE_WITH_EXTERN_STRING)
17 changes: 17 additions & 0 deletions DynamoDbEncryption/runtimes/python/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Python build artifacts
__pycache__
**/__pycache__
*.pyc
src/**.egg-info/
build
poetry.lock
**/poetry.lock
dist

# Dafny-generated Python
**/internaldafny/generated

# Python test artifacts
.tox
.pytest_cache

44 changes: 44 additions & 0 deletions DynamoDbEncryption/runtimes/python/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Python AWS Database Encryption SDK for DynamoDB

[![MPL-python-tests](https://github.com/aws/aws-database-encryption-sdk-dynamodb/actions/workflows/push.yml/badge.svg)](https://github.com/aws/aws-database-encryption-sdk-dynamodb/actions/workflows/push.yml)
[![Code style: black](https://img.shields.io/badge/code_style-black-000000.svg)](https://github.com/ambv/black)
[![Documentation Status](https://readthedocs.org/projects/aws-dbesdk-dynamodb-python/badge/)](https://aws-dbesdk-dynamodb-python.readthedocs.io/en/latest/)

This is the official implementation of the AWS Database Encryption SDK for DynamoDB in Python.

The latest documentation can be found at [Read the Docs](https://aws-dbesdk-dynamodb-python.readthedocs.io/en/latest/).

Find the source code on [GitHub](https://github.com/aws/aws-database-encryption-sdk-dynamodb).

## Security

If you discover a potential security issue in this project
we ask that you notify AWS/Amazon Security via our
[vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/).
Please **do not** create a public GitHub issue.

## Getting Started

### Required Prerequisites

- Python 3.11+
- aws-cryptographic-material-providers 1.10.0+

### Installation

> **Note:**
> If you have not already installed [cryptography](https://cryptography.io/en/latest/), you might need to install additional prerequisites as
> detailed in the [cryptography installation guide](https://cryptography.io/en/latest/installation/) for your operating system.

```bash
$ pip install aws-dbesdk-dynamodb
```

### Concepts

The AWS Database Encryption SDK for DynamoDB (DBESDK-DynamoDB) is available in multiple languages.
The concepts in the Python implementation of the DBESDK-DynamoDB are the same as in other languages.
For more information on concepts in the DBESDK-DynamoDB, see the [README](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/README.md) for all languages.

DBESDK-DynamoDB uses cryptographic material providers from the AWS Cryptographic Material Providers Library (MPL).
For more information on the MPL, see its [README](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/README.md) or [readthedocs](https://aws-cryptographic-material-providers-library.readthedocs.io/en/latest/) page.
106 changes: 106 additions & 0 deletions DynamoDbEncryption/runtimes/python/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
[tool.poetry]
name = "aws-dbesdk-dynamodb"
version = "0.1.0"
description = ""
authors = ["AWS Crypto Tools <[email protected]>"]
packages = [
{ include = "aws_dbesdk_dynamodb", from = "src" },
]
# Include all of the following .gitignored files in package distributions,
# even though it is not included in version control
include = ["**/internaldafny/generated/*.py"]

[tool.poetry.dependencies]
python = "^3.11.0"
aws-cryptographic-material-providers = { path = "../../../submodules/MaterialProviders/AwsCryptographicMaterialProviders/runtimes/python", develop = false}

# Package testing

[tool.poetry.group.test]
optional = true

[tool.poetry.group.test.dependencies]
pytest = "^7.4.0"
pytest-cov = "^6"
mock = "^4.0.3"

# Package release

[tool.poetry.group.release]
optional = true

[tool.poetry.group.release.dependencies]
poetry = "1.8.3"
twine = "5.1.1"
wheel = "0.38.4"

# Package documentation

[tool.poetry.group.docs]
optional = true

[tool.poetry.group.docs.dependencies]
toml = "^0.10.2"
myst-parser = "^4"
sphinx = "^7"
sphinx_rtd_theme = "^2"

# Package linting

[tool.poetry.group.linting]
optional = true

[tool.poetry.group.linting.dependencies]
ruff = "^0.11.5"
black = "^25.1.0"

[tool.ruff]
exclude = [
# Don't bother linting Dafny-generated code
"internaldafny",
# Don't re-lint Smithy-generated code
"smithygenerated",
]
line-length=120
indent-width=4
target-version = "py311"

[tool.ruff.lint]
# Choose linting tools
select = [
# pycodestyle: spacing, line length
"E",
# pyflakes: unused imports/variables
"F",
# isort: import sorting
"I",
# pydocstyle: docstring style
"D",
]
# Ignore incompatible linting options
ignore=[
"D203", # `incorrect-blank-line-before-class`; incompatible with `no-blank-line-before-class` (D211)
"D212", # `multi-line-summary-first-line`; incompatible with `multi-line-summary-second-line` (D213)
]

[tool.ruff.lint.per-file-ignores]
"src/aws_dbesdk_dynamodb/internal/*" = [
# Ignore all "public"-related linting errors for internal modules
"D100", "D101", "D102", "D103", "D104", "D105", "D106", "D107",
# Ignore opinionated docstring linting errors for internal modules
"D205", "D400", "D401", "D403", "D404", "D415",
]
"test/*" = [
# Ignore all "public"- and docstring-related linting errors for test modules
"D100", "D101", "D102", "D103", "D104", "D105", "D106", "D107",
# Ignore opinionated docstring linting errors for test modules
"D205", "D400", "D401", "D403", "D404", "D415",
]

[tool.black]
# Don't bother linting Dafny-generated code; don't re-lint Smithy-generated code
exclude = "/(internaldafny|smithygenerated)(/|$)"

[build-system]
requires = ["poetry-core<2.0.0"]
build-backend = "poetry.core.masonry.api"
17 changes: 17 additions & 0 deletions Examples/runtimes/python/DynamoDBEncryption/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Python build artifacts
__pycache__
**/__pycache__
*.pyc
src/**.egg-info/
build
poetry.lock
**/poetry.lock
dist

# Dafny-generated Python
**/internaldafny/generated/*.py

# Python test artifacts
.tox
.pytest_cache

49 changes: 49 additions & 0 deletions Examples/runtimes/python/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
[tool.poetry]
name = "aws-dbesdk-dynamodb-examples"
version = "0.1.0"
description = ""
authors = ["AWS Crypto Tools <[email protected]>"]

[tool.poetry.dependencies]
python = "^3.11.0"
aws-dbesdk-dynamodb = { path = "../../../DynamoDbEncryption/runtimes/python", develop = false}

[tool.poetry.group.test.dependencies]
pytest = "^7.4.0"
tox = "^3"

[build-system]
requires = ["poetry-core<2.0.0"]
build-backend = "poetry.core.masonry.api"

# Package linting

[tool.poetry.group.linting]
optional = true

[tool.poetry.group.linting.dependencies]
ruff = "^0.11.5"
black = "^25.1.0"

[tool.ruff]
line-length=120
indent-width=4
target-version = "py311"

[tool.ruff.lint]
# Choose linting tools
select = [
# pycodestyle: spacing, line length
"E",
# pyflakes: unused imports/variables
"F",
# isort: import sorting
"I",
# pydocstyle: docstring style
"D",
]
# Ignore incompatible linting options
ignore=[
"D203", # `incorrect-blank-line-before-class`; incompatible with `no-blank-line-before-class` (D211)
"D212", # `multi-line-summary-first-line`; incompatible with `multi-line-summary-second-line` (D213)
]
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ You need an Amazon Web Services (AWS) account to use the DB-ESDK for DynamoDB as
- .NET
- Dafny
- Rust
- Python

# Contributing

Expand Down
Loading
Loading