toil 5.9.2__tar.gz → 5.12.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. {toil-5.9.2/src/toil.egg-info → toil-5.12.0}/PKG-INFO +1 -1
  2. toil-5.12.0/requirements-aws.txt +4 -0
  3. {toil-5.9.2 → toil-5.12.0}/requirements-cwl.txt +1 -1
  4. {toil-5.9.2 → toil-5.12.0}/requirements-dev.txt +6 -3
  5. toil-5.12.0/requirements-google.txt +3 -0
  6. {toil-5.9.2 → toil-5.12.0}/requirements-wdl.txt +1 -0
  7. {toil-5.9.2 → toil-5.12.0}/requirements.txt +2 -0
  8. {toil-5.9.2 → toil-5.12.0}/setup.cfg +3 -1
  9. {toil-5.9.2 → toil-5.12.0}/setup.py +16 -17
  10. {toil-5.9.2 → toil-5.12.0}/src/toil/__init__.py +71 -78
  11. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/abstractBatchSystem.py +227 -35
  12. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/abstractGridEngineBatchSystem.py +73 -40
  13. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/cleanup_support.py +5 -0
  14. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/contained_executor.py +1 -0
  15. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/gridengine.py +5 -4
  16. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/htcondor.py +176 -91
  17. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/kubernetes.py +270 -74
  18. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/local_support.py +4 -5
  19. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/lsf.py +6 -5
  20. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/mesos/batchSystem.py +22 -4
  21. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/mesos/test/__init__.py +4 -7
  22. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/options.py +37 -18
  23. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/parasol.py +21 -24
  24. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/singleMachine.py +37 -194
  25. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/slurm.py +47 -27
  26. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/torque.py +3 -3
  27. {toil-5.9.2 → toil-5.12.0}/src/toil/common.py +93 -26
  28. {toil-5.9.2 → toil-5.12.0}/src/toil/cwl/__init__.py +8 -4
  29. {toil-5.9.2 → toil-5.12.0}/src/toil/cwl/cwltoil.py +137 -72
  30. {toil-5.9.2 → toil-5.12.0}/src/toil/cwl/utils.py +0 -10
  31. {toil-5.9.2 → toil-5.12.0}/src/toil/deferred.py +4 -0
  32. toil-5.12.0/src/toil/exceptions.py +52 -0
  33. {toil-5.9.2 → toil-5.12.0}/src/toil/fileStores/abstractFileStore.py +9 -1
  34. {toil-5.9.2 → toil-5.12.0}/src/toil/fileStores/nonCachingFileStore.py +59 -5
  35. {toil-5.9.2 → toil-5.12.0}/src/toil/job.py +398 -332
  36. {toil-5.9.2 → toil-5.12.0}/src/toil/jobStores/abstractJobStore.py +75 -43
  37. {toil-5.9.2 → toil-5.12.0}/src/toil/jobStores/aws/jobStore.py +8 -1
  38. {toil-5.9.2 → toil-5.12.0}/src/toil/jobStores/fileJobStore.py +9 -3
  39. {toil-5.9.2 → toil-5.12.0}/src/toil/jobStores/googleJobStore.py +51 -17
  40. {toil-5.9.2 → toil-5.12.0}/src/toil/leader.py +93 -148
  41. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/accelerators.py +42 -5
  42. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/aws/__init__.py +2 -1
  43. toil-5.12.0/src/toil/lib/aws/ami.py +178 -0
  44. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/aws/iam.py +54 -13
  45. toil-5.12.0/src/toil/lib/aws/session.py +240 -0
  46. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/aws/utils.py +38 -0
  47. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/docker.py +32 -0
  48. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/encryption/_dummy.py +2 -2
  49. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/io.py +15 -0
  50. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/misc.py +26 -10
  51. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/retry.py +6 -6
  52. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/threading.py +27 -19
  53. {toil-5.9.2 → toil-5.12.0}/src/toil/provisioners/abstractProvisioner.py +2 -1
  54. {toil-5.9.2 → toil-5.12.0}/src/toil/realtimeLogger.py +12 -14
  55. {toil-5.9.2 → toil-5.12.0}/src/toil/resource.py +62 -47
  56. {toil-5.9.2 → toil-5.12.0}/src/toil/server/wsgi_app.py +1 -1
  57. {toil-5.9.2 → toil-5.12.0}/src/toil/serviceManager.py +15 -4
  58. {toil-5.9.2 → toil-5.12.0}/src/toil/test/__init__.py +38 -5
  59. toil-5.12.0/src/toil/test/batchSystems/__init__.py +13 -0
  60. toil-5.12.0/src/toil/test/batchSystems/batchSystemTest.py +1349 -0
  61. toil-5.12.0/src/toil/test/batchSystems/parasolTestSupport.py +117 -0
  62. toil-5.12.0/src/toil/test/batchSystems/test_lsf_helper.py +74 -0
  63. toil-5.12.0/src/toil/test/batchSystems/test_slurm.py +389 -0
  64. toil-5.12.0/src/toil/test/cwl/alwaysfails.cwl +11 -0
  65. toil-5.12.0/src/toil/test/cwl/colon_test_output.cwl +20 -0
  66. toil-5.12.0/src/toil/test/cwl/colon_test_output_job.yaml +4 -0
  67. toil-5.12.0/src/toil/test/cwl/conditional_wf.cwl +25 -0
  68. toil-5.12.0/src/toil/test/cwl/conditional_wf.yaml +2 -0
  69. toil-5.12.0/src/toil/test/cwl/conftest.py +17 -0
  70. toil-5.12.0/src/toil/test/cwl/cwlTest.py +1484 -0
  71. toil-5.12.0/src/toil/test/cwl/directory_from_directory.cwl +25 -0
  72. toil-5.12.0/src/toil/test/cwl/download.cwl +19 -0
  73. toil-5.12.0/src/toil/test/cwl/download_directory.cwl +31 -0
  74. toil-5.12.0/src/toil/test/cwl/download_subdirectory.cwl +40 -0
  75. toil-5.12.0/src/toil/test/cwl/echo-stderr.cwl +19 -0
  76. toil-5.12.0/src/toil/test/cwl/echo-stdout-log-dir.cwl +14 -0
  77. toil-5.12.0/src/toil/test/cwl/echo.cwl +12 -0
  78. toil-5.12.0/src/toil/test/cwl/echo_string.cwl +51 -0
  79. toil-5.12.0/src/toil/test/cwl/echo_string_scatter_capture_stdout.cwl +63 -0
  80. toil-5.12.0/src/toil/test/cwl/file_from_directory.cwl +25 -0
  81. toil-5.12.0/src/toil/test/cwl/load_contents.cwl +26 -0
  82. toil-5.12.0/src/toil/test/cwl/mpi_simple.cwl +21 -0
  83. toil-5.12.0/src/toil/test/cwl/nvidia_smi.cwl +16 -0
  84. toil-5.12.0/src/toil/test/cwl/revsort.cwl +65 -0
  85. toil-5.12.0/src/toil/test/cwl/revsort2.cwl +65 -0
  86. toil-5.12.0/src/toil/test/cwl/revtool.cwl +37 -0
  87. toil-5.12.0/src/toil/test/cwl/revtool2.cwl +33 -0
  88. toil-5.12.0/src/toil/test/cwl/s3_secondary_file.cwl +22 -0
  89. toil-5.12.0/src/toil/test/cwl/seqtk_seq.cwl +24 -0
  90. toil-5.12.0/src/toil/test/cwl/sorttool.cwl +35 -0
  91. toil-5.12.0/src/toil/test/cwl/stream.cwl +43 -0
  92. toil-5.12.0/src/toil/test/cwl/test_filename_conflict_detection.cwl +36 -0
  93. toil-5.12.0/src/toil/test/cwl/test_filename_conflict_detection_at_root.cwl +35 -0
  94. toil-5.12.0/src/toil/test/cwl/test_filename_conflict_resolution.cwl +31 -0
  95. toil-5.12.0/src/toil/test/docs/scriptsTest.py +151 -0
  96. toil-5.12.0/src/toil/test/jobStores/__init__.py +13 -0
  97. toil-5.12.0/src/toil/test/jobStores/jobStoreTest.py +1531 -0
  98. toil-5.12.0/src/toil/test/lib/aws/__init__.py +0 -0
  99. toil-5.12.0/src/toil/test/lib/aws/test_iam.py +139 -0
  100. toil-5.12.0/src/toil/test/lib/aws/test_s3.py +77 -0
  101. toil-5.12.0/src/toil/test/lib/aws/test_utils.py +67 -0
  102. toil-5.12.0/src/toil/test/lib/dockerTest.py +454 -0
  103. toil-5.12.0/src/toil/test/lib/test_conversions.py +213 -0
  104. toil-5.12.0/src/toil/test/lib/test_ec2.py +101 -0
  105. toil-5.12.0/src/toil/test/lib/test_misc.py +82 -0
  106. toil-5.12.0/src/toil/test/mesos/MesosDataStructuresTest.py +78 -0
  107. toil-5.12.0/src/toil/test/mesos/__init__.py +13 -0
  108. toil-5.12.0/src/toil/test/mesos/helloWorld.py +72 -0
  109. toil-5.12.0/src/toil/test/mesos/stress.py +74 -0
  110. toil-5.12.0/src/toil/test/provisioners/__init__.py +13 -0
  111. toil-5.12.0/src/toil/test/provisioners/aws/__init__.py +13 -0
  112. toil-5.12.0/src/toil/test/provisioners/aws/awsProvisionerTest.py +510 -0
  113. toil-5.12.0/src/toil/test/provisioners/clusterScalerTest.py +979 -0
  114. toil-5.12.0/src/toil/test/provisioners/clusterTest.py +160 -0
  115. toil-5.12.0/src/toil/test/provisioners/gceProvisionerTest.py +351 -0
  116. toil-5.12.0/src/toil/test/provisioners/provisionerTest.py +45 -0
  117. toil-5.12.0/src/toil/test/provisioners/restartScript.py +16 -0
  118. toil-5.12.0/src/toil/test/server/__init__.py +13 -0
  119. toil-5.12.0/src/toil/test/server/serverTest.py +714 -0
  120. toil-5.12.0/src/toil/test/sort/__init__.py +13 -0
  121. toil-5.12.0/src/toil/test/sort/restart_sort.py +263 -0
  122. toil-5.12.0/src/toil/test/sort/sort.py +259 -0
  123. toil-5.12.0/src/toil/test/sort/sortTest.py +319 -0
  124. toil-5.12.0/src/toil/test/src/__init__.py +13 -0
  125. toil-5.12.0/src/toil/test/src/autoDeploymentTest.py +487 -0
  126. toil-5.12.0/src/toil/test/src/busTest.py +163 -0
  127. toil-5.12.0/src/toil/test/src/checkpointTest.py +104 -0
  128. toil-5.12.0/src/toil/test/src/deferredFunctionTest.py +343 -0
  129. toil-5.12.0/src/toil/test/src/dockerCheckTest.py +101 -0
  130. toil-5.12.0/src/toil/test/src/fileStoreTest.py +1382 -0
  131. toil-5.12.0/src/toil/test/src/helloWorldTest.py +48 -0
  132. toil-5.12.0/src/toil/test/src/importExportFileTest.py +148 -0
  133. toil-5.12.0/src/toil/test/src/jobDescriptionTest.py +95 -0
  134. toil-5.12.0/src/toil/test/src/jobEncapsulationTest.py +67 -0
  135. toil-5.12.0/src/toil/test/src/jobFileStoreTest.py +199 -0
  136. toil-5.12.0/src/toil/test/src/jobServiceTest.py +381 -0
  137. toil-5.12.0/src/toil/test/src/jobTest.py +711 -0
  138. toil-5.12.0/src/toil/test/src/miscTests.py +211 -0
  139. toil-5.12.0/src/toil/test/src/promisedRequirementTest.py +230 -0
  140. toil-5.12.0/src/toil/test/src/promisesTest.py +78 -0
  141. toil-5.12.0/src/toil/test/src/realtimeLoggerTest.py +64 -0
  142. toil-5.12.0/src/toil/test/src/regularLogTest.py +100 -0
  143. toil-5.12.0/src/toil/test/src/resourceTest.py +238 -0
  144. toil-5.12.0/src/toil/test/src/restartDAGTest.py +155 -0
  145. toil-5.12.0/src/toil/test/src/resumabilityTest.py +81 -0
  146. toil-5.12.0/src/toil/test/src/retainTempDirTest.py +99 -0
  147. toil-5.12.0/src/toil/test/src/systemTest.py +55 -0
  148. toil-5.12.0/src/toil/test/src/threadingTest.py +134 -0
  149. toil-5.12.0/src/toil/test/src/toilContextManagerTest.py +88 -0
  150. toil-5.12.0/src/toil/test/src/userDefinedJobArgTypeTest.py +93 -0
  151. toil-5.12.0/src/toil/test/src/workerTest.py +94 -0
  152. toil-5.12.0/src/toil/test/utils/__init__.py +13 -0
  153. toil-5.12.0/src/toil/test/utils/toilDebugTest.py +135 -0
  154. toil-5.12.0/src/toil/test/utils/toilKillTest.py +100 -0
  155. toil-5.12.0/src/toil/test/utils/utilsTest.py +397 -0
  156. toil-5.12.0/src/toil/test/wdl/__init__.py +0 -0
  157. toil-5.12.0/src/toil/test/wdl/builtinTest.py +506 -0
  158. toil-5.12.0/src/toil/test/wdl/conftest.py +23 -0
  159. toil-5.12.0/src/toil/test/wdl/toilwdlTest.py +522 -0
  160. toil-5.12.0/src/toil/test/wdl/wdltoil_test.py +240 -0
  161. {toil-5.9.2 → toil-5.12.0}/src/toil/toilState.py +10 -11
  162. toil-5.12.0/src/toil/utils/__init__.py +0 -0
  163. {toil-5.9.2 → toil-5.12.0}/src/toil/utils/toilClean.py +10 -4
  164. {toil-5.9.2 → toil-5.12.0}/src/toil/utils/toilStatus.py +24 -24
  165. toil-5.12.0/src/toil/version.py +14 -0
  166. toil-5.12.0/src/toil/wdl/__init__.py +0 -0
  167. toil-5.12.0/src/toil/wdl/versions/__init__.py +0 -0
  168. toil-5.12.0/src/toil/wdl/wdltoil.py +2172 -0
  169. {toil-5.9.2 → toil-5.12.0}/src/toil/worker.py +24 -18
  170. {toil-5.9.2 → toil-5.12.0/src/toil.egg-info}/PKG-INFO +1 -1
  171. {toil-5.9.2 → toil-5.12.0}/src/toil.egg-info/SOURCES.txt +107 -0
  172. {toil-5.9.2 → toil-5.12.0}/src/toil.egg-info/entry_points.txt +2 -1
  173. {toil-5.9.2 → toil-5.12.0}/src/toil.egg-info/requires.txt +15 -16
  174. toil-5.9.2/requirements-aws.txt +0 -7
  175. toil-5.9.2/requirements-google.txt +0 -2
  176. toil-5.9.2/src/toil/lib/aws/ami.py +0 -104
  177. toil-5.9.2/src/toil/lib/aws/session.py +0 -176
  178. toil-5.9.2/src/toil/version.py +0 -12
  179. {toil-5.9.2 → toil-5.12.0}/LICENSE +0 -0
  180. {toil-5.9.2 → toil-5.12.0}/MANIFEST.in +0 -0
  181. {toil-5.9.2 → toil-5.12.0}/README.rst +0 -0
  182. {toil-5.9.2 → toil-5.12.0}/requirements-encryption.txt +0 -0
  183. {toil-5.9.2 → toil-5.12.0}/requirements-htcondor.txt +0 -0
  184. {toil-5.9.2 → toil-5.12.0}/requirements-kubernetes.txt +0 -0
  185. {toil-5.9.2 → toil-5.12.0}/requirements-mesos.txt +0 -0
  186. {toil-5.9.2 → toil-5.12.0}/requirements-server.txt +0 -0
  187. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/__init__.py +0 -0
  188. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/awsBatch.py +0 -0
  189. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/lsfHelper.py +0 -0
  190. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/mesos/__init__.py +0 -0
  191. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/mesos/conftest.py +0 -0
  192. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/mesos/executor.py +0 -0
  193. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/registry.py +0 -0
  194. {toil-5.9.2 → toil-5.12.0}/src/toil/batchSystems/tes.py +0 -0
  195. {toil-5.9.2 → toil-5.12.0}/src/toil/bus.py +0 -0
  196. {toil-5.9.2 → toil-5.12.0}/src/toil/cwl/conftest.py +0 -0
  197. {toil-5.9.2 → toil-5.12.0}/src/toil/fileStores/__init__.py +0 -0
  198. {toil-5.9.2 → toil-5.12.0}/src/toil/fileStores/cachingFileStore.py +0 -0
  199. {toil-5.9.2 → toil-5.12.0}/src/toil/jobStores/__init__.py +0 -0
  200. {toil-5.9.2 → toil-5.12.0}/src/toil/jobStores/aws/__init__.py +0 -0
  201. {toil-5.9.2 → toil-5.12.0}/src/toil/jobStores/aws/utils.py +0 -0
  202. {toil-5.9.2 → toil-5.12.0}/src/toil/jobStores/conftest.py +0 -0
  203. {toil-5.9.2 → toil-5.12.0}/src/toil/jobStores/utils.py +0 -0
  204. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/__init__.py +0 -0
  205. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/bioio.py +0 -0
  206. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/compatibility.py +0 -0
  207. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/conversions.py +0 -0
  208. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/ec2.py +0 -0
  209. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/ec2nodes.py +0 -0
  210. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/encryption/__init__.py +0 -0
  211. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/encryption/_nacl.py +0 -0
  212. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/encryption/conftest.py +0 -0
  213. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/exceptions.py +0 -0
  214. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/expando.py +0 -0
  215. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/generatedEC2Lists.py +0 -0
  216. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/humanize.py +0 -0
  217. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/iterables.py +0 -0
  218. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/memoize.py +0 -0
  219. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/objects.py +0 -0
  220. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/resources.py +0 -0
  221. {toil-5.9.2 → toil-5.12.0}/src/toil/lib/throttle.py +0 -0
  222. {toil-5.9.2 → toil-5.12.0}/src/toil/provisioners/__init__.py +0 -0
  223. {toil-5.9.2 → toil-5.12.0}/src/toil/provisioners/aws/__init__.py +0 -0
  224. {toil-5.9.2 → toil-5.12.0}/src/toil/provisioners/aws/awsProvisioner.py +0 -0
  225. {toil-5.9.2 → toil-5.12.0}/src/toil/provisioners/clusterScaler.py +0 -0
  226. {toil-5.9.2 → toil-5.12.0}/src/toil/provisioners/gceProvisioner.py +0 -0
  227. {toil-5.9.2 → toil-5.12.0}/src/toil/provisioners/node.py +0 -0
  228. {toil-5.9.2 → toil-5.12.0}/src/toil/server/__init__.py +0 -0
  229. {toil-5.9.2 → toil-5.12.0}/src/toil/server/api_spec/__init__.py +0 -0
  230. {toil-5.9.2 → toil-5.12.0}/src/toil/server/api_spec/workflow_execution_service.swagger.yaml +0 -0
  231. {toil-5.9.2 → toil-5.12.0}/src/toil/server/app.py +0 -0
  232. {toil-5.9.2 → toil-5.12.0}/src/toil/server/celery_app.py +0 -0
  233. {toil-5.9.2 → toil-5.12.0}/src/toil/server/cli/__init__.py +0 -0
  234. {toil-5.9.2 → toil-5.12.0}/src/toil/server/cli/wes_cwl_runner.py +0 -0
  235. {toil-5.9.2 → toil-5.12.0}/src/toil/server/utils.py +0 -0
  236. {toil-5.9.2 → toil-5.12.0}/src/toil/server/wes/__init__.py +0 -0
  237. {toil-5.9.2 → toil-5.12.0}/src/toil/server/wes/abstract_backend.py +0 -0
  238. {toil-5.9.2 → toil-5.12.0}/src/toil/server/wes/amazon_wes_utils.py +0 -0
  239. {toil-5.9.2 → toil-5.12.0}/src/toil/server/wes/tasks.py +0 -0
  240. {toil-5.9.2 → toil-5.12.0}/src/toil/server/wes/toil_backend.py +0 -0
  241. {toil-5.9.2 → toil-5.12.0}/src/toil/statsAndLogging.py +0 -0
  242. {toil-5.9.2/src/toil/utils → toil-5.12.0/src/toil/test/cwl}/__init__.py +0 -0
  243. {toil-5.9.2/src/toil/wdl → toil-5.12.0/src/toil/test/docs}/__init__.py +0 -0
  244. {toil-5.9.2/src/toil/wdl/versions → toil-5.12.0/src/toil/test/lib}/__init__.py +0 -0
  245. {toil-5.9.2 → toil-5.12.0}/src/toil/utils/toilDebugFile.py +0 -0
  246. {toil-5.9.2 → toil-5.12.0}/src/toil/utils/toilDebugJob.py +0 -0
  247. {toil-5.9.2 → toil-5.12.0}/src/toil/utils/toilDestroyCluster.py +0 -0
  248. {toil-5.9.2 → toil-5.12.0}/src/toil/utils/toilKill.py +0 -0
  249. {toil-5.9.2 → toil-5.12.0}/src/toil/utils/toilLaunchCluster.py +0 -0
  250. {toil-5.9.2 → toil-5.12.0}/src/toil/utils/toilMain.py +0 -0
  251. {toil-5.9.2 → toil-5.12.0}/src/toil/utils/toilRsyncCluster.py +0 -0
  252. {toil-5.9.2 → toil-5.12.0}/src/toil/utils/toilServer.py +0 -0
  253. {toil-5.9.2 → toil-5.12.0}/src/toil/utils/toilSshCluster.py +0 -0
  254. {toil-5.9.2 → toil-5.12.0}/src/toil/utils/toilStats.py +0 -0
  255. {toil-5.9.2 → toil-5.12.0}/src/toil/utils/toilUpdateEC2Instances.py +0 -0
  256. {toil-5.9.2 → toil-5.12.0}/src/toil/wdl/toilwdl.py +0 -0
  257. {toil-5.9.2 → toil-5.12.0}/src/toil/wdl/utils.py +0 -0
  258. {toil-5.9.2 → toil-5.12.0}/src/toil/wdl/versions/dev.py +0 -0
  259. {toil-5.9.2 → toil-5.12.0}/src/toil/wdl/versions/draft2.py +0 -0
  260. {toil-5.9.2 → toil-5.12.0}/src/toil/wdl/versions/v1.py +0 -0
  261. {toil-5.9.2 → toil-5.12.0}/src/toil/wdl/wdl_analysis.py +0 -0
  262. {toil-5.9.2 → toil-5.12.0}/src/toil/wdl/wdl_functions.py +0 -0
  263. {toil-5.9.2 → toil-5.12.0}/src/toil/wdl/wdl_synthesis.py +0 -0
  264. {toil-5.9.2 → toil-5.12.0}/src/toil/wdl/wdl_types.py +0 -0
  265. {toil-5.9.2 → toil-5.12.0}/src/toil.egg-info/dependency_links.txt +0 -0
  266. {toil-5.9.2 → toil-5.12.0}/src/toil.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: toil
