boto3-errors 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- boto3_errors-0.1.0/LICENSE +21 -0
- boto3_errors-0.1.0/PKG-INFO +117 -0
- boto3_errors-0.1.0/README.md +82 -0
- boto3_errors-0.1.0/pyproject.toml +99 -0
- boto3_errors-0.1.0/src/boto3_errors/__init__.py +6 -0
- boto3_errors-0.1.0/src/boto3_errors/_base.py +40 -0
- boto3_errors-0.1.0/src/boto3_errors/_patch.py +54 -0
- boto3_errors-0.1.0/src/boto3_errors/accessanalyzer.py +118 -0
- boto3_errors-0.1.0/src/boto3_errors/account.py +113 -0
- boto3_errors-0.1.0/src/boto3_errors/acm.py +125 -0
- boto3_errors-0.1.0/src/boto3_errors/acm_pca.py +153 -0
- boto3_errors-0.1.0/src/boto3_errors/aiops.py +85 -0
- boto3_errors-0.1.0/src/boto3_errors/amp.py +129 -0
- boto3_errors-0.1.0/src/boto3_errors/amplify.py +60 -0
- boto3_errors-0.1.0/src/boto3_errors/amplifybackend.py +48 -0
- boto3_errors-0.1.0/src/boto3_errors/amplifyuibuilder.py +60 -0
- boto3_errors-0.1.0/src/boto3_errors/apigateway.py +77 -0
- boto3_errors-0.1.0/src/boto3_errors/apigatewaymanagementapi.py +41 -0
- boto3_errors-0.1.0/src/boto3_errors/apigatewayv2.py +63 -0
- boto3_errors-0.1.0/src/boto3_errors/appconfig.py +96 -0
- boto3_errors-0.1.0/src/boto3_errors/appconfigdata.py +60 -0
- boto3_errors-0.1.0/src/boto3_errors/appfabric.py +129 -0
- boto3_errors-0.1.0/src/boto3_errors/appflow.py +90 -0
- boto3_errors-0.1.0/src/boto3_errors/appintegrations.py +62 -0
- boto3_errors-0.1.0/src/boto3_errors/application_autoscaling.py +103 -0
- boto3_errors-0.1.0/src/boto3_errors/application_insights.py +70 -0
- boto3_errors-0.1.0/src/boto3_errors/application_signals.py +60 -0
- boto3_errors-0.1.0/src/boto3_errors/applicationcostprofiler.py +47 -0
- boto3_errors-0.1.0/src/boto3_errors/appmesh.py +94 -0
- boto3_errors-0.1.0/src/boto3_errors/apprunner.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/appstream.py +114 -0
- boto3_errors-0.1.0/src/boto3_errors/appsync.py +117 -0
- boto3_errors-0.1.0/src/boto3_errors/arc_region_switch.py +62 -0
- boto3_errors-0.1.0/src/boto3_errors/arc_zonal_shift.py +71 -0
- boto3_errors-0.1.0/src/boto3_errors/artifact.py +126 -0
- boto3_errors-0.1.0/src/boto3_errors/athena.py +72 -0
- boto3_errors-0.1.0/src/boto3_errors/auditmanager.py +81 -0
- boto3_errors-0.1.0/src/boto3_errors/autoscaling.py +100 -0
- boto3_errors-0.1.0/src/boto3_errors/autoscaling_plans.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/b2bi.py +111 -0
- boto3_errors-0.1.0/src/boto3_errors/backup.py +220 -0
- boto3_errors-0.1.0/src/boto3_errors/backup_gateway.py +85 -0
- boto3_errors-0.1.0/src/boto3_errors/backupsearch.py +128 -0
- boto3_errors-0.1.0/src/boto3_errors/batch.py +30 -0
- boto3_errors-0.1.0/src/boto3_errors/bcm_dashboards.py +68 -0
- boto3_errors-0.1.0/src/boto3_errors/bcm_data_exports.py +107 -0
- boto3_errors-0.1.0/src/boto3_errors/bcm_pricing_calculator.py +145 -0
- boto3_errors-0.1.0/src/boto3_errors/bcm_recommended_actions.py +51 -0
- boto3_errors-0.1.0/src/boto3_errors/bedrock.py +90 -0
- boto3_errors-0.1.0/src/boto3_errors/bedrock_agent.py +66 -0
- boto3_errors-0.1.0/src/boto3_errors/bedrock_agent_runtime.py +113 -0
- boto3_errors-0.1.0/src/boto3_errors/bedrock_agentcore.py +156 -0
- boto3_errors-0.1.0/src/boto3_errors/bedrock_agentcore_control.py +112 -0
- boto3_errors-0.1.0/src/boto3_errors/bedrock_data_automation.py +63 -0
- boto3_errors-0.1.0/src/boto3_errors/bedrock_data_automation_runtime.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/bedrock_runtime.py +136 -0
- boto3_errors-0.1.0/src/boto3_errors/billing.py +130 -0
- boto3_errors-0.1.0/src/boto3_errors/billingconductor.py +124 -0
- boto3_errors-0.1.0/src/boto3_errors/braket.py +78 -0
- boto3_errors-0.1.0/src/boto3_errors/budgets.py +98 -0
- boto3_errors-0.1.0/src/boto3_errors/ce.py +131 -0
- boto3_errors-0.1.0/src/boto3_errors/chatbot.py +209 -0
- boto3_errors-0.1.0/src/boto3_errors/chime.py +127 -0
- boto3_errors-0.1.0/src/boto3_errors/chime_sdk_identity.py +107 -0
- boto3_errors-0.1.0/src/boto3_errors/chime_sdk_media_pipelines.py +152 -0
- boto3_errors-0.1.0/src/boto3_errors/chime_sdk_meetings.py +209 -0
- boto3_errors-0.1.0/src/boto3_errors/chime_sdk_messaging.py +107 -0
- boto3_errors-0.1.0/src/boto3_errors/chime_sdk_voice.py +89 -0
- boto3_errors-0.1.0/src/boto3_errors/cleanrooms.py +106 -0
- boto3_errors-0.1.0/src/boto3_errors/cleanroomsml.py +69 -0
- boto3_errors-0.1.0/src/boto3_errors/cloud9.py +62 -0
- boto3_errors-0.1.0/src/boto3_errors/cloudcontrol.py +183 -0
- boto3_errors-0.1.0/src/boto3_errors/clouddirectory.py +290 -0
- boto3_errors-0.1.0/src/boto3_errors/cloudformation.py +237 -0
- boto3_errors-0.1.0/src/boto3_errors/cloudfront.py +1177 -0
- boto3_errors-0.1.0/src/boto3_errors/cloudfront_keyvaluestore.py +50 -0
- boto3_errors-0.1.0/src/boto3_errors/cloudhsm.py +37 -0
- boto3_errors-0.1.0/src/boto3_errors/cloudhsmv2.py +65 -0
- boto3_errors-0.1.0/src/boto3_errors/cloudsearch.py +75 -0
- boto3_errors-0.1.0/src/boto3_errors/cloudsearchdomain.py +31 -0
- boto3_errors-0.1.0/src/boto3_errors/cloudtrail.py +748 -0
- boto3_errors-0.1.0/src/boto3_errors/cloudtrail_data.py +50 -0
- boto3_errors-0.1.0/src/boto3_errors/cloudwatch.py +110 -0
- boto3_errors-0.1.0/src/boto3_errors/codeartifact.py +104 -0
- boto3_errors-0.1.0/src/boto3_errors/codebuild.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/codecatalyst.py +68 -0
- boto3_errors-0.1.0/src/boto3_errors/codecommit.py +1486 -0
- boto3_errors-0.1.0/src/boto3_errors/codeconnections.py +119 -0
- boto3_errors-0.1.0/src/boto3_errors/codedeploy.py +798 -0
- boto3_errors-0.1.0/src/boto3_errors/codeguru_reviewer.py +60 -0
- boto3_errors-0.1.0/src/boto3_errors/codeguru_security.py +134 -0
- boto3_errors-0.1.0/src/boto3_errors/codeguruprofiler.py +58 -0
- boto3_errors-0.1.0/src/boto3_errors/codepipeline.py +300 -0
- boto3_errors-0.1.0/src/boto3_errors/codestar_connections.py +119 -0
- boto3_errors-0.1.0/src/boto3_errors/codestar_notifications.py +78 -0
- boto3_errors-0.1.0/src/boto3_errors/cognito_identity.py +99 -0
- boto3_errors-0.1.0/src/boto3_errors/cognito_idp.py +456 -0
- boto3_errors-0.1.0/src/boto3_errors/cognito_sync.py +100 -0
- boto3_errors-0.1.0/src/boto3_errors/comprehend.py +146 -0
- boto3_errors-0.1.0/src/boto3_errors/comprehendmedical.py +84 -0
- boto3_errors-0.1.0/src/boto3_errors/compute_optimizer.py +71 -0
- boto3_errors-0.1.0/src/boto3_errors/compute_optimizer_automation.py +92 -0
- boto3_errors-0.1.0/src/boto3_errors/config.py +568 -0
- boto3_errors-0.1.0/src/boto3_errors/connect.py +238 -0
- boto3_errors-0.1.0/src/boto3_errors/connect_contact_lens.py +44 -0
- boto3_errors-0.1.0/src/boto3_errors/connectcampaigns.py +114 -0
- boto3_errors-0.1.0/src/boto3_errors/connectcampaignsv2.py +114 -0
- boto3_errors-0.1.0/src/boto3_errors/connectcases.py +85 -0
- boto3_errors-0.1.0/src/boto3_errors/connectparticipant.py +72 -0
- boto3_errors-0.1.0/src/boto3_errors/controlcatalog.py +47 -0
- boto3_errors-0.1.0/src/boto3_errors/controltower.py +74 -0
- boto3_errors-0.1.0/src/boto3_errors/cost_optimization_hub.py +65 -0
- boto3_errors-0.1.0/src/boto3_errors/cur.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/customer_profiles.py +44 -0
- boto3_errors-0.1.0/src/boto3_errors/databrew.py +50 -0
- boto3_errors-0.1.0/src/boto3_errors/dataexchange.py +94 -0
- boto3_errors-0.1.0/src/boto3_errors/datapipeline.py +51 -0
- boto3_errors-0.1.0/src/boto3_errors/datasync.py +38 -0
- boto3_errors-0.1.0/src/boto3_errors/datazone.py +65 -0
- boto3_errors-0.1.0/src/boto3_errors/dax.py +207 -0
- boto3_errors-0.1.0/src/boto3_errors/deadline.py +176 -0
- boto3_errors-0.1.0/src/boto3_errors/detective.py +105 -0
- boto3_errors-0.1.0/src/boto3_errors/devicefarm.py +113 -0
- boto3_errors-0.1.0/src/boto3_errors/devops_guru.py +117 -0
- boto3_errors-0.1.0/src/boto3_errors/directconnect.py +38 -0
- boto3_errors-0.1.0/src/boto3_errors/discovery.py +89 -0
- boto3_errors-0.1.0/src/boto3_errors/dlm.py +79 -0
- boto3_errors-0.1.0/src/boto3_errors/dms.py +180 -0
- boto3_errors-0.1.0/src/boto3_errors/docdb.py +406 -0
- boto3_errors-0.1.0/src/boto3_errors/docdb_elastic.py +99 -0
- boto3_errors-0.1.0/src/boto3_errors/drs.py +159 -0
- boto3_errors-0.1.0/src/boto3_errors/ds.py +470 -0
- boto3_errors-0.1.0/src/boto3_errors/ds_data.py +99 -0
- boto3_errors-0.1.0/src/boto3_errors/dsql.py +129 -0
- boto3_errors-0.1.0/src/boto3_errors/dynamodb.py +480 -0
- boto3_errors-0.1.0/src/boto3_errors/dynamodbstreams.py +86 -0
- boto3_errors-0.1.0/src/boto3_errors/ebs.py +94 -0
- boto3_errors-0.1.0/src/boto3_errors/ec2_instance_connect.py +112 -0
- boto3_errors-0.1.0/src/boto3_errors/ecr.py +398 -0
- boto3_errors-0.1.0/src/boto3_errors/ecr_public.py +222 -0
- boto3_errors-0.1.0/src/boto3_errors/ecs.py +269 -0
- boto3_errors-0.1.0/src/boto3_errors/efs.py +427 -0
- boto3_errors-0.1.0/src/boto3_errors/eks.py +315 -0
- boto3_errors-0.1.0/src/boto3_errors/eks_auth.py +82 -0
- boto3_errors-0.1.0/src/boto3_errors/elasticache.py +556 -0
- boto3_errors-0.1.0/src/boto3_errors/elasticbeanstalk.py +162 -0
- boto3_errors-0.1.0/src/boto3_errors/elb.py +163 -0
- boto3_errors-0.1.0/src/boto3_errors/elbv2.py +369 -0
- boto3_errors-0.1.0/src/boto3_errors/emr.py +40 -0
- boto3_errors-0.1.0/src/boto3_errors/emr_containers.py +44 -0
- boto3_errors-0.1.0/src/boto3_errors/emr_serverless.py +50 -0
- boto3_errors-0.1.0/src/boto3_errors/entityresolution.py +76 -0
- boto3_errors-0.1.0/src/boto3_errors/es.py +107 -0
- boto3_errors-0.1.0/src/boto3_errors/events.py +105 -0
- boto3_errors-0.1.0/src/boto3_errors/evidently.py +122 -0
- boto3_errors-0.1.0/src/boto3_errors/evs.py +111 -0
- boto3_errors-0.1.0/src/boto3_errors/finspace.py +83 -0
- boto3_errors-0.1.0/src/boto3_errors/finspace_data.py +68 -0
- boto3_errors-0.1.0/src/boto3_errors/firehose.py +86 -0
- boto3_errors-0.1.0/src/boto3_errors/fis.py +41 -0
- boto3_errors-0.1.0/src/boto3_errors/fms.py +64 -0
- boto3_errors-0.1.0/src/boto3_errors/forecast.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/forecastquery.py +47 -0
- boto3_errors-0.1.0/src/boto3_errors/frauddetector.py +63 -0
- boto3_errors-0.1.0/src/boto3_errors/freetier.py +47 -0
- boto3_errors-0.1.0/src/boto3_errors/fsx.py +381 -0
- boto3_errors-0.1.0/src/boto3_errors/gamelift.py +159 -0
- boto3_errors-0.1.0/src/boto3_errors/gameliftstreams.py +75 -0
- boto3_errors-0.1.0/src/boto3_errors/geo_maps.py +57 -0
- boto3_errors-0.1.0/src/boto3_errors/geo_places.py +48 -0
- boto3_errors-0.1.0/src/boto3_errors/geo_routes.py +48 -0
- boto3_errors-0.1.0/src/boto3_errors/glacier.py +172 -0
- boto3_errors-0.1.0/src/boto3_errors/globalaccelerator.py +146 -0
- boto3_errors-0.1.0/src/boto3_errors/glue.py +325 -0
- boto3_errors-0.1.0/src/boto3_errors/grafana.py +126 -0
- boto3_errors-0.1.0/src/boto3_errors/greengrass.py +36 -0
- boto3_errors-0.1.0/src/boto3_errors/greengrassv2.py +148 -0
- boto3_errors-0.1.0/src/boto3_errors/groundstation.py +70 -0
- boto3_errors-0.1.0/src/boto3_errors/guardduty.py +69 -0
- boto3_errors-0.1.0/src/boto3_errors/health.py +36 -0
- boto3_errors-0.1.0/src/boto3_errors/healthlake.py +53 -0
- boto3_errors-0.1.0/src/boto3_errors/iam.py +319 -0
- boto3_errors-0.1.0/src/boto3_errors/identitystore.py +196 -0
- boto3_errors-0.1.0/src/boto3_errors/imagebuilder.py +159 -0
- boto3_errors-0.1.0/src/boto3_errors/importexport.py +152 -0
- boto3_errors-0.1.0/src/boto3_errors/inspector.py +198 -0
- boto3_errors-0.1.0/src/boto3_errors/inspector2.py +115 -0
- boto3_errors-0.1.0/src/boto3_errors/inspector_scan.py +66 -0
- boto3_errors-0.1.0/src/boto3_errors/internetmonitor.py +80 -0
- boto3_errors-0.1.0/src/boto3_errors/invoicing.py +110 -0
- boto3_errors-0.1.0/src/boto3_errors/iot.py +249 -0
- boto3_errors-0.1.0/src/boto3_errors/iot_data.py +80 -0
- boto3_errors-0.1.0/src/boto3_errors/iot_jobs_data.py +95 -0
- boto3_errors-0.1.0/src/boto3_errors/iot_managed_integrations.py +102 -0
- boto3_errors-0.1.0/src/boto3_errors/iotanalytics.py +66 -0
- boto3_errors-0.1.0/src/boto3_errors/iotdeviceadvisor.py +38 -0
- boto3_errors-0.1.0/src/boto3_errors/iotevents.py +78 -0
- boto3_errors-0.1.0/src/boto3_errors/iotevents_data.py +44 -0
- boto3_errors-0.1.0/src/boto3_errors/iotfleetwise.py +177 -0
- boto3_errors-0.1.0/src/boto3_errors/iotsecuretunneling.py +26 -0
- boto3_errors-0.1.0/src/boto3_errors/iotsitewise.py +155 -0
- boto3_errors-0.1.0/src/boto3_errors/iotthingsgraph.py +49 -0
- boto3_errors-0.1.0/src/boto3_errors/iottwinmaker.py +80 -0
- boto3_errors-0.1.0/src/boto3_errors/iotwireless.py +81 -0
- boto3_errors-0.1.0/src/boto3_errors/ivs.py +116 -0
- boto3_errors-0.1.0/src/boto3_errors/ivs_realtime.py +310 -0
- boto3_errors-0.1.0/src/boto3_errors/ivschat.py +102 -0
- boto3_errors-0.1.0/src/boto3_errors/kafka.py +201 -0
- boto3_errors-0.1.0/src/boto3_errors/kafkaconnect.py +83 -0
- boto3_errors-0.1.0/src/boto3_errors/kendra.py +131 -0
- boto3_errors-0.1.0/src/boto3_errors/kendra_ranking.py +88 -0
- boto3_errors-0.1.0/src/boto3_errors/keyspaces.py +70 -0
- boto3_errors-0.1.0/src/boto3_errors/keyspacesstreams.py +82 -0
- boto3_errors-0.1.0/src/boto3_errors/kinesis.py +146 -0
- boto3_errors-0.1.0/src/boto3_errors/kinesis_video_archived_media.py +98 -0
- boto3_errors-0.1.0/src/boto3_errors/kinesis_video_media.py +63 -0
- boto3_errors-0.1.0/src/boto3_errors/kinesis_video_signaling.py +57 -0
- boto3_errors-0.1.0/src/boto3_errors/kinesis_video_webrtc_storage.py +41 -0
- boto3_errors-0.1.0/src/boto3_errors/kinesisanalytics.py +114 -0
- boto3_errors-0.1.0/src/boto3_errors/kinesisanalyticsv2.py +125 -0
- boto3_errors-0.1.0/src/boto3_errors/kinesisvideo.py +129 -0
- boto3_errors-0.1.0/src/boto3_errors/kms.py +554 -0
- boto3_errors-0.1.0/src/boto3_errors/lakeformation.py +142 -0
- boto3_errors-0.1.0/src/boto3_errors/lambda_.py +576 -0
- boto3_errors-0.1.0/src/boto3_errors/launch_wizard.py +47 -0
- boto3_errors-0.1.0/src/boto3_errors/lex_models.py +98 -0
- boto3_errors-0.1.0/src/boto3_errors/lex_runtime.py +101 -0
- boto3_errors-0.1.0/src/boto3_errors/lexv2_models.py +74 -0
- boto3_errors-0.1.0/src/boto3_errors/lexv2_runtime.py +54 -0
- boto3_errors-0.1.0/src/boto3_errors/license_manager.py +135 -0
- boto3_errors-0.1.0/src/boto3_errors/license_manager_linux_subscriptions.py +38 -0
- boto3_errors-0.1.0/src/boto3_errors/license_manager_user_subscriptions.py +59 -0
- boto3_errors-0.1.0/src/boto3_errors/lightsail.py +180 -0
- boto3_errors-0.1.0/src/boto3_errors/location.py +75 -0
- boto3_errors-0.1.0/src/boto3_errors/logs.py +189 -0
- boto3_errors-0.1.0/src/boto3_errors/lookoutequipment.py +68 -0
- boto3_errors-0.1.0/src/boto3_errors/m2.py +143 -0
- boto3_errors-0.1.0/src/boto3_errors/machinelearning.py +86 -0
- boto3_errors-0.1.0/src/boto3_errors/macie2.py +83 -0
- boto3_errors-0.1.0/src/boto3_errors/mailmanager.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/managedblockchain.py +97 -0
- boto3_errors-0.1.0/src/boto3_errors/managedblockchain_query.py +115 -0
- boto3_errors-0.1.0/src/boto3_errors/marketplace_agreement.py +89 -0
- boto3_errors-0.1.0/src/boto3_errors/marketplace_catalog.py +82 -0
- boto3_errors-0.1.0/src/boto3_errors/marketplace_deployment.py +69 -0
- boto3_errors-0.1.0/src/boto3_errors/marketplace_entitlement.py +35 -0
- boto3_errors-0.1.0/src/boto3_errors/marketplace_reporting.py +41 -0
- boto3_errors-0.1.0/src/boto3_errors/marketplacecommerceanalytics.py +20 -0
- boto3_errors-0.1.0/src/boto3_errors/mediaconnect.py +135 -0
- boto3_errors-0.1.0/src/boto3_errors/mediaconvert.py +68 -0
- boto3_errors-0.1.0/src/boto3_errors/medialive.py +73 -0
- boto3_errors-0.1.0/src/boto3_errors/mediapackage.py +50 -0
- boto3_errors-0.1.0/src/boto3_errors/mediapackage_vod.py +50 -0
- boto3_errors-0.1.0/src/boto3_errors/mediapackagev2.py +79 -0
- boto3_errors-0.1.0/src/boto3_errors/mediastore.py +50 -0
- boto3_errors-0.1.0/src/boto3_errors/mediastore_data.py +38 -0
- boto3_errors-0.1.0/src/boto3_errors/mediatailor.py +20 -0
- boto3_errors-0.1.0/src/boto3_errors/medical_imaging.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/memorydb.py +395 -0
- boto3_errors-0.1.0/src/boto3_errors/meteringmarketplace.py +160 -0
- boto3_errors-0.1.0/src/boto3_errors/mgh.py +103 -0
- boto3_errors-0.1.0/src/boto3_errors/mgn.py +174 -0
- boto3_errors-0.1.0/src/boto3_errors/migration_hub_refactor_spaces.py +125 -0
- boto3_errors-0.1.0/src/boto3_errors/migrationhub_config.py +67 -0
- boto3_errors-0.1.0/src/boto3_errors/migrationhuborchestrator.py +53 -0
- boto3_errors-0.1.0/src/boto3_errors/migrationhubstrategy.py +77 -0
- boto3_errors-0.1.0/src/boto3_errors/mpa.py +91 -0
- boto3_errors-0.1.0/src/boto3_errors/mq.py +80 -0
- boto3_errors-0.1.0/src/boto3_errors/mturk.py +37 -0
- boto3_errors-0.1.0/src/boto3_errors/mwaa.py +83 -0
- boto3_errors-0.1.0/src/boto3_errors/mwaa_serverless.py +162 -0
- boto3_errors-0.1.0/src/boto3_errors/neptune.py +472 -0
- boto3_errors-0.1.0/src/boto3_errors/neptune_graph.py +97 -0
- boto3_errors-0.1.0/src/boto3_errors/neptunedata.py +746 -0
- boto3_errors-0.1.0/src/boto3_errors/network_firewall.py +102 -0
- boto3_errors-0.1.0/src/boto3_errors/networkflowmonitor.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/networkmanager.py +135 -0
- boto3_errors-0.1.0/src/boto3_errors/networkmonitor.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/notifications.py +111 -0
- boto3_errors-0.1.0/src/boto3_errors/notificationscontacts.py +121 -0
- boto3_errors-0.1.0/src/boto3_errors/nova_act.py +134 -0
- boto3_errors-0.1.0/src/boto3_errors/oam.py +92 -0
- boto3_errors-0.1.0/src/boto3_errors/observabilityadmin.py +149 -0
- boto3_errors-0.1.0/src/boto3_errors/odb.py +128 -0
- boto3_errors-0.1.0/src/boto3_errors/omics.py +74 -0
- boto3_errors-0.1.0/src/boto3_errors/opensearch.py +126 -0
- boto3_errors-0.1.0/src/boto3_errors/opensearchserverless.py +79 -0
- boto3_errors-0.1.0/src/boto3_errors/organizations.py +709 -0
- boto3_errors-0.1.0/src/boto3_errors/osis.py +71 -0
- boto3_errors-0.1.0/src/boto3_errors/outposts.py +60 -0
- boto3_errors-0.1.0/src/boto3_errors/panorama.py +125 -0
- boto3_errors-0.1.0/src/boto3_errors/partnercentral_account.py +118 -0
- boto3_errors-0.1.0/src/boto3_errors/partnercentral_benefits.py +93 -0
- boto3_errors-0.1.0/src/boto3_errors/partnercentral_channel.py +119 -0
- boto3_errors-0.1.0/src/boto3_errors/partnercentral_selling.py +124 -0
- boto3_errors-0.1.0/src/boto3_errors/payment_cryptography.py +118 -0
- boto3_errors-0.1.0/src/boto3_errors/payment_cryptography_data.py +68 -0
- boto3_errors-0.1.0/src/boto3_errors/pca_connector_ad.py +141 -0
- boto3_errors-0.1.0/src/boto3_errors/pca_connector_scep.py +126 -0
- boto3_errors-0.1.0/src/boto3_errors/pcs.py +161 -0
- boto3_errors-0.1.0/src/boto3_errors/personalize.py +65 -0
- boto3_errors-0.1.0/src/boto3_errors/personalize_events.py +32 -0
- boto3_errors-0.1.0/src/boto3_errors/personalize_runtime.py +26 -0
- boto3_errors-0.1.0/src/boto3_errors/pi.py +32 -0
- boto3_errors-0.1.0/src/boto3_errors/pinpoint.py +102 -0
- boto3_errors-0.1.0/src/boto3_errors/pinpoint_email.py +80 -0
- boto3_errors-0.1.0/src/boto3_errors/pinpoint_sms_voice.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/pinpoint_sms_voice_v2.py +120 -0
- boto3_errors-0.1.0/src/boto3_errors/pipes.py +111 -0
- boto3_errors-0.1.0/src/boto3_errors/polly.py +182 -0
- boto3_errors-0.1.0/src/boto3_errors/pricing.py +65 -0
- boto3_errors-0.1.0/src/boto3_errors/proton.py +59 -0
- boto3_errors-0.1.0/src/boto3_errors/py.typed +0 -0
- boto3_errors-0.1.0/src/boto3_errors/qapps.py +150 -0
- boto3_errors-0.1.0/src/boto3_errors/qbusiness.py +138 -0
- boto3_errors-0.1.0/src/boto3_errors/qconnect.py +112 -0
- boto3_errors-0.1.0/src/boto3_errors/quicksight.py +324 -0
- boto3_errors-0.1.0/src/boto3_errors/ram.py +233 -0
- boto3_errors-0.1.0/src/boto3_errors/rbin.py +67 -0
- boto3_errors-0.1.0/src/boto3_errors/rds.py +1063 -0
- boto3_errors-0.1.0/src/boto3_errors/rds_data.py +141 -0
- boto3_errors-0.1.0/src/boto3_errors/redshift.py +1039 -0
- boto3_errors-0.1.0/src/boto3_errors/redshift_data.py +86 -0
- boto3_errors-0.1.0/src/boto3_errors/redshift_serverless.py +115 -0
- boto3_errors-0.1.0/src/boto3_errors/rekognition.py +206 -0
- boto3_errors-0.1.0/src/boto3_errors/repostspace.py +126 -0
- boto3_errors-0.1.0/src/boto3_errors/resiliencehub.py +100 -0
- boto3_errors-0.1.0/src/boto3_errors/resource_explorer_2.py +101 -0
- boto3_errors-0.1.0/src/boto3_errors/resource_groups.py +59 -0
- boto3_errors-0.1.0/src/boto3_errors/resourcegroupstaggingapi.py +86 -0
- boto3_errors-0.1.0/src/boto3_errors/rolesanywhere.py +38 -0
- boto3_errors-0.1.0/src/boto3_errors/route53.py +635 -0
- boto3_errors-0.1.0/src/boto3_errors/route53_recovery_cluster.py +121 -0
- boto3_errors-0.1.0/src/boto3_errors/route53_recovery_control_config.py +66 -0
- boto3_errors-0.1.0/src/boto3_errors/route53_recovery_readiness.py +50 -0
- boto3_errors-0.1.0/src/boto3_errors/route53domains.py +73 -0
- boto3_errors-0.1.0/src/boto3_errors/route53globalresolver.py +136 -0
- boto3_errors-0.1.0/src/boto3_errors/route53profiles.py +97 -0
- boto3_errors-0.1.0/src/boto3_errors/route53resolver.py +171 -0
- boto3_errors-0.1.0/src/boto3_errors/rtbfabric.py +68 -0
- boto3_errors-0.1.0/src/boto3_errors/rum.py +123 -0
- boto3_errors-0.1.0/src/boto3_errors/s3.py +153 -0
- boto3_errors-0.1.0/src/boto3_errors/s3control.py +84 -0
- boto3_errors-0.1.0/src/boto3_errors/s3outposts.py +59 -0
- boto3_errors-0.1.0/src/boto3_errors/s3tables.py +69 -0
- boto3_errors-0.1.0/src/boto3_errors/s3vectors.py +126 -0
- boto3_errors-0.1.0/src/boto3_errors/sagemaker.py +44 -0
- boto3_errors-0.1.0/src/boto3_errors/sagemaker_a2i_runtime.py +66 -0
- boto3_errors-0.1.0/src/boto3_errors/sagemaker_edge.py +23 -0
- boto3_errors-0.1.0/src/boto3_errors/sagemaker_featurestore_runtime.py +47 -0
- boto3_errors-0.1.0/src/boto3_errors/sagemaker_geospatial.py +89 -0
- boto3_errors-0.1.0/src/boto3_errors/sagemaker_runtime.py +108 -0
- boto3_errors-0.1.0/src/boto3_errors/savingsplans.py +38 -0
- boto3_errors-0.1.0/src/boto3_errors/scheduler.py +50 -0
- boto3_errors-0.1.0/src/boto3_errors/schemas.py +114 -0
- boto3_errors-0.1.0/src/boto3_errors/sdb.py +187 -0
- boto3_errors-0.1.0/src/boto3_errors/secretsmanager.py +105 -0
- boto3_errors-0.1.0/src/boto3_errors/security_ir.py +119 -0
- boto3_errors-0.1.0/src/boto3_errors/securityhub.py +158 -0
- boto3_errors-0.1.0/src/boto3_errors/securitylake.py +111 -0
- boto3_errors-0.1.0/src/boto3_errors/serverlessrepo.py +83 -0
- boto3_errors-0.1.0/src/boto3_errors/service_quotas.py +132 -0
- boto3_errors-0.1.0/src/boto3_errors/servicecatalog.py +76 -0
- boto3_errors-0.1.0/src/boto3_errors/servicecatalog_appregistry.py +58 -0
- boto3_errors-0.1.0/src/boto3_errors/servicediscovery.py +165 -0
- boto3_errors-0.1.0/src/boto3_errors/ses.py +455 -0
- boto3_errors-0.1.0/src/boto3_errors/sesv2.py +101 -0
- boto3_errors-0.1.0/src/boto3_errors/shield.py +157 -0
- boto3_errors-0.1.0/src/boto3_errors/signer.py +125 -0
- boto3_errors-0.1.0/src/boto3_errors/signin.py +106 -0
- boto3_errors-0.1.0/src/boto3_errors/simspaceweaver.py +49 -0
- boto3_errors-0.1.0/src/boto3_errors/sms_voice.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/snow_device_management.py +53 -0
- boto3_errors-0.1.0/src/boto3_errors/snowball.py +129 -0
- boto3_errors-0.1.0/src/boto3_errors/sns.py +265 -0
- boto3_errors-0.1.0/src/boto3_errors/socialmessaging.py +71 -0
- boto3_errors-0.1.0/src/boto3_errors/sqs.py +221 -0
- boto3_errors-0.1.0/src/boto3_errors/ssm.py +1216 -0
- boto3_errors-0.1.0/src/boto3_errors/ssm_contacts.py +142 -0
- boto3_errors-0.1.0/src/boto3_errors/ssm_guiconnect.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/ssm_incidents.py +114 -0
- boto3_errors-0.1.0/src/boto3_errors/ssm_quicksetup.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/ssm_sap.py +44 -0
- boto3_errors-0.1.0/src/boto3_errors/sso.py +47 -0
- boto3_errors-0.1.0/src/boto3_errors/sso_admin.py +90 -0
- boto3_errors-0.1.0/src/boto3_errors/sso_oidc.py +320 -0
- boto3_errors-0.1.0/src/boto3_errors/stepfunctions.py +293 -0
- boto3_errors-0.1.0/src/boto3_errors/storagegateway.py +60 -0
- boto3_errors-0.1.0/src/boto3_errors/sts.py +143 -0
- boto3_errors-0.1.0/src/boto3_errors/supplychain.py +56 -0
- boto3_errors-0.1.0/src/boto3_errors/support.py +89 -0
- boto3_errors-0.1.0/src/boto3_errors/support_app.py +76 -0
- boto3_errors-0.1.0/src/boto3_errors/swf.py +113 -0
- boto3_errors-0.1.0/src/boto3_errors/synthetics.py +80 -0
- boto3_errors-0.1.0/src/boto3_errors/taxsettings.py +84 -0
- boto3_errors-0.1.0/src/boto3_errors/textract.py +181 -0
- boto3_errors-0.1.0/src/boto3_errors/timestream_influxdb.py +90 -0
- boto3_errors-0.1.0/src/boto3_errors/timestream_query.py +73 -0
- boto3_errors-0.1.0/src/boto3_errors/timestream_write.py +102 -0
- boto3_errors-0.1.0/src/boto3_errors/tnb.py +53 -0
- boto3_errors-0.1.0/src/boto3_errors/transcribe.py +60 -0
- boto3_errors-0.1.0/src/boto3_errors/transfer.py +101 -0
- boto3_errors-0.1.0/src/boto3_errors/translate.py +161 -0
- boto3_errors-0.1.0/src/boto3_errors/trustedadvisor.py +53 -0
- boto3_errors-0.1.0/src/boto3_errors/verifiedpermissions.py +166 -0
- boto3_errors-0.1.0/src/boto3_errors/voice_id.py +100 -0
- boto3_errors-0.1.0/src/boto3_errors/vpc_lattice.py +132 -0
- boto3_errors-0.1.0/src/boto3_errors/waf.py +258 -0
- boto3_errors-0.1.0/src/boto3_errors/waf_regional.py +267 -0
- boto3_errors-0.1.0/src/boto3_errors/wafv2.py +259 -0
- boto3_errors-0.1.0/src/boto3_errors/wellarchitected.py +104 -0
- boto3_errors-0.1.0/src/boto3_errors/wickr.py +91 -0
- boto3_errors-0.1.0/src/boto3_errors/wisdom.py +91 -0
- boto3_errors-0.1.0/src/boto3_errors/workdocs.py +187 -0
- boto3_errors-0.1.0/src/boto3_errors/workmail.py +181 -0
- boto3_errors-0.1.0/src/boto3_errors/workmailmessageflow.py +52 -0
- boto3_errors-0.1.0/src/boto3_errors/workspaces.py +190 -0
- boto3_errors-0.1.0/src/boto3_errors/workspaces_instances.py +126 -0
- boto3_errors-0.1.0/src/boto3_errors/workspaces_thin_client.py +130 -0
- boto3_errors-0.1.0/src/boto3_errors/workspaces_web.py +137 -0
- boto3_errors-0.1.0/src/boto3_errors/xray.py +95 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Adrián Tomás
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: boto3-errors
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Typed, statically-importable exception classes for every AWS service
|
|
5
|
+
Keywords: aws,boto3,botocore,errors,exceptions,types
|
|
6
|
+
Author: Adrián Tomás
|
|
7
|
+
Author-email: Adrián Tomás <22175056+adriantomas@users.noreply.github.com>
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Intended Audience :: Information Technology
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python
|
|
15
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
16
|
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
24
|
+
Classifier: Operating System :: OS Independent
|
|
25
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
26
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
27
|
+
Classifier: Topic :: Software Development
|
|
28
|
+
Classifier: Typing :: Typed
|
|
29
|
+
Requires-Dist: botocore>=1.42.46
|
|
30
|
+
Requires-Python: >=3.10, <3.15
|
|
31
|
+
Project-URL: Homepage, https://github.com/adriantomas/boto3-errors
|
|
32
|
+
Project-URL: Repository, https://github.com/adriantomas/boto3-errors
|
|
33
|
+
Project-URL: Issues, https://github.com/adriantomas/boto3-errors/issues
|
|
34
|
+
Description-Content-Type: text/markdown
|
|
35
|
+
|
|
36
|
+
# (Better) boto3 errors
|
|
37
|
+
|
|
38
|
+
[](https://www.python.org/downloads/)
|
|
39
|
+
[](https://pypi.org/project/boto3_errors/)
|
|
40
|
+
[](https://opensource.org/licenses/MIT)
|
|
41
|
+
|
|
42
|
+
Typed, statically-importable exception classes for every AWS service.
|
|
43
|
+
|
|
44
|
+
## Install
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
pip install boto3-errors
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Quick start
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
import boto3
|
|
54
|
+
from boto3_errors import patch_client
|
|
55
|
+
from boto3_errors.dynamodb import ConditionalCheckFailedException
|
|
56
|
+
|
|
57
|
+
client = boto3.client("dynamodb")
|
|
58
|
+
patch_client(client)
|
|
59
|
+
|
|
60
|
+
try:
|
|
61
|
+
client.put_item(
|
|
62
|
+
TableName="users",
|
|
63
|
+
Item={"pk": {"S": "user#1"}, "name": {"S": "Ada"}},
|
|
64
|
+
ConditionExpression="attribute_not_exists(pk)",
|
|
65
|
+
)
|
|
66
|
+
except ConditionalCheckFailedException as e:
|
|
67
|
+
print(e.message) # "The conditional request failed"
|
|
68
|
+
print(e.error_code) # "ConditionalCheckFailedException"
|
|
69
|
+
print(e.item) # {"pk": {"S": "user#1"}, "name": {"S": "Ada"}}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## The problem
|
|
73
|
+
|
|
74
|
+
Every boto3 error comes back as a `ClientError`. The only way to distinguish them is by parsing `e.response["Error"]["Code"]` — a stringly-typed dict lookup with no autocomplete, no type checking, and no IDE support. A typo in the error code string won't be caught until it crashes.
|
|
75
|
+
|
|
76
|
+
## What you get
|
|
77
|
+
|
|
78
|
+
All AWS services with exception classes auto-generated from botocore's service model.
|
|
79
|
+
|
|
80
|
+
### Exception hierarchy
|
|
81
|
+
|
|
82
|
+
```text
|
|
83
|
+
ClientError # botocore base — still works
|
|
84
|
+
└── Boto3Error # boto3-errors base
|
|
85
|
+
└── DynamoDBError # per-service base
|
|
86
|
+
├── ConditionalCheckFailedException
|
|
87
|
+
├── ResourceNotFoundException
|
|
88
|
+
├── TransactionCanceledException
|
|
89
|
+
└── ...
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Every exception is a `ClientError` subclass, so existing `except ClientError` handlers keep working.
|
|
93
|
+
|
|
94
|
+
### Built-in properties
|
|
95
|
+
|
|
96
|
+
Every `Boto3Error` exposes:
|
|
97
|
+
|
|
98
|
+
| Property | Type | Source |
|
|
99
|
+
| ------------------ | ----- | ----------------------------------- |
|
|
100
|
+
| `message` | `str` | `Error.Message` |
|
|
101
|
+
| `error_code` | `str` | `Error.Code` |
|
|
102
|
+
| `http_status_code` | `int` | `ResponseMetadata.HTTPStatusCode` |
|
|
103
|
+
| `request_id` | `str` | `ResponseMetadata.RequestId` |
|
|
104
|
+
|
|
105
|
+
### Service-specific properties
|
|
106
|
+
|
|
107
|
+
Some exceptions expose extra fields from the API response:
|
|
108
|
+
|
|
109
|
+
```python
|
|
110
|
+
from boto3_errors.dynamodb import (
|
|
111
|
+
ConditionalCheckFailedException,
|
|
112
|
+
TransactionCanceledException,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
# ConditionalCheckFailedException.item -> dict | None
|
|
116
|
+
# TransactionCanceledException.cancellation_reasons -> list | None
|
|
117
|
+
```
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# (Better) boto3 errors
|
|
2
|
+
|
|
3
|
+
[](https://www.python.org/downloads/)
|
|
4
|
+
[](https://pypi.org/project/boto3_errors/)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
Typed, statically-importable exception classes for every AWS service.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pip install boto3-errors
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Quick start
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
import boto3
|
|
19
|
+
from boto3_errors import patch_client
|
|
20
|
+
from boto3_errors.dynamodb import ConditionalCheckFailedException
|
|
21
|
+
|
|
22
|
+
client = boto3.client("dynamodb")
|
|
23
|
+
patch_client(client)
|
|
24
|
+
|
|
25
|
+
try:
|
|
26
|
+
client.put_item(
|
|
27
|
+
TableName="users",
|
|
28
|
+
Item={"pk": {"S": "user#1"}, "name": {"S": "Ada"}},
|
|
29
|
+
ConditionExpression="attribute_not_exists(pk)",
|
|
30
|
+
)
|
|
31
|
+
except ConditionalCheckFailedException as e:
|
|
32
|
+
print(e.message) # "The conditional request failed"
|
|
33
|
+
print(e.error_code) # "ConditionalCheckFailedException"
|
|
34
|
+
print(e.item) # {"pk": {"S": "user#1"}, "name": {"S": "Ada"}}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## The problem
|
|
38
|
+
|
|
39
|
+
Every boto3 error comes back as a `ClientError`. The only way to distinguish them is by parsing `e.response["Error"]["Code"]` — a stringly-typed dict lookup with no autocomplete, no type checking, and no IDE support. A typo in the error code string won't be caught until it crashes.
|
|
40
|
+
|
|
41
|
+
## What you get
|
|
42
|
+
|
|
43
|
+
All AWS services with exception classes auto-generated from botocore's service model.
|
|
44
|
+
|
|
45
|
+
### Exception hierarchy
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
ClientError # botocore base — still works
|
|
49
|
+
└── Boto3Error # boto3-errors base
|
|
50
|
+
└── DynamoDBError # per-service base
|
|
51
|
+
├── ConditionalCheckFailedException
|
|
52
|
+
├── ResourceNotFoundException
|
|
53
|
+
├── TransactionCanceledException
|
|
54
|
+
└── ...
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Every exception is a `ClientError` subclass, so existing `except ClientError` handlers keep working.
|
|
58
|
+
|
|
59
|
+
### Built-in properties
|
|
60
|
+
|
|
61
|
+
Every `Boto3Error` exposes:
|
|
62
|
+
|
|
63
|
+
| Property | Type | Source |
|
|
64
|
+
| ------------------ | ----- | ----------------------------------- |
|
|
65
|
+
| `message` | `str` | `Error.Message` |
|
|
66
|
+
| `error_code` | `str` | `Error.Code` |
|
|
67
|
+
| `http_status_code` | `int` | `ResponseMetadata.HTTPStatusCode` |
|
|
68
|
+
| `request_id` | `str` | `ResponseMetadata.RequestId` |
|
|
69
|
+
|
|
70
|
+
### Service-specific properties
|
|
71
|
+
|
|
72
|
+
Some exceptions expose extra fields from the API response:
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
from boto3_errors.dynamodb import (
|
|
76
|
+
ConditionalCheckFailedException,
|
|
77
|
+
TransactionCanceledException,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
# ConditionalCheckFailedException.item -> dict | None
|
|
81
|
+
# TransactionCanceledException.cancellation_reasons -> list | None
|
|
82
|
+
```
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "boto3-errors"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Typed, statically-importable exception classes for every AWS service"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
license-files = ["LICENSE"]
|
|
8
|
+
keywords = ["aws", "boto3", "botocore", "errors", "exceptions", "types"]
|
|
9
|
+
authors = [
|
|
10
|
+
{ name = "Adrián Tomás", email = "22175056+adriantomas@users.noreply.github.com" }
|
|
11
|
+
]
|
|
12
|
+
requires-python = ">=3.10,<3.15"
|
|
13
|
+
classifiers = [
|
|
14
|
+
"Development Status :: 5 - Production/Stable",
|
|
15
|
+
"Intended Audience :: Developers",
|
|
16
|
+
"Intended Audience :: Information Technology",
|
|
17
|
+
"License :: OSI Approved :: MIT License",
|
|
18
|
+
"Programming Language :: Python",
|
|
19
|
+
"Programming Language :: Python :: Implementation :: CPython",
|
|
20
|
+
"Programming Language :: Python :: Implementation :: PyPy",
|
|
21
|
+
"Programming Language :: Python :: 3",
|
|
22
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
23
|
+
"Programming Language :: Python :: 3.10",
|
|
24
|
+
"Programming Language :: Python :: 3.11",
|
|
25
|
+
"Programming Language :: Python :: 3.12",
|
|
26
|
+
"Programming Language :: Python :: 3.13",
|
|
27
|
+
"Programming Language :: Python :: 3.14",
|
|
28
|
+
"Operating System :: OS Independent",
|
|
29
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
30
|
+
"Topic :: Software Development :: Libraries",
|
|
31
|
+
"Topic :: Software Development",
|
|
32
|
+
"Typing :: Typed",
|
|
33
|
+
]
|
|
34
|
+
dependencies = [
|
|
35
|
+
"botocore>=1.42.46",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
[project.urls]
|
|
39
|
+
Homepage = "https://github.com/adriantomas/boto3-errors"
|
|
40
|
+
Repository = "https://github.com/adriantomas/boto3-errors"
|
|
41
|
+
Issues = "https://github.com/adriantomas/boto3-errors/issues"
|
|
42
|
+
|
|
43
|
+
[dependency-groups]
|
|
44
|
+
dev = [
|
|
45
|
+
"pytest>=9.0.0",
|
|
46
|
+
"mypy>=1.19",
|
|
47
|
+
"prek>=0.3.2",
|
|
48
|
+
"ruff>=0.15.0",
|
|
49
|
+
"commitizen>=4.13.6",
|
|
50
|
+
"mdformat>=1.0.0",
|
|
51
|
+
"mdformat-ruff>=0.1.3",
|
|
52
|
+
"botocore-stubs>=1.42.41",
|
|
53
|
+
"boto3>=1.38.0",
|
|
54
|
+
"testcontainers[generic]>=4.0.0",
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
[build-system]
|
|
58
|
+
requires = ["uv_build>=0.10.0,<0.11.0"]
|
|
59
|
+
build-backend = "uv_build"
|
|
60
|
+
|
|
61
|
+
[tool.uv]
|
|
62
|
+
required-version = ">=0.10.0"
|
|
63
|
+
|
|
64
|
+
[tool.mypy]
|
|
65
|
+
strict = true
|
|
66
|
+
|
|
67
|
+
[tool.pytest.ini_options]
|
|
68
|
+
markers = ["integration: requires Docker"]
|
|
69
|
+
|
|
70
|
+
[tool.ruff]
|
|
71
|
+
fix = true
|
|
72
|
+
# Exclude auto-generated service modules — they are produced by scripts/generate.py
|
|
73
|
+
# and should not be hand-edited or linted.
|
|
74
|
+
exclude = ["src/boto3_errors/[!_]*.py"]
|
|
75
|
+
|
|
76
|
+
[tool.ruff.lint]
|
|
77
|
+
select = ["ALL"]
|
|
78
|
+
ignore = [
|
|
79
|
+
"TC002", # typing-only-third-party-import
|
|
80
|
+
"TC003", # typing-only-standard-library-import
|
|
81
|
+
"D203", # incorrect-blank-line-before-class (D203)
|
|
82
|
+
"D213", # multi-line-summary-second-line (D213)
|
|
83
|
+
"COM812", # missing-trailing-comma
|
|
84
|
+
"N818", # error-suffix-on-exception-name
|
|
85
|
+
]
|
|
86
|
+
|
|
87
|
+
[tool.ruff.lint.per-file-ignores]
|
|
88
|
+
"src/boto3_errors/_patch.py" = [
|
|
89
|
+
"SLF001", # private-member-access — we must monkey-patch client internals
|
|
90
|
+
]
|
|
91
|
+
"tests/**/*.py" = [
|
|
92
|
+
"D100", # undocumented-public-module
|
|
93
|
+
"D101", # undocumented-public-class
|
|
94
|
+
"D102", # undocumented-public-method
|
|
95
|
+
"D104", # undocumented-public-package
|
|
96
|
+
"S101", # use of assert detected
|
|
97
|
+
"SLF001", # private-member-access — tests must inspect internals
|
|
98
|
+
"INP001", # implicit-namespace-package — tests don't need __init__.py
|
|
99
|
+
]
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from botocore.exceptions import ClientError
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Boto3Error(ClientError):
|
|
9
|
+
"""Base class for all typed boto3 exceptions.
|
|
10
|
+
|
|
11
|
+
Inherits from ClientError so existing ``except ClientError`` handlers
|
|
12
|
+
still catch these exceptions.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
_SERVICE: str = ""
|
|
16
|
+
_ERROR_CODE: str = ""
|
|
17
|
+
|
|
18
|
+
# Widen from botocore-stubs' TypedDict so that generated properties
|
|
19
|
+
# can ``self.response.get("SomeField")`` without returning ``object``.
|
|
20
|
+
response: dict[str, Any] # type: ignore[assignment]
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def message(self) -> str:
|
|
24
|
+
"""Human-readable error message from the ``Error.Message`` field."""
|
|
25
|
+
return self.response.get("Error", {}).get("Message", "") # type: ignore[no-any-return]
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def error_code(self) -> str:
|
|
29
|
+
"""AWS error code from the ``Error.Code`` field."""
|
|
30
|
+
return self.response.get("Error", {}).get("Code", "") # type: ignore[no-any-return]
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def http_status_code(self) -> int:
|
|
34
|
+
"""HTTP status code from ``ResponseMetadata``."""
|
|
35
|
+
return self.response.get("ResponseMetadata", {}).get("HTTPStatusCode", 0) # type: ignore[no-any-return]
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def request_id(self) -> str:
|
|
39
|
+
"""AWS request ID from ``ResponseMetadata``."""
|
|
40
|
+
return self.response.get("ResponseMetadata", {}).get("RequestId", "") # type: ignore[no-any-return]
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
import importlib
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from botocore.client import BaseClient
|
|
6
|
+
from botocore.exceptions import ClientError
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def patch_client(client: BaseClient) -> None:
|
|
10
|
+
"""Wrap *client*'s ``_make_api_call``.
|
|
11
|
+
|
|
12
|
+
Re-raises ``ClientError`` as a typed :class:`~boto3_errors._base.Boto3Error`
|
|
13
|
+
subclass when a matching exception class exists.
|
|
14
|
+
|
|
15
|
+
Safe to call more than once on the same client (subsequent calls are
|
|
16
|
+
no-ops).
|
|
17
|
+
"""
|
|
18
|
+
if getattr(client, "_boto3_errors_patched", False):
|
|
19
|
+
return
|
|
20
|
+
|
|
21
|
+
service: str = client._service_model.service_name # type: ignore[attr-defined]
|
|
22
|
+
module_name = _service_to_module(service)
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
mod = importlib.import_module(f"boto3_errors.{module_name}")
|
|
26
|
+
except ModuleNotFoundError:
|
|
27
|
+
# No generated module for this service — nothing to patch.
|
|
28
|
+
return
|
|
29
|
+
|
|
30
|
+
exceptions: dict[str, type] = getattr(mod, "EXCEPTIONS", {})
|
|
31
|
+
original = client._make_api_call # type: ignore[attr-defined]
|
|
32
|
+
|
|
33
|
+
@functools.wraps(original)
|
|
34
|
+
def _patched_make_api_call(
|
|
35
|
+
operation_name: str, api_params: dict[str, Any]
|
|
36
|
+
) -> dict[str, Any]:
|
|
37
|
+
try:
|
|
38
|
+
return original(operation_name, api_params) # type: ignore[no-any-return]
|
|
39
|
+
except ClientError as e:
|
|
40
|
+
code = e.response.get("Error", {}).get("Code", "")
|
|
41
|
+
exc_cls = exceptions.get(code)
|
|
42
|
+
if exc_cls is not None:
|
|
43
|
+
raise exc_cls(e.response, e.operation_name) from e
|
|
44
|
+
raise
|
|
45
|
+
|
|
46
|
+
client._make_api_call = _patched_make_api_call # type: ignore[attr-defined]
|
|
47
|
+
client._boto3_errors_patched = True # type: ignore[attr-defined]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _service_to_module(service: str) -> str:
|
|
51
|
+
name = service.replace("-", "_")
|
|
52
|
+
if name == "lambda":
|
|
53
|
+
name = "lambda_"
|
|
54
|
+
return name
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Auto-generated. Do not edit manually.
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from boto3_errors._base import Boto3Error
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class AccessAnalyzerError(Boto3Error):
|
|
10
|
+
_SERVICE = "accessanalyzer"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class AccessDeniedException(AccessAnalyzerError):
|
|
14
|
+
"""You do not have sufficient access to perform this action."""
|
|
15
|
+
_ERROR_CODE = "AccessDeniedException"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ConflictException(AccessAnalyzerError):
|
|
19
|
+
"""A conflict exception error."""
|
|
20
|
+
_ERROR_CODE = "ConflictException"
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def resource_id(self) -> str | None:
|
|
24
|
+
"""The ID of the resource."""
|
|
25
|
+
return self.response.get("resourceId")
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def resource_type(self) -> str | None:
|
|
29
|
+
"""The resource type."""
|
|
30
|
+
return self.response.get("resourceType")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class InternalServerException(AccessAnalyzerError):
|
|
34
|
+
"""Internal server error."""
|
|
35
|
+
_ERROR_CODE = "InternalServerException"
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def retry_after_seconds(self) -> int | None:
|
|
39
|
+
"""The seconds to wait to retry."""
|
|
40
|
+
return self.response.get("retryAfterSeconds")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class InvalidParameterException(AccessAnalyzerError):
|
|
44
|
+
"""The specified parameter is invalid."""
|
|
45
|
+
_ERROR_CODE = "InvalidParameterException"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class ResourceNotFoundException(AccessAnalyzerError):
|
|
49
|
+
"""The specified resource could not be found."""
|
|
50
|
+
_ERROR_CODE = "ResourceNotFoundException"
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def resource_id(self) -> str | None:
|
|
54
|
+
"""The ID of the resource."""
|
|
55
|
+
return self.response.get("resourceId")
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def resource_type(self) -> str | None:
|
|
59
|
+
"""The type of the resource."""
|
|
60
|
+
return self.response.get("resourceType")
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class ServiceQuotaExceededException(AccessAnalyzerError):
|
|
64
|
+
"""Service quote met error."""
|
|
65
|
+
_ERROR_CODE = "ServiceQuotaExceededException"
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def resource_id(self) -> str | None:
|
|
69
|
+
"""The resource ID."""
|
|
70
|
+
return self.response.get("resourceId")
|
|
71
|
+
|
|
72
|
+
@property
|
|
73
|
+
def resource_type(self) -> str | None:
|
|
74
|
+
"""The resource type."""
|
|
75
|
+
return self.response.get("resourceType")
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class ThrottlingException(AccessAnalyzerError):
|
|
79
|
+
"""Throttling limit exceeded error."""
|
|
80
|
+
_ERROR_CODE = "ThrottlingException"
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def retry_after_seconds(self) -> int | None:
|
|
84
|
+
"""The seconds to wait to retry."""
|
|
85
|
+
return self.response.get("retryAfterSeconds")
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class UnprocessableEntityException(AccessAnalyzerError):
|
|
89
|
+
"""The specified entity could not be processed."""
|
|
90
|
+
_ERROR_CODE = "UnprocessableEntityException"
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class ValidationException(AccessAnalyzerError):
|
|
94
|
+
"""Validation exception error."""
|
|
95
|
+
_ERROR_CODE = "ValidationException"
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def reason(self) -> str | None:
|
|
99
|
+
"""The reason for the exception."""
|
|
100
|
+
return self.response.get("reason")
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def field_list(self) -> list[Any] | None:
|
|
104
|
+
"""A list of fields that didn't validate."""
|
|
105
|
+
return self.response.get("fieldList")
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
EXCEPTIONS: dict[str, type[AccessAnalyzerError]] = {
|
|
109
|
+
"AccessDeniedException": AccessDeniedException,
|
|
110
|
+
"ConflictException": ConflictException,
|
|
111
|
+
"InternalServerException": InternalServerException,
|
|
112
|
+
"InvalidParameterException": InvalidParameterException,
|
|
113
|
+
"ResourceNotFoundException": ResourceNotFoundException,
|
|
114
|
+
"ServiceQuotaExceededException": ServiceQuotaExceededException,
|
|
115
|
+
"ThrottlingException": ThrottlingException,
|
|
116
|
+
"UnprocessableEntityException": UnprocessableEntityException,
|
|
117
|
+
"ValidationException": ValidationException,
|
|
118
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Auto-generated. Do not edit manually.
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from boto3_errors._base import Boto3Error
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class AccountError(Boto3Error):
|
|
10
|
+
_SERVICE = "account"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class AccessDeniedException(AccountError):
|
|
14
|
+
"""The operation failed because the calling identity doesn't have the minimum required
|
|
15
|
+
permissions.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
_ERROR_CODE = "AccessDeniedException"
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def error_type(self) -> str | None:
|
|
22
|
+
"""The value populated to the `x-amzn-ErrorType` response header by API Gateway."""
|
|
23
|
+
return self.response.get("errorType")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ConflictException(AccountError):
|
|
27
|
+
"""The request could not be processed because of a conflict in the current status of
|
|
28
|
+
the resource. For example, this happens if you try to enable a Region that is
|
|
29
|
+
currently being disabled (in a status of DISABLING) or if you try to change an
|
|
30
|
+
account’s root user email to an email address which is already in use.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
_ERROR_CODE = "ConflictException"
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def error_type(self) -> str | None:
|
|
37
|
+
"""The value populated to the `x-amzn-ErrorType` response header by API Gateway."""
|
|
38
|
+
return self.response.get("errorType")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class InternalServerException(AccountError):
|
|
42
|
+
"""The operation failed because of an error internal to Amazon Web Services. Try your
|
|
43
|
+
operation again later.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
_ERROR_CODE = "InternalServerException"
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def error_type(self) -> str | None:
|
|
50
|
+
"""The value populated to the `x-amzn-ErrorType` response header by API Gateway."""
|
|
51
|
+
return self.response.get("errorType")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class ResourceNotFoundException(AccountError):
|
|
55
|
+
"""The operation failed because it specified a resource that can't be found."""
|
|
56
|
+
_ERROR_CODE = "ResourceNotFoundException"
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def error_type(self) -> str | None:
|
|
60
|
+
"""The value populated to the `x-amzn-ErrorType` response header by API Gateway."""
|
|
61
|
+
return self.response.get("errorType")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ResourceUnavailableException(AccountError):
|
|
65
|
+
"""The operation failed because it specified a resource that is not currently
|
|
66
|
+
available.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
_ERROR_CODE = "ResourceUnavailableException"
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def error_type(self) -> str | None:
|
|
73
|
+
"""The value populated to the `x-amzn-ErrorType` response header by API Gateway."""
|
|
74
|
+
return self.response.get("errorType")
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class TooManyRequestsException(AccountError):
|
|
78
|
+
"""The operation failed because it was called too frequently and exceeded a throttle
|
|
79
|
+
limit.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
_ERROR_CODE = "TooManyRequestsException"
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def error_type(self) -> str | None:
|
|
86
|
+
"""The value populated to the `x-amzn-ErrorType` response header by API Gateway."""
|
|
87
|
+
return self.response.get("errorType")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class ValidationException(AccountError):
|
|
91
|
+
"""The operation failed because one of the input parameters was invalid."""
|
|
92
|
+
_ERROR_CODE = "ValidationException"
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def field_list(self) -> list[Any] | None:
|
|
96
|
+
"""The field where the invalid entry was detected."""
|
|
97
|
+
return self.response.get("fieldList")
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
def reason(self) -> str | None:
|
|
101
|
+
"""The reason that validation failed."""
|
|
102
|
+
return self.response.get("reason")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
EXCEPTIONS: dict[str, type[AccountError]] = {
|
|
106
|
+
"AccessDeniedException": AccessDeniedException,
|
|
107
|
+
"ConflictException": ConflictException,
|
|
108
|
+
"InternalServerException": InternalServerException,
|
|
109
|
+
"ResourceNotFoundException": ResourceNotFoundException,
|
|
110
|
+
"ResourceUnavailableException": ResourceUnavailableException,
|
|
111
|
+
"TooManyRequestsException": TooManyRequestsException,
|
|
112
|
+
"ValidationException": ValidationException,
|
|
113
|
+
}
|