toil 7.0.0__py3-none-any.whl → 8.0.0__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 (190) hide show
  1. toil/__init__.py +121 -83
  2. toil/batchSystems/__init__.py +1 -0
  3. toil/batchSystems/abstractBatchSystem.py +137 -77
  4. toil/batchSystems/abstractGridEngineBatchSystem.py +211 -101
  5. toil/batchSystems/awsBatch.py +237 -128
  6. toil/batchSystems/cleanup_support.py +22 -16
  7. toil/batchSystems/contained_executor.py +30 -26
  8. toil/batchSystems/gridengine.py +85 -49
  9. toil/batchSystems/htcondor.py +164 -87
  10. toil/batchSystems/kubernetes.py +622 -386
  11. toil/batchSystems/local_support.py +17 -12
  12. toil/batchSystems/lsf.py +132 -79
  13. toil/batchSystems/lsfHelper.py +13 -11
  14. toil/batchSystems/mesos/__init__.py +41 -29
  15. toil/batchSystems/mesos/batchSystem.py +288 -149
  16. toil/batchSystems/mesos/executor.py +77 -49
  17. toil/batchSystems/mesos/test/__init__.py +31 -23
  18. toil/batchSystems/options.py +38 -29
  19. toil/batchSystems/registry.py +53 -19
  20. toil/batchSystems/singleMachine.py +293 -123
  21. toil/batchSystems/slurm.py +489 -137
  22. toil/batchSystems/torque.py +46 -32
  23. toil/bus.py +141 -73
  24. toil/common.py +630 -359
  25. toil/cwl/__init__.py +1 -1
  26. toil/cwl/cwltoil.py +1114 -532
  27. toil/cwl/utils.py +17 -22
  28. toil/deferred.py +62 -41
  29. toil/exceptions.py +5 -3
  30. toil/fileStores/__init__.py +5 -5
  31. toil/fileStores/abstractFileStore.py +88 -57
  32. toil/fileStores/cachingFileStore.py +711 -247
  33. toil/fileStores/nonCachingFileStore.py +113 -75
  34. toil/job.py +988 -315
  35. toil/jobStores/abstractJobStore.py +387 -243
  36. toil/jobStores/aws/jobStore.py +727 -403
  37. toil/jobStores/aws/utils.py +161 -109
  38. toil/jobStores/conftest.py +1 -0
  39. toil/jobStores/fileJobStore.py +289 -151
  40. toil/jobStores/googleJobStore.py +137 -70
  41. toil/jobStores/utils.py +36 -15
  42. toil/leader.py +614 -269
  43. toil/lib/accelerators.py +115 -18
  44. toil/lib/aws/__init__.py +55 -28
  45. toil/lib/aws/ami.py +122 -87
  46. toil/lib/aws/iam.py +284 -108
  47. toil/lib/aws/s3.py +31 -0
  48. toil/lib/aws/session.py +193 -58
  49. toil/lib/aws/utils.py +238 -218
  50. toil/lib/bioio.py +13 -5
  51. toil/lib/compatibility.py +11 -6
  52. toil/lib/conversions.py +83 -49
  53. toil/lib/docker.py +131 -103
  54. toil/lib/ec2.py +322 -209
  55. toil/lib/ec2nodes.py +174 -106
  56. toil/lib/encryption/_dummy.py +5 -3
  57. toil/lib/encryption/_nacl.py +10 -6
  58. toil/lib/encryption/conftest.py +1 -0
  59. toil/lib/exceptions.py +26 -7
  60. toil/lib/expando.py +4 -2
  61. toil/lib/ftp_utils.py +217 -0
  62. toil/lib/generatedEC2Lists.py +127 -19
  63. toil/lib/humanize.py +6 -2
  64. toil/lib/integration.py +341 -0
  65. toil/lib/io.py +99 -11
  66. toil/lib/iterables.py +4 -2
  67. toil/lib/memoize.py +12 -8
  68. toil/lib/misc.py +65 -18
  69. toil/lib/objects.py +2 -2
  70. toil/lib/resources.py +19 -7
  71. toil/lib/retry.py +115 -77
  72. toil/lib/threading.py +282 -80
  73. toil/lib/throttle.py +15 -14
  74. toil/options/common.py +834 -401
  75. toil/options/cwl.py +175 -90
  76. toil/options/runner.py +50 -0
  77. toil/options/wdl.py +70 -19
  78. toil/provisioners/__init__.py +111 -46
  79. toil/provisioners/abstractProvisioner.py +322 -157
  80. toil/provisioners/aws/__init__.py +62 -30
  81. toil/provisioners/aws/awsProvisioner.py +980 -627
  82. toil/provisioners/clusterScaler.py +541 -279
  83. toil/provisioners/gceProvisioner.py +282 -179
  84. toil/provisioners/node.py +147 -79
  85. toil/realtimeLogger.py +34 -22
  86. toil/resource.py +137 -75
  87. toil/server/app.py +127 -61
  88. toil/server/celery_app.py +3 -1
  89. toil/server/cli/wes_cwl_runner.py +82 -53
  90. toil/server/utils.py +54 -28
  91. toil/server/wes/abstract_backend.py +64 -26
  92. toil/server/wes/amazon_wes_utils.py +21 -15
  93. toil/server/wes/tasks.py +121 -63
  94. toil/server/wes/toil_backend.py +142 -107
  95. toil/server/wsgi_app.py +4 -3
  96. toil/serviceManager.py +58 -22
  97. toil/statsAndLogging.py +148 -64
  98. toil/test/__init__.py +263 -179
  99. toil/test/batchSystems/batchSystemTest.py +438 -195
  100. toil/test/batchSystems/batch_system_plugin_test.py +18 -7
  101. toil/test/batchSystems/test_gridengine.py +173 -0
  102. toil/test/batchSystems/test_lsf_helper.py +67 -58
  103. toil/test/batchSystems/test_slurm.py +93 -47
  104. toil/test/cactus/test_cactus_integration.py +20 -22
  105. toil/test/cwl/cwlTest.py +271 -71
  106. toil/test/cwl/measure_default_memory.cwl +12 -0
  107. toil/test/cwl/not_run_required_input.cwl +29 -0
  108. toil/test/cwl/scatter_duplicate_outputs.cwl +40 -0
  109. toil/test/docs/scriptsTest.py +60 -34
  110. toil/test/jobStores/jobStoreTest.py +412 -235
  111. toil/test/lib/aws/test_iam.py +116 -48
  112. toil/test/lib/aws/test_s3.py +16 -9
  113. toil/test/lib/aws/test_utils.py +5 -6
  114. toil/test/lib/dockerTest.py +118 -141
  115. toil/test/lib/test_conversions.py +113 -115
  116. toil/test/lib/test_ec2.py +57 -49
  117. toil/test/lib/test_integration.py +104 -0
  118. toil/test/lib/test_misc.py +12 -5
  119. toil/test/mesos/MesosDataStructuresTest.py +23 -10
  120. toil/test/mesos/helloWorld.py +7 -6
  121. toil/test/mesos/stress.py +25 -20
  122. toil/test/options/options.py +7 -2
  123. toil/test/provisioners/aws/awsProvisionerTest.py +293 -140
  124. toil/test/provisioners/clusterScalerTest.py +440 -250
  125. toil/test/provisioners/clusterTest.py +81 -42
  126. toil/test/provisioners/gceProvisionerTest.py +174 -100
  127. toil/test/provisioners/provisionerTest.py +25 -13
  128. toil/test/provisioners/restartScript.py +5 -4
  129. toil/test/server/serverTest.py +188 -141
  130. toil/test/sort/restart_sort.py +137 -68
  131. toil/test/sort/sort.py +134 -66
  132. toil/test/sort/sortTest.py +91 -49
  133. toil/test/src/autoDeploymentTest.py +140 -100
  134. toil/test/src/busTest.py +20 -18
  135. toil/test/src/checkpointTest.py +8 -2
  136. toil/test/src/deferredFunctionTest.py +49 -35
  137. toil/test/src/dockerCheckTest.py +33 -26
  138. toil/test/src/environmentTest.py +20 -10
  139. toil/test/src/fileStoreTest.py +538 -271
  140. toil/test/src/helloWorldTest.py +7 -4
  141. toil/test/src/importExportFileTest.py +61 -31
  142. toil/test/src/jobDescriptionTest.py +32 -17
  143. toil/test/src/jobEncapsulationTest.py +2 -0
  144. toil/test/src/jobFileStoreTest.py +74 -50
  145. toil/test/src/jobServiceTest.py +187 -73
  146. toil/test/src/jobTest.py +120 -70
  147. toil/test/src/miscTests.py +19 -18
  148. toil/test/src/promisedRequirementTest.py +82 -36
  149. toil/test/src/promisesTest.py +7 -6
  150. toil/test/src/realtimeLoggerTest.py +6 -6
  151. toil/test/src/regularLogTest.py +71 -37
  152. toil/test/src/resourceTest.py +80 -49
  153. toil/test/src/restartDAGTest.py +36 -22
  154. toil/test/src/resumabilityTest.py +9 -2
  155. toil/test/src/retainTempDirTest.py +45 -14
  156. toil/test/src/systemTest.py +12 -8
  157. toil/test/src/threadingTest.py +44 -25
  158. toil/test/src/toilContextManagerTest.py +10 -7
  159. toil/test/src/userDefinedJobArgTypeTest.py +8 -5
  160. toil/test/src/workerTest.py +33 -16
  161. toil/test/utils/toilDebugTest.py +70 -58
  162. toil/test/utils/toilKillTest.py +4 -5
  163. toil/test/utils/utilsTest.py +239 -102
  164. toil/test/wdl/wdltoil_test.py +789 -148
  165. toil/test/wdl/wdltoil_test_kubernetes.py +37 -23
  166. toil/toilState.py +52 -26
  167. toil/utils/toilConfig.py +13 -4
  168. toil/utils/toilDebugFile.py +44 -27
  169. toil/utils/toilDebugJob.py +85 -25
  170. toil/utils/toilDestroyCluster.py +11 -6
  171. toil/utils/toilKill.py +8 -3
  172. toil/utils/toilLaunchCluster.py +251 -145
  173. toil/utils/toilMain.py +37 -16
  174. toil/utils/toilRsyncCluster.py +27 -14
  175. toil/utils/toilSshCluster.py +45 -22
  176. toil/utils/toilStats.py +75 -36
  177. toil/utils/toilStatus.py +226 -119
  178. toil/utils/toilUpdateEC2Instances.py +3 -1
  179. toil/version.py +11 -11
  180. toil/wdl/utils.py +5 -5
  181. toil/wdl/wdltoil.py +3513 -1052
  182. toil/worker.py +269 -128
  183. toil-8.0.0.dist-info/METADATA +173 -0
  184. toil-8.0.0.dist-info/RECORD +253 -0
  185. {toil-7.0.0.dist-info → toil-8.0.0.dist-info}/WHEEL +1 -1
  186. toil-7.0.0.dist-info/METADATA +0 -158
  187. toil-7.0.0.dist-info/RECORD +0 -244
  188. {toil-7.0.0.dist-info → toil-8.0.0.dist-info}/LICENSE +0 -0
  189. {toil-7.0.0.dist-info → toil-8.0.0.dist-info}/entry_points.txt +0 -0
  190. {toil-7.0.0.dist-info → toil-8.0.0.dist-info}/top_level.txt +0 -0