3
- Version: 5.9.2
3
+ Version: 5.12.0
4
4
  Summary: Pipeline management software for clusters.
5
5
  Home-page: https://github.com/DataBiosphere/toil
6
6
  Author: Benedict Paten and the Toil community
@@ -0,0 +1,4 @@
1
+ boto>=2.48.0, <3
2
+ boto3-stubs[s3,sdb,iam,sts,boto3]>=1.28.3.post2, <2
3
+ mypy-boto3-iam>=1.28.3.post2, <2 # Need to force .post1 to be replaced
4
+ moto>=4.1.11, <5
@@ -1,4 +1,4 @@
1
- cwltool==3.1.20221201130942
1
+ cwltool==3.1.20230601100705
2
2
  schema-salad>=8.4.20230128170514,<9
3
3
  galaxy-tool-util
4
4
  ruamel.yaml>=0.15,<=0.17.21
@@ -1,12 +1,15 @@
1
- mock>=4.0.3,<5
1
+ mock>=4.0.3,<6
2
2
  pytest>=6.2.1,<8
3
3
  pytest-cov>=2.12.1,<5
4
4
  pytest-timeout>=1.4.2,<3
5
5
  stubserver>=1.1,<2
6
- setuptools>=51.3.3,<63
6
+ setuptools>=65.5.1,<68
7
7
  sphinx>=4,<6
