toil 8.0.0__py3-none-any.whl → 8.1.0b1__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 (41) hide show
  1. toil/__init__.py +4 -4
  2. toil/batchSystems/options.py +1 -0
  3. toil/batchSystems/slurm.py +227 -83
  4. toil/common.py +161 -45
  5. toil/cwl/cwltoil.py +31 -10
  6. toil/job.py +47 -38
  7. toil/jobStores/aws/jobStore.py +46 -10
  8. toil/lib/aws/session.py +14 -3
  9. toil/lib/aws/utils.py +92 -35
  10. toil/lib/dockstore.py +379 -0
  11. toil/lib/ec2nodes.py +3 -2
  12. toil/lib/history.py +1271 -0
  13. toil/lib/history_submission.py +681 -0
  14. toil/lib/io.py +22 -1
  15. toil/lib/misc.py +18 -0
  16. toil/lib/retry.py +10 -10
  17. toil/lib/{integration.py → trs.py} +95 -46
  18. toil/lib/web.py +38 -0
  19. toil/options/common.py +17 -2
  20. toil/options/cwl.py +10 -0
  21. toil/provisioners/gceProvisioner.py +4 -4
  22. toil/server/cli/wes_cwl_runner.py +3 -3
  23. toil/server/utils.py +2 -3
  24. toil/statsAndLogging.py +35 -1
  25. toil/test/batchSystems/test_slurm.py +172 -2
  26. toil/test/cwl/conftest.py +39 -0
  27. toil/test/cwl/cwlTest.py +105 -2
  28. toil/test/cwl/optional-file.cwl +18 -0
  29. toil/test/lib/test_history.py +212 -0
  30. toil/test/lib/test_trs.py +161 -0
  31. toil/test/wdl/wdltoil_test.py +1 -1
  32. toil/version.py +10 -10
  33. toil/wdl/wdltoil.py +23 -9
  34. toil/worker.py +113 -33
  35. {toil-8.0.0.dist-info → toil-8.1.0b1.dist-info}/METADATA +9 -4
  36. {toil-8.0.0.dist-info → toil-8.1.0b1.dist-info}/RECORD +40 -34
  37. {toil-8.0.0.dist-info → toil-8.1.0b1.dist-info}/WHEEL +1 -1
  38. toil/test/lib/test_integration.py +0 -104
  39. {toil-8.0.0.dist-info → toil-8.1.0b1.dist-info}/LICENSE +0 -0
  40. {toil-8.0.0.dist-info → toil-8.1.0b1.dist-info}/entry_points.txt +0 -0
  41. {toil-8.0.0.dist-info → toil-8.1.0b1.dist-info}/top_level.txt +0 -0
toil/worker.py CHANGED
@@ -11,6 +11,7 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+ import atexit
14
15
  import base64
15
16
  import copy
16
17
  import json
@@ -22,7 +23,9 @@ import shutil
22
23
  import signal
23
24
  import socket
24
25
  import stat
26
+ import subprocess
25
27
  import sys
28
+ import threading
26
29
  import time
27
30
  import traceback
28
31
  from collections.abc import Iterator
@@ -59,7 +62,6 @@ class StatsDict(MagicExpando):
59
62
 
60
63
  jobs: list[MagicExpando]
61
64
 
62
-
63
65
  def nextChainable(
64
66
  predecessor: JobDescription, job_store: AbstractJobStore, config: Config
65
67
  ) -> Optional[JobDescription]:
@@ -165,6 +167,85 @@ def nextChainable(
165
167
  # Made it through! This job is chainable.
166
168
  return successor
167
169
 
170
+ def unstick_worker(interval: float = 120, timeout: float = 120) -> None:
171
+ """
172
+ Thread function that tries to prevent the process from getting stuck.
173
+
174
+ Meant to be used as a daemon thread: does not have a shutdown signal but
175
+ cleans up on exit.
176
+
177
+ :param interval: Try to unstick the process at intervals of this many
178
+ seconds.
179
+ :param timeout: Stop child processes that take longer than this many
180
+ seconds to finish.
181
+ """
182
+
183
+ # We've observed Toil getting stuck reading the job from the job store,
184
+ # either due to a problem with the FileJobStore or with local temp storage,
185
+ # but then get unstuck as soon as someone logged in and ran lsof on the
186
+ # Toil process. So we make sure to do that to ourselves every once in a
187
+ # while as long as the worker is running.
188
+
189
+ # Figure out our process ID
190
+ pid = os.getpid()
191
+
192
+ child: Optional[subprocess.Popen[bytes]] = None
193
+
194
+ def clean_up_child() -> None:
195
+ """
196
+ Cleanup function to run at daemon thread shutdown when the main thread
197
+ terminates without shutting us down.
198
+
199
+ Also used to kill the child process if it takes too long.
200
+ """
201
+ if child is not None:
202
+ # Kill the child immediately if it is running
203
+ child.kill()
204
+ try:
205
+ # Wait one last time to try and reap the child process
206
+ child.wait(timeout=5)
207
+ except subprocess.TimeoutExpired:
208
+ pass
209
+
210
+ atexit.register(clean_up_child)
211
+
212
+ # TODO: If we handle daemon thread shutdown just fine, why do we bother
213
+ # with all the event stuff? Why not cut it?
214
+
215
+ # Wait the interval before trying the first unstick
216
+ time.sleep(interval)
217
+
218
+ while True:
219
+ # Run an lsof on our PID, which has been observed to unstick reads.
220
+ #
221
+ # We rely on the thread being able to go away and atexit() hooks
222
+ # happening in the middle of a wait with a timeout.
223
+ #
224
+ # We also want to handle the case where the child process gets so
225
+ # gummed up that it can't exit when killed.
226
+
227
+ # Preserve errors form child process but not output
228
+ child = subprocess.Popen(
229
+ ["lsof", "-p", str(pid)],
230
+ stdin=subprocess.DEVNULL,
231
+ stdout=subprocess.DEVNULL,
232
+ )
233
+ try:
234
+ child.wait(timeout=timeout)
235
+ except subprocess.TimeoutExpired:
236
+ logger.warning("Running lsof took too long!")
237
+ clean_up_child()
238
+ if child.returncode is None:
239
+ # Kill didn't take
240
+ logger.warning("Could not promptly kill child process: %s", child.pid)
241
+
242
+ if child.returncode != 0:
243
+ # Something went wrong, which is suspicious. Either it failed or it
244
+ # timed out and could not be killed promptly.
245
+ logger.warning("Could not list open files on ourselves. Return code: %s", child.returncode)
246
+
247
+ # Wait the interval.
248
+ time.sleep(interval)
168
249
 
169
250
  def workerScript(
170
251
  job_store: AbstractJobStore,
@@ -240,6 +321,13 @@ def workerScript(
240
321
  # We don't need to reap the child. Either it kills us, or we finish
241
322
  # before it does. Either way, init will have to clean it up for us.
242
323
 
324
+ ##########################################
325
+ # Create the worker unsticker
326
+ ##########################################
327
+ unstick_thread = threading.Thread(target=unstick_worker, args=())
328
+ unstick_thread.daemon = True
329
+ unstick_thread.start()
330
+
243
331
  ##########################################
244
332
  # Load the environment for the job
245
333
  ##########################################
@@ -443,13 +531,12 @@ def workerScript(
443
531
  )
444
532
 
445
533
  ##########################################
446
- # Setup the stats, if requested
534
+ # Setup the stats
447
535
  ##########################################
448
536
 
449
- if config.stats:
450
- # Remember the cores from the first job, which is how many we have reserved for us.
451
- statsDict.workers.requested_cores = jobDesc.cores
452
- startClock = ResourceMonitor.get_total_cpu_time()
537
+ # Remember the cores from the first job, which is how many we have reserved for us.
538
+ statsDict.workers.requested_cores = jobDesc.cores
539
+ startClock = ResourceMonitor.get_total_cpu_time()
453
540
 
454
541
  startTime = time.time()
455
542
  while True:
@@ -483,7 +570,7 @@ def workerScript(
483
570
  )
484
571
  try:
485
572
  with job._executor(
486
- stats=statsDict if config.stats else None, fileStore=fileStore
573
+ stats=statsDict, fileStore=fileStore
487
574
  ):
488
575
  with deferredFunctionManager.open() as defer:
489
576
  with fileStore.open(job):
@@ -594,22 +681,21 @@ def workerScript(
594
681
  ##########################################
595
682
  # Finish up the stats
596
683
  ##########################################
597
- if config.stats:
598
- totalCPUTime, totalMemoryUsage = (
599
- ResourceMonitor.get_total_cpu_time_and_memory_usage()
600
- )
601
- statsDict.workers.time = str(time.time() - startTime)
602
- statsDict.workers.clock = str(totalCPUTime - startClock)
603
- statsDict.workers.memory = str(totalMemoryUsage)
604
- # Say the worker used the max disk we saw from any job
605
- max_bytes = 0
606
- for job_stats in statsDict.jobs:
607
- if "disk" in job_stats:
608
- max_bytes = max(max_bytes, int(job_stats.disk))
609
- statsDict.workers.disk = str(max_bytes)
610
- # Count the jobs executed.
611
- # TODO: toil stats could compute this but its parser is too general to hook into simply.
612
- statsDict.workers.jobs_run = len(statsDict.jobs)
684
+ totalCPUTime, totalMemoryUsage = (
685
+ ResourceMonitor.get_total_cpu_time_and_memory_usage()
686
+ )
687
+ statsDict.workers.time = str(time.time() - startTime)
688
+ statsDict.workers.clock = str(totalCPUTime - startClock)
689
+ statsDict.workers.memory = str(totalMemoryUsage)
690
+ # Say the worker used the max disk we saw from any job
691
+ max_bytes = 0
692
+ for job_stats in statsDict.jobs:
693
+ if "disk" in job_stats:
694
+ max_bytes = max(max_bytes, int(job_stats.disk))
695
+ statsDict.workers.disk = str(max_bytes)
696
+ # Count the jobs executed.
697
+ # TODO: toil stats could compute this but its parser is too general to hook into simply.
698
+ statsDict.workers.jobs_run = len(statsDict.jobs)
613
699
 
614
700
  # log the worker log path here so that if the file is truncated the path can still be found
615
701
  if redirect_output_to_log_file:
@@ -767,16 +853,10 @@ def workerScript(
767
853
  statsDict.logs.names = [names.stats_name for names in jobDesc.get_chain()]
768
854
  statsDict.logs.messages = logMessages
769
855
 
770
- if (
771
- debugging
772
- or config.stats
773
- or statsDict.workers.logs_to_leader
774
- or statsDict.workers.logging_user_streams
775
- ):
776
- # We have stats/logging to report back.
777
- # We report even if the job attempt failed.
778
- # TODO: Will that upset analysis of the stats?
779
- job_store.write_logs(json.dumps(statsDict, ensure_ascii=True))
856
+ # We have stats/logging to report back.
857
+ # We report even if the job attempt failed.
858
+ # TODO: Will that upset analysis of the stats?
859
+ job_store.write_logs(json.dumps(statsDict, ensure_ascii=True))
780
860
 
781
861
  # Remove the temp dir
782
862
  cleanUp = config.cleanWorkDir
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: toil
3
- Version: 8.0.0
3
+ Version: 8.1.0b1
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
@@ -37,7 +37,7 @@ Requires-Dist: requests<=2.31.0
37
37
  Requires-Dist: docker<8,>=6.1.0
38
38
  Requires-Dist: urllib3<3,>=1.26.0
39
39
  Requires-Dist: python-dateutil
40
- Requires-Dist: psutil<7,>=6.1.0
40
+ Requires-Dist: psutil<8,>=6.1.0
41
41
  Requires-Dist: PyPubSub<5,>=4.0.3
42
42
  Requires-Dist: addict<2.5,>=2.2.1
43
43
  Requires-Dist: backports.zoneinfo[tzdata]; python_version < "3.9"
@@ -47,6 +47,7 @@ Requires-Dist: ruamel.yaml>=0.15
47
47
  Requires-Dist: pyyaml<7,>=6
48
48
  Requires-Dist: typing-extensions<5,>=4.6.2
49
49
  Requires-Dist: coloredlogs<16,>=15
50
+ Requires-Dist: prompt_toolkit<4,>=3.0
50
51
  Provides-Extra: aws
51
52
  Requires-Dist: boto3-stubs[autoscaling,boto3,ec2,iam,s3,sdb,sts]<2,>=1.28.3.post2; extra == "aws"
52
53
  Requires-Dist: mypy-boto3-iam<2,>=1.28.3.post2; extra == "aws"
@@ -83,7 +84,7 @@ Provides-Extra: server
83
84
  Requires-Dist: connexion[swagger-ui]<4,>=2.10.0; extra == "server"
84
85
  Requires-Dist: flask<4,>=2.0; extra == "server"
85
86
  Requires-Dist: werkzeug<4,>=2.0; extra == "server"
86
- Requires-Dist: flask-cors==5.0.0; extra == "server"
87
+ Requires-Dist: flask-cors==5.0.1; extra == "server"
87
88
  Requires-Dist: gunicorn==23.0.0; extra == "server"
88
89
  Requires-Dist: celery<6,>=5.1.0; extra == "server"
89
90
  Requires-Dist: wes-service<5,>=4.0.0; extra == "server"
@@ -122,7 +123,7 @@ Requires-Dist: graphlib-backport==1.0; python_version < "3.9" and extra == "all"
122
123
  Requires-Dist: connexion[swagger-ui]<4,>=2.10.0; extra == "all"
123
124
  Requires-Dist: flask<4,>=2.0; extra == "all"
124
125
  Requires-Dist: werkzeug<4,>=2.0; extra == "all"
125
- Requires-Dist: flask-cors==5.0.0; extra == "all"
126
+ Requires-Dist: flask-cors==5.0.1; extra == "all"
126
127
  Requires-Dist: gunicorn==23.0.0; extra == "all"
127
128
  Requires-Dist: celery<6,>=5.1.0; extra == "all"
128
129
  Requires-Dist: wes-service<5,>=4.0.0; extra == "all"
@@ -140,6 +141,10 @@ Dynamic: requires-dist
140
141
  Dynamic: requires-python
141
142
  Dynamic: summary
142
143
 
144
+ .. image:: https://flat.badgen.net/https/ucsc-ci.com/api/v4/projects/3/jobs/artifacts/master/raw/badges1.2/required.json%3Fjob=cwl_badge?icon=commonwl&label=CWL%201.2%20Conformance
145
+ :alt: Toil CWL 1.2 Conformance Badge
146
+ :target: https://github.com/common-workflow-language/cwl-v1.2/blob/main/CONFORMANCE_TESTS.md
147
+
143
148
  .. image:: https://badges.gitter.im/bd2k-genomics-toil/Lobby.svg
144
149
  :alt: Join the chat at https://gitter.im/bd2k-genomics-toil/Lobby
145
150
  :target: https://gitter.im/bd2k-genomics-toil/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
@@ -1,17 +1,17 @@
1
- toil/__init__.py,sha256=v0u19Zmd-JKCWBr2jn8Eal4oXMOm-sY5MSSnqUIhfH8,19300
1
+ toil/__init__.py,sha256=lOuyAgzwG9OmmOOqvxMOQCUfDU50sudUjUlHvp3aHns,19330
2
2
  toil/bus.py,sha256=Hi2TTCVGX4WTw67BOKo7l9yZw9Ln_zcobJzQxrfge4M,29938
3
- toil/common.py,sha256=EwIN1Ith42OJsSknXwVk7tZ3SFyuHne13_jPZUxP6WE,75521
3
+ toil/common.py,sha256=MR-AUVmQhNHmN1IqlXTHMNzAbMA8JvwDfXzcgxJCjJ8,81333
4
4
  toil/deferred.py,sha256=2ShsuPqDwu0jhBQ6ocMwe4lfNegBm2lj7dOG9E7X3Zc,14152
5
5
  toil/exceptions.py,sha256=oL2d9uutwtcPkMcEUGrixKUd4y1JLSA0-N7hNJqCLSk,1883
6
- toil/job.py,sha256=Bpj5bi5NPzkUMrG4mbEbkFHHWheqZwZbGRHAtKFZPWw,173199
6
+ toil/job.py,sha256=w31q56P7pq6yvJpoH6mTQU3l0GBsm_O0jnDi5zpGQqI,173735
7
7
  toil/leader.py,sha256=ubIdkEUb3hmGAc7oCWnKuvxOAlyyvOgVyDCN4i6DJAw,85101
8
8
  toil/realtimeLogger.py,sha256=2O4AUaKtvItzzCAQKORIEHZ2cDoLf_6njoKWv_uzdFc,9878
9
9
  toil/resource.py,sha256=PlI6R28aYqfYLDsztjlAYpkVGfSr2O0DhrgDXpXJxa0,25650
10
10
  toil/serviceManager.py,sha256=GE5IUjQmNrekYv9tclim0RlCFf4ueOQ2H4qHjMBrOcg,19978
11
- toil/statsAndLogging.py,sha256=Nq4bwpieQVmJNpj6vuN8zdM_yVRA2pKpcJGcxOn7SWI,17152
11
+ toil/statsAndLogging.py,sha256=JXir7TCV8OdDaAdt3VsDR2rbdNWk4ILyOwlKHVdoXT0,18696
12
12
  toil/toilState.py,sha256=DD52XQv8wRCYzF7-F6Olqa_k6u-_py-JWyjqJHRh6Z0,17989
13
- toil/version.py,sha256=0ff-z3yLFu7Q8r18rieIWcRnUVqARJPAA8YN_omkeTc,488
14
- toil/worker.py,sha256=-V5aL9-5fq2muPZKGKix_D81R5bJrRjQ4fuHzyEq9WM,35998
13
+ toil/version.py,sha256=_Xxx7pjBP8pHk7CZP_gx3EuetyVeDsi9SWhpZw7Ux3s,494
14
+ toil/worker.py,sha256=ywdN4v8qz5CuNQgMJcOlOsVj7BcdqdWuoTp6mFCnE0Y,38967
15
15
  toil/batchSystems/__init__.py,sha256=T8psI5GmvE71_XmajKsfeQ3YUs6XM7rX1Fy9VNUX_-Q,1036
16
16
  toil/batchSystems/abstractBatchSystem.py,sha256=h8mbA_k_7EZqOrbcdQmKHDcAy6D2ZB77XXS3Wu4-E90,33542
17
17
  toil/batchSystems/abstractGridEngineBatchSystem.py,sha256=yR3nlCvJRcxYEDRyA3qYuNjvgmVDfzvW4bx9RY14TLg,24336
@@ -24,10 +24,10 @@ toil/batchSystems/kubernetes.py,sha256=5bC_ipdfgIzl2_I1SxqrcRHPjbcicBNznNK2c3u0g
24
24
  toil/batchSystems/local_support.py,sha256=R-DT_G5jcQXjZyDQ9OdFj0KUeULMSmcLBen3p-tSGdw,3893
25
25
  toil/batchSystems/lsf.py,sha256=rQJe6dpnqs-LAZ0qaAo94VtxvhADwv8XzRTrQulp-mQ,18089
26
26
  toil/batchSystems/lsfHelper.py,sha256=IE5y-x-Mofau7jksWjBdTLt5dVvyj-w8dd3gqwZ-r8o,7227
27
- toil/batchSystems/options.py,sha256=qA6cIFIviI-5ogKwUaTHQkmVnJ7qzsNts8kI3xc49XU,8110
27
+ toil/batchSystems/options.py,sha256=HZ4nI2paKxulcWOd81R3p_j7BE4j2U9ZjWehDKaoyaA,8155
28
28
  toil/batchSystems/registry.py,sha256=eizqlhn4AdBzykdOFu_S5ZcU4eYpMB_vDTb8ml6W3Kw,6701
29
29
  toil/batchSystems/singleMachine.py,sha256=5qj9gr0bcT8RciNYM_eC-aHORdDSbdM4SGlam1SGlGw,40348
30
- toil/batchSystems/slurm.py,sha256=oaP_4axl2YBAWFSoK7khAwPCaTVihJTxtP2VRZQ-vn4,37000
30
+ toil/batchSystems/slurm.py,sha256=xwipLljyzCy8IIXoK-bHCrI05FtGqvMCtUFpE-LnBU4,43565
31
31
  toil/batchSystems/torque.py,sha256=A3Pe1IvIltpJSoVulfEUrilr-Ok_8E9hf41jbHYYzjQ,11795
32
32
  toil/batchSystems/mesos/__init__.py,sha256=jkeRf24eXeOTdRibDzJtqKwXup47FseQS0UXKriKrxg,3554
33
33
  toil/batchSystems/mesos/batchSystem.py,sha256=-3COwXjaibZClIHfAgj98SVy2R2yK8UUCjWaOj-R0hM,40194
@@ -36,7 +36,7 @@ toil/batchSystems/mesos/executor.py,sha256=ETsWkx0JaERw7YS5rzv23_xj492hKSxDOsanV
36
36
  toil/batchSystems/mesos/test/__init__.py,sha256=qa4iDR9yGhZyViSvTyPH5wi6qIlKpKcC5-bj3uvB4PY,4718
37
37
  toil/cwl/__init__.py,sha256=lfyX1eoJ1IA26AUzUl6-ODTi0ZqD_0F6-rL5eqfl_9E,2131
38
38
  toil/cwl/conftest.py,sha256=R6Jw5-PeTCK0rapfHmV_VJwVcqlVbO5w3cFUbaIWUnk,848
39
- toil/cwl/cwltoil.py,sha256=aHc1lqQd9sPaJshg4A--qtkH9pyBAB8XpQfRH14vkU0,181589
39
+ toil/cwl/cwltoil.py,sha256=W7hekJoRG7K1VqRsWDS4In82iHy6Tte2vRdEy0zvdzA,182689
40
40
  toil/cwl/utils.py,sha256=CV69GfCEJ1uvAlbDPJKq42Ed19vBE2E5F7v5MZJK7Gw,8023
41
41
  toil/fileStores/__init__.py,sha256=xbcTdb31JXsLPxBbL3P5lm8XZlHNBohHPyawXNnZLOs,2388
42
42
  toil/fileStores/abstractFileStore.py,sha256=g_gViwfPqYOjGOTQCXrHOulQanump6P0SPirvX6ZqWQ,30851
@@ -49,7 +49,7 @@ toil/jobStores/fileJobStore.py,sha256=r8rymME47BTjGW5a_kb1QDTWF4MDGNrrXtAc8qwpfI
49
49
  toil/jobStores/googleJobStore.py,sha256=xcBWTsM35MyfzYwGZJmqBXOTFMBFHTUFDO0tqc5ALgY,24414
50
50
  toil/jobStores/utils.py,sha256=R1NKkyHC9txT7KMXAoa51aNOJJOHx7HloPqI7PD6ipA,15521
51
51
  toil/jobStores/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
- toil/jobStores/aws/jobStore.py,sha256=jJkYnNESOJbGYZ-eydFQjKSxWAe3p9dkXx8r0NQSTPg,88359
52
+ toil/jobStores/aws/jobStore.py,sha256=bx3HIxUX52ynzFVgr-ytOWjdCKE_LoqCtB6BraN8zRU,89914
53
53
  toil/jobStores/aws/utils.py,sha256=GDSNhcwgkhyrq1YDdYJscg1gjFyGpGxIARUYH3cMvPw,20584
54
54
  toil/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
55
  toil/lib/accelerators.py,sha256=HgDO5rgz-9tU_-fLfScABliMH3VdYSVt-juKfQsUenQ,7937
@@ -57,54 +57,58 @@ toil/lib/bioio.py,sha256=lB9fuyOjWtNZfQCc4x2WzGK3x3xDaq6kW8Ghj1wOchc,2384
57
57
  toil/lib/compatibility.py,sha256=pPPTJyk3GUZ8SdAv14a3v2HLWbNtcnsAFuCEbh36UZ4,1535
58
58
  toil/lib/conversions.py,sha256=CuOHhxpS8RFdp9U-oLSWmhSNLMKT7lqG5N5uhvxfCK4,5135
59
59
  toil/lib/docker.py,sha256=IUWvImtzdaPrCqhzVmTrknXXpgPef23DLUsslZ7KInE,20036
60
+ toil/lib/dockstore.py,sha256=vg82P_g3awPz99dOGXt0k4yeJPlJkTfqPHLzyGujKrc,12848
60
61
  toil/lib/ec2.py,sha256=gceJSDOlhiD0jtKs0e7rS8ploctt-fhJHzrYHr1_lcw,25570
61
- toil/lib/ec2nodes.py,sha256=uydhQaTlr_ISjb658MWocL5CRhbzJb6T-OqqylkC-Q0,14668
62
+ toil/lib/ec2nodes.py,sha256=UVlJqVvMofRUhoEpND3Tal5p_p-p5_LHOJRA3dH7ziI,14693
62
63
  toil/lib/exceptions.py,sha256=lj9oMa1B10TDeJ-7-xgL48Qrx6PExNrLUE2ZCdWQ2BQ,2946
63
64
  toil/lib/expando.py,sha256=JN8dbYk5K48Dwmvb_3bCkO6NYbb89iL0CRchg3_FyFA,2924
64
65
  toil/lib/ftp_utils.py,sha256=VqrstWP6dKJnTHtrxGPp7dzeDpyaD4IR4I5NKrPR3g0,7598
65
66
  toil/lib/generatedEC2Lists.py,sha256=pcdygnoZLokhhihbzm3YMNtXsNZSsvrhjYFA784qeag,274723
67
+ toil/lib/history.py,sha256=oeUsiB18dRz4D8NpIiCwlnKSChpXaij7iEZRU26MZ4M,43694
68
+ toil/lib/history_submission.py,sha256=upoAYlcUg7_fRbfp90reniKZj_mC_eaafm1kAEjosBk,28014
66
69
  toil/lib/humanize.py,sha256=6uXOB07rvAxO8jpIh2kPwy9bfoDu0eEUmBGz9m1chS8,1267
67
- toil/lib/integration.py,sha256=vCFKjV-2K3T1LCZMqdgfCWDF4FAenGqTSflG_reg4vk,16163
68
- toil/lib/io.py,sha256=NX3bm7YGsxb6p76sVnRigweFZf12pfA-oXUs23l023U,12328
70
+ toil/lib/io.py,sha256=enIHHdUNsHx8iIT7lrCd6CXMH8s3dTIIMchl0FF4rHY,13001
69
71
  toil/lib/iterables.py,sha256=gLbbxBzB0f-hhMRcCN9P-TDqNYK0myUKVCYBa9eJo-c,3459
70
72
  toil/lib/memoize.py,sha256=2ikkIOXfZv7LGsoEn8i2ojYTqqNmIIBhSCfBQxySIKg,3225
71
- toil/lib/misc.py,sha256=jCSSftkKiam_MrH9jAZKMMTBEH9CjTBiUUF8zernll0,6657
73
+ toil/lib/misc.py,sha256=qjtya6l4lwYwzuaVy75CUlGwehWglumh76g2YentvZk,7354
72
74
  toil/lib/objects.py,sha256=3XNMtBkNcIB2EMl5cteVDkuSRKAOpnd_GhxgTGVh43M,5381
73
75
  toil/lib/resources.py,sha256=KkfM3hSUwTT__Avh8jPxM0VlrXvqajGjnXScMSlqT7Y,4005
74
- toil/lib/retry.py,sha256=JFGxvx4BK981hqo4MvKoBX1KvJIVNxQafKEYx9MVEDE,22927
76
+ toil/lib/retry.py,sha256=h95XV6zyOsaoTbfNZyPiSjzKL-Cw7HCKaDx37ikO08s,23020
75
77
  toil/lib/threading.py,sha256=cdhEqrScvdtCELE0RUukXdV1nlyAlu-ya7DyVSbskrI,30921
76
78
  toil/lib/throttle.py,sha256=ua21juOmGI7JZP4pXdR8-s2TpF6PpwW3sg11a2gcrbI,4955
79
+ toil/lib/trs.py,sha256=IK-I-wniAp8oUenit_BlVlGENEq4EukJ18Rr1-edTlI,18882
80
+ toil/lib/web.py,sha256=9eJQteiGfh721crY9CSH4zNpPeH4dylPJ7IarAlSAMo,1432
77
81
  toil/lib/aws/__init__.py,sha256=VI77J2o4IehFBpEUjS4eHmXlxEplFnKYHq6w8ZyotEk,7905
78
82
  toil/lib/aws/ami.py,sha256=SD728qocULXqWZmxPslcymukG-MxfNniMsBE9d1VVcM,9341
79
83
  toil/lib/aws/iam.py,sha256=6qNJ6C61XVzbuPX1p-tcnEcabCjIultrVe9MrgcME04,18550
80
84
  toil/lib/aws/s3.py,sha256=accn7bSneZttfb91pZR_80gDhCgVX7Z4ZOKOwM-6u9w,1156
81
- toil/lib/aws/session.py,sha256=xWtzP52v_Wf0hYTVnoIf0FrL-isXIgzZrwRPeW8ajnI,14543
82
- toil/lib/aws/utils.py,sha256=CFgg4g3f6I8kIyg8_JB18xzR5yk-WHZXk7cq_NXb_aU,19738
85
+ toil/lib/aws/session.py,sha256=96l_AGsyA3CpTJiOqPemuLWtGsV28K4DU6vjtDR-pxA,15033
86
+ toil/lib/aws/utils.py,sha256=gk75XIj1Nlw8fN_KoaRb8n-rONmAtAuF2wYUqiev_2E,22205
83
87
  toil/lib/encryption/__init__.py,sha256=HP19EUYJeIMdjZq11fLn_dXIGU98sIkpTxvMxvPaUSs,705
84
88
  toil/lib/encryption/_dummy.py,sha256=6e2fthd6YdgFUgY0kjGb2052KLWUeXD_ejeoCTAThLU,1082
85
89
  toil/lib/encryption/_nacl.py,sha256=_EL8LrF5T5DT0dhNIlyIxDB8c8irGe9nJVh1Sn7mFkA,3747
86
90
  toil/lib/encryption/conftest.py,sha256=jCrRo2AtsGaO6hitm-wkNOTAU78JWSVA52E0hZdMpq8,227
87
91
  toil/options/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
- toil/options/common.py,sha256=fNAOlnsLD_2on6gWHV8nTVikzlx_nrhaco6hLLlRbHo,45075
89
- toil/options/cwl.py,sha256=r2eMuOxbJaq8_mc25KLzzEjAvvWJqe2QfLHcXKidurg,13600
92
+ toil/options/common.py,sha256=c1RtkeeZYw94R-aI_aV6eupvqjYuwBstSBzErHMGs3k,46011
93
+ toil/options/cwl.py,sha256=-KdV5S345Ry-DzmngP_8nHTByeC5UKzEa48Fz-a_1vg,14002
90
94
  toil/options/runner.py,sha256=7DxJLvcMm6CLwTZnPW1f9UmQKx1vw5Sq8VaqJDLzC7g,2388
91
95
  toil/options/wdl.py,sha256=PJ5qile1zus-Jwld8Sb3KmG8zzIIuYVJMj-8jmaRB6U,3167
92
96
  toil/provisioners/__init__.py,sha256=Z3OV95yx77LBVRUtjX_J8r_0OSC2glAIo5y7irbB-S0,9794
93
97
  toil/provisioners/abstractProvisioner.py,sha256=R3OuUV2p8GWWuRs2PbaHkjHufOLyoknUaHq4vKPVGMc,58000
94
98
  toil/provisioners/clusterScaler.py,sha256=9FgnSPbn2U_FYUSJUeN67A0kdh-Yl0roi5nZLeJVr_I,64980
95
- toil/provisioners/gceProvisioner.py,sha256=I0g5oNwsRAr3D-gimCIhk6xZZ-HB_Y3jzgOhMRGx86k,24182
99
+ toil/provisioners/gceProvisioner.py,sha256=8OsbSZeMgAB9l03zQ9WdKZ2-zFrHyzgXoLNdGKjdYcU,24212
96
100
  toil/provisioners/node.py,sha256=RFLXufNQhjiHUO5fBfbEBd4cbtSUWsNmiGcDDodioMI,15198
97
101
  toil/provisioners/aws/__init__.py,sha256=XmVkSuHGMvaMbDJ36yZHGkH5fsUJYJyi3V4R9MYw0Gs,8621
98
102
  toil/provisioners/aws/awsProvisioner.py,sha256=Fd2twLvxKeDKfPw-HoxOdgtJqLajwVVJ1VqhDqt-D0I,89097
99
103
  toil/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
104
  toil/server/app.py,sha256=Xi8ZYs0qKsg1ISNETiYjMtt_qxrou3NuHZcx9bu3MNU,7048
101
105
  toil/server/celery_app.py,sha256=PbdwRb7tY5MU4PkPgFZkq7CMiCe6LHBxw5YgcbdsKIE,663
102
- toil/server/utils.py,sha256=hSeRcdBMBkvS3iGRtF3jB5lVNcsTXJGS-7fV8czuJ4E,21919
106
+ toil/server/utils.py,sha256=HLZb3-HtHqf5QYP3rlSK6C-Av_YxexYrYCcwrcmDP_0,21942
103
107
  toil/server/wsgi_app.py,sha256=3V3xr80F4uJUzeBbTbPI1uKJ3FUcI-H_8T1eiiEM5iw,1959
104
108
  toil/server/api_spec/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
109
  toil/server/api_spec/workflow_execution_service.swagger.yaml,sha256=zZ2QepvbpvLROIcVIHWrcQLUwXEqGfm68fmkdrx8rw8,25377
106
110
  toil/server/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
- toil/server/cli/wes_cwl_runner.py,sha256=vw3KKnoe_oof6PLxiJWenHev53YwVmpzc8N9FwZMoKk,18501
111
+ toil/server/cli/wes_cwl_runner.py,sha256=WpvQeO-4LfnXlgcSuPaoZU0owoLFAdzraF86TfHi6m0,18526
108
112
  toil/server/wes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
113
  toil/server/wes/abstract_backend.py,sha256=d8IA2Fepwr9g6BU-CO3VBvODiPswsps9rPcOKUUvD8k,10202
110
114
  toil/server/wes/amazon_wes_utils.py,sha256=xRrV7hiWoWVwxJykgL2HQdMf1FZg73eqEBltKXya1Fc,10287
@@ -116,7 +120,7 @@ toil/test/batchSystems/batchSystemTest.py,sha256=hMp5mmtGdWxnb4DIjCxy4m-BU9BeJ6n
116
120
  toil/test/batchSystems/batch_system_plugin_test.py,sha256=KUVDjbXgxopEqTC4pAAwUePc-QrThxhChyaernYVpVM,2802
117
121
  toil/test/batchSystems/test_gridengine.py,sha256=kZCF7WIAmCF1LTPPWd4zC6piQr0UaKJ3kYKz5tsBal0,6353
118
122
  toil/test/batchSystems/test_lsf_helper.py,sha256=JICnAPvU7HfqJ0RhIpC-IFfHLKftOAAQF2Iqc7nFs30,4697
119
- toil/test/batchSystems/test_slurm.py,sha256=bCwVanzQf17c9IY9-bSiDAje1lHyCt2PUWUJZy9GKV4,19529
123
+ toil/test/batchSystems/test_slurm.py,sha256=L1OXdVCHTMPrIsqzeJ8ckf9qdWjfW3qFokHJue-fWts,27473
120
124
  toil/test/cactus/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
125
  toil/test/cactus/test_cactus_integration.py,sha256=4sRlsm7b29a08HNHFUbFu_gDW36TQeTfGBvRYUXNF_U,2219
122
126
  toil/test/cwl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -125,8 +129,8 @@ toil/test/cwl/colon_test_output.cwl,sha256=8evFOnHvpJEPn1lBI2zuEKueMUbh2p8oSNOKl
125
129
  toil/test/cwl/colon_test_output_job.yaml,sha256=BbXFRuWsRJV6JpJAutnHywJl_AbwEcwNRszArfRecxs,72
126
130
  toil/test/cwl/conditional_wf.cwl,sha256=SAtUSmD5ta-DVG0SRHpT8EtOp8ztm-6v9Vskcl09c3s,357
127
131
  toil/test/cwl/conditional_wf.yaml,sha256=WsS9dlpbRUll9M56KspQdOJ8h6SASTW7eRELefa274E,24
128
- toil/test/cwl/conftest.py,sha256=okwzv8y-qDSIz--eauonzQXxj6DxyT-u8sXIUMmjxlE,698
129
- toil/test/cwl/cwlTest.py,sha256=t98io1NVD1LSwXRT8jzaLH97noUq5Hf2XDJQ34NZ6fc,63465
132
+ toil/test/cwl/conftest.py,sha256=TGB6svRjbKfzieJDrFN6v-Q0MkV94ABGewyFnAr9YSs,1999
133
+ toil/test/cwl/cwlTest.py,sha256=HuBDqCruWn7i8dGf-O910WQYEpJm9iThPWA7H0Kr-UE,67296
130
134
  toil/test/cwl/directory_from_directory.cwl,sha256=-hjZuUs5fMpKMnbj-FZAgcns4iWsCFJV6Qh7-fsRn1I,556
131
135
  toil/test/cwl/download.cwl,sha256=XQvz8or_-k6pwyhgeUeJOew0_b3BeHcF08EaalbySz4,296
132
136
  toil/test/cwl/download_directory.cwl,sha256=RdPmElFeHJqXGWVqEqR5VFMmXDiJubhTcM9hIrAhKY4,535
@@ -143,6 +147,7 @@ toil/test/cwl/measure_default_memory.cwl,sha256=ZGVgLpnKNxOobjOEWc7EF-spCrDqhYrB
143
147
  toil/test/cwl/mpi_simple.cwl,sha256=xgsOk2yGbAHL3pwtCtxZd6_c9Lopl1xh32dO0D6-Qbc,470
144
148
  toil/test/cwl/not_run_required_input.cwl,sha256=DK8CeCEw8thWiqvoRQmFQcZq6I3HLrt_7gzbYk1te-c,836
145
149
  toil/test/cwl/nvidia_smi.cwl,sha256=peKLDFC9_0zEt7CoRLCQDtAE5bjfotok8Ljmn1nBVtA,474
150
+ toil/test/cwl/optional-file.cwl,sha256=TD2oq8XlGKXz7ytl5l2DB6Gf8KTCeciTFH8tTmB9NqQ,229
146
151
  toil/test/cwl/preemptible.cwl,sha256=BLmrYR3nZX89p1I0-8vGuE-hqKEUbfsuY-CWDcf32BY,304
147
152
  toil/test/cwl/preemptible_expression.cwl,sha256=T_90Y6dBe9nDCjp8Hg4dv9xFsaWVsKSHv5nZ2mafBZ8,639
148
153
  toil/test/cwl/revsort.cwl,sha256=BDAyPb1Tpkp55I_XIiZ3_7dXzQJxxkXo_2CHSk5lcEw,2023
@@ -165,8 +170,9 @@ toil/test/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
170
  toil/test/lib/dockerTest.py,sha256=w9VZ7KHGz3eEdvV9McqT7NgXXWENkizubaEaiPDVeh4,15607
166
171
  toil/test/lib/test_conversions.py,sha256=JSwdTRYklpofPV3VANHC7vHZ7WcpEWOZD6G9Tkjd45w,7232
167
172
  toil/test/lib/test_ec2.py,sha256=p3GfCgSSLqZQ-oanHk1sdIuP1wVUwQvXKsXzWl5ow0I,4183
168
- toil/test/lib/test_integration.py,sha256=E87W-WiOqeHbHNou2d8Nb2GOhjH4XTKL9JH8esQpL2M,4634
173
+ toil/test/lib/test_history.py,sha256=PBgtJzzC_0VAil_yofh4TQX3W6jmGHaXR-dt5eDv3Xg,8344
169
174
  toil/test/lib/test_misc.py,sha256=X1o4Dw1PcbnS1Y_gTR2q4STwqRjXYjSEUy2Q1BxeijM,2766
175
+ toil/test/lib/test_trs.py,sha256=mcGn3boLFkjS_aPMOS-gwlFd7QcMVM-vpLadBnZb8SE,6918
170
176
  toil/test/lib/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
171
177
  toil/test/lib/aws/test_iam.py,sha256=2YTrL6r0WIybOBFltU0bJ4XOADT6vlRRXfbsvexjBt8,6921
172
178
  toil/test/lib/aws/test_s3.py,sha256=NpYO0GnACbGpaKPwM0yeObxqBoFYJv92RUP7VdtompE,3061
@@ -225,7 +231,7 @@ toil/test/utils/toilDebugTest.py,sha256=FlS8_0jKF5d-Y_g4RucRWQDJtUUM6nsjNCrjxVgq
225
231
  toil/test/utils/toilKillTest.py,sha256=qMYnMjeqZGxXan8k0ITaK7D80YYVmfdplFDV0LIJ0t4,3494
226
232
  toil/test/utils/utilsTest.py,sha256=cHDWs_KOud1nIEQ13M5GNV_SE4rOPAtoCb43MbZD9l8,19513
227
233
  toil/test/wdl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
228
- toil/test/wdl/wdltoil_test.py,sha256=yHLJGkEEet-aLrcAcs15iVvvWxuE4NUYs-v78DKIXqg,40105
234
+ toil/test/wdl/wdltoil_test.py,sha256=7ULpOyDPCO0ObYY2t7nHiHm2Mu7TO1XhLlHquoOuTU0,40105
229
235
  toil/test/wdl/wdltoil_test_kubernetes.py,sha256=a45TojDEwksW7MYk1F0KzQdgXJRktQYOsq36CfpBvuo,2818
230
236
  toil/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
231
237
  toil/utils/toilClean.py,sha256=X6Fws6LVqa-ScUITMTomV5iohXa3yz_rAIFnUfXlqZU,1850
@@ -244,10 +250,10 @@ toil/utils/toilStatus.py,sha256=qacxW5lcguvmhUi1b4cjm1acJik0zpsP7CsUuZyX-fo,2042
244
250
  toil/utils/toilUpdateEC2Instances.py,sha256=dreH9Vc2qUoc0he5AwqiFmqdOQp3tMmIfkjWm7GS5qE,1295
245
251
  toil/wdl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
246
252
  toil/wdl/utils.py,sha256=U0TqbVTsap0VdeZjrUf4l71A7Zns-Hkso1B1Zdp2LRk,1316
247
- toil/wdl/wdltoil.py,sha256=WQY6bJKErqjfLnXVahe8dJmDyW75qdtiwmTuH5_qRtM,239255
248
- toil-8.0.0.dist-info/LICENSE,sha256=YVxVi652J1ZDmtC3EMP5r0EbK85-hm_pzogiULmlqUA,12862
249
- toil-8.0.0.dist-info/METADATA,sha256=B3SObwKGhQzZW2p92CSPbw8dmSWFQP4M45MKedRkl4I,8305
250
- toil-8.0.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
251
- toil-8.0.0.dist-info/entry_points.txt,sha256=EF2yFhV2UYuJGr-OjMkUOd3RyOCgRWQbS6XJtBJ25eM,436
252
- toil-8.0.0.dist-info/top_level.txt,sha256=1ydj7IXvHS9tMT5OVTSSpub6ZOaQeIn3KGCgJqaikF0,5
253
- toil-8.0.0.dist-info/RECORD,,
253
+ toil/wdl/wdltoil.py,sha256=zlYTgS3cYhpVjCCEF0LgCjj1lMaxXV_64i3cUtwI-d0,240083
254
+ toil-8.1.0b1.dist-info/LICENSE,sha256=YVxVi652J1ZDmtC3EMP5r0EbK85-hm_pzogiULmlqUA,12862
255
+ toil-8.1.0b1.dist-info/METADATA,sha256=vlhUOh-R2Xlue9YJSlAWX_lkBvGCOldmshpGPFy93Pg,8663
256
+ toil-8.1.0b1.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
257
+ toil-8.1.0b1.dist-info/entry_points.txt,sha256=EF2yFhV2UYuJGr-OjMkUOd3RyOCgRWQbS6XJtBJ25eM,436
258
+ toil-8.1.0b1.dist-info/top_level.txt,sha256=1ydj7IXvHS9tMT5OVTSSpub6ZOaQeIn3KGCgJqaikF0,5
259
+ toil-8.1.0b1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (76.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,104 +0,0 @@
1
- # Copyright (C) 2015-2024 Regents of the University of California
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- import io
16
- import logging
17
- import pytest
18
- from typing import IO
19
- import urllib.request
20
- from urllib.error import URLError
21
-
22
- from toil.lib.retry import retry
23
- from toil.lib.integration import get_workflow_root_from_dockstore
24
- from toil.test import ToilTest, needs_online
25
-
26
- logger = logging.getLogger(__name__)
27
- logging.basicConfig(level=logging.DEBUG)
28
-
29
- @pytest.mark.integrative
30
- @needs_online
31
- class DockstoreLookupTest(ToilTest):
32
- """
33
- Make sure we can look up workflows on Dockstore.
34
- """
35
-
36
- @retry(errors=[URLError, RuntimeError])
37
- def read_result(self, url_or_path: str) -> IO[bytes]:
38
- """
39
- Read a file or URL.
40
-
41
- Binary mode to allow testing for binary file support.
42
-
43
- This lets us test that we have the right workflow contents and not care
44
- how we are being shown them.
45
- """
46
- if url_or_path.startswith("http://") or url_or_path.startswith("https://"):
47
- response = urllib.request.urlopen(url_or_path)
48
- if response.status != 200:
49
- raise RuntimeError(f"HTTP error response: {response}")
50
- return response
51
- else:
52
- return open(url_or_path, "rb")
53
-
54
- # TODO: Tests that definitely test a clear cache
55
-
56
- def test_lookup_from_page_url(self) -> None:
57
- PAGE_URL = "https://dockstore.org/workflows/github.com/dockstore/bcc2020-training/HelloWorld:master?tab=info"
58
- # If we go in through the website we get an extra refs/heads/ on the branch name.
59
- WORKFLOW_URL = "https://raw.githubusercontent.com/dockstore/bcc2020-training/master/wdl-training/exercise1/HelloWorld.wdl"
60
- looked_up = get_workflow_root_from_dockstore(PAGE_URL)
61
-
62
- data_from_lookup = self.read_result(looked_up).read()
63
- data_from_source = self.read_result(WORKFLOW_URL).read()
64
- self.assertEqual(data_from_lookup, data_from_source)
65
-
66
- def test_lookup_from_trs(self) -> None:
67
- TRS_ID = "#workflow/github.com/dockstore-testing/md5sum-checker"
68
- # Despite "-checker" in the ID, this actually refers to the base md5sum
69
- # workflow that just happens to have a checker *available*, not to the
70
- # checker workflow itself.
71
- WORKFLOW_URL = "https://raw.githubusercontent.com/dockstore-testing/md5sum-checker/master/md5sum/md5sum-workflow.cwl"
72
- looked_up = get_workflow_root_from_dockstore(TRS_ID)
73
-
74
- data_from_lookup = self.read_result(looked_up).read()
75
- data_from_source = self.read_result(WORKFLOW_URL).read()
76
- self.assertEqual(data_from_lookup, data_from_source)
77
-
78
- def test_lookup_from_trs_cached(self) -> None:
79
- TRS_ID = "#workflow/github.com/dockstore-testing/md5sum-checker"
80
- WORKFLOW_URL = "https://raw.githubusercontent.com/dockstore-testing/md5sum-checker/master/md5sum/md5sum-workflow.cwl"
81
- # This lookup may or may not be cached
82
- get_workflow_root_from_dockstore(TRS_ID)
83
- # This lookup is definitely cached
84
- looked_up = get_workflow_root_from_dockstore(TRS_ID)
85
-
86
- data_from_lookup = self.read_result(looked_up).read()
87
- data_from_source = self.read_result(WORKFLOW_URL).read()
88
- self.assertEqual(data_from_lookup, data_from_source)
89
-
90
- def test_lookup_from_trs_with_version(self) -> None:
91
- TRS_ID = "#workflow/github.com/dockstore-testing/md5sum-checker:workflowWithHTTPImport"
92
- WORKFLOW_URL = "https://raw.githubusercontent.com/dockstore-testing/md5sum-checker/workflowWithHTTPImport/md5sum/md5sum-workflow.cwl"
93
- looked_up = get_workflow_root_from_dockstore(TRS_ID)
94
-
95
- data_from_lookup = self.read_result(looked_up).read()
96
- data_from_source = self.read_result(WORKFLOW_URL).read()
97
- self.assertEqual(data_from_lookup, data_from_source)
98
-
99
- def test_lookup_from_trs_nonexistent_version(self) -> None:
100
- TRS_ID = "#workflow/github.com/dockstore-testing/md5sum-checker:notARealVersion"
101
- with self.assertRaises(RuntimeError):
102
- looked_up = get_workflow_root_from_dockstore(TRS_ID)
103
-
104
-
File without changes