parsl 2023.7.3__tar.gz → 2023.7.17__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 (419) hide show
  1. {parsl-2023.7.3/parsl.egg-info → parsl-2023.7.17}/PKG-INFO +2 -2
  2. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/data_provider/files.py +6 -5
  3. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/dataflow/dflow.py +7 -1
  4. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/dataflow/memoization.py +7 -7
  5. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/high_throughput/executor.py +2 -3
  6. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/high_throughput/process_worker_pool.py +2 -3
  7. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/launchers/errors.py +1 -1
  8. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/cluster_provider.py +2 -1
  9. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/local/local.py +1 -1
  10. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/serialize/base.py +3 -13
  11. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/serialize/concretes.py +22 -3
  12. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/serialize/facade.py +13 -23
  13. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/conftest.py +94 -11
  14. parsl-2023.7.17/parsl/tests/test_bash_apps/test_basic.py +84 -0
  15. parsl-2023.7.17/parsl/tests/test_bash_apps/test_kwarg_storage.py +33 -0
  16. parsl-2023.7.17/parsl/tests/test_bash_apps/test_memoize.py +48 -0
  17. parsl-2023.7.17/parsl/tests/test_bash_apps/test_multiline.py +37 -0
  18. parsl-2023.7.17/parsl/tests/test_bash_apps/test_pipeline.py +84 -0
  19. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_bash_apps/test_stdout.py +15 -30
  20. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_data/test_file_apps.py +13 -15
  21. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_data/test_file_staging.py +2 -2
  22. parsl-2023.7.17/parsl/tests/test_data/test_output_chain_filenames.py +36 -0
  23. parsl-2023.7.17/parsl/tests/test_docs/test_workflow4.py +43 -0
  24. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_error_handling/test_htex_worker_failure.py +5 -12
  25. parsl-2023.7.17/parsl/tests/test_python_apps/test_fail.py +68 -0
  26. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_garbage_collect.py +15 -9
  27. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_join.py +19 -20
  28. parsl-2023.7.17/parsl/tests/test_python_apps/test_mapred.py +34 -0
  29. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +6 -7
  30. parsl-2023.7.17/parsl/tests/test_python_apps/test_outputs.py +28 -0
  31. parsl-2023.7.17/parsl/tests/test_python_apps/test_overview.py +23 -0
  32. parsl-2023.7.17/parsl/tests/test_python_apps/test_pipeline.py +35 -0
  33. parsl-2023.7.17/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +42 -0
  34. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_scaling/test_regression_1621.py +26 -20
  35. parsl-2023.7.17/parsl/tests/test_scaling/test_scale_down.py +97 -0
  36. parsl-2023.7.17/parsl/tests/test_serialization/test_2555_caching_deserializer.py +34 -0
  37. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/utils.py +8 -6
  38. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/version.py +1 -1
  39. {parsl-2023.7.3 → parsl-2023.7.17/parsl.egg-info}/PKG-INFO +2 -2
  40. {parsl-2023.7.3 → parsl-2023.7.17}/parsl.egg-info/SOURCES.txt +1 -0
  41. parsl-2023.7.3/parsl/tests/test_bash_apps/test_basic.py +0 -115
  42. parsl-2023.7.3/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -104
  43. parsl-2023.7.3/parsl/tests/test_bash_apps/test_memoize.py +0 -72
  44. parsl-2023.7.3/parsl/tests/test_bash_apps/test_multiline.py +0 -63
  45. parsl-2023.7.3/parsl/tests/test_bash_apps/test_pipeline.py +0 -120
  46. parsl-2023.7.3/parsl/tests/test_data/test_output_chain_filenames.py +0 -46
  47. parsl-2023.7.3/parsl/tests/test_docs/test_workflow4.py +0 -53
  48. parsl-2023.7.3/parsl/tests/test_python_apps/test_fail.py +0 -106
  49. parsl-2023.7.3/parsl/tests/test_python_apps/test_mapred.py +0 -59
  50. parsl-2023.7.3/parsl/tests/test_python_apps/test_outputs.py +0 -41
  51. parsl-2023.7.3/parsl/tests/test_python_apps/test_overview.py +0 -60
  52. parsl-2023.7.3/parsl/tests/test_python_apps/test_pipeline.py +0 -38
  53. parsl-2023.7.3/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -17
  54. parsl-2023.7.3/parsl/tests/test_scaling/test_scale_down.py +0 -80
  55. {parsl-2023.7.3 → parsl-2023.7.17}/LICENSE +0 -0
  56. {parsl-2023.7.3 → parsl-2023.7.17}/MANIFEST.in +0 -0
  57. {parsl-2023.7.3 → parsl-2023.7.17}/README.rst +0 -0
  58. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/__init__.py +0 -0
  59. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/addresses.py +0 -0
  60. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/app/__init__.py +0 -0
  61. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/app/app.py +0 -0
  62. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/app/bash.py +0 -0
  63. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/app/errors.py +0 -0
  64. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/app/futures.py +0 -0
  65. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/app/python.py +0 -0
  66. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/benchmark/__init__.py +0 -0
  67. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/benchmark/perf.py +0 -0
  68. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/channels/__init__.py +0 -0
  69. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/channels/base.py +0 -0
  70. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/channels/errors.py +0 -0
  71. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/channels/local/__init__.py +0 -0
  72. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/channels/local/local.py +0 -0
  73. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/channels/oauth_ssh/__init__.py +0 -0
  74. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/channels/oauth_ssh/oauth_ssh.py +0 -0
  75. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/channels/ssh/__init__.py +0 -0
  76. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/channels/ssh/ssh.py +0 -0
  77. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/channels/ssh_il/__init__.py +0 -0
  78. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/channels/ssh_il/ssh_il.py +0 -0
  79. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/concurrent/__init__.py +0 -0
  80. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/config.py +0 -0
  81. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/ASPIRE1.py +0 -0
  82. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/Azure.py +0 -0
  83. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/__init__.py +0 -0
  84. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/ad_hoc.py +0 -0
  85. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/bluewaters.py +0 -0
  86. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/bridges.py +0 -0
  87. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/cc_in2p3.py +0 -0
  88. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/comet.py +0 -0
  89. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/cooley.py +0 -0
  90. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/ec2.py +0 -0
  91. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/frontera.py +0 -0
  92. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/htex_local.py +0 -0
  93. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/illinoiscluster.py +0 -0
  94. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/kubernetes.py +0 -0
  95. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/local_threads.py +0 -0
  96. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/midway.py +0 -0
  97. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/osg.py +0 -0
  98. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/polaris.py +0 -0
  99. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/stampede2.py +0 -0
  100. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/summit.py +0 -0
  101. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/theta.py +0 -0
  102. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/toss3_llnl.py +0 -0
  103. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/vineex_local.py +0 -0
  104. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/configs/wqex_local.py +0 -0
  105. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/data_provider/__init__.py +0 -0
  106. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/data_provider/data_manager.py +0 -0
  107. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/data_provider/file_noop.py +0 -0
  108. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/data_provider/ftp.py +0 -0
  109. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/data_provider/globus.py +0 -0
  110. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/data_provider/http.py +0 -0
  111. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/data_provider/rsync.py +0 -0
  112. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/data_provider/staging.py +0 -0
  113. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/dataflow/__init__.py +0 -0
  114. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/dataflow/errors.py +0 -0
  115. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/dataflow/executor_status.py +0 -0
  116. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/dataflow/futures.py +0 -0
  117. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/dataflow/job_error_handler.py +0 -0
  118. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/dataflow/job_status_poller.py +0 -0
  119. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/dataflow/rundirs.py +0 -0
  120. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/dataflow/states.py +0 -0
  121. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/dataflow/strategy.py +0 -0
  122. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/dataflow/taskrecord.py +0 -0
  123. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/errors.py +0 -0
  124. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/__init__.py +0 -0
  125. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/base.py +0 -0
  126. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/errors.py +0 -0
  127. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/flux/__init__.py +0 -0
  128. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/flux/execute_parsl_task.py +0 -0
  129. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/flux/executor.py +0 -0
  130. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/flux/flux_instance_manager.py +0 -0
  131. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/high_throughput/__init__.py +0 -0
  132. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/high_throughput/errors.py +0 -0
  133. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/high_throughput/interchange.py +0 -0
  134. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/high_throughput/manager_record.py +0 -0
  135. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  136. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/high_throughput/probe.py +0 -0
  137. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
  138. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/status_handling.py +0 -0
  139. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/taskvine/__init__.py +0 -0
  140. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/taskvine/errors.py +0 -0
  141. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  142. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/taskvine/executor.py +0 -0
  143. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/threads.py +0 -0
  144. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/workqueue/__init__.py +0 -0
  145. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/workqueue/errors.py +0 -0
  146. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  147. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/workqueue/executor.py +0 -0
  148. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  149. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  150. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/launchers/__init__.py +0 -0
  151. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/launchers/base.py +0 -0
  152. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/launchers/launchers.py +0 -0
  153. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/log_utils.py +0 -0
  154. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/__init__.py +0 -0
  155. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/db_manager.py +0 -0
  156. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/message_type.py +0 -0
  157. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/monitoring.py +0 -0
  158. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/queries/__init__.py +0 -0
  159. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/queries/pandas.py +0 -0
  160. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/radios.py +0 -0
  161. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/remote.py +0 -0
  162. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/types.py +0 -0
  163. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/__init__.py +0 -0
  164. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/app.py +0 -0
  165. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/models.py +0 -0
  166. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  167. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  168. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  169. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  170. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  171. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  172. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  173. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/templates/app.html +0 -0
  174. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/templates/dag.html +0 -0
  175. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/templates/error.html +0 -0
  176. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/templates/layout.html +0 -0
  177. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  178. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/templates/task.html +0 -0
  179. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  180. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  181. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/utils.py +0 -0
  182. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/version.py +0 -0
  183. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/monitoring/visualization/views.py +0 -0
  184. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/multiprocessing.py +0 -0
  185. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/process_loggers.py +0 -0
  186. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/__init__.py +0 -0
  187. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/ad_hoc/__init__.py +0 -0
  188. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
  189. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/aws/__init__.py +0 -0
  190. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/aws/aws.py +0 -0
  191. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/aws/template.py +0 -0
  192. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/azure/__init__.py +0 -0
  193. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/azure/azure.py +0 -0
  194. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/azure/template.py +0 -0
  195. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/base.py +0 -0
  196. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/cobalt/__init__.py +0 -0
  197. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/cobalt/cobalt.py +0 -0
  198. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/cobalt/template.py +0 -0
  199. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/condor/__init__.py +0 -0
  200. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/condor/condor.py +0 -0
  201. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/condor/template.py +0 -0
  202. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/errors.py +0 -0
  203. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/googlecloud/__init__.py +0 -0
  204. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/googlecloud/googlecloud.py +0 -0
  205. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/grid_engine/__init__.py +0 -0
  206. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/grid_engine/grid_engine.py +0 -0
  207. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/grid_engine/template.py +0 -0
  208. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/kubernetes/__init__.py +0 -0
  209. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/kubernetes/kube.py +0 -0
  210. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/kubernetes/template.py +0 -0
  211. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/local/__init__.py +0 -0
  212. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/lsf/__init__.py +0 -0
  213. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/lsf/lsf.py +0 -0
  214. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/lsf/template.py +0 -0
  215. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/pbspro/__init__.py +0 -0
  216. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/pbspro/pbspro.py +0 -0
  217. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/pbspro/template.py +0 -0
  218. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/slurm/__init__.py +0 -0
  219. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/slurm/slurm.py +0 -0
  220. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/slurm/template.py +0 -0
  221. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/torque/__init__.py +0 -0
  222. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/torque/template.py +0 -0
  223. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/providers/torque/torque.py +0 -0
  224. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/py.typed +0 -0
  225. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/serialize/__init__.py +0 -0
  226. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/__init__.py +0 -0
  227. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/callables_helper.py +0 -0
  228. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/__init__.py +0 -0
  229. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/ad_hoc_cluster_htex.py +0 -0
  230. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/azure_single_node.py +0 -0
  231. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/bluewaters.py +0 -0
  232. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/bridges.py +0 -0
  233. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/cc_in2p3.py +0 -0
  234. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/comet.py +0 -0
  235. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/cooley_htex.py +0 -0
  236. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/ec2_single_node.py +0 -0
  237. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/ec2_spot.py +0 -0
  238. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/frontera.py +0 -0
  239. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/htex_ad_hoc_cluster.py +0 -0
  240. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/htex_local.py +0 -0
  241. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/htex_local_alternate.py +0 -0
  242. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  243. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  244. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/local_adhoc.py +0 -0
  245. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/local_threads.py +0 -0
  246. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  247. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  248. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  249. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  250. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  251. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/local_threads_globus.py +0 -0
  252. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  253. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/local_threads_monitoring.py +0 -0
  254. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  255. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/midway.py +0 -0
  256. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/nscc_singapore.py +0 -0
  257. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/osg_htex.py +0 -0
  258. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/petrelkube.py +0 -0
  259. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/summit.py +0 -0
  260. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/swan_htex.py +0 -0
  261. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/taskvine_ex.py +0 -0
  262. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/theta.py +0 -0
  263. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/user_opts.py +0 -0
  264. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/configs/workqueue_ex.py +0 -0
  265. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/__init__.py +0 -0
  266. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/latency.py +0 -0
  267. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/test_apps/__init__.py +0 -0
  268. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/test_channels/__init__.py +0 -0
  269. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/test_channels/test_channels.py +0 -0
  270. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
  271. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/test_channels/test_scp_1.py +0 -0
  272. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/test_channels/test_ssh_1.py +0 -0
  273. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/test_channels/test_ssh_errors.py +0 -0
  274. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -0
  275. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -0
  276. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  277. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/test_stress/__init__.py +0 -0
  278. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  279. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  280. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/manual_tests/__init__.py +0 -0
  281. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/manual_tests/htex_local.py +0 -0
  282. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -0
  283. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/manual_tests/test_basic.py +0 -0
  284. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
  285. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  286. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  287. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/manual_tests/test_oauth_ssh.py +0 -0
  288. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  289. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
  290. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  291. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/scaling_tests/__init__.py +0 -0
  292. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/scaling_tests/htex_local.py +0 -0
  293. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/scaling_tests/local_threads.py +0 -0
  294. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/scaling_tests/test_scale.py +0 -0
  295. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
  296. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/scaling_tests/vineex_local.py +0 -0
  297. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
  298. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/scaling_tests/wqex_local.py +0 -0
  299. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/site_tests/__init__.py +0 -0
  300. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/site_tests/site_config_selector.py +0 -0
  301. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/site_tests/test_provider.py +0 -0
  302. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/site_tests/test_site.py +0 -0
  303. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/sites/__init__.py +0 -0
  304. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/sites/test_affinity.py +0 -0
  305. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/sites/test_concurrent.py +0 -0
  306. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  307. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/sites/test_ec2.py +0 -0
  308. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/sites/test_launchers.py +0 -0
  309. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/sites/test_local_adhoc.py +0 -0
  310. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  311. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/sites/test_start_method.py +0 -0
  312. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/sites/test_worker_info.py +0 -0
  313. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_aalst_patterns.py +0 -0
  314. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_bash_apps/__init__.py +0 -0
  315. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  316. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  317. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  318. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  319. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  320. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_callables.py +0 -0
  321. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_channels/__init__.py +0 -0
  322. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_channels/test_large_output.py +0 -0
  323. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_checkpointing/__init__.py +0 -0
  324. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  325. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  326. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  327. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
  328. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  329. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  330. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  331. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  332. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_data/__init__.py +0 -0
  333. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_data/test_file.py +0 -0
  334. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_docs/__init__.py +0 -0
  335. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_docs/test_from_slides.py +0 -0
  336. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  337. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_docs/test_workflow1.py +0 -0
  338. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_docs/test_workflow2.py +0 -0
  339. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_docs/test_workflow3.py +0 -0
  340. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_error_handling/__init__.py +0 -0
  341. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_error_handling/test_fail.py +0 -0
  342. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_error_handling/test_htex_basic.py +0 -0
  343. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_error_handling/test_htex_missing_worker.py +0 -0
  344. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  345. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  346. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  347. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_error_handling/test_retries.py +0 -0
  348. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  349. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  350. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  351. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  352. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  353. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_flux.py +0 -0
  354. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_monitoring/__init__.py +0 -0
  355. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_monitoring/test_basic.py +0 -0
  356. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  357. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
  358. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  359. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  360. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_providers/__init__.py +0 -0
  361. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_providers/test_local_provider.py +0 -0
  362. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/__init__.py +0 -0
  363. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  364. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_basic.py +0 -0
  365. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  366. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  367. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  368. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  369. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  370. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_futures.py +0 -0
  371. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  372. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  373. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  374. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  375. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  376. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  377. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_simple.py +0 -0
  378. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  379. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_python_apps/test_type5.py +0 -0
  380. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_regression/__init__.py +0 -0
  381. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_regression/test_1480.py +0 -0
  382. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_regression/test_1653.py +0 -0
  383. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_regression/test_221.py +0 -0
  384. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_regression/test_226.py +0 -0
  385. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_regression/test_2652.py +0 -0
  386. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_regression/test_69a.py +0 -0
  387. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_regression/test_69b.py +0 -0
  388. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_regression/test_854.py +0 -0
  389. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  390. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_regression/test_98.py +0 -0
  391. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_scaling/__init__.py +0 -0
  392. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_serialization/__init__.py +0 -0
  393. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_serialization/test_basic.py +0 -0
  394. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_staging/__init__.py +0 -0
  395. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_staging/staging_provider.py +0 -0
  396. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_staging/test_1316.py +0 -0
  397. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_staging/test_docs_1.py +0 -0
  398. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_staging/test_docs_2.py +0 -0
  399. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  400. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  401. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  402. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  403. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_staging/test_staging_https.py +0 -0
  404. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_staging/test_staging_https_in_task.py +0 -0
  405. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_summary.py +0 -0
  406. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_thread_parallelism.py +0 -0
  407. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_threads/__init__.py +0 -0
  408. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_threads/test_configs.py +0 -0
  409. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  410. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/tests/utils.py +0 -0
  411. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/usage_tracking/__init__.py +0 -0
  412. {parsl-2023.7.3 → parsl-2023.7.17}/parsl/usage_tracking/usage.py +0 -0
  413. {parsl-2023.7.3 → parsl-2023.7.17}/parsl.egg-info/dependency_links.txt +0 -0
  414. {parsl-2023.7.3 → parsl-2023.7.17}/parsl.egg-info/entry_points.txt +0 -0
  415. {parsl-2023.7.3 → parsl-2023.7.17}/parsl.egg-info/requires.txt +0 -0
  416. {parsl-2023.7.3 → parsl-2023.7.17}/parsl.egg-info/top_level.txt +0 -0
  417. {parsl-2023.7.3 → parsl-2023.7.17}/requirements.txt +0 -0
  418. {parsl-2023.7.3 → parsl-2023.7.17}/setup.cfg +0 -0
  419. {parsl-2023.7.3 → parsl-2023.7.17}/setup.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2023.7.3