toil/lib/aws/session.py CHANGED
@@ -15,7 +15,7 @@ import collections
15
15
  import logging
16
16
  import os
17
17
  import threading
18
- from typing import Dict, Optional, Tuple, cast, Union, Literal, overload, TypeVar
18
+ from typing import TYPE_CHECKING, Literal, Optional, cast, overload
19
19
 
20
20
  import boto3
21
21
  import boto3.resources.base
@@ -24,12 +24,14 @@ from boto3 import Session
24
24
  from botocore.client import Config
25
25
  from botocore.session import get_session
26
26
  from botocore.utils import JSONFileCache
27
- from mypy_boto3_autoscaling import AutoScalingClient
28
- from mypy_boto3_ec2 import EC2Client, EC2ServiceResource
29
- from mypy_boto3_iam import IAMClient, IAMServiceResource
30
- from mypy_boto3_s3 import S3Client, S3ServiceResource
31
- from mypy_boto3_sdb import SimpleDBClient
32
- from mypy_boto3_sts import STSClient
27
+
28
+ if TYPE_CHECKING:
29
+ from mypy_boto3_autoscaling import AutoScalingClient
30
+ from mypy_boto3_ec2 import EC2Client, EC2ServiceResource
31
+ from mypy_boto3_iam import IAMClient, IAMServiceResource
32
+ from mypy_boto3_s3 import S3Client, S3ServiceResource
33
+ from mypy_boto3_sdb import SimpleDBClient
34
+ from mypy_boto3_sts import STSClient
33
35
 
