diff --git a/poetry.lock b/poetry.lock index 4963390718..f55cfda000 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,6 +1,6 @@ [[package]] name = "aiopg" -version = "1.3.3" +version = "1.3.4" description = "Postgres integration with asyncio." category = "main" optional = false @@ -36,7 +36,7 @@ test = ["pycodestyle (>=2.7.0,<2.8.0)", "flake8 (>=3.9.2,<3.10.0)", "uvloop (>=0 [[package]] name = "atomicwrites" -version = "1.4.0" +version = "1.4.1" description = "Atomic file writes." category = "main" optional = false @@ -58,23 +58,22 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "aws-sam-translator" -version = "1.42.0" +version = "1.48.0" description = "AWS SAM Translator is a library that transform SAM templates into AWS CloudFormation templates" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7, <=4.0, !=4.0" [package.dependencies] -boto3 = ">=1.5,<2.0" +boto3 = ">=1.19.5,<2.0.0" jsonschema = ">=3.2,<4.0" -six = ">=1.15,<2.0" [package.extras] -dev = ["coverage (>=5.3,<6.0)", "flake8 (>=3.8.4,<3.9.0)", "tox (>=3.20.1,<3.21.0)", "pytest-cov (>=2.10.1,<2.11.0)", "pylint (>=1.7.2,<2.0)", "pyyaml (>=5.4,<6.0)", "mock (>=3.0.5,<4.0.0)", "parameterized (>=0.7.4,<0.8.0)", "click (>=7.1,<8.0)", "dateparser (>=0.7,<1.0)", "boto3 (>=1.17,<2.0)", "requests (>=2.24.0,<2.25.0)", "docopt (>=0.6.2,<0.7.0)", "pathlib2 (>=2.3.5)", "pytest (>=4.6.11,<4.7.0)", "pytest (>=6.1.1,<6.2.0)", "black (==20.8b1)"] +dev = ["coverage (>=5.3,<6.0)", "flake8 (>=3.8.4,<3.9.0)", "tox (>=3.24,<4.0)", "pytest-cov (>=2.10.1,<2.11.0)", "pytest-xdist (>=2.5,<3.0)", "pytest-env (>=0.6.2,<0.7.0)", "pylint (>=2.9.0,<2.10.0)", "pyyaml (>=5.4,<6.0)", "pytest (>=6.2.5,<6.3.0)", "parameterized (>=0.7.4,<0.8.0)", "click (>=7.1,<8.0)", "dateparser (>=0.7,<1.0)", "boto3 (>=1.23,<2)", "tenacity (>=7.0.0,<7.1.0)", "requests (>=2.24.0,<2.25.0)", "docopt (>=0.6.2,<0.7.0)", "black (==20.8b1)"] [[package]] name = "aws-xray-sdk" -version = "2.9.0" +version = "2.10.0" description = "The AWS X-Ray SDK for Python (the SDK) enables Python developers to record and emit information from within their applications to the AWS X-Ray service." category = "main" optional = false @@ -82,7 +81,6 @@ python-versions = "*" [package.dependencies] botocore = ">=1.11.3" -future = "*" wrapt = "*" [[package]] @@ -95,357 +93,374 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "boto3" -version = "1.20.40" +version = "1.24.38" description = "The AWS SDK for Python" category = "main" optional = false -python-versions = ">= 3.6" +python-versions = ">= 3.7" [package.dependencies] -botocore = ">=1.23.40,<1.24.0" -jmespath = ">=0.7.1,<1.0.0" -s3transfer = ">=0.5.0,<0.6.0" +botocore = ">=1.27.38,<1.28.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.6.0,<0.7.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.20.40" -description = "Type annotations for boto3 1.20.40, generated by mypy-boto3-builder 6.3.2" +version = "1.24.38" +description = "Type annotations for boto3 1.24.38 generated with mypy-boto3-builder 7.10.1" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] botocore-stubs = "*" +mypy-boto3-s3 = {version = ">=1.24.0,<1.25.0", optional = true, markers = "extra == \"s3\""} +types-s3transfer = "*" +typing-extensions = ">=4.1.0" [package.extras] -accessanalyzer = ["mypy-boto3-accessanalyzer (>=1.20.0)"] -account = ["mypy-boto3-account (>=1.20.0)"] -acm = ["mypy-boto3-acm (>=1.20.0)"] -acm-pca = ["mypy-boto3-acm-pca (>=1.20.0)"] -alexaforbusiness = ["mypy-boto3-alexaforbusiness (>=1.20.0)"] -all = ["mypy-boto3-accessanalyzer (>=1.20.0)", "mypy-boto3-account (>=1.20.0)", "mypy-boto3-acm (>=1.20.0)", "mypy-boto3-acm-pca (>=1.20.0)", "mypy-boto3-alexaforbusiness (>=1.20.0)", "mypy-boto3-amp (>=1.20.0)", "mypy-boto3-amplify (>=1.20.0)", "mypy-boto3-amplifybackend (>=1.20.0)", "mypy-boto3-amplifyuibuilder (>=1.20.0)", "mypy-boto3-apigateway (>=1.20.0)", "mypy-boto3-apigatewaymanagementapi (>=1.20.0)", "mypy-boto3-apigatewayv2 (>=1.20.0)", "mypy-boto3-appconfig (>=1.20.0)", "mypy-boto3-appconfigdata (>=1.20.0)", "mypy-boto3-appflow (>=1.20.0)", "mypy-boto3-appintegrations (>=1.20.0)", "mypy-boto3-application-autoscaling (>=1.20.0)", "mypy-boto3-application-insights (>=1.20.0)", "mypy-boto3-applicationcostprofiler (>=1.20.0)", "mypy-boto3-appmesh (>=1.20.0)", "mypy-boto3-apprunner (>=1.20.0)", "mypy-boto3-appstream (>=1.20.0)", "mypy-boto3-appsync (>=1.20.0)", "mypy-boto3-athena (>=1.20.0)", "mypy-boto3-auditmanager (>=1.20.0)", "mypy-boto3-autoscaling (>=1.20.0)", "mypy-boto3-autoscaling-plans (>=1.20.0)", "mypy-boto3-backup (>=1.20.0)", "mypy-boto3-backup-gateway (>=1.20.0)", "mypy-boto3-batch (>=1.20.0)", "mypy-boto3-braket (>=1.20.0)", "mypy-boto3-budgets (>=1.20.0)", "mypy-boto3-ce (>=1.20.0)", "mypy-boto3-chime (>=1.20.0)", "mypy-boto3-chime-sdk-identity (>=1.20.0)", "mypy-boto3-chime-sdk-meetings (>=1.20.0)", "mypy-boto3-chime-sdk-messaging (>=1.20.0)", "mypy-boto3-cloud9 (>=1.20.0)", "mypy-boto3-cloudcontrol (>=1.20.0)", "mypy-boto3-clouddirectory (>=1.20.0)", "mypy-boto3-cloudformation (>=1.20.0)", "mypy-boto3-cloudfront (>=1.20.0)", "mypy-boto3-cloudhsm (>=1.20.0)", "mypy-boto3-cloudhsmv2 (>=1.20.0)", "mypy-boto3-cloudsearch (>=1.20.0)", "mypy-boto3-cloudsearchdomain (>=1.20.0)", "mypy-boto3-cloudtrail (>=1.20.0)", "mypy-boto3-cloudwatch (>=1.20.0)", "mypy-boto3-codeartifact (>=1.20.0)", "mypy-boto3-codebuild (>=1.20.0)", "mypy-boto3-codecommit (>=1.20.0)", "mypy-boto3-codedeploy (>=1.20.0)", "mypy-boto3-codeguru-reviewer (>=1.20.0)", "mypy-boto3-codeguruprofiler (>=1.20.0)", "mypy-boto3-codepipeline (>=1.20.0)", "mypy-boto3-codestar (>=1.20.0)", "mypy-boto3-codestar-connections (>=1.20.0)", "mypy-boto3-codestar-notifications (>=1.20.0)", "mypy-boto3-cognito-identity (>=1.20.0)", "mypy-boto3-cognito-idp (>=1.20.0)", "mypy-boto3-cognito-sync (>=1.20.0)", "mypy-boto3-comprehend (>=1.20.0)", "mypy-boto3-comprehendmedical (>=1.20.0)", "mypy-boto3-compute-optimizer (>=1.20.0)", "mypy-boto3-config (>=1.20.0)", "mypy-boto3-connect (>=1.20.0)", "mypy-boto3-connect-contact-lens (>=1.20.0)", "mypy-boto3-connectparticipant (>=1.20.0)", "mypy-boto3-cur (>=1.20.0)", "mypy-boto3-customer-profiles (>=1.20.0)", "mypy-boto3-databrew (>=1.20.0)", "mypy-boto3-dataexchange (>=1.20.0)", "mypy-boto3-datapipeline (>=1.20.0)", "mypy-boto3-datasync (>=1.20.0)", "mypy-boto3-dax (>=1.20.0)", "mypy-boto3-detective (>=1.20.0)", "mypy-boto3-devicefarm (>=1.20.0)", "mypy-boto3-devops-guru (>=1.20.0)", "mypy-boto3-directconnect (>=1.20.0)", "mypy-boto3-discovery (>=1.20.0)", "mypy-boto3-dlm (>=1.20.0)", "mypy-boto3-dms (>=1.20.0)", "mypy-boto3-docdb (>=1.20.0)", "mypy-boto3-drs (>=1.20.0)", "mypy-boto3-ds (>=1.20.0)", "mypy-boto3-dynamodb (>=1.20.0)", "mypy-boto3-dynamodbstreams (>=1.20.0)", "mypy-boto3-ebs (>=1.20.0)", "mypy-boto3-ec2 (>=1.20.0)", "mypy-boto3-ec2-instance-connect (>=1.20.0)", "mypy-boto3-ecr (>=1.20.0)", "mypy-boto3-ecr-public (>=1.20.0)", "mypy-boto3-ecs (>=1.20.0)", "mypy-boto3-efs (>=1.20.0)", "mypy-boto3-eks (>=1.20.0)", "mypy-boto3-elastic-inference (>=1.20.0)", "mypy-boto3-elasticache (>=1.20.0)", "mypy-boto3-elasticbeanstalk (>=1.20.0)", "mypy-boto3-elastictranscoder (>=1.20.0)", "mypy-boto3-elb (>=1.20.0)", "mypy-boto3-elbv2 (>=1.20.0)", "mypy-boto3-emr (>=1.20.0)", "mypy-boto3-emr-containers (>=1.20.0)", "mypy-boto3-es (>=1.20.0)", "mypy-boto3-events (>=1.20.0)", "mypy-boto3-evidently (>=1.20.0)", "mypy-boto3-finspace (>=1.20.0)", "mypy-boto3-finspace-data (>=1.20.0)", "mypy-boto3-firehose (>=1.20.0)", "mypy-boto3-fis (>=1.20.0)", "mypy-boto3-fms (>=1.20.0)", "mypy-boto3-forecast (>=1.20.0)", "mypy-boto3-forecastquery (>=1.20.0)", "mypy-boto3-frauddetector (>=1.20.0)", "mypy-boto3-fsx (>=1.20.0)", "mypy-boto3-gamelift (>=1.20.0)", "mypy-boto3-glacier (>=1.20.0)", "mypy-boto3-globalaccelerator (>=1.20.0)", "mypy-boto3-glue (>=1.20.0)", "mypy-boto3-grafana (>=1.20.0)", "mypy-boto3-greengrass (>=1.20.0)", "mypy-boto3-greengrassv2 (>=1.20.0)", "mypy-boto3-groundstation (>=1.20.0)", "mypy-boto3-guardduty (>=1.20.0)", "mypy-boto3-health (>=1.20.0)", "mypy-boto3-healthlake (>=1.20.0)", "mypy-boto3-honeycode (>=1.20.0)", "mypy-boto3-iam (>=1.20.0)", "mypy-boto3-identitystore (>=1.20.0)", "mypy-boto3-imagebuilder (>=1.20.0)", "mypy-boto3-importexport (>=1.20.0)", "mypy-boto3-inspector (>=1.20.0)", "mypy-boto3-inspector2 (>=1.20.0)", "mypy-boto3-iot (>=1.20.0)", "mypy-boto3-iot-data (>=1.20.0)", "mypy-boto3-iot-jobs-data (>=1.20.0)", "mypy-boto3-iot1click-devices (>=1.20.0)", "mypy-boto3-iot1click-projects (>=1.20.0)", "mypy-boto3-iotanalytics (>=1.20.0)", "mypy-boto3-iotdeviceadvisor (>=1.20.0)", "mypy-boto3-iotevents (>=1.20.0)", "mypy-boto3-iotevents-data (>=1.20.0)", "mypy-boto3-iotfleethub (>=1.20.0)", "mypy-boto3-iotsecuretunneling (>=1.20.0)", "mypy-boto3-iotsitewise (>=1.20.0)", "mypy-boto3-iotthingsgraph (>=1.20.0)", "mypy-boto3-iottwinmaker (>=1.20.0)", "mypy-boto3-iotwireless (>=1.20.0)", "mypy-boto3-ivs (>=1.20.0)", "mypy-boto3-kafka (>=1.20.0)", "mypy-boto3-kafkaconnect (>=1.20.0)", "mypy-boto3-kendra (>=1.20.0)", "mypy-boto3-kinesis (>=1.20.0)", "mypy-boto3-kinesis-video-archived-media (>=1.20.0)", "mypy-boto3-kinesis-video-media (>=1.20.0)", "mypy-boto3-kinesis-video-signaling (>=1.20.0)", "mypy-boto3-kinesisanalytics (>=1.20.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.20.0)", "mypy-boto3-kinesisvideo (>=1.20.0)", "mypy-boto3-kms (>=1.20.0)", "mypy-boto3-lakeformation (>=1.20.0)", "mypy-boto3-lambda (>=1.20.0)", "mypy-boto3-lex-models (>=1.20.0)", "mypy-boto3-lex-runtime (>=1.20.0)", "mypy-boto3-lexv2-models (>=1.20.0)", "mypy-boto3-lexv2-runtime (>=1.20.0)", "mypy-boto3-license-manager (>=1.20.0)", "mypy-boto3-lightsail (>=1.20.0)", "mypy-boto3-location (>=1.20.0)", "mypy-boto3-logs (>=1.20.0)", "mypy-boto3-lookoutequipment (>=1.20.0)", "mypy-boto3-lookoutmetrics (>=1.20.0)", "mypy-boto3-lookoutvision (>=1.20.0)", "mypy-boto3-machinelearning (>=1.20.0)", "mypy-boto3-macie (>=1.20.0)", "mypy-boto3-macie2 (>=1.20.0)", "mypy-boto3-managedblockchain (>=1.20.0)", "mypy-boto3-marketplace-catalog (>=1.20.0)", "mypy-boto3-marketplace-entitlement (>=1.20.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.20.0)", "mypy-boto3-mediaconnect (>=1.20.0)", "mypy-boto3-mediaconvert (>=1.20.0)", "mypy-boto3-medialive (>=1.20.0)", "mypy-boto3-mediapackage (>=1.20.0)", "mypy-boto3-mediapackage-vod (>=1.20.0)", "mypy-boto3-mediastore (>=1.20.0)", "mypy-boto3-mediastore-data (>=1.20.0)", "mypy-boto3-mediatailor (>=1.20.0)", "mypy-boto3-memorydb (>=1.20.0)", "mypy-boto3-meteringmarketplace (>=1.20.0)", "mypy-boto3-mgh (>=1.20.0)", "mypy-boto3-mgn (>=1.20.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.20.0)", "mypy-boto3-migrationhub-config (>=1.20.0)", "mypy-boto3-migrationhubstrategy (>=1.20.0)", "mypy-boto3-mobile (>=1.20.0)", "mypy-boto3-mq (>=1.20.0)", "mypy-boto3-mturk (>=1.20.0)", "mypy-boto3-mwaa (>=1.20.0)", "mypy-boto3-neptune (>=1.20.0)", "mypy-boto3-network-firewall (>=1.20.0)", "mypy-boto3-networkmanager (>=1.20.0)", "mypy-boto3-nimble (>=1.20.0)", "mypy-boto3-opensearch (>=1.20.0)", "mypy-boto3-opsworks (>=1.20.0)", "mypy-boto3-opsworkscm (>=1.20.0)", "mypy-boto3-organizations (>=1.20.0)", "mypy-boto3-outposts (>=1.20.0)", "mypy-boto3-panorama (>=1.20.0)", "mypy-boto3-personalize (>=1.20.0)", "mypy-boto3-personalize-events (>=1.20.0)", "mypy-boto3-personalize-runtime (>=1.20.0)", "mypy-boto3-pi (>=1.20.0)", "mypy-boto3-pinpoint (>=1.20.0)", "mypy-boto3-pinpoint-email (>=1.20.0)", "mypy-boto3-pinpoint-sms-voice (>=1.20.0)", "mypy-boto3-polly (>=1.20.0)", "mypy-boto3-pricing (>=1.20.0)", "mypy-boto3-proton (>=1.20.0)", "mypy-boto3-qldb (>=1.20.0)", "mypy-boto3-qldb-session (>=1.20.0)", "mypy-boto3-quicksight (>=1.20.0)", "mypy-boto3-ram (>=1.20.0)", "mypy-boto3-rbin (>=1.20.0)", "mypy-boto3-rds (>=1.20.0)", "mypy-boto3-rds-data (>=1.20.0)", "mypy-boto3-redshift (>=1.20.0)", "mypy-boto3-redshift-data (>=1.20.0)", "mypy-boto3-rekognition (>=1.20.0)", "mypy-boto3-resiliencehub (>=1.20.0)", "mypy-boto3-resource-groups (>=1.20.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.20.0)", "mypy-boto3-robomaker (>=1.20.0)", "mypy-boto3-route53 (>=1.20.0)", "mypy-boto3-route53-recovery-cluster (>=1.20.0)", "mypy-boto3-route53-recovery-control-config (>=1.20.0)", "mypy-boto3-route53-recovery-readiness (>=1.20.0)", "mypy-boto3-route53domains (>=1.20.0)", "mypy-boto3-route53resolver (>=1.20.0)", "mypy-boto3-rum (>=1.20.0)", "mypy-boto3-s3 (>=1.20.0)", "mypy-boto3-s3control (>=1.20.0)", "mypy-boto3-s3outposts (>=1.20.0)", "mypy-boto3-sagemaker (>=1.20.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.20.0)", "mypy-boto3-sagemaker-edge (>=1.20.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.20.0)", "mypy-boto3-sagemaker-runtime (>=1.20.0)", "mypy-boto3-savingsplans (>=1.20.0)", "mypy-boto3-schemas (>=1.20.0)", "mypy-boto3-sdb (>=1.20.0)", "mypy-boto3-secretsmanager (>=1.20.0)", "mypy-boto3-securityhub (>=1.20.0)", "mypy-boto3-serverlessrepo (>=1.20.0)", "mypy-boto3-service-quotas (>=1.20.0)", "mypy-boto3-servicecatalog (>=1.20.0)", "mypy-boto3-servicecatalog-appregistry (>=1.20.0)", "mypy-boto3-servicediscovery (>=1.20.0)", "mypy-boto3-ses (>=1.20.0)", "mypy-boto3-sesv2 (>=1.20.0)", "mypy-boto3-shield (>=1.20.0)", "mypy-boto3-signer (>=1.20.0)", "mypy-boto3-sms (>=1.20.0)", "mypy-boto3-sms-voice (>=1.20.0)", "mypy-boto3-snow-device-management (>=1.20.0)", "mypy-boto3-snowball (>=1.20.0)", "mypy-boto3-sns (>=1.20.0)", "mypy-boto3-sqs (>=1.20.0)", "mypy-boto3-ssm (>=1.20.0)", "mypy-boto3-ssm-contacts (>=1.20.0)", "mypy-boto3-ssm-incidents (>=1.20.0)", "mypy-boto3-sso (>=1.20.0)", "mypy-boto3-sso-admin (>=1.20.0)", "mypy-boto3-sso-oidc (>=1.20.0)", "mypy-boto3-stepfunctions (>=1.20.0)", "mypy-boto3-storagegateway (>=1.20.0)", "mypy-boto3-sts (>=1.20.0)", "mypy-boto3-support (>=1.20.0)", "mypy-boto3-swf (>=1.20.0)", "mypy-boto3-synthetics (>=1.20.0)", "mypy-boto3-textract (>=1.20.0)", "mypy-boto3-timestream-query (>=1.20.0)", "mypy-boto3-timestream-write (>=1.20.0)", "mypy-boto3-transcribe (>=1.20.0)", "mypy-boto3-transfer (>=1.20.0)", "mypy-boto3-translate (>=1.20.0)", "mypy-boto3-voice-id (>=1.20.0)", "mypy-boto3-waf (>=1.20.0)", "mypy-boto3-waf-regional (>=1.20.0)", "mypy-boto3-wafv2 (>=1.20.0)", "mypy-boto3-wellarchitected (>=1.20.0)", "mypy-boto3-wisdom (>=1.20.0)", "mypy-boto3-workdocs (>=1.20.0)", "mypy-boto3-worklink (>=1.20.0)", "mypy-boto3-workmail (>=1.20.0)", "mypy-boto3-workmailmessageflow (>=1.20.0)", "mypy-boto3-workspaces (>=1.20.0)", "mypy-boto3-workspaces-web (>=1.20.0)", "mypy-boto3-xray (>=1.20.0)"] -amp = ["mypy-boto3-amp (>=1.20.0)"] -amplify = ["mypy-boto3-amplify (>=1.20.0)"] -amplifybackend = ["mypy-boto3-amplifybackend (>=1.20.0)"] -amplifyuibuilder = ["mypy-boto3-amplifyuibuilder (>=1.20.0)"] -apigateway = ["mypy-boto3-apigateway (>=1.20.0)"] -apigatewaymanagementapi = ["mypy-boto3-apigatewaymanagementapi (>=1.20.0)"] -apigatewayv2 = ["mypy-boto3-apigatewayv2 (>=1.20.0)"] -appconfig = ["mypy-boto3-appconfig (>=1.20.0)"] -appconfigdata = ["mypy-boto3-appconfigdata (>=1.20.0)"] -appflow = ["mypy-boto3-appflow (>=1.20.0)"] -appintegrations = ["mypy-boto3-appintegrations (>=1.20.0)"] -application-autoscaling = ["mypy-boto3-application-autoscaling (>=1.20.0)"] -application-insights = ["mypy-boto3-application-insights (>=1.20.0)"] -applicationcostprofiler = ["mypy-boto3-applicationcostprofiler (>=1.20.0)"] -appmesh = ["mypy-boto3-appmesh (>=1.20.0)"] -apprunner = ["mypy-boto3-apprunner (>=1.20.0)"] -appstream = ["mypy-boto3-appstream (>=1.20.0)"] -appsync = ["mypy-boto3-appsync (>=1.20.0)"] -athena = ["mypy-boto3-athena (>=1.20.0)"] -auditmanager = ["mypy-boto3-auditmanager (>=1.20.0)"] -autoscaling = ["mypy-boto3-autoscaling (>=1.20.0)"] -autoscaling-plans = ["mypy-boto3-autoscaling-plans (>=1.20.0)"] -backup = ["mypy-boto3-backup (>=1.20.0)"] -backup-gateway = ["mypy-boto3-backup-gateway (>=1.20.0)"] -batch = ["mypy-boto3-batch (>=1.20.0)"] -braket = ["mypy-boto3-braket (>=1.20.0)"] -budgets = ["mypy-boto3-budgets (>=1.20.0)"] -ce = ["mypy-boto3-ce (>=1.20.0)"] -chime = ["mypy-boto3-chime (>=1.20.0)"] -chime-sdk-identity = ["mypy-boto3-chime-sdk-identity (>=1.20.0)"] -chime-sdk-meetings = ["mypy-boto3-chime-sdk-meetings (>=1.20.0)"] -chime-sdk-messaging = ["mypy-boto3-chime-sdk-messaging (>=1.20.0)"] -cloud9 = ["mypy-boto3-cloud9 (>=1.20.0)"] -cloudcontrol = ["mypy-boto3-cloudcontrol (>=1.20.0)"] -clouddirectory = ["mypy-boto3-clouddirectory (>=1.20.0)"] -cloudformation = ["mypy-boto3-cloudformation (>=1.20.0)"] -cloudfront = ["mypy-boto3-cloudfront (>=1.20.0)"] -cloudhsm = ["mypy-boto3-cloudhsm (>=1.20.0)"] -cloudhsmv2 = ["mypy-boto3-cloudhsmv2 (>=1.20.0)"] -cloudsearch = ["mypy-boto3-cloudsearch (>=1.20.0)"] -cloudsearchdomain = ["mypy-boto3-cloudsearchdomain (>=1.20.0)"] -cloudtrail = ["mypy-boto3-cloudtrail (>=1.20.0)"] -cloudwatch = ["mypy-boto3-cloudwatch (>=1.20.0)"] -codeartifact = ["mypy-boto3-codeartifact (>=1.20.0)"] -codebuild = ["mypy-boto3-codebuild (>=1.20.0)"] -codecommit = ["mypy-boto3-codecommit (>=1.20.0)"] -codedeploy = ["mypy-boto3-codedeploy (>=1.20.0)"] -codeguru-reviewer = ["mypy-boto3-codeguru-reviewer (>=1.20.0)"] -codeguruprofiler = ["mypy-boto3-codeguruprofiler (>=1.20.0)"] -codepipeline = ["mypy-boto3-codepipeline (>=1.20.0)"] -codestar = ["mypy-boto3-codestar (>=1.20.0)"] -codestar-connections = ["mypy-boto3-codestar-connections (>=1.20.0)"] -codestar-notifications = ["mypy-boto3-codestar-notifications (>=1.20.0)"] -cognito-identity = ["mypy-boto3-cognito-identity (>=1.20.0)"] -cognito-idp = ["mypy-boto3-cognito-idp (>=1.20.0)"] -cognito-sync = ["mypy-boto3-cognito-sync (>=1.20.0)"] -comprehend = ["mypy-boto3-comprehend (>=1.20.0)"] -comprehendmedical = ["mypy-boto3-comprehendmedical (>=1.20.0)"] -compute-optimizer = ["mypy-boto3-compute-optimizer (>=1.20.0)"] -config = ["mypy-boto3-config (>=1.20.0)"] -connect = ["mypy-boto3-connect (>=1.20.0)"] -connect-contact-lens = ["mypy-boto3-connect-contact-lens (>=1.20.0)"] -connectparticipant = ["mypy-boto3-connectparticipant (>=1.20.0)"] -cur = ["mypy-boto3-cur (>=1.20.0)"] -customer-profiles = ["mypy-boto3-customer-profiles (>=1.20.0)"] -databrew = ["mypy-boto3-databrew (>=1.20.0)"] -dataexchange = ["mypy-boto3-dataexchange (>=1.20.0)"] -datapipeline = ["mypy-boto3-datapipeline (>=1.20.0)"] -datasync = ["mypy-boto3-datasync (>=1.20.0)"] -dax = ["mypy-boto3-dax (>=1.20.0)"] -detective = ["mypy-boto3-detective (>=1.20.0)"] -devicefarm = ["mypy-boto3-devicefarm (>=1.20.0)"] -devops-guru = ["mypy-boto3-devops-guru (>=1.20.0)"] -directconnect = ["mypy-boto3-directconnect (>=1.20.0)"] -discovery = ["mypy-boto3-discovery (>=1.20.0)"] -dlm = ["mypy-boto3-dlm (>=1.20.0)"] -dms = ["mypy-boto3-dms (>=1.20.0)"] -docdb = ["mypy-boto3-docdb (>=1.20.0)"] -drs = ["mypy-boto3-drs (>=1.20.0)"] -ds = ["mypy-boto3-ds (>=1.20.0)"] -dynamodb = ["mypy-boto3-dynamodb (>=1.20.0)"] -dynamodbstreams = ["mypy-boto3-dynamodbstreams (>=1.20.0)"] -ebs = ["mypy-boto3-ebs (>=1.20.0)"] -ec2 = ["mypy-boto3-ec2 (>=1.20.0)"] -ec2-instance-connect = ["mypy-boto3-ec2-instance-connect (>=1.20.0)"] -ecr = ["mypy-boto3-ecr (>=1.20.0)"] -ecr-public = ["mypy-boto3-ecr-public (>=1.20.0)"] -ecs = ["mypy-boto3-ecs (>=1.20.0)"] -efs = ["mypy-boto3-efs (>=1.20.0)"] -eks = ["mypy-boto3-eks (>=1.20.0)"] -elastic-inference = ["mypy-boto3-elastic-inference (>=1.20.0)"] -elasticache = ["mypy-boto3-elasticache (>=1.20.0)"] -elasticbeanstalk = ["mypy-boto3-elasticbeanstalk (>=1.20.0)"] -elastictranscoder = ["mypy-boto3-elastictranscoder (>=1.20.0)"] -elb = ["mypy-boto3-elb (>=1.20.0)"] -elbv2 = ["mypy-boto3-elbv2 (>=1.20.0)"] -emr = ["mypy-boto3-emr (>=1.20.0)"] -emr-containers = ["mypy-boto3-emr-containers (>=1.20.0)"] -es = ["mypy-boto3-es (>=1.20.0)"] -essential = ["mypy-boto3-cloudformation (>=1.20.0)", "mypy-boto3-dynamodb (>=1.20.0)", "mypy-boto3-ec2 (>=1.20.0)", "mypy-boto3-lambda (>=1.20.0)", "mypy-boto3-rds (>=1.20.0)", "mypy-boto3-s3 (>=1.20.0)", "mypy-boto3-sqs (>=1.20.0)"] -events = ["mypy-boto3-events (>=1.20.0)"] -evidently = ["mypy-boto3-evidently (>=1.20.0)"] -finspace = ["mypy-boto3-finspace (>=1.20.0)"] -finspace-data = ["mypy-boto3-finspace-data (>=1.20.0)"] -firehose = ["mypy-boto3-firehose (>=1.20.0)"] -fis = ["mypy-boto3-fis (>=1.20.0)"] -fms = ["mypy-boto3-fms (>=1.20.0)"] -forecast = ["mypy-boto3-forecast (>=1.20.0)"] -forecastquery = ["mypy-boto3-forecastquery (>=1.20.0)"] -frauddetector = ["mypy-boto3-frauddetector (>=1.20.0)"] -fsx = ["mypy-boto3-fsx (>=1.20.0)"] -gamelift = ["mypy-boto3-gamelift (>=1.20.0)"] -glacier = ["mypy-boto3-glacier (>=1.20.0)"] -globalaccelerator = ["mypy-boto3-globalaccelerator (>=1.20.0)"] -glue = ["mypy-boto3-glue (>=1.20.0)"] -grafana = ["mypy-boto3-grafana (>=1.20.0)"] -greengrass = ["mypy-boto3-greengrass (>=1.20.0)"] -greengrassv2 = ["mypy-boto3-greengrassv2 (>=1.20.0)"] -groundstation = ["mypy-boto3-groundstation (>=1.20.0)"] -guardduty = ["mypy-boto3-guardduty (>=1.20.0)"] -health = ["mypy-boto3-health (>=1.20.0)"] -healthlake = ["mypy-boto3-healthlake (>=1.20.0)"] -honeycode = ["mypy-boto3-honeycode (>=1.20.0)"] -iam = ["mypy-boto3-iam (>=1.20.0)"] -identitystore = ["mypy-boto3-identitystore (>=1.20.0)"] -imagebuilder = ["mypy-boto3-imagebuilder (>=1.20.0)"] -importexport = ["mypy-boto3-importexport (>=1.20.0)"] -inspector = ["mypy-boto3-inspector (>=1.20.0)"] -inspector2 = ["mypy-boto3-inspector2 (>=1.20.0)"] -iot = ["mypy-boto3-iot (>=1.20.0)"] -iot-data = ["mypy-boto3-iot-data (>=1.20.0)"] -iot-jobs-data = ["mypy-boto3-iot-jobs-data (>=1.20.0)"] -iot1click-devices = ["mypy-boto3-iot1click-devices (>=1.20.0)"] -iot1click-projects = ["mypy-boto3-iot1click-projects (>=1.20.0)"] -iotanalytics = ["mypy-boto3-iotanalytics (>=1.20.0)"] -iotdeviceadvisor = ["mypy-boto3-iotdeviceadvisor (>=1.20.0)"] -iotevents = ["mypy-boto3-iotevents (>=1.20.0)"] -iotevents-data = ["mypy-boto3-iotevents-data (>=1.20.0)"] -iotfleethub = ["mypy-boto3-iotfleethub (>=1.20.0)"] -iotsecuretunneling = ["mypy-boto3-iotsecuretunneling (>=1.20.0)"] -iotsitewise = ["mypy-boto3-iotsitewise (>=1.20.0)"] -iotthingsgraph = ["mypy-boto3-iotthingsgraph (>=1.20.0)"] -iottwinmaker = ["mypy-boto3-iottwinmaker (>=1.20.0)"] -iotwireless = ["mypy-boto3-iotwireless (>=1.20.0)"] -ivs = ["mypy-boto3-ivs (>=1.20.0)"] -kafka = ["mypy-boto3-kafka (>=1.20.0)"] -kafkaconnect = ["mypy-boto3-kafkaconnect (>=1.20.0)"] -kendra = ["mypy-boto3-kendra (>=1.20.0)"] -kinesis = ["mypy-boto3-kinesis (>=1.20.0)"] -kinesis-video-archived-media = ["mypy-boto3-kinesis-video-archived-media (>=1.20.0)"] -kinesis-video-media = ["mypy-boto3-kinesis-video-media (>=1.20.0)"] -kinesis-video-signaling = ["mypy-boto3-kinesis-video-signaling (>=1.20.0)"] -kinesisanalytics = ["mypy-boto3-kinesisanalytics (>=1.20.0)"] -kinesisanalyticsv2 = ["mypy-boto3-kinesisanalyticsv2 (>=1.20.0)"] -kinesisvideo = ["mypy-boto3-kinesisvideo (>=1.20.0)"] -kms = ["mypy-boto3-kms (>=1.20.0)"] -lakeformation = ["mypy-boto3-lakeformation (>=1.20.0)"] -lambda = ["mypy-boto3-lambda (>=1.20.0)"] -lex-models = ["mypy-boto3-lex-models (>=1.20.0)"] -lex-runtime = ["mypy-boto3-lex-runtime (>=1.20.0)"] -lexv2-models = ["mypy-boto3-lexv2-models (>=1.20.0)"] -lexv2-runtime = ["mypy-boto3-lexv2-runtime (>=1.20.0)"] -license-manager = ["mypy-boto3-license-manager (>=1.20.0)"] -lightsail = ["mypy-boto3-lightsail (>=1.20.0)"] -location = ["mypy-boto3-location (>=1.20.0)"] -logs = ["mypy-boto3-logs (>=1.20.0)"] -lookoutequipment = ["mypy-boto3-lookoutequipment (>=1.20.0)"] -lookoutmetrics = ["mypy-boto3-lookoutmetrics (>=1.20.0)"] -lookoutvision = ["mypy-boto3-lookoutvision (>=1.20.0)"] -machinelearning = ["mypy-boto3-machinelearning (>=1.20.0)"] -macie = ["mypy-boto3-macie (>=1.20.0)"] -macie2 = ["mypy-boto3-macie2 (>=1.20.0)"] -managedblockchain = ["mypy-boto3-managedblockchain (>=1.20.0)"] -marketplace-catalog = ["mypy-boto3-marketplace-catalog (>=1.20.0)"] -marketplace-entitlement = ["mypy-boto3-marketplace-entitlement (>=1.20.0)"] -marketplacecommerceanalytics = ["mypy-boto3-marketplacecommerceanalytics (>=1.20.0)"] -mediaconnect = ["mypy-boto3-mediaconnect (>=1.20.0)"] -mediaconvert = ["mypy-boto3-mediaconvert (>=1.20.0)"] -medialive = ["mypy-boto3-medialive (>=1.20.0)"] -mediapackage = ["mypy-boto3-mediapackage (>=1.20.0)"] -mediapackage-vod = ["mypy-boto3-mediapackage-vod (>=1.20.0)"] -mediastore = ["mypy-boto3-mediastore (>=1.20.0)"] -mediastore-data = ["mypy-boto3-mediastore-data (>=1.20.0)"] -mediatailor = ["mypy-boto3-mediatailor (>=1.20.0)"] -memorydb = ["mypy-boto3-memorydb (>=1.20.0)"] -meteringmarketplace = ["mypy-boto3-meteringmarketplace (>=1.20.0)"] -mgh = ["mypy-boto3-mgh (>=1.20.0)"] -mgn = ["mypy-boto3-mgn (>=1.20.0)"] -migration-hub-refactor-spaces = ["mypy-boto3-migration-hub-refactor-spaces (>=1.20.0)"] -migrationhub-config = ["mypy-boto3-migrationhub-config (>=1.20.0)"] -migrationhubstrategy = ["mypy-boto3-migrationhubstrategy (>=1.20.0)"] -mobile = ["mypy-boto3-mobile (>=1.20.0)"] -mq = ["mypy-boto3-mq (>=1.20.0)"] -mturk = ["mypy-boto3-mturk (>=1.20.0)"] -mwaa = ["mypy-boto3-mwaa (>=1.20.0)"] -neptune = ["mypy-boto3-neptune (>=1.20.0)"] -network-firewall = ["mypy-boto3-network-firewall (>=1.20.0)"] -networkmanager = ["mypy-boto3-networkmanager (>=1.20.0)"] -nimble = ["mypy-boto3-nimble (>=1.20.0)"] -opensearch = ["mypy-boto3-opensearch (>=1.20.0)"] -opsworks = ["mypy-boto3-opsworks (>=1.20.0)"] -opsworkscm = ["mypy-boto3-opsworkscm (>=1.20.0)"] -organizations = ["mypy-boto3-organizations (>=1.20.0)"] -outposts = ["mypy-boto3-outposts (>=1.20.0)"] -panorama = ["mypy-boto3-panorama (>=1.20.0)"] -personalize = ["mypy-boto3-personalize (>=1.20.0)"] -personalize-events = ["mypy-boto3-personalize-events (>=1.20.0)"] -personalize-runtime = ["mypy-boto3-personalize-runtime (>=1.20.0)"] -pi = ["mypy-boto3-pi (>=1.20.0)"] -pinpoint = ["mypy-boto3-pinpoint (>=1.20.0)"] -pinpoint-email = ["mypy-boto3-pinpoint-email (>=1.20.0)"] -pinpoint-sms-voice = ["mypy-boto3-pinpoint-sms-voice (>=1.20.0)"] -polly = ["mypy-boto3-polly (>=1.20.0)"] -pricing = ["mypy-boto3-pricing (>=1.20.0)"] -proton = ["mypy-boto3-proton (>=1.20.0)"] -qldb = ["mypy-boto3-qldb (>=1.20.0)"] -qldb-session = ["mypy-boto3-qldb-session (>=1.20.0)"] -quicksight = ["mypy-boto3-quicksight (>=1.20.0)"] -ram = ["mypy-boto3-ram (>=1.20.0)"] -rbin = ["mypy-boto3-rbin (>=1.20.0)"] -rds = ["mypy-boto3-rds (>=1.20.0)"] -rds-data = ["mypy-boto3-rds-data (>=1.20.0)"] -redshift = ["mypy-boto3-redshift (>=1.20.0)"] -redshift-data = ["mypy-boto3-redshift-data (>=1.20.0)"] -rekognition = ["mypy-boto3-rekognition (>=1.20.0)"] -resiliencehub = ["mypy-boto3-resiliencehub (>=1.20.0)"] -resource-groups = ["mypy-boto3-resource-groups (>=1.20.0)"] -resourcegroupstaggingapi = ["mypy-boto3-resourcegroupstaggingapi (>=1.20.0)"] -robomaker = ["mypy-boto3-robomaker (>=1.20.0)"] -route53 = ["mypy-boto3-route53 (>=1.20.0)"] -route53-recovery-cluster = ["mypy-boto3-route53-recovery-cluster (>=1.20.0)"] -route53-recovery-control-config = ["mypy-boto3-route53-recovery-control-config (>=1.20.0)"] -route53-recovery-readiness = ["mypy-boto3-route53-recovery-readiness (>=1.20.0)"] -route53domains = ["mypy-boto3-route53domains (>=1.20.0)"] -route53resolver = ["mypy-boto3-route53resolver (>=1.20.0)"] -rum = ["mypy-boto3-rum (>=1.20.0)"] -s3 = ["mypy-boto3-s3 (>=1.20.0)"] -s3control = ["mypy-boto3-s3control (>=1.20.0)"] -s3outposts = ["mypy-boto3-s3outposts (>=1.20.0)"] -sagemaker = ["mypy-boto3-sagemaker (>=1.20.0)"] -sagemaker-a2i-runtime = ["mypy-boto3-sagemaker-a2i-runtime (>=1.20.0)"] -sagemaker-edge = ["mypy-boto3-sagemaker-edge (>=1.20.0)"] -sagemaker-featurestore-runtime = ["mypy-boto3-sagemaker-featurestore-runtime (>=1.20.0)"] -sagemaker-runtime = ["mypy-boto3-sagemaker-runtime (>=1.20.0)"] -savingsplans = ["mypy-boto3-savingsplans (>=1.20.0)"] -schemas = ["mypy-boto3-schemas (>=1.20.0)"] -sdb = ["mypy-boto3-sdb (>=1.20.0)"] -secretsmanager = ["mypy-boto3-secretsmanager (>=1.20.0)"] -securityhub = ["mypy-boto3-securityhub (>=1.20.0)"] -serverlessrepo = ["mypy-boto3-serverlessrepo (>=1.20.0)"] -service-quotas = ["mypy-boto3-service-quotas (>=1.20.0)"] -servicecatalog = ["mypy-boto3-servicecatalog (>=1.20.0)"] -servicecatalog-appregistry = ["mypy-boto3-servicecatalog-appregistry (>=1.20.0)"] -servicediscovery = ["mypy-boto3-servicediscovery (>=1.20.0)"] -ses = ["mypy-boto3-ses (>=1.20.0)"] -sesv2 = ["mypy-boto3-sesv2 (>=1.20.0)"] -shield = ["mypy-boto3-shield (>=1.20.0)"] -signer = ["mypy-boto3-signer (>=1.20.0)"] -sms = ["mypy-boto3-sms (>=1.20.0)"] -sms-voice = ["mypy-boto3-sms-voice (>=1.20.0)"] -snow-device-management = ["mypy-boto3-snow-device-management (>=1.20.0)"] -snowball = ["mypy-boto3-snowball (>=1.20.0)"] -sns = ["mypy-boto3-sns (>=1.20.0)"] -sqs = ["mypy-boto3-sqs (>=1.20.0)"] -ssm = ["mypy-boto3-ssm (>=1.20.0)"] -ssm-contacts = ["mypy-boto3-ssm-contacts (>=1.20.0)"] -ssm-incidents = ["mypy-boto3-ssm-incidents (>=1.20.0)"] -sso = ["mypy-boto3-sso (>=1.20.0)"] -sso-admin = ["mypy-boto3-sso-admin (>=1.20.0)"] -sso-oidc = ["mypy-boto3-sso-oidc (>=1.20.0)"] -stepfunctions = ["mypy-boto3-stepfunctions (>=1.20.0)"] -storagegateway = ["mypy-boto3-storagegateway (>=1.20.0)"] -sts = ["mypy-boto3-sts (>=1.20.0)"] -support = ["mypy-boto3-support (>=1.20.0)"] -swf = ["mypy-boto3-swf (>=1.20.0)"] -synthetics = ["mypy-boto3-synthetics (>=1.20.0)"] -textract = ["mypy-boto3-textract (>=1.20.0)"] -timestream-query = ["mypy-boto3-timestream-query (>=1.20.0)"] -timestream-write = ["mypy-boto3-timestream-write (>=1.20.0)"] -transcribe = ["mypy-boto3-transcribe (>=1.20.0)"] -transfer = ["mypy-boto3-transfer (>=1.20.0)"] -translate = ["mypy-boto3-translate (>=1.20.0)"] -voice-id = ["mypy-boto3-voice-id (>=1.20.0)"] -waf = ["mypy-boto3-waf (>=1.20.0)"] -waf-regional = ["mypy-boto3-waf-regional (>=1.20.0)"] -wafv2 = ["mypy-boto3-wafv2 (>=1.20.0)"] -wellarchitected = ["mypy-boto3-wellarchitected (>=1.20.0)"] -wisdom = ["mypy-boto3-wisdom (>=1.20.0)"] -workdocs = ["mypy-boto3-workdocs (>=1.20.0)"] -worklink = ["mypy-boto3-worklink (>=1.20.0)"] -workmail = ["mypy-boto3-workmail (>=1.20.0)"] -workmailmessageflow = ["mypy-boto3-workmailmessageflow (>=1.20.0)"] -workspaces = ["mypy-boto3-workspaces (>=1.20.0)"] -workspaces-web = ["mypy-boto3-workspaces-web (>=1.20.0)"] -xray = ["mypy-boto3-xray (>=1.20.0)"] +accessanalyzer = ["mypy-boto3-accessanalyzer (>=1.24.0,<1.25.0)"] +account = ["mypy-boto3-account (>=1.24.0,<1.25.0)"] +acm = ["mypy-boto3-acm (>=1.24.0,<1.25.0)"] +acm-pca = ["mypy-boto3-acm-pca (>=1.24.0,<1.25.0)"] +alexaforbusiness = ["mypy-boto3-alexaforbusiness (>=1.24.0,<1.25.0)"] +all = ["mypy-boto3-accessanalyzer (>=1.24.0,<1.25.0)", "mypy-boto3-account (>=1.24.0,<1.25.0)", "mypy-boto3-acm (>=1.24.0,<1.25.0)", "mypy-boto3-acm-pca (>=1.24.0,<1.25.0)", "mypy-boto3-alexaforbusiness (>=1.24.0,<1.25.0)", "mypy-boto3-amp (>=1.24.0,<1.25.0)", "mypy-boto3-amplify (>=1.24.0,<1.25.0)", "mypy-boto3-amplifybackend (>=1.24.0,<1.25.0)", "mypy-boto3-amplifyuibuilder (>=1.24.0,<1.25.0)", "mypy-boto3-apigateway (>=1.24.0,<1.25.0)", "mypy-boto3-apigatewaymanagementapi (>=1.24.0,<1.25.0)", "mypy-boto3-apigatewayv2 (>=1.24.0,<1.25.0)", "mypy-boto3-appconfig (>=1.24.0,<1.25.0)", "mypy-boto3-appconfigdata (>=1.24.0,<1.25.0)", "mypy-boto3-appflow (>=1.24.0,<1.25.0)", "mypy-boto3-appintegrations (>=1.24.0,<1.25.0)", "mypy-boto3-application-autoscaling (>=1.24.0,<1.25.0)", "mypy-boto3-application-insights (>=1.24.0,<1.25.0)", "mypy-boto3-applicationcostprofiler (>=1.24.0,<1.25.0)", "mypy-boto3-appmesh (>=1.24.0,<1.25.0)", "mypy-boto3-apprunner (>=1.24.0,<1.25.0)", "mypy-boto3-appstream (>=1.24.0,<1.25.0)", "mypy-boto3-appsync (>=1.24.0,<1.25.0)", "mypy-boto3-athena (>=1.24.0,<1.25.0)", "mypy-boto3-auditmanager (>=1.24.0,<1.25.0)", "mypy-boto3-autoscaling (>=1.24.0,<1.25.0)", "mypy-boto3-autoscaling-plans (>=1.24.0,<1.25.0)", "mypy-boto3-backup (>=1.24.0,<1.25.0)", "mypy-boto3-backup-gateway (>=1.24.0,<1.25.0)", "mypy-boto3-batch (>=1.24.0,<1.25.0)", "mypy-boto3-billingconductor (>=1.24.0,<1.25.0)", "mypy-boto3-braket (>=1.24.0,<1.25.0)", "mypy-boto3-budgets (>=1.24.0,<1.25.0)", "mypy-boto3-ce (>=1.24.0,<1.25.0)", "mypy-boto3-chime (>=1.24.0,<1.25.0)", "mypy-boto3-chime-sdk-identity (>=1.24.0,<1.25.0)", "mypy-boto3-chime-sdk-media-pipelines (>=1.24.0,<1.25.0)", "mypy-boto3-chime-sdk-meetings (>=1.24.0,<1.25.0)", "mypy-boto3-chime-sdk-messaging (>=1.24.0,<1.25.0)", "mypy-boto3-cloud9 (>=1.24.0,<1.25.0)", "mypy-boto3-cloudcontrol (>=1.24.0,<1.25.0)", "mypy-boto3-clouddirectory (>=1.24.0,<1.25.0)", "mypy-boto3-cloudformation (>=1.24.0,<1.25.0)", "mypy-boto3-cloudfront (>=1.24.0,<1.25.0)", "mypy-boto3-cloudhsm (>=1.24.0,<1.25.0)", "mypy-boto3-cloudhsmv2 (>=1.24.0,<1.25.0)", "mypy-boto3-cloudsearch (>=1.24.0,<1.25.0)", "mypy-boto3-cloudsearchdomain (>=1.24.0,<1.25.0)", "mypy-boto3-cloudtrail (>=1.24.0,<1.25.0)", "mypy-boto3-cloudwatch (>=1.24.0,<1.25.0)", "mypy-boto3-codeartifact (>=1.24.0,<1.25.0)", "mypy-boto3-codebuild (>=1.24.0,<1.25.0)", "mypy-boto3-codecommit (>=1.24.0,<1.25.0)", "mypy-boto3-codedeploy (>=1.24.0,<1.25.0)", "mypy-boto3-codeguru-reviewer (>=1.24.0,<1.25.0)", "mypy-boto3-codeguruprofiler (>=1.24.0,<1.25.0)", "mypy-boto3-codepipeline (>=1.24.0,<1.25.0)", "mypy-boto3-codestar (>=1.24.0,<1.25.0)", "mypy-boto3-codestar-connections (>=1.24.0,<1.25.0)", "mypy-boto3-codestar-notifications (>=1.24.0,<1.25.0)", "mypy-boto3-cognito-identity (>=1.24.0,<1.25.0)", "mypy-boto3-cognito-idp (>=1.24.0,<1.25.0)", "mypy-boto3-cognito-sync (>=1.24.0,<1.25.0)", "mypy-boto3-comprehend (>=1.24.0,<1.25.0)", "mypy-boto3-comprehendmedical (>=1.24.0,<1.25.0)", "mypy-boto3-compute-optimizer (>=1.24.0,<1.25.0)", "mypy-boto3-config (>=1.24.0,<1.25.0)", "mypy-boto3-connect (>=1.24.0,<1.25.0)", "mypy-boto3-connect-contact-lens (>=1.24.0,<1.25.0)", "mypy-boto3-connectcampaigns (>=1.24.0,<1.25.0)", "mypy-boto3-connectparticipant (>=1.24.0,<1.25.0)", "mypy-boto3-cur (>=1.24.0,<1.25.0)", "mypy-boto3-customer-profiles (>=1.24.0,<1.25.0)", "mypy-boto3-databrew (>=1.24.0,<1.25.0)", "mypy-boto3-dataexchange (>=1.24.0,<1.25.0)", "mypy-boto3-datapipeline (>=1.24.0,<1.25.0)", "mypy-boto3-datasync (>=1.24.0,<1.25.0)", "mypy-boto3-dax (>=1.24.0,<1.25.0)", "mypy-boto3-detective (>=1.24.0,<1.25.0)", "mypy-boto3-devicefarm (>=1.24.0,<1.25.0)", "mypy-boto3-devops-guru (>=1.24.0,<1.25.0)", "mypy-boto3-directconnect (>=1.24.0,<1.25.0)", "mypy-boto3-discovery (>=1.24.0,<1.25.0)", "mypy-boto3-dlm (>=1.24.0,<1.25.0)", "mypy-boto3-dms (>=1.24.0,<1.25.0)", "mypy-boto3-docdb (>=1.24.0,<1.25.0)", "mypy-boto3-drs (>=1.24.0,<1.25.0)", "mypy-boto3-ds (>=1.24.0,<1.25.0)", "mypy-boto3-dynamodb (>=1.24.0,<1.25.0)", "mypy-boto3-dynamodbstreams (>=1.24.0,<1.25.0)", "mypy-boto3-ebs (>=1.24.0,<1.25.0)", "mypy-boto3-ec2 (>=1.24.0,<1.25.0)", "mypy-boto3-ec2-instance-connect (>=1.24.0,<1.25.0)", "mypy-boto3-ecr (>=1.24.0,<1.25.0)", "mypy-boto3-ecr-public (>=1.24.0,<1.25.0)", "mypy-boto3-ecs (>=1.24.0,<1.25.0)", "mypy-boto3-efs (>=1.24.0,<1.25.0)", "mypy-boto3-eks (>=1.24.0,<1.25.0)", "mypy-boto3-elastic-inference (>=1.24.0,<1.25.0)", "mypy-boto3-elasticache (>=1.24.0,<1.25.0)", "mypy-boto3-elasticbeanstalk (>=1.24.0,<1.25.0)", "mypy-boto3-elastictranscoder (>=1.24.0,<1.25.0)", "mypy-boto3-elb (>=1.24.0,<1.25.0)", "mypy-boto3-elbv2 (>=1.24.0,<1.25.0)", "mypy-boto3-emr (>=1.24.0,<1.25.0)", "mypy-boto3-emr-containers (>=1.24.0,<1.25.0)", "mypy-boto3-emr-serverless (>=1.24.0,<1.25.0)", "mypy-boto3-es (>=1.24.0,<1.25.0)", "mypy-boto3-events (>=1.24.0,<1.25.0)", "mypy-boto3-evidently (>=1.24.0,<1.25.0)", "mypy-boto3-finspace (>=1.24.0,<1.25.0)", "mypy-boto3-finspace-data (>=1.24.0,<1.25.0)", "mypy-boto3-firehose (>=1.24.0,<1.25.0)", "mypy-boto3-fis (>=1.24.0,<1.25.0)", "mypy-boto3-fms (>=1.24.0,<1.25.0)", "mypy-boto3-forecast (>=1.24.0,<1.25.0)", "mypy-boto3-forecastquery (>=1.24.0,<1.25.0)", "mypy-boto3-frauddetector (>=1.24.0,<1.25.0)", "mypy-boto3-fsx (>=1.24.0,<1.25.0)", "mypy-boto3-gamelift (>=1.24.0,<1.25.0)", "mypy-boto3-gamesparks (>=1.24.0,<1.25.0)", "mypy-boto3-glacier (>=1.24.0,<1.25.0)", "mypy-boto3-globalaccelerator (>=1.24.0,<1.25.0)", "mypy-boto3-glue (>=1.24.0,<1.25.0)", "mypy-boto3-grafana (>=1.24.0,<1.25.0)", "mypy-boto3-greengrass (>=1.24.0,<1.25.0)", "mypy-boto3-greengrassv2 (>=1.24.0,<1.25.0)", "mypy-boto3-groundstation (>=1.24.0,<1.25.0)", "mypy-boto3-guardduty (>=1.24.0,<1.25.0)", "mypy-boto3-health (>=1.24.0,<1.25.0)", "mypy-boto3-healthlake (>=1.24.0,<1.25.0)", "mypy-boto3-honeycode (>=1.24.0,<1.25.0)", "mypy-boto3-iam (>=1.24.0,<1.25.0)", "mypy-boto3-identitystore (>=1.24.0,<1.25.0)", "mypy-boto3-imagebuilder (>=1.24.0,<1.25.0)", "mypy-boto3-importexport (>=1.24.0,<1.25.0)", "mypy-boto3-inspector (>=1.24.0,<1.25.0)", "mypy-boto3-inspector2 (>=1.24.0,<1.25.0)", "mypy-boto3-iot (>=1.24.0,<1.25.0)", "mypy-boto3-iot-data (>=1.24.0,<1.25.0)", "mypy-boto3-iot-jobs-data (>=1.24.0,<1.25.0)", "mypy-boto3-iot1click-devices (>=1.24.0,<1.25.0)", "mypy-boto3-iot1click-projects (>=1.24.0,<1.25.0)", "mypy-boto3-iotanalytics (>=1.24.0,<1.25.0)", "mypy-boto3-iotdeviceadvisor (>=1.24.0,<1.25.0)", "mypy-boto3-iotevents (>=1.24.0,<1.25.0)", "mypy-boto3-iotevents-data (>=1.24.0,<1.25.0)", "mypy-boto3-iotfleethub (>=1.24.0,<1.25.0)", "mypy-boto3-iotsecuretunneling (>=1.24.0,<1.25.0)", "mypy-boto3-iotsitewise (>=1.24.0,<1.25.0)", "mypy-boto3-iotthingsgraph (>=1.24.0,<1.25.0)", "mypy-boto3-iottwinmaker (>=1.24.0,<1.25.0)", "mypy-boto3-iotwireless (>=1.24.0,<1.25.0)", "mypy-boto3-ivs (>=1.24.0,<1.25.0)", "mypy-boto3-ivschat (>=1.24.0,<1.25.0)", "mypy-boto3-kafka (>=1.24.0,<1.25.0)", "mypy-boto3-kafkaconnect (>=1.24.0,<1.25.0)", "mypy-boto3-kendra (>=1.24.0,<1.25.0)", "mypy-boto3-keyspaces (>=1.24.0,<1.25.0)", "mypy-boto3-kinesis (>=1.24.0,<1.25.0)", "mypy-boto3-kinesis-video-archived-media (>=1.24.0,<1.25.0)", "mypy-boto3-kinesis-video-media (>=1.24.0,<1.25.0)", "mypy-boto3-kinesis-video-signaling (>=1.24.0,<1.25.0)", "mypy-boto3-kinesisanalytics (>=1.24.0,<1.25.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.24.0,<1.25.0)", "mypy-boto3-kinesisvideo (>=1.24.0,<1.25.0)", "mypy-boto3-kms (>=1.24.0,<1.25.0)", "mypy-boto3-lakeformation (>=1.24.0,<1.25.0)", "mypy-boto3-lambda (>=1.24.0,<1.25.0)", "mypy-boto3-lex-models (>=1.24.0,<1.25.0)", "mypy-boto3-lex-runtime (>=1.24.0,<1.25.0)", "mypy-boto3-lexv2-models (>=1.24.0,<1.25.0)", "mypy-boto3-lexv2-runtime (>=1.24.0,<1.25.0)", "mypy-boto3-license-manager (>=1.24.0,<1.25.0)", "mypy-boto3-lightsail (>=1.24.0,<1.25.0)", "mypy-boto3-location (>=1.24.0,<1.25.0)", "mypy-boto3-logs (>=1.24.0,<1.25.0)", "mypy-boto3-lookoutequipment (>=1.24.0,<1.25.0)", "mypy-boto3-lookoutmetrics (>=1.24.0,<1.25.0)", "mypy-boto3-lookoutvision (>=1.24.0,<1.25.0)", "mypy-boto3-m2 (>=1.24.0,<1.25.0)", "mypy-boto3-machinelearning (>=1.24.0,<1.25.0)", "mypy-boto3-macie (>=1.24.0,<1.25.0)", "mypy-boto3-macie2 (>=1.24.0,<1.25.0)", "mypy-boto3-managedblockchain (>=1.24.0,<1.25.0)", "mypy-boto3-marketplace-catalog (>=1.24.0,<1.25.0)", "mypy-boto3-marketplace-entitlement (>=1.24.0,<1.25.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.24.0,<1.25.0)", "mypy-boto3-mediaconnect (>=1.24.0,<1.25.0)", "mypy-boto3-mediaconvert (>=1.24.0,<1.25.0)", "mypy-boto3-medialive (>=1.24.0,<1.25.0)", "mypy-boto3-mediapackage (>=1.24.0,<1.25.0)", "mypy-boto3-mediapackage-vod (>=1.24.0,<1.25.0)", "mypy-boto3-mediastore (>=1.24.0,<1.25.0)", "mypy-boto3-mediastore-data (>=1.24.0,<1.25.0)", "mypy-boto3-mediatailor (>=1.24.0,<1.25.0)", "mypy-boto3-memorydb (>=1.24.0,<1.25.0)", "mypy-boto3-meteringmarketplace (>=1.24.0,<1.25.0)", "mypy-boto3-mgh (>=1.24.0,<1.25.0)", "mypy-boto3-mgn (>=1.24.0,<1.25.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.24.0,<1.25.0)", "mypy-boto3-migrationhub-config (>=1.24.0,<1.25.0)", "mypy-boto3-migrationhubstrategy (>=1.24.0,<1.25.0)", "mypy-boto3-mobile (>=1.24.0,<1.25.0)", "mypy-boto3-mq (>=1.24.0,<1.25.0)", "mypy-boto3-mturk (>=1.24.0,<1.25.0)", "mypy-boto3-mwaa (>=1.24.0,<1.25.0)", "mypy-boto3-neptune (>=1.24.0,<1.25.0)", "mypy-boto3-network-firewall (>=1.24.0,<1.25.0)", "mypy-boto3-networkmanager (>=1.24.0,<1.25.0)", "mypy-boto3-nimble (>=1.24.0,<1.25.0)", "mypy-boto3-opensearch (>=1.24.0,<1.25.0)", "mypy-boto3-opsworks (>=1.24.0,<1.25.0)", "mypy-boto3-opsworkscm (>=1.24.0,<1.25.0)", "mypy-boto3-organizations (>=1.24.0,<1.25.0)", "mypy-boto3-outposts (>=1.24.0,<1.25.0)", "mypy-boto3-panorama (>=1.24.0,<1.25.0)", "mypy-boto3-personalize (>=1.24.0,<1.25.0)", "mypy-boto3-personalize-events (>=1.24.0,<1.25.0)", "mypy-boto3-personalize-runtime (>=1.24.0,<1.25.0)", "mypy-boto3-pi (>=1.24.0,<1.25.0)", "mypy-boto3-pinpoint (>=1.24.0,<1.25.0)", "mypy-boto3-pinpoint-email (>=1.24.0,<1.25.0)", "mypy-boto3-pinpoint-sms-voice (>=1.24.0,<1.25.0)", "mypy-boto3-pinpoint-sms-voice-v2 (>=1.24.0,<1.25.0)", "mypy-boto3-polly (>=1.24.0,<1.25.0)", "mypy-boto3-pricing (>=1.24.0,<1.25.0)", "mypy-boto3-proton (>=1.24.0,<1.25.0)", "mypy-boto3-qldb (>=1.24.0,<1.25.0)", "mypy-boto3-qldb-session (>=1.24.0,<1.25.0)", "mypy-boto3-quicksight (>=1.24.0,<1.25.0)", "mypy-boto3-ram (>=1.24.0,<1.25.0)", "mypy-boto3-rbin (>=1.24.0,<1.25.0)", "mypy-boto3-rds (>=1.24.0,<1.25.0)", "mypy-boto3-rds-data (>=1.24.0,<1.25.0)", "mypy-boto3-redshift (>=1.24.0,<1.25.0)", "mypy-boto3-redshift-data (>=1.24.0,<1.25.0)", "mypy-boto3-redshift-serverless (>=1.24.0,<1.25.0)", "mypy-boto3-rekognition (>=1.24.0,<1.25.0)", "mypy-boto3-resiliencehub (>=1.24.0,<1.25.0)", "mypy-boto3-resource-groups (>=1.24.0,<1.25.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.24.0,<1.25.0)", "mypy-boto3-robomaker (>=1.24.0,<1.25.0)", "mypy-boto3-rolesanywhere (>=1.24.0,<1.25.0)", "mypy-boto3-route53 (>=1.24.0,<1.25.0)", "mypy-boto3-route53-recovery-cluster (>=1.24.0,<1.25.0)", "mypy-boto3-route53-recovery-control-config (>=1.24.0,<1.25.0)", "mypy-boto3-route53-recovery-readiness (>=1.24.0,<1.25.0)", "mypy-boto3-route53domains (>=1.24.0,<1.25.0)", "mypy-boto3-route53resolver (>=1.24.0,<1.25.0)", "mypy-boto3-rum (>=1.24.0,<1.25.0)", "mypy-boto3-s3 (>=1.24.0,<1.25.0)", "mypy-boto3-s3control (>=1.24.0,<1.25.0)", "mypy-boto3-s3outposts (>=1.24.0,<1.25.0)", "mypy-boto3-sagemaker (>=1.24.0,<1.25.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.24.0,<1.25.0)", "mypy-boto3-sagemaker-edge (>=1.24.0,<1.25.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.24.0,<1.25.0)", "mypy-boto3-sagemaker-runtime (>=1.24.0,<1.25.0)", "mypy-boto3-savingsplans (>=1.24.0,<1.25.0)", "mypy-boto3-schemas (>=1.24.0,<1.25.0)", "mypy-boto3-sdb (>=1.24.0,<1.25.0)", "mypy-boto3-secretsmanager (>=1.24.0,<1.25.0)", "mypy-boto3-securityhub (>=1.24.0,<1.25.0)", "mypy-boto3-serverlessrepo (>=1.24.0,<1.25.0)", "mypy-boto3-service-quotas (>=1.24.0,<1.25.0)", "mypy-boto3-servicecatalog (>=1.24.0,<1.25.0)", "mypy-boto3-servicecatalog-appregistry (>=1.24.0,<1.25.0)", "mypy-boto3-servicediscovery (>=1.24.0,<1.25.0)", "mypy-boto3-ses (>=1.24.0,<1.25.0)", "mypy-boto3-sesv2 (>=1.24.0,<1.25.0)", "mypy-boto3-shield (>=1.24.0,<1.25.0)", "mypy-boto3-signer (>=1.24.0,<1.25.0)", "mypy-boto3-sms (>=1.24.0,<1.25.0)", "mypy-boto3-sms-voice (>=1.24.0,<1.25.0)", "mypy-boto3-snow-device-management (>=1.24.0,<1.25.0)", "mypy-boto3-snowball (>=1.24.0,<1.25.0)", "mypy-boto3-sns (>=1.24.0,<1.25.0)", "mypy-boto3-sqs (>=1.24.0,<1.25.0)", "mypy-boto3-ssm (>=1.24.0,<1.25.0)", "mypy-boto3-ssm-contacts (>=1.24.0,<1.25.0)", "mypy-boto3-ssm-incidents (>=1.24.0,<1.25.0)", "mypy-boto3-sso (>=1.24.0,<1.25.0)", "mypy-boto3-sso-admin (>=1.24.0,<1.25.0)", "mypy-boto3-sso-oidc (>=1.24.0,<1.25.0)", "mypy-boto3-stepfunctions (>=1.24.0,<1.25.0)", "mypy-boto3-storagegateway (>=1.24.0,<1.25.0)", "mypy-boto3-sts (>=1.24.0,<1.25.0)", "mypy-boto3-support (>=1.24.0,<1.25.0)", "mypy-boto3-swf (>=1.24.0,<1.25.0)", "mypy-boto3-synthetics (>=1.24.0,<1.25.0)", "mypy-boto3-textract (>=1.24.0,<1.25.0)", "mypy-boto3-timestream-query (>=1.24.0,<1.25.0)", "mypy-boto3-timestream-write (>=1.24.0,<1.25.0)", "mypy-boto3-transcribe (>=1.24.0,<1.25.0)", "mypy-boto3-transfer (>=1.24.0,<1.25.0)", "mypy-boto3-translate (>=1.24.0,<1.25.0)", "mypy-boto3-voice-id (>=1.24.0,<1.25.0)", "mypy-boto3-waf (>=1.24.0,<1.25.0)", "mypy-boto3-waf-regional (>=1.24.0,<1.25.0)", "mypy-boto3-wafv2 (>=1.24.0,<1.25.0)", "mypy-boto3-wellarchitected (>=1.24.0,<1.25.0)", "mypy-boto3-wisdom (>=1.24.0,<1.25.0)", "mypy-boto3-workdocs (>=1.24.0,<1.25.0)", "mypy-boto3-worklink (>=1.24.0,<1.25.0)", "mypy-boto3-workmail (>=1.24.0,<1.25.0)", "mypy-boto3-workmailmessageflow (>=1.24.0,<1.25.0)", "mypy-boto3-workspaces (>=1.24.0,<1.25.0)", "mypy-boto3-workspaces-web (>=1.24.0,<1.25.0)", "mypy-boto3-xray (>=1.24.0,<1.25.0)"] +amp = ["mypy-boto3-amp (>=1.24.0,<1.25.0)"] +amplify = ["mypy-boto3-amplify (>=1.24.0,<1.25.0)"] +amplifybackend = ["mypy-boto3-amplifybackend (>=1.24.0,<1.25.0)"] +amplifyuibuilder = ["mypy-boto3-amplifyuibuilder (>=1.24.0,<1.25.0)"] +apigateway = ["mypy-boto3-apigateway (>=1.24.0,<1.25.0)"] +apigatewaymanagementapi = ["mypy-boto3-apigatewaymanagementapi (>=1.24.0,<1.25.0)"] +apigatewayv2 = ["mypy-boto3-apigatewayv2 (>=1.24.0,<1.25.0)"] +appconfig = ["mypy-boto3-appconfig (>=1.24.0,<1.25.0)"] +appconfigdata = ["mypy-boto3-appconfigdata (>=1.24.0,<1.25.0)"] +appflow = ["mypy-boto3-appflow (>=1.24.0,<1.25.0)"] +appintegrations = ["mypy-boto3-appintegrations (>=1.24.0,<1.25.0)"] +application-autoscaling = ["mypy-boto3-application-autoscaling (>=1.24.0,<1.25.0)"] +application-insights = ["mypy-boto3-application-insights (>=1.24.0,<1.25.0)"] +applicationcostprofiler = ["mypy-boto3-applicationcostprofiler (>=1.24.0,<1.25.0)"] +appmesh = ["mypy-boto3-appmesh (>=1.24.0,<1.25.0)"] +apprunner = ["mypy-boto3-apprunner (>=1.24.0,<1.25.0)"] +appstream = ["mypy-boto3-appstream (>=1.24.0,<1.25.0)"] +appsync = ["mypy-boto3-appsync (>=1.24.0,<1.25.0)"] +athena = ["mypy-boto3-athena (>=1.24.0,<1.25.0)"] +auditmanager = ["mypy-boto3-auditmanager (>=1.24.0,<1.25.0)"] +autoscaling = ["mypy-boto3-autoscaling (>=1.24.0,<1.25.0)"] +autoscaling-plans = ["mypy-boto3-autoscaling-plans (>=1.24.0,<1.25.0)"] +backup = ["mypy-boto3-backup (>=1.24.0,<1.25.0)"] +backup-gateway = ["mypy-boto3-backup-gateway (>=1.24.0,<1.25.0)"] +batch = ["mypy-boto3-batch (>=1.24.0,<1.25.0)"] +billingconductor = ["mypy-boto3-billingconductor (>=1.24.0,<1.25.0)"] +braket = ["mypy-boto3-braket (>=1.24.0,<1.25.0)"] +budgets = ["mypy-boto3-budgets (>=1.24.0,<1.25.0)"] +ce = ["mypy-boto3-ce (>=1.24.0,<1.25.0)"] +chime = ["mypy-boto3-chime (>=1.24.0,<1.25.0)"] +chime-sdk-identity = ["mypy-boto3-chime-sdk-identity (>=1.24.0,<1.25.0)"] +chime-sdk-media-pipelines = ["mypy-boto3-chime-sdk-media-pipelines (>=1.24.0,<1.25.0)"] +chime-sdk-meetings = ["mypy-boto3-chime-sdk-meetings (>=1.24.0,<1.25.0)"] +chime-sdk-messaging = ["mypy-boto3-chime-sdk-messaging (>=1.24.0,<1.25.0)"] +cloud9 = ["mypy-boto3-cloud9 (>=1.24.0,<1.25.0)"] +cloudcontrol = ["mypy-boto3-cloudcontrol (>=1.24.0,<1.25.0)"] +clouddirectory = ["mypy-boto3-clouddirectory (>=1.24.0,<1.25.0)"] +cloudformation = ["mypy-boto3-cloudformation (>=1.24.0,<1.25.0)"] +cloudfront = ["mypy-boto3-cloudfront (>=1.24.0,<1.25.0)"] +cloudhsm = ["mypy-boto3-cloudhsm (>=1.24.0,<1.25.0)"] +cloudhsmv2 = ["mypy-boto3-cloudhsmv2 (>=1.24.0,<1.25.0)"] +cloudsearch = ["mypy-boto3-cloudsearch (>=1.24.0,<1.25.0)"] +cloudsearchdomain = ["mypy-boto3-cloudsearchdomain (>=1.24.0,<1.25.0)"] +cloudtrail = ["mypy-boto3-cloudtrail (>=1.24.0,<1.25.0)"] +cloudwatch = ["mypy-boto3-cloudwatch (>=1.24.0,<1.25.0)"] +codeartifact = ["mypy-boto3-codeartifact (>=1.24.0,<1.25.0)"] +codebuild = ["mypy-boto3-codebuild (>=1.24.0,<1.25.0)"] +codecommit = ["mypy-boto3-codecommit (>=1.24.0,<1.25.0)"] +codedeploy = ["mypy-boto3-codedeploy (>=1.24.0,<1.25.0)"] +codeguru-reviewer = ["mypy-boto3-codeguru-reviewer (>=1.24.0,<1.25.0)"] +codeguruprofiler = ["mypy-boto3-codeguruprofiler (>=1.24.0,<1.25.0)"] +codepipeline = ["mypy-boto3-codepipeline (>=1.24.0,<1.25.0)"] +codestar = ["mypy-boto3-codestar (>=1.24.0,<1.25.0)"] +codestar-connections = ["mypy-boto3-codestar-connections (>=1.24.0,<1.25.0)"] +codestar-notifications = ["mypy-boto3-codestar-notifications (>=1.24.0,<1.25.0)"] +cognito-identity = ["mypy-boto3-cognito-identity (>=1.24.0,<1.25.0)"] +cognito-idp = ["mypy-boto3-cognito-idp (>=1.24.0,<1.25.0)"] +cognito-sync = ["mypy-boto3-cognito-sync (>=1.24.0,<1.25.0)"] +comprehend = ["mypy-boto3-comprehend (>=1.24.0,<1.25.0)"] +comprehendmedical = ["mypy-boto3-comprehendmedical (>=1.24.0,<1.25.0)"] +compute-optimizer = ["mypy-boto3-compute-optimizer (>=1.24.0,<1.25.0)"] +config = ["mypy-boto3-config (>=1.24.0,<1.25.0)"] +connect = ["mypy-boto3-connect (>=1.24.0,<1.25.0)"] +connect-contact-lens = ["mypy-boto3-connect-contact-lens (>=1.24.0,<1.25.0)"] +connectcampaigns = ["mypy-boto3-connectcampaigns (>=1.24.0,<1.25.0)"] +connectparticipant = ["mypy-boto3-connectparticipant (>=1.24.0,<1.25.0)"] +cur = ["mypy-boto3-cur (>=1.24.0,<1.25.0)"] +customer-profiles = ["mypy-boto3-customer-profiles (>=1.24.0,<1.25.0)"] +databrew = ["mypy-boto3-databrew (>=1.24.0,<1.25.0)"] +dataexchange = ["mypy-boto3-dataexchange (>=1.24.0,<1.25.0)"] +datapipeline = ["mypy-boto3-datapipeline (>=1.24.0,<1.25.0)"] +datasync = ["mypy-boto3-datasync (>=1.24.0,<1.25.0)"] +dax = ["mypy-boto3-dax (>=1.24.0,<1.25.0)"] +detective = ["mypy-boto3-detective (>=1.24.0,<1.25.0)"] +devicefarm = ["mypy-boto3-devicefarm (>=1.24.0,<1.25.0)"] +devops-guru = ["mypy-boto3-devops-guru (>=1.24.0,<1.25.0)"] +directconnect = ["mypy-boto3-directconnect (>=1.24.0,<1.25.0)"] +discovery = ["mypy-boto3-discovery (>=1.24.0,<1.25.0)"] +dlm = ["mypy-boto3-dlm (>=1.24.0,<1.25.0)"] +dms = ["mypy-boto3-dms (>=1.24.0,<1.25.0)"] +docdb = ["mypy-boto3-docdb (>=1.24.0,<1.25.0)"] +drs = ["mypy-boto3-drs (>=1.24.0,<1.25.0)"] +ds = ["mypy-boto3-ds (>=1.24.0,<1.25.0)"] +dynamodb = ["mypy-boto3-dynamodb (>=1.24.0,<1.25.0)"] +dynamodbstreams = ["mypy-boto3-dynamodbstreams (>=1.24.0,<1.25.0)"] +ebs = ["mypy-boto3-ebs (>=1.24.0,<1.25.0)"] +ec2 = ["mypy-boto3-ec2 (>=1.24.0,<1.25.0)"] +ec2-instance-connect = ["mypy-boto3-ec2-instance-connect (>=1.24.0,<1.25.0)"] +ecr = ["mypy-boto3-ecr (>=1.24.0,<1.25.0)"] +ecr-public = ["mypy-boto3-ecr-public (>=1.24.0,<1.25.0)"] +ecs = ["mypy-boto3-ecs (>=1.24.0,<1.25.0)"] +efs = ["mypy-boto3-efs (>=1.24.0,<1.25.0)"] +eks = ["mypy-boto3-eks (>=1.24.0,<1.25.0)"] +elastic-inference = ["mypy-boto3-elastic-inference (>=1.24.0,<1.25.0)"] +elasticache = ["mypy-boto3-elasticache (>=1.24.0,<1.25.0)"] +elasticbeanstalk = ["mypy-boto3-elasticbeanstalk (>=1.24.0,<1.25.0)"] +elastictranscoder = ["mypy-boto3-elastictranscoder (>=1.24.0,<1.25.0)"] +elb = ["mypy-boto3-elb (>=1.24.0,<1.25.0)"] +elbv2 = ["mypy-boto3-elbv2 (>=1.24.0,<1.25.0)"] +emr = ["mypy-boto3-emr (>=1.24.0,<1.25.0)"] +emr-containers = ["mypy-boto3-emr-containers (>=1.24.0,<1.25.0)"] +emr-serverless = ["mypy-boto3-emr-serverless (>=1.24.0,<1.25.0)"] +es = ["mypy-boto3-es (>=1.24.0,<1.25.0)"] +essential = ["mypy-boto3-cloudformation (>=1.24.0,<1.25.0)", "mypy-boto3-dynamodb (>=1.24.0,<1.25.0)", "mypy-boto3-ec2 (>=1.24.0,<1.25.0)", "mypy-boto3-lambda (>=1.24.0,<1.25.0)", "mypy-boto3-rds (>=1.24.0,<1.25.0)", "mypy-boto3-s3 (>=1.24.0,<1.25.0)", "mypy-boto3-sqs (>=1.24.0,<1.25.0)"] +events = ["mypy-boto3-events (>=1.24.0,<1.25.0)"] +evidently = ["mypy-boto3-evidently (>=1.24.0,<1.25.0)"] +finspace = ["mypy-boto3-finspace (>=1.24.0,<1.25.0)"] +finspace-data = ["mypy-boto3-finspace-data (>=1.24.0,<1.25.0)"] +firehose = ["mypy-boto3-firehose (>=1.24.0,<1.25.0)"] +fis = ["mypy-boto3-fis (>=1.24.0,<1.25.0)"] +fms = ["mypy-boto3-fms (>=1.24.0,<1.25.0)"] +forecast = ["mypy-boto3-forecast (>=1.24.0,<1.25.0)"] +forecastquery = ["mypy-boto3-forecastquery (>=1.24.0,<1.25.0)"] +frauddetector = ["mypy-boto3-frauddetector (>=1.24.0,<1.25.0)"] +fsx = ["mypy-boto3-fsx (>=1.24.0,<1.25.0)"] +gamelift = ["mypy-boto3-gamelift (>=1.24.0,<1.25.0)"] +gamesparks = ["mypy-boto3-gamesparks (>=1.24.0,<1.25.0)"] +glacier = ["mypy-boto3-glacier (>=1.24.0,<1.25.0)"] +globalaccelerator = ["mypy-boto3-globalaccelerator (>=1.24.0,<1.25.0)"] +glue = ["mypy-boto3-glue (>=1.24.0,<1.25.0)"] +grafana = ["mypy-boto3-grafana (>=1.24.0,<1.25.0)"] +greengrass = ["mypy-boto3-greengrass (>=1.24.0,<1.25.0)"] +greengrassv2 = ["mypy-boto3-greengrassv2 (>=1.24.0,<1.25.0)"] +groundstation = ["mypy-boto3-groundstation (>=1.24.0,<1.25.0)"] +guardduty = ["mypy-boto3-guardduty (>=1.24.0,<1.25.0)"] +health = ["mypy-boto3-health (>=1.24.0,<1.25.0)"] +healthlake = ["mypy-boto3-healthlake (>=1.24.0,<1.25.0)"] +honeycode = ["mypy-boto3-honeycode (>=1.24.0,<1.25.0)"] +iam = ["mypy-boto3-iam (>=1.24.0,<1.25.0)"] +identitystore = ["mypy-boto3-identitystore (>=1.24.0,<1.25.0)"] +imagebuilder = ["mypy-boto3-imagebuilder (>=1.24.0,<1.25.0)"] +importexport = ["mypy-boto3-importexport (>=1.24.0,<1.25.0)"] +inspector = ["mypy-boto3-inspector (>=1.24.0,<1.25.0)"] +inspector2 = ["mypy-boto3-inspector2 (>=1.24.0,<1.25.0)"] +iot = ["mypy-boto3-iot (>=1.24.0,<1.25.0)"] +iot-data = ["mypy-boto3-iot-data (>=1.24.0,<1.25.0)"] +iot-jobs-data = ["mypy-boto3-iot-jobs-data (>=1.24.0,<1.25.0)"] +iot1click-devices = ["mypy-boto3-iot1click-devices (>=1.24.0,<1.25.0)"] +iot1click-projects = ["mypy-boto3-iot1click-projects (>=1.24.0,<1.25.0)"] +iotanalytics = ["mypy-boto3-iotanalytics (>=1.24.0,<1.25.0)"] +iotdeviceadvisor = ["mypy-boto3-iotdeviceadvisor (>=1.24.0,<1.25.0)"] +iotevents = ["mypy-boto3-iotevents (>=1.24.0,<1.25.0)"] +iotevents-data = ["mypy-boto3-iotevents-data (>=1.24.0,<1.25.0)"] +iotfleethub = ["mypy-boto3-iotfleethub (>=1.24.0,<1.25.0)"] +iotsecuretunneling = ["mypy-boto3-iotsecuretunneling (>=1.24.0,<1.25.0)"] +iotsitewise = ["mypy-boto3-iotsitewise (>=1.24.0,<1.25.0)"] +iotthingsgraph = ["mypy-boto3-iotthingsgraph (>=1.24.0,<1.25.0)"] +iottwinmaker = ["mypy-boto3-iottwinmaker (>=1.24.0,<1.25.0)"] +iotwireless = ["mypy-boto3-iotwireless (>=1.24.0,<1.25.0)"] +ivs = ["mypy-boto3-ivs (>=1.24.0,<1.25.0)"] +ivschat = ["mypy-boto3-ivschat (>=1.24.0,<1.25.0)"] +kafka = ["mypy-boto3-kafka (>=1.24.0,<1.25.0)"] +kafkaconnect = ["mypy-boto3-kafkaconnect (>=1.24.0,<1.25.0)"] +kendra = ["mypy-boto3-kendra (>=1.24.0,<1.25.0)"] +keyspaces = ["mypy-boto3-keyspaces (>=1.24.0,<1.25.0)"] +kinesis = ["mypy-boto3-kinesis (>=1.24.0,<1.25.0)"] +kinesis-video-archived-media = ["mypy-boto3-kinesis-video-archived-media (>=1.24.0,<1.25.0)"] +kinesis-video-media = ["mypy-boto3-kinesis-video-media (>=1.24.0,<1.25.0)"] +kinesis-video-signaling = ["mypy-boto3-kinesis-video-signaling (>=1.24.0,<1.25.0)"] +kinesisanalytics = ["mypy-boto3-kinesisanalytics (>=1.24.0,<1.25.0)"] +kinesisanalyticsv2 = ["mypy-boto3-kinesisanalyticsv2 (>=1.24.0,<1.25.0)"] +kinesisvideo = ["mypy-boto3-kinesisvideo (>=1.24.0,<1.25.0)"] +kms = ["mypy-boto3-kms (>=1.24.0,<1.25.0)"] +lakeformation = ["mypy-boto3-lakeformation (>=1.24.0,<1.25.0)"] +lambda = ["mypy-boto3-lambda (>=1.24.0,<1.25.0)"] +lex-models = ["mypy-boto3-lex-models (>=1.24.0,<1.25.0)"] +lex-runtime = ["mypy-boto3-lex-runtime (>=1.24.0,<1.25.0)"] +lexv2-models = ["mypy-boto3-lexv2-models (>=1.24.0,<1.25.0)"] +lexv2-runtime = ["mypy-boto3-lexv2-runtime (>=1.24.0,<1.25.0)"] +license-manager = ["mypy-boto3-license-manager (>=1.24.0,<1.25.0)"] +lightsail = ["mypy-boto3-lightsail (>=1.24.0,<1.25.0)"] +location = ["mypy-boto3-location (>=1.24.0,<1.25.0)"] +logs = ["mypy-boto3-logs (>=1.24.0,<1.25.0)"] +lookoutequipment = ["mypy-boto3-lookoutequipment (>=1.24.0,<1.25.0)"] +lookoutmetrics = ["mypy-boto3-lookoutmetrics (>=1.24.0,<1.25.0)"] +lookoutvision = ["mypy-boto3-lookoutvision (>=1.24.0,<1.25.0)"] +m2 = ["mypy-boto3-m2 (>=1.24.0,<1.25.0)"] +machinelearning = ["mypy-boto3-machinelearning (>=1.24.0,<1.25.0)"] +macie = ["mypy-boto3-macie (>=1.24.0,<1.25.0)"] +macie2 = ["mypy-boto3-macie2 (>=1.24.0,<1.25.0)"] +managedblockchain = ["mypy-boto3-managedblockchain (>=1.24.0,<1.25.0)"] +marketplace-catalog = ["mypy-boto3-marketplace-catalog (>=1.24.0,<1.25.0)"] +marketplace-entitlement = ["mypy-boto3-marketplace-entitlement (>=1.24.0,<1.25.0)"] +marketplacecommerceanalytics = ["mypy-boto3-marketplacecommerceanalytics (>=1.24.0,<1.25.0)"] +mediaconnect = ["mypy-boto3-mediaconnect (>=1.24.0,<1.25.0)"] +mediaconvert = ["mypy-boto3-mediaconvert (>=1.24.0,<1.25.0)"] +medialive = ["mypy-boto3-medialive (>=1.24.0,<1.25.0)"] +mediapackage = ["mypy-boto3-mediapackage (>=1.24.0,<1.25.0)"] +mediapackage-vod = ["mypy-boto3-mediapackage-vod (>=1.24.0,<1.25.0)"] +mediastore = ["mypy-boto3-mediastore (>=1.24.0,<1.25.0)"] +mediastore-data = ["mypy-boto3-mediastore-data (>=1.24.0,<1.25.0)"] +mediatailor = ["mypy-boto3-mediatailor (>=1.24.0,<1.25.0)"] +memorydb = ["mypy-boto3-memorydb (>=1.24.0,<1.25.0)"] +meteringmarketplace = ["mypy-boto3-meteringmarketplace (>=1.24.0,<1.25.0)"] +mgh = ["mypy-boto3-mgh (>=1.24.0,<1.25.0)"] +mgn = ["mypy-boto3-mgn (>=1.24.0,<1.25.0)"] +migration-hub-refactor-spaces = ["mypy-boto3-migration-hub-refactor-spaces (>=1.24.0,<1.25.0)"] +migrationhub-config = ["mypy-boto3-migrationhub-config (>=1.24.0,<1.25.0)"] +migrationhubstrategy = ["mypy-boto3-migrationhubstrategy (>=1.24.0,<1.25.0)"] +mobile = ["mypy-boto3-mobile (>=1.24.0,<1.25.0)"] +mq = ["mypy-boto3-mq (>=1.24.0,<1.25.0)"] +mturk = ["mypy-boto3-mturk (>=1.24.0,<1.25.0)"] +mwaa = ["mypy-boto3-mwaa (>=1.24.0,<1.25.0)"] +neptune = ["mypy-boto3-neptune (>=1.24.0,<1.25.0)"] +network-firewall = ["mypy-boto3-network-firewall (>=1.24.0,<1.25.0)"] +networkmanager = ["mypy-boto3-networkmanager (>=1.24.0,<1.25.0)"] +nimble = ["mypy-boto3-nimble (>=1.24.0,<1.25.0)"] +opensearch = ["mypy-boto3-opensearch (>=1.24.0,<1.25.0)"] +opsworks = ["mypy-boto3-opsworks (>=1.24.0,<1.25.0)"] +opsworkscm = ["mypy-boto3-opsworkscm (>=1.24.0,<1.25.0)"] +organizations = ["mypy-boto3-organizations (>=1.24.0,<1.25.0)"] +outposts = ["mypy-boto3-outposts (>=1.24.0,<1.25.0)"] +panorama = ["mypy-boto3-panorama (>=1.24.0,<1.25.0)"] +personalize = ["mypy-boto3-personalize (>=1.24.0,<1.25.0)"] +personalize-events = ["mypy-boto3-personalize-events (>=1.24.0,<1.25.0)"] +personalize-runtime = ["mypy-boto3-personalize-runtime (>=1.24.0,<1.25.0)"] +pi = ["mypy-boto3-pi (>=1.24.0,<1.25.0)"] +pinpoint = ["mypy-boto3-pinpoint (>=1.24.0,<1.25.0)"] +pinpoint-email = ["mypy-boto3-pinpoint-email (>=1.24.0,<1.25.0)"] +pinpoint-sms-voice = ["mypy-boto3-pinpoint-sms-voice (>=1.24.0,<1.25.0)"] +pinpoint-sms-voice-v2 = ["mypy-boto3-pinpoint-sms-voice-v2 (>=1.24.0,<1.25.0)"] +polly = ["mypy-boto3-polly (>=1.24.0,<1.25.0)"] +pricing = ["mypy-boto3-pricing (>=1.24.0,<1.25.0)"] +proton = ["mypy-boto3-proton (>=1.24.0,<1.25.0)"] +qldb = ["mypy-boto3-qldb (>=1.24.0,<1.25.0)"] +qldb-session = ["mypy-boto3-qldb-session (>=1.24.0,<1.25.0)"] +quicksight = ["mypy-boto3-quicksight (>=1.24.0,<1.25.0)"] +ram = ["mypy-boto3-ram (>=1.24.0,<1.25.0)"] +rbin = ["mypy-boto3-rbin (>=1.24.0,<1.25.0)"] +rds = ["mypy-boto3-rds (>=1.24.0,<1.25.0)"] +rds-data = ["mypy-boto3-rds-data (>=1.24.0,<1.25.0)"] +redshift = ["mypy-boto3-redshift (>=1.24.0,<1.25.0)"] +redshift-data = ["mypy-boto3-redshift-data (>=1.24.0,<1.25.0)"] +redshift-serverless = ["mypy-boto3-redshift-serverless (>=1.24.0,<1.25.0)"] +rekognition = ["mypy-boto3-rekognition (>=1.24.0,<1.25.0)"] +resiliencehub = ["mypy-boto3-resiliencehub (>=1.24.0,<1.25.0)"] +resource-groups = ["mypy-boto3-resource-groups (>=1.24.0,<1.25.0)"] +resourcegroupstaggingapi = ["mypy-boto3-resourcegroupstaggingapi (>=1.24.0,<1.25.0)"] +robomaker = ["mypy-boto3-robomaker (>=1.24.0,<1.25.0)"] +rolesanywhere = ["mypy-boto3-rolesanywhere (>=1.24.0,<1.25.0)"] +route53 = ["mypy-boto3-route53 (>=1.24.0,<1.25.0)"] +route53-recovery-cluster = ["mypy-boto3-route53-recovery-cluster (>=1.24.0,<1.25.0)"] +route53-recovery-control-config = ["mypy-boto3-route53-recovery-control-config (>=1.24.0,<1.25.0)"] +route53-recovery-readiness = ["mypy-boto3-route53-recovery-readiness (>=1.24.0,<1.25.0)"] +route53domains = ["mypy-boto3-route53domains (>=1.24.0,<1.25.0)"] +route53resolver = ["mypy-boto3-route53resolver (>=1.24.0,<1.25.0)"] +rum = ["mypy-boto3-rum (>=1.24.0,<1.25.0)"] +s3 = ["mypy-boto3-s3 (>=1.24.0,<1.25.0)"] +s3control = ["mypy-boto3-s3control (>=1.24.0,<1.25.0)"] +s3outposts = ["mypy-boto3-s3outposts (>=1.24.0,<1.25.0)"] +sagemaker = ["mypy-boto3-sagemaker (>=1.24.0,<1.25.0)"] +sagemaker-a2i-runtime = ["mypy-boto3-sagemaker-a2i-runtime (>=1.24.0,<1.25.0)"] +sagemaker-edge = ["mypy-boto3-sagemaker-edge (>=1.24.0,<1.25.0)"] +sagemaker-featurestore-runtime = ["mypy-boto3-sagemaker-featurestore-runtime (>=1.24.0,<1.25.0)"] +sagemaker-runtime = ["mypy-boto3-sagemaker-runtime (>=1.24.0,<1.25.0)"] +savingsplans = ["mypy-boto3-savingsplans (>=1.24.0,<1.25.0)"] +schemas = ["mypy-boto3-schemas (>=1.24.0,<1.25.0)"] +sdb = ["mypy-boto3-sdb (>=1.24.0,<1.25.0)"] +secretsmanager = ["mypy-boto3-secretsmanager (>=1.24.0,<1.25.0)"] +securityhub = ["mypy-boto3-securityhub (>=1.24.0,<1.25.0)"] +serverlessrepo = ["mypy-boto3-serverlessrepo (>=1.24.0,<1.25.0)"] +service-quotas = ["mypy-boto3-service-quotas (>=1.24.0,<1.25.0)"] +servicecatalog = ["mypy-boto3-servicecatalog (>=1.24.0,<1.25.0)"] +servicecatalog-appregistry = ["mypy-boto3-servicecatalog-appregistry (>=1.24.0,<1.25.0)"] +servicediscovery = ["mypy-boto3-servicediscovery (>=1.24.0,<1.25.0)"] +ses = ["mypy-boto3-ses (>=1.24.0,<1.25.0)"] +sesv2 = ["mypy-boto3-sesv2 (>=1.24.0,<1.25.0)"] +shield = ["mypy-boto3-shield (>=1.24.0,<1.25.0)"] +signer = ["mypy-boto3-signer (>=1.24.0,<1.25.0)"] +sms = ["mypy-boto3-sms (>=1.24.0,<1.25.0)"] +sms-voice = ["mypy-boto3-sms-voice (>=1.24.0,<1.25.0)"] +snow-device-management = ["mypy-boto3-snow-device-management (>=1.24.0,<1.25.0)"] +snowball = ["mypy-boto3-snowball (>=1.24.0,<1.25.0)"] +sns = ["mypy-boto3-sns (>=1.24.0,<1.25.0)"] +sqs = ["mypy-boto3-sqs (>=1.24.0,<1.25.0)"] +ssm = ["mypy-boto3-ssm (>=1.24.0,<1.25.0)"] +ssm-contacts = ["mypy-boto3-ssm-contacts (>=1.24.0,<1.25.0)"] +ssm-incidents = ["mypy-boto3-ssm-incidents (>=1.24.0,<1.25.0)"] +sso = ["mypy-boto3-sso (>=1.24.0,<1.25.0)"] +sso-admin = ["mypy-boto3-sso-admin (>=1.24.0,<1.25.0)"] +sso-oidc = ["mypy-boto3-sso-oidc (>=1.24.0,<1.25.0)"] +stepfunctions = ["mypy-boto3-stepfunctions (>=1.24.0,<1.25.0)"] +storagegateway = ["mypy-boto3-storagegateway (>=1.24.0,<1.25.0)"] +sts = ["mypy-boto3-sts (>=1.24.0,<1.25.0)"] +support = ["mypy-boto3-support (>=1.24.0,<1.25.0)"] +swf = ["mypy-boto3-swf (>=1.24.0,<1.25.0)"] +synthetics = ["mypy-boto3-synthetics (>=1.24.0,<1.25.0)"] +textract = ["mypy-boto3-textract (>=1.24.0,<1.25.0)"] +timestream-query = ["mypy-boto3-timestream-query (>=1.24.0,<1.25.0)"] +timestream-write = ["mypy-boto3-timestream-write (>=1.24.0,<1.25.0)"] +transcribe = ["mypy-boto3-transcribe (>=1.24.0,<1.25.0)"] +transfer = ["mypy-boto3-transfer (>=1.24.0,<1.25.0)"] +translate = ["mypy-boto3-translate (>=1.24.0,<1.25.0)"] +voice-id = ["mypy-boto3-voice-id (>=1.24.0,<1.25.0)"] +waf = ["mypy-boto3-waf (>=1.24.0,<1.25.0)"] +waf-regional = ["mypy-boto3-waf-regional (>=1.24.0,<1.25.0)"] +wafv2 = ["mypy-boto3-wafv2 (>=1.24.0,<1.25.0)"] +wellarchitected = ["mypy-boto3-wellarchitected (>=1.24.0,<1.25.0)"] +wisdom = ["mypy-boto3-wisdom (>=1.24.0,<1.25.0)"] +workdocs = ["mypy-boto3-workdocs (>=1.24.0,<1.25.0)"] +worklink = ["mypy-boto3-worklink (>=1.24.0,<1.25.0)"] +workmail = ["mypy-boto3-workmail (>=1.24.0,<1.25.0)"] +workmailmessageflow = ["mypy-boto3-workmailmessageflow (>=1.24.0,<1.25.0)"] +workspaces = ["mypy-boto3-workspaces (>=1.24.0,<1.25.0)"] +workspaces-web = ["mypy-boto3-workspaces-web (>=1.24.0,<1.25.0)"] +xray = ["mypy-boto3-xray (>=1.24.0,<1.25.0)"] [[package]] name = "botocore" -version = "1.23.40" +version = "1.27.38" description = "Low-level, data-driven core of boto 3." category = "main" optional = false -python-versions = ">= 3.6" +python-versions = ">= 3.7" [package.dependencies] -jmespath = ">=0.7.1,<1.0.0" +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.12.5)"] +crt = ["awscrt (==0.13.8)"] [[package]] name = "botocore-stubs" -version = "1.23.40" -description = "Type annotations for botocore 1.23.40, generated by mypy-boto3-builder 6.3.2" +version = "1.27.38" +description = "Type annotations for botocore 1.27.38 generated with mypy-boto3-builder 7.10.1" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = ">=4.1.0" [[package]] name = "cached-property" @@ -457,15 +472,15 @@ python-versions = "*" [[package]] name = "certifi" -version = "2021.10.8" +version = "2022.6.15" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "cffi" -version = "1.15.0" +version = "1.15.1" description = "Foreign Function Interface for Python calling C code." category = "main" optional = false @@ -476,14 +491,14 @@ pycparser = "*" [[package]] name = "cfn-lint" -version = "0.57.0" +version = "0.61.3" description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved" category = "main" optional = false python-versions = ">=3.6, <=4.0, !=4.0" [package.dependencies] -aws-sam-translator = ">=1.42.0" +aws-sam-translator = ">=1.47.0" jschema-to-python = ">=1.2.3,<1.3.0" jsonpatch = "*" jsonschema = ">=3.0,<4.0" @@ -491,33 +506,32 @@ junit-xml = ">=1.9,<2.0" networkx = ">=2.4,<3.0" pyyaml = ">5.4" sarif-om = ">=1.0.4,<1.1.0" -six = ">=1.11" [[package]] name = "charset-normalizer" -version = "2.0.10" +version = "2.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false -python-versions = ">=3.5.0" +python-versions = ">=3.6.0" [package.extras] unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.0.3" +version = "8.1.3" description = "Composable command line interface toolkit" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.5" description = "Cross-platform colored terminal text." category = "main" optional = false @@ -525,7 +539,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "cryptography" -version = "36.0.1" +version = "37.0.4" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false @@ -540,29 +554,28 @@ docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] sdist = ["setuptools_rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] [[package]] name = "docker" -version = "4.2.2" +version = "5.0.3" description = "A Python library for the Docker Engine API." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" [package.dependencies] -pypiwin32 = {version = "223", markers = "sys_platform == \"win32\" and python_version >= \"3.6\""} +pywin32 = {version = "227", markers = "sys_platform == \"win32\""} requests = ">=2.14.2,<2.18.0 || >2.18.0" -six = ">=1.4.0" websocket-client = ">=0.32.0" [package.extras] ssh = ["paramiko (>=2.4.2)"] -tls = ["pyOpenSSL (>=17.5.0)", "cryptography (>=1.3.4)", "idna (>=2.0.0)"] +tls = ["pyOpenSSL (>=17.5.0)", "cryptography (>=3.4.7)", "idna (>=2.0.0)"] [[package]] name = "ecdsa" -version = "0.17.0" +version = "0.18.0" description = "ECDSA cryptographic signature library (pure python)" category = "main" optional = false @@ -601,14 +614,15 @@ pyflakes = ">=2.3.0,<2.4.0" [[package]] name = "flask" -version = "2.0.2" +version = "2.1.3" description = "A simple framework for building complex web applications." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -click = ">=7.1.2" +click = ">=8.0" +importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} itsdangerous = ">=2.0" Jinja2 = ">=3.0" Werkzeug = ">=2.0" @@ -629,17 +643,9 @@ python-versions = "*" Flask = ">=0.9" Six = "*" -[[package]] -name = "future" -version = "0.18.2" -description = "Clean single-source support for Python 3 and 2" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - [[package]] name = "graphql-core" -version = "3.2.0" +version = "3.2.1" description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." category = "main" optional = false @@ -653,6 +659,22 @@ category = "main" optional = false python-versions = ">=3.5" +[[package]] +name = "importlib-metadata" +version = "4.12.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +perf = ["ipython"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] + [[package]] name = "iniconfig" version = "1.1.1" @@ -663,19 +685,19 @@ python-versions = "*" [[package]] name = "itsdangerous" -version = "2.0.1" +version = "2.1.2" description = "Safely pass data to untrusted environments and back." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "jinja2" -version = "3.0.3" +version = "3.1.2" description = "A very fast and expressive template engine." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] MarkupSafe = ">=2.0" @@ -685,11 +707,11 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jmespath" -version = "0.10.0" +version = "1.0.1" description = "JSON Matching Expressions" category = "main" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.7" [[package]] name = "jschema-to-python" @@ -706,7 +728,7 @@ pbr = "*" [[package]] name = "jsondiff" -version = "1.3.0" +version = "2.0.0" description = "Diff JSON and JSON-like structures in Python" category = "main" optional = false @@ -725,7 +747,7 @@ jsonpointer = ">=1.9" [[package]] name = "jsonpickle" -version = "2.1.0" +version = "2.2.0" description = "Python library for serializing any arbitrary object graph into JSON" category = "main" optional = false @@ -733,12 +755,12 @@ python-versions = ">=2.7" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black-multipy", "pytest-cov", "ecdsa", "feedparser", "numpy", "pandas", "pymongo", "scikit-learn", "sqlalchemy", "enum34", "jsonlib"] -"testing.libs" = ["demjson", "simplejson", "ujson", "yajl"] +testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-black-multipy", "pytest-cov", "ecdsa", "feedparser", "numpy", "pandas", "pymongo", "scikit-learn", "sqlalchemy", "pytest-flake8 (<1.1.0)", "enum34", "jsonlib", "pytest-flake8 (>=1.1.1)"] +"testing.libs" = ["simplejson", "ujson", "yajl"] [[package]] name = "jsonpointer" -version = "2.2" +version = "2.3" description = "Identify specific nodes in a JSON document (RFC 6901)" category = "main" optional = false @@ -774,11 +796,11 @@ six = "*" [[package]] name = "markupsafe" -version = "2.0.1" +version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "mccabe" @@ -790,7 +812,7 @@ python-versions = "*" [[package]] name = "moto" -version = "3.1.9" +version = "3.1.16" description = "A library that allows your python tests to easily mock out the boto library" category = "main" optional = false @@ -811,7 +833,8 @@ idna = {version = ">=2.5,<4", optional = true, markers = "extra == \"server\""} Jinja2 = ">=2.10.1" jsondiff = {version = ">=1.1.2", optional = true, markers = "extra == \"server\""} MarkupSafe = "!=2.0.0a1" -pyparsing = {version = ">=3.0.0", optional = true, markers = "extra == \"server\""} +openapi-spec-validator = {version = ">=0.2.8", optional = true, markers = "extra == \"server\""} +pyparsing = {version = ">=3.0.7", optional = true, markers = "extra == \"server\""} python-dateutil = ">=2.1,<3.0.0" python-jose = {version = ">=3.1.0,<4.0.0", extras = ["cryptography"], optional = true, markers = "extra == \"server\""} pytz = "*" @@ -819,17 +842,17 @@ PyYAML = {version = ">=5.1", optional = true, markers = "extra == \"server\""} requests = ">=2.5" responses = ">=0.9.0" sshpubkeys = {version = ">=3.1.0", optional = true, markers = "extra == \"server\""} -werkzeug = "*" +werkzeug = ">=0.5" xmltodict = "*" [package.extras] -all = ["PyYAML (>=5.1)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (!=0.15)", "docker (>=2.5.1)", "graphql-core", "jsondiff (>=1.1.2)", "aws-xray-sdk (>=0.93,!=0.96)", "idna (>=2.5,<4)", "cfn-lint (>=0.4.0)", "sshpubkeys (>=3.1.0)", "pyparsing (>=3.0.0)", "setuptools"] -apigateway = ["PyYAML (>=5.1)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (!=0.15)"] +all = ["PyYAML (>=5.1)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (!=0.15)", "docker (>=2.5.1)", "graphql-core", "jsondiff (>=1.1.2)", "aws-xray-sdk (>=0.93,!=0.96)", "idna (>=2.5,<4)", "cfn-lint (>=0.4.0)", "sshpubkeys (>=3.1.0)", "pyparsing (>=3.0.7)", "openapi-spec-validator (>=0.2.8)", "setuptools"] +apigateway = ["PyYAML (>=5.1)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (!=0.15)", "openapi-spec-validator (>=0.2.8)"] apigatewayv2 = ["PyYAML (>=5.1)"] appsync = ["graphql-core"] awslambda = ["docker (>=2.5.1)"] batch = ["docker (>=2.5.1)"] -cloudformation = ["docker (>=2.5.1)", "PyYAML (>=5.1)", "cfn-lint (>=0.4.0)"] +cloudformation = ["PyYAML (>=5.1)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (!=0.15)", "docker (>=2.5.1)", "graphql-core", "jsondiff (>=1.1.2)", "aws-xray-sdk (>=0.93,!=0.96)", "idna (>=2.5,<4)", "cfn-lint (>=0.4.0)", "sshpubkeys (>=3.1.0)", "pyparsing (>=3.0.7)", "openapi-spec-validator (>=0.2.8)", "setuptools"] cognitoidp = ["python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (!=0.15)"] ds = ["sshpubkeys (>=3.1.0)"] dynamodb = ["docker (>=2.5.1)"] @@ -838,30 +861,42 @@ dynamodbstreams = ["docker (>=2.5.1)"] ebs = ["sshpubkeys (>=3.1.0)"] ec2 = ["sshpubkeys (>=3.1.0)"] efs = ["sshpubkeys (>=3.1.0)"] -glue = ["pyparsing (>=3.0.0)"] +glue = ["pyparsing (>=3.0.7)"] iotdata = ["jsondiff (>=1.1.2)"] route53resolver = ["sshpubkeys (>=3.1.0)"] s3 = ["PyYAML (>=5.1)"] -server = ["PyYAML (>=5.1)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (!=0.15)", "docker (>=2.5.1)", "graphql-core", "jsondiff (>=1.1.2)", "aws-xray-sdk (>=0.93,!=0.96)", "idna (>=2.5,<4)", "cfn-lint (>=0.4.0)", "sshpubkeys (>=3.1.0)", "pyparsing (>=3.0.0)", "setuptools", "flask", "flask-cors"] +server = ["PyYAML (>=5.1)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (!=0.15)", "docker (>=2.5.1)", "graphql-core", "jsondiff (>=1.1.2)", "aws-xray-sdk (>=0.93,!=0.96)", "idna (>=2.5,<4)", "cfn-lint (>=0.4.0)", "sshpubkeys (>=3.1.0)", "pyparsing (>=3.0.7)", "openapi-spec-validator (>=0.2.8)", "setuptools", "flask", "flask-cors"] ssm = ["PyYAML (>=5.1)", "dataclasses"] xray = ["aws-xray-sdk (>=0.93,!=0.96)", "setuptools"] [[package]] name = "mypy" -version = "0.910" +version = "0.971" description = "Optional static typing for Python" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [package.dependencies] -mypy-extensions = ">=0.4.3,<0.5.0" -toml = "*" -typing-extensions = ">=3.7.4" +mypy-extensions = ">=0.4.3" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=3.10" [package.extras] dmypy = ["psutil (>=4.0)"] -python2 = ["typed-ast (>=1.4.0,<1.5.0)"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-boto3-s3" +version = "1.24.36.post1" +description = "Type annotations for boto3.S3 1.24.36 service generated with mypy-boto3-builder 7.10.0" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = ">=4.1.0" [[package]] name = "mypy-extensions" @@ -873,18 +908,50 @@ python-versions = "*" [[package]] name = "networkx" -version = "2.6.3" +version = "2.8.5" description = "Python package for creating and manipulating graphs and networks" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.extras] -default = ["numpy (>=1.19)", "scipy (>=1.5,!=1.6.1)", "matplotlib (>=3.3)", "pandas (>=1.1)"] -developer = ["black (==21.5b1)", "pre-commit (>=2.12)"] -doc = ["sphinx (>=4.0,<5.0)", "pydata-sphinx-theme (>=0.6,<1.0)", "sphinx-gallery (>=0.9,<1.0)", "numpydoc (>=1.1)", "pillow (>=8.2)", "nb2plots (>=0.6)", "texext (>=0.6.6)"] -extra = ["lxml (>=4.5)", "pygraphviz (>=1.7)", "pydot (>=1.4.1)"] -test = ["pytest (>=6.2)", "pytest-cov (>=2.12)", "codecov (>=2.1)"] +default = ["numpy (>=1.19)", "scipy (>=1.8)", "matplotlib (>=3.4)", "pandas (>=1.3)"] +developer = ["pre-commit (>=2.19)", "mypy (>=0.960)"] +doc = ["sphinx (>=5)", "pydata-sphinx-theme (>=0.9)", "sphinx-gallery (>=0.10)", "numpydoc (>=1.4)", "pillow (>=9.1)", "nb2plots (>=0.6)", "texext (>=0.6.6)"] +extra = ["lxml (>=4.6)", "pygraphviz (>=1.9)", "pydot (>=1.4.2)", "sympy (>=1.10)"] +test = ["pytest (>=7.1)", "pytest-cov (>=3.0)", "codecov (>=2.1)"] + +[[package]] +name = "openapi-schema-validator" +version = "0.2.3" +description = "OpenAPI schema validation for Python" +category = "main" +optional = false +python-versions = ">=3.7.0,<4.0.0" + +[package.dependencies] +jsonschema = ">=3.0.0,<5.0.0" + +[package.extras] +rfc3339-validator = ["rfc3339-validator"] +strict-rfc3339 = ["strict-rfc3339"] +isodate = ["isodate"] + +[[package]] +name = "openapi-spec-validator" +version = "0.4.0" +description = "OpenAPI 2.0 (aka Swagger) and OpenAPI 3.0 spec validator" +category = "main" +optional = false +python-versions = ">=3.7.0,<4.0.0" + +[package.dependencies] +jsonschema = ">=3.2.0,<5.0.0" +openapi-schema-validator = ">=0.2.0,<0.3.0" +PyYAML = ">=5.1" + +[package.extras] +requests = ["requests"] [[package]] name = "packaging" @@ -899,7 +966,7 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pbr" -version = "5.8.0" +version = "5.9.0" description = "Python Build Reasonableness" category = "main" optional = false @@ -995,25 +1062,14 @@ tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"] [[package]] name = "pyparsing" -version = "3.0.6" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pypiwin32" -version = "223" -description = "" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pywin32 = ">=223" +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pyrsistent" @@ -1128,7 +1184,7 @@ pycryptodome = ["pycryptodome (>=3.3.1,<4.0.0)", "pyasn1"] [[package]] name = "pytz" -version = "2021.3" +version = "2022.1" description = "World timezone definitions, modern and historical" category = "main" optional = false @@ -1136,7 +1192,7 @@ python-versions = "*" [[package]] name = "pywin32" -version = "301" +version = "227" description = "Python for Window Extensions" category = "main" optional = false @@ -1152,41 +1208,40 @@ python-versions = ">=3.6" [[package]] name = "requests" -version = "2.27.1" +version = "2.28.1" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7, <4" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "responses" -version = "0.17.0" +version = "0.21.0" description = "A utility library for mocking out the `requests` Python library." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" [package.dependencies] -requests = ">=2.0" -six = "*" +requests = ">=2.0,<3.0" urllib3 = ">=1.25.10" [package.extras] -tests = ["coverage (>=3.7.1,<6.0.0)", "pytest-cov", "pytest-localserver", "flake8", "types-mock", "types-requests", "types-six", "pytest (>=4.6,<5.0)", "pytest (>=4.6)", "mypy"] +tests = ["pytest (>=7.0.0)", "coverage (>=6.0.0)", "pytest-cov", "pytest-asyncio", "pytest-localserver", "flake8", "types-mock", "types-requests", "mypy"] [[package]] name = "rsa" -version = "4.8" +version = "4.9" description = "Pure-Python RSA implementation" category = "main" optional = false @@ -1197,11 +1252,11 @@ pyasn1 = ">=0.1.3" [[package]] name = "s3transfer" -version = "0.5.0" +version = "0.6.0" description = "An Amazon S3 Transfer Manager" category = "main" optional = false -python-versions = ">= 3.6" +python-versions = ">= 3.7" [package.dependencies] botocore = ">=1.12.36,<2.0a.0" @@ -1252,9 +1307,17 @@ category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "types-psycopg2" -version = "2.9.6" +version = "2.9.18" description = "Typing stubs for psycopg2" category = "main" optional = false @@ -1262,7 +1325,7 @@ python-versions = "*" [[package]] name = "types-requests" -version = "2.27.7" +version = "2.28.5" description = "Typing stubs for requests" category = "main" optional = false @@ -1271,9 +1334,17 @@ python-versions = "*" [package.dependencies] types-urllib3 = "<1.27" +[[package]] +name = "types-s3transfer" +version = "0.6.0.post3" +description = "Type annotations and code completion for s3transfer" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" + [[package]] name = "types-urllib3" -version = "1.26.7" +version = "1.26.17" description = "Typing stubs for urllib3" category = "main" optional = false @@ -1281,32 +1352,32 @@ python-versions = "*" [[package]] name = "typing-extensions" -version = "3.10.0.2" -description = "Backported and Experimental Type Hints for Python 3.5+" +version = "4.3.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" [[package]] name = "urllib3" -version = "1.26.8" +version = "1.26.11" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" [package.extras] -brotli = ["brotlipy (>=0.6.0)"] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "websocket-client" -version = "1.2.3" +version = "1.3.3" description = "WebSocket client for Python with low level API options" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] @@ -1315,18 +1386,21 @@ test = ["websockets"] [[package]] name = "werkzeug" -version = "2.0.2" +version = "2.2.0" description = "The comprehensive WSGI web application library." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog"] [[package]] name = "wrapt" -version = "1.13.3" +version = "1.14.1" description = "Module for decorators, wrappers and monkey patching." category = "main" optional = false @@ -1334,11 +1408,11 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "xmltodict" -version = "0.12.0" +version = "0.13.0" description = "Makes working with XML feel like you are working with JSON" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.4" [[package]] name = "yapf" @@ -1348,697 +1422,132 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "zipp" +version = "3.8.1" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] + [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "be9c00bb5081535805824242fea2a03b2f82fa9466856d618e24b3140c7da6a0" +content-hash = "17e901dca9680c6ead56661492431cfce65cb20508be419599f0862ff2d1d827" [metadata.files] -aiopg = [ - {file = "aiopg-1.3.3-py3-none-any.whl", hash = "sha256:2842dd8741460eeef940032dcb577bfba4d4115205dd82a73ce13b3271f5bf0a"}, - {file = "aiopg-1.3.3.tar.gz", hash = "sha256:547c6ba4ea0d73c2a11a2f44387d7133cc01d3c6f3b8ed976c0ac1eff4f595d7"}, -] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] -asyncpg = [ - {file = "asyncpg-0.24.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c4fc0205fe4ddd5aeb3dfdc0f7bafd43411181e1f5650189608e5971cceacff1"}, - {file = "asyncpg-0.24.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a7095890c96ba36f9f668eb552bb020dddb44f8e73e932f8573efc613ee83843"}, - {file = "asyncpg-0.24.0-cp310-cp310-win_amd64.whl", hash = "sha256:8ff5073d4b654e34bd5eaadc01dc4d68b8a9609084d835acd364cd934190a08d"}, - {file = "asyncpg-0.24.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e36c6806883786b19551bb70a4882561f31135dc8105a59662e0376cf5b2cbc5"}, - {file = "asyncpg-0.24.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ddffcb85227bf39cd1bedd4603e0082b243cf3b14ced64dce506a15b05232b83"}, - {file = "asyncpg-0.24.0-cp37-cp37m-win_amd64.whl", hash = "sha256:41704c561d354bef01353835a7846e5606faabbeb846214dfcf666cf53319f18"}, - {file = "asyncpg-0.24.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:29ef6ae0a617fc13cc2ac5dc8e9b367bb83cba220614b437af9b67766f4b6b20"}, - {file = "asyncpg-0.24.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eed43abc6ccf1dc02e0d0efc06ce46a411362f3358847c6b0ec9a43426f91ece"}, - {file = "asyncpg-0.24.0-cp38-cp38-win_amd64.whl", hash = "sha256:129d501f3d30616afd51eb8d3142ef51ba05374256bd5834cec3ef4956a9b317"}, - {file = "asyncpg-0.24.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a458fc69051fbb67d995fdda46d75a012b5d6200f91e17d23d4751482640ed4c"}, - {file = "asyncpg-0.24.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:556b0e92e2b75dc028b3c4bc9bd5162ddf0053b856437cf1f04c97f9c6837d03"}, - {file = "asyncpg-0.24.0-cp39-cp39-win_amd64.whl", hash = "sha256:a738f4807c853623d3f93f0fea11f61be6b0e5ca16ea8aeb42c2c7ee742aa853"}, - {file = "asyncpg-0.24.0.tar.gz", hash = "sha256:dd2fa063c3344823487d9ddccb40802f02622ddf8bf8a6cc53885ee7a2c1c0c6"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, -] -aws-sam-translator = [ - {file = "aws-sam-translator-1.42.0.tar.gz", hash = "sha256:8a7976c0ee2fca004a590e17d3551a49c8d8ba14ed0cb3674ea270d41d0dcd5b"}, - {file = "aws_sam_translator-1.42.0-py2-none-any.whl", hash = "sha256:4f5d3d5d0567fe728e75c5c8dff599f7c88313b3b8e85b9b17a2c00cb046b2e4"}, - {file = "aws_sam_translator-1.42.0-py3-none-any.whl", hash = "sha256:31875e4f639511f506d0c757a2a50756bd846440724079e867aafb12c534ac23"}, -] -aws-xray-sdk = [ - {file = "aws-xray-sdk-2.9.0.tar.gz", hash = "sha256:b0cd972db218d4d8f7b53ad806fc6184626b924c4997ae58fc9f2a8cd1281568"}, - {file = "aws_xray_sdk-2.9.0-py2.py3-none-any.whl", hash = "sha256:98216b3ac8281b51b59a8703f8ec561c460807d9d0679838f5c0179d381d7e58"}, -] -backoff = [ - {file = "backoff-1.11.1-py2.py3-none-any.whl", hash = "sha256:61928f8fa48d52e4faa81875eecf308eccfb1016b018bb6bd21e05b5d90a96c5"}, - {file = "backoff-1.11.1.tar.gz", hash = "sha256:ccb962a2378418c667b3c979b504fdeb7d9e0d29c0579e3b13b86467177728cb"}, -] -boto3 = [ - {file = "boto3-1.20.40-py3-none-any.whl", hash = "sha256:cfe85589e4a0a997c7b9ae7432400b03fa6fa5fea29fdc48db3099a903b76998"}, - {file = "boto3-1.20.40.tar.gz", hash = "sha256:66aef9a6d8cad393f69166112ba49e14e2c6766f9278c96134101314a9af2992"}, -] -boto3-stubs = [ - {file = "boto3-stubs-1.20.40.tar.gz", hash = "sha256:24f23e14de15d29a85e301b5beb144d2c778ed350e0c08a2136a978c8105e3c9"}, - {file = "boto3_stubs-1.20.40-py3-none-any.whl", hash = "sha256:2e940afd4a47688bb536155b10bdc65cc99390217bfcb392f4fc8c188646a65f"}, -] -botocore = [ - {file = "botocore-1.23.40-py3-none-any.whl", hash = "sha256:88a314fe27cd97a0c731094c5b34db01ebe930801700e5d1b68485ebde746c3c"}, - {file = "botocore-1.23.40.tar.gz", hash = "sha256:49baa1fca4483b24769f0743fbf72afe4db391f41f1fc12ea34e06036db642a4"}, -] -botocore-stubs = [ - {file = "botocore-stubs-1.23.40.tar.gz", hash = "sha256:48529a2b7e14c6e3dd4544c21d4cf342ad512e2a526f5262c565357683d78787"}, - {file = "botocore_stubs-1.23.40-py3-none-any.whl", hash = "sha256:b5762895175cbacfa989b7ff313ca20f30f82137fcfd8a389cfe4a920cb57e73"}, -] -cached-property = [ - {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, - {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, -] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cffi = [ - {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, - {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, - {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, - {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, - {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, - {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, - {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, - {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, - {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, - {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, - {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, - {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, - {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, - {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, - {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, - {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, - {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, -] -cfn-lint = [ - {file = "cfn-lint-0.57.0.tar.gz", hash = "sha256:17c2e3ba693ae259c868e221d159dc4aa9c7e60a970cdc1d1309150c9250faf4"}, - {file = "cfn_lint-0.57.0-py3-none-any.whl", hash = "sha256:71b5e23b6a5101416c13275baa0f172c935f679fac6956ae768c467a117913c2"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.10.tar.gz", hash = "sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd"}, - {file = "charset_normalizer-2.0.10-py3-none-any.whl", hash = "sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455"}, -] -click = [ - {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, - {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -cryptography = [ - {file = "cryptography-36.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:73bc2d3f2444bcfeac67dd130ff2ea598ea5f20b40e36d19821b4df8c9c5037b"}, - {file = "cryptography-36.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:2d87cdcb378d3cfed944dac30596da1968f88fb96d7fc34fdae30a99054b2e31"}, - {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74d6c7e80609c0f4c2434b97b80c7f8fdfaa072ca4baab7e239a15d6d70ed73a"}, - {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:6c0c021f35b421ebf5976abf2daacc47e235f8b6082d3396a2fe3ccd537ab173"}, - {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d59a9d55027a8b88fd9fd2826c4392bd487d74bf628bb9d39beecc62a644c12"}, - {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a817b961b46894c5ca8a66b599c745b9a3d9f822725221f0e0fe49dc043a3a3"}, - {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:94ae132f0e40fe48f310bba63f477f14a43116f05ddb69d6fa31e93f05848ae2"}, - {file = "cryptography-36.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7be0eec337359c155df191d6ae00a5e8bbb63933883f4f5dffc439dac5348c3f"}, - {file = "cryptography-36.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e0344c14c9cb89e76eb6a060e67980c9e35b3f36691e15e1b7a9e58a0a6c6dc3"}, - {file = "cryptography-36.0.1-cp36-abi3-win32.whl", hash = "sha256:4caa4b893d8fad33cf1964d3e51842cd78ba87401ab1d2e44556826df849a8ca"}, - {file = "cryptography-36.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:391432971a66cfaf94b21c24ab465a4cc3e8bf4a939c1ca5c3e3a6e0abebdbcf"}, - {file = "cryptography-36.0.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb5829d027ff82aa872d76158919045a7c1e91fbf241aec32cb07956e9ebd3c9"}, - {file = "cryptography-36.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc15b1c22e55c4d5566e3ca4db8689470a0ca2babef8e3a9ee057a8b82ce4b1"}, - {file = "cryptography-36.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:596f3cd67e1b950bc372c33f1a28a0692080625592ea6392987dba7f09f17a94"}, - {file = "cryptography-36.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:30ee1eb3ebe1644d1c3f183d115a8c04e4e603ed6ce8e394ed39eea4a98469ac"}, - {file = "cryptography-36.0.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec63da4e7e4a5f924b90af42eddf20b698a70e58d86a72d943857c4c6045b3ee"}, - {file = "cryptography-36.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca238ceb7ba0bdf6ce88c1b74a87bffcee5afbfa1e41e173b1ceb095b39add46"}, - {file = "cryptography-36.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:ca28641954f767f9822c24e927ad894d45d5a1e501767599647259cbf030b903"}, - {file = "cryptography-36.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:39bdf8e70eee6b1c7b289ec6e5d84d49a6bfa11f8b8646b5b3dfe41219153316"}, - {file = "cryptography-36.0.1.tar.gz", hash = "sha256:53e5c1dc3d7a953de055d77bef2ff607ceef7a2aac0353b5d630ab67f7423638"}, -] -docker = [ - {file = "docker-4.2.2-py2.py3-none-any.whl", hash = "sha256:03a46400c4080cb6f7aa997f881ddd84fef855499ece219d75fbdb53289c17ab"}, - {file = "docker-4.2.2.tar.gz", hash = "sha256:26eebadce7e298f55b76a88c4f8802476c5eaddbdbe38dbc6cce8781c47c9b54"}, -] -ecdsa = [ - {file = "ecdsa-0.17.0-py2.py3-none-any.whl", hash = "sha256:5cf31d5b33743abe0dfc28999036c849a69d548f994b535e527ee3cb7f3ef676"}, - {file = "ecdsa-0.17.0.tar.gz", hash = "sha256:b9f500bb439e4153d0330610f5d26baaf18d17b8ced1bc54410d189385ea68aa"}, -] -execnet = [ - {file = "execnet-1.9.0-py2.py3-none-any.whl", hash = "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142"}, - {file = "execnet-1.9.0.tar.gz", hash = "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5"}, -] -flake8 = [ - {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, - {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, -] -flask = [ - {file = "Flask-2.0.2-py3-none-any.whl", hash = "sha256:cb90f62f1d8e4dc4621f52106613488b5ba826b2e1e10a33eac92f723093ab6a"}, - {file = "Flask-2.0.2.tar.gz", hash = "sha256:7b2fb8e934ddd50731893bdcdb00fc8c0315916f9fcd50d22c7cc1a95ab634e2"}, -] -flask-cors = [ - {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"}, - {file = "Flask_Cors-3.0.10-py2.py3-none-any.whl", hash = "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438"}, -] -future = [ - {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, -] -graphql-core = [ - {file = "graphql-core-3.2.0.tar.gz", hash = "sha256:86e2a0be008bfde19ef78388de8a725a1d942a9190ca431c24a60837973803ce"}, - {file = "graphql_core-3.2.0-py3-none-any.whl", hash = "sha256:0dda7e63676f119bb3d814621190fedad72fda07a8e9ab780bedd9f1957c6dc6"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -itsdangerous = [ - {file = "itsdangerous-2.0.1-py3-none-any.whl", hash = "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c"}, - {file = "itsdangerous-2.0.1.tar.gz", hash = "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0"}, -] -jinja2 = [ - {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, - {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, -] -jmespath = [ - {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, - {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, -] -jschema-to-python = [ - {file = "jschema_to_python-1.2.3-py3-none-any.whl", hash = "sha256:8a703ca7604d42d74b2815eecf99a33359a8dccbb80806cce386d5e2dd992b05"}, - {file = "jschema_to_python-1.2.3.tar.gz", hash = "sha256:76ff14fe5d304708ccad1284e4b11f96a658949a31ee7faed9e0995279549b91"}, -] -jsondiff = [ - {file = "jsondiff-1.3.0.tar.gz", hash = "sha256:5122bf4708a031b02db029366184a87c5d0ddd5a327a5884ee6cf0193e599d71"}, -] -jsonpatch = [ - {file = "jsonpatch-1.32-py2.py3-none-any.whl", hash = "sha256:26ac385719ac9f54df8a2f0827bb8253aa3ea8ab7b3368457bcdb8c14595a397"}, - {file = "jsonpatch-1.32.tar.gz", hash = "sha256:b6ddfe6c3db30d81a96aaeceb6baf916094ffa23d7dd5fa2c13e13f8b6e600c2"}, -] -jsonpickle = [ - {file = "jsonpickle-2.1.0-py2.py3-none-any.whl", hash = "sha256:1dee77ddc5d652dfdabc33d33cff9d7e131d428007007da4fd6f7071ae774b0f"}, - {file = "jsonpickle-2.1.0.tar.gz", hash = "sha256:84684cfc5338a534173c8dd69809e40f2865d0be1f8a2b7af8465e5b968dcfa9"}, -] -jsonpointer = [ - {file = "jsonpointer-2.2-py2.py3-none-any.whl", hash = "sha256:26d9a47a72d4dc3e3ae72c4c6cd432afd73c680164cd2540772eab53cb3823b6"}, - {file = "jsonpointer-2.2.tar.gz", hash = "sha256:f09f8deecaaa5aea65b5eb4f67ca4e54e1a61f7a11c75085e360fe6feb6a48bf"}, -] -jsonschema = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, -] -junit-xml = [ - {file = "junit_xml-1.9-py2.py3-none-any.whl", hash = "sha256:ec5ca1a55aefdd76d28fcc0b135251d156c7106fa979686a4b48d62b761b4732"}, -] -markupsafe = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] -mccabe = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, -] -moto = [ - {file = "moto-3.1.9-py3-none-any.whl", hash = "sha256:8928ec168e5fd88b1127413b2fa570a80d45f25182cdad793edd208d07825269"}, - {file = "moto-3.1.9.tar.gz", hash = "sha256:ba683e70950b6579189bc12d74c1477aa036c090c6ad8b151a22f5896c005113"}, -] -mypy = [ - {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"}, - {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"}, - {file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"}, - {file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"}, - {file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"}, - {file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"}, - {file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"}, - {file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"}, - {file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"}, - {file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"}, - {file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"}, - {file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"}, - {file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"}, - {file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"}, - {file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"}, - {file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"}, - {file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"}, - {file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"}, - {file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"}, - {file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"}, - {file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"}, - {file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"}, - {file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -networkx = [ - {file = "networkx-2.6.3-py3-none-any.whl", hash = "sha256:80b6b89c77d1dfb64a4c7854981b60aeea6360ac02c6d4e4913319e0a313abef"}, - {file = "networkx-2.6.3.tar.gz", hash = "sha256:c0946ed31d71f1b732b5aaa6da5a0388a345019af232ce2f49c766e2d6795c51"}, -] +aiopg = [] +async-timeout = [] +asyncpg = [] +atomicwrites = [] +attrs = [] +aws-sam-translator = [] +aws-xray-sdk = [] +backoff = [] +boto3 = [] +boto3-stubs = [] +botocore = [] +botocore-stubs = [] +cached-property = [] +certifi = [] +cffi = [] +cfn-lint = [] +charset-normalizer = [] +click = [] +colorama = [] +cryptography = [] +docker = [] +ecdsa = [] +execnet = [] +flake8 = [] +flask = [] +flask-cors = [] +graphql-core = [] +idna = [] +importlib-metadata = [] +iniconfig = [] +itsdangerous = [] +jinja2 = [] +jmespath = [] +jschema-to-python = [] +jsondiff = [] +jsonpatch = [] +jsonpickle = [] +jsonpointer = [] +jsonschema = [] +junit-xml = [] +markupsafe = [] +mccabe = [] +moto = [] +mypy = [] +mypy-boto3-s3 = [] +mypy-extensions = [] +networkx = [] +openapi-schema-validator = [] +openapi-spec-validator = [] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] -pbr = [ - {file = "pbr-5.8.0-py2.py3-none-any.whl", hash = "sha256:176e8560eaf61e127817ef93d8a844803abb27a4d4637f0ff3bb783129be2e0a"}, - {file = "pbr-5.8.0.tar.gz", hash = "sha256:672d8ebee84921862110f23fcec2acea191ef58543d34dfe9ef3d9f13c31cddf"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -prometheus-client = [ - {file = "prometheus_client-0.14.1-py3-none-any.whl", hash = "sha256:522fded625282822a89e2773452f42df14b5a8e84a86433e3f8a189c1d54dc01"}, - {file = "prometheus_client-0.14.1.tar.gz", hash = "sha256:5459c427624961076277fdc6dc50540e2bacb98eebde99886e59ec55ed92093a"}, -] -psycopg2-binary = [ - {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:0a29729145aaaf1ad8bafe663131890e2111f13416b60e460dae0a96af5905c9"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a79d622f5206d695d7824cbf609a4f5b88ea6d6dab5f7c147fc6d333a8787e4"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:090f3348c0ab2cceb6dfbe6bf721ef61262ddf518cd6cc6ecc7d334996d64efa"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a9e1f75f96ea388fbcef36c70640c4efbe4650658f3d6a2967b4cc70e907352e"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c3ae8e75eb7160851e59adc77b3a19a976e50622e44fd4fd47b8b18208189d42"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win32.whl", hash = "sha256:7b1e9b80afca7b7a386ef087db614faebbf8839b7f4db5eb107d0f1a53225029"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:8b344adbb9a862de0c635f4f0425b7958bf5a4b927c8594e6e8d261775796d53"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:e847774f8ffd5b398a75bc1c18fbb56564cda3d629fe68fd81971fece2d3c67e"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68641a34023d306be959101b345732360fc2ea4938982309b786f7be1b43a4a1"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3303f8807f342641851578ee7ed1f3efc9802d00a6f83c101d21c608cb864460"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:e3699852e22aa68c10de06524a3721ade969abf382da95884e6a10ff798f9281"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:526ea0378246d9b080148f2d6681229f4b5964543c170dd10bf4faaab6e0d27f"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b1c8068513f5b158cf7e29c43a77eb34b407db29aca749d3eb9293ee0d3103ca"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:15803fa813ea05bef089fa78835118b5434204f3a17cb9f1e5dbfd0b9deea5af"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:152f09f57417b831418304c7f30d727dc83a12761627bb826951692cc6491e57"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:404224e5fef3b193f892abdbf8961ce20e0b6642886cfe1fe1923f41aaa75c9d"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:1f6b813106a3abdf7b03640d36e24669234120c72e91d5cbaeb87c5f7c36c65b"}, - {file = "psycopg2_binary-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:2d872e3c9d5d075a2e104540965a1cf898b52274a5923936e5bfddb58c59c7c2"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:10bb90fb4d523a2aa67773d4ff2b833ec00857f5912bafcfd5f5414e45280fb1"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a52ecab70af13e899f7847b3e074eeb16ebac5615665db33bce8a1009cf33"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a29b3ca4ec9defec6d42bf5feb36bb5817ba3c0230dd83b4edf4bf02684cd0ae"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:12b11322ea00ad8db8c46f18b7dfc47ae215e4df55b46c67a94b4effbaec7094"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:53293533fcbb94c202b7c800a12c873cfe24599656b341f56e71dd2b557be063"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c381bda330ddf2fccbafab789d83ebc6c53db126e4383e73794c74eedce855ef"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d29409b625a143649d03d0fd7b57e4b92e0ecad9726ba682244b73be91d2fdb"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:183a517a3a63503f70f808b58bfbf962f23d73b6dccddae5aa56152ef2bcb232"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:15c4e4cfa45f5a60599d9cec5f46cd7b1b29d86a6390ec23e8eebaae84e64554"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, - {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:63638d875be8c2784cfc952c9ac34e2b50e43f9f0a0660b65e2a87d656b3116c"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ffb7a888a047696e7f8240d649b43fb3644f14f0ee229077e7f6b9f9081635bd"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9d5450c566c80c396b7402895c4369a410cab5a82707b11aee1e624da7d004"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d1c1b569ecafe3a69380a94e6ae09a4789bbb23666f3d3a08d06bbd2451f5ef1"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8fc53f9af09426a61db9ba357865c77f26076d48669f2e1bb24d85a22fb52307"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:7af0dd86ddb2f8af5da57a976d27cd2cd15510518d582b478fbb2292428710b4"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93cd1967a18aa0edd4b95b1dfd554cf15af657cb606280996d393dadc88c3c35"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bda845b664bb6c91446ca9609fc69f7db6c334ec5e4adc87571c34e4f47b7ddb"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:01310cf4cf26db9aea5158c217caa92d291f0500051a6469ac52166e1a16f5b7"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99485cab9ba0fa9b84f1f9e1fef106f44a46ef6afdeec8885e0b88d0772b49e8"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win32.whl", hash = "sha256:46f0e0a6b5fa5851bbd9ab1bc805eef362d3a230fbdfbc209f4a236d0a7a990d"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:accfe7e982411da3178ec690baaceaad3c278652998b2c45828aaac66cd8285f"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pyasn1 = [ - {file = "pyasn1-0.4.8-py2.4.egg", hash = "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3"}, - {file = "pyasn1-0.4.8-py2.5.egg", hash = "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf"}, - {file = "pyasn1-0.4.8-py2.6.egg", hash = "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00"}, - {file = "pyasn1-0.4.8-py2.7.egg", hash = "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8"}, - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8-py3.1.egg", hash = "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86"}, - {file = "pyasn1-0.4.8-py3.2.egg", hash = "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7"}, - {file = "pyasn1-0.4.8-py3.3.egg", hash = "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576"}, - {file = "pyasn1-0.4.8-py3.4.egg", hash = "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12"}, - {file = "pyasn1-0.4.8-py3.5.egg", hash = "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2"}, - {file = "pyasn1-0.4.8-py3.6.egg", hash = "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359"}, - {file = "pyasn1-0.4.8-py3.7.egg", hash = "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] -pycodestyle = [ - {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, - {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, -] -pycparser = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] -pyflakes = [ - {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, - {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, -] -pyjwt = [ - {file = "PyJWT-2.4.0-py3-none-any.whl", hash = "sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf"}, - {file = "PyJWT-2.4.0.tar.gz", hash = "sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba"}, -] +pbr = [] +pluggy = [] +prometheus-client = [] +psycopg2-binary = [] +py = [] +pyasn1 = [] +pycodestyle = [] +pycparser = [] +pyflakes = [] +pyjwt = [] pyparsing = [ - {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, - {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, -] -pypiwin32 = [ - {file = "pypiwin32-223-py3-none-any.whl", hash = "sha256:67adf399debc1d5d14dffc1ab5acacb800da569754fafdc576b2a039485aa775"}, - {file = "pypiwin32-223.tar.gz", hash = "sha256:71be40c1fbd28594214ecaecb58e7aa8b708eabfa0125c8a109ebd51edbd776a"}, -] -pyrsistent = [ - {file = "pyrsistent-0.18.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1"}, - {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26"}, - {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e"}, - {file = "pyrsistent-0.18.1-cp310-cp310-win32.whl", hash = "sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6"}, - {file = "pyrsistent-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-win32.whl", hash = "sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286"}, - {file = "pyrsistent-0.18.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6"}, - {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec"}, - {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c"}, - {file = "pyrsistent-0.18.1-cp38-cp38-win32.whl", hash = "sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca"}, - {file = "pyrsistent-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a"}, - {file = "pyrsistent-0.18.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5"}, - {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045"}, - {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c"}, - {file = "pyrsistent-0.18.1-cp39-cp39-win32.whl", hash = "sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc"}, - {file = "pyrsistent-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07"}, - {file = "pyrsistent-0.18.1.tar.gz", hash = "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96"}, -] -pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] -pytest-forked = [ - {file = "pytest-forked-1.4.0.tar.gz", hash = "sha256:8b67587c8f98cbbadfdd804539ed5455b6ed03802203485dd2f53c1422d7440e"}, - {file = "pytest_forked-1.4.0-py3-none-any.whl", hash = "sha256:bbbb6717efc886b9d64537b41fb1497cfaf3c9601276be8da2cccfea5a3c8ad8"}, -] -pytest-lazy-fixture = [ - {file = "pytest-lazy-fixture-0.6.3.tar.gz", hash = "sha256:0e7d0c7f74ba33e6e80905e9bfd81f9d15ef9a790de97993e34213deb5ad10ac"}, - {file = "pytest_lazy_fixture-0.6.3-py3-none-any.whl", hash = "sha256:e0b379f38299ff27a653f03eaa69b08a6fd4484e46fd1c9907d984b9f9daeda6"}, -] -pytest-timeout = [ - {file = "pytest-timeout-2.1.0.tar.gz", hash = "sha256:c07ca07404c612f8abbe22294b23c368e2e5104b521c1790195561f37e1ac3d9"}, - {file = "pytest_timeout-2.1.0-py3-none-any.whl", hash = "sha256:f6f50101443ce70ad325ceb4473c4255e9d74e3c7cd0ef827309dfa4c0d975c6"}, -] -pytest-xdist = [ - {file = "pytest-xdist-2.5.0.tar.gz", hash = "sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf"}, - {file = "pytest_xdist-2.5.0-py3-none-any.whl", hash = "sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] +pyrsistent = [] +pytest = [] +pytest-forked = [] +pytest-lazy-fixture = [] +pytest-timeout = [] +pytest-xdist = [] python-dateutil = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] -python-jose = [ - {file = "python-jose-3.3.0.tar.gz", hash = "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a"}, - {file = "python_jose-3.3.0-py2.py3-none-any.whl", hash = "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"}, -] +python-jose = [] pytz = [ - {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, - {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, -] -pywin32 = [ - {file = "pywin32-301-cp35-cp35m-win32.whl", hash = "sha256:93367c96e3a76dfe5003d8291ae16454ca7d84bb24d721e0b74a07610b7be4a7"}, - {file = "pywin32-301-cp35-cp35m-win_amd64.whl", hash = "sha256:9635df6998a70282bd36e7ac2a5cef9ead1627b0a63b17c731312c7a0daebb72"}, - {file = "pywin32-301-cp36-cp36m-win32.whl", hash = "sha256:c866f04a182a8cb9b7855de065113bbd2e40524f570db73ef1ee99ff0a5cc2f0"}, - {file = "pywin32-301-cp36-cp36m-win_amd64.whl", hash = "sha256:dafa18e95bf2a92f298fe9c582b0e205aca45c55f989937c52c454ce65b93c78"}, - {file = "pywin32-301-cp37-cp37m-win32.whl", hash = "sha256:98f62a3f60aa64894a290fb7494bfa0bfa0a199e9e052e1ac293b2ad3cd2818b"}, - {file = "pywin32-301-cp37-cp37m-win_amd64.whl", hash = "sha256:fb3b4933e0382ba49305cc6cd3fb18525df7fd96aa434de19ce0878133bf8e4a"}, - {file = "pywin32-301-cp38-cp38-win32.whl", hash = "sha256:88981dd3cfb07432625b180f49bf4e179fb8cbb5704cd512e38dd63636af7a17"}, - {file = "pywin32-301-cp38-cp38-win_amd64.whl", hash = "sha256:8c9d33968aa7fcddf44e47750e18f3d034c3e443a707688a008a2e52bbef7e96"}, - {file = "pywin32-301-cp39-cp39-win32.whl", hash = "sha256:595d397df65f1b2e0beaca63a883ae6d8b6df1cdea85c16ae85f6d2e648133fe"}, - {file = "pywin32-301-cp39-cp39-win_amd64.whl", hash = "sha256:87604a4087434cd814ad8973bd47d6524bd1fa9e971ce428e76b62a5e0860fdf"}, -] -pyyaml = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] -responses = [ - {file = "responses-0.17.0-py2.py3-none-any.whl", hash = "sha256:e4fc472fb7374fb8f84fcefa51c515ca4351f198852b4eb7fc88223780b472ea"}, - {file = "responses-0.17.0.tar.gz", hash = "sha256:ec675e080d06bf8d1fb5e5a68a1e5cd0df46b09c78230315f650af5e4036bec7"}, -] -rsa = [ - {file = "rsa-4.8-py3-none-any.whl", hash = "sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb"}, - {file = "rsa-4.8.tar.gz", hash = "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17"}, -] -s3transfer = [ - {file = "s3transfer-0.5.0-py3-none-any.whl", hash = "sha256:9c1dc369814391a6bda20ebbf4b70a0f34630592c9aa520856bf384916af2803"}, - {file = "s3transfer-0.5.0.tar.gz", hash = "sha256:50ed823e1dc5868ad40c8dc92072f757aa0e653a192845c94a3b676f4a62da4c"}, -] -sarif-om = [ - {file = "sarif_om-1.0.4-py3-none-any.whl", hash = "sha256:539ef47a662329b1c8502388ad92457425e95dc0aaaf995fe46f4984c4771911"}, - {file = "sarif_om-1.0.4.tar.gz", hash = "sha256:cd5f416b3083e00d402a92e449a7ff67af46f11241073eea0461802a3b5aef98"}, + {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, + {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, ] +pywin32 = [] +pyyaml = [] +requests = [] +responses = [] +rsa = [] +s3transfer = [] +sarif-om = [] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -sshpubkeys = [ - {file = "sshpubkeys-3.3.1-py2.py3-none-any.whl", hash = "sha256:946f76b8fe86704b0e7c56a00d80294e39bc2305999844f079a217885060b1ac"}, - {file = "sshpubkeys-3.3.1.tar.gz", hash = "sha256:3020ed4f8c846849299370fbe98ff4157b0ccc1accec105e07cfa9ae4bb55064"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -types-psycopg2 = [ - {file = "types-psycopg2-2.9.6.tar.gz", hash = "sha256:753b50b38da0e61bc8f89d149f2c4420c7e18535a87963d17b72343eb98f7c32"}, - {file = "types_psycopg2-2.9.6-py3-none-any.whl", hash = "sha256:2cfd855e1562ebb5da595ee9401da93a308d69121ccd359cb8341f94ba4b6d1c"}, -] -types-requests = [ - {file = "types-requests-2.27.7.tar.gz", hash = "sha256:f38bd488528cdcbce5b01dc953972f3cead0d060cfd9ee35b363066c25bab13c"}, - {file = "types_requests-2.27.7-py3-none-any.whl", hash = "sha256:2e0e100dd489f83870d4f61949d3a7eae4821e7bfbf46c57e463c38f92d473d4"}, -] -types-urllib3 = [ - {file = "types-urllib3-1.26.7.tar.gz", hash = "sha256:cfd1fbbe4ba9a605ed148294008aac8a7b8b7472651d1cc357d507ae5962e3d2"}, - {file = "types_urllib3-1.26.7-py3-none-any.whl", hash = "sha256:3adcf2cb5981809091dbff456e6999fe55f201652d8c360f99997de5ac2f556e"}, -] -typing-extensions = [ - {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, - {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, - {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, -] -urllib3 = [ - {file = "urllib3-1.26.8-py2.py3-none-any.whl", hash = "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed"}, - {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"}, -] -websocket-client = [ - {file = "websocket-client-1.2.3.tar.gz", hash = "sha256:1315816c0acc508997eb3ae03b9d3ff619c9d12d544c9a9b553704b1cc4f6af5"}, - {file = "websocket_client-1.2.3-py3-none-any.whl", hash = "sha256:2eed4cc58e4d65613ed6114af2f380f7910ff416fc8c46947f6e76b6815f56c0"}, -] -werkzeug = [ - {file = "Werkzeug-2.0.2-py3-none-any.whl", hash = "sha256:63d3dc1cf60e7b7e35e97fa9861f7397283b75d765afcaefd993d6046899de8f"}, - {file = "Werkzeug-2.0.2.tar.gz", hash = "sha256:aa2bb6fc8dee8d6c504c0ac1e7f5f7dc5810a9903e793b6f715a9f015bdadb9a"}, -] -wrapt = [ - {file = "wrapt-1.13.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:e05e60ff3b2b0342153be4d1b597bbcfd8330890056b9619f4ad6b8d5c96a81a"}, - {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85148f4225287b6a0665eef08a178c15097366d46b210574a658c1ff5b377489"}, - {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2dded5496e8f1592ec27079b28b6ad2a1ef0b9296d270f77b8e4a3a796cf6909"}, - {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e94b7d9deaa4cc7bac9198a58a7240aaf87fe56c6277ee25fa5b3aa1edebd229"}, - {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:498e6217523111d07cd67e87a791f5e9ee769f9241fcf8a379696e25806965af"}, - {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ec7e20258ecc5174029a0f391e1b948bf2906cd64c198a9b8b281b811cbc04de"}, - {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:87883690cae293541e08ba2da22cacaae0a092e0ed56bbba8d018cc486fbafbb"}, - {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:f99c0489258086308aad4ae57da9e8ecf9e1f3f30fa35d5e170b4d4896554d80"}, - {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6a03d9917aee887690aa3f1747ce634e610f6db6f6b332b35c2dd89412912bca"}, - {file = "wrapt-1.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:936503cb0a6ed28dbfa87e8fcd0a56458822144e9d11a49ccee6d9a8adb2ac44"}, - {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f9c51d9af9abb899bd34ace878fbec8bf357b3194a10c4e8e0a25512826ef056"}, - {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:220a869982ea9023e163ba915077816ca439489de6d2c09089b219f4e11b6785"}, - {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0877fe981fd76b183711d767500e6b3111378ed2043c145e21816ee589d91096"}, - {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:43e69ffe47e3609a6aec0fe723001c60c65305784d964f5007d5b4fb1bc6bf33"}, - {file = "wrapt-1.13.3-cp310-cp310-win32.whl", hash = "sha256:78dea98c81915bbf510eb6a3c9c24915e4660302937b9ae05a0947164248020f"}, - {file = "wrapt-1.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:ea3e746e29d4000cd98d572f3ee2a6050a4f784bb536f4ac1f035987fc1ed83e"}, - {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8c73c1a2ec7c98d7eaded149f6d225a692caa1bd7b2401a14125446e9e90410d"}, - {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:086218a72ec7d986a3eddb7707c8c4526d677c7b35e355875a0fe2918b059179"}, - {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:e92d0d4fa68ea0c02d39f1e2f9cb5bc4b4a71e8c442207433d8db47ee79d7aa3"}, - {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:d4a5f6146cfa5c7ba0134249665acd322a70d1ea61732723c7d3e8cc0fa80755"}, - {file = "wrapt-1.13.3-cp35-cp35m-win32.whl", hash = "sha256:8aab36778fa9bba1a8f06a4919556f9f8c7b33102bd71b3ab307bb3fecb21851"}, - {file = "wrapt-1.13.3-cp35-cp35m-win_amd64.whl", hash = "sha256:944b180f61f5e36c0634d3202ba8509b986b5fbaf57db3e94df11abee244ba13"}, - {file = "wrapt-1.13.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2ebdde19cd3c8cdf8df3fc165bc7827334bc4e353465048b36f7deeae8ee0918"}, - {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:610f5f83dd1e0ad40254c306f4764fcdc846641f120c3cf424ff57a19d5f7ade"}, - {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5601f44a0f38fed36cc07db004f0eedeaadbdcec90e4e90509480e7e6060a5bc"}, - {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:e6906d6f48437dfd80464f7d7af1740eadc572b9f7a4301e7dd3d65db285cacf"}, - {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:766b32c762e07e26f50d8a3468e3b4228b3736c805018e4b0ec8cc01ecd88125"}, - {file = "wrapt-1.13.3-cp36-cp36m-win32.whl", hash = "sha256:5f223101f21cfd41deec8ce3889dc59f88a59b409db028c469c9b20cfeefbe36"}, - {file = "wrapt-1.13.3-cp36-cp36m-win_amd64.whl", hash = "sha256:f122ccd12fdc69628786d0c947bdd9cb2733be8f800d88b5a37c57f1f1d73c10"}, - {file = "wrapt-1.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:46f7f3af321a573fc0c3586612db4decb7eb37172af1bc6173d81f5b66c2e068"}, - {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:778fd096ee96890c10ce96187c76b3e99b2da44e08c9e24d5652f356873f6709"}, - {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0cb23d36ed03bf46b894cfec777eec754146d68429c30431c99ef28482b5c1df"}, - {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:96b81ae75591a795d8c90edc0bfaab44d3d41ffc1aae4d994c5aa21d9b8e19a2"}, - {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7dd215e4e8514004c8d810a73e342c536547038fb130205ec4bba9f5de35d45b"}, - {file = "wrapt-1.13.3-cp37-cp37m-win32.whl", hash = "sha256:47f0a183743e7f71f29e4e21574ad3fa95676136f45b91afcf83f6a050914829"}, - {file = "wrapt-1.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fd76c47f20984b43d93de9a82011bb6e5f8325df6c9ed4d8310029a55fa361ea"}, - {file = "wrapt-1.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b73d4b78807bd299b38e4598b8e7bd34ed55d480160d2e7fdaabd9931afa65f9"}, - {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ec9465dd69d5657b5d2fa6133b3e1e989ae27d29471a672416fd729b429eb554"}, - {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd91006848eb55af2159375134d724032a2d1d13bcc6f81cd8d3ed9f2b8e846c"}, - {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ae9de71eb60940e58207f8e71fe113c639da42adb02fb2bcbcaccc1ccecd092b"}, - {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:51799ca950cfee9396a87f4a1240622ac38973b6df5ef7a41e7f0b98797099ce"}, - {file = "wrapt-1.13.3-cp38-cp38-win32.whl", hash = "sha256:4b9c458732450ec42578b5642ac53e312092acf8c0bfce140ada5ca1ac556f79"}, - {file = "wrapt-1.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:7dde79d007cd6dfa65afe404766057c2409316135cb892be4b1c768e3f3a11cb"}, - {file = "wrapt-1.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:981da26722bebb9247a0601e2922cedf8bb7a600e89c852d063313102de6f2cb"}, - {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:705e2af1f7be4707e49ced9153f8d72131090e52be9278b5dbb1498c749a1e32"}, - {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25b1b1d5df495d82be1c9d2fad408f7ce5ca8a38085e2da41bb63c914baadff7"}, - {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:77416e6b17926d953b5c666a3cb718d5945df63ecf922af0ee576206d7033b5e"}, - {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:865c0b50003616f05858b22174c40ffc27a38e67359fa1495605f96125f76640"}, - {file = "wrapt-1.13.3-cp39-cp39-win32.whl", hash = "sha256:0a017a667d1f7411816e4bf214646d0ad5b1da2c1ea13dec6c162736ff25a374"}, - {file = "wrapt-1.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:81bd7c90d28a4b2e1df135bfbd7c23aee3050078ca6441bead44c42483f9ebfb"}, - {file = "wrapt-1.13.3.tar.gz", hash = "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185"}, -] -xmltodict = [ - {file = "xmltodict-0.12.0-py2.py3-none-any.whl", hash = "sha256:8bbcb45cc982f48b2ca8fe7e7827c5d792f217ecf1792626f808bf41c3b86051"}, - {file = "xmltodict-0.12.0.tar.gz", hash = "sha256:50d8c638ed7ecb88d90561beedbf720c9b4e851a9fa6c47ebd64e99d166d8a21"}, -] -yapf = [ - {file = "yapf-0.31.0-py2.py3-none-any.whl", hash = "sha256:e3a234ba8455fe201eaa649cdac872d590089a18b661e39bbac7020978dd9c2e"}, - {file = "yapf-0.31.0.tar.gz", hash = "sha256:408fb9a2b254c302f49db83c59f9aa0b4b0fd0ec25be3a5c51181327922ff63d"}, +sshpubkeys = [] +toml = [] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +types-psycopg2 = [] +types-requests = [] +types-s3transfer = [] +types-urllib3 = [] +typing-extensions = [] +urllib3 = [] +websocket-client = [] +werkzeug = [] +wrapt = [] +xmltodict = [] +yapf = [] +zipp = [] diff --git a/pyproject.toml b/pyproject.toml index c965535049..2807881d71 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ authors = [] python = "^3.9" pytest = "^6.2.5" psycopg2-binary = "^2.9.1" -typing-extensions = "^3.10.0" +typing-extensions = "^4.1.0" PyJWT = {version = "^2.1.0", extras = ["crypto"]} requests = "^2.26.0" pytest-xdist = "^2.3.0" @@ -16,10 +16,10 @@ asyncpg = "^0.24.0" aiopg = "^1.3.1" cached-property = "^1.5.2" Jinja2 = "^3.0.2" -types-requests = "^2.27.7" -types-psycopg2 = "^2.9.6" +types-requests = "^2.28.5" +types-psycopg2 = "^2.9.18" boto3 = "^1.20.40" -boto3-stubs = "^1.20.40" +boto3-stubs = {version = "^1.23.38", extras = ["s3"]} moto = {version = "^3.0.0", extras = ["server"]} backoff = "^1.11.1" pytest-lazy-fixture = "^0.6.3" @@ -29,7 +29,7 @@ pytest-timeout = "^2.1.0" [tool.poetry.dev-dependencies] yapf = "==0.31.0" flake8 = "^3.9.2" -mypy = "==0.910" +mypy = "==0.971" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/test_runner/batch_others/test_ancestor_branch.py b/test_runner/batch_others/test_ancestor_branch.py index 3e7ba22184..d8ba0a1b06 100644 --- a/test_runner/batch_others/test_ancestor_branch.py +++ b/test_runner/batch_others/test_ancestor_branch.py @@ -1,6 +1,7 @@ import pytest from fixtures.log_helper import log from fixtures.neon_fixtures import NeonEnv, NeonEnvBuilder, NeonPageserverApiException +from fixtures.utils import query_scalar # @@ -25,13 +26,11 @@ def test_ancestor_branch(neon_env_builder: NeonEnvBuilder): pg_branch0 = env.postgres.create_start('main', tenant_id=tenant) branch0_cur = pg_branch0.connect().cursor() - branch0_cur.execute("SHOW neon.timeline_id") - branch0_timeline = branch0_cur.fetchone()[0] + branch0_timeline = query_scalar(branch0_cur, "SHOW neon.timeline_id") log.info(f"b0 timeline {branch0_timeline}") # Create table, and insert 100k rows. - branch0_cur.execute('SELECT pg_current_wal_insert_lsn()') - branch0_lsn = branch0_cur.fetchone()[0] + branch0_lsn = query_scalar(branch0_cur, 'SELECT pg_current_wal_insert_lsn()') log.info(f"b0 at lsn {branch0_lsn}") branch0_cur.execute('CREATE TABLE foo (t text) WITH (autovacuum_enabled = off)') @@ -40,8 +39,7 @@ def test_ancestor_branch(neon_env_builder: NeonEnvBuilder): SELECT '00112233445566778899AABBCCDDEEFF' || ':branch0:' || g FROM generate_series(1, 100000) g ''') - branch0_cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn_100 = branch0_cur.fetchone()[0] + lsn_100 = query_scalar(branch0_cur, 'SELECT pg_current_wal_insert_lsn()') log.info(f'LSN after 100k rows: {lsn_100}') # Create branch1. @@ -50,12 +48,10 @@ def test_ancestor_branch(neon_env_builder: NeonEnvBuilder): log.info("postgres is running on 'branch1' branch") branch1_cur = pg_branch1.connect().cursor() - branch1_cur.execute("SHOW neon.timeline_id") - branch1_timeline = branch1_cur.fetchone()[0] + branch1_timeline = query_scalar(branch1_cur, "SHOW neon.timeline_id") log.info(f"b1 timeline {branch1_timeline}") - branch1_cur.execute('SELECT pg_current_wal_insert_lsn()') - branch1_lsn = branch1_cur.fetchone()[0] + branch1_lsn = query_scalar(branch1_cur, 'SELECT pg_current_wal_insert_lsn()') log.info(f"b1 at lsn {branch1_lsn}") # Insert 100k rows. @@ -64,8 +60,7 @@ def test_ancestor_branch(neon_env_builder: NeonEnvBuilder): SELECT '00112233445566778899AABBCCDDEEFF' || ':branch1:' || g FROM generate_series(1, 100000) g ''') - branch1_cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn_200 = branch1_cur.fetchone()[0] + lsn_200 = query_scalar(branch1_cur, 'SELECT pg_current_wal_insert_lsn()') log.info(f'LSN after 200k rows: {lsn_200}') # Create branch2. @@ -74,12 +69,10 @@ def test_ancestor_branch(neon_env_builder: NeonEnvBuilder): log.info("postgres is running on 'branch2' branch") branch2_cur = pg_branch2.connect().cursor() - branch2_cur.execute("SHOW neon.timeline_id") - branch2_timeline = branch2_cur.fetchone()[0] + branch2_timeline = query_scalar(branch2_cur, "SHOW neon.timeline_id") log.info(f"b2 timeline {branch2_timeline}") - branch2_cur.execute('SELECT pg_current_wal_insert_lsn()') - branch2_lsn = branch2_cur.fetchone()[0] + branch2_lsn = query_scalar(branch2_cur, 'SELECT pg_current_wal_insert_lsn()') log.info(f"b2 at lsn {branch2_lsn}") # Insert 100k rows. @@ -88,20 +81,16 @@ def test_ancestor_branch(neon_env_builder: NeonEnvBuilder): SELECT '00112233445566778899AABBCCDDEEFF' || ':branch2:' || g FROM generate_series(1, 100000) g ''') - branch2_cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn_300 = branch2_cur.fetchone()[0] + lsn_300 = query_scalar(branch2_cur, 'SELECT pg_current_wal_insert_lsn()') log.info(f'LSN after 300k rows: {lsn_300}') # Run compaction on branch1. - psconn = env.pageserver.connect() - log.info(f'compact {tenant.hex} {branch1_timeline} {lsn_200}') - psconn.cursor().execute(f'''compact {tenant.hex} {branch1_timeline} {lsn_200}''') + compact = f'compact {tenant.hex} {branch1_timeline} {lsn_200}' + log.info(compact) + env.pageserver.safe_psql(compact) - branch0_cur.execute('SELECT count(*) FROM foo') - assert branch0_cur.fetchone() == (100000, ) + assert query_scalar(branch0_cur, 'SELECT count(*) FROM foo') == 100000 - branch1_cur.execute('SELECT count(*) FROM foo') - assert branch1_cur.fetchone() == (200000, ) + assert query_scalar(branch1_cur, 'SELECT count(*) FROM foo') == 200000 - branch2_cur.execute('SELECT count(*) FROM foo') - assert branch2_cur.fetchone() == (300000, ) + assert query_scalar(branch2_cur, 'SELECT count(*) FROM foo') == 300000 diff --git a/test_runner/batch_others/test_branch_and_gc.py b/test_runner/batch_others/test_branch_and_gc.py index 901b3f3d0f..76a77357ae 100644 --- a/test_runner/batch_others/test_branch_and_gc.py +++ b/test_runner/batch_others/test_branch_and_gc.py @@ -3,7 +3,7 @@ import pytest import time from fixtures.log_helper import log from fixtures.neon_fixtures import NeonEnv -from fixtures.utils import lsn_from_hex +from fixtures.utils import lsn_from_hex, query_scalar # Test the GC implementation when running with branching. @@ -76,20 +76,17 @@ def test_branch_and_gc(neon_simple_env: NeonEnv): "CREATE TABLE foo(key serial primary key, t text default 'foooooooooooooooooooooooooooooooooooooooooooooooooooo')" ) main_cur.execute('INSERT INTO foo SELECT FROM generate_series(1, 100000)') - main_cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn1 = main_cur.fetchone()[0] + lsn1 = query_scalar(main_cur, 'SELECT pg_current_wal_insert_lsn()') log.info(f'LSN1: {lsn1}') main_cur.execute('INSERT INTO foo SELECT FROM generate_series(1, 100000)') - main_cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn2 = main_cur.fetchone()[0] + lsn2 = query_scalar(main_cur, 'SELECT pg_current_wal_insert_lsn()') log.info(f'LSN2: {lsn2}') # Set the GC horizon so that lsn1 is inside the horizon, which means # we can create a new branch starting from lsn1. env.pageserver.safe_psql( - f'''do_gc {tenant.hex} {timeline_main.hex} {lsn_from_hex(lsn2) - lsn_from_hex(lsn1) + 1024}''' - ) + f'do_gc {tenant.hex} {timeline_main.hex} {lsn_from_hex(lsn2) - lsn_from_hex(lsn1) + 1024}') env.neon_cli.create_branch('test_branch', 'test_main', @@ -100,8 +97,7 @@ def test_branch_and_gc(neon_simple_env: NeonEnv): branch_cur = pg_branch.connect().cursor() branch_cur.execute('INSERT INTO foo SELECT FROM generate_series(1, 100000)') - branch_cur.execute('SELECT count(*) FROM foo') - assert branch_cur.fetchone() == (200000, ) + assert query_scalar(branch_cur, 'SELECT count(*) FROM foo') == 200000 # This test simulates a race condition happening when branch creation and GC are performed concurrently. diff --git a/test_runner/batch_others/test_branch_behind.py b/test_runner/batch_others/test_branch_behind.py index 0274c6c1e0..95f478dda8 100644 --- a/test_runner/batch_others/test_branch_behind.py +++ b/test_runner/batch_others/test_branch_behind.py @@ -1,9 +1,7 @@ -from contextlib import closing - import psycopg2.extras import pytest from fixtures.log_helper import log -from fixtures.utils import print_gc_result +from fixtures.utils import print_gc_result, query_scalar from fixtures.neon_fixtures import NeonEnvBuilder @@ -27,26 +25,22 @@ def test_branch_behind(neon_env_builder: NeonEnvBuilder): pgmain = env.postgres.create_start('test_branch_behind') log.info("postgres is running on 'test_branch_behind' branch") - main_pg_conn = pgmain.connect() - main_cur = main_pg_conn.cursor() + main_cur = pgmain.connect().cursor() - main_cur.execute("SHOW neon.timeline_id") - timeline = main_cur.fetchone()[0] + timeline = query_scalar(main_cur, "SHOW neon.timeline_id") # Create table, and insert the first 100 rows main_cur.execute('CREATE TABLE foo (t text)') # keep some early lsn to test branch creation on out of date lsn - main_cur.execute('SELECT pg_current_wal_insert_lsn()') - gced_lsn = main_cur.fetchone()[0] + gced_lsn = query_scalar(main_cur, 'SELECT pg_current_wal_insert_lsn()') main_cur.execute(''' INSERT INTO foo SELECT 'long string to consume some space' || g FROM generate_series(1, 100) g ''') - main_cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn_a = main_cur.fetchone()[0] + lsn_a = query_scalar(main_cur, 'SELECT pg_current_wal_insert_lsn()') log.info(f'LSN after 100 rows: {lsn_a}') # Insert some more rows. (This generates enough WAL to fill a few segments.) @@ -55,8 +49,7 @@ def test_branch_behind(neon_env_builder: NeonEnvBuilder): SELECT 'long string to consume some space' || g FROM generate_series(1, 200000) g ''') - main_cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn_b = main_cur.fetchone()[0] + lsn_b = query_scalar(main_cur, 'SELECT pg_current_wal_insert_lsn()') log.info(f'LSN after 200100 rows: {lsn_b}') # Branch at the point where only 100 rows were inserted @@ -70,10 +63,8 @@ def test_branch_behind(neon_env_builder: NeonEnvBuilder): SELECT 'long string to consume some space' || g FROM generate_series(1, 200000) g ''') - main_cur.execute('SELECT pg_current_wal_insert_lsn()') + lsn_c = query_scalar(main_cur, 'SELECT pg_current_wal_insert_lsn()') - main_cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn_c = main_cur.fetchone()[0] log.info(f'LSN after 400100 rows: {lsn_c}') # Branch at the point where only 200100 rows were inserted @@ -85,20 +76,15 @@ def test_branch_behind(neon_env_builder: NeonEnvBuilder): pg_more = env.postgres.create_start('test_branch_behind_more') # On the 'hundred' branch, we should see only 100 rows - hundred_pg_conn = pg_hundred.connect() - hundred_cur = hundred_pg_conn.cursor() - hundred_cur.execute('SELECT count(*) FROM foo') - assert hundred_cur.fetchone() == (100, ) + hundred_cur = pg_hundred.connect().cursor() + assert query_scalar(hundred_cur, 'SELECT count(*) FROM foo') == 100 # On the 'more' branch, we should see 100200 rows - more_pg_conn = pg_more.connect() - more_cur = more_pg_conn.cursor() - more_cur.execute('SELECT count(*) FROM foo') - assert more_cur.fetchone() == (200100, ) + more_cur = pg_more.connect().cursor() + assert query_scalar(more_cur, 'SELECT count(*) FROM foo') == 200100 # All the rows are visible on the main branch - main_cur.execute('SELECT count(*) FROM foo') - assert main_cur.fetchone() == (400100, ) + assert query_scalar(main_cur, 'SELECT count(*) FROM foo') == 400100 # Check bad lsn's for branching @@ -107,9 +93,7 @@ def test_branch_behind(neon_env_builder: NeonEnvBuilder): 'test_branch_behind', ancestor_start_lsn="0/3000000") pg = env.postgres.create_start('test_branch_segment_boundary') - cur = pg.connect().cursor() - cur.execute('SELECT 1') - assert cur.fetchone() == (1, ) + assert pg.safe_psql('SELECT 1')[0][0] == 1 # branch at pre-initdb lsn with pytest.raises(Exception, match="invalid branch start lsn"): @@ -122,12 +106,11 @@ def test_branch_behind(neon_env_builder: NeonEnvBuilder): ancestor_start_lsn="0/42") # check that we cannot create branch based on garbage collected data - with closing(env.pageserver.connect()) as psconn: - with psconn.cursor(cursor_factory=psycopg2.extras.DictCursor) as pscur: - # call gc to advace latest_gc_cutoff_lsn - pscur.execute(f"do_gc {env.initial_tenant.hex} {timeline} 0") - row = pscur.fetchone() - print_gc_result(row) + with env.pageserver.cursor(cursor_factory=psycopg2.extras.DictCursor) as pscur: + # call gc to advace latest_gc_cutoff_lsn + pscur.execute(f"do_gc {env.initial_tenant.hex} {timeline} 0") + row = pscur.fetchone() + print_gc_result(row) with pytest.raises(Exception, match="invalid branch start lsn"): # this gced_lsn is pretty random, so if gc is disabled this woudln't fail @@ -136,11 +119,8 @@ def test_branch_behind(neon_env_builder: NeonEnvBuilder): ancestor_start_lsn=gced_lsn) # check that after gc everything is still there - hundred_cur.execute('SELECT count(*) FROM foo') - assert hundred_cur.fetchone() == (100, ) + assert query_scalar(hundred_cur, 'SELECT count(*) FROM foo') == 100 - more_cur.execute('SELECT count(*) FROM foo') - assert more_cur.fetchone() == (200100, ) + assert query_scalar(more_cur, 'SELECT count(*) FROM foo') == 200100 - main_cur.execute('SELECT count(*) FROM foo') - assert main_cur.fetchone() == (400100, ) + assert query_scalar(main_cur, 'SELECT count(*) FROM foo') == 400100 diff --git a/test_runner/batch_others/test_broken_timeline.py b/test_runner/batch_others/test_broken_timeline.py index 675236fbd7..b9e5f637ab 100644 --- a/test_runner/batch_others/test_broken_timeline.py +++ b/test_runner/batch_others/test_broken_timeline.py @@ -1,10 +1,14 @@ +from typing import List, Tuple +from uuid import UUID import pytest import concurrent.futures from contextlib import closing -from fixtures.neon_fixtures import NeonEnvBuilder, NeonEnv +from fixtures.neon_fixtures import NeonEnvBuilder, NeonEnv, Postgres from fixtures.log_helper import log import os +from fixtures.utils import query_scalar + # Test restarting page server, while safekeeper and compute node keep # running. @@ -13,7 +17,7 @@ def test_broken_timeline(neon_env_builder: NeonEnvBuilder): neon_env_builder.num_safekeepers = 3 env = neon_env_builder.init_start() - tenant_timelines = [] + tenant_timelines: List[Tuple[str, str, Postgres]] = [] for n in range(4): tenant_id_uuid, timeline_id_uuid = env.neon_cli.create_tenant() @@ -21,13 +25,11 @@ def test_broken_timeline(neon_env_builder: NeonEnvBuilder): timeline_id = timeline_id_uuid.hex pg = env.postgres.create_start(f'main', tenant_id=tenant_id_uuid) - with closing(pg.connect()) as conn: - with conn.cursor() as cur: - cur.execute("CREATE TABLE t(key int primary key, value text)") - cur.execute("INSERT INTO t SELECT generate_series(1,100), 'payload'") + with pg.cursor() as cur: + cur.execute("CREATE TABLE t(key int primary key, value text)") + cur.execute("INSERT INTO t SELECT generate_series(1,100), 'payload'") - cur.execute("SHOW neon.timeline_id") - timeline_id = cur.fetchone()[0] + timeline_id = query_scalar(cur, "SHOW neon.timeline_id") pg.stop() tenant_timelines.append((tenant_id, timeline_id, pg)) @@ -68,10 +70,7 @@ def test_broken_timeline(neon_env_builder: NeonEnvBuilder): # Tenant 0 should still work pg0.start() - with closing(pg0.connect()) as conn: - with conn.cursor() as cur: - cur.execute("SELECT COUNT(*) FROM t") - assert cur.fetchone()[0] == 100 + assert pg0.safe_psql("SELECT COUNT(*) FROM t")[0][0] == 100 # But all others are broken for n in range(1, 4): diff --git a/test_runner/batch_others/test_clog_truncate.py b/test_runner/batch_others/test_clog_truncate.py index cbf55e9fc1..cdb577f480 100644 --- a/test_runner/batch_others/test_clog_truncate.py +++ b/test_runner/batch_others/test_clog_truncate.py @@ -5,6 +5,7 @@ from contextlib import closing from fixtures.neon_fixtures import NeonEnv from fixtures.log_helper import log +from fixtures.utils import query_scalar # @@ -32,17 +33,16 @@ def test_clog_truncate(neon_simple_env: NeonEnv): pg.safe_psql('CREATE EXTENSION neon_test_utils') # Consume many xids to advance clog - with closing(pg.connect()) as conn: - with conn.cursor() as cur: - cur.execute('select test_consume_xids(1000*1000*10);') - log.info('xids consumed') + with pg.cursor() as cur: + cur.execute('select test_consume_xids(1000*1000*10);') + log.info('xids consumed') - # call a checkpoint to trigger TruncateSubtrans - cur.execute('CHECKPOINT;') + # call a checkpoint to trigger TruncateSubtrans + cur.execute('CHECKPOINT;') - # ensure WAL flush - cur.execute('select txid_current()') - log.info(cur.fetchone()) + # ensure WAL flush + cur.execute('select txid_current()') + log.info(cur.fetchone()) # wait for autovacuum to truncate the pg_xact # XXX Is it worth to add a timeout here? @@ -54,11 +54,9 @@ def test_clog_truncate(neon_simple_env: NeonEnv): time.sleep(5) # checkpoint to advance latest lsn - with closing(pg.connect()) as conn: - with conn.cursor() as cur: - cur.execute('CHECKPOINT;') - cur.execute('select pg_current_wal_insert_lsn()') - lsn_after_truncation = cur.fetchone()[0] + with pg.cursor() as cur: + cur.execute('CHECKPOINT;') + lsn_after_truncation = query_scalar(cur, 'select pg_current_wal_insert_lsn()') # create new branch after clog truncation and start a compute node on it log.info(f'create branch at lsn_after_truncation {lsn_after_truncation}') diff --git a/test_runner/batch_others/test_createdropdb.py b/test_runner/batch_others/test_createdropdb.py index 151ce997ee..0fbf6e2a47 100644 --- a/test_runner/batch_others/test_createdropdb.py +++ b/test_runner/batch_others/test_createdropdb.py @@ -4,6 +4,7 @@ import pathlib from contextlib import closing from fixtures.neon_fixtures import NeonEnv, check_restored_datadir_content from fixtures.log_helper import log +from fixtures.utils import query_scalar # @@ -16,15 +17,13 @@ def test_createdb(neon_simple_env: NeonEnv): pg = env.postgres.create_start('test_createdb') log.info("postgres is running on 'test_createdb' branch") - with closing(pg.connect()) as conn: - with conn.cursor() as cur: - # Cause a 'relmapper' change in the original branch - cur.execute('VACUUM FULL pg_class') + with pg.cursor() as cur: + # Cause a 'relmapper' change in the original branch + cur.execute('VACUUM FULL pg_class') - cur.execute('CREATE DATABASE foodb') + cur.execute('CREATE DATABASE foodb') - cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn = cur.fetchone()[0] + lsn = query_scalar(cur, 'SELECT pg_current_wal_insert_lsn()') # Create a branch env.neon_cli.create_branch('test_createdb2', 'test_createdb', ancestor_start_lsn=lsn) @@ -32,21 +31,21 @@ def test_createdb(neon_simple_env: NeonEnv): # Test that you can connect to the new database on both branches for db in (pg, pg2): - with closing(db.connect(dbname='foodb')) as conn: - with conn.cursor() as cur: - # Check database size in both branches - cur.execute(""" - select pg_size_pretty(pg_database_size('foodb')), - pg_size_pretty( - sum(pg_relation_size(oid, 'main')) - +sum(pg_relation_size(oid, 'vm')) - +sum(pg_relation_size(oid, 'fsm')) - ) FROM pg_class where relisshared is false - """) - res = cur.fetchone() - # check that dbsize equals sum of all relation sizes, excluding shared ones - # This is how we define dbsize in neon for now - assert res[0] == res[1] + with db.cursor(dbname='foodb') as cur: + # Check database size in both branches + cur.execute(""" + select pg_size_pretty(pg_database_size('foodb')), + pg_size_pretty( + sum(pg_relation_size(oid, 'main')) + +sum(pg_relation_size(oid, 'vm')) + +sum(pg_relation_size(oid, 'fsm')) + ) FROM pg_class where relisshared is false + """) + res = cur.fetchone() + assert res is not None + # check that dbsize equals sum of all relation sizes, excluding shared ones + # This is how we define dbsize in neon for now + assert res[0] == res[1] # @@ -58,24 +57,19 @@ def test_dropdb(neon_simple_env: NeonEnv, test_output_dir): pg = env.postgres.create_start('test_dropdb') log.info("postgres is running on 'test_dropdb' branch") - with closing(pg.connect()) as conn: - with conn.cursor() as cur: - cur.execute('CREATE DATABASE foodb') + with pg.cursor() as cur: + cur.execute('CREATE DATABASE foodb') - cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn_before_drop = cur.fetchone()[0] + lsn_before_drop = query_scalar(cur, 'SELECT pg_current_wal_insert_lsn()') - cur.execute("SELECT oid FROM pg_database WHERE datname='foodb';") - dboid = cur.fetchone()[0] + dboid = query_scalar(cur, "SELECT oid FROM pg_database WHERE datname='foodb';") - with closing(pg.connect()) as conn: - with conn.cursor() as cur: - cur.execute('DROP DATABASE foodb') + with pg.cursor() as cur: + cur.execute('DROP DATABASE foodb') - cur.execute('CHECKPOINT') + cur.execute('CHECKPOINT') - cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn_after_drop = cur.fetchone()[0] + lsn_after_drop = query_scalar(cur, 'SELECT pg_current_wal_insert_lsn()') # Create two branches before and after database drop. env.neon_cli.create_branch('test_before_dropdb', diff --git a/test_runner/batch_others/test_createuser.py b/test_runner/batch_others/test_createuser.py index cbfe496e19..d48db05395 100644 --- a/test_runner/batch_others/test_createuser.py +++ b/test_runner/batch_others/test_createuser.py @@ -1,7 +1,6 @@ -from contextlib import closing - from fixtures.neon_fixtures import NeonEnv from fixtures.log_helper import log +from fixtures.utils import query_scalar # @@ -13,15 +12,13 @@ def test_createuser(neon_simple_env: NeonEnv): pg = env.postgres.create_start('test_createuser') log.info("postgres is running on 'test_createuser' branch") - with closing(pg.connect()) as conn: - with conn.cursor() as cur: - # Cause a 'relmapper' change in the original branch - cur.execute('CREATE USER testuser with password %s', ('testpwd', )) + with pg.cursor() as cur: + # Cause a 'relmapper' change in the original branch + cur.execute('CREATE USER testuser with password %s', ('testpwd', )) - cur.execute('CHECKPOINT') + cur.execute('CHECKPOINT') - cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn = cur.fetchone()[0] + lsn = query_scalar(cur, 'SELECT pg_current_wal_insert_lsn()') # Create a branch env.neon_cli.create_branch('test_createuser2', 'test_createuser', ancestor_start_lsn=lsn) diff --git a/test_runner/batch_others/test_fullbackup.py b/test_runner/batch_others/test_fullbackup.py index cd6c40f56b..bce085c157 100644 --- a/test_runner/batch_others/test_fullbackup.py +++ b/test_runner/batch_others/test_fullbackup.py @@ -1,10 +1,8 @@ -from contextlib import closing - from fixtures.log_helper import log from fixtures.neon_fixtures import NeonEnvBuilder, PgBin, PortDistributor, VanillaPostgres from fixtures.neon_fixtures import pg_distrib_dir import os -from fixtures.utils import subprocess_capture +from fixtures.utils import query_scalar, subprocess_capture num_rows = 1000 @@ -21,19 +19,17 @@ def test_fullbackup(neon_env_builder: NeonEnvBuilder, pgmain = env.postgres.create_start('test_fullbackup') log.info("postgres is running on 'test_fullbackup' branch") - timeline = pgmain.safe_psql("SHOW neon.timeline_id")[0][0] + with pgmain.cursor() as cur: + timeline = query_scalar(cur, "SHOW neon.timeline_id") - with closing(pgmain.connect()) as conn: - with conn.cursor() as cur: - # data loading may take a while, so increase statement timeout - cur.execute("SET statement_timeout='300s'") - cur.execute(f'''CREATE TABLE tbl AS SELECT 'long string to consume some space' || g - from generate_series(1,{num_rows}) g''') - cur.execute("CHECKPOINT") + # data loading may take a while, so increase statement timeout + cur.execute("SET statement_timeout='300s'") + cur.execute(f'''CREATE TABLE tbl AS SELECT 'long string to consume some space' || g + from generate_series(1,{num_rows}) g''') + cur.execute("CHECKPOINT") - cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn = cur.fetchone()[0] - log.info(f"start_backup_lsn = {lsn}") + lsn = query_scalar(cur, 'SELECT pg_current_wal_insert_lsn()') + log.info(f"start_backup_lsn = {lsn}") # Set LD_LIBRARY_PATH in the env properly, otherwise we may use the wrong libpq. # PgBin sets it automatically, but here we need to pipe psql output to the tar command. diff --git a/test_runner/batch_others/test_gc_aggressive.py b/test_runner/batch_others/test_gc_aggressive.py index bffeedfdc0..d7f6308182 100644 --- a/test_runner/batch_others/test_gc_aggressive.py +++ b/test_runner/batch_others/test_gc_aggressive.py @@ -3,6 +3,7 @@ import random from fixtures.neon_fixtures import NeonEnv, NeonEnvBuilder, Postgres from fixtures.log_helper import log +from fixtures.utils import query_scalar # Test configuration # @@ -59,22 +60,21 @@ def test_gc_aggressive(neon_env_builder: NeonEnvBuilder): pg = env.postgres.create_start('test_gc_aggressive') log.info('postgres is running on test_gc_aggressive branch') - conn = pg.connect() - cur = conn.cursor() + with pg.cursor() as cur: + timeline = query_scalar(cur, "SHOW neon.timeline_id") - cur.execute("SHOW neon.timeline_id") - timeline = cur.fetchone()[0] + # Create table, and insert the first 100 rows + cur.execute('CREATE TABLE foo (id int, counter int, t text)') + cur.execute(f''' + INSERT INTO foo + SELECT g, 0, 'long string to consume some space' || g + FROM generate_series(1, {num_rows}) g + ''') + cur.execute('CREATE INDEX ON foo(id)') - # Create table, and insert the first 100 rows - cur.execute('CREATE TABLE foo (id int, counter int, t text)') - cur.execute(f''' - INSERT INTO foo - SELECT g, 0, 'long string to consume some space' || g - FROM generate_series(1, {num_rows}) g - ''') - cur.execute('CREATE INDEX ON foo(id)') + asyncio.run(update_and_gc(env, pg, timeline)) - asyncio.run(update_and_gc(env, pg, timeline)) - - cur.execute('SELECT COUNT(*), SUM(counter) FROM foo') - assert cur.fetchone() == (num_rows, updates_to_perform) + cur.execute('SELECT COUNT(*), SUM(counter) FROM foo') + r = cur.fetchone() + assert r is not None + assert r == (num_rows, updates_to_perform) diff --git a/test_runner/batch_others/test_lsn_mapping.py b/test_runner/batch_others/test_lsn_mapping.py index 1eca92ed58..d8b207135e 100644 --- a/test_runner/batch_others/test_lsn_mapping.py +++ b/test_runner/batch_others/test_lsn_mapping.py @@ -8,6 +8,8 @@ from fixtures.neon_fixtures import NeonEnv, NeonEnvBuilder, Postgres from fixtures.log_helper import log import time +from fixtures.utils import query_scalar + # # Test pageserver get_lsn_by_timestamp API @@ -20,11 +22,8 @@ def test_lsn_mapping(neon_env_builder: NeonEnvBuilder): pgmain = env.postgres.create_start("test_lsn_mapping") log.info("postgres is running on 'test_lsn_mapping' branch") - ps_conn = env.pageserver.connect() - ps_cur = ps_conn.cursor() - conn = pgmain.connect() - cur = conn.cursor() - + ps_cur = env.pageserver.connect().cursor() + cur = pgmain.connect().cursor() # Create table, and insert rows, each in a separate transaction # Disable synchronous_commit to make this initialization go faster. # @@ -35,9 +34,8 @@ def test_lsn_mapping(neon_env_builder: NeonEnvBuilder): tbl = [] for i in range(1000): cur.execute(f"INSERT INTO foo VALUES({i})") - cur.execute(f'SELECT clock_timestamp()') # Get the timestamp at UTC - after_timestamp = cur.fetchone()[0].replace(tzinfo=None) + after_timestamp = query_scalar(cur, 'SELECT clock_timestamp()').replace(tzinfo=None) tbl.append([i, after_timestamp]) # Execute one more transaction with synchronous_commit enabled, to flush @@ -47,18 +45,18 @@ def test_lsn_mapping(neon_env_builder: NeonEnvBuilder): # Check edge cases: timestamp in the future probe_timestamp = tbl[-1][1] + timedelta(hours=1) - ps_cur.execute( + result = query_scalar( + ps_cur, f"get_lsn_by_timestamp {env.initial_tenant.hex} {new_timeline_id.hex} '{probe_timestamp.isoformat()}Z'" ) - result = ps_cur.fetchone()[0] assert result == 'future' # timestamp too the far history probe_timestamp = tbl[0][1] - timedelta(hours=10) - ps_cur.execute( + result = query_scalar( + ps_cur, f"get_lsn_by_timestamp {env.initial_tenant.hex} {new_timeline_id.hex} '{probe_timestamp.isoformat()}Z'" ) - result = ps_cur.fetchone()[0] assert result == 'past' # Probe a bunch of timestamps in the valid range @@ -66,19 +64,16 @@ def test_lsn_mapping(neon_env_builder: NeonEnvBuilder): probe_timestamp = tbl[i][1] # Call get_lsn_by_timestamp to get the LSN - ps_cur.execute( + lsn = query_scalar( + ps_cur, f"get_lsn_by_timestamp {env.initial_tenant.hex} {new_timeline_id.hex} '{probe_timestamp.isoformat()}Z'" ) - lsn = ps_cur.fetchone()[0] # Launch a new read-only node at that LSN, and check that only the rows # that were supposed to be committed at that point in time are visible. pg_here = env.postgres.create_start(branch_name='test_lsn_mapping', node_name='test_lsn_mapping_read', lsn=lsn) - with closing(pg_here.connect()) as conn_here: - with conn_here.cursor() as cur_here: - cur_here.execute("SELECT max(x) FROM foo") - assert cur_here.fetchone()[0] == i + assert pg_here.safe_psql("SELECT max(x) FROM foo")[0][0] == i pg_here.stop_and_destroy() diff --git a/test_runner/batch_others/test_multixact.py b/test_runner/batch_others/test_multixact.py index b17676658b..dd00066092 100644 --- a/test_runner/batch_others/test_multixact.py +++ b/test_runner/batch_others/test_multixact.py @@ -1,5 +1,6 @@ from fixtures.neon_fixtures import NeonEnv, check_restored_datadir_content from fixtures.log_helper import log +from fixtures.utils import query_scalar # @@ -14,16 +15,14 @@ def test_multixact(neon_simple_env: NeonEnv, test_output_dir): pg = env.postgres.create_start('test_multixact') log.info("postgres is running on 'test_multixact' branch") - pg_conn = pg.connect() - cur = pg_conn.cursor() - + cur = pg.connect().cursor() cur.execute(''' CREATE TABLE t1(i int primary key); INSERT INTO t1 select * from generate_series(1, 100); ''') - cur.execute('SELECT next_multixact_id FROM pg_control_checkpoint()') - next_multixact_id_old = cur.fetchone()[0] + next_multixact_id_old = query_scalar(cur, + 'SELECT next_multixact_id FROM pg_control_checkpoint()') # Lock entries using parallel connections in a round-robin fashion. nclients = 20 @@ -53,6 +52,7 @@ def test_multixact(neon_simple_env: NeonEnv, test_output_dir): cur.execute( 'SELECT next_multixact_id, pg_current_wal_insert_lsn() FROM pg_control_checkpoint()') res = cur.fetchone() + assert res is not None next_multixact_id = res[0] lsn = res[1] @@ -64,11 +64,8 @@ def test_multixact(neon_simple_env: NeonEnv, test_output_dir): pg_new = env.postgres.create_start('test_multixact_new') log.info("postgres is running on 'test_multixact_new' branch") - pg_new_conn = pg_new.connect() - cur_new = pg_new_conn.cursor() - - cur_new.execute('SELECT next_multixact_id FROM pg_control_checkpoint()') - next_multixact_id_new = cur_new.fetchone()[0] + next_multixact_id_new = pg_new.safe_psql( + 'SELECT next_multixact_id FROM pg_control_checkpoint()')[0][0] # Check that we restored pg_controlfile correctly assert next_multixact_id_new == next_multixact_id diff --git a/test_runner/batch_others/test_old_request_lsn.py b/test_runner/batch_others/test_old_request_lsn.py index 1e96c0a1fa..78a936af19 100644 --- a/test_runner/batch_others/test_old_request_lsn.py +++ b/test_runner/batch_others/test_old_request_lsn.py @@ -1,6 +1,6 @@ from fixtures.neon_fixtures import NeonEnvBuilder from fixtures.log_helper import log -from fixtures.utils import print_gc_result +from fixtures.utils import print_gc_result, query_scalar import psycopg2.extras @@ -26,8 +26,7 @@ def test_old_request_lsn(neon_env_builder: NeonEnvBuilder): cur = pg_conn.cursor() # Get the timeline ID of our branch. We need it for the 'do_gc' command - cur.execute("SHOW neon.timeline_id") - timeline = cur.fetchone()[0] + timeline = query_scalar(cur, "SHOW neon.timeline_id") psconn = env.pageserver.connect() pscur = psconn.cursor(cursor_factory=psycopg2.extras.DictCursor) @@ -48,6 +47,7 @@ def test_old_request_lsn(neon_env_builder: NeonEnvBuilder): from pg_settings where name = 'shared_buffers' ''') row = cur.fetchone() + assert row is not None log.info(f'shared_buffers is {row[0]}, table size {row[1]}') assert int(row[0]) < int(row[1]) diff --git a/test_runner/batch_others/test_pageserver_restart.py b/test_runner/batch_others/test_pageserver_restart.py index 403ff7b305..c656469cb7 100644 --- a/test_runner/batch_others/test_pageserver_restart.py +++ b/test_runner/batch_others/test_pageserver_restart.py @@ -30,6 +30,7 @@ def test_pageserver_restart(neon_env_builder: NeonEnvBuilder): from pg_settings where name = 'shared_buffers' ''') row = cur.fetchone() + assert row is not None log.info(f"shared_buffers is {row[0]}, table size {row[1]}") assert int(row[0]) < int(row[1]) diff --git a/test_runner/batch_others/test_pitr_gc.py b/test_runner/batch_others/test_pitr_gc.py index 161f628429..d63fc4b584 100644 --- a/test_runner/batch_others/test_pitr_gc.py +++ b/test_runner/batch_others/test_pitr_gc.py @@ -1,10 +1,8 @@ -import subprocess from contextlib import closing import psycopg2.extras -import pytest from fixtures.log_helper import log -from fixtures.utils import print_gc_result +from fixtures.utils import print_gc_result, query_scalar from fixtures.neon_fixtures import NeonEnvBuilder @@ -24,9 +22,7 @@ def test_pitr_gc(neon_env_builder: NeonEnvBuilder): main_pg_conn = pgmain.connect() main_cur = main_pg_conn.cursor() - - main_cur.execute("SHOW neon.timeline_id") - timeline = main_cur.fetchone()[0] + timeline = query_scalar(main_cur, "SHOW neon.timeline_id") # Create table main_cur.execute('CREATE TABLE foo (t text)') @@ -41,12 +37,15 @@ def test_pitr_gc(neon_env_builder: NeonEnvBuilder): # keep some early lsn to test branch creation after GC main_cur.execute('SELECT pg_current_wal_insert_lsn(), txid_current()') res = main_cur.fetchone() + assert res is not None lsn_a = res[0] xid_a = res[1] log.info(f'LSN after 100 rows: {lsn_a} xid {xid_a}') main_cur.execute('SELECT pg_current_wal_insert_lsn(), txid_current()') res = main_cur.fetchone() + assert res is not None + debug_lsn = res[0] debug_xid = res[1] log.info(f'LSN after 10000 rows: {debug_lsn} xid {debug_xid}') diff --git a/test_runner/batch_others/test_read_validation.py b/test_runner/batch_others/test_read_validation.py index 6b8a154865..4be7af4c10 100644 --- a/test_runner/batch_others/test_read_validation.py +++ b/test_runner/batch_others/test_read_validation.py @@ -6,6 +6,8 @@ from fixtures.log_helper import log from psycopg2.errors import UndefinedTable from psycopg2.errors import IoError +from fixtures.utils import query_scalar + pytest_plugins = ("fixtures.neon_fixtures") extensions = ["pageinspect", "neon_test_utils", "pg_buffercache"] @@ -32,9 +34,9 @@ def test_read_validation(neon_simple_env: NeonEnv): c.execute("select lsn, lower, upper from page_header(get_raw_page('foo', 'main', 0));") first = c.fetchone() + assert first is not None - c.execute("select relfilenode from pg_class where relname = 'foo'") - relfilenode = c.fetchone()[0] + relfilenode = query_scalar(c, "select relfilenode from pg_class where relname = 'foo'") c.execute("insert into foo values (2);") c.execute("select lsn, lower, upper from page_header(get_raw_page('foo', 'main', 0));") @@ -44,22 +46,25 @@ def test_read_validation(neon_simple_env: NeonEnv): log.info("Test table is populated, validating buffer cache") - c.execute( + cache_entries = query_scalar( + c, "select count(*) from pg_buffercache where relfilenode = {}".format(relfilenode)) - assert c.fetchone()[0] > 0, "No buffers cached for the test relation" + assert cache_entries > 0, "No buffers cached for the test relation" c.execute( "select reltablespace, reldatabase, relfilenode from pg_buffercache where relfilenode = {}" .format(relfilenode)) reln = c.fetchone() + assert reln is not None log.info("Clear buffer cache to ensure no stale pages are brought into the cache") c.execute("select clear_buffer_cache()") - c.execute( + cache_entries = query_scalar( + c, "select count(*) from pg_buffercache where relfilenode = {}".format(relfilenode)) - assert c.fetchone()[0] == 0, "Failed to clear buffer cache" + assert cache_entries == 0, "Failed to clear buffer cache" log.info("Cache is clear, reading stale page version") @@ -69,9 +74,10 @@ def test_read_validation(neon_simple_env: NeonEnv): direct_first = c.fetchone() assert first == direct_first, "Failed fetch page at historic lsn" - c.execute( + cache_entries = query_scalar( + c, "select count(*) from pg_buffercache where relfilenode = {}".format(relfilenode)) - assert c.fetchone()[0] == 0, "relation buffers detected after invalidation" + assert cache_entries == 0, "relation buffers detected after invalidation" log.info("Cache is clear, reading latest page version without cache") @@ -81,9 +87,10 @@ def test_read_validation(neon_simple_env: NeonEnv): direct_latest = c.fetchone() assert second == direct_latest, "Failed fetch page at latest lsn" - c.execute( + cache_entries = query_scalar( + c, "select count(*) from pg_buffercache where relfilenode = {}".format(relfilenode)) - assert c.fetchone()[0] == 0, "relation buffers detected after invalidation" + assert cache_entries == 0, "relation buffers detected after invalidation" log.info( "Cache is clear, reading stale page version without cache using relation identifiers" diff --git a/test_runner/batch_others/test_readonly_node.py b/test_runner/batch_others/test_readonly_node.py index 286c756a5e..82fc6329cf 100644 --- a/test_runner/batch_others/test_readonly_node.py +++ b/test_runner/batch_others/test_readonly_node.py @@ -1,6 +1,7 @@ import pytest from fixtures.log_helper import log from fixtures.neon_fixtures import NeonEnv +from fixtures.utils import query_scalar # @@ -27,7 +28,7 @@ def test_readonly_node(neon_simple_env: NeonEnv): FROM generate_series(1, 100) g ''') main_cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn_a = main_cur.fetchone()[0] + lsn_a = query_scalar(main_cur, 'SELECT pg_current_wal_insert_lsn()') log.info('LSN after 100 rows: ' + lsn_a) # Insert some more rows. (This generates enough WAL to fill a few segments.) @@ -36,8 +37,7 @@ def test_readonly_node(neon_simple_env: NeonEnv): SELECT 'long string to consume some space' || g FROM generate_series(1, 200000) g ''') - main_cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn_b = main_cur.fetchone()[0] + lsn_b = query_scalar(main_cur, 'SELECT pg_current_wal_insert_lsn()') log.info('LSN after 200100 rows: ' + lsn_b) # Insert many more rows. This generates enough WAL to fill a few segments. @@ -47,8 +47,7 @@ def test_readonly_node(neon_simple_env: NeonEnv): FROM generate_series(1, 200000) g ''') - main_cur.execute('SELECT pg_current_wal_insert_lsn()') - lsn_c = main_cur.fetchone()[0] + lsn_c = query_scalar(main_cur, 'SELECT pg_current_wal_insert_lsn()') log.info('LSN after 400100 rows: ' + lsn_c) # Create first read-only node at the point where only 100 rows were inserted diff --git a/test_runner/batch_others/test_remote_storage.py b/test_runner/batch_others/test_remote_storage.py index 163912690c..6a8497a559 100644 --- a/test_runner/batch_others/test_remote_storage.py +++ b/test_runner/batch_others/test_remote_storage.py @@ -8,7 +8,7 @@ import time from uuid import UUID from fixtures.neon_fixtures import NeonEnvBuilder, assert_timeline_local, wait_until, wait_for_last_record_lsn, wait_for_upload from fixtures.log_helper import log -from fixtures.utils import lsn_from_hex, lsn_to_hex +from fixtures.utils import lsn_from_hex, query_scalar import pytest @@ -57,14 +57,12 @@ def test_remote_storage_backup_and_restore(neon_env_builder: NeonEnvBuilder, sto checkpoint_numbers = range(1, 3) for checkpoint_number in checkpoint_numbers: - with closing(pg.connect()) as conn: - with conn.cursor() as cur: - cur.execute(f''' - CREATE TABLE t{checkpoint_number}(id int primary key, secret text); - INSERT INTO t{checkpoint_number} VALUES ({data_id}, '{data_secret}|{checkpoint_number}'); - ''') - cur.execute("SELECT pg_current_wal_flush_lsn()") - current_lsn = lsn_from_hex(cur.fetchone()[0]) + with pg.cursor() as cur: + cur.execute(f''' + CREATE TABLE t{checkpoint_number}(id int primary key, secret text); + INSERT INTO t{checkpoint_number} VALUES ({data_id}, '{data_secret}|{checkpoint_number}'); + ''') + current_lsn = lsn_from_hex(query_scalar(cur, "SELECT pg_current_wal_flush_lsn()")) # wait until pageserver receives that data wait_for_last_record_lsn(client, UUID(tenant_id), UUID(timeline_id), current_lsn) @@ -123,8 +121,8 @@ def test_remote_storage_backup_and_restore(neon_env_builder: NeonEnvBuilder, sto assert not detail['remote']['awaits_download'] pg = env.postgres.create_start('main') - with closing(pg.connect()) as conn: - with conn.cursor() as cur: - for checkpoint_number in checkpoint_numbers: - cur.execute(f'SELECT secret FROM t{checkpoint_number} WHERE id = {data_id};') - assert cur.fetchone() == (f'{data_secret}|{checkpoint_number}', ) + with pg.cursor() as cur: + for checkpoint_number in checkpoint_numbers: + assert query_scalar(cur, + f'SELECT secret FROM t{checkpoint_number} WHERE id = {data_id};' + ) == f'{data_secret}|{checkpoint_number}' diff --git a/test_runner/batch_others/test_tenants_with_remote_storage.py b/test_runner/batch_others/test_tenants_with_remote_storage.py index 41506ad920..8ddb4d1b92 100644 --- a/test_runner/batch_others/test_tenants_with_remote_storage.py +++ b/test_runner/batch_others/test_tenants_with_remote_storage.py @@ -8,6 +8,7 @@ import asyncio from contextlib import closing +from typing import List, Tuple from uuid import UUID import pytest @@ -59,7 +60,7 @@ def test_tenants_many(neon_env_builder: NeonEnvBuilder, storage_type: str): env = neon_env_builder.init_start() - tenants_pgs = [] + tenants_pgs: List[Tuple[UUID, Postgres]] = [] for i in range(1, 5): # Use a tiny checkpoint distance, to create a lot of layers quickly @@ -80,14 +81,11 @@ def test_tenants_many(neon_env_builder: NeonEnvBuilder, storage_type: str): # Wait for the remote storage uploads to finish pageserver_http = env.pageserver.http_client() for tenant, pg in tenants_pgs: - with closing(pg.connect()) as conn: - with conn.cursor() as cur: - cur.execute("show neon.tenant_id") - tenant_id = cur.fetchone()[0] - cur.execute("show neon.timeline_id") - timeline_id = cur.fetchone()[0] - cur.execute("SELECT pg_current_wal_flush_lsn()") - current_lsn = lsn_from_hex(cur.fetchone()[0]) + res = pg.safe_psql_many( + ["SHOW neon.tenant_id", "SHOW neon.timeline_id", "SELECT pg_current_wal_flush_lsn()"]) + tenant_id = res[0][0][0] + timeline_id = res[1][0][0] + current_lsn = lsn_from_hex(res[2][0][0]) # wait until pageserver receives all the data wait_for_last_record_lsn(pageserver_http, UUID(tenant_id), UUID(timeline_id), current_lsn) diff --git a/test_runner/batch_others/test_timeline_size.py b/test_runner/batch_others/test_timeline_size.py index f76529f1f7..c736893f99 100644 --- a/test_runner/batch_others/test_timeline_size.py +++ b/test_runner/batch_others/test_timeline_size.py @@ -102,17 +102,14 @@ def wait_for_pageserver_catchup(pgmain: Postgres, polling_interval=1, timeout=60 raise RuntimeError( f"timed out waiting for pageserver to reach pg_current_wal_flush_lsn()") - with closing(pgmain.connect()) as conn: - with conn.cursor() as cur: - - cur.execute(''' - select pg_size_pretty(pg_cluster_size()), - pg_wal_lsn_diff(pg_current_wal_flush_lsn(),received_lsn) as received_lsn_lag - FROM backpressure_lsns(); - ''') - res = cur.fetchone() - log.info(f"pg_cluster_size = {res[0]}, received_lsn_lag = {res[1]}") - received_lsn_lag = res[1] + res = pgmain.safe_psql(''' + SELECT + pg_size_pretty(pg_cluster_size()), + pg_wal_lsn_diff(pg_current_wal_flush_lsn(), received_lsn) as received_lsn_lag + FROM backpressure_lsns(); + ''')[0] + log.info(f"pg_cluster_size = {res[0]}, received_lsn_lag = {res[1]}") + received_lsn_lag = res[1] time.sleep(polling_interval) diff --git a/test_runner/batch_others/test_wal_acceptor.py b/test_runner/batch_others/test_wal_acceptor.py index 844ef3ebe1..da861bb9f3 100644 --- a/test_runner/batch_others/test_wal_acceptor.py +++ b/test_runner/batch_others/test_wal_acceptor.py @@ -15,7 +15,7 @@ from dataclasses import dataclass, field from multiprocessing import Process, Value from pathlib import Path from fixtures.neon_fixtures import NeonPageserver, PgBin, Etcd, Postgres, RemoteStorageUsers, Safekeeper, NeonEnv, NeonEnvBuilder, PortDistributor, SafekeeperPort, neon_binpath, PgProtocol, wait_for_last_record_lsn, wait_for_upload -from fixtures.utils import get_dir_size, lsn_to_hex, lsn_from_hex +from fixtures.utils import get_dir_size, lsn_to_hex, lsn_from_hex, query_scalar from fixtures.log_helper import log from typing import List, Optional, Any from uuid import uuid4 @@ -229,8 +229,7 @@ def test_restarts(neon_env_builder: NeonEnvBuilder): else: failed_node.start() failed_node = None - cur.execute('SELECT sum(key) FROM t') - assert cur.fetchone() == (500500, ) + assert query_scalar(cur, 'SELECT sum(key) FROM t') == 500500 # Test that safekeepers push their info to the broker and learn peer status from it @@ -286,12 +285,10 @@ def test_wal_removal(neon_env_builder: NeonEnvBuilder, auth_enabled: bool): env.neon_cli.create_branch('test_safekeepers_wal_removal') pg = env.postgres.create_start('test_safekeepers_wal_removal') - with closing(pg.connect()) as conn: - with conn.cursor() as cur: - # we rely upon autocommit after each statement - # as waiting for acceptors happens there - cur.execute('CREATE TABLE t(key int primary key, value text)') - cur.execute("INSERT INTO t SELECT generate_series(1,100000), 'payload'") + pg.safe_psql_many([ + 'CREATE TABLE t(key int primary key, value text)', + "INSERT INTO t SELECT generate_series(1,100000), 'payload'", + ]) tenant_id = pg.safe_psql("show neon.tenant_id")[0][0] timeline_id = pg.safe_psql("show neon.timeline_id")[0][0] @@ -469,8 +466,7 @@ def test_s3_wal_replay(neon_env_builder: NeonEnvBuilder, storage_type: str): cur.execute("insert into t select generate_series(1,500000), 'payload'") expected_sum += 500000 * 500001 // 2 - cur.execute("select sum(key) from t") - assert cur.fetchone()[0] == expected_sum + assert query_scalar(cur, "select sum(key) from t") == expected_sum for sk in env.safekeepers: wait_segment_offload(tenant_id, timeline_id, sk, seg_end) @@ -484,8 +480,7 @@ def test_s3_wal_replay(neon_env_builder: NeonEnvBuilder, storage_type: str): # require WAL to be trimmed, so no more than one segment is left on disk wait_wal_trim(tenant_id, timeline_id, sk, 16 * 1.5) - cur.execute('SELECT pg_current_wal_flush_lsn()') - last_lsn = cur.fetchone()[0] + last_lsn = query_scalar(cur, 'SELECT pg_current_wal_flush_lsn()') pageserver_lsn = env.pageserver.http_client().timeline_detail( uuid.UUID(tenant_id), uuid.UUID((timeline_id)))["local"]["last_record_lsn"] @@ -532,10 +527,7 @@ def test_s3_wal_replay(neon_env_builder: NeonEnvBuilder, storage_type: str): # verify data pg.create_start('test_s3_wal_replay') - with closing(pg.connect()) as conn: - with conn.cursor() as cur: - cur.execute("select sum(key) from t") - assert cur.fetchone()[0] == expected_sum + assert pg.safe_psql("select sum(key) from t")[0][0] == expected_sum class ProposerPostgres(PgProtocol): @@ -860,12 +852,10 @@ def test_replace_safekeeper(neon_env_builder: NeonEnvBuilder): # as waiting for acceptors happens there cur.execute('CREATE TABLE IF NOT EXISTS t(key int, value text)') cur.execute("INSERT INTO t VALUES (0, 'something')") - cur.execute('SELECT SUM(key) FROM t') - sum_before = cur.fetchone()[0] + sum_before = query_scalar(cur, 'SELECT SUM(key) FROM t') cur.execute("INSERT INTO t SELECT generate_series(1,100000), 'payload'") - cur.execute('SELECT SUM(key) FROM t') - sum_after = cur.fetchone()[0] + sum_after = query_scalar(cur, 'SELECT SUM(key) FROM t') assert sum_after == sum_before + 5000050000 def show_statuses(safekeepers: List[Safekeeper], tenant_id: str, timeline_id: str): @@ -950,8 +940,7 @@ def test_wal_deleted_after_broadcast(neon_env_builder: NeonEnvBuilder): assert pg.pgdata_dir is not None log.info('executing INSERT to generate WAL') - cur.execute("select pg_current_wal_lsn()") - current_lsn = lsn_from_hex(cur.fetchone()[0]) / 1024 / 1024 + current_lsn = lsn_from_hex(query_scalar(cur, "select pg_current_wal_lsn()")) / 1024 / 1024 pg_wal_size = get_dir_size(os.path.join(pg.pgdata_dir, 'pg_wal')) / 1024 / 1024 if enable_logs: log.info(f"LSN delta: {current_lsn - last_lsn} MB, current WAL size: {pg_wal_size} MB") diff --git a/test_runner/batch_pg_regress/test_pg_regress.py b/test_runner/batch_pg_regress/test_pg_regress.py index b53bc21ca2..28066d7a32 100644 --- a/test_runner/batch_pg_regress/test_pg_regress.py +++ b/test_runner/batch_pg_regress/test_pg_regress.py @@ -50,7 +50,6 @@ def test_pg_regress(neon_simple_env: NeonEnv, test_output_dir: pathlib.Path, pg_ # checkpoint one more time to ensure that the lsn we get is the latest one pg.safe_psql('CHECKPOINT') - pg.safe_psql('select pg_current_wal_insert_lsn()')[0][0] # Check that we restore the content of the datadir correctly check_restored_datadir_content(test_output_dir, env, pg) diff --git a/test_runner/fixtures/compare_fixtures.py b/test_runner/fixtures/compare_fixtures.py index 9808d83492..e6c3a79697 100644 --- a/test_runner/fixtures/compare_fixtures.py +++ b/test_runner/fixtures/compare_fixtures.py @@ -70,6 +70,7 @@ class PgCompare(ABC): for pg_stat in pg_stats: cur.execute(pg_stat.query) row = cur.fetchone() + assert row is not None assert len(row) == len(pg_stat.columns) for col, val in zip(pg_stat.columns, row): diff --git a/test_runner/fixtures/neon_fixtures.py b/test_runner/fixtures/neon_fixtures.py index 8fa9e4a2ea..6783ab710b 100644 --- a/test_runner/fixtures/neon_fixtures.py +++ b/test_runner/fixtures/neon_fixtures.py @@ -1,6 +1,7 @@ from __future__ import annotations from dataclasses import field +from contextlib import contextmanager from enum import Flag, auto import textwrap from cached_property import cached_property @@ -306,6 +307,15 @@ class PgProtocol: conn.autocommit = autocommit return conn + @contextmanager + def cursor(self, autocommit=True, **kwargs): + """ + Shorthand for pg.connect().cursor(). + The cursor and connection are closed when the context is exited. + """ + with closing(self.connect(autocommit=autocommit, **kwargs)) as conn: + yield conn.cursor() + async def connect_async(self, **kwargs) -> asyncpg.Connection: """ Connect to the node from async python. @@ -354,7 +364,7 @@ class PgProtocol: if cur.description is None: result.append([]) # query didn't return data else: - result.append(cast(List[Any], cur.fetchall())) + result.append(cur.fetchall()) return result @@ -2142,12 +2152,8 @@ def list_files_to_compare(pgdata_dir: pathlib.Path): # pg is the existing and running compute node, that we want to compare with a basebackup def check_restored_datadir_content(test_output_dir: Path, env: NeonEnv, pg: Postgres): - # Get the timeline ID. We need it for the 'basebackup' command - with closing(pg.connect()) as conn: - with conn.cursor() as cur: - cur.execute("SHOW neon.timeline_id") - timeline = cur.fetchone()[0] + timeline = pg.safe_psql("SHOW neon.timeline_id")[0][0] # stop postgres to ensure that files won't change pg.stop() diff --git a/test_runner/fixtures/utils.py b/test_runner/fixtures/utils.py index bc50a43ada..a86c5ad923 100644 --- a/test_runner/fixtures/utils.py +++ b/test_runner/fixtures/utils.py @@ -6,6 +6,8 @@ import subprocess from pathlib import Path from typing import Any, List, Tuple + +from psycopg2.extensions import cursor from fixtures.log_helper import log @@ -79,6 +81,20 @@ def etcd_path() -> Path: return Path(path_output) +def query_scalar(cur: cursor, query: str) -> Any: + """ + It is a convenience wrapper to avoid repetitions + of cur.execute(); cur.fetchone()[0] + + And this is mypy friendly, because without None + check mypy says that Optional is not indexable. + """ + cur.execute(query) + var = cur.fetchone() + assert var is not None + return var[0] + + # Traverse directory to get total size. def get_dir_size(path: str) -> int: """Return size in bytes.""" diff --git a/test_runner/performance/test_random_writes.py b/test_runner/performance/test_random_writes.py index 4350386dd0..8931234c51 100644 --- a/test_runner/performance/test_random_writes.py +++ b/test_runner/performance/test_random_writes.py @@ -9,6 +9,8 @@ import psycopg2.extras import random import time +from fixtures.utils import query_scalar + # This is a clear-box test that demonstrates the worst case scenario for the # "1 segment per layer" implementation of the pageserver. It writes to random @@ -59,9 +61,7 @@ def test_random_writes(neon_with_baseline: PgCompare): rows_inserted += rows_to_insert # Get table size (can't be predicted because padding and alignment) - cur.execute("SELECT pg_relation_size('Big');") - row = cur.fetchone() - table_size = row[0] + table_size = query_scalar(cur, "SELECT pg_relation_size('Big')") env.zenbenchmark.record("table_size", table_size, 'bytes', MetricReport.TEST_PARAM) # Decide how much to write, based on knowledge of pageserver implementation. diff --git a/test_runner/performance/test_seqscans.py b/test_runner/performance/test_seqscans.py index 8ed31cb480..8d7ad46c1a 100644 --- a/test_runner/performance/test_seqscans.py +++ b/test_runner/performance/test_seqscans.py @@ -34,6 +34,7 @@ def test_seqscans(neon_with_baseline: PgCompare, rows: int, iters: int, workers: from pg_settings where name = 'shared_buffers' ''') row = cur.fetchone() + assert row is not None shared_buffers = row[0] table_size = row[1] log.info(f"shared_buffers is {shared_buffers}, table size {table_size}")