3
+ Version: 2023.7.17
4
4
  Summary: Simple data dependent workflows in Python
5
5
  Home-page: https://github.com/Parsl/parsl
6
- Download-URL: https://github.com/Parsl/parsl/archive/2023.07.03.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2023.07.17.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -5,11 +5,11 @@ to transfer the file as well as to give the appropriate filepath depending
5
5
  on where (client-side, remote-side, intermediary-side) the File.filepath is
6
6
  being called from.
7
7
  """
8
-
9
8
  import os
9
+
10
10
  import typeguard
11
11
  import logging
12
- from typing import Optional
12
+ from typing import Optional, Union
13
13
  from urllib.parse import urlparse
14
14
 
15
15
  logger = logging.getLogger(__name__)
@@ -28,17 +28,18 @@ class File:
28
28
  """
29
29
 
30
30
  @typeguard.typechecked
31
- def __init__(self, url: str):
31
+ def __init__(self, url: Union[os.PathLike, str]):
32
32
  """Construct a File object from a url string.
33
33
 
34
34
  Args:
35
- - url (string) : url string of the file e.g.
35
+ - url (string or PathLike) : url of the file e.g.
36
36
  - 'input.txt'
37
+ - pathlib.Path('input.txt')
37
38
  - 'file:///scratch/proj101/input.txt'
38
39
  - 'globus://go#ep1/~/data/input.txt'
39
40
  - 'globus://ddb59aef-6d04-11e5-ba46-22000b92c6ec/home/johndoe/data/input.txt'
40
41
  """