8
+ sphinx-autoapi
9
+ sphinx-autodoc-typehints
10
+ sphinxcontrib-autoprogram
8
11
  cwltest>=2.2.20211116163652
9
- mypy==0.991
12
+ mypy==1.2.0
10
13
  types-requests
11
14
  types-setuptools
12
15
  types-boto
@@ -0,0 +1,3 @@
1
+ apache-libcloud>=2.2.1,<3
2
+ google-cloud-storage>=2,<=2.8.0
3
+ google-auth>=2.18.1,<3
@@ -1 +1,2 @@
1
+ miniwdl==1.10.0
1
2
  wdlparse==0.1.0
@@ -1,6 +1,8 @@
1
1
  dill>=0.3.2, <0.4
2
2
  requests>=2, <3
3
3
  docker>=3.7.2, <6
4
+ # Work around https://github.com/docker/docker-py/issues/3113
5
+ urllib3>=1.26.0, <2.0.0
4
6
  python-dateutil
5
7
  psutil >= 3.0.1, <6
6
8
  py-tes>=0.4.2,<1
@@ -13,7 +13,8 @@ markers =
13
13
  docker_cuda
14
14
  encryption
15
15
  fetchable_appliance
16
- google
16
+ google-project
17
+ google-storage
17
18
  gridengine