34
36
  logger = logging.getLogger(__name__)
35
37
 
@@ -49,6 +51,7 @@ logger = logging.getLogger(__name__)
49
51
  # initializing Boto3 (or Boto2) things at a time.
50
52
  _init_lock = threading.RLock()
51
53
 
54
+
52
55
  def _new_boto3_session(region_name: Optional[str] = None) -> Session:
53
56
  """
54
57
  This is the One True Place where new Boto3 sessions should be made, and
@@ -64,10 +67,16 @@ def _new_boto3_session(region_name: Optional[str] = None) -> Session:
64
67
 
65
68
  with _init_lock:
66
69
  botocore_session = get_session()
67
- botocore_session.get_component('credential_provider').get_provider(
68
- 'assume-role').cache = JSONFileCache()
70
+ botocore_session.get_component("credential_provider").get_provider(
71
+ "assume-role"
72
+ ).cache = JSONFileCache()
73
+
74
+ return Session(
75
+ botocore_session=botocore_session,
76
+ region_name=region_name,
77
+ profile_name=os.environ.get("TOIL_AWS_PROFILE", None),
78
+ )
69
79
 
70
- return Session(botocore_session=botocore_session, region_name=region_name, profile_name=os.environ.get("TOIL_AWS_PROFILE", None))
71
80
 
72
81
  class AWSConnectionManager:
73
82
  """