41
- self.url = url
42
+ self.url = str(url)
42
43
  parsed_url = urlparse(self.url)
43
44
  self.scheme = parsed_url.scheme if parsed_url.scheme else 'file'
44
45
  self.netloc = parsed_url.netloc
@@ -380,6 +380,12 @@ class DataFlowKernel:
380
380
  task_record['join_lock'] = threading.Lock()
381
381
  self._send_task_log_info(task_record)
382
382
  joinable.add_done_callback(partial(self.handle_join_update, task_record))
383
+ elif joinable == []: # got a list, but it had no entries, and specifically, no Futures.
384
+ self.update_task_state(task_record, States.joining)
385
+ task_record['joins'] = joinable
386
+ task_record['join_lock'] = threading.Lock()
387
+ self._send_task_log_info(task_record)
388
+ self.handle_join_update(task_record, None)
383
389
  elif isinstance(joinable, list) and [j for j in joinable if not isinstance(j, Future)] == []:
384
390
  self.update_task_state(task_record, States.joining)
385
391
  task_record['joins'] = joinable
@@ -403,7 +409,7 @@ class DataFlowKernel:
403
409
  if task_record['status'] == States.pending:
404
410
  self.launch_if_ready(task_record)
405
411
 
406
- def handle_join_update(self, task_record: TaskRecord, inner_app_future: AppFuture) -> None:
412
+ def handle_join_update(self, task_record: TaskRecord, inner_app_future: Optional[AppFuture]) -> None:
407
413
  with task_record['join_lock']:
408
414
  # inner_app_future has completed, which is one (potentially of many)
409
415
  # futures the outer task is joining on.
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
  import hashlib
3
3
  from functools import lru_cache, singledispatch
4
4
  import logging
5
+ import pickle
5
6
  from parsl.dataflow.taskrecord import TaskRecord
6
7
 
7
8
  from typing import Dict, Any, List, Optional, TYPE_CHECKING
@@ -11,7 +12,6 @@ if TYPE_CHECKING:
11
12
 
12
13
  from concurrent.futures import Future
13
14
 
14
- from parsl.serialize import serialize
15
15
  import types
16
16
 
17
17
  logger = logging.getLogger(__name__)
@@ -54,8 +54,8 @@ def id_for_memo(obj: object, output_ref: bool = False) -> bytes:
54
54
  @id_for_memo.register(int)
55
55
  @id_for_memo.register(float)
56
56
  @id_for_memo.register(type(None))
57
- def id_for_memo_serialize(obj: object, output_ref: bool = False) -> bytes:
58
- return serialize(obj)
57
+ def id_for_memo_pickle(obj: object, output_ref: bool = False) -> bytes:
58
+ return pickle.dumps(obj)
59
59
 
60
60
 
61
61
  @id_for_memo.register(list)
@@ -68,7 +68,7 @@ def id_for_memo_list(denormalized_list: list, output_ref: bool = False) -> bytes
68
68
  for e in denormalized_list:
