From 700deb1d7bf39c1fa3b4e37a7ee9731f641a3ec4 Mon Sep 17 00:00:00 2001 From: jkmathes Date: Wed, 24 Mar 2021 23:53:27 -0500 Subject: [PATCH] feat: add dynamodb storage plugin --- machine/asyncio/core.py | 5 +- machine/asyncio/plugins/builtin/fun/images.py | 5 +- machine/asyncio/storage/backends/base.py | 10 +- machine/asyncio/storage/backends/dynamodb.py | 180 ++++++ machine/asyncio/storage/backends/memory.py | 4 +- machine/asyncio/storage/backends/redis.py | 4 +- poetry.lock | 539 +++++++++++++++++- pyproject.toml | 3 + tests/asyncio/test_plugin_registration.py | 6 +- 9 files changed, 742 insertions(+), 14 deletions(-) create mode 100644 machine/asyncio/storage/backends/dynamodb.py diff --git a/machine/asyncio/core.py b/machine/asyncio/core.py index 2c66df58..c0dfed48 100644 --- a/machine/asyncio/core.py +++ b/machine/asyncio/core.py @@ -65,7 +65,7 @@ async def _setup(self) -> None: sys.exit(1) # Setup storage - self._setup_storage() + await self._setup_storage() # Setup Slack clients await self._setup_slack_clients() @@ -98,12 +98,13 @@ def _load_settings(self) -> bool: puts("Settings loaded!") return found_local_settings - def _setup_storage(self) -> None: + async def _setup_storage(self) -> None: assert self._settings is not None storage_backend = self._settings.get("STORAGE_BACKEND", "machine.storage.backends.memory.MemoryStorage") logger.debug("Initializing storage backend %s...", storage_backend) _, cls = import_string(storage_backend)[0] self._storage_backend = cls(self._settings) + await self._storage_backend.init() logger.debug("Storage backend %s initialized!", storage_backend) async def _setup_slack_clients(self) -> None: diff --git a/machine/asyncio/plugins/builtin/fun/images.py b/machine/asyncio/plugins/builtin/fun/images.py index 406125f0..8793ddcd 100644 --- a/machine/asyncio/plugins/builtin/fun/images.py +++ b/machine/asyncio/plugins/builtin/fun/images.py @@ -1,3 +1,4 @@ +from __future__ import annotations import logging import random @@ -11,7 +12,9 @@ def _make_blocks(search_string: str, image_url: str) -> list[Block]: - blocks = [ImageBlock(image_url=image_url, alt_text=search_string, title=PlainTextObject(text=search_string))] + blocks: list[Block] = [ + ImageBlock(image_url=image_url, alt_text=search_string, title=PlainTextObject(text=search_string)) + ] return blocks diff --git a/machine/asyncio/storage/backends/base.py b/machine/asyncio/storage/backends/base.py index 742f8acf..a993df56 100644 --- a/machine/asyncio/storage/backends/base.py +++ b/machine/asyncio/storage/backends/base.py @@ -1,6 +1,6 @@ from __future__ import annotations from abc import ABC, abstractmethod -from typing import Any +from typing import Any, Mapping class MachineBaseStorage(ABC): @@ -14,11 +14,15 @@ class MachineBaseStorage(ABC): - Namespacing of keys (so data stored by different plugins doesn't clash) """ - settings: dict[str, Any] + settings: Mapping[str, Any] - def __init__(self, settings: dict[str, Any]): + def __init__(self, settings: Mapping[str, Any]): self.settings = settings + async def init(self) -> None: + """Initialize the storage backend""" + pass + @abstractmethod async def get(self, key: str) -> bytes | None: """Retrieve data by key diff --git a/machine/asyncio/storage/backends/dynamodb.py b/machine/asyncio/storage/backends/dynamodb.py new file mode 100644 index 00000000..6ddcd233 --- /dev/null +++ b/machine/asyncio/storage/backends/dynamodb.py @@ -0,0 +1,180 @@ +from __future__ import annotations + +import calendar +import base64 +import datetime +import logging +from contextlib import AsyncExitStack +from typing import Mapping, Any, cast + +import aioboto3 +from botocore.exceptions import ClientError +from types_aiobotocore_dynamodb.service_resource import DynamoDBServiceResource, Table + + +from machine.asyncio.storage.backends.base import MachineBaseStorage + +logger = logging.getLogger(__name__) +DEFAULT_ENCODING = "utf-8" + + +class DynamoDBStorage(MachineBaseStorage): + """ + A storage plugin to allow native slack-machine storage + into AWS DynamoDB + + Configuration of the connection to AWS itself is done via + standard environment variables or pre-written configuration + files, such as ~/.aws/config and ~/.aws/credentials. + + For local testing, the endpoint URL can be modified using + slack-machine setting `DYNAMODB_ENDPOINT_URL` + + If `DYNAMODB_CREATE_TABLE` is set within slack-machine + settings, this driver will create the table in AWS automatically + + Additionally, if you need a DynamoDB client to be customized, + a custom client can be passed in with the `DYNAMODB_CLIENT` + slack-machine setting + + Data in DynamoDB is stored as a base64 string to + avoid complications in setting and fetching (bytes) + """ + + _table: Table + _db: DynamoDBServiceResource + _context_stack: AsyncExitStack + + async def close(self) -> None: + await self._context_stack.aclose() + + def __init__(self, settings: Mapping[str, Any]): + super().__init__(settings) + + self._key_prefix = settings.get("DYNAMODB_KEY_PREFIX", "SM") + self._table_name = settings.get("DYNAMODB_TABLE_NAME", "slack-machine-state") + + async def init(self) -> None: + self._context_stack = AsyncExitStack() + session = aioboto3.Session() + args = {} + if "DYNAMODB_ENDPOINT_URL" in self.settings: + args["endpoint_url"] = self.settings["DYNAMODB_ENDPOINT_URL"] + + if "DYNAMODB_CLIENT" in self.settings: + self._db = self.settings["DYNAMODB_CLIENT"] + else: + self._db = await self._context_stack.enter_async_context(session.resource("dynamodb", **args)) + + create_table = self.settings.get("DYNAMODB_CREATE_TABLE", False) + if create_table: + try: + await self._db.create_table( + TableName=self._table_name, + KeySchema=[{"AttributeName": "sm-key", "KeyType": "HASH"}], + AttributeDefinitions=[{"AttributeName": "sm-key", "AttributeType": "S"}], + BillingMode="PAY_PER_REQUEST", + ) + self._table = await self._db.Table(self._table_name) + await self._table.wait_until_exists() + ttl = {"Enabled": True, "AttributeName": "sm-expire"} + await self._table.meta.client.update_time_to_live( + TableName=self._table_name, TimeToLiveSpecification=ttl + ) + except ClientError as e: + if e.response["Error"]["Code"] == "ResourceInUseException": + logger.info("DynamoDB table[%s] exists, skipping creation", self._table_name) + else: + raise e + self._table = await self._db.Table(self._table_name) + + def _prefix(self, key: str) -> str: + """ + Given a slack-machine lookup key, generate a prefixed-key + to be used in the DynamoDB table lookup + + :param key: the SM key to prefix + """ + return f"{self._key_prefix}:{key}" + + async def has(self, key: str) -> bool: + """ + Check if the key exists in DynamoDB + + :param key: the SM key to check + :return: ``True/False`` whether the key exists in DynamoDB + :raises ClientError: if the client was unable to communicate with DynamoDB + """ + try: + r = await self._table.get_item(Key={"sm-key": self._prefix(key)}) + return "Item" in r + except ClientError as e: + logger.error("Unable to get item[%s]", self._prefix(key)) + raise e + + async def get(self, key: str) -> bytes | None: + """ + Retrieve item data by key + + :param key: the SM key to fetch against + :return: the raw data for the provided key, as (byte)string. Returns ``None`` when + the key is unknown or the data has expired + :raises ClientError: if the client was unable to communicate with DynamoDB + """ + try: + r = await self._table.get_item(Key={"sm-key": self._prefix(key)}) + if "Item" in r: + v = r["Item"]["sm-value"] + casted_v = cast(bytes, v) + return base64.b64decode(casted_v) + else: + return None + except ClientError as e: + logger.error("Unable to get item[%s]", self._prefix(key)) + raise e + + async def set(self, key: str, value: bytes, expires: int | None = None) -> None: + """ + Store item data by key + + :param key: the key under which to store the data + :param value: data as (byte)string + :param expires: optional expiration time in seconds, after which the + data should not be returned any more + :raises ClientError: if the client was unable to communicate with DynamoDB + """ + item: dict[str, Any] = { + "sm-key": self._prefix(key), + "sm-value": base64.b64encode(value).decode(DEFAULT_ENCODING), + } + if expires: + ttl = datetime.datetime.utcnow() + datetime.timedelta(seconds=expires) + item["sm-expire"] = calendar.timegm(ttl.timetuple()) + + try: + await self._table.put_item(Item=item) + except ClientError as e: + logger.error("Unable to set item[%s]", self._prefix(key)) + raise e + + async def delete(self, key: str) -> None: + """ + Delete item data by key + + :param key: key for which to delete the data + :raises ClientError: if the client was unable to communicate with DynamoDB + """ + try: + await self._table.delete_item(Key={"sm-key": self._prefix(key)}) + except ClientError as e: + logger.error("Unable to delete item[%s]", self._prefix(key)) + raise e + + async def size(self) -> int: + """ + Calculate the total size of the storage + + :return: total size of storage in bytes (integer) + """ + t = await self._table.meta.client.describe_table(TableName=self._table_name) + return t["Table"]["TableSizeBytes"] diff --git a/machine/asyncio/storage/backends/memory.py b/machine/asyncio/storage/backends/memory.py index bbc862d0..adfd83da 100644 --- a/machine/asyncio/storage/backends/memory.py +++ b/machine/asyncio/storage/backends/memory.py @@ -2,7 +2,7 @@ import sys from datetime import datetime, timedelta -from typing import Any, Tuple +from typing import Any, Tuple, Mapping from machine.asyncio.storage.backends.base import MachineBaseStorage @@ -10,7 +10,7 @@ class MemoryStorage(MachineBaseStorage): _storage: dict[str, Tuple[bytes, datetime | None]] - def __init__(self, settings: dict[str, Any]): + def __init__(self, settings: Mapping[str, Any]): super().__init__(settings) self._storage = {} diff --git a/machine/asyncio/storage/backends/redis.py b/machine/asyncio/storage/backends/redis.py index 10d05a63..787e6556 100644 --- a/machine/asyncio/storage/backends/redis.py +++ b/machine/asyncio/storage/backends/redis.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any +from typing import Any, Mapping from redis.asyncio import Redis @@ -11,7 +11,7 @@ class RedisStorage(MachineBaseStorage): _redis: Redis - def __init__(self, settings: dict[str, Any]): + def __init__(self, settings: Mapping[str, Any]): super().__init__(settings) self._key_prefix = settings.get("REDIS_KEY_PREFIX", "SM") redis_config = gen_config_dict(settings) diff --git a/poetry.lock b/poetry.lock index 23318f95..ac1ca090 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,3 +1,37 @@ +[[package]] +name = "aioboto3" +version = "10.0.0" +description = "Async boto3 wrapper" +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" + +[package.dependencies] +aiobotocore = {version = "2.3.4", extras = ["boto3"]} + +[package.extras] +chalice = ["chalice (>=1.24.0)"] +s3cse = ["cryptography (>=2.3.1)"] + +[[package]] +name = "aiobotocore" +version = "2.3.4" +description = "Async client for aws services using botocore and aiohttp" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +aiohttp = ">=3.3.1" +aioitertools = ">=0.5.1" +boto3 = {version = ">=1.21.21,<1.21.22", optional = true, markers = "extra == \"boto3\""} +botocore = ">=1.24.21,<1.24.22" +wrapt = ">=1.10.10" + +[package.extras] +boto3 = ["boto3 (>=1.21.21,<1.21.22)"] +awscli = ["awscli (>=1.22.76,<1.22.77)"] + [[package]] name = "aiohttp" version = "3.8.1" @@ -20,6 +54,17 @@ yarl = ">=1.0,<2.0" [package.extras] speedups = ["aiodns", "brotli", "cchardet"] +[[package]] +name = "aioitertools" +version = "0.10.0" +description = "itertools and builtins for AsyncIO and mixed iterables" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +typing_extensions = {version = ">=4.0", markers = "python_version < \"3.10\""} + [[package]] name = "aiosignal" version = "1.2.0" @@ -166,6 +211,49 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "boto3" +version = "1.21.21" +description = "The AWS SDK for Python" +category = "dev" +optional = false +python-versions = ">= 3.6" + +[package.dependencies] +botocore = ">=1.24.21,<1.25.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.5.0,<0.6.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.24.21" +description = "Low-level, data-driven core of boto 3." +category = "dev" +optional = false +python-versions = ">= 3.6" + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = ">=1.25.4,<1.27" + +[package.extras] +crt = ["awscrt (==0.13.5)"] + +[[package]] +name = "botocore-stubs" +version = "1.27.51" +description = "Type annotations and code completion for botocore" +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" + +[package.dependencies] +types-awscrt = "*" + [[package]] name = "cached-property" version = "1.5.2" @@ -493,6 +581,14 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "markdown" version = "3.4.1" @@ -975,6 +1071,20 @@ idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} [package.extras] idna2008 = ["idna"] +[[package]] +name = "s3transfer" +version = "0.5.2" +description = "An Amazon S3 Transfer Manager" +category = "dev" +optional = false +python-versions = ">= 3.6" + +[package.dependencies] +botocore = ">=1.12.36,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] + [[package]] name = "six" version = "1.16.0" @@ -1065,6 +1175,415 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "types-aiobotocore" +version = "2.3.4.post3" +description = "Type annotations for aiobotocore 2.3.4 generated with mypy-boto3-builder 7.11.3" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +botocore-stubs = "*" +types-aiobotocore-cloudformation = {version = ">=2.3.0,<2.4.0", optional = true, markers = "extra == \"essential\""} +types-aiobotocore-dynamodb = {version = ">=2.3.0,<2.4.0", optional = true, markers = "extra == \"essential\""} +types-aiobotocore-ec2 = {version = ">=2.3.0,<2.4.0", optional = true, markers = "extra == \"essential\""} +types-aiobotocore-lambda = {version = ">=2.3.0,<2.4.0", optional = true, markers = "extra == \"essential\""} +types-aiobotocore-rds = {version = ">=2.3.0,<2.4.0", optional = true, markers = "extra == \"essential\""} +types-aiobotocore-s3 = {version = ">=2.3.0,<2.4.0", optional = true, markers = "extra == \"essential\""} +types-aiobotocore-sqs = {version = ">=2.3.0,<2.4.0", optional = true, markers = "extra == \"essential\""} +typing-extensions = ">=4.1.0" + +[package.extras] +s3outposts = ["types-aiobotocore-s3outposts (>=2.3.0,<2.4.0)"] +s3control = ["types-aiobotocore-s3control (>=2.3.0,<2.4.0)"] +s3 = ["types-aiobotocore-s3 (>=2.3.0,<2.4.0)"] +rum = ["types-aiobotocore-rum (>=2.3.0,<2.4.0)"] +route53resolver = ["types-aiobotocore-route53resolver (>=2.3.0,<2.4.0)"] +route53domains = ["types-aiobotocore-route53domains (>=2.3.0,<2.4.0)"] +route53-recovery-readiness = ["types-aiobotocore-route53-recovery-readiness (>=2.3.0,<2.4.0)"] +route53-recovery-control-config = ["types-aiobotocore-route53-recovery-control-config (>=2.3.0,<2.4.0)"] +route53-recovery-cluster = ["types-aiobotocore-route53-recovery-cluster (>=2.3.0,<2.4.0)"] +route53 = ["types-aiobotocore-route53 (>=2.3.0,<2.4.0)"] +robomaker = ["types-aiobotocore-robomaker (>=2.3.0,<2.4.0)"] +resourcegroupstaggingapi = ["types-aiobotocore-resourcegroupstaggingapi (>=2.3.0,<2.4.0)"] +resource-groups = ["types-aiobotocore-resource-groups (>=2.3.0,<2.4.0)"] +resiliencehub = ["types-aiobotocore-resiliencehub (>=2.3.0,<2.4.0)"] +rekognition = ["types-aiobotocore-rekognition (>=2.3.0,<2.4.0)"] +redshift-data = ["types-aiobotocore-redshift-data (>=2.3.0,<2.4.0)"] +redshift = ["types-aiobotocore-redshift (>=2.3.0,<2.4.0)"] +rds-data = ["types-aiobotocore-rds-data (>=2.3.0,<2.4.0)"] +rds = ["types-aiobotocore-rds (>=2.3.0,<2.4.0)"] +rbin = ["types-aiobotocore-rbin (>=2.3.0,<2.4.0)"] +ram = ["types-aiobotocore-ram (>=2.3.0,<2.4.0)"] +quicksight = ["types-aiobotocore-quicksight (>=2.3.0,<2.4.0)"] +qldb-session = ["types-aiobotocore-qldb-session (>=2.3.0,<2.4.0)"] +qldb = ["types-aiobotocore-qldb (>=2.3.0,<2.4.0)"] +proton = ["types-aiobotocore-proton (>=2.3.0,<2.4.0)"] +pricing = ["types-aiobotocore-pricing (>=2.3.0,<2.4.0)"] +polly = ["types-aiobotocore-polly (>=2.3.0,<2.4.0)"] +pinpoint-sms-voice = ["types-aiobotocore-pinpoint-sms-voice (>=2.3.0,<2.4.0)"] +pinpoint-email = ["types-aiobotocore-pinpoint-email (>=2.3.0,<2.4.0)"] +pinpoint = ["types-aiobotocore-pinpoint (>=2.3.0,<2.4.0)"] +pi = ["types-aiobotocore-pi (>=2.3.0,<2.4.0)"] +personalize-runtime = ["types-aiobotocore-personalize-runtime (>=2.3.0,<2.4.0)"] +personalize-events = ["types-aiobotocore-personalize-events (>=2.3.0,<2.4.0)"] +personalize = ["types-aiobotocore-personalize (>=2.3.0,<2.4.0)"] +panorama = ["types-aiobotocore-panorama (>=2.3.0,<2.4.0)"] +outposts = ["types-aiobotocore-outposts (>=2.3.0,<2.4.0)"] +organizations = ["types-aiobotocore-organizations (>=2.3.0,<2.4.0)"] +opsworkscm = ["types-aiobotocore-opsworkscm (>=2.3.0,<2.4.0)"] +opsworks = ["types-aiobotocore-opsworks (>=2.3.0,<2.4.0)"] +opensearch = ["types-aiobotocore-opensearch (>=2.3.0,<2.4.0)"] +nimble = ["types-aiobotocore-nimble (>=2.3.0,<2.4.0)"] +networkmanager = ["types-aiobotocore-networkmanager (>=2.3.0,<2.4.0)"] +network-firewall = ["types-aiobotocore-network-firewall (>=2.3.0,<2.4.0)"] +neptune = ["types-aiobotocore-neptune (>=2.3.0,<2.4.0)"] +mwaa = ["types-aiobotocore-mwaa (>=2.3.0,<2.4.0)"] +mturk = ["types-aiobotocore-mturk (>=2.3.0,<2.4.0)"] +mq = ["types-aiobotocore-mq (>=2.3.0,<2.4.0)"] +mobile = ["types-aiobotocore-mobile (>=2.3.0,<2.4.0)"] +migrationhubstrategy = ["types-aiobotocore-migrationhubstrategy (>=2.3.0,<2.4.0)"] +migrationhub-config = ["types-aiobotocore-migrationhub-config (>=2.3.0,<2.4.0)"] +migration-hub-refactor-spaces = ["types-aiobotocore-migration-hub-refactor-spaces (>=2.3.0,<2.4.0)"] +mgn = ["types-aiobotocore-mgn (>=2.3.0,<2.4.0)"] +mgh = ["types-aiobotocore-mgh (>=2.3.0,<2.4.0)"] +meteringmarketplace = ["types-aiobotocore-meteringmarketplace (>=2.3.0,<2.4.0)"] +memorydb = ["types-aiobotocore-memorydb (>=2.3.0,<2.4.0)"] +mediatailor = ["types-aiobotocore-mediatailor (>=2.3.0,<2.4.0)"] +mediastore-data = ["types-aiobotocore-mediastore-data (>=2.3.0,<2.4.0)"] +mediastore = ["types-aiobotocore-mediastore (>=2.3.0,<2.4.0)"] +mediapackage-vod = ["types-aiobotocore-mediapackage-vod (>=2.3.0,<2.4.0)"] +mediapackage = ["types-aiobotocore-mediapackage (>=2.3.0,<2.4.0)"] +medialive = ["types-aiobotocore-medialive (>=2.3.0,<2.4.0)"] +mediaconvert = ["types-aiobotocore-mediaconvert (>=2.3.0,<2.4.0)"] +mediaconnect = ["types-aiobotocore-mediaconnect (>=2.3.0,<2.4.0)"] +marketplacecommerceanalytics = ["types-aiobotocore-marketplacecommerceanalytics (>=2.3.0,<2.4.0)"] +marketplace-entitlement = ["types-aiobotocore-marketplace-entitlement (>=2.3.0,<2.4.0)"] +marketplace-catalog = ["types-aiobotocore-marketplace-catalog (>=2.3.0,<2.4.0)"] +managedblockchain = ["types-aiobotocore-managedblockchain (>=2.3.0,<2.4.0)"] +macie2 = ["types-aiobotocore-macie2 (>=2.3.0,<2.4.0)"] +macie = ["types-aiobotocore-macie (>=2.3.0,<2.4.0)"] +machinelearning = ["types-aiobotocore-machinelearning (>=2.3.0,<2.4.0)"] +lookoutvision = ["types-aiobotocore-lookoutvision (>=2.3.0,<2.4.0)"] +lookoutmetrics = ["types-aiobotocore-lookoutmetrics (>=2.3.0,<2.4.0)"] +lookoutequipment = ["types-aiobotocore-lookoutequipment (>=2.3.0,<2.4.0)"] +logs = ["types-aiobotocore-logs (>=2.3.0,<2.4.0)"] +location = ["types-aiobotocore-location (>=2.3.0,<2.4.0)"] +lightsail = ["types-aiobotocore-lightsail (>=2.3.0,<2.4.0)"] +license-manager = ["types-aiobotocore-license-manager (>=2.3.0,<2.4.0)"] +lexv2-runtime = ["types-aiobotocore-lexv2-runtime (>=2.3.0,<2.4.0)"] +lexv2-models = ["types-aiobotocore-lexv2-models (>=2.3.0,<2.4.0)"] +lex-runtime = ["types-aiobotocore-lex-runtime (>=2.3.0,<2.4.0)"] +lex-models = ["types-aiobotocore-lex-models (>=2.3.0,<2.4.0)"] +lambda = ["types-aiobotocore-lambda (>=2.3.0,<2.4.0)"] +lakeformation = ["types-aiobotocore-lakeformation (>=2.3.0,<2.4.0)"] +kms = ["types-aiobotocore-kms (>=2.3.0,<2.4.0)"] +kinesisvideo = ["types-aiobotocore-kinesisvideo (>=2.3.0,<2.4.0)"] +kinesisanalyticsv2 = ["types-aiobotocore-kinesisanalyticsv2 (>=2.3.0,<2.4.0)"] +kinesisanalytics = ["types-aiobotocore-kinesisanalytics (>=2.3.0,<2.4.0)"] +kinesis-video-signaling = ["types-aiobotocore-kinesis-video-signaling (>=2.3.0,<2.4.0)"] +kinesis-video-media = ["types-aiobotocore-kinesis-video-media (>=2.3.0,<2.4.0)"] +kinesis-video-archived-media = ["types-aiobotocore-kinesis-video-archived-media (>=2.3.0,<2.4.0)"] +kinesis = ["types-aiobotocore-kinesis (>=2.3.0,<2.4.0)"] +keyspaces = ["types-aiobotocore-keyspaces (>=2.3.0,<2.4.0)"] +kendra = ["types-aiobotocore-kendra (>=2.3.0,<2.4.0)"] +kafkaconnect = ["types-aiobotocore-kafkaconnect (>=2.3.0,<2.4.0)"] +kafka = ["types-aiobotocore-kafka (>=2.3.0,<2.4.0)"] +ivs = ["types-aiobotocore-ivs (>=2.3.0,<2.4.0)"] +iotwireless = ["types-aiobotocore-iotwireless (>=2.3.0,<2.4.0)"] +iottwinmaker = ["types-aiobotocore-iottwinmaker (>=2.3.0,<2.4.0)"] +iotthingsgraph = ["types-aiobotocore-iotthingsgraph (>=2.3.0,<2.4.0)"] +iotsitewise = ["types-aiobotocore-iotsitewise (>=2.3.0,<2.4.0)"] +iotsecuretunneling = ["types-aiobotocore-iotsecuretunneling (>=2.3.0,<2.4.0)"] +iotfleethub = ["types-aiobotocore-iotfleethub (>=2.3.0,<2.4.0)"] +iotevents-data = ["types-aiobotocore-iotevents-data (>=2.3.0,<2.4.0)"] +iotevents = ["types-aiobotocore-iotevents (>=2.3.0,<2.4.0)"] +iotdeviceadvisor = ["types-aiobotocore-iotdeviceadvisor (>=2.3.0,<2.4.0)"] +iotanalytics = ["types-aiobotocore-iotanalytics (>=2.3.0,<2.4.0)"] +iot1click-projects = ["types-aiobotocore-iot1click-projects (>=2.3.0,<2.4.0)"] +iot1click-devices = ["types-aiobotocore-iot1click-devices (>=2.3.0,<2.4.0)"] +iot-jobs-data = ["types-aiobotocore-iot-jobs-data (>=2.3.0,<2.4.0)"] +iot-data = ["types-aiobotocore-iot-data (>=2.3.0,<2.4.0)"] +iot = ["types-aiobotocore-iot (>=2.3.0,<2.4.0)"] +xray = ["types-aiobotocore-xray (>=2.3.0,<2.4.0)"] +workspaces-web = ["types-aiobotocore-workspaces-web (>=2.3.0,<2.4.0)"] +workspaces = ["types-aiobotocore-workspaces (>=2.3.0,<2.4.0)"] +workmailmessageflow = ["types-aiobotocore-workmailmessageflow (>=2.3.0,<2.4.0)"] +workmail = ["types-aiobotocore-workmail (>=2.3.0,<2.4.0)"] +worklink = ["types-aiobotocore-worklink (>=2.3.0,<2.4.0)"] +workdocs = ["types-aiobotocore-workdocs (>=2.3.0,<2.4.0)"] +wisdom = ["types-aiobotocore-wisdom (>=2.3.0,<2.4.0)"] +wellarchitected = ["types-aiobotocore-wellarchitected (>=2.3.0,<2.4.0)"] +wafv2 = ["types-aiobotocore-wafv2 (>=2.3.0,<2.4.0)"] +waf-regional = ["types-aiobotocore-waf-regional (>=2.3.0,<2.4.0)"] +waf = ["types-aiobotocore-waf (>=2.3.0,<2.4.0)"] +voice-id = ["types-aiobotocore-voice-id (>=2.3.0,<2.4.0)"] +translate = ["types-aiobotocore-translate (>=2.3.0,<2.4.0)"] +transfer = ["types-aiobotocore-transfer (>=2.3.0,<2.4.0)"] +transcribe = ["types-aiobotocore-transcribe (>=2.3.0,<2.4.0)"] +timestream-write = ["types-aiobotocore-timestream-write (>=2.3.0,<2.4.0)"] +timestream-query = ["types-aiobotocore-timestream-query (>=2.3.0,<2.4.0)"] +textract = ["types-aiobotocore-textract (>=2.3.0,<2.4.0)"] +synthetics = ["types-aiobotocore-synthetics (>=2.3.0,<2.4.0)"] +swf = ["types-aiobotocore-swf (>=2.3.0,<2.4.0)"] +support = ["types-aiobotocore-support (>=2.3.0,<2.4.0)"] +sts = ["types-aiobotocore-sts (>=2.3.0,<2.4.0)"] +storagegateway = ["types-aiobotocore-storagegateway (>=2.3.0,<2.4.0)"] +stepfunctions = ["types-aiobotocore-stepfunctions (>=2.3.0,<2.4.0)"] +sso-oidc = ["types-aiobotocore-sso-oidc (>=2.3.0,<2.4.0)"] +sso-admin = ["types-aiobotocore-sso-admin (>=2.3.0,<2.4.0)"] +sso = ["types-aiobotocore-sso (>=2.3.0,<2.4.0)"] +ssm-incidents = ["types-aiobotocore-ssm-incidents (>=2.3.0,<2.4.0)"] +ssm-contacts = ["types-aiobotocore-ssm-contacts (>=2.3.0,<2.4.0)"] +ssm = ["types-aiobotocore-ssm (>=2.3.0,<2.4.0)"] +sqs = ["types-aiobotocore-sqs (>=2.3.0,<2.4.0)"] +sns = ["types-aiobotocore-sns (>=2.3.0,<2.4.0)"] +snowball = ["types-aiobotocore-snowball (>=2.3.0,<2.4.0)"] +snow-device-management = ["types-aiobotocore-snow-device-management (>=2.3.0,<2.4.0)"] +sms-voice = ["types-aiobotocore-sms-voice (>=2.3.0,<2.4.0)"] +sms = ["types-aiobotocore-sms (>=2.3.0,<2.4.0)"] +signer = ["types-aiobotocore-signer (>=2.3.0,<2.4.0)"] +shield = ["types-aiobotocore-shield (>=2.3.0,<2.4.0)"] +sesv2 = ["types-aiobotocore-sesv2 (>=2.3.0,<2.4.0)"] +ses = ["types-aiobotocore-ses (>=2.3.0,<2.4.0)"] +servicediscovery = ["types-aiobotocore-servicediscovery (>=2.3.0,<2.4.0)"] +servicecatalog-appregistry = ["types-aiobotocore-servicecatalog-appregistry (>=2.3.0,<2.4.0)"] +servicecatalog = ["types-aiobotocore-servicecatalog (>=2.3.0,<2.4.0)"] +service-quotas = ["types-aiobotocore-service-quotas (>=2.3.0,<2.4.0)"] +serverlessrepo = ["types-aiobotocore-serverlessrepo (>=2.3.0,<2.4.0)"] +securityhub = ["types-aiobotocore-securityhub (>=2.3.0,<2.4.0)"] +secretsmanager = ["types-aiobotocore-secretsmanager (>=2.3.0,<2.4.0)"] +sdb = ["types-aiobotocore-sdb (>=2.3.0,<2.4.0)"] +schemas = ["types-aiobotocore-schemas (>=2.3.0,<2.4.0)"] +savingsplans = ["types-aiobotocore-savingsplans (>=2.3.0,<2.4.0)"] +sagemaker-runtime = ["types-aiobotocore-sagemaker-runtime (>=2.3.0,<2.4.0)"] +sagemaker-featurestore-runtime = ["types-aiobotocore-sagemaker-featurestore-runtime (>=2.3.0,<2.4.0)"] +sagemaker-edge = ["types-aiobotocore-sagemaker-edge (>=2.3.0,<2.4.0)"] +sagemaker-a2i-runtime = ["types-aiobotocore-sagemaker-a2i-runtime (>=2.3.0,<2.4.0)"] +sagemaker = ["types-aiobotocore-sagemaker (>=2.3.0,<2.4.0)"] +inspector2 = ["types-aiobotocore-inspector2 (>=2.3.0,<2.4.0)"] +identitystore = ["types-aiobotocore-identitystore (>=2.3.0,<2.4.0)"] +iam = ["types-aiobotocore-iam (>=2.3.0,<2.4.0)"] +honeycode = ["types-aiobotocore-honeycode (>=2.3.0,<2.4.0)"] +healthlake = ["types-aiobotocore-healthlake (>=2.3.0,<2.4.0)"] +health = ["types-aiobotocore-health (>=2.3.0,<2.4.0)"] +guardduty = ["types-aiobotocore-guardduty (>=2.3.0,<2.4.0)"] +groundstation = ["types-aiobotocore-groundstation (>=2.3.0,<2.4.0)"] +greengrassv2 = ["types-aiobotocore-greengrassv2 (>=2.3.0,<2.4.0)"] +greengrass = ["types-aiobotocore-greengrass (>=2.3.0,<2.4.0)"] +grafana = ["types-aiobotocore-grafana (>=2.3.0,<2.4.0)"] +glue = ["types-aiobotocore-glue (>=2.3.0,<2.4.0)"] +globalaccelerator = ["types-aiobotocore-globalaccelerator (>=2.3.0,<2.4.0)"] +glacier = ["types-aiobotocore-glacier (>=2.3.0,<2.4.0)"] +gamelift = ["types-aiobotocore-gamelift (>=2.3.0,<2.4.0)"] +fsx = ["types-aiobotocore-fsx (>=2.3.0,<2.4.0)"] +frauddetector = ["types-aiobotocore-frauddetector (>=2.3.0,<2.4.0)"] +forecastquery = ["types-aiobotocore-forecastquery (>=2.3.0,<2.4.0)"] +forecast = ["types-aiobotocore-forecast (>=2.3.0,<2.4.0)"] +fms = ["types-aiobotocore-fms (>=2.3.0,<2.4.0)"] +fis = ["types-aiobotocore-fis (>=2.3.0,<2.4.0)"] +firehose = ["types-aiobotocore-firehose (>=2.3.0,<2.4.0)"] +finspace-data = ["types-aiobotocore-finspace-data (>=2.3.0,<2.4.0)"] +finspace = ["types-aiobotocore-finspace (>=2.3.0,<2.4.0)"] +evidently = ["types-aiobotocore-evidently (>=2.3.0,<2.4.0)"] +events = ["types-aiobotocore-events (>=2.3.0,<2.4.0)"] +essential = ["types-aiobotocore-sqs (>=2.3.0,<2.4.0)", "types-aiobotocore-s3 (>=2.3.0,<2.4.0)", "types-aiobotocore-rds (>=2.3.0,<2.4.0)", "types-aiobotocore-lambda (>=2.3.0,<2.4.0)", "types-aiobotocore-ec2 (>=2.3.0,<2.4.0)", "types-aiobotocore-dynamodb (>=2.3.0,<2.4.0)", "types-aiobotocore-cloudformation (>=2.3.0,<2.4.0)"] +es = ["types-aiobotocore-es (>=2.3.0,<2.4.0)"] +emr-containers = ["types-aiobotocore-emr-containers (>=2.3.0,<2.4.0)"] +emr = ["types-aiobotocore-emr (>=2.3.0,<2.4.0)"] +elbv2 = ["types-aiobotocore-elbv2 (>=2.3.0,<2.4.0)"] +elb = ["types-aiobotocore-elb (>=2.3.0,<2.4.0)"] +elastictranscoder = ["types-aiobotocore-elastictranscoder (>=2.3.0,<2.4.0)"] +elasticbeanstalk = ["types-aiobotocore-elasticbeanstalk (>=2.3.0,<2.4.0)"] +elasticache = ["types-aiobotocore-elasticache (>=2.3.0,<2.4.0)"] +elastic-inference = ["types-aiobotocore-elastic-inference (>=2.3.0,<2.4.0)"] +eks = ["types-aiobotocore-eks (>=2.3.0,<2.4.0)"] +efs = ["types-aiobotocore-efs (>=2.3.0,<2.4.0)"] +ecs = ["types-aiobotocore-ecs (>=2.3.0,<2.4.0)"] +ecr-public = ["types-aiobotocore-ecr-public (>=2.3.0,<2.4.0)"] +ecr = ["types-aiobotocore-ecr (>=2.3.0,<2.4.0)"] +ec2-instance-connect = ["types-aiobotocore-ec2-instance-connect (>=2.3.0,<2.4.0)"] +ec2 = ["types-aiobotocore-ec2 (>=2.3.0,<2.4.0)"] +ebs = ["types-aiobotocore-ebs (>=2.3.0,<2.4.0)"] +dynamodbstreams = ["types-aiobotocore-dynamodbstreams (>=2.3.0,<2.4.0)"] +dynamodb = ["types-aiobotocore-dynamodb (>=2.3.0,<2.4.0)"] +ds = ["types-aiobotocore-ds (>=2.3.0,<2.4.0)"] +drs = ["types-aiobotocore-drs (>=2.3.0,<2.4.0)"] +docdb = ["types-aiobotocore-docdb (>=2.3.0,<2.4.0)"] +dms = ["types-aiobotocore-dms (>=2.3.0,<2.4.0)"] +dlm = ["types-aiobotocore-dlm (>=2.3.0,<2.4.0)"] +discovery = ["types-aiobotocore-discovery (>=2.3.0,<2.4.0)"] +directconnect = ["types-aiobotocore-directconnect (>=2.3.0,<2.4.0)"] +devops-guru = ["types-aiobotocore-devops-guru (>=2.3.0,<2.4.0)"] +devicefarm = ["types-aiobotocore-devicefarm (>=2.3.0,<2.4.0)"] +detective = ["types-aiobotocore-detective (>=2.3.0,<2.4.0)"] +dax = ["types-aiobotocore-dax (>=2.3.0,<2.4.0)"] +datasync = ["types-aiobotocore-datasync (>=2.3.0,<2.4.0)"] +datapipeline = ["types-aiobotocore-datapipeline (>=2.3.0,<2.4.0)"] +dataexchange = ["types-aiobotocore-dataexchange (>=2.3.0,<2.4.0)"] +databrew = ["types-aiobotocore-databrew (>=2.3.0,<2.4.0)"] +customer-profiles = ["types-aiobotocore-customer-profiles (>=2.3.0,<2.4.0)"] +cur = ["types-aiobotocore-cur (>=2.3.0,<2.4.0)"] +connectparticipant = ["types-aiobotocore-connectparticipant (>=2.3.0,<2.4.0)"] +connect-contact-lens = ["types-aiobotocore-connect-contact-lens (>=2.3.0,<2.4.0)"] +connect = ["types-aiobotocore-connect (>=2.3.0,<2.4.0)"] +config = ["types-aiobotocore-config (>=2.3.0,<2.4.0)"] +compute-optimizer = ["types-aiobotocore-compute-optimizer (>=2.3.0,<2.4.0)"] +comprehendmedical = ["types-aiobotocore-comprehendmedical (>=2.3.0,<2.4.0)"] +comprehend = ["types-aiobotocore-comprehend (>=2.3.0,<2.4.0)"] +cognito-sync = ["types-aiobotocore-cognito-sync (>=2.3.0,<2.4.0)"] +cognito-idp = ["types-aiobotocore-cognito-idp (>=2.3.0,<2.4.0)"] +cognito-identity = ["types-aiobotocore-cognito-identity (>=2.3.0,<2.4.0)"] +codestar-notifications = ["types-aiobotocore-codestar-notifications (>=2.3.0,<2.4.0)"] +codestar-connections = ["types-aiobotocore-codestar-connections (>=2.3.0,<2.4.0)"] +codestar = ["types-aiobotocore-codestar (>=2.3.0,<2.4.0)"] +codepipeline = ["types-aiobotocore-codepipeline (>=2.3.0,<2.4.0)"] +codeguruprofiler = ["types-aiobotocore-codeguruprofiler (>=2.3.0,<2.4.0)"] +codeguru-reviewer = ["types-aiobotocore-codeguru-reviewer (>=2.3.0,<2.4.0)"] +codedeploy = ["types-aiobotocore-codedeploy (>=2.3.0,<2.4.0)"] +codecommit = ["types-aiobotocore-codecommit (>=2.3.0,<2.4.0)"] +codebuild = ["types-aiobotocore-codebuild (>=2.3.0,<2.4.0)"] +codeartifact = ["types-aiobotocore-codeartifact (>=2.3.0,<2.4.0)"] +cloudwatch = ["types-aiobotocore-cloudwatch (>=2.3.0,<2.4.0)"] +cloudtrail = ["types-aiobotocore-cloudtrail (>=2.3.0,<2.4.0)"] +cloudsearchdomain = ["types-aiobotocore-cloudsearchdomain (>=2.3.0,<2.4.0)"] +cloudsearch = ["types-aiobotocore-cloudsearch (>=2.3.0,<2.4.0)"] +cloudhsmv2 = ["types-aiobotocore-cloudhsmv2 (>=2.3.0,<2.4.0)"] +cloudhsm = ["types-aiobotocore-cloudhsm (>=2.3.0,<2.4.0)"] +cloudfront = ["types-aiobotocore-cloudfront (>=2.3.0,<2.4.0)"] +cloudformation = ["types-aiobotocore-cloudformation (>=2.3.0,<2.4.0)"] +clouddirectory = ["types-aiobotocore-clouddirectory (>=2.3.0,<2.4.0)"] +cloudcontrol = ["types-aiobotocore-cloudcontrol (>=2.3.0,<2.4.0)"] +cloud9 = ["types-aiobotocore-cloud9 (>=2.3.0,<2.4.0)"] +chime-sdk-messaging = ["types-aiobotocore-chime-sdk-messaging (>=2.3.0,<2.4.0)"] +chime-sdk-meetings = ["types-aiobotocore-chime-sdk-meetings (>=2.3.0,<2.4.0)"] +chime-sdk-identity = ["types-aiobotocore-chime-sdk-identity (>=2.3.0,<2.4.0)"] +chime = ["types-aiobotocore-chime (>=2.3.0,<2.4.0)"] +ce = ["types-aiobotocore-ce (>=2.3.0,<2.4.0)"] +budgets = ["types-aiobotocore-budgets (>=2.3.0,<2.4.0)"] +braket = ["types-aiobotocore-braket (>=2.3.0,<2.4.0)"] +billingconductor = ["types-aiobotocore-billingconductor (>=2.3.0,<2.4.0)"] +batch = ["types-aiobotocore-batch (>=2.3.0,<2.4.0)"] +backup-gateway = ["types-aiobotocore-backup-gateway (>=2.3.0,<2.4.0)"] +backup = ["types-aiobotocore-backup (>=2.3.0,<2.4.0)"] +autoscaling-plans = ["types-aiobotocore-autoscaling-plans (>=2.3.0,<2.4.0)"] +inspector = ["types-aiobotocore-inspector (>=2.3.0,<2.4.0)"] +importexport = ["types-aiobotocore-importexport (>=2.3.0,<2.4.0)"] +imagebuilder = ["types-aiobotocore-imagebuilder (>=2.3.0,<2.4.0)"] +autoscaling = ["types-aiobotocore-autoscaling (>=2.3.0,<2.4.0)"] +all = ["types-aiobotocore-kms (>=2.3.0,<2.4.0)", "types-aiobotocore-kinesisvideo (>=2.3.0,<2.4.0)", "types-aiobotocore-kinesisanalyticsv2 (>=2.3.0,<2.4.0)", "types-aiobotocore-kinesisanalytics (>=2.3.0,<2.4.0)", "types-aiobotocore-kinesis-video-signaling (>=2.3.0,<2.4.0)", "types-aiobotocore-kinesis-video-media (>=2.3.0,<2.4.0)", "types-aiobotocore-kinesis-video-archived-media (>=2.3.0,<2.4.0)", "types-aiobotocore-kinesis (>=2.3.0,<2.4.0)", "types-aiobotocore-keyspaces (>=2.3.0,<2.4.0)", "types-aiobotocore-kendra (>=2.3.0,<2.4.0)", "types-aiobotocore-kafkaconnect (>=2.3.0,<2.4.0)", "types-aiobotocore-kafka (>=2.3.0,<2.4.0)", "types-aiobotocore-ivs (>=2.3.0,<2.4.0)", "types-aiobotocore-iotwireless (>=2.3.0,<2.4.0)", "types-aiobotocore-iottwinmaker (>=2.3.0,<2.4.0)", "types-aiobotocore-iotthingsgraph (>=2.3.0,<2.4.0)", "types-aiobotocore-iotsitewise (>=2.3.0,<2.4.0)", "types-aiobotocore-iotsecuretunneling (>=2.3.0,<2.4.0)", "types-aiobotocore-iotfleethub (>=2.3.0,<2.4.0)", "types-aiobotocore-iotevents-data (>=2.3.0,<2.4.0)", "types-aiobotocore-iotevents (>=2.3.0,<2.4.0)", "types-aiobotocore-iotdeviceadvisor (>=2.3.0,<2.4.0)", "types-aiobotocore-iotanalytics (>=2.3.0,<2.4.0)", "types-aiobotocore-iot1click-projects (>=2.3.0,<2.4.0)", "types-aiobotocore-iot1click-devices (>=2.3.0,<2.4.0)", "types-aiobotocore-iot-jobs-data (>=2.3.0,<2.4.0)", "types-aiobotocore-iot-data (>=2.3.0,<2.4.0)", "types-aiobotocore-iot (>=2.3.0,<2.4.0)", "types-aiobotocore-inspector2 (>=2.3.0,<2.4.0)", "types-aiobotocore-inspector (>=2.3.0,<2.4.0)", "types-aiobotocore-importexport (>=2.3.0,<2.4.0)", "types-aiobotocore-imagebuilder (>=2.3.0,<2.4.0)", "types-aiobotocore-identitystore (>=2.3.0,<2.4.0)", "types-aiobotocore-iam (>=2.3.0,<2.4.0)", "types-aiobotocore-honeycode (>=2.3.0,<2.4.0)", "types-aiobotocore-healthlake (>=2.3.0,<2.4.0)", "types-aiobotocore-health (>=2.3.0,<2.4.0)", "types-aiobotocore-guardduty (>=2.3.0,<2.4.0)", "types-aiobotocore-groundstation (>=2.3.0,<2.4.0)", "types-aiobotocore-greengrassv2 (>=2.3.0,<2.4.0)", "types-aiobotocore-greengrass (>=2.3.0,<2.4.0)", "types-aiobotocore-grafana (>=2.3.0,<2.4.0)", "types-aiobotocore-glue (>=2.3.0,<2.4.0)", "types-aiobotocore-globalaccelerator (>=2.3.0,<2.4.0)", "types-aiobotocore-glacier (>=2.3.0,<2.4.0)", "types-aiobotocore-gamelift (>=2.3.0,<2.4.0)", "types-aiobotocore-fsx (>=2.3.0,<2.4.0)", "types-aiobotocore-frauddetector (>=2.3.0,<2.4.0)", "types-aiobotocore-forecastquery (>=2.3.0,<2.4.0)", "types-aiobotocore-forecast (>=2.3.0,<2.4.0)", "types-aiobotocore-fms (>=2.3.0,<2.4.0)", "types-aiobotocore-fis (>=2.3.0,<2.4.0)", "types-aiobotocore-firehose (>=2.3.0,<2.4.0)", "types-aiobotocore-finspace-data (>=2.3.0,<2.4.0)", "types-aiobotocore-finspace (>=2.3.0,<2.4.0)", "types-aiobotocore-evidently (>=2.3.0,<2.4.0)", "types-aiobotocore-events (>=2.3.0,<2.4.0)", "types-aiobotocore-es (>=2.3.0,<2.4.0)", "types-aiobotocore-emr-containers (>=2.3.0,<2.4.0)", "types-aiobotocore-emr (>=2.3.0,<2.4.0)", "types-aiobotocore-elbv2 (>=2.3.0,<2.4.0)", "types-aiobotocore-elb (>=2.3.0,<2.4.0)", "types-aiobotocore-elastictranscoder (>=2.3.0,<2.4.0)", "types-aiobotocore-elasticbeanstalk (>=2.3.0,<2.4.0)", "types-aiobotocore-elasticache (>=2.3.0,<2.4.0)", "types-aiobotocore-elastic-inference (>=2.3.0,<2.4.0)", "types-aiobotocore-eks (>=2.3.0,<2.4.0)", "types-aiobotocore-efs (>=2.3.0,<2.4.0)", "types-aiobotocore-ecs (>=2.3.0,<2.4.0)", "types-aiobotocore-ecr-public (>=2.3.0,<2.4.0)", "types-aiobotocore-ecr (>=2.3.0,<2.4.0)", "types-aiobotocore-ec2-instance-connect (>=2.3.0,<2.4.0)", "types-aiobotocore-ec2 (>=2.3.0,<2.4.0)", "types-aiobotocore-ebs (>=2.3.0,<2.4.0)", "types-aiobotocore-dynamodbstreams (>=2.3.0,<2.4.0)", "types-aiobotocore-dynamodb (>=2.3.0,<2.4.0)", "types-aiobotocore-ds (>=2.3.0,<2.4.0)", "types-aiobotocore-drs (>=2.3.0,<2.4.0)", "types-aiobotocore-docdb (>=2.3.0,<2.4.0)", "types-aiobotocore-dms (>=2.3.0,<2.4.0)", "types-aiobotocore-dlm (>=2.3.0,<2.4.0)", "types-aiobotocore-discovery (>=2.3.0,<2.4.0)", "types-aiobotocore-directconnect (>=2.3.0,<2.4.0)", "types-aiobotocore-devops-guru (>=2.3.0,<2.4.0)", "types-aiobotocore-devicefarm (>=2.3.0,<2.4.0)", "types-aiobotocore-detective (>=2.3.0,<2.4.0)", "types-aiobotocore-dax (>=2.3.0,<2.4.0)", "types-aiobotocore-datasync (>=2.3.0,<2.4.0)", "types-aiobotocore-datapipeline (>=2.3.0,<2.4.0)", "types-aiobotocore-dataexchange (>=2.3.0,<2.4.0)", "types-aiobotocore-databrew (>=2.3.0,<2.4.0)", "types-aiobotocore-customer-profiles (>=2.3.0,<2.4.0)", "types-aiobotocore-cur (>=2.3.0,<2.4.0)", "types-aiobotocore-connectparticipant (>=2.3.0,<2.4.0)", "types-aiobotocore-connect-contact-lens (>=2.3.0,<2.4.0)", "types-aiobotocore-connect (>=2.3.0,<2.4.0)", "types-aiobotocore-config (>=2.3.0,<2.4.0)", "types-aiobotocore-compute-optimizer (>=2.3.0,<2.4.0)", "types-aiobotocore-comprehendmedical (>=2.3.0,<2.4.0)", "types-aiobotocore-comprehend (>=2.3.0,<2.4.0)", "types-aiobotocore-cognito-sync (>=2.3.0,<2.4.0)", "types-aiobotocore-cognito-idp (>=2.3.0,<2.4.0)", "types-aiobotocore-cognito-identity (>=2.3.0,<2.4.0)", "types-aiobotocore-codestar-notifications (>=2.3.0,<2.4.0)", "types-aiobotocore-codestar-connections (>=2.3.0,<2.4.0)", "types-aiobotocore-codestar (>=2.3.0,<2.4.0)", "types-aiobotocore-codepipeline (>=2.3.0,<2.4.0)", "types-aiobotocore-codeguruprofiler (>=2.3.0,<2.4.0)", "types-aiobotocore-codeguru-reviewer (>=2.3.0,<2.4.0)", "types-aiobotocore-codedeploy (>=2.3.0,<2.4.0)", "types-aiobotocore-codecommit (>=2.3.0,<2.4.0)", "types-aiobotocore-xray (>=2.3.0,<2.4.0)", "types-aiobotocore-workspaces-web (>=2.3.0,<2.4.0)", "types-aiobotocore-workspaces (>=2.3.0,<2.4.0)", "types-aiobotocore-workmailmessageflow (>=2.3.0,<2.4.0)", "types-aiobotocore-workmail (>=2.3.0,<2.4.0)", "types-aiobotocore-worklink (>=2.3.0,<2.4.0)", "types-aiobotocore-workdocs (>=2.3.0,<2.4.0)", "types-aiobotocore-wisdom (>=2.3.0,<2.4.0)", "types-aiobotocore-wellarchitected (>=2.3.0,<2.4.0)", "types-aiobotocore-wafv2 (>=2.3.0,<2.4.0)", "types-aiobotocore-waf-regional (>=2.3.0,<2.4.0)", "types-aiobotocore-waf (>=2.3.0,<2.4.0)", "types-aiobotocore-voice-id (>=2.3.0,<2.4.0)", "types-aiobotocore-translate (>=2.3.0,<2.4.0)", "types-aiobotocore-transfer (>=2.3.0,<2.4.0)", "types-aiobotocore-transcribe (>=2.3.0,<2.4.0)", "types-aiobotocore-timestream-write (>=2.3.0,<2.4.0)", "types-aiobotocore-timestream-query (>=2.3.0,<2.4.0)", "types-aiobotocore-textract (>=2.3.0,<2.4.0)", "types-aiobotocore-synthetics (>=2.3.0,<2.4.0)", "types-aiobotocore-swf (>=2.3.0,<2.4.0)", "types-aiobotocore-support (>=2.3.0,<2.4.0)", "types-aiobotocore-sts (>=2.3.0,<2.4.0)", "types-aiobotocore-storagegateway (>=2.3.0,<2.4.0)", "types-aiobotocore-stepfunctions (>=2.3.0,<2.4.0)", "types-aiobotocore-sso-oidc (>=2.3.0,<2.4.0)", "types-aiobotocore-sso-admin (>=2.3.0,<2.4.0)", "types-aiobotocore-sso (>=2.3.0,<2.4.0)", "types-aiobotocore-ssm-incidents (>=2.3.0,<2.4.0)", "types-aiobotocore-ssm-contacts (>=2.3.0,<2.4.0)", "types-aiobotocore-ssm (>=2.3.0,<2.4.0)", "types-aiobotocore-sqs (>=2.3.0,<2.4.0)", "types-aiobotocore-sns (>=2.3.0,<2.4.0)", "types-aiobotocore-snowball (>=2.3.0,<2.4.0)", "types-aiobotocore-snow-device-management (>=2.3.0,<2.4.0)", "types-aiobotocore-sms-voice (>=2.3.0,<2.4.0)", "types-aiobotocore-sms (>=2.3.0,<2.4.0)", "types-aiobotocore-signer (>=2.3.0,<2.4.0)", "types-aiobotocore-shield (>=2.3.0,<2.4.0)", "types-aiobotocore-sesv2 (>=2.3.0,<2.4.0)", "types-aiobotocore-ses (>=2.3.0,<2.4.0)", "types-aiobotocore-servicediscovery (>=2.3.0,<2.4.0)", "types-aiobotocore-servicecatalog-appregistry (>=2.3.0,<2.4.0)", "types-aiobotocore-servicecatalog (>=2.3.0,<2.4.0)", "types-aiobotocore-service-quotas (>=2.3.0,<2.4.0)", "types-aiobotocore-serverlessrepo (>=2.3.0,<2.4.0)", "types-aiobotocore-securityhub (>=2.3.0,<2.4.0)", "types-aiobotocore-secretsmanager (>=2.3.0,<2.4.0)", "types-aiobotocore-sdb (>=2.3.0,<2.4.0)", "types-aiobotocore-schemas (>=2.3.0,<2.4.0)", "types-aiobotocore-savingsplans (>=2.3.0,<2.4.0)", "types-aiobotocore-sagemaker-runtime (>=2.3.0,<2.4.0)", "types-aiobotocore-sagemaker-featurestore-runtime (>=2.3.0,<2.4.0)", "types-aiobotocore-sagemaker-edge (>=2.3.0,<2.4.0)", "types-aiobotocore-sagemaker-a2i-runtime (>=2.3.0,<2.4.0)", "types-aiobotocore-sagemaker (>=2.3.0,<2.4.0)", "types-aiobotocore-s3outposts (>=2.3.0,<2.4.0)", "types-aiobotocore-s3control (>=2.3.0,<2.4.0)", "types-aiobotocore-s3 (>=2.3.0,<2.4.0)", "types-aiobotocore-rum (>=2.3.0,<2.4.0)", "types-aiobotocore-route53resolver (>=2.3.0,<2.4.0)", "types-aiobotocore-route53domains (>=2.3.0,<2.4.0)", "types-aiobotocore-route53-recovery-readiness (>=2.3.0,<2.4.0)", "types-aiobotocore-route53-recovery-control-config (>=2.3.0,<2.4.0)", "types-aiobotocore-route53-recovery-cluster (>=2.3.0,<2.4.0)", "types-aiobotocore-route53 (>=2.3.0,<2.4.0)", "types-aiobotocore-robomaker (>=2.3.0,<2.4.0)", "types-aiobotocore-resourcegroupstaggingapi (>=2.3.0,<2.4.0)", "types-aiobotocore-resource-groups (>=2.3.0,<2.4.0)", "types-aiobotocore-resiliencehub (>=2.3.0,<2.4.0)", "types-aiobotocore-rekognition (>=2.3.0,<2.4.0)", "types-aiobotocore-redshift-data (>=2.3.0,<2.4.0)", "types-aiobotocore-redshift (>=2.3.0,<2.4.0)", "types-aiobotocore-rds-data (>=2.3.0,<2.4.0)", "types-aiobotocore-rds (>=2.3.0,<2.4.0)", "types-aiobotocore-rbin (>=2.3.0,<2.4.0)", "types-aiobotocore-ram (>=2.3.0,<2.4.0)", "types-aiobotocore-quicksight (>=2.3.0,<2.4.0)", "types-aiobotocore-qldb-session (>=2.3.0,<2.4.0)", "types-aiobotocore-qldb (>=2.3.0,<2.4.0)", "types-aiobotocore-proton (>=2.3.0,<2.4.0)", "types-aiobotocore-pricing (>=2.3.0,<2.4.0)", "types-aiobotocore-polly (>=2.3.0,<2.4.0)", "types-aiobotocore-pinpoint-sms-voice (>=2.3.0,<2.4.0)", "types-aiobotocore-pinpoint-email (>=2.3.0,<2.4.0)", "types-aiobotocore-pinpoint (>=2.3.0,<2.4.0)", "types-aiobotocore-pi (>=2.3.0,<2.4.0)", "types-aiobotocore-personalize-runtime (>=2.3.0,<2.4.0)", "types-aiobotocore-personalize-events (>=2.3.0,<2.4.0)", "types-aiobotocore-personalize (>=2.3.0,<2.4.0)", "types-aiobotocore-panorama (>=2.3.0,<2.4.0)", "types-aiobotocore-outposts (>=2.3.0,<2.4.0)", "types-aiobotocore-organizations (>=2.3.0,<2.4.0)", "types-aiobotocore-opsworkscm (>=2.3.0,<2.4.0)", "types-aiobotocore-opsworks (>=2.3.0,<2.4.0)", "types-aiobotocore-opensearch (>=2.3.0,<2.4.0)", "types-aiobotocore-nimble (>=2.3.0,<2.4.0)", "types-aiobotocore-networkmanager (>=2.3.0,<2.4.0)", "types-aiobotocore-network-firewall (>=2.3.0,<2.4.0)", "types-aiobotocore-neptune (>=2.3.0,<2.4.0)", "types-aiobotocore-mwaa (>=2.3.0,<2.4.0)", "types-aiobotocore-mturk (>=2.3.0,<2.4.0)", "types-aiobotocore-mq (>=2.3.0,<2.4.0)", "types-aiobotocore-mobile (>=2.3.0,<2.4.0)", "types-aiobotocore-migrationhubstrategy (>=2.3.0,<2.4.0)", "types-aiobotocore-migrationhub-config (>=2.3.0,<2.4.0)", "types-aiobotocore-migration-hub-refactor-spaces (>=2.3.0,<2.4.0)", "types-aiobotocore-mgn (>=2.3.0,<2.4.0)", "types-aiobotocore-mgh (>=2.3.0,<2.4.0)", "types-aiobotocore-meteringmarketplace (>=2.3.0,<2.4.0)", "types-aiobotocore-memorydb (>=2.3.0,<2.4.0)", "types-aiobotocore-mediatailor (>=2.3.0,<2.4.0)", "types-aiobotocore-mediastore-data (>=2.3.0,<2.4.0)", "types-aiobotocore-mediastore (>=2.3.0,<2.4.0)", "types-aiobotocore-mediapackage-vod (>=2.3.0,<2.4.0)", "types-aiobotocore-mediapackage (>=2.3.0,<2.4.0)", "types-aiobotocore-medialive (>=2.3.0,<2.4.0)", "types-aiobotocore-mediaconvert (>=2.3.0,<2.4.0)", "types-aiobotocore-mediaconnect (>=2.3.0,<2.4.0)", "types-aiobotocore-marketplacecommerceanalytics (>=2.3.0,<2.4.0)", "types-aiobotocore-marketplace-entitlement (>=2.3.0,<2.4.0)", "types-aiobotocore-marketplace-catalog (>=2.3.0,<2.4.0)", "types-aiobotocore-managedblockchain (>=2.3.0,<2.4.0)", "types-aiobotocore-macie2 (>=2.3.0,<2.4.0)", "types-aiobotocore-macie (>=2.3.0,<2.4.0)", "types-aiobotocore-machinelearning (>=2.3.0,<2.4.0)", "types-aiobotocore-lookoutvision (>=2.3.0,<2.4.0)", "types-aiobotocore-lookoutmetrics (>=2.3.0,<2.4.0)", "types-aiobotocore-lookoutequipment (>=2.3.0,<2.4.0)", "types-aiobotocore-logs (>=2.3.0,<2.4.0)", "types-aiobotocore-location (>=2.3.0,<2.4.0)", "types-aiobotocore-lightsail (>=2.3.0,<2.4.0)", "types-aiobotocore-license-manager (>=2.3.0,<2.4.0)", "types-aiobotocore-lexv2-runtime (>=2.3.0,<2.4.0)", "types-aiobotocore-lexv2-models (>=2.3.0,<2.4.0)", "types-aiobotocore-lex-runtime (>=2.3.0,<2.4.0)", "types-aiobotocore-lex-models (>=2.3.0,<2.4.0)", "types-aiobotocore-lambda (>=2.3.0,<2.4.0)", "types-aiobotocore-lakeformation (>=2.3.0,<2.4.0)", "types-aiobotocore-codebuild (>=2.3.0,<2.4.0)", "types-aiobotocore-codeartifact (>=2.3.0,<2.4.0)", "types-aiobotocore-cloudwatch (>=2.3.0,<2.4.0)", "types-aiobotocore-cloudtrail (>=2.3.0,<2.4.0)", "types-aiobotocore-cloudsearchdomain (>=2.3.0,<2.4.0)", "types-aiobotocore-cloudsearch (>=2.3.0,<2.4.0)", "types-aiobotocore-cloudhsmv2 (>=2.3.0,<2.4.0)", "types-aiobotocore-cloudhsm (>=2.3.0,<2.4.0)", "types-aiobotocore-cloudfront (>=2.3.0,<2.4.0)", "types-aiobotocore-cloudformation (>=2.3.0,<2.4.0)", "types-aiobotocore-clouddirectory (>=2.3.0,<2.4.0)", "types-aiobotocore-cloudcontrol (>=2.3.0,<2.4.0)", "types-aiobotocore-cloud9 (>=2.3.0,<2.4.0)", "types-aiobotocore-chime-sdk-messaging (>=2.3.0,<2.4.0)", "types-aiobotocore-chime-sdk-meetings (>=2.3.0,<2.4.0)", "types-aiobotocore-chime-sdk-identity (>=2.3.0,<2.4.0)", "types-aiobotocore-chime (>=2.3.0,<2.4.0)", "types-aiobotocore-ce (>=2.3.0,<2.4.0)", "types-aiobotocore-budgets (>=2.3.0,<2.4.0)", "types-aiobotocore-braket (>=2.3.0,<2.4.0)", "types-aiobotocore-billingconductor (>=2.3.0,<2.4.0)", "types-aiobotocore-batch (>=2.3.0,<2.4.0)", "types-aiobotocore-backup-gateway (>=2.3.0,<2.4.0)", "types-aiobotocore-backup (>=2.3.0,<2.4.0)", "types-aiobotocore-autoscaling-plans (>=2.3.0,<2.4.0)", "types-aiobotocore-autoscaling (>=2.3.0,<2.4.0)", "types-aiobotocore-auditmanager (>=2.3.0,<2.4.0)", "types-aiobotocore-athena (>=2.3.0,<2.4.0)", "types-aiobotocore-appsync (>=2.3.0,<2.4.0)", "types-aiobotocore-appstream (>=2.3.0,<2.4.0)", "types-aiobotocore-apprunner (>=2.3.0,<2.4.0)", "types-aiobotocore-appmesh (>=2.3.0,<2.4.0)", "types-aiobotocore-applicationcostprofiler (>=2.3.0,<2.4.0)", "types-aiobotocore-application-insights (>=2.3.0,<2.4.0)", "types-aiobotocore-application-autoscaling (>=2.3.0,<2.4.0)", "types-aiobotocore-appintegrations (>=2.3.0,<2.4.0)", "types-aiobotocore-appflow (>=2.3.0,<2.4.0)", "types-aiobotocore-appconfigdata (>=2.3.0,<2.4.0)", "types-aiobotocore-appconfig (>=2.3.0,<2.4.0)", "types-aiobotocore-apigatewayv2 (>=2.3.0,<2.4.0)", "types-aiobotocore-apigatewaymanagementapi (>=2.3.0,<2.4.0)", "types-aiobotocore-apigateway (>=2.3.0,<2.4.0)", "types-aiobotocore-amplifyuibuilder (>=2.3.0,<2.4.0)", "types-aiobotocore-amplifybackend (>=2.3.0,<2.4.0)", "types-aiobotocore-amplify (>=2.3.0,<2.4.0)", "types-aiobotocore-amp (>=2.3.0,<2.4.0)", "types-aiobotocore-alexaforbusiness (>=2.3.0,<2.4.0)", "types-aiobotocore-acm-pca (>=2.3.0,<2.4.0)", "types-aiobotocore-acm (>=2.3.0,<2.4.0)", "types-aiobotocore-account (>=2.3.0,<2.4.0)", "types-aiobotocore-accessanalyzer (>=2.3.0,<2.4.0)"] +auditmanager = ["types-aiobotocore-auditmanager (>=2.3.0,<2.4.0)"] +athena = ["types-aiobotocore-athena (>=2.3.0,<2.4.0)"] +appsync = ["types-aiobotocore-appsync (>=2.3.0,<2.4.0)"] +appstream = ["types-aiobotocore-appstream (>=2.3.0,<2.4.0)"] +apprunner = ["types-aiobotocore-apprunner (>=2.3.0,<2.4.0)"] +appmesh = ["types-aiobotocore-appmesh (>=2.3.0,<2.4.0)"] +applicationcostprofiler = ["types-aiobotocore-applicationcostprofiler (>=2.3.0,<2.4.0)"] +application-insights = ["types-aiobotocore-application-insights (>=2.3.0,<2.4.0)"] +application-autoscaling = ["types-aiobotocore-application-autoscaling (>=2.3.0,<2.4.0)"] +appintegrations = ["types-aiobotocore-appintegrations (>=2.3.0,<2.4.0)"] +appflow = ["types-aiobotocore-appflow (>=2.3.0,<2.4.0)"] +appconfigdata = ["types-aiobotocore-appconfigdata (>=2.3.0,<2.4.0)"] +appconfig = ["types-aiobotocore-appconfig (>=2.3.0,<2.4.0)"] +apigatewayv2 = ["types-aiobotocore-apigatewayv2 (>=2.3.0,<2.4.0)"] +apigatewaymanagementapi = ["types-aiobotocore-apigatewaymanagementapi (>=2.3.0,<2.4.0)"] +apigateway = ["types-aiobotocore-apigateway (>=2.3.0,<2.4.0)"] +amplifyuibuilder = ["types-aiobotocore-amplifyuibuilder (>=2.3.0,<2.4.0)"] +amplifybackend = ["types-aiobotocore-amplifybackend (>=2.3.0,<2.4.0)"] +amplify = ["types-aiobotocore-amplify (>=2.3.0,<2.4.0)"] +amp = ["types-aiobotocore-amp (>=2.3.0,<2.4.0)"] +alexaforbusiness = ["types-aiobotocore-alexaforbusiness (>=2.3.0,<2.4.0)"] +acm-pca = ["types-aiobotocore-acm-pca (>=2.3.0,<2.4.0)"] +acm = ["types-aiobotocore-acm (>=2.3.0,<2.4.0)"] +account = ["types-aiobotocore-account (>=2.3.0,<2.4.0)"] +accessanalyzer = ["types-aiobotocore-accessanalyzer (>=2.3.0,<2.4.0)"] + +[[package]] +name = "types-aiobotocore-cloudformation" +version = "2.3.4.post3" +description = "Type annotations for aiobotocore.CloudFormation 2.3.4 service generated with mypy-boto3-builder 7.11.3" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = ">=4.1.0" + +[[package]] +name = "types-aiobotocore-dynamodb" +version = "2.3.4.post4" +description = "Type annotations for aiobotocore.DynamoDB 2.3.4 service generated with mypy-boto3-builder 7.11.4" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = ">=4.1.0" + +[[package]] +name = "types-aiobotocore-ec2" +version = "2.3.4.post3" +description = "Type annotations for aiobotocore.EC2 2.3.4 service generated with mypy-boto3-builder 7.11.3" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = ">=4.1.0" + +[[package]] +name = "types-aiobotocore-lambda" +version = "2.3.4.post3" +description = "Type annotations for aiobotocore.Lambda 2.3.4 service generated with mypy-boto3-builder 7.11.3" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = ">=4.1.0" + +[[package]] +name = "types-aiobotocore-rds" +version = "2.3.4.post3" +description = "Type annotations for aiobotocore.RDS 2.3.4 service generated with mypy-boto3-builder 7.11.3" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = ">=4.1.0" + +[[package]] +name = "types-aiobotocore-s3" +version = "2.3.4.post3" +description = "Type annotations for aiobotocore.S3 2.3.4 service generated with mypy-boto3-builder 7.11.3" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = ">=4.1.0" + +[[package]] +name = "types-aiobotocore-sqs" +version = "2.3.4.post3" +description = "Type annotations for aiobotocore.SQS 2.3.4 service generated with mypy-boto3-builder 7.11.3" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = ">=4.1.0" + +[[package]] +name = "types-awscrt" +version = "0.14.0" +description = "Type annotations and code completion for awscrt" +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" + [[package]] name = "types-redis" version = "4.3.14" @@ -1201,15 +1720,19 @@ testing = ["pytest-mypy (>=0.9.1)", "pytest-black (>=0.3.7)", "func-timeout", "j docs = ["jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "jaraco.packaging (>=9)", "sphinx"] [extras] +dynamodb = [] redis = ["redis", "hiredis"] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "f360dddd98dc332f55581e5e4a46c61e32b8b25fbba6113d8a314b9c6a7adb19" +content-hash = "13b03042a3d1f5d8fea6ebc2edcb04a8d485bb10a88f470747ad44b5292b2bb5" [metadata.files] +aioboto3 = [] +aiobotocore = [] aiohttp = [] +aioitertools = [] aiosignal = [] anyio = [] apscheduler = [] @@ -1221,6 +1744,9 @@ attrs = [] "backports.zoneinfo" = [] black = [] blinker-alt = [] +boto3 = [] +botocore = [] +botocore-stubs = [] cached-property = [] certifi = [] cfgv = [] @@ -1249,6 +1775,7 @@ importlib-resources = [] iniconfig = [] isort = [] jinja2 = [] +jmespath = [] markdown = [] markupsafe = [] mccabe = [] @@ -1288,6 +1815,7 @@ pyyaml-env-tag = [] redis = [] requests = [] rfc3986 = [] +s3transfer = [] six = [] slack-sdk = [] sniffio = [] @@ -1296,6 +1824,15 @@ tomli = [] tox = [] tox-gh-actions = [] typed-ast = [] +types-aiobotocore = [] +types-aiobotocore-cloudformation = [] +types-aiobotocore-dynamodb = [] +types-aiobotocore-ec2 = [] +types-aiobotocore-lambda = [] +types-aiobotocore-rds = [] +types-aiobotocore-s3 = [] +types-aiobotocore-sqs = [] +types-awscrt = [] types-redis = [] types-requests = [] types-urllib3 = [] diff --git a/pyproject.toml b/pyproject.toml index 4056bcd4..c16df409 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,9 +63,12 @@ types-requests = "^2.28.8" mkdocstrings = {extras = ["python"], version = "^0.19.0"} mkdocs-material = "^8.4.0" flake8 = "<4.0.1" +aioboto3 = "^10.0.0" +types-aiobotocore = {extras = ["essential"], version = "^2.3.4"} [tool.poetry.extras] redis = ["redis", "hiredis"] +dynamodb = ["boto3", "aioboto3"] [tool.poetry.scripts] slack-machine = 'machine.bin.run:main' diff --git a/tests/asyncio/test_plugin_registration.py b/tests/asyncio/test_plugin_registration.py index aaad2f64..1645f568 100644 --- a/tests/asyncio/test_plugin_registration.py +++ b/tests/asyncio/test_plugin_registration.py @@ -42,7 +42,7 @@ class C: async def test_load_and_register_plugins(settings, slack_client): machine = Machine(settings=settings) machine._client = slack_client - machine._setup_storage() + await machine._setup_storage() await machine._load_plugins() actions = machine._registered_actions @@ -71,7 +71,7 @@ async def test_load_and_register_plugins(settings, slack_client): async def test_plugin_storage_fq_plugin_name(settings, slack_client): machine = Machine(settings=settings) machine._client = slack_client - machine._setup_storage() + await machine._setup_storage() await machine._load_plugins() actions = machine._registered_actions plugin1_cls = actions.respond_to["tests.asyncio.fake_plugins:FakePlugin.respond_function-hello"].class_ @@ -84,7 +84,7 @@ async def test_plugin_storage_fq_plugin_name(settings, slack_client): async def test_plugin_init(settings, slack_client): machine = Machine(settings=settings) machine._client = slack_client - machine._setup_storage() + await machine._setup_storage() await machine._load_plugins() actions = machine._registered_actions plugin_cls = actions.listen_to["tests.asyncio.fake_plugins:FakePlugin2.another_listen_function-doit"].class_