@@ -103,36 +112,64 @@ class AWSConnectionManager:
103
112
  """
104
113
  # This stores Boto3 sessions in .item of a thread-local storage, by
105
114
  # region.
106
- self.sessions_by_region: Dict[Optional[str], threading.local] = collections.defaultdict(threading.local)
115
+ self.sessions_by_region: dict[Optional[str], threading.local] = (
116
+ collections.defaultdict(threading.local)
117
+ )
107
118
  # This stores Boto3 resources in .item of a thread-local storage, by
108
119
  # (region, service name, endpoint URL) tuples
109
- self.resource_cache: Dict[Tuple[Optional[str], str, Optional[str]], threading.local] = collections.defaultdict(threading.local)
120
+ self.resource_cache: dict[
121
+ tuple[Optional[str], str, Optional[str]], threading.local
122
+ ] = collections.defaultdict(threading.local)
110
123
  # This stores Boto3 clients in .item of a thread-local storage, by
111
124
  # (region, service name, endpoint URL) tuples
112
- self.client_cache: Dict[Tuple[Optional[str], str, Optional[str]], threading.local] = collections.defaultdict(threading.local)
125
+ self.client_cache: dict[
126
+ tuple[Optional[str], str, Optional[str]], threading.local
127
+ ] = collections.defaultdict(threading.local)
113
128
  # This stores Boto 2 connections in .item of a thread-local storage, by
114
129
  # (region, service name) tuples.
115
- self.boto2_cache: Dict[Tuple[Optional[str], str], threading.local] = collections.defaultdict(threading.local)
130
+ self.boto2_cache: dict[tuple[Optional[str], str], threading.local] = (
131
+ collections.defaultdict(threading.local)
132
+ )
116
133
 
117
134
  def session(self, region: Optional[str]) -> boto3.session.Session:
118
135
  """