69
69
  normalized_list.append(id_for_memo(e, output_ref=output_ref))
70
70
 
71
- return serialize(normalized_list)
71
+ return pickle.dumps(normalized_list)
72
72
 
73
73
 
74
74
  @id_for_memo.register(tuple)
@@ -81,7 +81,7 @@ def id_for_memo_tuple(denormalized_tuple: tuple, output_ref: bool = False) -> by
81
81
  for e in denormalized_tuple:
82
82
  normalized_list.append(id_for_memo(e, output_ref=output_ref))
83
83
 
84
- return serialize(normalized_list)
84
+ return pickle.dumps(normalized_list)
85
85
 
86
86
 
87
87
  @id_for_memo.register(dict)
@@ -100,7 +100,7 @@ def id_for_memo_dict(denormalized_dict: dict, output_ref: bool = False) -> bytes
100
100
  for k in keys:
101
101
  normalized_list.append(id_for_memo(k))
102
102
  normalized_list.append(id_for_memo(denormalized_dict[k], output_ref=output_ref))
103
- return serialize(normalized_list)
103
+ return pickle.dumps(normalized_list)
104
104
 
105
105
 
106
106
  # the LRU cache decorator must be applied closer to the id_for_memo_function call
@@ -112,7 +112,7 @@ def id_for_memo_function(f: types.FunctionType, output_ref: bool = False) -> byt
112
112
  This means that changing source code (other than the function name) will
113
113
  not cause a checkpoint invalidation.
114
114
  """
115
- return serialize(["types.FunctionType", f.__name__, f.__module__])
115
+ return pickle.dumps(["types.FunctionType", f.__name__, f.__module__])
116
116
 
117
117
 
118
118
  class Memoizer:
@@ -595,10 +595,9 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
595
595
  except TypeError:
596
596
  raise SerializationError(func.__name__)
597
597
 
598
- msg = {"task_id": task_id,
599
- "buffer": fn_buf}
598
+ msg = {"task_id": task_id, "buffer": fn_buf}
600
599
 
601
- # Post task to the the outgoing queue
600
+ # Post task to the outgoing queue
602
601
  self.outgoing_q.put(msg)
603
602
 
604
603
  # Return the future
@@ -370,7 +370,7 @@ class Manager:
370
370
  logger.critical("Exiting")
371
371
 
372
372
  @wrap_with_logs
373
- def worker_watchdog(self, kill_event):
373
+ def worker_watchdog(self, kill_event: threading.Event):
374
374
  """Keeps workers alive.
375
375
 
376
376
  Parameters:
@@ -381,7 +381,7 @@ class Manager:
381
381
 
382
382
  logger.debug("Starting worker watchdog")
383
383
 
384
- while not kill_event.is_set():
384
+ while not kill_event.wait(self.heartbeat_period):
385
385
  for worker_id, p in self.procs.items():
386
386
  if not p.is_alive():
387
387
  logger.error("Worker {} has died".format(worker_id))
@@ -409,7 +409,6 @@ class Manager:
409
409
  name="HTEX-Worker-{}".format(worker_id))
410
410
  self.procs[worker_id] = p
411
411
  logger.info("Worker {} has been restarted".format(worker_id))
412
- time.sleep(self.heartbeat_period)
413
412
 
414
413
  logger.critical("Exiting")
415
414
 
@@ -10,4 +10,4 @@ class BadLauncher(ExecutionProviderException, TypeError):
10
10
  self.launcher = launcher
11
11
 
12
12
  def __str__(self) -> str:
13
- return f"Bad Launcher provided: {self.launcher}, expecting a parsl.launcher.launcher.Launcher or callable"
13
+ return f"Bad Launcher provided: {self.launcher}, expecting a parsl.launcher.launcher.Launcher"
@@ -3,6 +3,7 @@ from abc import abstractmethod
3
3
  from string import Template
4
4
 
5
5
  from parsl.providers.errors import SchedulerMissingArgs, ScriptPathError
6
+ from parsl.launchers.base import Launcher
6
7
  from parsl.launchers.errors import BadLauncher
7
8
  from parsl.providers.base import ExecutionProvider
8
9
 
@@ -66,7 +67,7 @@ class ClusterProvider(ExecutionProvider):
66
67
  self.launcher = launcher
67
68
  self.walltime = walltime
68
69
  self.cmd_timeout = cmd_timeout
69
- if not callable(self.launcher):
70
+ if not isinstance(self.launcher, Launcher):
70
71
  raise BadLauncher(self.launcher)
71
72
 
72
73
  self.script_dir = None
@@ -214,7 +214,7 @@ class LocalProvider(ExecutionProvider, RepresentationMixin):
214
214
  logger.debug("Pushing start script")
215
215
  script_path = self.channel.push_file(script_path, self.channel.script_dir)
216
216
 
217
- logger.debug("Launching in remote mode")
217
+ logger.debug("Launching")
218
218
  # We need to capture the exit code and the streams, so we put them in files. We also write
219
219
  # '-' to the exit code file to isolate potential problems with writing to files in the
220
220
  # script directory
@@ -1,6 +1,5 @@
1
1
  from abc import abstractmethod
2
2
  import logging
3
- import functools
4
3
 
5
4
  from typing import Any
6
5
 
@@ -32,24 +31,15 @@ class SerializerBase:
32
31
 
