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.
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 +9 -8
  112. localstack/services/cloudformation/engine/v2/change_set_model_describer.py +6 -6
  113. localstack/services/cloudformation/engine/v2/change_set_model_executor.py +9 -9
  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 +7 -7
  130. localstack/services/cloudformation/v2/provider.py +10 -10
  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 +3 -2
  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.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/METADATA +1 -1
  536. {localstack_core-4.7.1.dev23.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.dev23.dist-info/plux.json +0 -1
  539. {localstack_core-4.7.1.dev23.data → localstack_core-4.7.1.dev24.data}/scripts/localstack +0 -0
  540. {localstack_core-4.7.1.dev23.data → localstack_core-4.7.1.dev24.data}/scripts/localstack-supervisor +0 -0
  541. {localstack_core-4.7.1.dev23.data → localstack_core-4.7.1.dev24.data}/scripts/localstack.bat +0 -0
  542. {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/WHEEL +0 -0
  543. {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/entry_points.txt +0 -0
  544. {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/licenses/LICENSE.txt +0 -0
  545. {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/top_level.txt +0 -0
@@ -6,9 +6,9 @@ import queue
6
6
  import re
7
7
  import socket
8
8
  import threading
9
- from functools import lru_cache
9
+ from functools import cache
10
10
  from time import sleep
11
- from typing import Callable, Dict, List, Optional, Tuple, Union, cast
11
+ from typing import Callable, Optional, Union, cast
12
12
  from urllib.parse import quote
13
13
 
14
14
  import docker
@@ -278,7 +278,7 @@ class SdkDockerClient(ContainerClient):
278
278
  except APIError as e:
279
279
  raise ContainerException() from e
280
280
 
281
- def list_containers(self, filter: Union[List[str], str, None] = None, all=True) -> List[dict]:
281
+ def list_containers(self, filter: Union[list[str], str, None] = None, all=True) -> list[dict]:
282
282
  if filter:
283
283
  filter = [filter] if isinstance(filter, str) else filter
284
284
  filter = dict([f.split("=", 1) for f in filter])
@@ -344,7 +344,7 @@ class SdkDockerClient(ContainerClient):
344
344
  # some path in the docker image string indicates a custom repository
345
345
 
346
346
  docker_image = self.registry_resolver_strategy.resolve(docker_image)
347
- kwargs: Dict[str, Union[str, bool]] = {"platform": platform}
347
+ kwargs: dict[str, Union[str, bool]] = {"platform": platform}
348
348
  try:
349
349
  if log_handler:
350
350
  # Use a lower-level API, as the 'stream' argument is not available in the higher-level `pull`-API
@@ -466,7 +466,7 @@ class SdkDockerClient(ContainerClient):
466
466
  except APIError as e:
467
467
  raise ContainerException() from e
468
468
 
469
- def inspect_container(self, container_name_or_id: str) -> Dict[str, Union[Dict, str]]:
469
+ def inspect_container(self, container_name_or_id: str) -> dict[str, Union[dict, str]]:
470
470
  try:
471
471
  return self.client().containers.get(container_name_or_id).attrs
472
472
  except NotFound:
@@ -479,7 +479,7 @@ class SdkDockerClient(ContainerClient):
479
479
  image_name: str,
480
480
  pull: bool = True,
481
481
  strip_wellknown_repo_prefixes: bool = True,
482
- ) -> Dict[str, Union[dict, list, str]]:
482
+ ) -> dict[str, Union[dict, list, str]]:
483
483
  image_name = self.registry_resolver_strategy.resolve(image_name)
484
484
  try:
485
485
  result = self.client().images.get(image_name).attrs
@@ -513,7 +513,7 @@ class SdkDockerClient(ContainerClient):
513
513
  except APIError as e:
514
514
  raise ContainerException() from e
515
515
 
516
- def inspect_network(self, network_name: str) -> Dict[str, Union[Dict, str]]:
516
+ def inspect_network(self, network_name: str) -> dict[str, Union[dict, str]]:
517
517
  try:
518
518
  return self.client().networks.get(network_name).attrs
519
519
  except NotFound:
@@ -525,8 +525,8 @@ class SdkDockerClient(ContainerClient):
525
525
  self,
526
526
  network_name: str,
527
527
  container_name_or_id: str,
528
- aliases: Optional[List] = None,
529
- link_local_ips: List[str] = None,
528
+ aliases: Optional[list] = None,
529
+ link_local_ips: list[str] = None,
530
530
  ) -> None:
531
531
  LOG.debug(
532
532
  "Connecting container '%s' to network '%s' with aliases '%s'",
@@ -574,7 +574,7 @@ class SdkDockerClient(ContainerClient):
574
574
  LOG.info("Container has more than one assigned network. Picking the first one...")
575
575
  return networks[network_names[0]]["IPAddress"]
576
576
 
577
- @lru_cache(maxsize=None)
577
+ @cache
578
578
  def has_docker(self) -> bool:
579
579
  try:
580
580
  if not self.docker_client:
@@ -620,7 +620,7 @@ class SdkDockerClient(ContainerClient):
620
620
  interactive: bool = False,
621
621
  attach: bool = False,
622
622
  flags: Optional[str] = None,
623
- ) -> Tuple[bytes, bytes]:
623
+ ) -> tuple[bytes, bytes]:
624
624
  LOG.debug("Starting container %s", container_name_or_id)
625
625
  try:
626
626
  container = self.client().containers.get(container_name_or_id)
@@ -702,28 +702,28 @@ class SdkDockerClient(ContainerClient):
702
702
  image_name: str,
703
703
  *,
704
704
  name: Optional[str] = None,
705
- entrypoint: Optional[Union[List[str], str]] = None,
705
+ entrypoint: Optional[Union[list[str], str]] = None,
706
706
  remove: bool = False,
707
707
  interactive: bool = False,
708
708
  tty: bool = False,
709
709
  detach: bool = False,
710
- command: Optional[Union[List[str], str]] = None,
711
- volumes: Optional[List[SimpleVolumeBind]] = None,
710
+ command: Optional[Union[list[str], str]] = None,
711
+ volumes: Optional[list[SimpleVolumeBind]] = None,
712
712
  ports: Optional[PortMappings] = None,
713
- exposed_ports: Optional[List[str]] = None,
714
- env_vars: Optional[Dict[str, str]] = None,
713
+ exposed_ports: Optional[list[str]] = None,
714
+ env_vars: Optional[dict[str, str]] = None,
715
715
  user: Optional[str] = None,
716
- cap_add: Optional[List[str]] = None,
717
- cap_drop: Optional[List[str]] = None,
718
- security_opt: Optional[List[str]] = None,
716
+ cap_add: Optional[list[str]] = None,
717
+ cap_drop: Optional[list[str]] = None,
718
+ security_opt: Optional[list[str]] = None,
719
719
  network: Optional[str] = None,
720
- dns: Optional[Union[str, List[str]]] = None,
720
+ dns: Optional[Union[str, list[str]]] = None,
721
721
  additional_flags: Optional[str] = None,
722
722
  workdir: Optional[str] = None,
723
723
  privileged: Optional[bool] = None,
724
- labels: Optional[Dict[str, str]] = None,
724
+ labels: Optional[dict[str, str]] = None,
725
725
  platform: Optional[DockerPlatform] = None,
726
- ulimits: Optional[List[Ulimit]] = None,
726
+ ulimits: Optional[list[Ulimit]] = None,
727
727
  init: Optional[bool] = None,
728
728
  log_config: Optional[LogConfig] = None,
729
729
  ) -> str:
