localstack-core 4.7.1.dev22__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.
Files changed (545) hide show
  1. localstack/aws/api/apigateway/__init__.py +87 -110
  2. localstack/aws/api/core.py +2 -3
  3. localstack/aws/api/events/__init__.py +12 -16
  4. localstack/aws/api/logs/__init__.py +5 -8
  5. localstack/aws/api/pipes/__init__.py +24 -32
  6. localstack/aws/api/scheduler/__init__.py +14 -16
  7. localstack/aws/api/stepfunctions/__init__.py +88 -114
  8. localstack/aws/api/support/__init__.py +8 -9
  9. localstack/aws/chain.py +2 -2
  10. localstack/aws/client.py +7 -9
  11. localstack/aws/connect.py +40 -39
  12. localstack/aws/forwarder.py +5 -4
  13. localstack/aws/gateway.py +1 -3
  14. localstack/aws/handlers/analytics.py +1 -2
  15. localstack/aws/handlers/cors.py +4 -5
  16. localstack/aws/handlers/logging.py +1 -2
  17. localstack/aws/handlers/metric_handler.py +3 -4
  18. localstack/aws/handlers/service.py +5 -5
  19. localstack/aws/mocking.py +15 -24
  20. localstack/aws/protocol/op_router.py +11 -10
  21. localstack/aws/protocol/parser.py +16 -17
  22. localstack/aws/protocol/serializer.py +37 -40
  23. localstack/aws/protocol/service_router.py +13 -13
  24. localstack/aws/protocol/validate.py +5 -5
  25. localstack/aws/scaffold.py +8 -9
  26. localstack/aws/serving/edge.py +5 -6
  27. localstack/aws/serving/hypercorn.py +2 -2
  28. localstack/aws/serving/twisted.py +1 -2
  29. localstack/aws/serving/werkzeug.py +2 -2
  30. localstack/aws/skeleton.py +7 -8
  31. localstack/aws/spec.py +29 -30
  32. localstack/cli/localstack.py +6 -6
  33. localstack/cli/lpm.py +2 -2
  34. localstack/config.py +14 -15
  35. localstack/deprecations.py +5 -5
  36. localstack/dev/run/__main__.py +4 -4
  37. localstack/dev/run/paths.py +5 -5
  38. localstack/dns/models.py +2 -1
  39. localstack/dns/server.py +3 -2
  40. localstack/http/dispatcher.py +1 -2
  41. localstack/http/response.py +2 -2
  42. localstack/http/router.py +1 -1
  43. localstack/http/trace.py +2 -1
  44. localstack/logging/format.py +3 -3
  45. localstack/packages/api.py +5 -5
  46. localstack/packages/core.py +3 -3
  47. localstack/packages/debugpy.py +1 -3
  48. localstack/packages/ffmpeg.py +1 -2
  49. localstack/packages/java.py +1 -2
  50. localstack/packages/terraform.py +1 -2
  51. localstack/runtime/init.py +6 -7
  52. localstack/runtime/shutdown.py +2 -1
  53. localstack/services/apigateway/exporter.py +1 -2
  54. localstack/services/apigateway/helpers.py +6 -6
  55. localstack/services/apigateway/legacy/context.py +21 -21
  56. localstack/services/apigateway/legacy/helpers.py +20 -20
  57. localstack/services/apigateway/legacy/integration.py +7 -7
  58. localstack/services/apigateway/legacy/router_asf.py +2 -2
  59. localstack/services/apigateway/legacy/templates.py +5 -5
  60. localstack/services/apigateway/models.py +16 -16
  61. localstack/services/apigateway/next_gen/execute_api/api.py +2 -2
  62. localstack/services/apigateway/next_gen/execute_api/context.py +25 -25
  63. localstack/services/apigateway/next_gen/execute_api/handlers/api_key_validation.py +2 -5
  64. localstack/services/apigateway/next_gen/execute_api/handlers/parse.py +1 -2
  65. localstack/services/apigateway/next_gen/execute_api/handlers/resource_router.py +1 -1
  66. localstack/services/apigateway/next_gen/execute_api/header_utils.py +1 -1
  67. localstack/services/apigateway/next_gen/execute_api/helpers.py +2 -2
  68. localstack/services/apigateway/next_gen/execute_api/integrations/aws.py +6 -6
  69. localstack/services/apigateway/next_gen/execute_api/integrations/http.py +9 -9
  70. localstack/services/apigateway/next_gen/execute_api/variables.py +63 -63
  71. localstack/services/apigateway/resource_providers/aws_apigateway_account.py +3 -3
  72. localstack/services/apigateway/resource_providers/aws_apigateway_account_plugin.py +1 -3
  73. localstack/services/apigateway/resource_providers/aws_apigateway_apikey.py +14 -14
  74. localstack/services/apigateway/resource_providers/aws_apigateway_apikey_plugin.py +1 -3
  75. localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping.py +5 -5
  76. localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping_plugin.py +1 -3
  77. localstack/services/apigateway/resource_providers/aws_apigateway_deployment.py +46 -46
  78. localstack/services/apigateway/resource_providers/aws_apigateway_deployment_plugin.py +1 -3
  79. localstack/services/apigateway/resource_providers/aws_apigateway_domainname.py +18 -18
  80. localstack/services/apigateway/resource_providers/aws_apigateway_domainname_plugin.py +1 -3
  81. localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse.py +7 -7
  82. localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse_plugin.py +1 -3
  83. localstack/services/apigateway/resource_providers/aws_apigateway_method.py +36 -36
  84. localstack/services/apigateway/resource_providers/aws_apigateway_method_plugin.py +1 -3
  85. localstack/services/apigateway/resource_providers/aws_apigateway_model.py +6 -6
  86. localstack/services/apigateway/resource_providers/aws_apigateway_model_plugin.py +1 -3
  87. localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator.py +6 -6
  88. localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator_plugin.py +1 -3
  89. localstack/services/apigateway/resource_providers/aws_apigateway_resource.py +5 -5
  90. localstack/services/apigateway/resource_providers/aws_apigateway_resource_plugin.py +1 -3
  91. localstack/services/apigateway/resource_providers/aws_apigateway_restapi.py +26 -26
  92. localstack/services/apigateway/resource_providers/aws_apigateway_restapi_plugin.py +1 -3
  93. localstack/services/apigateway/resource_providers/aws_apigateway_stage.py +33 -33
  94. localstack/services/apigateway/resource_providers/aws_apigateway_stage_plugin.py +1 -3
  95. localstack/services/apigateway/resource_providers/aws_apigateway_usageplan.py +18 -18
  96. localstack/services/apigateway/resource_providers/aws_apigateway_usageplan_plugin.py +1 -3
  97. localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey.py +5 -5
  98. localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey_plugin.py +1 -3
  99. localstack/services/cdk/resource_providers/cdk_metadata.py +2 -2
  100. localstack/services/cdk/resource_providers/cdk_metadata_plugin.py +1 -3
  101. localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate.py +14 -14
  102. localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate_plugin.py +1 -3
  103. localstack/services/cloudformation/cfn_utils.py +1 -1
  104. localstack/services/cloudformation/deployment_utils.py +2 -2
  105. localstack/services/cloudformation/engine/changes.py +3 -3
  106. localstack/services/cloudformation/engine/entities.py +12 -12
  107. localstack/services/cloudformation/engine/parameters.py +3 -3
  108. localstack/services/cloudformation/engine/template_deployer.py +9 -10
  109. localstack/services/cloudformation/engine/transformers.py +5 -4
  110. localstack/services/cloudformation/engine/types.py +5 -4
  111. localstack/services/cloudformation/engine/v2/change_set_model.py +31 -9
  112. localstack/services/cloudformation/engine/v2/change_set_model_describer.py +6 -6
  113. localstack/services/cloudformation/engine/v2/change_set_model_executor.py +62 -80
  114. localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +15 -14
  115. localstack/services/cloudformation/engine/v2/change_set_model_transform.py +5 -5
  116. localstack/services/cloudformation/provider_utils.py +2 -2
  117. localstack/services/cloudformation/resource_provider.py +10 -9
  118. localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py +7 -7
  119. localstack/services/cloudformation/resource_providers/aws_cloudformation_macro_plugin.py +1 -3
  120. localstack/services/cloudformation/resource_providers/aws_cloudformation_stack.py +9 -9
  121. localstack/services/cloudformation/resource_providers/aws_cloudformation_stack_plugin.py +1 -3
  122. localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition.py +6 -6
  123. localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition_plugin.py +1 -3
  124. localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle.py +2 -2
  125. localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle_plugin.py +1 -3
  126. localstack/services/cloudformation/scaffolding/__main__.py +8 -7
  127. localstack/services/cloudformation/scaffolding/propgen.py +2 -2
  128. localstack/services/cloudformation/stores.py +2 -3
  129. localstack/services/cloudformation/v2/entities.py +57 -36
  130. localstack/services/cloudformation/v2/provider.py +155 -29
  131. localstack/services/cloudwatch/alarm_scheduler.py +7 -7
  132. localstack/services/cloudwatch/cloudwatch_database_helper.py +4 -5
  133. localstack/services/cloudwatch/models.py +5 -7
  134. localstack/services/cloudwatch/provider.py +12 -12
  135. localstack/services/cloudwatch/provider_v2.py +2 -4
  136. localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm.py +40 -40
  137. localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm_plugin.py +1 -3
  138. localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm.py +12 -12
  139. localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm_plugin.py +1 -3
  140. localstack/services/dynamodb/packages.py +1 -2
  141. localstack/services/dynamodb/provider.py +7 -8
  142. localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable.py +63 -63
  143. localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable_plugin.py +1 -3
  144. localstack/services/dynamodb/resource_providers/aws_dynamodb_table.py +57 -57
  145. localstack/services/dynamodb/resource_providers/aws_dynamodb_table_plugin.py +1 -3
  146. localstack/services/dynamodb/utils.py +13 -14
  147. localstack/services/dynamodb/v2/provider.py +6 -7
  148. localstack/services/dynamodbstreams/dynamodbstreams_api.py +2 -2
  149. localstack/services/dynamodbstreams/models.py +1 -3
  150. localstack/services/ec2/patches.py +4 -5
  151. localstack/services/ec2/provider.py +3 -3
  152. localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions.py +10 -10
  153. localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions_plugin.py +1 -3
  154. localstack/services/ec2/resource_providers/aws_ec2_instance.py +96 -96
  155. localstack/services/ec2/resource_providers/aws_ec2_instance_plugin.py +1 -3
  156. localstack/services/ec2/resource_providers/aws_ec2_internetgateway.py +5 -5
  157. localstack/services/ec2/resource_providers/aws_ec2_internetgateway_plugin.py +1 -3
  158. localstack/services/ec2/resource_providers/aws_ec2_keypair.py +10 -10
  159. localstack/services/ec2/resource_providers/aws_ec2_keypair_plugin.py +1 -3
  160. localstack/services/ec2/resource_providers/aws_ec2_natgateway.py +13 -13
  161. localstack/services/ec2/resource_providers/aws_ec2_natgateway_plugin.py +1 -3
  162. localstack/services/ec2/resource_providers/aws_ec2_networkacl.py +6 -6
  163. localstack/services/ec2/resource_providers/aws_ec2_networkacl_plugin.py +1 -3
  164. localstack/services/ec2/resource_providers/aws_ec2_prefixlist.py +14 -14
  165. localstack/services/ec2/resource_providers/aws_ec2_prefixlist_plugin.py +1 -3
  166. localstack/services/ec2/resource_providers/aws_ec2_route.py +15 -15
  167. localstack/services/ec2/resource_providers/aws_ec2_route_plugin.py +1 -3
  168. localstack/services/ec2/resource_providers/aws_ec2_routetable.py +6 -6
  169. localstack/services/ec2/resource_providers/aws_ec2_routetable_plugin.py +1 -3
  170. localstack/services/ec2/resource_providers/aws_ec2_securitygroup.py +29 -29
  171. localstack/services/ec2/resource_providers/aws_ec2_securitygroup_plugin.py +1 -3
  172. localstack/services/ec2/resource_providers/aws_ec2_subnet.py +19 -19
  173. localstack/services/ec2/resource_providers/aws_ec2_subnet_plugin.py +1 -3
  174. localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation.py +4 -4
  175. localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation_plugin.py +1 -3
  176. localstack/services/ec2/resource_providers/aws_ec2_transitgateway.py +16 -16
  177. localstack/services/ec2/resource_providers/aws_ec2_transitgateway_plugin.py +1 -3
  178. localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment.py +9 -9
  179. localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment_plugin.py +1 -3
  180. localstack/services/ec2/resource_providers/aws_ec2_vpc.py +15 -15
  181. localstack/services/ec2/resource_providers/aws_ec2_vpc_plugin.py +1 -3
  182. localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint.py +13 -13
  183. localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint_plugin.py +1 -3
  184. localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment.py +5 -5
  185. localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment_plugin.py +1 -3
  186. localstack/services/ecr/resource_providers/aws_ecr_repository.py +17 -17
  187. localstack/services/ecr/resource_providers/aws_ecr_repository_plugin.py +1 -3
  188. localstack/services/edge.py +5 -5
  189. localstack/services/es/provider.py +19 -19
  190. localstack/services/events/archive.py +2 -2
  191. localstack/services/events/connection.py +5 -5
  192. localstack/services/events/event_bus.py +9 -9
  193. localstack/services/events/models.py +25 -25
  194. localstack/services/events/provider.py +12 -12
  195. localstack/services/events/replay.py +3 -3
  196. localstack/services/events/resource_providers/aws_events_apidestination.py +8 -8
  197. localstack/services/events/resource_providers/aws_events_apidestination_plugin.py +1 -3
  198. localstack/services/events/resource_providers/aws_events_connection.py +27 -27
  199. localstack/services/events/resource_providers/aws_events_connection_plugin.py +1 -3
  200. localstack/services/events/resource_providers/aws_events_eventbus.py +9 -9
  201. localstack/services/events/resource_providers/aws_events_eventbus_plugin.py +1 -3
  202. localstack/services/events/resource_providers/aws_events_eventbuspolicy.py +11 -11
  203. localstack/services/events/resource_providers/aws_events_eventbuspolicy_plugin.py +1 -3
  204. localstack/services/events/resource_providers/aws_events_rule.py +82 -82
  205. localstack/services/events/resource_providers/aws_events_rule_plugin.py +1 -3
  206. localstack/services/events/rule.py +15 -15
  207. localstack/services/events/target.py +5 -5
  208. localstack/services/events/utils.py +7 -7
  209. localstack/services/events/v1/models.py +1 -3
  210. localstack/services/events/v1/provider.py +10 -10
  211. localstack/services/firehose/models.py +1 -3
  212. localstack/services/firehose/provider.py +11 -12
  213. localstack/services/iam/iam_patches.py +5 -6
  214. localstack/services/iam/provider.py +4 -4
  215. localstack/services/iam/resource_providers/aws_iam_accesskey.py +6 -6
  216. localstack/services/iam/resource_providers/aws_iam_accesskey_plugin.py +1 -3
  217. localstack/services/iam/resource_providers/aws_iam_group.py +9 -9
  218. localstack/services/iam/resource_providers/aws_iam_group_plugin.py +1 -3
  219. localstack/services/iam/resource_providers/aws_iam_instanceprofile.py +5 -5
  220. localstack/services/iam/resource_providers/aws_iam_instanceprofile_plugin.py +1 -3
  221. localstack/services/iam/resource_providers/aws_iam_managedpolicy.py +9 -9
  222. localstack/services/iam/resource_providers/aws_iam_managedpolicy_plugin.py +1 -3
  223. localstack/services/iam/resource_providers/aws_iam_policy.py +7 -7
  224. localstack/services/iam/resource_providers/aws_iam_policy_plugin.py +1 -3
  225. localstack/services/iam/resource_providers/aws_iam_role.py +16 -16
  226. localstack/services/iam/resource_providers/aws_iam_role_plugin.py +1 -3
  227. localstack/services/iam/resource_providers/aws_iam_servercertificate.py +10 -10
  228. localstack/services/iam/resource_providers/aws_iam_servercertificate_plugin.py +1 -3
  229. localstack/services/iam/resource_providers/aws_iam_servicelinkedrole.py +5 -5
  230. localstack/services/iam/resource_providers/aws_iam_servicelinkedrole_plugin.py +1 -3
  231. localstack/services/iam/resource_providers/aws_iam_user.py +17 -17
  232. localstack/services/iam/resource_providers/aws_iam_user_plugin.py +1 -3
  233. localstack/services/kinesis/kinesis_mock_server.py +7 -8
  234. localstack/services/kinesis/models.py +2 -3
  235. localstack/services/kinesis/packages.py +3 -3
  236. localstack/services/kinesis/resource_providers/aws_kinesis_stream.py +13 -13
  237. localstack/services/kinesis/resource_providers/aws_kinesis_stream_plugin.py +1 -3
  238. localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer.py +7 -7
  239. localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer_plugin.py +1 -3
  240. localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream.py +191 -191
  241. localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream_plugin.py +1 -3
  242. localstack/services/kms/models.py +14 -17
  243. localstack/services/kms/provider.py +2 -3
  244. localstack/services/kms/resource_providers/aws_kms_alias.py +3 -3
  245. localstack/services/kms/resource_providers/aws_kms_alias_plugin.py +1 -3
  246. localstack/services/kms/resource_providers/aws_kms_key.py +14 -14
  247. localstack/services/kms/resource_providers/aws_kms_key_plugin.py +1 -3
  248. localstack/services/kms/utils.py +3 -2
  249. localstack/services/lambda_/api_utils.py +12 -12
  250. localstack/services/lambda_/custom_endpoints.py +2 -2
  251. localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +1 -1
  252. localstack/services/lambda_/event_source_mapping/pipe_utils.py +2 -2
  253. localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py +1 -1
  254. localstack/services/lambda_/event_source_mapping/senders/sender_utils.py +2 -1
  255. localstack/services/lambda_/invocation/assignment.py +1 -2
  256. localstack/services/lambda_/invocation/docker_runtime_executor.py +5 -4
  257. localstack/services/lambda_/invocation/execution_environment.py +4 -4
  258. localstack/services/lambda_/invocation/executor_endpoint.py +5 -5
  259. localstack/services/lambda_/invocation/internal_sqs_queue.py +1 -1
  260. localstack/services/lambda_/invocation/lambda_models.py +23 -23
  261. localstack/services/lambda_/invocation/lambda_service.py +4 -4
  262. localstack/services/lambda_/invocation/logs.py +2 -3
  263. localstack/services/lambda_/invocation/runtime_executor.py +3 -3
  264. localstack/services/lambda_/ldm.py +2 -3
  265. localstack/services/lambda_/packages.py +2 -3
  266. localstack/services/lambda_/provider.py +3 -3
  267. localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig.py +8 -8
  268. localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig_plugin.py +1 -3
  269. localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig.py +11 -11
  270. localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig_plugin.py +1 -3
  271. localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping.py +39 -39
  272. localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping_plugin.py +1 -3
  273. localstack/services/lambda_/resource_providers/aws_lambda_function.py +54 -54
  274. localstack/services/lambda_/resource_providers/aws_lambda_function_plugin.py +1 -3
  275. localstack/services/lambda_/resource_providers/aws_lambda_layerversion.py +11 -11
  276. localstack/services/lambda_/resource_providers/aws_lambda_layerversion_plugin.py +1 -3
  277. localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission.py +6 -6
  278. localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission_plugin.py +1 -3
  279. localstack/services/lambda_/resource_providers/aws_lambda_permission.py +10 -10
  280. localstack/services/lambda_/resource_providers/aws_lambda_permission_plugin.py +1 -3
  281. localstack/services/lambda_/resource_providers/aws_lambda_url.py +14 -14
  282. localstack/services/lambda_/resource_providers/aws_lambda_url_plugin.py +1 -3
  283. localstack/services/lambda_/resource_providers/aws_lambda_version.py +8 -8
  284. localstack/services/lambda_/resource_providers/aws_lambda_version_plugin.py +1 -3
  285. localstack/services/lambda_/resource_providers/lambda_alias.py +12 -12
  286. localstack/services/lambda_/resource_providers/lambda_alias_plugin.py +1 -3
  287. localstack/services/lambda_/runtimes.py +1 -3
  288. localstack/services/logs/models.py +1 -3
  289. localstack/services/logs/provider.py +3 -3
  290. localstack/services/logs/resource_providers/aws_logs_loggroup.py +9 -9
  291. localstack/services/logs/resource_providers/aws_logs_loggroup_plugin.py +1 -3
  292. localstack/services/logs/resource_providers/aws_logs_logstream.py +4 -4
  293. localstack/services/logs/resource_providers/aws_logs_logstream_plugin.py +1 -3
  294. localstack/services/logs/resource_providers/aws_logs_subscriptionfilter.py +7 -7
  295. localstack/services/logs/resource_providers/aws_logs_subscriptionfilter_plugin.py +1 -3
  296. localstack/services/moto.py +3 -3
  297. localstack/services/opensearch/cluster.py +13 -13
  298. localstack/services/opensearch/cluster_manager.py +13 -14
  299. localstack/services/opensearch/models.py +1 -3
  300. localstack/services/opensearch/packages.py +1 -2
  301. localstack/services/opensearch/provider.py +7 -8
  302. localstack/services/opensearch/resource_providers/aws_elasticsearch_domain.py +61 -61
  303. localstack/services/opensearch/resource_providers/aws_elasticsearch_domain_plugin.py +1 -3
  304. localstack/services/opensearch/resource_providers/aws_opensearchservice_domain.py +89 -89
  305. localstack/services/opensearch/resource_providers/aws_opensearchservice_domain_plugin.py +1 -3
  306. localstack/services/opensearch/versions.py +1 -3
  307. localstack/services/plugins.py +26 -25
  308. localstack/services/redshift/resource_providers/aws_redshift_cluster.py +57 -57
  309. localstack/services/redshift/resource_providers/aws_redshift_cluster_plugin.py +1 -3
  310. localstack/services/resource_groups/resource_providers/aws_resourcegroups_group.py +21 -21
  311. localstack/services/resource_groups/resource_providers/aws_resourcegroups_group_plugin.py +1 -3
  312. localstack/services/route53/models.py +1 -3
  313. localstack/services/route53/provider.py +1 -2
  314. localstack/services/route53/resource_providers/aws_route53_healthcheck.py +6 -6
  315. localstack/services/route53/resource_providers/aws_route53_healthcheck_plugin.py +1 -3
  316. localstack/services/route53/resource_providers/aws_route53_recordset.py +27 -27
  317. localstack/services/route53/resource_providers/aws_route53_recordset_plugin.py +1 -3
  318. localstack/services/route53resolver/models.py +8 -10
  319. localstack/services/route53resolver/provider.py +12 -12
  320. localstack/services/s3/codec.py +2 -2
  321. localstack/services/s3/cors.py +4 -4
  322. localstack/services/s3/models.py +72 -72
  323. localstack/services/s3/notifications.py +19 -19
  324. localstack/services/s3/presigned_url.py +6 -5
  325. localstack/services/s3/provider.py +13 -14
  326. localstack/services/s3/resource_providers/aws_s3_bucket.py +180 -180
  327. localstack/services/s3/resource_providers/aws_s3_bucket_plugin.py +1 -3
  328. localstack/services/s3/resource_providers/aws_s3_bucketpolicy.py +4 -4
  329. localstack/services/s3/resource_providers/aws_s3_bucketpolicy_plugin.py +1 -3
  330. localstack/services/s3/storage/core.py +4 -3
  331. localstack/services/s3/storage/ephemeral.py +7 -6
  332. localstack/services/s3/utils.py +11 -11
  333. localstack/services/s3/validation.py +1 -1
  334. localstack/services/s3/website_hosting.py +5 -5
  335. localstack/services/scheduler/resource_providers/aws_scheduler_schedule.py +60 -60
  336. localstack/services/scheduler/resource_providers/aws_scheduler_schedule_plugin.py +1 -3
  337. localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup.py +9 -9
  338. localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup_plugin.py +1 -3
  339. localstack/services/secretsmanager/provider.py +9 -11
  340. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy.py +5 -5
  341. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy_plugin.py +1 -3
  342. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule.py +21 -21
  343. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule_plugin.py +1 -3
  344. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret.py +23 -23
  345. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret_plugin.py +1 -3
  346. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment.py +5 -5
  347. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment_plugin.py +1 -3
  348. localstack/services/ses/provider.py +8 -8
  349. localstack/services/ses/resource_providers/aws_ses_emailidentity.py +21 -21
  350. localstack/services/ses/resource_providers/aws_ses_emailidentity_plugin.py +1 -3
  351. localstack/services/sns/models.py +25 -25
  352. localstack/services/sns/provider.py +1 -2
  353. localstack/services/sns/publisher.py +6 -7
  354. localstack/services/sns/resource_providers/aws_sns_subscription.py +13 -13
  355. localstack/services/sns/resource_providers/aws_sns_subscription_plugin.py +1 -3
  356. localstack/services/sns/resource_providers/aws_sns_topic.py +16 -16
  357. localstack/services/sns/resource_providers/aws_sns_topic_plugin.py +1 -3
  358. localstack/services/sns/resource_providers/aws_sns_topicpolicy.py +4 -4
  359. localstack/services/sns/resource_providers/aws_sns_topicpolicy_plugin.py +1 -3
  360. localstack/services/sqs/models.py +21 -22
  361. localstack/services/sqs/provider.py +19 -18
  362. localstack/services/sqs/query_api.py +2 -3
  363. localstack/services/sqs/resource_providers/aws_sqs_queue.py +21 -21
  364. localstack/services/sqs/resource_providers/aws_sqs_queue_plugin.py +1 -3
  365. localstack/services/sqs/resource_providers/aws_sqs_queuepolicy.py +4 -4
  366. localstack/services/sqs/resource_providers/aws_sqs_queuepolicy_plugin.py +1 -3
  367. localstack/services/sqs/utils.py +3 -3
  368. localstack/services/ssm/provider.py +2 -3
  369. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow.py +15 -15
  370. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow_plugin.py +1 -3
  371. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget.py +10 -10
  372. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget_plugin.py +1 -3
  373. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask.py +48 -48
  374. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask_plugin.py +1 -3
  375. localstack/services/ssm/resource_providers/aws_ssm_parameter.py +10 -10
  376. localstack/services/ssm/resource_providers/aws_ssm_parameter_plugin.py +1 -3
  377. localstack/services/ssm/resource_providers/aws_ssm_patchbaseline.py +29 -29
  378. localstack/services/ssm/resource_providers/aws_ssm_patchbaseline_plugin.py +1 -3
  379. localstack/services/stepfunctions/asl/antlt4utils/antlr4utils.py +3 -4
  380. localstack/services/stepfunctions/asl/component/common/catch/catcher_decl.py +9 -9
  381. localstack/services/stepfunctions/asl/component/common/error_name/custom_error_name.py +2 -2
  382. localstack/services/stepfunctions/asl/component/common/error_name/error_name.py +4 -4
  383. localstack/services/stepfunctions/asl/component/common/error_name/failure_event.py +8 -8
  384. localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_binding.py +2 -2
  385. localstack/services/stepfunctions/asl/component/common/path/input_path.py +3 -3
  386. localstack/services/stepfunctions/asl/component/common/path/output_path.py +3 -3
  387. localstack/services/stepfunctions/asl/component/common/path/result_path.py +3 -3
  388. localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadbinding/payload_binding.py +3 -3
  389. localstack/services/stepfunctions/asl/component/common/retry/retrier_decl.py +8 -8
  390. localstack/services/stepfunctions/asl/component/common/string/string_expression.py +2 -2
  391. localstack/services/stepfunctions/asl/component/common/timeouts/timeout.py +3 -3
  392. localstack/services/stepfunctions/asl/component/eval_component.py +2 -3
  393. localstack/services/stepfunctions/asl/component/intrinsic/argument/argument.py +3 -3
  394. localstack/services/stepfunctions/asl/component/intrinsic/jsonata.py +2 -2
  395. localstack/services/stepfunctions/asl/component/program/program.py +8 -8
  396. localstack/services/stepfunctions/asl/component/state/state.py +10 -11
  397. localstack/services/stepfunctions/asl/component/state/state_choice/choice_rule.py +11 -11
  398. localstack/services/stepfunctions/asl/component/state/state_choice/comparison/operator/implementations/is_operator.py +2 -2
  399. localstack/services/stepfunctions/asl/component/state/state_choice/state_choice.py +1 -3
  400. localstack/services/stepfunctions/asl/component/state/state_execution/execute_state.py +8 -8
  401. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/item_reader_decl.py +6 -6
  402. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/reader_config/reader_config_decl.py +5 -5
  403. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_eval_s3.py +2 -1
  404. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/distributed_iteration_component.py +8 -8
  405. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/inline_iteration_component.py +7 -7
  406. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/distributed_item_processor_worker.py +4 -4
  407. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/inline_item_processor_worker.py +5 -5
  408. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/map_run_record.py +10 -10
  409. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_component.py +3 -3
  410. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_declaration.py +3 -3
  411. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_worker.py +2 -2
  412. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/distributed_iterator_worker.py +3 -5
  413. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator.py +1 -2
  414. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator_worker.py +5 -5
  415. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/job.py +9 -9
  416. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/result_writer/resource_eval/resource_eval_s3.py +2 -1
  417. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/state_map.py +10 -11
  418. localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branch_worker.py +3 -3
  419. localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branches_decl.py +4 -4
  420. localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/state_parallel.py +1 -2
  421. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py +6 -6
  422. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/resource.py +3 -3
  423. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service.py +10 -10
  424. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py +15 -15
  425. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py +5 -4
  426. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_callback.py +18 -17
  427. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_dynamodb.py +2 -2
  428. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_ecs.py +5 -4
  429. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_events.py +4 -4
  430. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_glue.py +7 -6
  431. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_lambda.py +4 -4
  432. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sfn.py +9 -8
  433. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sns.py +2 -2
  434. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sqs.py +4 -4
  435. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py +2 -2
  436. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task_lambda.py +2 -2
  437. localstack/services/stepfunctions/asl/component/state/state_fail/state_fail.py +2 -4
  438. localstack/services/stepfunctions/asl/component/state/state_pass/state_pass.py +3 -5
  439. localstack/services/stepfunctions/asl/component/state/state_wait/wait_function/timestamp.py +2 -2
  440. localstack/services/stepfunctions/asl/eval/callback/callback.py +18 -18
  441. localstack/services/stepfunctions/asl/eval/environment.py +15 -17
  442. localstack/services/stepfunctions/asl/eval/evaluation_details.py +3 -5
  443. localstack/services/stepfunctions/asl/eval/event/event_manager.py +9 -9
  444. localstack/services/stepfunctions/asl/eval/event/logging.py +3 -3
  445. localstack/services/stepfunctions/asl/eval/program_state.py +8 -8
  446. localstack/services/stepfunctions/asl/eval/states.py +11 -11
  447. localstack/services/stepfunctions/asl/eval/test_state/environment.py +3 -5
  448. localstack/services/stepfunctions/asl/eval/variable_store.py +3 -3
  449. localstack/services/stepfunctions/asl/jsonata/jsonata.py +5 -4
  450. localstack/services/stepfunctions/asl/parse/intrinsic/preprocessor.py +1 -2
  451. localstack/services/stepfunctions/asl/parse/preprocessor.py +30 -30
  452. localstack/services/stepfunctions/asl/parse/typed_props.py +2 -2
  453. localstack/services/stepfunctions/asl/utils/encoding.py +2 -2
  454. localstack/services/stepfunctions/asl/utils/json_path.py +2 -2
  455. localstack/services/stepfunctions/backend/activity.py +4 -4
  456. localstack/services/stepfunctions/backend/alias.py +6 -6
  457. localstack/services/stepfunctions/backend/execution.py +25 -27
  458. localstack/services/stepfunctions/backend/execution_worker.py +7 -7
  459. localstack/services/stepfunctions/backend/state_machine.py +26 -26
  460. localstack/services/stepfunctions/backend/test_state/execution.py +3 -4
  461. localstack/services/stepfunctions/backend/test_state/execution_worker.py +1 -3
  462. localstack/services/stepfunctions/mocking/mock_config.py +5 -5
  463. localstack/services/stepfunctions/mocking/mock_config_file.py +10 -10
  464. localstack/services/stepfunctions/provider.py +27 -37
  465. localstack/services/stepfunctions/quotas.py +2 -3
  466. localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity.py +6 -6
  467. localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity_plugin.py +1 -3
  468. localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine.py +25 -25
  469. localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine_plugin.py +1 -3
  470. localstack/services/stepfunctions/stepfunctions_utils.py +1 -2
  471. localstack/services/stores.py +7 -7
  472. localstack/services/transcribe/packages.py +1 -3
  473. localstack/services/transcribe/provider.py +2 -2
  474. localstack/state/inspect.py +4 -4
  475. localstack/state/pickle.py +16 -15
  476. localstack/testing/aws/asf_utils.py +3 -2
  477. localstack/testing/aws/lambda_utils.py +15 -14
  478. localstack/testing/aws/util.py +3 -2
  479. localstack/testing/pytest/cloudformation/fixtures.py +13 -3
  480. localstack/testing/pytest/container.py +5 -4
  481. localstack/testing/pytest/filters.py +1 -3
  482. localstack/testing/pytest/fixtures.py +11 -11
  483. localstack/testing/pytest/marking.py +6 -6
  484. localstack/testing/pytest/path_filter.py +1 -1
  485. localstack/testing/pytest/stepfunctions/utils.py +1 -1
  486. localstack/testing/pytest/validation_tracking.py +3 -3
  487. localstack/testing/scenario/provisioning.py +11 -10
  488. localstack/testing/snapshots/transformer_utility.py +2 -2
  489. localstack/testing/testselection/matching.py +2 -2
  490. localstack/testing/testselection/opt_out.py +1 -1
  491. localstack/testing/testselection/scripts/filter_by_test_selection.py +1 -1
  492. localstack/testing/testselection/scripts/generate_test_selection.py +1 -1
  493. localstack/testing/testselection/testselection.py +2 -2
  494. localstack/utils/analytics/cli.py +2 -3
  495. localstack/utils/analytics/client.py +5 -5
  496. localstack/utils/analytics/events.py +2 -2
  497. localstack/utils/analytics/metrics/registry.py +1 -1
  498. localstack/utils/analytics/publisher.py +4 -4
  499. localstack/utils/analytics/service_request_aggregator.py +3 -3
  500. localstack/utils/aws/arns.py +2 -2
  501. localstack/utils/aws/aws_responses.py +14 -21
  502. localstack/utils/aws/aws_stack.py +7 -11
  503. localstack/utils/aws/dead_letter_queue.py +3 -4
  504. localstack/utils/aws/message_forwarding.py +9 -11
  505. localstack/utils/aws/request_context.py +4 -4
  506. localstack/utils/aws/templating.py +3 -3
  507. localstack/utils/batch_policy.py +2 -2
  508. localstack/utils/bootstrap.py +19 -20
  509. localstack/utils/collections.py +16 -23
  510. localstack/utils/config_listener.py +2 -2
  511. localstack/utils/container_networking.py +3 -3
  512. localstack/utils/container_utils/container_client.py +72 -75
  513. localstack/utils/container_utils/docker_cmd_client.py +33 -33
  514. localstack/utils/container_utils/docker_sdk_client.py +35 -35
  515. localstack/utils/crypto.py +2 -3
  516. localstack/utils/diagnose.py +11 -11
  517. localstack/utils/docker_utils.py +4 -4
  518. localstack/utils/files.py +1 -2
  519. localstack/utils/functions.py +2 -2
  520. localstack/utils/http.py +6 -6
  521. localstack/utils/iputils.py +2 -1
  522. localstack/utils/json.py +1 -1
  523. localstack/utils/net.py +10 -9
  524. localstack/utils/objects.py +10 -10
  525. localstack/utils/patch.py +5 -5
  526. localstack/utils/platform.py +2 -2
  527. localstack/utils/run.py +7 -7
  528. localstack/utils/scheduler.py +3 -2
  529. localstack/utils/strings.py +2 -2
  530. localstack/utils/tagging.py +3 -3
  531. localstack/utils/testutil.py +9 -9
  532. localstack/utils/threads.py +2 -2
  533. localstack/utils/xml.py +1 -1
  534. localstack/version.py +2 -2
  535. {localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev24.dist-info}/METADATA +1 -1
  536. {localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev24.dist-info}/RECORD +544 -544
  537. localstack_core-4.7.1.dev24.dist-info/plux.json +1 -0
  538. localstack_core-4.7.1.dev22.dist-info/plux.json +0 -1
  539. {localstack_core-4.7.1.dev22.data → localstack_core-4.7.1.dev24.data}/scripts/localstack +0 -0
  540. {localstack_core-4.7.1.dev22.data → localstack_core-4.7.1.dev24.data}/scripts/localstack-supervisor +0 -0
  541. {localstack_core-4.7.1.dev22.data → localstack_core-4.7.1.dev24.data}/scripts/localstack.bat +0 -0
  542. {localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev24.dist-info}/WHEEL +0 -0
  543. {localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev24.dist-info}/entry_points.txt +0 -0
  544. {localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev24.dist-info}/licenses/LICENSE.txt +0 -0
  545. {localstack_core-4.7.1.dev22.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, Dict, Union
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: Dict[str, RequestParser]
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: Dict[ServiceOperation, Handler]
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: Union[str, ServiceModel]):
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: Dict[str, CompositeResponseHandler]
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 Dict, List, Optional, Set, Tuple, Union, cast
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 = Union[
36
- Dict[str, "Instance"],
37
- List["Instance"],
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: Union[ListShape, StructureShape, MapShape]
70
- cycle: List[Tuple[str, str]]
71
- cycle_shapes: List[str]
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: List[Shape] = [root]
76
- visited: Set[str] = set()
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) -> Optional[Instance]:
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) -> Dict[str, Instance]:
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) -> List[Instance]:
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) -> Dict[str, Instance]:
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) -> Union[int, float, bool, bytes, date]:
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 typing import Any, Dict, List, Mapping, NamedTuple, Optional, Tuple
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, List[str]]
28
- header_args: List[str]
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: Dict[str, List[str]] = {}
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: Dict[str, List[str]] = parse_qs(path_query[1], keep_blank_values=True)
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: Optional[Mapping[str, List[Any]]]
89
- required_header_args: List[str]
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: List[_HttpOperation], method: str, **kwargs
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: Dict[(str, str), List[_HttpOperation]] = defaultdict(list)
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) -> Tuple[OperationModel, Mapping[str, Any]]:
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, Dict, List, Mapping, Optional, Tuple, Union
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: Union[ETree.Element, str],
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) -> Tuple[OperationModel, Any]:
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) -> Tuple[OperationModel, Any]:
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: List[Tuple[int, Any]] = []
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) -> Tuple[OperationModel, Any]:
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: Dict[str, Shape],
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: Union[list, ETree.Element]) -> dict:
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: Optional[dict],
828
+ value: dict | None,
828
829
  uri_params: Mapping[str, Any] = None,