18
19
  htcondor
19
20
  integrative
@@ -27,6 +28,7 @@ markers =
27
28
  server_mode
28
29
  slow
29
30
  slurm
31
+ singularity
30
32
  tes
31
33
  torque
32
34
  wes_server
@@ -20,24 +20,25 @@ from setuptools import find_packages, setup
20
20
 
21
21
  def get_requirements(extra=None):
22
22
  """
23
- Load the requirements for the given extra from the appropriate
24
- requirements-extra.txt, or the main requirements.txt if no extra is
25
- specified.
26
- """
23
+ Load the requirements for the given extra.
27
24
 
25
+ Uses the appropriate requirements-extra.txt, or the main requirements.txt
26
+ if no extra is specified.
27
+ """
28
28
  filename = f"requirements-{extra}.txt" if extra else "requirements.txt"
29
29
 
30
30
  with open(filename) as fp:
31
- # Parse out as one per line
32
- return [l.strip() for l in fp.readlines() if l.strip()]
31
+ # Parse out as one per line, dropping comments
32
+ return [l.split('#')[0].strip() for l in fp.readlines() if l.split('#')[0].strip()]
33
33
 
34
34
 
35
35
  def run_setup():
36
36
  """
37
- Calls setup(). This function exists so the setup() invocation preceded more internal
38
- functionality. The `version` module is imported dynamically by import_version() below.
39
- """
37
+ Call setup().
40
38
 
39
+ This function exists so the setup() invocation preceded more internal functionality.
40
+ The `version` module is imported dynamically by import_version() below.
41
+ """
41
42
  install_requires = get_requirements()