@@ -838,26 +838,26 @@ class SdkDockerClient(ContainerClient):
838
838
  interactive: bool = False,
839
839
  tty: bool = False,
840
840
  detach: bool = False,
841
- command: Optional[Union[List[str], str]] = None,
842
- volumes: Optional[List[SimpleVolumeBind]] = None,
841
+ command: Optional[Union[list[str], str]] = None,
842
+ volumes: Optional[list[SimpleVolumeBind]] = None,
843
843
  ports: Optional[PortMappings] = None,
844
- exposed_ports: Optional[List[str]] = None,
845
- env_vars: Optional[Dict[str, str]] = None,
844
+ exposed_ports: Optional[list[str]] = None,
845
+ env_vars: Optional[dict[str, str]] = None,
846
846
  user: Optional[str] = None,
847
- cap_add: Optional[List[str]] = None,
848
- cap_drop: Optional[List[str]] = None,
849
- security_opt: Optional[List[str]] = None,
847
+ cap_add: Optional[list[str]] = None,
848
+ cap_drop: Optional[list[str]] = None,
849
+ security_opt: Optional[list[str]] = None,
850
850
  network: Optional[str] = None,
851
851
  dns: Optional[str] = None,
852
852
  additional_flags: Optional[str] = None,
853
853
  workdir: Optional[str] = None,