33
32
  @property
34
33
  def identifier(self) -> bytes:
35
- """ Get the identifier of the serialization method
34
+ """Get that identifier that will be used to indicate in byte streams
35
+ that this class should be used for deserialization.
36
36
 
37
37
  Returns
38
38
  -------
39
- identifier : str
39
+ identifier : bytes
40
40
  """
41
41
  return self._identifier
42
42
 
43
- def enable_caching(self, maxsize: int = 128) -> None:
44
- """ Add functools.lru_cache onto the serialize, deserialize methods
45
- """
46
-
47
- # ignore types here because mypy at the moment is not fond of monkeypatching
48
- self.serialize = functools.lru_cache(maxsize=maxsize)(self.serialize) # type: ignore[method-assign]
49
- self.deserialize = functools.lru_cache(maxsize=maxsize)(self.deserialize) # type: ignore[method-assign]
50
-
51
- return
52
-
53
43
  @abstractmethod
54
44
  def serialize(self, data: Any) -> bytes:
55
45
  pass
@@ -1,4 +1,5 @@
1
1
  import dill
2
+ import functools
2
3
  import pickle
3
4
  import logging
4
5
 
@@ -14,11 +15,10 @@ class PickleSerializer(SerializerBase):
14
15
  * functions defined in a interpreter/notebook
15
16
  * classes defined in local context and not importable using a fully qualified name
16
17
  * closures, generators and coroutines
17
- * [sometimes] issues with wrapped/decorated functions
18
18
  """
19
19
 
20
20
  _identifier = b'01'
21
- _for_code = True
21
+ _for_code = False
22
22
  _for_data = True
23
23
 
24
24
  def serialize(self, data: Any) -> bytes:
@@ -41,7 +41,7 @@ class DillSerializer(SerializerBase):
41
41
  """
42
42
 
43
43
  _identifier = b'02'
44
- _for_code = True
44
+ _for_code = False
45
45
  _for_data = True
46
46
 
47
47
  def serialize(self, data: Any) -> bytes:
@@ -49,3 +49,22 @@ class DillSerializer(SerializerBase):
49
49
 
50
50
  def deserialize(self, body: bytes) -> Any:
51
51
  return dill.loads(body)
52
+
53
+
54
+ class DillCallableSerializer(SerializerBase):
55
+ """This serializer is a variant of the DillSerializer that will
56
+ serialize and deserialize callables using an lru_cache, under the
57
+ assumption that callables are immutable and so can be cached.
58
+ """
59
+
60
+ _identifier = b'C2'
61
+ _for_code = True
62
+ _for_data = False
63
+
64
+ @functools.lru_cache
65
+ def serialize(self, data: Any) -> bytes:
66
+ return dill.dumps(data)
67
+
68
+ @functools.lru_cache
69
+ def deserialize(self, body: bytes) -> Any:
70
+ return dill.loads(body)
@@ -1,8 +1,8 @@
1
1
  from parsl.serialize.concretes import * # noqa: F403,F401
2
- from parsl.serialize.base import METHODS_MAP_DATA, METHODS_MAP_CODE, SerializerBase
2
+ from parsl.serialize.base import METHODS_MAP_DATA, METHODS_MAP_CODE
3
3
  import logging
4
4
 
5
- from typing import Any, Dict, List, Tuple, Union
5
+ from typing import Any, List, Union
6
6
 
7
7
  logger = logging.getLogger(__name__)
8
8
 
@@ -14,16 +14,11 @@ methods_for_data = {}
14
14
 
15
15
  for key in METHODS_MAP_CODE:
16
16
  methods_for_code[key] = METHODS_MAP_CODE[key]()
17
- methods_for_code[key].enable_caching(maxsize=128)
18
17
 
19
18
  for key in METHODS_MAP_DATA:
20
19
  methods_for_data[key] = METHODS_MAP_DATA[key]()
21
20
 
22
21
 
23
- def _list_methods() -> Tuple[Dict[bytes, SerializerBase], Dict[bytes, SerializerBase]]:
24
- return methods_for_code, methods_for_data
25
-
26
-
27
22
  def pack_apply_message(func: Any, args: Any, kwargs: Any, buffer_threshold: int = int(128 * 1e6)) -> bytes:
28
23
  """Serialize and pack function and parameters
29
24
 
@@ -65,23 +60,18 @@ def serialize(obj: Any, buffer_threshold: int = int(1e6)) -> bytes:
65
60
  """
66
61
  result: Union[bytes, Exception]
67
62
  if callable(obj):
68
- for method in methods_for_code.values():
69
- try:
70
- result = method._identifier + b'\n' + method.serialize(obj)
71
- except Exception as e:
72
- result = e
73
- continue
74
- else:
75
- break
63
+ methods = methods_for_code
76
64
  else:
77
- for method in methods_for_data.values():
78
- try:
79
- result = method._identifier + b'\n' + method.serialize(obj)
80
- except Exception as e:
81
- result = e
82
- continue
83
- else:
84
- break
65
+ methods = methods_for_data
66
+
67
+ for method in methods.values():
68
+ try:
69
+ result = method._identifier + b'\n' + method.serialize(obj)
70
+ except Exception as e:
71
+ result = e
72
+ continue
73
+ else:
74
+ break
85
75
 
86
76
  if isinstance(result, BaseException):
87
77
  raise result
@@ -1,12 +1,19 @@
1
1
  import importlib.util
2
+ import itertools
2
3
  import logging
3
4
  import os
4
- from glob import glob
5
- from itertools import chain
5
+ import pathlib
6
+ import time
7
+ import types
6
8
  import signal
7
9
  import sys
10
+ import tempfile
8
11
  import threading
9
12
  import traceback
13
+ import typing as t
14
+ from datetime import datetime
15
+ from glob import glob
16
+ from itertools import chain
10
17
 
11
18
  import pytest
12
19
  import _pytest.runner as runner
@@ -36,6 +43,20 @@ def pytest_sessionstart(session):
36
43
  signal.signal(signal.SIGUSR1, dumpstacks)
37
44
 
38
45
 
46
+ @pytest.fixture(scope="session")
47
+ def tmpd_cwd_session():
48
+ n = datetime.now().strftime('%Y%m%d.%H%I%S')
49
+ with tempfile.TemporaryDirectory(dir=os.getcwd(), prefix=f".pytest-{n}-") as tmpd:
50
+ yield pathlib.Path(tmpd)
51
+
52
+
53
+ @pytest.fixture
54
+ def tmpd_cwd(tmpd_cwd_session, request):
55
+ prefix = f"{request.node.name}-"
56
+ with tempfile.TemporaryDirectory(dir=tmpd_cwd_session, prefix=prefix) as tmpd:
57
+ yield pathlib.Path(tmpd)
58
+
59
+
39
60
  def pytest_addoption(parser):
40
61
  """Add parsl-specific command-line options to pytest.