42
43
 
43
44
  extras_require = {}
@@ -45,7 +46,7 @@ def run_setup():
45
46
  # this is tricky to conditionally support in 'all' due
46
47
  # to how wheels work, so it is not included in all and
47
48
  # must be explicitly installed as an extra
48
- all_reqs = ""
49
+ all_reqs = []
49
50
  non_htcondor_extras = [
50
51
  "aws",
51
52
  "cwl",
@@ -58,7 +59,7 @@ def run_setup():
58
59
  ]
59
60
  for extra in non_htcondor_extras:
60
61
  extras_require[extra] = get_requirements(extra)
61
- all_reqs += "\n" + "\n".join(extras_require[extra])
62
+ all_reqs += extras_require[extra]
62
63
  # We exclude htcondor from "all" because it can't be on Mac
63
64
  extras_require['htcondor:sys_platform!="darwin"'] = get_requirements("htcondor")
64
65
  extras_require["all"] = all_reqs
@@ -98,12 +99,9 @@ def run_setup():
98
99
  install_requires=install_requires,
99
100
  extras_require=extras_require,
100
101
  package_dir={'': 'src'},
101
- packages=find_packages(where='src',
102
- # Note that we intentionally include the top-level `test` package for
103
- # functionality like the @experimental and @integrative decorators:
104
- exclude=['*.test.*']),
102
+ packages=find_packages(where='src'),
105
103
  package_data={
106
- '': ['*.yml', '*.yaml', 'cloud-config'],
104
+ '': ['*.yml', '*.yaml', 'cloud-config', '*.cwl'],
107
105
  },
108
106
  # Unfortunately, the names of the entry points are hard-coded elsewhere in the code base so