854
- labels: Optional[Dict[str, str]] = None,
854
+ labels: Optional[dict[str, str]] = None,
855
855
  platform: Optional[DockerPlatform] = None,
856
856
  privileged: Optional[bool] = None,
857
- ulimits: Optional[List[Ulimit]] = None,
857
+ ulimits: Optional[list[Ulimit]] = None,
858
858
  init: Optional[bool] = None,
859
859
  log_config: Optional[LogConfig] = None,
860
- ) -> Tuple[bytes, bytes]:
860
+ ) -> tuple[bytes, bytes]:
861
861
  LOG.debug("Running container with image: %s", image_name)
862
862
  container = None
863
863
  try:
@@ -903,14 +903,14 @@ class SdkDockerClient(ContainerClient):
903
903
  def exec_in_container(
904
904
  self,
905
905
  container_name_or_id: str,
906
- command: Union[List[str], str],
906
+ command: Union[list[str], str],
907
907
  interactive=False,
908
908
  detach=False,
909
- env_vars: Optional[Dict[str, Optional[str]]] = None,
909
+ env_vars: Optional[dict[str, Optional[str]]] = None,
910
910
  stdin: Optional[bytes] = None,
911
911
  user: Optional[str] = None,
912
912
  workdir: Optional[str] = None,
913
- ) -> Tuple[bytes, bytes]:
913
+ ) -> tuple[bytes, bytes]:
914
914
  LOG.debug("Executing command in container %s: %s", container_name_or_id, command)
915
915
  try:
916
916
  container: Container = self.client().containers.get(container_name_or_id)
@@ -3,7 +3,6 @@ import logging
3
3
  import os
4
4
  import re
5
5
  import threading
6
- from typing import Tuple
7
6
 
8
7
  from cryptography.hazmat.backends import default_backend
9
8
  from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