119
136
  Get the Boto3 Session to use for the given region.
120
137
  """
121
138
  storage = self.sessions_by_region[region]
122
- if not hasattr(storage, 'item'):
139
+ if not hasattr(storage, "item"):
123
140
  # This is the first time this thread wants to talk to this region
124
141
  # through this manager
125
142
  storage.item = _new_boto3_session(region_name=region)
126
143
  return cast(boto3.session.Session, storage.item)
127
144
 
128
145
  @overload
129
- def resource(self, region: Optional[str], service_name: Literal["s3"], endpoint_url: Optional[str] = None) -> S3ServiceResource: ...
146
+ def resource(
147
+ self,
148
+ region: Optional[str],
149
+ service_name: Literal["s3"],
150
+ endpoint_url: Optional[str] = None,
151
+ ) -> "S3ServiceResource": ...
130
152
  @overload
131
- def resource(self, region: Optional[str], service_name: Literal["iam"], endpoint_url: Optional[str] = None) -> IAMServiceResource: ...
153
+ def resource(
154
+ self,
155
+ region: Optional[str],
156
+ service_name: Literal["iam"],
157
+ endpoint_url: Optional[str] = None,
158
+ ) -> "IAMServiceResource": ...
132
159
  @overload
133
- def resource(self, region: Optional[str], service_name: Literal["ec2"], endpoint_url: Optional[str] = None) -> EC2ServiceResource: ...
134
-
135
- def resource(self, region: Optional[str], service_name: str, endpoint_url: Optional[str] = None) -> boto3.resources.base.ServiceResource:
160
+ def resource(
161
+ self,
162
+ region: Optional[str],
163
+ service_name: Literal["ec2"],
164
+ endpoint_url: Optional[str] = None,
165
+ ) -> "EC2ServiceResource": ...
166
+
167
+ def resource(
168
+ self,
169
+ region: Optional[str],
170
+ service_name: str,
171
+ endpoint_url: Optional[str] = None,
172
+ ) -> boto3.resources.base.ServiceResource:
136
173
  """
137
174
  Get the Boto3 Resource to use with the given service (like 'ec2') in the given region.
138
175
 