829
- ) -> Optional[dict]:
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: Optional[dict],
853
+ value: dict | None,
853
854
  uri_params: Mapping[str, Any] = None,
854
- ) -> Optional[dict]:
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) -> Tuple[OperationModel, Any]:
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) -> Tuple[OperationModel, Any]:
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, Dict, Iterable, Iterator, List, Optional, Tuple, Union
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: List[str] = []
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: Optional[Dict | 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: Optional[Dict | 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: Optional[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
- ) -> Optional[str]:
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: Union[str, bytes] = "",
394
- error_code: Optional[str] = None,
395
- error_message: Optional[str] = None,
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: Optional[Dict | Headers]) -> str:
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: Union[str, bytes]):
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: Union[bytes, str]) -> bytes:
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) -> Optional[str]:
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
- ) -> Optional[str]:
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
- ) -> Optional[ETree.Element]:
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: Union[str, bytes], _, name: str, __
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: Optional[ETree.Element], request_id: str):
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: Optional[ETree.Element], mime_type: str) -> Optional[str]:
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: Optional[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: Optional[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: Optional[str], shape_members):
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: Optional[Shape]) -> Tuple[dict, dict]:
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: Optional[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: Optional[ETree.Element], request_id: str):
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: Optional[ETree.Element], request_id: str):
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: Optional[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
- ) -> Optional[str]:
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: Optional[str], mime_type: str):
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: Optional[str], mime_type: str
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: Optional[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
- ) -> Optional[str]:
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: Optional[ETree.Element], request_id: str):
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: Optional[ETree.ElementTree], mime_type: str) -> Optional[str]:
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: Optional[ProtocolName] = None
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.