109
107
  # you can't just change them here. Luckily, most of them are pretty unique strings, and thus
@@ -114,7 +112,8 @@ def run_setup():
114
112
  '_toil_worker = toil.worker:main',
115
113
  'cwltoil = toil.cwl.cwltoil:cwltoil_was_removed [cwl]',
116
114
  'toil-cwl-runner = toil.cwl.cwltoil:main [cwl]',
117
- 'toil-wdl-runner = toil.wdl.toilwdl:main',
115
+ 'toil-wdl-runner = toil.wdl.wdltoil:main [wdl]',
116
+ 'toil-wdl-runner-old = toil.wdl.toilwdl:main [wdl]',
118
117
  'toil-wes-cwl-runner = toil.server.cli.wes_cwl_runner:main [server]',
119
118
  '_toil_mesos_executor = toil.batchSystems.mesos.executor:main [mesos]',
120
119
  '_toil_contained_executor = toil.batchSystems.contained_executor:executor']})
@@ -16,12 +16,10 @@ import logging
16
16
  import os
17
17
  import re
18
18
  import socket
19
- import subprocess
20
19
  import sys
21
20
  import time
22
21
  from datetime import datetime
23
- from typing import TYPE_CHECKING
24
-
22
+ from typing import TYPE_CHECKING, Optional, Tuple
25
23
  import requests
26
24
  from pytz import timezone
27
25
 
@@ -36,20 +34,18 @@ if TYPE_CHECKING:
36
34
  log = logging.getLogger(__name__)
37
35
 
38
36
 
39
- def which(cmd, mode=os.F_OK | os.X_OK, path=None):
37
+ def which(cmd, mode=os.F_OK | os.X_OK, path=None) -> Optional[str]:
40
38
  """
41
- Copy-pasted in from python3.6's shutil.which().
39
+ Return the path with conforms to the given mode on the Path.
42
40
 
43
- Given a command, mode, and a PATH string, return the path which
44
- conforms to the given mode on the PATH, or None if there is no such
45
- file.
41
+ [Copy-pasted in from python3.6's shutil.which().]
46
42
 
47
43
  `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result
48
44
  of os.environ.get("PATH"), or can be overridden with a custom search
49
45
  path.
50
-
46
+
47
+ :returns: The path found, or None.
51
48
  """
52
-
53
49
  # Check that a given file can be accessed with the correct mode.
54
50
  # Additionally check that `file` is not a directory, as on Windows
55
51
  # directories pass the os.access check.
@@ -114,22 +110,20 @@ def toilPackageDirPath() -> str:
114
110
  return result
115
111
 
116
112
 
117
- def inVirtualEnv():
118
- """
119
- Returns whether we are inside a virtualenv or Conda virtual environment.
120
- """
113
+ def inVirtualEnv() -> bool:
114
+ """Test if we are inside a virtualenv or Conda virtual environment."""
121
115
  return ('VIRTUAL_ENV' in os.environ or
122
116
  'CONDA_DEFAULT_ENV' in os.environ or
123
117
  hasattr(sys, 'real_prefix') or
124
118
  (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix))
125
119
 
126
120
 
127
- def resolveEntryPoint(entryPoint):
128
- """
129
- Returns the path to the given entry point (see setup.py) that *should* work on a worker. The
130
- return value may be an absolute or a relative path.
121
+ def resolveEntryPoint(entryPoint: str) -> str:
131
122
  """
123
+ Find the path to the given entry point that *should* work on a worker.
132
124
 
125
+ :returns: The path found, which may be an absolute or a relative path.
126
+ """
133
127
  if os.environ.get("TOIL_CHECK_ENV", None) == 'True' and inVirtualEnv():
134
128
  path = os.path.join(os.path.dirname(sys.executable), entryPoint)
135
129
  # Inside a virtualenv we try to use absolute paths to the entrypoints.
@@ -149,6 +143,8 @@ def resolveEntryPoint(entryPoint):
149
143
  @memoize
150
144
  def physicalMemory() -> int:
151
145
  """
146
+ Calculate the total amount of physical memory, in bytes.
147
+
152
148
  >>> n = physicalMemory()
153
149
  >>> n > 0
154
150
  True
@@ -158,6 +154,7 @@ def physicalMemory() -> int:
158
154
  try:
159
155
  return os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES')
160
156
  except ValueError:
157
+ import subprocess
161
158
  return int(subprocess.check_output(['sysctl', '-n', 'hw.memsize']).decode('utf-8').strip())
162
159
 
163
160
 
@@ -168,7 +165,8 @@ def physicalDisk(directory: str) -> int:
168
165
 
169
166
  def applianceSelf(forceDockerAppliance: bool = False) -> str:
170
167
  """
171
- Returns the fully qualified name of the Docker image to start Toil appliance containers from.
168
+ Return the fully qualified name of the Docker image to start Toil appliance containers from.
169
+
172
170
  The result is determined by the current version of Toil and three environment variables:
173
171
  ``TOIL_DOCKER_REGISTRY``, ``TOIL_DOCKER_NAME`` and ``TOIL_APPLIANCE_SELF``.
174
172
 
@@ -179,8 +177,6 @@ def applianceSelf(forceDockerAppliance: bool = False) -> str:
179
177
  appliance image, complete with registry, image name and version tag, overriding both
180
178
  ``TOIL_DOCKER_NAME`` and `TOIL_DOCKER_REGISTRY`` as well as the version tag of the image.
181
179
  Setting TOIL_APPLIANCE_SELF will not be necessary in most cases.
182
-
183
- :rtype: str
184
180
  """
185
181
  import toil.version
