Metadata-Version: 2.4
Name: aiomoto
Version: 0.5.3
Summary: Moto-style AWS service mocks for aiobotocore
Keywords: aws,moto,aiobotocore,asyncio,testing,mocks
Author: Owen Lamont
Author-email: Owen Lamont <owenrlamont@gmail.com>
License-Expression: MIT
License-File: LICENSE
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Natural Language :: English
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Free Threading :: 3 - Stable
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Software Development :: Testing
Requires-Dist: aiobotocore>=2.24.1,<=3.7.0
Requires-Dist: moto>=5.1.5,<=5.2.1
Requires-Dist: platformdirs>=4.0.0
Requires-Dist: moto[acm]>=5.1.5,<=5.2.1 ; extra == 'acm'
Requires-Dist: moto[acmpca]>=5.1.5,<=5.2.1 ; extra == 'acmpca'
Requires-Dist: moto[all]>=5.1.5,<=5.2.1 ; extra == 'all'
Requires-Dist: moto[amp]>=5.1.5,<=5.2.1 ; extra == 'amp'
Requires-Dist: moto[apigateway]>=5.1.5,<=5.2.1 ; extra == 'apigateway'
Requires-Dist: moto[apigatewayv2]>=5.1.5,<=5.2.1 ; extra == 'apigatewayv2'
Requires-Dist: moto[applicationautoscaling]>=5.1.5,<=5.2.1 ; extra == 'applicationautoscaling'
Requires-Dist: moto[appsync]>=5.1.5,<=5.2.1 ; extra == 'appsync'
Requires-Dist: moto[athena]>=5.1.5,<=5.2.1 ; extra == 'athena'
Requires-Dist: moto[autoscaling]>=5.1.5,<=5.2.1 ; extra == 'autoscaling'
Requires-Dist: moto[awslambda]>=5.1.5,<=5.2.1 ; extra == 'awslambda'
Requires-Dist: moto[awslambda-simple]>=5.1.5,<=5.2.1 ; extra == 'awslambda-simple'
Requires-Dist: moto[backup]>=5.1.5,<=5.2.1 ; extra == 'backup'
Requires-Dist: moto[batch]>=5.1.5,<=5.2.1 ; extra == 'batch'
Requires-Dist: moto[batch-simple]>=5.1.5,<=5.2.1 ; extra == 'batch-simple'
Requires-Dist: moto[budgets]>=5.1.5,<=5.2.1 ; extra == 'budgets'
Requires-Dist: moto[ce]>=5.1.5,<=5.2.1 ; extra == 'ce'
Requires-Dist: moto[cloudformation]>=5.1.5,<=5.2.1 ; extra == 'cloudformation'
Requires-Dist: moto[cloudfront]>=5.1.5,<=5.2.1 ; extra == 'cloudfront'
Requires-Dist: moto[cloudtrail]>=5.1.5,<=5.2.1 ; extra == 'cloudtrail'
Requires-Dist: moto[cloudwatch]>=5.1.5,<=5.2.1 ; extra == 'cloudwatch'
Requires-Dist: moto[codebuild]>=5.1.5,<=5.2.1 ; extra == 'codebuild'
Requires-Dist: moto[codecommit]>=5.1.5,<=5.2.1 ; extra == 'codecommit'
Requires-Dist: moto[codepipeline]>=5.1.5,<=5.2.1 ; extra == 'codepipeline'
Requires-Dist: moto[cognitoidentity]>=5.1.5,<=5.2.1 ; extra == 'cognitoidentity'
Requires-Dist: moto[cognitoidp]>=5.1.5,<=5.2.1 ; extra == 'cognitoidp'
Requires-Dist: moto[comprehend]>=5.1.5,<=5.2.1 ; extra == 'comprehend'
Requires-Dist: moto[config]>=5.1.5,<=5.2.1 ; extra == 'config'
Requires-Dist: moto[databrew]>=5.1.5,<=5.2.1 ; extra == 'databrew'
Requires-Dist: moto[datapipeline]>=5.1.5,<=5.2.1 ; extra == 'datapipeline'
Requires-Dist: moto[datasync]>=5.1.5,<=5.2.1 ; extra == 'datasync'
Requires-Dist: moto[dax]>=5.1.5,<=5.2.1 ; extra == 'dax'
Requires-Dist: moto[dms]>=5.1.5,<=5.2.1 ; extra == 'dms'
Requires-Dist: moto[ds]>=5.1.5,<=5.2.1 ; extra == 'ds'
Requires-Dist: moto[dynamodb]>=5.1.5,<=5.2.1 ; extra == 'dynamodb'
Requires-Dist: moto[dynamodbstreams]>=5.1.5,<=5.2.1 ; extra == 'dynamodbstreams'
Requires-Dist: moto[ebs]>=5.1.5,<=5.2.1 ; extra == 'ebs'
Requires-Dist: moto[ec2]>=5.1.5,<=5.2.1 ; extra == 'ec2'
Requires-Dist: moto[ec2instanceconnect]>=5.1.5,<=5.2.1 ; extra == 'ec2instanceconnect'
Requires-Dist: moto[ecr]>=5.1.5,<=5.2.1 ; extra == 'ecr'
Requires-Dist: moto[ecs]>=5.1.5,<=5.2.1 ; extra == 'ecs'
Requires-Dist: moto[efs]>=5.1.5,<=5.2.1 ; extra == 'efs'
Requires-Dist: moto[eks]>=5.1.5,<=5.2.1 ; extra == 'eks'
Requires-Dist: moto[elasticache]>=5.1.5,<=5.2.1 ; extra == 'elasticache'
Requires-Dist: moto[elasticbeanstalk]>=5.1.5,<=5.2.1 ; extra == 'elasticbeanstalk'
Requires-Dist: moto[elastictranscoder]>=5.1.5,<=5.2.1 ; extra == 'elastictranscoder'
Requires-Dist: moto[elb]>=5.1.5,<=5.2.1 ; extra == 'elb'
Requires-Dist: moto[elbv2]>=5.1.5,<=5.2.1 ; extra == 'elbv2'
Requires-Dist: moto[emr]>=5.1.5,<=5.2.1 ; extra == 'emr'
Requires-Dist: moto[emrcontainers]>=5.1.5,<=5.2.1 ; extra == 'emrcontainers'
Requires-Dist: moto[emrserverless]>=5.1.5,<=5.2.1 ; extra == 'emrserverless'
Requires-Dist: moto[es]>=5.1.5,<=5.2.1 ; extra == 'es'
Requires-Dist: moto[events]>=5.1.5,<=5.2.1 ; extra == 'events'
Requires-Dist: moto[firehose]>=5.1.5,<=5.2.1 ; extra == 'firehose'
Requires-Dist: moto[forecast]>=5.1.5,<=5.2.1 ; extra == 'forecast'
Requires-Dist: moto[glacier]>=5.1.5,<=5.2.1 ; extra == 'glacier'
Requires-Dist: moto[glue]>=5.1.5,<=5.2.1 ; extra == 'glue'
Requires-Dist: moto[greengrass]>=5.1.5,<=5.2.1 ; extra == 'greengrass'
Requires-Dist: moto[guardduty]>=5.1.5,<=5.2.1 ; extra == 'guardduty'
Requires-Dist: moto[iam]>=5.1.5,<=5.2.1 ; extra == 'iam'
Requires-Dist: moto[inspector2]>=5.1.5,<=5.2.1 ; extra == 'inspector2'
Requires-Dist: moto[iot]>=5.1.5,<=5.2.1 ; extra == 'iot'
Requires-Dist: moto[iotdata]>=5.1.5,<=5.2.1 ; extra == 'iotdata'
Requires-Dist: moto[ivs]>=5.1.5,<=5.2.1 ; extra == 'ivs'
Requires-Dist: moto[kinesis]>=5.1.5,<=5.2.1 ; extra == 'kinesis'
Requires-Dist: moto[kinesisvideo]>=5.1.5,<=5.2.1 ; extra == 'kinesisvideo'
Requires-Dist: moto[kinesisvideoarchivedmedia]>=5.1.5,<=5.2.1 ; extra == 'kinesisvideoarchivedmedia'
Requires-Dist: moto[kms]>=5.1.5,<=5.2.1 ; extra == 'kms'
Requires-Dist: moto[logs]>=5.1.5,<=5.2.1 ; extra == 'logs'
Requires-Dist: moto[managedblockchain]>=5.1.5,<=5.2.1 ; extra == 'managedblockchain'
Requires-Dist: moto[mediaconnect]>=5.1.5,<=5.2.1 ; extra == 'mediaconnect'
Requires-Dist: moto[medialive]>=5.1.5,<=5.2.1 ; extra == 'medialive'
Requires-Dist: moto[mediapackage]>=5.1.5,<=5.2.1 ; extra == 'mediapackage'
Requires-Dist: moto[mediastore]>=5.1.5,<=5.2.1 ; extra == 'mediastore'
Requires-Dist: moto[mediastoredata]>=5.1.5,<=5.2.1 ; extra == 'mediastoredata'
Requires-Dist: moto[meteringmarketplace]>=5.1.5,<=5.2.1 ; extra == 'meteringmarketplace'
Requires-Dist: moto[mq]>=5.1.5,<=5.2.1 ; extra == 'mq'
Requires-Dist: moto[opsworks]>=5.1.5,<=5.2.1 ; extra == 'opsworks'
Requires-Dist: moto[organizations]>=5.1.5,<=5.2.1 ; extra == 'organizations'
Requires-Dist: moto[server]>=5.1.5,<=5.2.1 ; extra == 'pandas'
Requires-Dist: pandas>=2.2.0,<=3.0.3 ; extra == 'pandas'
Requires-Dist: fsspec>=2024.6.0 ; extra == 'pandas'
Requires-Dist: s3fs>=2024.6.0 ; extra == 'pandas'
Requires-Dist: pyarrow>=22.0.0 ; extra == 'pandas'
Requires-Dist: moto[panorama]>=5.1.5,<=5.2.1 ; extra == 'panorama'
Requires-Dist: moto[personalize]>=5.1.5,<=5.2.1 ; extra == 'personalize'
Requires-Dist: moto[pinpoint]>=5.1.5,<=5.2.1 ; extra == 'pinpoint'
Requires-Dist: moto[server]>=5.1.5,<=5.2.1 ; extra == 'polars'
Requires-Dist: polars>=1.35.1,<=1.40.1 ; extra == 'polars'
Requires-Dist: moto[polly]>=5.1.5,<=5.2.1 ; extra == 'polly'
Requires-Dist: moto[proxy]>=5.1.5,<=5.2.1 ; extra == 'proxy'
Requires-Dist: moto[quicksight]>=5.1.5,<=5.2.1 ; extra == 'quicksight'
Requires-Dist: moto[ram]>=5.1.5,<=5.2.1 ; extra == 'ram'
Requires-Dist: moto[rds]>=5.1.5,<=5.2.1 ; extra == 'rds'
Requires-Dist: moto[redshift]>=5.1.5,<=5.2.1 ; extra == 'redshift'
Requires-Dist: moto[redshiftdata]>=5.1.5,<=5.2.1 ; extra == 'redshiftdata'
Requires-Dist: moto[rekognition]>=5.1.5,<=5.2.1 ; extra == 'rekognition'
Requires-Dist: moto[resourcegroups]>=5.1.5,<=5.2.1 ; extra == 'resourcegroups'
Requires-Dist: moto[resourcegroupstaggingapi]>=5.1.5,<=5.2.1 ; extra == 'resourcegroupstaggingapi'
Requires-Dist: moto[route53]>=5.1.5,<=5.2.1 ; extra == 'route53'
Requires-Dist: moto[route53resolver]>=5.1.5,<=5.2.1 ; extra == 'route53resolver'
Requires-Dist: moto[s3]>=5.1.5,<=5.2.1 ; extra == 's3'
Requires-Dist: moto[s3control]>=5.1.5,<=5.2.1 ; extra == 's3control'
Requires-Dist: moto[s3crc32c]>=5.1.5,<=5.2.1 ; extra == 's3crc32c'
Requires-Dist: moto[sagemaker]>=5.1.5,<=5.2.1 ; extra == 'sagemaker'
Requires-Dist: moto[scheduler]>=5.1.5,<=5.2.1 ; extra == 'scheduler'
Requires-Dist: moto[sdb]>=5.1.5,<=5.2.1 ; extra == 'sdb'
Requires-Dist: moto[secretsmanager]>=5.1.5,<=5.2.1 ; extra == 'secretsmanager'
Requires-Dist: moto[server]>=5.1.5,<=5.2.1 ; extra == 'server'
Requires-Dist: moto[servicediscovery]>=5.1.5,<=5.2.1 ; extra == 'servicediscovery'
Requires-Dist: moto[servicequotas]>=5.1.5,<=5.2.1 ; extra == 'servicequotas'
Requires-Dist: moto[ses]>=5.1.5,<=5.2.1 ; extra == 'ses'
Requires-Dist: moto[signer]>=5.1.5,<=5.2.1 ; extra == 'signer'
Requires-Dist: moto[sns]>=5.1.5,<=5.2.1 ; extra == 'sns'
Requires-Dist: moto[sqs]>=5.1.5,<=5.2.1 ; extra == 'sqs'
Requires-Dist: moto[ssm]>=5.1.5,<=5.2.1 ; extra == 'ssm'
Requires-Dist: moto[ssoadmin]>=5.1.5,<=5.2.1 ; extra == 'ssoadmin'
Requires-Dist: moto[stepfunctions]>=5.1.5,<=5.2.1 ; extra == 'stepfunctions'
Requires-Dist: moto[sts]>=5.1.5,<=5.2.1 ; extra == 'sts'
Requires-Dist: moto[support]>=5.1.5,<=5.2.1 ; extra == 'support'
Requires-Dist: moto[swf]>=5.1.5,<=5.2.1 ; extra == 'swf'
Requires-Dist: moto[textract]>=5.1.5,<=5.2.1 ; extra == 'textract'
Requires-Dist: moto[timestreamwrite]>=5.1.5,<=5.2.1 ; extra == 'timestreamwrite'
Requires-Dist: moto[transcribe]>=5.1.5,<=5.2.1 ; extra == 'transcribe'
Requires-Dist: moto[wafv2]>=5.1.5,<=5.2.1 ; extra == 'wafv2'
Requires-Dist: moto[xray]>=5.1.5,<=5.2.1 ; extra == 'xray'
Requires-Python: >=3.11
Project-URL: Repository, https://github.com/owenlamont/aiomoto
Project-URL: Issues, https://github.com/owenlamont/aiomoto/issues
Provides-Extra: acm
Provides-Extra: acmpca
Provides-Extra: all
Provides-Extra: amp
Provides-Extra: apigateway
Provides-Extra: apigatewayv2
Provides-Extra: applicationautoscaling
Provides-Extra: appsync
Provides-Extra: athena
Provides-Extra: autoscaling
Provides-Extra: awslambda
Provides-Extra: awslambda-simple
Provides-Extra: backup
Provides-Extra: batch
Provides-Extra: batch-simple
Provides-Extra: budgets
Provides-Extra: ce
Provides-Extra: cloudformation
Provides-Extra: cloudfront
Provides-Extra: cloudtrail
Provides-Extra: cloudwatch
Provides-Extra: codebuild
Provides-Extra: codecommit
Provides-Extra: codepipeline
Provides-Extra: cognitoidentity
Provides-Extra: cognitoidp
Provides-Extra: comprehend
Provides-Extra: config
Provides-Extra: databrew
Provides-Extra: datapipeline
Provides-Extra: datasync
Provides-Extra: dax
Provides-Extra: dms
Provides-Extra: ds
Provides-Extra: dynamodb
Provides-Extra: dynamodbstreams
Provides-Extra: ebs
Provides-Extra: ec2
Provides-Extra: ec2instanceconnect
Provides-Extra: ecr
Provides-Extra: ecs
Provides-Extra: efs
Provides-Extra: eks
Provides-Extra: elasticache
Provides-Extra: elasticbeanstalk
Provides-Extra: elastictranscoder
Provides-Extra: elb
Provides-Extra: elbv2
Provides-Extra: emr
Provides-Extra: emrcontainers
Provides-Extra: emrserverless
Provides-Extra: es
Provides-Extra: events
Provides-Extra: firehose
Provides-Extra: forecast
Provides-Extra: glacier
Provides-Extra: glue
Provides-Extra: greengrass
Provides-Extra: guardduty
Provides-Extra: iam
Provides-Extra: inspector2
Provides-Extra: iot
Provides-Extra: iotdata
Provides-Extra: ivs
Provides-Extra: kinesis
Provides-Extra: kinesisvideo
Provides-Extra: kinesisvideoarchivedmedia
Provides-Extra: kms
Provides-Extra: logs
Provides-Extra: managedblockchain
Provides-Extra: mediaconnect
Provides-Extra: medialive
Provides-Extra: mediapackage
Provides-Extra: mediastore
Provides-Extra: mediastoredata
Provides-Extra: meteringmarketplace
Provides-Extra: mq
Provides-Extra: opsworks
Provides-Extra: organizations
Provides-Extra: pandas
Provides-Extra: panorama
Provides-Extra: personalize
Provides-Extra: pinpoint
Provides-Extra: polars
Provides-Extra: polly
Provides-Extra: proxy
Provides-Extra: quicksight
Provides-Extra: ram
Provides-Extra: rds
Provides-Extra: redshift
Provides-Extra: redshiftdata
Provides-Extra: rekognition
Provides-Extra: resourcegroups
Provides-Extra: resourcegroupstaggingapi
Provides-Extra: route53
Provides-Extra: route53resolver
Provides-Extra: s3
Provides-Extra: s3control
Provides-Extra: s3crc32c
Provides-Extra: sagemaker
Provides-Extra: scheduler
Provides-Extra: sdb
Provides-Extra: secretsmanager
Provides-Extra: server
Provides-Extra: servicediscovery
Provides-Extra: servicequotas
Provides-Extra: ses
Provides-Extra: signer
Provides-Extra: sns
Provides-Extra: sqs
Provides-Extra: ssm
Provides-Extra: ssoadmin
Provides-Extra: stepfunctions
Provides-Extra: sts
Provides-Extra: support
Provides-Extra: swf
Provides-Extra: textract
Provides-Extra: timestreamwrite
Provides-Extra: transcribe
Provides-Extra: wafv2
Provides-Extra: xray
Description-Content-Type: text/markdown

