localstack-core 4.7.1.dev23__py3-none-any.whl → 4.7.1.dev24__py3-none-any.whl
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.
- localstack/aws/api/apigateway/__init__.py +87 -110
- localstack/aws/api/core.py +2 -3
- localstack/aws/api/events/__init__.py +12 -16
- localstack/aws/api/logs/__init__.py +5 -8
- localstack/aws/api/pipes/__init__.py +24 -32
- localstack/aws/api/scheduler/__init__.py +14 -16
- localstack/aws/api/stepfunctions/__init__.py +88 -114
- localstack/aws/api/support/__init__.py +8 -9
- localstack/aws/chain.py +2 -2
- localstack/aws/client.py +7 -9
- localstack/aws/connect.py +40 -39
- localstack/aws/forwarder.py +5 -4
- localstack/aws/gateway.py +1 -3
- localstack/aws/handlers/analytics.py +1 -2
- localstack/aws/handlers/cors.py +4 -5
- localstack/aws/handlers/logging.py +1 -2
- localstack/aws/handlers/metric_handler.py +3 -4
- localstack/aws/handlers/service.py +5 -5
- localstack/aws/mocking.py +15 -24
- localstack/aws/protocol/op_router.py +11 -10
- localstack/aws/protocol/parser.py +16 -17
- localstack/aws/protocol/serializer.py +37 -40
- localstack/aws/protocol/service_router.py +13 -13
- localstack/aws/protocol/validate.py +5 -5
- localstack/aws/scaffold.py +8 -9
- localstack/aws/serving/edge.py +5 -6
- localstack/aws/serving/hypercorn.py +2 -2
- localstack/aws/serving/twisted.py +1 -2
- localstack/aws/serving/werkzeug.py +2 -2
- localstack/aws/skeleton.py +7 -8
- localstack/aws/spec.py +29 -30
- localstack/cli/localstack.py +6 -6
- localstack/cli/lpm.py +2 -2
- localstack/config.py +14 -15
- localstack/deprecations.py +5 -5
- localstack/dev/run/__main__.py +4 -4
- localstack/dev/run/paths.py +5 -5
- localstack/dns/models.py +2 -1
- localstack/dns/server.py +3 -2
- localstack/http/dispatcher.py +1 -2
- localstack/http/response.py +2 -2
- localstack/http/router.py +1 -1
- localstack/http/trace.py +2 -1
- localstack/logging/format.py +3 -3
- localstack/packages/api.py +5 -5
- localstack/packages/core.py +3 -3
- localstack/packages/debugpy.py +1 -3
- localstack/packages/ffmpeg.py +1 -2
- localstack/packages/java.py +1 -2
- localstack/packages/terraform.py +1 -2
- localstack/runtime/init.py +6 -7
- localstack/runtime/shutdown.py +2 -1
- localstack/services/apigateway/exporter.py +1 -2
- localstack/services/apigateway/helpers.py +6 -6
- localstack/services/apigateway/legacy/context.py +21 -21
- localstack/services/apigateway/legacy/helpers.py +20 -20
- localstack/services/apigateway/legacy/integration.py +7 -7
- localstack/services/apigateway/legacy/router_asf.py +2 -2
- localstack/services/apigateway/legacy/templates.py +5 -5
- localstack/services/apigateway/models.py +16 -16
- localstack/services/apigateway/next_gen/execute_api/api.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/context.py +25 -25
- localstack/services/apigateway/next_gen/execute_api/handlers/api_key_validation.py +2 -5
- localstack/services/apigateway/next_gen/execute_api/handlers/parse.py +1 -2
- localstack/services/apigateway/next_gen/execute_api/handlers/resource_router.py +1 -1
- localstack/services/apigateway/next_gen/execute_api/header_utils.py +1 -1
- localstack/services/apigateway/next_gen/execute_api/helpers.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/integrations/aws.py +6 -6
- localstack/services/apigateway/next_gen/execute_api/integrations/http.py +9 -9
- localstack/services/apigateway/next_gen/execute_api/variables.py +63 -63
- localstack/services/apigateway/resource_providers/aws_apigateway_account.py +3 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_account_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_apikey.py +14 -14
- localstack/services/apigateway/resource_providers/aws_apigateway_apikey_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping.py +5 -5
- localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_deployment.py +46 -46
- localstack/services/apigateway/resource_providers/aws_apigateway_deployment_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_domainname.py +18 -18
- localstack/services/apigateway/resource_providers/aws_apigateway_domainname_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse.py +7 -7
- localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_method.py +36 -36
- localstack/services/apigateway/resource_providers/aws_apigateway_method_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_model.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_model_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_resource.py +5 -5
- localstack/services/apigateway/resource_providers/aws_apigateway_resource_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_restapi.py +26 -26
- localstack/services/apigateway/resource_providers/aws_apigateway_restapi_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_stage.py +33 -33
- localstack/services/apigateway/resource_providers/aws_apigateway_stage_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplan.py +18 -18
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplan_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey.py +5 -5
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey_plugin.py +1 -3
- localstack/services/cdk/resource_providers/cdk_metadata.py +2 -2
- localstack/services/cdk/resource_providers/cdk_metadata_plugin.py +1 -3
- localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate.py +14 -14
- localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate_plugin.py +1 -3
- localstack/services/cloudformation/cfn_utils.py +1 -1
- localstack/services/cloudformation/deployment_utils.py +2 -2
- localstack/services/cloudformation/engine/changes.py +3 -3
- localstack/services/cloudformation/engine/entities.py +12 -12
- localstack/services/cloudformation/engine/parameters.py +3 -3
- localstack/services/cloudformation/engine/template_deployer.py +9 -10
- localstack/services/cloudformation/engine/transformers.py +5 -4
- localstack/services/cloudformation/engine/types.py +5 -4
- localstack/services/cloudformation/engine/v2/change_set_model.py +9 -8
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py +6 -6
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py +9 -9
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +15 -14
- localstack/services/cloudformation/engine/v2/change_set_model_transform.py +5 -5
- localstack/services/cloudformation/provider_utils.py +2 -2
- localstack/services/cloudformation/resource_provider.py +10 -9
- localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py +7 -7
- localstack/services/cloudformation/resource_providers/aws_cloudformation_macro_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_stack.py +9 -9
- localstack/services/cloudformation/resource_providers/aws_cloudformation_stack_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition.py +6 -6
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle.py +2 -2
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle_plugin.py +1 -3
- localstack/services/cloudformation/scaffolding/__main__.py +8 -7
- localstack/services/cloudformation/scaffolding/propgen.py +2 -2
- localstack/services/cloudformation/stores.py +2 -3
- localstack/services/cloudformation/v2/entities.py +7 -7
- localstack/services/cloudformation/v2/provider.py +10 -10
- localstack/services/cloudwatch/alarm_scheduler.py +7 -7
- localstack/services/cloudwatch/cloudwatch_database_helper.py +4 -5
- localstack/services/cloudwatch/models.py +5 -7
- localstack/services/cloudwatch/provider.py +12 -12
- localstack/services/cloudwatch/provider_v2.py +2 -4
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm.py +40 -40
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm_plugin.py +1 -3
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm.py +12 -12
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm_plugin.py +1 -3
- localstack/services/dynamodb/packages.py +1 -2
- localstack/services/dynamodb/provider.py +7 -8
- localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable.py +63 -63
- localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable_plugin.py +1 -3
- localstack/services/dynamodb/resource_providers/aws_dynamodb_table.py +57 -57
- localstack/services/dynamodb/resource_providers/aws_dynamodb_table_plugin.py +1 -3
- localstack/services/dynamodb/utils.py +13 -14
- localstack/services/dynamodb/v2/provider.py +6 -7
- localstack/services/dynamodbstreams/dynamodbstreams_api.py +2 -2
- localstack/services/dynamodbstreams/models.py +1 -3
- localstack/services/ec2/patches.py +4 -5
- localstack/services/ec2/provider.py +3 -3
- localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions.py +10 -10
- localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_instance.py +96 -96
- localstack/services/ec2/resource_providers/aws_ec2_instance_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_internetgateway.py +5 -5
- localstack/services/ec2/resource_providers/aws_ec2_internetgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_keypair.py +10 -10
- localstack/services/ec2/resource_providers/aws_ec2_keypair_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_natgateway.py +13 -13
- localstack/services/ec2/resource_providers/aws_ec2_natgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_networkacl.py +6 -6
- localstack/services/ec2/resource_providers/aws_ec2_networkacl_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_prefixlist.py +14 -14
- localstack/services/ec2/resource_providers/aws_ec2_prefixlist_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_route.py +15 -15
- localstack/services/ec2/resource_providers/aws_ec2_route_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_routetable.py +6 -6
- localstack/services/ec2/resource_providers/aws_ec2_routetable_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_securitygroup.py +29 -29
- localstack/services/ec2/resource_providers/aws_ec2_securitygroup_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_subnet.py +19 -19
- localstack/services/ec2/resource_providers/aws_ec2_subnet_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation.py +4 -4
- localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_transitgateway.py +16 -16
- localstack/services/ec2/resource_providers/aws_ec2_transitgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment.py +9 -9
- localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpc.py +15 -15
- localstack/services/ec2/resource_providers/aws_ec2_vpc_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint.py +13 -13
- localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment.py +5 -5
- localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment_plugin.py +1 -3
- localstack/services/ecr/resource_providers/aws_ecr_repository.py +17 -17
- localstack/services/ecr/resource_providers/aws_ecr_repository_plugin.py +1 -3
- localstack/services/edge.py +5 -5
- localstack/services/es/provider.py +19 -19
- localstack/services/events/archive.py +2 -2
- localstack/services/events/connection.py +5 -5
- localstack/services/events/event_bus.py +9 -9
- localstack/services/events/models.py +25 -25
- localstack/services/events/provider.py +12 -12
- localstack/services/events/replay.py +3 -3
- localstack/services/events/resource_providers/aws_events_apidestination.py +8 -8
- localstack/services/events/resource_providers/aws_events_apidestination_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_connection.py +27 -27
- localstack/services/events/resource_providers/aws_events_connection_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_eventbus.py +9 -9
- localstack/services/events/resource_providers/aws_events_eventbus_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_eventbuspolicy.py +11 -11
- localstack/services/events/resource_providers/aws_events_eventbuspolicy_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_rule.py +82 -82
- localstack/services/events/resource_providers/aws_events_rule_plugin.py +1 -3
- localstack/services/events/rule.py +15 -15
- localstack/services/events/target.py +5 -5
- localstack/services/events/utils.py +7 -7
- localstack/services/events/v1/models.py +1 -3
- localstack/services/events/v1/provider.py +10 -10
- localstack/services/firehose/models.py +1 -3
- localstack/services/firehose/provider.py +11 -12
- localstack/services/iam/iam_patches.py +5 -6
- localstack/services/iam/provider.py +4 -4
- localstack/services/iam/resource_providers/aws_iam_accesskey.py +6 -6
- localstack/services/iam/resource_providers/aws_iam_accesskey_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_group.py +9 -9
- localstack/services/iam/resource_providers/aws_iam_group_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_instanceprofile.py +5 -5
- localstack/services/iam/resource_providers/aws_iam_instanceprofile_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_managedpolicy.py +9 -9
- localstack/services/iam/resource_providers/aws_iam_managedpolicy_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_policy.py +7 -7
- localstack/services/iam/resource_providers/aws_iam_policy_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_role.py +16 -16
- localstack/services/iam/resource_providers/aws_iam_role_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_servercertificate.py +10 -10
- localstack/services/iam/resource_providers/aws_iam_servercertificate_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_servicelinkedrole.py +5 -5
- localstack/services/iam/resource_providers/aws_iam_servicelinkedrole_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_user.py +17 -17
- localstack/services/iam/resource_providers/aws_iam_user_plugin.py +1 -3
- localstack/services/kinesis/kinesis_mock_server.py +7 -8
- localstack/services/kinesis/models.py +2 -3
- localstack/services/kinesis/packages.py +3 -3
- localstack/services/kinesis/resource_providers/aws_kinesis_stream.py +13 -13
- localstack/services/kinesis/resource_providers/aws_kinesis_stream_plugin.py +1 -3
- localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer.py +7 -7
- localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer_plugin.py +1 -3
- localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream.py +191 -191
- localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream_plugin.py +1 -3
- localstack/services/kms/models.py +14 -17
- localstack/services/kms/provider.py +2 -3
- localstack/services/kms/resource_providers/aws_kms_alias.py +3 -3
- localstack/services/kms/resource_providers/aws_kms_alias_plugin.py +1 -3
- localstack/services/kms/resource_providers/aws_kms_key.py +14 -14
- localstack/services/kms/resource_providers/aws_kms_key_plugin.py +1 -3
- localstack/services/kms/utils.py +3 -2
- localstack/services/lambda_/api_utils.py +12 -12
- localstack/services/lambda_/custom_endpoints.py +2 -2
- localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +1 -1
- localstack/services/lambda_/event_source_mapping/pipe_utils.py +2 -2
- localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py +1 -1
- localstack/services/lambda_/event_source_mapping/senders/sender_utils.py +2 -1
- localstack/services/lambda_/invocation/assignment.py +1 -2
- localstack/services/lambda_/invocation/docker_runtime_executor.py +5 -4
- localstack/services/lambda_/invocation/execution_environment.py +4 -4
- localstack/services/lambda_/invocation/executor_endpoint.py +5 -5
- localstack/services/lambda_/invocation/internal_sqs_queue.py +1 -1
- localstack/services/lambda_/invocation/lambda_models.py +23 -23
- localstack/services/lambda_/invocation/lambda_service.py +4 -4
- localstack/services/lambda_/invocation/logs.py +2 -3
- localstack/services/lambda_/invocation/runtime_executor.py +3 -3
- localstack/services/lambda_/ldm.py +2 -3
- localstack/services/lambda_/packages.py +2 -3
- localstack/services/lambda_/provider.py +3 -3
- localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig.py +8 -8
- localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig.py +11 -11
- localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping.py +39 -39
- localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_function.py +54 -54
- localstack/services/lambda_/resource_providers/aws_lambda_function_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_layerversion.py +11 -11
- localstack/services/lambda_/resource_providers/aws_lambda_layerversion_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission.py +6 -6
- localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_permission.py +10 -10
- localstack/services/lambda_/resource_providers/aws_lambda_permission_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_url.py +14 -14
- localstack/services/lambda_/resource_providers/aws_lambda_url_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_version.py +8 -8
- localstack/services/lambda_/resource_providers/aws_lambda_version_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/lambda_alias.py +12 -12
- localstack/services/lambda_/resource_providers/lambda_alias_plugin.py +1 -3
- localstack/services/lambda_/runtimes.py +1 -3
- localstack/services/logs/models.py +1 -3
- localstack/services/logs/provider.py +3 -3
- localstack/services/logs/resource_providers/aws_logs_loggroup.py +9 -9
- localstack/services/logs/resource_providers/aws_logs_loggroup_plugin.py +1 -3
- localstack/services/logs/resource_providers/aws_logs_logstream.py +4 -4
- localstack/services/logs/resource_providers/aws_logs_logstream_plugin.py +1 -3
- localstack/services/logs/resource_providers/aws_logs_subscriptionfilter.py +7 -7
- localstack/services/logs/resource_providers/aws_logs_subscriptionfilter_plugin.py +1 -3
- localstack/services/moto.py +3 -3
- localstack/services/opensearch/cluster.py +13 -13
- localstack/services/opensearch/cluster_manager.py +13 -14
- localstack/services/opensearch/models.py +1 -3
- localstack/services/opensearch/packages.py +1 -2
- localstack/services/opensearch/provider.py +7 -8
- localstack/services/opensearch/resource_providers/aws_elasticsearch_domain.py +61 -61
- localstack/services/opensearch/resource_providers/aws_elasticsearch_domain_plugin.py +1 -3
- localstack/services/opensearch/resource_providers/aws_opensearchservice_domain.py +89 -89
- localstack/services/opensearch/resource_providers/aws_opensearchservice_domain_plugin.py +1 -3
- localstack/services/opensearch/versions.py +1 -3
- localstack/services/plugins.py +26 -25
- localstack/services/redshift/resource_providers/aws_redshift_cluster.py +57 -57
- localstack/services/redshift/resource_providers/aws_redshift_cluster_plugin.py +1 -3
- localstack/services/resource_groups/resource_providers/aws_resourcegroups_group.py +21 -21
- localstack/services/resource_groups/resource_providers/aws_resourcegroups_group_plugin.py +1 -3
- localstack/services/route53/models.py +1 -3
- localstack/services/route53/provider.py +1 -2
- localstack/services/route53/resource_providers/aws_route53_healthcheck.py +6 -6
- localstack/services/route53/resource_providers/aws_route53_healthcheck_plugin.py +1 -3
- localstack/services/route53/resource_providers/aws_route53_recordset.py +27 -27
- localstack/services/route53/resource_providers/aws_route53_recordset_plugin.py +1 -3
- localstack/services/route53resolver/models.py +8 -10
- localstack/services/route53resolver/provider.py +12 -12
- localstack/services/s3/codec.py +2 -2
- localstack/services/s3/cors.py +4 -4
- localstack/services/s3/models.py +72 -72
- localstack/services/s3/notifications.py +19 -19
- localstack/services/s3/presigned_url.py +6 -5
- localstack/services/s3/provider.py +13 -14
- localstack/services/s3/resource_providers/aws_s3_bucket.py +180 -180
- localstack/services/s3/resource_providers/aws_s3_bucket_plugin.py +1 -3
- localstack/services/s3/resource_providers/aws_s3_bucketpolicy.py +4 -4
- localstack/services/s3/resource_providers/aws_s3_bucketpolicy_plugin.py +1 -3
- localstack/services/s3/storage/core.py +4 -3
- localstack/services/s3/storage/ephemeral.py +7 -6
- localstack/services/s3/utils.py +11 -11
- localstack/services/s3/validation.py +1 -1
- localstack/services/s3/website_hosting.py +5 -5
- localstack/services/scheduler/resource_providers/aws_scheduler_schedule.py +60 -60
- localstack/services/scheduler/resource_providers/aws_scheduler_schedule_plugin.py +1 -3
- localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup.py +9 -9
- localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup_plugin.py +1 -3
- localstack/services/secretsmanager/provider.py +9 -11
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy.py +5 -5
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule.py +21 -21
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret.py +23 -23
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment.py +5 -5
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment_plugin.py +1 -3
- localstack/services/ses/provider.py +8 -8
- localstack/services/ses/resource_providers/aws_ses_emailidentity.py +21 -21
- localstack/services/ses/resource_providers/aws_ses_emailidentity_plugin.py +1 -3
- localstack/services/sns/models.py +25 -25
- localstack/services/sns/provider.py +1 -2
- localstack/services/sns/publisher.py +6 -7
- localstack/services/sns/resource_providers/aws_sns_subscription.py +13 -13
- localstack/services/sns/resource_providers/aws_sns_subscription_plugin.py +1 -3
- localstack/services/sns/resource_providers/aws_sns_topic.py +16 -16
- localstack/services/sns/resource_providers/aws_sns_topic_plugin.py +1 -3
- localstack/services/sns/resource_providers/aws_sns_topicpolicy.py +4 -4
- localstack/services/sns/resource_providers/aws_sns_topicpolicy_plugin.py +1 -3
- localstack/services/sqs/models.py +21 -22
- localstack/services/sqs/provider.py +19 -18
- localstack/services/sqs/query_api.py +2 -3
- localstack/services/sqs/resource_providers/aws_sqs_queue.py +21 -21
- localstack/services/sqs/resource_providers/aws_sqs_queue_plugin.py +1 -3
- localstack/services/sqs/resource_providers/aws_sqs_queuepolicy.py +4 -4
- localstack/services/sqs/resource_providers/aws_sqs_queuepolicy_plugin.py +1 -3
- localstack/services/sqs/utils.py +3 -3
- localstack/services/ssm/provider.py +2 -3
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow.py +15 -15
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget.py +10 -10
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask.py +48 -48
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_parameter.py +10 -10
- localstack/services/ssm/resource_providers/aws_ssm_parameter_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_patchbaseline.py +29 -29
- localstack/services/ssm/resource_providers/aws_ssm_patchbaseline_plugin.py +1 -3
- localstack/services/stepfunctions/asl/antlt4utils/antlr4utils.py +3 -4
- localstack/services/stepfunctions/asl/component/common/catch/catcher_decl.py +9 -9
- localstack/services/stepfunctions/asl/component/common/error_name/custom_error_name.py +2 -2
- localstack/services/stepfunctions/asl/component/common/error_name/error_name.py +4 -4
- localstack/services/stepfunctions/asl/component/common/error_name/failure_event.py +8 -8
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_binding.py +2 -2
- localstack/services/stepfunctions/asl/component/common/path/input_path.py +3 -3
- localstack/services/stepfunctions/asl/component/common/path/output_path.py +3 -3
- localstack/services/stepfunctions/asl/component/common/path/result_path.py +3 -3
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadbinding/payload_binding.py +3 -3
- localstack/services/stepfunctions/asl/component/common/retry/retrier_decl.py +8 -8
- localstack/services/stepfunctions/asl/component/common/string/string_expression.py +2 -2
- localstack/services/stepfunctions/asl/component/common/timeouts/timeout.py +3 -3
- localstack/services/stepfunctions/asl/component/eval_component.py +2 -3
- localstack/services/stepfunctions/asl/component/intrinsic/argument/argument.py +3 -3
- localstack/services/stepfunctions/asl/component/intrinsic/jsonata.py +2 -2
- localstack/services/stepfunctions/asl/component/program/program.py +8 -8
- localstack/services/stepfunctions/asl/component/state/state.py +10 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/choice_rule.py +11 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/comparison/operator/implementations/is_operator.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_choice/state_choice.py +1 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/execute_state.py +8 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/item_reader_decl.py +6 -6
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/reader_config/reader_config_decl.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_eval_s3.py +2 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/distributed_iteration_component.py +8 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/inline_iteration_component.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/distributed_item_processor_worker.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/inline_item_processor_worker.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/map_run_record.py +10 -10
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_component.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_declaration.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_worker.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/distributed_iterator_worker.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator.py +1 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator_worker.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/job.py +9 -9
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/result_writer/resource_eval/resource_eval_s3.py +2 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/state_map.py +10 -11
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branch_worker.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branches_decl.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/state_parallel.py +1 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py +6 -6
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/resource.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service.py +10 -10
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py +15 -15
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py +5 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_callback.py +18 -17
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_dynamodb.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_ecs.py +5 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_events.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_glue.py +7 -6
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_lambda.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sfn.py +9 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sns.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sqs.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task_lambda.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_fail/state_fail.py +2 -4
- localstack/services/stepfunctions/asl/component/state/state_pass/state_pass.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_wait/wait_function/timestamp.py +2 -2
- localstack/services/stepfunctions/asl/eval/callback/callback.py +18 -18
- localstack/services/stepfunctions/asl/eval/environment.py +15 -17
- localstack/services/stepfunctions/asl/eval/evaluation_details.py +3 -5
- localstack/services/stepfunctions/asl/eval/event/event_manager.py +9 -9
- localstack/services/stepfunctions/asl/eval/event/logging.py +3 -3
- localstack/services/stepfunctions/asl/eval/program_state.py +8 -8
- localstack/services/stepfunctions/asl/eval/states.py +11 -11
- localstack/services/stepfunctions/asl/eval/test_state/environment.py +3 -5
- localstack/services/stepfunctions/asl/eval/variable_store.py +3 -3
- localstack/services/stepfunctions/asl/jsonata/jsonata.py +5 -4
- localstack/services/stepfunctions/asl/parse/intrinsic/preprocessor.py +1 -2
- localstack/services/stepfunctions/asl/parse/preprocessor.py +30 -30
- localstack/services/stepfunctions/asl/parse/typed_props.py +2 -2
- localstack/services/stepfunctions/asl/utils/encoding.py +2 -2
- localstack/services/stepfunctions/asl/utils/json_path.py +2 -2
- localstack/services/stepfunctions/backend/activity.py +4 -4
- localstack/services/stepfunctions/backend/alias.py +6 -6
- localstack/services/stepfunctions/backend/execution.py +25 -27
- localstack/services/stepfunctions/backend/execution_worker.py +7 -7
- localstack/services/stepfunctions/backend/state_machine.py +26 -26
- localstack/services/stepfunctions/backend/test_state/execution.py +3 -4
- localstack/services/stepfunctions/backend/test_state/execution_worker.py +1 -3
- localstack/services/stepfunctions/mocking/mock_config.py +5 -5
- localstack/services/stepfunctions/mocking/mock_config_file.py +10 -10
- localstack/services/stepfunctions/provider.py +27 -37
- localstack/services/stepfunctions/quotas.py +2 -3
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity.py +6 -6
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity_plugin.py +1 -3
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine.py +25 -25
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine_plugin.py +1 -3
- localstack/services/stepfunctions/stepfunctions_utils.py +1 -2
- localstack/services/stores.py +7 -7
- localstack/services/transcribe/packages.py +1 -3
- localstack/services/transcribe/provider.py +2 -2
- localstack/state/inspect.py +4 -4
- localstack/state/pickle.py +16 -15
- localstack/testing/aws/asf_utils.py +3 -2
- localstack/testing/aws/lambda_utils.py +15 -14
- localstack/testing/aws/util.py +3 -2
- localstack/testing/pytest/cloudformation/fixtures.py +3 -2
- localstack/testing/pytest/container.py +5 -4
- localstack/testing/pytest/filters.py +1 -3
- localstack/testing/pytest/fixtures.py +11 -11
- localstack/testing/pytest/marking.py +6 -6
- localstack/testing/pytest/path_filter.py +1 -1
- localstack/testing/pytest/stepfunctions/utils.py +1 -1
- localstack/testing/pytest/validation_tracking.py +3 -3
- localstack/testing/scenario/provisioning.py +11 -10
- localstack/testing/snapshots/transformer_utility.py +2 -2
- localstack/testing/testselection/matching.py +2 -2
- localstack/testing/testselection/opt_out.py +1 -1
- localstack/testing/testselection/scripts/filter_by_test_selection.py +1 -1
- localstack/testing/testselection/scripts/generate_test_selection.py +1 -1
- localstack/testing/testselection/testselection.py +2 -2
- localstack/utils/analytics/cli.py +2 -3
- localstack/utils/analytics/client.py +5 -5
- localstack/utils/analytics/events.py +2 -2
- localstack/utils/analytics/metrics/registry.py +1 -1
- localstack/utils/analytics/publisher.py +4 -4
- localstack/utils/analytics/service_request_aggregator.py +3 -3
- localstack/utils/aws/arns.py +2 -2
- localstack/utils/aws/aws_responses.py +14 -21
- localstack/utils/aws/aws_stack.py +7 -11
- localstack/utils/aws/dead_letter_queue.py +3 -4
- localstack/utils/aws/message_forwarding.py +9 -11
- localstack/utils/aws/request_context.py +4 -4
- localstack/utils/aws/templating.py +3 -3
- localstack/utils/batch_policy.py +2 -2
- localstack/utils/bootstrap.py +19 -20
- localstack/utils/collections.py +16 -23
- localstack/utils/config_listener.py +2 -2
- localstack/utils/container_networking.py +3 -3
- localstack/utils/container_utils/container_client.py +72 -75
- localstack/utils/container_utils/docker_cmd_client.py +33 -33
- localstack/utils/container_utils/docker_sdk_client.py +35 -35
- localstack/utils/crypto.py +2 -3
- localstack/utils/diagnose.py +11 -11
- localstack/utils/docker_utils.py +4 -4
- localstack/utils/files.py +1 -2
- localstack/utils/functions.py +2 -2
- localstack/utils/http.py +6 -6
- localstack/utils/iputils.py +2 -1
- localstack/utils/json.py +1 -1
- localstack/utils/net.py +10 -9
- localstack/utils/objects.py +10 -10
- localstack/utils/patch.py +5 -5
- localstack/utils/platform.py +2 -2
- localstack/utils/run.py +7 -7
- localstack/utils/scheduler.py +3 -2
- localstack/utils/strings.py +2 -2
- localstack/utils/tagging.py +3 -3
- localstack/utils/testutil.py +9 -9
- localstack/utils/threads.py +2 -2
- localstack/utils/xml.py +1 -1
- localstack/version.py +2 -2
- {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/METADATA +1 -1
- {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/RECORD +544 -544
- localstack_core-4.7.1.dev24.dist-info/plux.json +1 -0
- localstack_core-4.7.1.dev23.dist-info/plux.json +0 -1
- {localstack_core-4.7.1.dev23.data → localstack_core-4.7.1.dev24.data}/scripts/localstack +0 -0
- {localstack_core-4.7.1.dev23.data → localstack_core-4.7.1.dev24.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.7.1.dev23.data → localstack_core-4.7.1.dev24.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/WHEEL +0 -0
- {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/entry_points.txt +0 -0
- {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/top_level.txt +0 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import logging
|
|
4
4
|
import traceback
|
|
5
5
|
from collections import defaultdict
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any
|
|
7
7
|
|
|
8
8
|
from botocore.model import OperationModel, ServiceModel
|
|
9
9
|
|
|
@@ -49,7 +49,7 @@ class ServiceRequestParser(Handler):
|
|
|
49
49
|
already be resolved in the RequestContext (e.g., through a ServiceNameParser)
|
|
50
50
|
"""
|
|
51
51
|
|
|
52
|
-
parsers:
|
|
52
|
+
parsers: dict[str, RequestParser]
|
|
53
53
|
|
|
54
54
|
def __init__(self):
|
|
55
55
|
self.parsers = dict()
|
|
@@ -89,7 +89,7 @@ class ServiceRequestRouter(Handler):
|
|
|
89
89
|
Routes ServiceOperations to Handlers.
|
|
90
90
|
"""
|
|
91
91
|
|
|
92
|
-
handlers:
|
|
92
|
+
handlers: dict[ServiceOperation, Handler]
|
|
93
93
|
|
|
94
94
|
def __init__(self):
|
|
95
95
|
self.handlers = dict()
|
|
@@ -118,7 +118,7 @@ class ServiceRequestRouter(Handler):
|
|
|
118
118
|
|
|
119
119
|
self.handlers[key] = handler
|
|
120
120
|
|
|
121
|
-
def add_provider(self, provider: Any, service:
|
|
121
|
+
def add_provider(self, provider: Any, service: str | ServiceModel):
|
|
122
122
|
self.add_skeleton(create_skeleton(service, provider))
|
|
123
123
|
|
|
124
124
|
def add_skeleton(self, skeleton: Skeleton):
|
|
@@ -278,7 +278,7 @@ class ServiceResponseHandlers(Handler):
|
|
|
278
278
|
are only called if the request context has a service, and there are handlers for that particular service.
|
|
279
279
|
"""
|
|
280
280
|
|
|
281
|
-
handlers:
|
|
281
|
+
handlers: dict[str, CompositeResponseHandler]
|
|
282
282
|
|
|
283
283
|
def __init__(self):
|
|
284
284
|
self.handlers = defaultdict(CompositeResponseHandler)
|
localstack/aws/mocking.py
CHANGED
|
@@ -4,7 +4,7 @@ import random
|
|
|
4
4
|
import re
|
|
5
5
|
from datetime import date, datetime
|
|
6
6
|
from functools import lru_cache, singledispatch
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import cast
|
|
8
8
|
|
|
9
9
|
import botocore
|
|
10
10
|
import networkx
|
|
@@ -32,18 +32,9 @@ types = {
|
|
|
32
32
|
"boolean",
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
Instance =
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
str,
|
|
39
|
-
bytes,
|
|
40
|
-
map,
|
|
41
|
-
list,
|
|
42
|
-
float,
|
|
43
|
-
int,
|
|
44
|
-
bool,
|
|
45
|
-
date,
|
|
46
|
-
]
|
|
35
|
+
Instance = (
|
|
36
|
+
dict[str, "Instance"] | list["Instance"] | str | bytes | map | list | float | int | bool | date
|
|
37
|
+
)
|
|
47
38
|
|
|
48
39
|
# https://github.com/boto/botocore/issues/2623
|
|
49
40
|
StringShape.METADATA_ATTRS.append("pattern")
|
|
@@ -66,14 +57,14 @@ DEFAULT_ARN = "arn:aws:ec2:us-east-1:1234567890123:instance/i-abcde0123456789f"
|
|
|
66
57
|
|
|
67
58
|
|
|
68
59
|
class ShapeGraph(networkx.DiGraph):
|
|
69
|
-
root:
|
|
70
|
-
cycle:
|
|
71
|
-
cycle_shapes:
|
|
60
|
+
root: ListShape | StructureShape | MapShape
|
|
61
|
+
cycle: list[tuple[str, str]]
|
|
62
|
+
cycle_shapes: list[str]
|
|
72
63
|
|
|
73
64
|
|
|
74
65
|
def populate_graph(graph: networkx.DiGraph, root: Shape):
|
|
75
|
-
stack:
|
|
76
|
-
visited:
|
|
66
|
+
stack: list[Shape] = [root]
|
|
67
|
+
visited: set[str] = set()
|
|
77
68
|
|
|
78
69
|
while stack:
|
|
79
70
|
cur = stack.pop()
|
|
@@ -230,14 +221,14 @@ custom_arns = {
|
|
|
230
221
|
|
|
231
222
|
|
|
232
223
|
@singledispatch
|
|
233
|
-
def generate_instance(shape: Shape, graph: ShapeGraph) ->
|
|
224
|
+
def generate_instance(shape: Shape, graph: ShapeGraph) -> Instance | None:
|
|
234
225
|
if shape is None:
|
|
235
226
|
return None
|
|
236
227
|
raise ValueError("could not generate shape for type %s" % shape.type_name)
|
|
237
228
|
|
|
238
229
|
|
|
239
230
|
@generate_instance.register
|
|
240
|
-
def _(shape: StructureShape, graph: ShapeGraph) ->
|
|
231
|
+
def _(shape: StructureShape, graph: ShapeGraph) -> dict[str, Instance]:
|
|
241
232
|
if shape.is_tagged_union:
|
|
242
233
|
k, v = random.choice(list(shape.members.items()))
|
|
243
234
|
members = {k: v}
|
|
@@ -255,14 +246,14 @@ def _(shape: StructureShape, graph: ShapeGraph) -> Dict[str, Instance]:
|
|
|
255
246
|
|
|
256
247
|
|
|
257
248
|
@generate_instance.register
|
|
258
|
-
def _(shape: ListShape, graph: ShapeGraph) ->
|
|
249
|
+
def _(shape: ListShape, graph: ShapeGraph) -> list[Instance]:
|
|
259
250
|
if shape.name in graph.cycle_shapes:
|
|
260
251
|
return []
|
|
261
252
|
return [generate_instance(shape.member, graph) for _ in range(shape.metadata.get("min", 1))]
|
|
262
253
|
|
|
263
254
|
|
|
264
255
|
@generate_instance.register
|
|
265
|
-
def _(shape: MapShape, graph: ShapeGraph) ->
|
|
256
|
+
def _(shape: MapShape, graph: ShapeGraph) -> dict[str, Instance]:
|
|
266
257
|
if shape.name in graph.cycle_shapes:
|
|
267
258
|
return {}
|
|
268
259
|
return {generate_instance(shape.key, graph): generate_instance(shape.value, graph)}
|
|
@@ -379,7 +370,7 @@ def _(shape: StringShape, graph: ShapeGraph) -> str:
|
|
|
379
370
|
|
|
380
371
|
|
|
381
372
|
@generate_instance.register
|
|
382
|
-
def _(shape: Shape, graph: ShapeGraph) ->
|
|
373
|
+
def _(shape: Shape, graph: ShapeGraph) -> int | float | bool | bytes | date:
|
|
383
374
|
if shape.type_name in ["integer", "long"]:
|
|
384
375
|
return shape.metadata.get("min", 1)
|
|
385
376
|
if shape.type_name in ["float", "double"]:
|
|
@@ -427,7 +418,7 @@ def create_mocking_dispatch_table(service) -> DispatchTable:
|
|
|
427
418
|
return dispatch_table
|
|
428
419
|
|
|
429
420
|
|
|
430
|
-
@lru_cache
|
|
421
|
+
@lru_cache
|
|
431
422
|
def get_mocking_skeleton(service: str) -> Skeleton:
|
|
432
423
|
service = load_service(service)
|
|
433
424
|
return Skeleton(service, create_mocking_dispatch_table(service))
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from collections import defaultdict
|
|
2
|
-
from
|
|
2
|
+
from collections.abc import Mapping
|
|
3
|
+
from typing import Any, NamedTuple
|
|
3
4
|
from urllib.parse import parse_qs, unquote
|
|
4
5
|
|
|
5
6
|
from botocore.model import OperationModel, ServiceModel, StructureShape
|
|
@@ -24,8 +25,8 @@ class _HttpOperation(NamedTuple):
|
|
|
24
25
|
operation: OperationModel
|
|
25
26
|
path: str
|
|
26
27
|
method: str
|
|
27
|
-
query_args: Mapping[str,
|
|
28
|
-
header_args:
|
|
28
|
+
query_args: Mapping[str, list[str]]
|
|
29
|
+
header_args: list[str]
|
|
29
30
|
deprecated: bool
|
|
30
31
|
|
|
31
32
|
@staticmethod
|
|
@@ -49,11 +50,11 @@ class _HttpOperation(NamedTuple):
|
|
|
49
50
|
path_query = uri.split("?")
|
|
50
51
|
path = path_query[0]
|
|
51
52
|
header_args = []
|
|
52
|
-
query_args:
|
|
53
|
+
query_args: dict[str, list[str]] = {}
|
|
53
54
|
|
|
54
55
|
if len(path_query) > 1:
|
|
55
56
|
# parse the query args of the request URI (they are mandatory)
|
|
56
|
-
query_args:
|
|
57
|
+
query_args: dict[str, list[str]] = parse_qs(path_query[1], keep_blank_values=True)
|
|
57
58
|
# for mandatory keys without values, keep an empty list (instead of [''] - the result of parse_qs)
|
|
58
59
|
query_args = {k: filter(None, v) for k, v in query_args.items()}
|
|
59
60
|
|
|
@@ -85,8 +86,8 @@ class _RequiredArgsRule:
|
|
|
85
86
|
"""
|
|
86
87
|
|
|
87
88
|
endpoint: Any
|
|
88
|
-
required_query_args:
|
|
89
|
-
required_header_args:
|
|
89
|
+
required_query_args: Mapping[str, list[Any]] | None
|
|
90
|
+
required_header_args: list[str]
|
|
90
91
|
match_score: int
|
|
91
92
|
|
|
92
93
|
def __init__(self, operation: _HttpOperation) -> None:
|
|
@@ -139,7 +140,7 @@ class _RequestMatchingRule(StrictMethodRule):
|
|
|
139
140
|
"""
|
|
140
141
|
|
|
141
142
|
def __init__(
|
|
142
|
-
self, string: str, operations:
|
|
143
|
+
self, string: str, operations: list[_HttpOperation], method: str, **kwargs
|
|
143
144
|
) -> None:
|
|
144
145
|
super().__init__(string=string, method=method, **kwargs)
|
|
145
146
|
# Create a rule which checks all required arguments (not only the path and method)
|
|
@@ -174,7 +175,7 @@ def _create_service_map(service: ServiceModel) -> Map:
|
|
|
174
175
|
rules = []
|
|
175
176
|
|
|
176
177
|
# group all operations by their path and method
|
|
177
|
-
path_index:
|
|
178
|
+
path_index: dict[(str, str), list[_HttpOperation]] = defaultdict(list)
|
|
178
179
|
for op in ops:
|
|
179
180
|
http_op = _HttpOperation.from_operation(op)
|
|
180
181
|
path_index[(http_op.path, http_op.method)].append(http_op)
|
|
@@ -216,7 +217,7 @@ class RestServiceOperationRouter:
|
|
|
216
217
|
def __init__(self, service: ServiceModel):
|
|
217
218
|
self._map = _create_service_map(service)
|
|
218
219
|
|
|
219
|
-
def match(self, request: Request) ->
|
|
220
|
+
def match(self, request: Request) -> tuple[OperationModel, Mapping[str, Any]]:
|
|
220
221
|
"""
|
|
221
222
|
Matches the given request to the operation it targets (or raises an exception if no operation matches).
|
|
222
223
|
|
|
@@ -68,8 +68,9 @@ import datetime
|
|
|
68
68
|
import functools
|
|
69
69
|
import re
|
|
70
70
|
from abc import ABC
|
|
71
|
+
from collections.abc import Mapping
|
|
71
72
|
from email.utils import parsedate_to_datetime
|
|
72
|
-
from typing import IO, Any
|
|
73
|
+
from typing import IO, Any
|
|
73
74
|
from xml.etree import ElementTree as ETree
|
|
74
75
|
|
|
75
76
|
import dateutil.parser
|
|
@@ -107,7 +108,7 @@ def _text_content(func):
|
|
|
107
108
|
self,
|
|
108
109
|
request: Request,
|
|
109
110
|
shape: Shape,
|
|
110
|
-
node_or_string:
|
|
111
|
+
node_or_string: ETree.Element | str,
|
|
111
112
|
uri_params: Mapping[str, Any] = None,
|
|
112
113
|
):
|
|
113
114
|
if hasattr(node_or_string, "text"):
|
|
@@ -203,7 +204,7 @@ class RequestParser(abc.ABC):
|
|
|
203
204
|
self.service = service
|
|
204
205
|
|
|
205
206
|
@_handle_exceptions
|
|
206
|
-
def parse(self, request: Request) ->
|
|
207
|
+
def parse(self, request: Request) -> tuple[OperationModel, Any]:
|
|
207
208
|
"""
|
|
208
209
|
Determines which operation the request was aiming for and parses the incoming request such that the resulting
|
|
209
210
|
dictionary can be used to invoke the service's function implementation.
|
|
@@ -367,7 +368,7 @@ class QueryRequestParser(RequestParser):
|
|
|
367
368
|
"""
|
|
368
369
|
|
|
369
370
|
@_handle_exceptions
|
|
370
|
-
def parse(self, request: Request) ->
|
|
371
|
+
def parse(self, request: Request) -> tuple[OperationModel, Any]:
|
|
371
372
|
instance = request.values
|
|
372
373
|
if "Action" not in instance:
|
|
373
374
|
raise ProtocolParserError(
|
|
@@ -510,7 +511,7 @@ class QueryRequestParser(RequestParser):
|
|
|
510
511
|
|
|
511
512
|
# We collect the list value as well as the integer indicating the list position so we can
|
|
512
513
|
# later sort the list by the position, in case they attribute values are unordered
|
|
513
|
-
result:
|
|
514
|
+
result: list[tuple[int, Any]] = []
|
|
514
515
|
|
|
515
516
|
i = 0
|
|
516
517
|
while True:
|
|
@@ -559,7 +560,7 @@ class BaseRestRequestParser(RequestParser):
|
|
|
559
560
|
self._operation_router = RestServiceOperationRouter(service)
|
|
560
561
|
|
|
561
562
|
@_handle_exceptions
|
|
562
|
-
def parse(self, request: Request) ->
|
|
563
|
+
def parse(self, request: Request) -> tuple[OperationModel, Any]:
|
|
563
564
|
try:
|
|
564
565
|
operation, uri_params = self._operation_router.match(request)
|
|
565
566
|
except NotFound as e:
|
|
@@ -578,7 +579,7 @@ class BaseRestRequestParser(RequestParser):
|
|
|
578
579
|
self,
|
|
579
580
|
request: Request,
|
|
580
581
|
shape: Shape,
|
|
581
|
-
member_shapes:
|
|
582
|
+
member_shapes: dict[str, Shape],
|
|
582
583
|
uri_params: Mapping[str, Any],
|
|
583
584
|
final_parsed: dict,
|
|
584
585
|
) -> None:
|
|
@@ -781,7 +782,7 @@ class RestXMLRequestParser(BaseRestRequestParser):
|
|
|
781
782
|
) from e
|
|
782
783
|
return root
|
|
783
784
|
|
|
784
|
-
def _build_name_to_xml_node(self, parent_node:
|
|
785
|
+
def _build_name_to_xml_node(self, parent_node: list | ETree.Element) -> dict:
|
|
785
786
|
# If the parent node is actually a list. We should not be trying
|
|
786
787
|
# to serialize it to a dictionary. Instead, return the first element
|
|
787
788
|
# in the list.
|
|
@@ -824,9 +825,9 @@ class BaseJSONRequestParser(RequestParser, ABC):
|
|
|
824
825
|
self,
|
|
825
826
|
request: Request,
|
|
826
827
|
shape: StructureShape,
|
|
827
|
-
value:
|
|
828
|
+
value: dict | None,
|
|
828
829
|
uri_params: Mapping[str, Any] = None,
|
|
829
|
-
) ->
|
|
830
|
+
) -> dict | None:
|
|
830
831
|
if shape.is_document_type:
|
|
831
832
|
final_parsed = value
|
|
832
833
|
else:
|
|
@@ -849,9 +850,9 @@ class BaseJSONRequestParser(RequestParser, ABC):
|
|
|
849
850
|
self,
|
|
850
851
|
request: Request,
|
|
851
852
|
shape: MapShape,
|
|
852
|
-
value:
|
|
853
|
+
value: dict | None,
|
|
853
854
|
uri_params: Mapping[str, Any] = None,
|
|
854
|
-
) ->
|
|
855
|
+
) -> dict | None:
|
|
855
856
|
if value is None:
|
|
856
857
|
return None
|
|
857
858
|
parsed = {}
|
|
@@ -916,7 +917,7 @@ class JSONRequestParser(BaseJSONRequestParser):
|
|
|
916
917
|
"""
|
|
917
918
|
|
|
918
919
|
@_handle_exceptions
|
|
919
|
-
def parse(self, request: Request) ->
|
|
920
|
+
def parse(self, request: Request) -> tuple[OperationModel, Any]:
|
|
920
921
|
target = request.headers["X-Amz-Target"]
|
|
921
922
|
# assuming that the last part of the target string (e.g., "x.y.z.MyAction") contains the operation name
|
|
922
923
|
operation_name = target.rpartition(".")[2]
|
|
@@ -1038,9 +1039,7 @@ class S3RequestParser(RestXMLRequestParser):
|
|
|
1038
1039
|
)
|
|
1039
1040
|
|
|
1040
1041
|
@staticmethod
|
|
1041
|
-
def _set_request_props(
|
|
1042
|
-
request: Request, path: str, host: str, raw_uri: Optional[str] = None
|
|
1043
|
-
):
|
|
1042
|
+
def _set_request_props(request: Request, path: str, host: str, raw_uri: str | None = None):
|
|
1044
1043
|
"""Sets the HTTP request's path and host and clears the cache in the request object."""
|
|
1045
1044
|
request.path = path
|
|
1046
1045
|
request.headers["Host"] = host
|
|
@@ -1072,7 +1071,7 @@ class S3RequestParser(RestXMLRequestParser):
|
|
|
1072
1071
|
return uses_host_addressing(request.headers)
|
|
1073
1072
|
|
|
1074
1073
|
@_handle_exceptions
|
|
1075
|
-
def parse(self, request: Request) ->
|
|
1074
|
+
def parse(self, request: Request) -> tuple[OperationModel, Any]:
|
|
1076
1075
|
"""Handle virtual-host-addressing for S3."""
|
|
1077
1076
|
with self.VirtualHostRewriter(request):
|
|
1078
1077
|
return super().parse(request)
|
|
@@ -79,10 +79,11 @@ import logging
|
|
|
79
79
|
import string
|
|
80
80
|
from abc import ABC
|
|
81
81
|
from binascii import crc32
|
|
82
|
+
from collections.abc import Iterable, Iterator
|
|
82
83
|
from datetime import datetime
|
|
83
84
|
from email.utils import formatdate
|
|
84
85
|
from struct import pack
|
|
85
|
-
from typing import Any
|
|
86
|
+
from typing import Any
|
|
86
87
|
from xml.etree import ElementTree as ETree
|
|
87
88
|
|
|
88
89
|
import xmltodict
|
|
@@ -181,14 +182,14 @@ class ResponseSerializer(abc.ABC):
|
|
|
181
182
|
AWS_BINARY_DATA_TYPE_STRING = 7
|
|
182
183
|
# Defines the supported mime types of the specific serializer. Sorted by priority (preferred / default first).
|
|
183
184
|
# Needs to be specified by subclasses.
|
|
184
|
-
SUPPORTED_MIME_TYPES:
|
|
185
|
+
SUPPORTED_MIME_TYPES: list[str] = []
|
|
185
186
|
|
|
186
187
|
@_handle_exceptions
|
|
187
188
|
def serialize_to_response(
|
|
188
189
|
self,
|
|
189
190
|
response: dict,
|
|
190
191
|
operation_model: OperationModel,
|
|
191
|
-
headers:
|
|
192
|
+
headers: dict | Headers | None,
|
|
192
193
|
request_id: str,
|
|
193
194
|
) -> Response:
|
|
194
195
|
"""
|
|
@@ -234,7 +235,7 @@ class ResponseSerializer(abc.ABC):
|
|
|
234
235
|
self,
|
|
235
236
|
error: ServiceException,
|
|
236
237
|
operation_model: OperationModel,
|
|
237
|
-
headers:
|
|
238
|
+
headers: dict | Headers | None,
|
|
238
239
|
request_id: str,
|
|
239
240
|
) -> Response:
|
|
240
241
|
"""
|
|
@@ -274,7 +275,7 @@ class ResponseSerializer(abc.ABC):
|
|
|
274
275
|
self,
|
|
275
276
|
parameters: dict,
|
|
276
277
|
response: Response,
|
|
277
|
-
shape:
|
|
278
|
+
shape: Shape | None,
|
|
278
279
|
shape_members: dict,
|
|
279
280
|
operation_model: OperationModel,
|
|
280
281
|
mime_type: str,
|
|
@@ -289,7 +290,7 @@ class ResponseSerializer(abc.ABC):
|
|
|
289
290
|
operation_model: OperationModel,
|
|
290
291
|
mime_type: str,
|
|
291
292
|
request_id: str,
|
|
292
|
-
) ->
|
|
293
|
+
) -> str | None:
|
|
293
294
|
"""
|
|
294
295
|
Actually serializes the given params for the given shape to a string for the transmission in the body of the
|
|
295
296
|
response.
|
|
@@ -390,9 +391,9 @@ class ResponseSerializer(abc.ABC):
|
|
|
390
391
|
def _encode_event_payload(
|
|
391
392
|
self,
|
|
392
393
|
event_type: str,
|
|
393
|
-
content:
|
|
394
|
-
error_code:
|
|
395
|
-
error_message:
|
|
394
|
+
content: str | bytes = "",
|
|
395
|
+
error_code: str | None = None,
|
|
396
|
+
error_message: str | None = None,
|
|
396
397
|
) -> bytes:
|
|
397
398
|
"""
|
|
398
399
|
Encodes the given event payload according to AWS specific binary event encoding.
|
|
@@ -469,7 +470,7 @@ class ResponseSerializer(abc.ABC):
|
|
|
469
470
|
"""
|
|
470
471
|
return Response(status=operation_model.http.get("responseCode", 200))
|
|
471
472
|
|
|
472
|
-
def _get_mime_type(self, headers:
|
|
473
|
+
def _get_mime_type(self, headers: dict | Headers | None) -> str:
|
|
473
474
|
"""
|
|
474
475
|
Extracts the accepted mime type from the request headers and returns a matching, supported mime type for the
|
|
475
476
|
serializer or the default mime type of the service if there is no match.
|
|
@@ -521,9 +522,7 @@ class ResponseSerializer(abc.ABC):
|
|
|
521
522
|
value = self._timestamp_unixtimestamp(value)
|
|
522
523
|
return formatdate(value, usegmt=True)
|
|
523
524
|
|
|
524
|
-
def _convert_timestamp_to_str(
|
|
525
|
-
self, value: Union[int, str, datetime], timestamp_format=None
|
|
526
|
-
) -> str:
|
|
525
|
+
def _convert_timestamp_to_str(self, value: int | str | datetime, timestamp_format=None) -> str:
|
|
527
526
|
if timestamp_format is None:
|
|
528
527
|
timestamp_format = self.TIMESTAMP_FORMAT
|
|
529
528
|
timestamp_format = timestamp_format.lower()
|
|
@@ -540,7 +539,7 @@ class ResponseSerializer(abc.ABC):
|
|
|
540
539
|
"""
|
|
541
540
|
return shape.serialization.get("name", default_name)
|
|
542
541
|
|
|
543
|
-
def _get_base64(self, value:
|
|
542
|
+
def _get_base64(self, value: str | bytes):
|
|
544
543
|
"""
|
|
545
544
|
Returns the base64-encoded version of value, handling
|
|
546
545
|
both strings and bytes. The returned value is a string
|
|
@@ -550,7 +549,7 @@ class ResponseSerializer(abc.ABC):
|
|
|
550
549
|
value = value.encode(self.DEFAULT_ENCODING)
|
|
551
550
|
return base64.b64encode(value).strip().decode(self.DEFAULT_ENCODING)
|
|
552
551
|
|
|
553
|
-
def _encode_payload(self, body:
|
|
552
|
+
def _encode_payload(self, body: bytes | str) -> bytes:
|
|
554
553
|
if isinstance(body, str):
|
|
555
554
|
return body.encode(self.DEFAULT_ENCODING)
|
|
556
555
|
return body
|
|
@@ -578,7 +577,7 @@ class ResponseSerializer(abc.ABC):
|
|
|
578
577
|
md5_digest = calculate_md5(body)
|
|
579
578
|
headers["Content-MD5"] = md5_digest
|
|
580
579
|
|
|
581
|
-
def _get_error_message(self, error: Exception) ->
|
|
580
|
+
def _get_error_message(self, error: Exception) -> str | None:
|
|
582
581
|
return str(error) if error is not None and str(error) != "None" else None
|
|
583
582
|
|
|
584
583
|
|
|
@@ -661,14 +660,14 @@ class BaseXMLResponseSerializer(ResponseSerializer):
|
|
|
661
660
|
operation_model: OperationModel,
|
|
662
661
|
mime_type: str,
|
|
663
662
|
request_id: str,
|
|
664
|
-
) ->
|
|
663
|
+
) -> str | None:
|
|
665
664
|
root = self._serialize_body_params_to_xml(params, shape, operation_model, mime_type)
|
|
666
665
|
self._prepare_additional_traits_in_xml(root, request_id)
|
|
667
666
|
return self._node_to_string(root, mime_type)
|
|
668
667
|
|
|
669
668
|
def _serialize_body_params_to_xml(
|
|
670
669
|
self, params: dict, shape: Shape, operation_model: OperationModel, mime_type: str
|
|
671
|
-
) ->
|
|
670
|
+
) -> ETree.Element | None:
|
|
672
671
|
if shape is None:
|
|
673
672
|
return
|
|
674
673
|
# The botocore serializer expects `shape.serialization["name"]`, but this isn't always present for responses
|
|
@@ -812,7 +811,7 @@ class BaseXMLResponseSerializer(ResponseSerializer):
|
|
|
812
811
|
node.text = str_value
|
|
813
812
|
|
|
814
813
|
def _serialize_type_blob(
|
|
815
|
-
self, xmlnode: ETree.Element, params:
|
|
814
|
+
self, xmlnode: ETree.Element, params: str | bytes, _, name: str, __
|
|
816
815
|
) -> None:
|
|
817
816
|
node = ETree.SubElement(xmlnode, name)
|
|
818
817
|
node.text = self._get_base64(params)
|
|
@@ -838,7 +837,7 @@ class BaseXMLResponseSerializer(ResponseSerializer):
|
|
|
838
837
|
node = ETree.SubElement(xmlnode, name)
|
|
839
838
|
node.text = str(params)
|
|
840
839
|
|
|
841
|
-
def _prepare_additional_traits_in_xml(self, root:
|
|
840
|
+
def _prepare_additional_traits_in_xml(self, root: ETree.Element | None, request_id: str):
|
|
842
841
|
"""
|
|
843
842
|
Prepares the XML root node before being serialized with additional traits (like the Response ID in the Query
|
|
844
843
|
protocol).
|
|
@@ -851,7 +850,7 @@ class BaseXMLResponseSerializer(ResponseSerializer):
|
|
|
851
850
|
response.headers["Content-Type"] = mime_type
|
|
852
851
|
return response
|
|
853
852
|
|
|
854
|
-
def _node_to_string(self, root:
|
|
853
|
+
def _node_to_string(self, root: ETree.Element | None, mime_type: str) -> str | None:
|
|
855
854
|
"""Generates the string representation of the given XML element."""
|
|
856
855
|
if root is not None:
|
|
857
856
|
content = ETree.tostring(
|
|
@@ -877,7 +876,7 @@ class BaseRestResponseSerializer(ResponseSerializer, ABC):
|
|
|
877
876
|
self,
|
|
878
877
|
parameters: dict,
|
|
879
878
|
response: Response,
|
|
880
|
-
shape:
|
|
879
|
+
shape: Shape | None,
|
|
881
880
|
shape_members: dict,
|
|
882
881
|
operation_model: OperationModel,
|
|
883
882
|
mime_type: str,
|
|
@@ -904,7 +903,7 @@ class BaseRestResponseSerializer(ResponseSerializer, ABC):
|
|
|
904
903
|
self,
|
|
905
904
|
parameters: dict,
|
|
906
905
|
response: Response,
|
|
907
|
-
shape:
|
|
906
|
+
shape: Shape | None,
|
|
908
907
|
shape_members: dict,
|
|
909
908
|
operation_model: OperationModel,
|
|
910
909
|
mime_type: str,
|
|
@@ -975,7 +974,7 @@ class BaseRestResponseSerializer(ResponseSerializer, ABC):
|
|
|
975
974
|
"""
|
|
976
975
|
pass
|
|
977
976
|
|
|
978
|
-
def _has_streaming_payload(self, payload:
|
|
977
|
+
def _has_streaming_payload(self, payload: str | None, shape_members):
|
|
979
978
|
"""Determine if payload is streaming (a blob or string)."""
|
|
980
979
|
return payload is not None and shape_members[payload].type_name in ["blob", "string"]
|
|
981
980
|
|
|
@@ -1040,7 +1039,7 @@ class BaseRestResponseSerializer(ResponseSerializer, ABC):
|
|
|
1040
1039
|
else:
|
|
1041
1040
|
return value
|
|
1042
1041
|
|
|
1043
|
-
def _partition_members(self, parameters: dict, shape:
|
|
1042
|
+
def _partition_members(self, parameters: dict, shape: Shape | None) -> tuple[dict, dict]:
|
|
1044
1043
|
"""Separates the top-level keys in the given parameters dict into header- and payload-located params."""
|
|
1045
1044
|
if not isinstance(shape, StructureShape):
|
|
1046
1045
|
# If the shape isn't a structure, we default to the whole response being parsed in the body.
|
|
@@ -1083,7 +1082,7 @@ class QueryResponseSerializer(BaseXMLResponseSerializer):
|
|
|
1083
1082
|
self,
|
|
1084
1083
|
parameters: dict,
|
|
1085
1084
|
response: Response,
|
|
1086
|
-
shape:
|
|
1085
|
+
shape: Shape | None,
|
|
1087
1086
|
shape_members: dict,
|
|
1088
1087
|
operation_model: OperationModel,
|
|
1089
1088
|
mime_type: str,
|
|
@@ -1130,7 +1129,7 @@ class QueryResponseSerializer(BaseXMLResponseSerializer):
|
|
|
1130
1129
|
root.append(node)
|
|
1131
1130
|
return root
|
|
1132
1131
|
|
|
1133
|
-
def _prepare_additional_traits_in_xml(self, root:
|
|
1132
|
+
def _prepare_additional_traits_in_xml(self, root: ETree.Element | None, request_id: str):
|
|
1134
1133
|
# Add the response metadata here (it's not defined in the specs)
|
|
1135
1134
|
# For the ec2 and the query protocol, the root cannot be None at this time.
|
|
1136
1135
|
response_metadata = ETree.SubElement(root, "ResponseMetadata")
|
|
@@ -1179,7 +1178,7 @@ class EC2ResponseSerializer(QueryResponseSerializer):
|
|
|
1179
1178
|
request_id_element.text = request_id
|
|
1180
1179
|
response.set_response(self._encode_payload(self._node_to_string(root, mime_type)))
|
|
1181
1180
|
|
|
1182
|
-
def _prepare_additional_traits_in_xml(self, root:
|
|
1181
|
+
def _prepare_additional_traits_in_xml(self, root: ETree.Element | None, request_id: str):
|
|
1183
1182
|
# The EC2 protocol does not use the root output shape, therefore we need to remove the hierarchy level
|
|
1184
1183
|
# below the root level
|
|
1185
1184
|
if len(root) > 0:
|
|
@@ -1251,7 +1250,7 @@ class JSONResponseSerializer(ResponseSerializer):
|
|
|
1251
1250
|
self,
|
|
1252
1251
|
parameters: dict,
|
|
1253
1252
|
response: Response,
|
|
1254
|
-
shape:
|
|
1253
|
+
shape: Shape | None,
|
|
1255
1254
|
shape_members: dict,
|
|
1256
1255
|
operation_model: OperationModel,
|
|
1257
1256
|
mime_type: str,
|
|
@@ -1274,7 +1273,7 @@ class JSONResponseSerializer(ResponseSerializer):
|
|
|
1274
1273
|
operation_model: OperationModel,
|
|
1275
1274
|
mime_type: str,
|
|
1276
1275
|
request_id: str,
|
|
1277
|
-
) ->
|
|
1276
|
+
) -> str | None:
|
|
1278
1277
|
body = {}
|
|
1279
1278
|
if shape is not None:
|
|
1280
1279
|
self._serialize(body, params, shape, None, mime_type)
|
|
@@ -1284,7 +1283,7 @@ class JSONResponseSerializer(ResponseSerializer):
|
|
|
1284
1283
|
else:
|
|
1285
1284
|
return json.dumps(body)
|
|
1286
1285
|
|
|
1287
|
-
def _serialize(self, body: dict, value: Any, shape, key:
|
|
1286
|
+
def _serialize(self, body: dict, value: Any, shape, key: str | None, mime_type: str):
|
|
1288
1287
|
"""This method dynamically invokes the correct `_serialize_type_*` method for each shape type."""
|
|
1289
1288
|
try:
|
|
1290
1289
|
method = getattr(self, "_serialize_type_%s" % shape.type_name, self._default_serialize)
|
|
@@ -1295,7 +1294,7 @@ class JSONResponseSerializer(ResponseSerializer):
|
|
|
1295
1294
|
) from e
|
|
1296
1295
|
|
|
1297
1296
|
def _serialize_type_structure(
|
|
1298
|
-
self, body: dict, value: dict, shape: StructureShape, key:
|
|
1297
|
+
self, body: dict, value: dict, shape: StructureShape, key: str | None, mime_type: str
|
|
1299
1298
|
):
|
|
1300
1299
|
if value is None:
|
|
1301
1300
|
return
|
|
@@ -1369,9 +1368,7 @@ class JSONResponseSerializer(ResponseSerializer):
|
|
|
1369
1368
|
timestamp_format = shape.serialization.get("timestampFormat")
|
|
1370
1369
|
body[key] = self._convert_timestamp_to_str(value, timestamp_format)
|
|
1371
1370
|
|
|
1372
|
-
def _serialize_type_blob(
|
|
1373
|
-
self, body: dict, value: Union[str, bytes], _, key: str, mime_type: str
|
|
1374
|
-
):
|
|
1371
|
+
def _serialize_type_blob(self, body: dict, value: str | bytes, _, key: str, mime_type: str):
|
|
1375
1372
|
if mime_type in self.CBOR_TYPES:
|
|
1376
1373
|
body[key] = value
|
|
1377
1374
|
else:
|
|
@@ -1466,7 +1463,7 @@ class S3ResponseSerializer(RestXMLResponseSerializer):
|
|
|
1466
1463
|
self,
|
|
1467
1464
|
parameters: dict,
|
|
1468
1465
|
response: Response,
|
|
1469
|
-
shape:
|
|
1466
|
+
shape: Shape | None,
|
|
1470
1467
|
shape_members: dict,
|
|
1471
1468
|
operation_model: OperationModel,
|
|
1472
1469
|
mime_type: str,
|
|
@@ -1528,7 +1525,7 @@ class S3ResponseSerializer(RestXMLResponseSerializer):
|
|
|
1528
1525
|
operation_model: OperationModel,
|
|
1529
1526
|
mime_type: str,
|
|
1530
1527
|
request_id: str,
|
|
1531
|
-
) ->
|
|
1528
|
+
) -> str | None:
|
|
1532
1529
|
root = self._serialize_body_params_to_xml(params, shape, operation_model, mime_type)
|
|
1533
1530
|
# S3 does not follow the specs on the root tag name for 41 of 44 operations
|
|
1534
1531
|
root.tag = self._RESPONSE_ROOT_TAGS.get(root.tag, root.tag)
|
|
@@ -1568,7 +1565,7 @@ class S3ResponseSerializer(RestXMLResponseSerializer):
|
|
|
1568
1565
|
def _create_empty_node(xmlnode: ETree.Element, name: str) -> None:
|
|
1569
1566
|
ETree.SubElement(xmlnode, name)
|
|
1570
1567
|
|
|
1571
|
-
def _prepare_additional_traits_in_xml(self, root:
|
|
1568
|
+
def _prepare_additional_traits_in_xml(self, root: ETree.Element | None, request_id: str):
|
|
1572
1569
|
# some tools (Serverless) require a newline after the "<?xml ...>\n" preamble line, e.g., for LocationConstraint
|
|
1573
1570
|
if root and not root.tail:
|
|
1574
1571
|
root.tail = "\n"
|
|
@@ -1639,7 +1636,7 @@ class SqsQueryResponseSerializer(QueryResponseSerializer):
|
|
|
1639
1636
|
.replace("\r", "__marker__-r__marker__")
|
|
1640
1637
|
)
|
|
1641
1638
|
|
|
1642
|
-
def _node_to_string(self, root:
|
|
1639
|
+
def _node_to_string(self, root: ETree.ElementTree | None, mime_type: str) -> str | None:
|
|
1643
1640
|
"""Replaces the previously "marked" characters with their encoded value."""
|
|
1644
1641
|
generated_string = super()._node_to_string(root, mime_type)
|
|
1645
1642
|
if generated_string is None:
|
|
@@ -1785,7 +1782,7 @@ def create_serializer(service: ServiceModel) -> ResponseSerializer:
|
|
|
1785
1782
|
|
|
1786
1783
|
|
|
1787
1784
|
def aws_response_serializer(
|
|
1788
|
-
service_name: str, operation: str, protocol:
|
|
1785
|
+
service_name: str, operation: str, protocol: ProtocolName | None = None
|
|
1789
1786
|
):
|
|
1790
1787
|
"""
|
|
1791
1788
|
A decorator for an HTTP route that can serialize return values or exceptions into AWS responses.
|