41
62
  """
@@ -140,9 +161,9 @@ def load_dfk_local_module(request, pytestconfig):
140
161
  parsl.load. It should be a Callable that returns a parsl Config object.
141
162
 
142
163
  If local_setup and/or local_teardown are callables (such as functions) in
143
- the test module, they they will be invoked before/after the tests. This
144
- can be used to perform more interesting DFK initialisation not possible
145
- with local_config.
164
+ the test module, they will be invoked before/after the tests. This can
165
+ be used to perform more interesting DFK initialisation not possible with
166
+ local_config.
146
167
  """
147
168
 
148
169
  config = pytestconfig.getoption('config')[0]
@@ -212,14 +233,12 @@ def apply_masks(request, pytestconfig):
212
233
 
213
234
 
214
235
  @pytest.fixture
215
- def setup_data(tmp_path):
216
- data_dir = tmp_path / "data"
236
+ def setup_data(tmpd_cwd):
237
+ data_dir = tmpd_cwd / "data"
217
238
  data_dir.mkdir()
218
239
 
219
- with open(data_dir / "test1.txt", "w") as f:
220
- f.write("1\n")
221
- with open(data_dir / "test2.txt", "w") as f:
222
- f.write("2\n")
240
+ (data_dir / "test1.txt").write_text("1\n")
241
+ (data_dir / "test2.txt").write_text("2\n")
223
242
  return data_dir
224
243
 
225
244
 
@@ -275,3 +294,67 @@ def pytest_ignore_collect(path):
275
294
  return True
276
295
  else:
277
296
  return False