@@ -141,7 +178,7 @@ class AWSConnectionManager:
141
178
  """
142
179
  key = (region, service_name, endpoint_url)
143
180
  storage = self.resource_cache[key]
144
- if not hasattr(storage, 'item'):
181
+ if not hasattr(storage, "item"):
145
182
  with _init_lock:
146
183
  # We lock inside the if check; we don't care if the memoization
147
184
  # sometimes results in multiple different copies leaking out.
@@ -151,35 +188,69 @@ class AWSConnectionManager:
151
188
  # The Boto3 stubs are missing an overload for `resource` that takes
152
189
  # a non-literal string. See
153
190
  # <https://github.com/vemel/mypy_boto3_builder/issues/121#issuecomment-1011322636>
154
- storage.item = self.session(region).resource(service_name, endpoint_url=endpoint_url) # type: ignore
191
+ storage.item = self.session(region).resource(service_name, endpoint_url=endpoint_url) # type: ignore
155
192
  else:
156
193
  # We might not be able to pass None to Boto3 and have it be the same as no argument.
157
- storage.item = self.session(region).resource(service_name) # type: ignore
194
+ storage.item = self.session(region).resource(service_name) # type: ignore
158
195
 
159
196
  return cast(boto3.resources.base.ServiceResource, storage.item)
160
197
 
161
198
  @overload
162
- def client(self, region: Optional[str], service_name: Literal["ec2"], endpoint_url: Optional[str] = None,
163
- config: Optional[Config] = None) -> EC2Client: ...
199
+ def client(
200
+ self,
201
+ region: Optional[str],
202
+ service_name: Literal["ec2"],
203
+ endpoint_url: Optional[str] = None,
204
+ config: Optional[Config] = None,
205
+ ) -> "EC2Client": ...
164
206
  @overload
165
- def client(self, region: Optional[str], service_name: Literal["iam"], endpoint_url: Optional[str] = None,
166
- config: Optional[Config] = None) -> IAMClient: ...
207
+ def client(
208
+ self,
209
+ region: Optional[str],
210
+ service_name: Literal["iam"],
211
+ endpoint_url: Optional[str] = None,
212
+ config: Optional[Config] = None,
213
+ ) -> "IAMClient": ...
167
214
  @overload
168
- def client(self, region: Optional[str], service_name: Literal["s3"], endpoint_url: Optional[str] = None,
169
- config: Optional[Config] = None) -> S3Client: ...
215
+ def client(
216
+ self,
217
+ region: Optional[str],
218
+ service_name: Literal["s3"],
219
+ endpoint_url: Optional[str] = None,
220
+ config: Optional[Config] = None,
221
+ ) -> "S3Client": ...
170
222
  @overload
171
- def client(self, region: Optional[str], service_name: Literal["sts"], endpoint_url: Optional[str] = None,
172
- config: Optional[Config] = None) -> STSClient: ...
223
+ def client(
224
+ self,
225
+ region: Optional[str],
226
+ service_name: Literal["sts"],
227
+ endpoint_url: Optional[str] = None,
228
+ config: Optional[Config] = None,
229
+ ) -> "STSClient": ...
173
230
  @overload
174
- def client(self, region: Optional[str], service_name: Literal["sdb"], endpoint_url: Optional[str] = None,
175
- config: Optional[Config] = None) -> SimpleDBClient: ...
231
+ def client(
232
+ self,
233
+ region: Optional[str],
234
+ service_name: Literal["sdb"],
235
+ endpoint_url: Optional[str] = None,
236
+ config: Optional[Config] = None,
237
+ ) -> "SimpleDBClient": ...
176
238
  @overload
177
- def client(self, region: Optional[str], service_name: Literal["autoscaling"], endpoint_url: Optional[str] = None,
178
- config: Optional[Config] = None) -> AutoScalingClient: ...
179
-
180
-
181
- def client(self, region: Optional[str], service_name: Literal["ec2", "iam", "s3", "sts", "sdb", "autoscaling"], endpoint_url: Optional[str] = None,
182
- config: Optional[Config] = None) -> botocore.client.BaseClient:
239
+ def client(
240
+ self,
241
+ region: Optional[str],
242
+ service_name: Literal["autoscaling"],
243
+ endpoint_url: Optional[str] = None,
244
+ config: Optional[Config] = None,
245
+ ) -> "AutoScalingClient": ...
246
+
247
+ def client(
248
+ self,
249
+ region: Optional[str],
250
+ service_name: Literal["ec2", "iam", "s3", "sts", "sdb", "autoscaling"],
251
+ endpoint_url: Optional[str] = None,
252
+ config: Optional[Config] = None,
253
+ ) -> botocore.client.BaseClient:
183
254
  """
184
255
  Get the Boto3 Client to use with the given service (like 'ec2') in the given region.
185
256
 
@@ -192,29 +263,34 @@ class AWSConnectionManager:
192
263
  # Don't try and memoize if a custom config is used
193
264
  with _init_lock:
194
265
  if endpoint_url is not None:
195
- return self.session(region).client(service_name, endpoint_url=endpoint_url, config=config)
266
+ return self.session(region).client(
267
+ service_name, endpoint_url=endpoint_url, config=config
268
+ )
196
269
  else:
197
270
  return self.session(region).client(service_name, config=config)
198
271
 
199
272
  key = (region, service_name, endpoint_url)
200
273
  storage = self.client_cache[key]
201
- if not hasattr(storage, 'item'):
274
+ if not hasattr(storage, "item"):
202
275
  with _init_lock:
203
276
  # We lock because we call .client()
204
277
 
205
278
  if endpoint_url is not None:
206
279
  # The Boto3 stubs are probably missing an overload here too. See:
207
280
  # <https://github.com/vemel/mypy_boto3_builder/issues/121#issuecomment-1011322636>
208
- storage.item = self.session(region).client(service_name, endpoint_url=endpoint_url)
281
+ storage.item = self.session(region).client(
282
+ service_name, endpoint_url=endpoint_url
283
+ )
209
284
  else:
210
285
  # We might not be able to pass None to Boto3 and have it be the same as no argument.
211
286
  storage.item = self.session(region).client(service_name)
212
- return cast(botocore.client.BaseClient , storage.item)
287
+ return cast(botocore.client.BaseClient, storage.item)
213
288
 
214
289
 
215
290
  # If you don't want your own AWSConnectionManager, we have a global one and some global functions
216
291
  _global_manager = AWSConnectionManager()
217
292
 
293
+
218
294
  def establish_boto3_session(region_name: Optional[str] = None) -> Session:
219
295
  """
220
296
  Get a Boto 3 session usable by the current thread.
@@ -225,20 +301,57 @@ def establish_boto3_session(region_name: Optional[str] = None) -> Session:
225
301
  # Just use a global version of the manager. Note that we change the argument order!
226
302
  return _global_manager.session(region_name)
227
303
 
304
+
228
305
  @overload
229
- def client(service_name: Literal["ec2"], region_name: Optional[str] = None, endpoint_url: Optional[str] = None, config: Optional[Config] = None) -> EC2Client: ...
306
+ def client(
307
+ service_name: Literal["ec2"],
308
+ region_name: Optional[str] = None,
309
+ endpoint_url: Optional[str] = None,
310
+ config: Optional[Config] = None,
311
+ ) -> "EC2Client": ...
230
312
  @overload
231
- def client(service_name: Literal["iam"], region_name: Optional[str] = None, endpoint_url: Optional[str] = None, config: Optional[Config] = None) -> IAMClient: ...
313
+ def client(
314
+ service_name: Literal["iam"],
315
+ region_name: Optional[str] = None,
316
+ endpoint_url: Optional[str] = None,
317
+ config: Optional[Config] = None,
318
+ ) -> "IAMClient": ...
232
319
  @overload
233
- def client(service_name: Literal["s3"], region_name: Optional[str] = None, endpoint_url: Optional[str] = None, config: Optional[Config] = None) -> S3Client: ...
320
+ def client(
321
+ service_name: Literal["s3"],
322
+ region_name: Optional[str] = None,
323
+ endpoint_url: Optional[str] = None,
324
+ config: Optional[Config] = None,
325
+ ) -> "S3Client": ...
234
326
  @overload
235
- def client(service_name: Literal["sts"], region_name: Optional[str] = None, endpoint_url: Optional[str] = None, config: Optional[Config] = None) -> STSClient: ...
327
+ def client(
328
+ service_name: Literal["sts"],
329
+ region_name: Optional[str] = None,
330
+ endpoint_url: Optional[str] = None,
331
+ config: Optional[Config] = None,
332
+ ) -> "STSClient": ...
236
333
  @overload
237
- def client(service_name: Literal["sdb"], region_name: Optional[str] = None, endpoint_url: Optional[str] = None, config: Optional[Config] = None) -> SimpleDBClient: ...
334
+ def client(
335
+ service_name: Literal["sdb"],
336
+ region_name: Optional[str] = None,
337
+ endpoint_url: Optional[str] = None,
338
+ config: Optional[Config] = None,
339
+ ) -> "SimpleDBClient": ...
238
340
  @overload
239
- def client(service_name: Literal["autoscaling"], region_name: Optional[str] = None, endpoint_url: Optional[str] = None, config: Optional[Config] = None) -> AutoScalingClient: ...
240
-
241
- def client(service_name: Literal["ec2", "iam", "s3", "sts", "sdb", "autoscaling"], region_name: Optional[str] = None, endpoint_url: Optional[str] = None, config: Optional[Config] = None) -> botocore.client.BaseClient:
341
+ def client(
342
+ service_name: Literal["autoscaling"],
343
+ region_name: Optional[str] = None,
344
+ endpoint_url: Optional[str] = None,
345
+ config: Optional[Config] = None,
346
+ ) -> "AutoScalingClient": ...
347
+
348
+
349
+ def client(
350
+ service_name: Literal["ec2", "iam", "s3", "sts", "sdb", "autoscaling"],
351
+ region_name: Optional[str] = None,
352
+ endpoint_url: Optional[str] = None,
353
+ config: Optional[Config] = None,
354
+ ) -> botocore.client.BaseClient:
242
355
  """