@@ -105,7 +104,7 @@ def generate_ssl_cert(
105
104
  cert.set_pubkey(k)
106
105
  alt_names = (
107
106
  f"DNS:localhost,DNS:test.localhost.atlassian.io,DNS:localhost.localstack.cloud,DNS:{host_definition.host}IP:127.0.0.1"
108
- ).encode("utf8")
107
+ ).encode()
109
108
  cert.add_extensions(
110
109
  [
111
110
  crypto.X509Extension(b"subjectAltName", False, alt_names),
@@ -165,7 +164,7 @@ def unpad(s: bytes) -> bytes:
165
164
  return s[0 : -s[-1]]
166
165
 
167
166
 
168
- def encrypt(key: bytes, message: bytes, iv: bytes = None, aad: bytes = None) -> Tuple[bytes, bytes]:
167
+ def encrypt(key: bytes, message: bytes, iv: bytes = None, aad: bytes = None) -> tuple[bytes, bytes]:
169
168
  iv = iv or b"0" * BLOCK_SIZE
170
169
  cipher = Cipher(algorithms.AES(key), modes.GCM(iv), backend=default_backend())
171
170
  encryptor = cipher.encryptor()
@@ -3,7 +3,7 @@
3
3
  import inspect
4
4
  import os
5
5
  import socket
6
- from typing import Dict, List, Optional, Union
6
+ from typing import Optional, Union
7
7
 
8
8
  from localstack import config
9
9
  from localstack.constants import DEFAULT_VOLUME_DIR
@@ -41,7 +41,7 @@ ENDPOINT_RESOLVE_LIST = ["localhost.localstack.cloud", "api.localstack.cloud"]
41
41
  INSPECT_DIRECTORIES = [DEFAULT_VOLUME_DIR, "/tmp"]
42
42
 
43
43
 
44
- def get_localstack_logs() -> Dict:
44
+ def get_localstack_logs() -> dict:
45
45
  try:
46
46
  result = DOCKER_CLIENT.get_container_logs(get_main_container_name())
47
47
  except Exception as e:
@@ -50,7 +50,7 @@ def get_localstack_logs() -> Dict:
50
50
  return {"docker": result}
51
51
 
52
52
 
53
- def get_localstack_config() -> Dict:
53
+ def get_localstack_config() -> dict:
54
54
  result = {}
55
55
  for k, v in inspect.getmembers(config):
56
56
  if k in EXCLUDE_CONFIG_KEYS:
@@ -77,14 +77,14 @@ def get_localstack_config() -> Dict:
77
77
  return result
78
78
 
79
79
 
80
- def inspect_main_container() -> Union[str, Dict]:
80
+ def inspect_main_container() -> Union[str, dict]:
81
81
  try:
82
82
  return DOCKER_CLIENT.inspect_container(get_main_container_name())
83
83
  except Exception as e:
84
84
  return f"inspect failed: {e}"
85
85
 
86
86
 
87
- def get_localstack_version() -> Dict[str, Optional[str]]:
87
+ def get_localstack_version() -> dict[str, Optional[str]]:
88
88
  return {
89
89
  "build-date": os.environ.get("LOCALSTACK_BUILD_DATE"),
90
90
  "build-git-hash": os.environ.get("LOCALSTACK_BUILD_GIT_HASH"),
@@ -92,7 +92,7 @@ def get_localstack_version() -> Dict[str, Optional[str]]:
92
92
  }
93
93
 
94
94
 
95
- def resolve_endpoints() -> Dict[str, str]:
95
+ def resolve_endpoints() -> dict[str, str]:
96
96
  result = {}
97
97
  for endpoint in ENDPOINT_RESOLVE_LIST:
98
98
  try:
@@ -103,7 +103,7 @@ def resolve_endpoints() -> Dict[str, str]:
103
103
  return result
104
104
 
105
105
 
106
- def get_important_image_hashes() -> Dict[str, str]:
106
+ def get_important_image_hashes() -> dict[str, str]:
107
107
  result = {}
108
108
  for image in DIAGNOSE_IMAGES:
109
109
  try:
@@ -116,17 +116,17 @@ def get_important_image_hashes() -> Dict[str, str]:
116
116
  return result
117
117
 
118
118
 
119
- def get_service_stats() -> Dict[str, str]:
119
+ def get_service_stats() -> dict[str, str]:
120
120
  from localstack.services.plugins import SERVICE_PLUGINS
121
121
 
122
122
  return {service: state.value for service, state in SERVICE_PLUGINS.get_states().items()}
123
123
 
124
124
 
125
- def get_file_tree() -> Dict[str, List[str]]:
125
+ def get_file_tree() -> dict[str, list[str]]:
126
126
  return {d: traverse_file_tree(d) for d in INSPECT_DIRECTORIES}
127
127
 
128
128
 
129
- def traverse_file_tree(root: str) -> List[str]:
129
+ def traverse_file_tree(root: str) -> list[str]:
130
130
  try:
131
131
  result = []
132
132
  if config.in_docker():
@@ -137,7 +137,7 @@ def traverse_file_tree(root: str) -> List[str]:
137
137
  return ["traversing files failed %s" % e]
138
138
 
139
139
 
140
- def get_docker_image_details() -> Dict[str, str]:
140
+ def get_docker_image_details() -> dict[str, str]:
141
141
  try:
142
142
  image = DOCKER_CLIENT.inspect_container(get_main_container_name())["Config"]["Image"]
143
143
  except ContainerException:
@@ -2,7 +2,7 @@ import functools
2
2
  import logging
3
3
  import platform
4
4
  import random
5
- from typing import List, Optional, Union
5
+ from typing import Optional, Union
6
6
 
7
7
  from localstack import config
8
8
  from localstack.constants import DEFAULT_VOLUME_DIR, DOCKER_IMAGE_NAME
@@ -74,11 +74,11 @@ def get_current_container_id() -> str:
74
74
  return container_id
75
75
 
76
76
 
77
- def inspect_current_container_mounts() -> List[VolumeInfo]:
77
+ def inspect_current_container_mounts() -> list[VolumeInfo]:
78
78
  return DOCKER_CLIENT.inspect_container_volumes(get_current_container_id())
79
79
 
80
80
 
81
- @functools.lru_cache()
81
+ @functools.lru_cache
82
82
  def get_default_volume_dir_mount() -> Optional[VolumeInfo]:
83
83
  """
84
84
  Returns the volume information of LocalStack's DEFAULT_VOLUME_DIR (/var/lib/localstack), if mounted,
@@ -132,7 +132,7 @@ def get_host_path_for_path_in_docker(path):
132
132
 
133
133
 
134
134
  def container_ports_can_be_bound(
135
- ports: Union[IntOrPort, List[IntOrPort]],
135
+ ports: Union[IntOrPort, list[IntOrPort]],
136
136
  address: Optional[str] = None,
137
137
  ) -> bool:
138
138
  """Determine whether a given list of ports can be bound by Docker containers
localstack/utils/files.py CHANGED
@@ -6,13 +6,12 @@ import shutil
6
6
  import stat
7
7
  import tempfile
8
8
  from pathlib import Path
9
- from typing import Dict
10
9
 
11
10
  LOG = logging.getLogger(__name__)
12
11
  TMP_FILES = []
13
12
 
14
13
 
15
- def parse_config_file(file_or_str: str, single_section: bool = True) -> Dict:
14
+ def parse_config_file(file_or_str: str, single_section: bool = True) -> dict:
16
15
  """Parse the given properties config file/string and return a dict of section->key->value.
17
16
  If the config contains a single section, and 'single_section' is True, returns"""
18
17
 
@@ -3,7 +3,7 @@
3
3
  import functools
4
4
  import inspect
5
5
  import logging
6
- from typing import Any, Callable, Dict, Optional, Tuple
6
+ from typing import Any, Callable, Optional
7
7
 
8
8
  LOG = logging.getLogger(__name__)
9
9
 
@@ -19,7 +19,7 @@ def run_safe(_python_lambda, *args, _default=None, **kwargs):
19
19
 
20
20
 
21
21
  def call_safe(
22
- func: Callable, args: Tuple = None, kwargs: Dict = None, exception_message: str = None
22
+ func: Callable, args: tuple = None, kwargs: dict = None, exception_message: str = None
23
23
  ) -> Optional[Any]:
24
24
  """
25
25
  Call the given function with the given arguments, and if it fails, log the given exception_message.
localstack/utils/http.py CHANGED
@@ -2,7 +2,7 @@ import logging
2
2
  import math
3
3
  import os
4
4
  import re
5
- from typing import Dict, Optional, Union
5
+ from typing import Optional, Union
6
6
  from urllib.parse import parse_qs, parse_qsl, urlencode, urlparse, urlunparse
7
7
 
8
8
  import requests
@@ -54,7 +54,7 @@ def create_chunked_data(data, chunk_size: int = 80):
54
54
  return ret
55
55
 
56
56
 
57
- def canonicalize_headers(headers: Union[Dict, CaseInsensitiveDict]) -> Dict:
57
+ def canonicalize_headers(headers: Union[dict, CaseInsensitiveDict]) -> dict:
58
58
  if not headers:
59
59
  return headers
60
60
 
@@ -76,7 +76,7 @@ def add_path_parameters_to_url(uri: str, path_params: list):
76
76
  return urlunparse(url._replace(path=new_path))
77
77
 
78
78
 
79
- def add_query_params_to_url(uri: str, query_params: Dict) -> str:
79
+ def add_query_params_to_url(uri: str, query_params: dict) -> str:
80
80
  """
81
81
  Add query parameters to the uri.
82
82
  :param uri: the base uri it can contains path arguments and query parameters
@@ -103,7 +103,7 @@ def add_query_params_to_url(uri: str, query_params: Dict) -> str:
103
103
 
104
104
 
105
105
  def make_http_request(
106
- url: str, data: Union[bytes, str] = None, headers: Dict[str, str] = None, method: str = "GET"
106
+ url: str, data: Union[bytes, str] = None, headers: dict[str, str] = None, method: str = "GET"
107
107
  ) -> Response:
108
108
  return requests.request(
109
109
  url=url, method=method, headers=headers, data=data, auth=NetrcBypassAuth(), verify=False
@@ -141,7 +141,7 @@ class _RequestsSafe:
141
141
  safe_requests = _RequestsSafe()
142
142
 
143
143
 
144
- def parse_request_data(method: str, path: str, data=None, headers=None) -> Dict:
144
+ def parse_request_data(method: str, path: str, data=None, headers=None) -> dict:
145
145
  """Extract request data either from query string as well as request body (e.g., for POST)."""
146
146
  result = {}
147
147
  headers = headers or {}
@@ -165,7 +165,7 @@ def parse_request_data(method: str, path: str, data=None, headers=None) -> Dict:
165
165
  return result
166
166
 
167
167
 
168
- def get_proxies() -> Dict[str, str]:
168
+ def get_proxies() -> dict[str, str]:
169
169
  proxy_map = {}
170
170
  if config.OUTBOUND_HTTP_PROXY:
171
171
  proxy_map["http"] = config.OUTBOUND_HTTP_PROXY
@@ -6,7 +6,8 @@ some of its functionality.
6
6
  import ipaddress
7
7
  import json
8
8
  import subprocess as sp
9
- from typing import Any, Generator, TypedDict
9
+ from collections.abc import Generator
10
+ from typing import Any, TypedDict
10
11
 
11
12
  from cachetools import TTLCache, cached
12
13
 
localstack/utils/json.py CHANGED
@@ -78,7 +78,7 @@ class FileMappedDocument(dict):
78
78
  if os.path.isdir(self.path):
79
79
  raise IsADirectoryError
80
80
 
81
- with open(self.path, "r") as fd:
81
+ with open(self.path) as fd:
82
82
  self.update(json.load(fd))
83
83
 
84
84
  def save(self):
localstack/utils/net.py CHANGED
@@ -3,8 +3,9 @@ import random
3
3
  import re
4
4
  import socket
5
5
  import threading
6
+ from collections.abc import MutableMapping
6
7
  from contextlib import closing
7
- from typing import Any, List, MutableMapping, NamedTuple, Optional, Union
8
+ from typing import Any, NamedTuple, Optional, Union
8
9
  from urllib.parse import urlparse
9
10
 
10
11
  import dns.resolver
@@ -56,7 +57,7 @@ def is_port_open(
56
57
  port_or_url: Union[int, str],
57
58
  http_path: str = None,
58
59
  expect_success: bool = True,
59
- protocols: Optional[Union[str, List[str]]] = None,
60
+ protocols: Optional[Union[str, list[str]]] = None,
60
61
  quiet: bool = True,
61
62
  ):
62
63
  from localstack.utils.http import safe_requests
@@ -92,7 +93,7 @@ def is_port_open(
92
93
  answers = resolver.query("google.com", "A")
93
94
  assert len(answers) > 0
94
95
  else:
95
- sock.sendto(bytes(), (host, port))
96
+ sock.sendto(b"", (host, port))
96
97
  sock.recvfrom(1024)
97
98
  except Exception:
98
99
  if not quiet:
@@ -190,7 +191,7 @@ def port_can_be_bound(port: IntOrPort, address: str = "") -> bool:
190
191
  return False
191
192
 
192
193
 
193
- def get_free_udp_port(blocklist: List[int] = None) -> int:
194
+ def get_free_udp_port(blocklist: list[int] = None) -> int:
194
195
  blocklist = blocklist or []
195
196
  for i in range(10):
196
197
  udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
@@ -202,7 +203,7 @@ def get_free_udp_port(blocklist: List[int] = None) -> int:
202
203
  raise Exception(f"Unable to determine free UDP port with blocklist {blocklist}")
203
204
 
204
205
 
205
- def get_free_tcp_port(blocklist: List[int] = None) -> int:
206
+ def get_free_tcp_port(blocklist: list[int] = None) -> int:
206
207
  """
207
208
  Tries to bind a socket to port 0 and returns the port that was assigned by the system. If the port is
208
209
  in the given ``blocklist``, or the port is marked as reserved in ``dynamic_port_range``, the procedure
@@ -272,7 +273,7 @@ def resolve_hostname(hostname: str) -> Optional[str]:
272
273
  """Resolve the given hostname and return its IP address, or None if it cannot be resolved."""
273
274
  try:
274
275
  return socket.gethostbyname(hostname)
275
- except socket.error:
276
+ except OSError:
276
277
  return None
277
278
 
278
279
 
@@ -280,7 +281,7 @@ def is_ip_address(addr: str) -> bool:
280
281
  try:
281
282
  socket.inet_aton(addr)
282
283
  return True
283
- except socket.error:
284
+ except OSError:
284
285
  return False
285
286
 
286
287
 
@@ -468,9 +469,9 @@ def get_docker_host_from_container() -> str:
468
469
  if config.is_in_docker:
469
470
  try:
470
471
  result = socket.gethostbyname("host.docker.internal")
471
- except socket.error:
472
+ except OSError:
472
473
  result = socket.gethostbyname("host.containers.internal")
473
- except socket.error:
474
+ except OSError:
474
475
  # TODO if neither host resolves, we might be in linux. We could just use the default gateway then
475
476
  pass
476
477
  return result
@@ -1,12 +1,12 @@
1
1
  import functools
2
2
  import re
3
3
  import threading
4
- from typing import Any, Callable, Dict, Generic, List, Optional, Set, Type, TypeVar, Union
4
+ from typing import Any, Callable, Generic, Optional, TypeVar, Union
5
5
 
6
6
  from .collections import ensure_list
7
7
  from .strings import first_char_to_lower, first_char_to_upper
8
8
 
9
- ComplexType = Union[List, Dict, object]
9
+ ComplexType = Union[list, dict, object]
10
10
 
11
11
  _T = TypeVar("_T")
12
12
 
@@ -83,7 +83,7 @@ class SubtypesInstanceManager:
83
83
  """Simple instance manager base class that scans the subclasses of a base type for concrete named
84
84
  implementations, and lazily creates and returns (singleton) instances on demand."""
85
85
 
86
- _instances: Dict[str, "SubtypesInstanceManager"]
86
+ _instances: dict[str, "SubtypesInstanceManager"]
87
87
 
88
88
  @classmethod
89
89
  def get(cls, subtype_name: str, raise_if_missing: bool = True):
@@ -104,7 +104,7 @@ class SubtypesInstanceManager:
104
104
  return instance
105
105
 
106
106
  @classmethod
107
- def instances(cls) -> Dict[str, "SubtypesInstanceManager"]:
107
+ def instances(cls) -> dict[str, "SubtypesInstanceManager"]:
108
108
  base_type = cls.get_base_type()
109
109
  if not hasattr(base_type, "_instances"):
110
110
  base_type._instances = {}
@@ -116,13 +116,13 @@ class SubtypesInstanceManager:
116
116
  raise NotImplementedError
117
117
 
118
118
  @classmethod
119
- def get_base_type(cls) -> Type:
119
+ def get_base_type(cls) -> type:
120
120
  """Get the base class for which instances are being managed - can be customized by subtypes."""
121
121
  return cls
122
122
 
123
123
 
124
124
  # this requires that all subclasses have been imported before(!)
125
- def get_all_subclasses(clazz: Type) -> Set[Type]:
125
+ def get_all_subclasses(clazz: type) -> set[type]:
126
126
  """Recursively get all subclasses of the given class."""
127
127
  result = set()
128
128
  subs = clazz.__subclasses__()
@@ -132,7 +132,7 @@ def get_all_subclasses(clazz: Type) -> Set[Type]:
132
132
  return result
133
133
 
134
134
 
135
- def fully_qualified_class_name(klass: Type) -> str:
135
+ def fully_qualified_class_name(klass: type) -> str:
136
136
  return f"{klass.__module__}.{klass.__name__}"
137
137
 
138
138
 
@@ -156,7 +156,7 @@ def recurse_object(obj: ComplexType, func: Callable, path: str = "") -> ComplexT
156
156
 
157
157
 
158
158
  def keys_to(
159
- obj: ComplexType, op: Callable[[str], str], skip_children_of: List[str] = None
159
+ obj: ComplexType, op: Callable[[str], str], skip_children_of: list[str] = None
160
160
  ) -> ComplexType:
161
161
  """Recursively changes all dict keys to apply op. Skip children
162
162
  of any elements whose names are contained in skip_children_of (e.g., ['Tags'])"""
@@ -175,11 +175,11 @@ def keys_to(
175
175
  return result
176
176
 
177
177
 
178
- def keys_to_lower(obj: ComplexType, skip_children_of: List[str] = None) -> ComplexType:
178
+ def keys_to_lower(obj: ComplexType, skip_children_of: list[str] = None) -> ComplexType:
179
179
  return keys_to(obj, first_char_to_lower, skip_children_of)
180
180
 
181
181
 
182
- def keys_to_upper(obj: ComplexType, skip_children_of: List[str] = None) -> ComplexType:
182
+ def keys_to_upper(obj: ComplexType, skip_children_of: list[str] = None) -> ComplexType:
183
183
  return keys_to(obj, first_char_to_upper, skip_children_of)
184
184
 
185
185
 
localstack/utils/patch.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import functools
2
2
  import inspect
3
3
  import types
4
- from typing import Any, Callable, List, Type
4
+ from typing import Any, Callable
5
5
 
6
6
 
7
7
  def get_defining_object(method):
@@ -71,7 +71,7 @@ def create_patch_proxy(target: Callable, new: Callable):
71
71
 
72
72
 
73
73
  class Patch:
74
- applied_patches: List["Patch"] = []
74
+ applied_patches: list["Patch"] = []
75
75
  """Bookkeeping for patches that are applied. You can use this to debug patches. For instance,
76
76
  you could write something like::
77
77
 
@@ -120,7 +120,7 @@ class Patch:
120
120
  return self
121
121
 
122
122
  @staticmethod
123
- def extend_class(target: Type, fn: Callable):
123
+ def extend_class(target: type, fn: Callable):
124
124
  def _getattr(obj, name):
125
125
  if name != fn.__name__:
126
126
  raise AttributeError(f"`{target.__name__}` object has no attribute `{name}`")
@@ -164,9 +164,9 @@ class Patch:
164
164
 
165
165
 
166
166
  class Patches:
167
- patches: List[Patch]
167
+ patches: list[Patch]
168
168
 
169
- def __init__(self, patches: List[Patch] = None) -> None:
169
+ def __init__(self, patches: list[Patch] = None) -> None:
170
170
  super().__init__()
171
171
 
172
172
  self.patches = []
@@ -14,14 +14,14 @@ def is_windows() -> bool:
14
14
  return "windows" == platform.system().lower()
15
15
 
16
16
 
17
- @lru_cache()
17
+ @lru_cache
18
18
  def is_debian() -> bool:
19
19
  from localstack.utils.files import load_file
20
20
 
21
21
  return "Debian" in load_file("/etc/issue", "")
22
22
 
23
23
 
24
- @lru_cache()
24
+ @lru_cache
25
25
  def is_redhat() -> bool:
26
26
  from localstack.utils.files import load_file
27
27