186
182
  registry = lookupEnvVar(name='docker registry',
@@ -201,16 +197,17 @@ def applianceSelf(forceDockerAppliance: bool = False) -> str:
201
197
  return checkDockerImageExists(appliance=appliance)
202
198
 
203
199
 
204
- def customDockerInitCmd():
200
+ def customDockerInitCmd() -> str:
205
201
  """
206
- Returns the custom command (if any) provided through the ``TOIL_CUSTOM_DOCKER_INIT_COMMAND``
207
- environment variable to run prior to running the workers and/or the primary node's services.
202
+ Return the custom command set by the ``TOIL_CUSTOM_DOCKER_INIT_COMMAND`` environment variable.
203
+
204
+ The custom docker command is run prior to running the workers and/or the primary node's services.
205
+
208
206
  This can be useful for doing any custom initialization on instances (e.g. authenticating to
209
207
  private docker registries). Any single quotes are escaped and the command cannot contain a
210
- set of blacklisted chars (newline or tab). An empty string is returned if the environment
211
- variable is not set.
208
+ set of blacklisted chars (newline or tab).
212
209
 
213
- :rtype: str
210
+ :returns: The custom commmand, or an empty string is returned if the environment variable is not set.
214
211
  """
215
212
  command = lookupEnvVar(name='user-defined custom docker init command',
216
213
  envName='TOIL_CUSTOM_DOCKER_INIT_COMMAND',
@@ -219,17 +216,18 @@ def customDockerInitCmd():
219
216
  return command.replace("'", "'\\''") # Ensure any single quotes are escaped.
220
217
 
221
218
 
222
- def customInitCmd():
219
+ def customInitCmd() -> str:
223
220
  """
224
- Returns the custom command (if any) provided through the ``TOIL_CUSTOM_INIT_COMMAND``
225
- environment variable to run prior to running Toil appliance itself in workers and/or the
221
+ Return the custom command set by the ``TOIL_CUSTOM_INIT_COMMAND`` environment variable.
222
+
223
+ The custom init command is run prior to running Toil appliance itself in workers and/or the
226
224
  primary node (i.e. this is run one stage before ``TOIL_CUSTOM_DOCKER_INIT_COMMAND``).
225
+
227
226
  This can be useful for doing any custom initialization on instances (e.g. authenticating to
228
227
  private docker registries). Any single quotes are escaped and the command cannot contain a
229
- set of blacklisted chars (newline or tab). An empty string is returned if the environment
230
- variable is not set.
228
+ set of blacklisted chars (newline or tab).
231
229
 
232
- :rtype: str
230
+ returns: the custom command or n empty string is returned if the environment variable is not set.
233
231
  """
234
232
  command = lookupEnvVar(name='user-defined custom init command',
235
233
  envName='TOIL_CUSTOM_INIT_COMMAND',
@@ -239,7 +237,7 @@ def customInitCmd():
239
237
 
240
238
 
241
239
  def _check_custom_bash_cmd(cmd_str):
242
- """Ensures that the bash command doesn't contain blacklisted characters."""
240
+ """Ensure that the Bash command doesn't contain invalid characters."""
243
241
  assert not re.search(r'[\n\r\t]', cmd_str), f'"{cmd_str}" contains invalid characters (newline and/or tab).'
244
242
 
245
243
 
@@ -284,10 +282,9 @@ def checkDockerImageExists(appliance: str) -> str:
284
282
  tag=tag)
285
283
 
286
284
 
287
- def parseDockerAppliance(appliance):
285
+ def parseDockerAppliance(appliance: str) -> Tuple[str, str, str]:
288
286
  """
289
- Takes string describing a docker image and returns the parsed
290
- registry, image reference, and tag for that image.
287
+ Derive parsed registry, image reference, and tag from a docker image string.
291
288
 
292
289
  Example: "quay.io/ucsc_cgl/toil:latest"
293
290
  Should return: "quay.io", "ucsc_cgl/toil", "latest"
@@ -298,7 +295,7 @@ def parseDockerAppliance(appliance):
298
295
  :param appliance: The full url of the docker image originally
299
296
  specified by the user (or the default).
300
297
  e.g. "quay.io/ucsc_cgl/toil:latest"
301
- :return: registryName, imageName, tag
298
+ :returns: registryName, imageName, tag
302
299
  """
303
300
  appliance = appliance.lower()
304
301
 
@@ -335,10 +332,7 @@ def checkDockerSchema(appliance):
335
332
 
336
333
  class ApplianceImageNotFound(ImageNotFound):
337
334
  """
338
- Compose an ApplianceImageNotFound error complaining that the given name and
339
- tag for TOIL_APPLIANCE_SELF specify an image manifest which could not be
340
- retrieved from the given URL, because it produced the given HTTP error
341
- code.
335
+ Error raised when using TOIL_APPLIANCE_SELF results in an HTTP error.
342
336
 
343
337
  :param str origAppliance: The full url of the docker image originally
344
338
  specified by the user (or the default).
@@ -363,28 +357,27 @@ class ApplianceImageNotFound(ImageNotFound):
363
357
  # all the time.
364
358
  KNOWN_EXTANT_IMAGES = set()
365
359
 
366
- def requestCheckRegularDocker(origAppliance, registryName, imageName, tag):
360
+ def requestCheckRegularDocker(origAppliance: str, registryName: str, imageName: str, tag: str) -> bool:
367
361
  """
368
- Checks to see if an image exists using the requests library.
362
+ Check if an image exists using the requests library.
369
363
 
370
- URL is based on the docker v2 schema described here:
371
- https://docs.docker.com/registry/spec/manifest-v2-2/
364
+ URL is based on the
365
+ `docker v2 schema <https://docs.docker.com/registry/spec/manifest-v2-2/>`_.
372
366
 
373
- This has the following format:
374
- https://{websitehostname}.io/v2/{repo}/manifests/{tag}
367
+ This has the following format: ``https://{websitehostname}.io/v2/{repo}/manifests/{tag}``
375
368
 
376
369
  Does not work with the official (docker.io) site, because they require an OAuth token, so a
377
370
  separate check is done for docker.io images.
378
371
 
379
- :param str origAppliance: The full url of the docker image originally
380
- specified by the user (or the default).
381
- e.g. "quay.io/ucsc_cgl/toil:latest"
382
- :param str registryName: The url of a docker image's registry. e.g. "quay.io"
383
- :param str imageName: The image, including path and excluding the tag. e.g. "ucsc_cgl/toil"
384
- :param str tag: The tag used at that docker image's registry. e.g. "latest"
385
- :return: Return True if match found. Raise otherwise.
372
+ :param origAppliance: The full url of the docker image originally
373
+ specified by the user (or the default).
374
+ e.g. ``quay.io/ucsc_cgl/toil:latest``
375
+ :param registryName: The url of a docker image's registry. e.g. ``quay.io``
376
+ :param imageName: The image, including path and excluding the tag. e.g. ``ucsc_cgl/toil``
377
+ :param tag: The tag used at that docker image's registry. e.g. ``latest``
378
+ :raises: ApplianceImageNotFound if no match is found.
379
+ :return: Return True if match found.
386
380
  """
387
-
388
381
  if origAppliance in KNOWN_EXTANT_IMAGES:
389
382
  # Check the cache first
390
383
  return origAppliance
@@ -399,19 +392,19 @@ def requestCheckRegularDocker(origAppliance, registryName, imageName, tag):
399
392
  return origAppliance
400
393
 
401
394
 
402
- def requestCheckDockerIo(origAppliance, imageName, tag):
395
+ def requestCheckDockerIo(origAppliance: str, imageName: str, tag: str) -> bool:
403
396
  """
404
- Checks docker.io to see if an image exists using the requests library.
397
+ Check docker.io to see if an image exists using the requests library.
405
398
 
406
399
  URL is based on the docker v2 schema. Requires that an access token be fetched first.
407
400
 
408
- :param str origAppliance: The full url of the docker image originally
409
- specified by the user (or the default). e.g. "ubuntu:latest"
410
- :param str imageName: The image, including path and excluding the tag. e.g. "ubuntu"
411
- :param str tag: The tag used at that docker image's registry. e.g. "latest"
412
- :return: Return True if match found. Raise otherwise.
401
+ :param origAppliance: The full url of the docker image originally
402
+ specified by the user (or the default). e.g. "ubuntu:latest"
403
+ :param imageName: The image, including path and excluding the tag. e.g. "ubuntu"
404
+ :param tag: The tag used at that docker image's registry. e.g. "latest"
405
+ :raises: ApplianceImageNotFound if no match is found.
406
+ :return: Return True if match found.
413
407
  """
414
-
415
408
  if origAppliance in KNOWN_EXTANT_IMAGES:
416
409
  # Check the cache first
417
410
  return origAppliance
@@ -484,8 +477,9 @@ try:
484
477
 
485
478
  class BotoCredentialAdapter(provider.Provider):
486
479
  """
487
- Adapter to allow Boto 2 to use AWS credentials obtained via Boto 3's
488
- credential finding logic. This allows for automatic role assumption
480
+ Boto 2 Adapter to use AWS credentials obtained via Boto 3's credential finding logic.
481
+
482
+ This allows for automatic role assumption
489
483
  respecting the Boto 3 config files, even when parts of the app still use
490
484
  Boto 2.
491
485
 
@@ -493,18 +487,12 @@ try:
493
487
  to avoid loads of processes swamping the EC2 metadata service.
494
488
  """
495
489
 
496
- """
497
- Create a new BotoCredentialAdapter.
498
- """
499
-
500
490
  # TODO: We take kwargs because new boto2 versions have an 'anon'
501
491
  # argument and we want to be future proof
502
492
 
503
493
  def __init__(self, name, access_key=None, secret_key=None,
504
494
  security_token=None, profile_name=None, **kwargs):
505
- """
506
- Create a new BotoCredentialAdapter.
507
- """
495
+ """Create a new BotoCredentialAdapter."""
508
496
  # TODO: We take kwargs because new boto2 versions have an 'anon'
509
497
  # argument and we want to be future proof
510
498
 
@@ -526,10 +514,10 @@ try:
526
514
 
527
515
  def get_credentials(self, access_key=None, secret_key=None, security_token=None, profile_name=None):
528
516
  """
529
- Make sure our credential fields are populated. Called by the base class
530
- constructor.
531
- """
517
+ Make sure our credential fields are populated.
532
518
 
519
+ Called by the base class constructor.
520
+ """
533
521
  if self._boto3_resolver is not None:
534
522
  # Go get the credentials from the cache, or from boto3 if not cached.
535
523
  # We need to be eager here; having the default None
@@ -544,6 +532,8 @@ try:
544
532
 
545
533
  def _populate_keys_from_metadata_server(self):
546
534
  """
535
+ Hack to catch _credential_expiry_time being too soon and refresh the credentials.
536
+
547
537
  This override is misnamed; it's actually the only hook we have to catch
548
538
  _credential_expiry_time being too soon and refresh the credentials. We
549
539
  actually just go back and poke the cache to see if it feels like
@@ -557,7 +547,6 @@ try:
557
547
 
558
548
  So if we ever want to refresh, Boto 3 wants to refresh too.
559
549
  """
560
-
561
550
  # This should only happen if we have expiring credentials, which we should only get from boto3
562
551
  assert (self._boto3_resolver is not None)
563
552
 
@@ -566,6 +555,8 @@ try:
566
555
  @retry()
567
556
  def _obtain_credentials_from_boto3(self):
568
557
  """
558
+ Fill our credential fields from Boto 3.
559
+
569
560
  We know the current cached credentials are not good, and that we
570
561
  need to get them from Boto 3. Fill in our credential fields
571
562
  (_access_key, _secret_key, _security_token,
@@ -605,7 +596,9 @@ try:
605
596
 
606
597
  def _obtain_credentials_from_cache_or_boto3(self):
607
598
  """
608
- Get the cached credentials, or retrieve them from Boto 3 and cache them
599
+ Get the cached credentials.
600
+
601
+ Or retrieve them from Boto 3 and cache them
609
602
  (or wait for another cooperating process to do so) if they are missing
610
603
  or not fresh enough.
611
604
  """