243
356
  Get a Boto 3 client for a particular AWS service, usable by the current thread.
244
357
 
@@ -246,16 +359,36 @@ def client(service_name: Literal["ec2", "iam", "s3", "sts", "sdb", "autoscaling"
246
359
  """
247
360
 
248
361
  # Just use a global version of the manager. Note that we change the argument order!
249
- return _global_manager.client(region_name, service_name, endpoint_url=endpoint_url, config=config)
362
+ return _global_manager.client(
363
+ region_name, service_name, endpoint_url=endpoint_url, config=config
364
+ )
365
+
250
366
 
251
367
  @overload
252
- def resource(service_name: Literal["s3"], region_name: Optional[str] = None, endpoint_url: Optional[str] = None) -> S3ServiceResource: ...
368
+ def resource(
369
+ service_name: Literal["s3"],
370
+ region_name: Optional[str] = None,
371
+ endpoint_url: Optional[str] = None,
372
+ ) -> "S3ServiceResource": ...
253
373
  @overload
254
- def resource(service_name: Literal["iam"], region_name: Optional[str] = None, endpoint_url: Optional[str] = None) -> IAMServiceResource: ...
374
+ def resource(
375
+ service_name: Literal["iam"],
376
+ region_name: Optional[str] = None,
377
+ endpoint_url: Optional[str] = None,
378
+ ) -> "IAMServiceResource": ...
255
379
  @overload
256
- def resource(service_name: Literal["ec2"], region_name: Optional[str] = None, endpoint_url: Optional[str] = None) -> EC2ServiceResource: ...
257
-
258
- def resource(service_name: Literal["s3", "iam", "ec2"], region_name: Optional[str] = None, endpoint_url: Optional[str] = None) -> boto3.resources.base.ServiceResource:
380
+ def resource(
381
+ service_name: Literal["ec2"],
382
+ region_name: Optional[str] = None,
383
+ endpoint_url: Optional[str] = None,
384
+ ) -> "EC2ServiceResource": ...
385
+
386
+
387
+ def resource(
388
+ service_name: Literal["s3", "iam", "ec2"],
389
+ region_name: Optional[str] = None,
390
+ endpoint_url: Optional[str] = None,
391
+ ) -> boto3.resources.base.ServiceResource:
259
392
  """
260
393
  Get a Boto 3 resource for a particular AWS service, usable by the current thread.
261
394
 
@@ -263,4 +396,6 @@ def resource(service_name: Literal["s3", "iam", "ec2"], region_name: Optional[st
263
396
  """
264
397
 
265
398
  # Just use a global version of the manager. Note that we change the argument order!
266
- return _global_manager.resource(region_name, service_name, endpoint_url=endpoint_url)
399
+ return _global_manager.resource(
400
+ region_name, service_name, endpoint_url=endpoint_url
401
+ )