# aiomoto

`aiomoto` is Moto for aiobotocore (while staying compatible with classic
botocore / boto3). It adapts Moto's stubber so async and sync clients share the same
in-memory backend: you can write to a mock S3 bucket with boto3 and read it back via
aiobotocore in the same process.

📖 **Full documentation: <https://aiomoto.pages.dev/>**

## Supported today

- `mock_aws()` usable as `with` or `async with`, guarding against real HTTP requests.
- Actively exercised in tests: S3 (CRUD + listings + streaming reads), DynamoDB
  (create/describe/put/get), Secrets Manager, SES, SNS, SQS, KMS, STS, Lambda, Events,
  Kafka/MSK, and s3fs async integration — all sharing one Moto backend between sync
  boto3/botocore and async aiobotocore clients.
- Other Moto services often work out of the box through the same patch layer; if you
  hit a service-specific gap, open an issue with a minimal repro so we can add a
  focused slice.

## Installation

```bash
pip install aiomoto
# or, in a uv project:
uv add aiomoto
```

aiomoto re-exposes Moto's service extras (for example `aiomoto[s3]`,
`aiomoto[dynamodb]`, or `aiomoto[all]`), plus aiomoto-specific extras
(`aiomoto[server]`, `aiomoto[pandas]`, `aiomoto[polars]`). See the
[installation guide](https://aiomoto.pages.dev/getting-started/installation/)
for details.

## Usage

Use `aiomoto.mock_aws` as a drop-in replacement for Moto's `mock_aws` that works
with both synchronous boto3/botocore clients and asynchronous aiobotocore clients in
the same process. It supports `with`, `async with`, and decorating sync/async
callables.

```python
import boto3
from aiobotocore.session import AioSession
from aiomoto import mock_aws


async def demo() -> None:
    async with mock_aws():
        # Write with a synchronous boto3 client.
        boto3.client("s3", region_name="us-east-1").create_bucket(Bucket="example")

        # Read it back with an async aiobotocore client.
        session = AioSession()
        async with session.create_client("s3", region_name="us-east-1") as s3:
            result = await s3.list_buckets()
            assert any(b["Name"] == "example" for b in result["Buckets"])
```

The documentation covers more:

- [Contexts and decorators](https://aiomoto.pages.dev/guides/contexts-and-decorators/)
  — `with` / `async with`, `@mock_aws`, `reset` / `remove_data`, and the
  `AWS_ENDPOINT_URL` gotcha.
- [Server mode](https://aiomoto.pages.dev/guides/server-mode/) — run a local
  Moto server, endpoint-injection modes, and attaching to an existing server.
- [Pandas and Polars](https://aiomoto.pages.dev/guides/dataframes/) — `s3://`
  DataFrame I/O.
- [Examples](https://aiomoto.pages.dev/examples/) — S3, DynamoDB, SQS, SNS,
  s3fs, and streaming reads.
- [API reference](https://aiomoto.pages.dev/reference/api/) — `mock_aws`,
  `mock_aws_decorator`, `AutoEndpointMode`, and the exception types.

## Motivation

Like many others I've wanted to use Moto with aiobotocore but found that wasn't
supported. The
[motivation page](https://aiomoto.pages.dev/about/motivation/) explains the
background and why aiomoto avoids depending on Moto's server mode by default.

## Limitations

aiomoto keeps version ranges narrow and tested together, and a few integrations
(notably pandas/polars S3 I/O) only work in server mode. See the
[limitations page](https://aiomoto.pages.dev/about/limitations/) for the full
list, including free-threaded CPython support.