297
+
298
+
299
+ def create_traceback(start: int = 0) -> t.Optional[types.TracebackType]:
300
+ """
301
+ Dynamically create a traceback.
302
+
303
+ Builds a traceback from the top of the stack (the currently executing frame) on
304
+ down to the root frame. Optionally, use start to build from an earlier stack
305
+ frame.
306
+
307
+ N.B. uses `sys._getframe`, which I only know to exist in CPython.
308
+ """
309
+ tb = None
310
+ for depth in itertools.count(start + 1, 1):
311
+ try:
312
+ frame = sys._getframe(depth)
313
+ tb = types.TracebackType(tb, frame, frame.f_lasti, frame.f_lineno)
314
+ except ValueError:
315
+ break
316
+ return tb
317
+
318
+
319
+ @pytest.fixture
320
+ def try_assert():
321
+ def _impl(
322
+ test_func: t.Callable[[], bool],
323
+ fail_msg: str = "",
324
+ timeout_ms: float = 5000,
325
+ attempts: int = 0,
326
+ check_period_ms: int = 20,
327
+ ):
328
+ tb = create_traceback(start=1)
329
+ timeout_s = abs(timeout_ms) / 1000.0
330
+ check_period_s = abs(check_period_ms) / 1000.0
331
+ if attempts > 0:
332
+ for _attempt_no in range(attempts):
333
+ if test_func():
334
+ return
335
+ time.sleep(check_period_s)
336
+ else:
337
+ att_fail = (
338
+ f"\n (Still failing after attempt limit [{attempts}], testing"
339
+ f" every {check_period_ms}ms)"
340
+ )
341
+ exc = AssertionError(f"{str(fail_msg)}{att_fail}".strip())
342
+ raise exc.with_traceback(tb)
343
+
344
+ elif timeout_s > 0:
345
+ end = time.monotonic() + timeout_s
346
+ while time.monotonic() < end:
347
+ if test_func():
348
+ return
349
+ time.sleep(check_period_s)
350
+ att_fail = (
351
+ f"\n (Still failing after timeout [{timeout_ms}ms], with attempts "
352
+ f"every {check_period_ms}ms)"
353
+ )
354
+ exc = AssertionError(f"{str(fail_msg)}{att_fail}".strip())
355
+ raise exc.with_traceback(tb)
356
+
357
+ else:
358
+ raise AssertionError("Bad assert call: no attempts or timeout period")
359
+
360
+ yield _impl
@@ -0,0 +1,84 @@
1
+ import os
2
+ import random
3
+ import re
4
+
5
+ import pytest
6
+
7
+ import parsl
8
+ from parsl import File
9
+ from parsl.app.app import bash_app
10
+
11
+
12
+ @bash_app
13
+ def echo_to_file(inputs=(), outputs=(), stderr=None, stdout=None):
14
+ res = ""
15
+ for o in outputs:
16
+ for i in inputs:
17
+ res += "echo {} >& {}".format(i, o)
18
+ return res
19
+
20
+
21
+ @bash_app
22
+ def foo(x, y, z=10, stdout=None, label=None):
23
+ return f"echo {x} {y} {z}"
24
+
25
+
26
+ @pytest.mark.issue363
27
+ def test_command_format_1(tmpd_cwd):
28
+ """Testing command format for BashApps"""
29
+
30
+ outdir = tmpd_cwd / "outputs"
31
+ outdir.mkdir()
32
+ stdout = outdir / "foo-std.out"
33
+
34
+ foo_future = foo(1, 4, stdout=str(stdout))
35
+ assert foo_future.result() == 0, "BashApp had non-zero exit code"
36
+
37
+ so_content = stdout.read_text().strip()
38
+ assert so_content == "1 4 10"
39
+
40
+
41
+ @pytest.mark.issue363
42
+ def test_auto_log_filename_format():
43
+ """Testing auto log filename format for BashApps
44
+ """
45
+ app_label = "label_test_auto_log_filename_format"
46
+ rand_int = random.randint(1000, 1000000000)
47
+
48
+ foo_future = foo(1, rand_int, stdout=parsl.AUTO_LOGNAME, label=app_label)
49
+
50
+ assert foo_future.result() == 0, "BashApp exited with an error code : {0}".format(
51
+ foo_future.result())
52
+
53
+ log_fpath = foo_future.stdout
54
+ log_pattern = fr".*/task_\d+_foo_{app_label}"
55
+ assert re.match(log_pattern, log_fpath), 'Output file "{0}" does not match pattern "{1}"'.format(
56
+ log_fpath, log_pattern)
57
+ assert os.path.exists(log_fpath), 'Output file does not exist "{0}"'.format(log_fpath)
58
+ with open(log_fpath, 'r') as stdout_f:
59
+ contents = stdout_f.read()
60
+
61
+ assert contents == '1 {0} 10\n'.format(rand_int), \
62
+ 'Output does not match expected string "1 {0} 10", Got: "{1}"'.format(rand_int, contents)
63
+
64
+
65
+ @pytest.mark.issue363
66
+ def test_parallel_for(tmpd_cwd, n=3):
67
+ """Testing a simple parallel for loop"""
68
+ outdir = tmpd_cwd / "outputs/test_parallel"
69
+ outdir.mkdir(parents=True)
70
+ futs = [
71
+ echo_to_file(
72
+ inputs=[f"Hello World {i}"],
73
+ outputs=[File(str(outdir / f"out.{i}.txt"))],
74
+ stdout=str(outdir / f"std.{i}.out"),
75
+ stderr=str(outdir / f"std.{i}.err"),
76
+ )
77
+ for i in range(n)
78
+ ]
79
+
80
+ for f in futs:
81
+ f.result()
82
+
83
+ stdout_file_count = len(list(outdir.glob("*.out")))
84
+ assert stdout_file_count == n, sorted(outdir.iterdir())
@@ -0,0 +1,33 @@
1
+ import pytest
2
+
3
+ from parsl.app.app import bash_app
4
+
5
+
6
+ @bash_app
7
+ def foo(z=2, stdout=None):
8
+ return f"echo {z}"
9
+
10
+
11
+ @pytest.mark.issue363
12
+ def test_command_format_1(tmpd_cwd):
13
+ """Testing command format for BashApps
14
+ """
15
+
16
+ stdout = tmpd_cwd / "std.out"
17
+ for exp_value, z in (
18
+ ("3", 3),
19
+ ("4", 4),
20
+ ("5", 5),
21
+ ):
22
+ app_fu = foo(z=z, stdout=str(stdout))
23
+ assert app_fu.result() == 0, "BashApp had non-zero exit"
24
+
25
+ so_content = stdout.read_text().strip()
26
+ assert so_content == exp_value
27
+ stdout.unlink()
28
+
29
+ app_fu = foo(stdout=str(stdout))
30
+ assert app_fu.result() == 0, "BashApp had non-zero exit"
31
+
32
+ so_content = stdout.read_text().strip()
33
+ assert so_content == "2"
@@ -0,0 +1,48 @@
1
+ import pytest
2
+
3
+ from parsl import File
4
+ from parsl.app.app import bash_app
5
+
6
+
7
+ @bash_app(cache=True)
8
+ def fail_on_presence(outputs=()):
9
+ return 'if [ -f {0} ] ; then exit 1 ; else touch {0}; fi'.format(outputs[0])
10
+
11
+
12
+ # This test is an oddity that requires a shared-FS and simply
13
+ # won't work if there's a staging provider.
14
+ # @pytest.mark.sharedFS_required
15
+ @pytest.mark.issue363
16
+ def test_bash_memoization(tmpd_cwd, n=2):
17
+ """Testing bash memoization
18
+ """
19
+ mpath = tmpd_cwd / "test.memoization.tmp"
20
+ temp_file = File(str(mpath))
21
+ fail_on_presence(outputs=[temp_file]).result()
22
+
23
+ futs = [fail_on_presence(outputs=[temp_file]) for _ in range(n)]
24
+ for f in futs:
25
+ assert f.exception() is None
26
+
27
+
28
+ @bash_app(cache=True)
29
+ def fail_on_presence_kw(outputs=(), foo=None):
30
+ return 'if [ -f {0} ] ; then exit 1 ; else touch {0}; fi'.format(outputs[0])
31
+
32
+
33
+ # This test is an oddity that requires a shared-FS and simply
34
+ # won't work if there's a staging provider.
35
+ # @pytest.mark.sharedFS_required
36
+ @pytest.mark.issue363
37
+ def test_bash_memoization_keywords(tmpd_cwd, n=2):
38
+ """Testing bash memoization
39
+ """
40
+ mpath = tmpd_cwd / "test.memoization.tmp"
41
+ temp_file = File(str(mpath))
42
+
43
+ foo = {"a": 1, "b": 2}
44
+ fail_on_presence_kw(outputs=[temp_file], foo=foo).result()
45
+
46
+ futs = [fail_on_presence_kw(outputs=[temp_file], foo=foo) for _ in range(n)]
47
+ for f in futs:
48
+ assert f.exception() is None