parsl 2025.7.21__tar.gz → 2025.8.4__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 (479) hide show
  1. {parsl-2025.7.21/parsl.egg-info → parsl-2025.8.4}/PKG-INFO +2 -2
  2. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/dataflow/dflow.py +13 -6
  3. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/high_throughput/executor.py +0 -1
  4. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/status_handling.py +1 -1
  5. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/taskvine/executor.py +1 -2
  6. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/workqueue/executor.py +1 -2
  7. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/jobs/strategy.py +1 -1
  8. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/log_utils.py +22 -19
  9. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/site_tests/test_site.py +2 -2
  10. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +2 -2
  11. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_scaling/test_scale_down.py +2 -2
  12. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +2 -2
  13. parsl-2025.8.4/parsl/tests/test_utils/test_logutils.py +70 -0
  14. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/version.py +1 -1
  15. {parsl-2025.7.21 → parsl-2025.8.4/parsl.egg-info}/PKG-INFO +2 -2
  16. {parsl-2025.7.21 → parsl-2025.8.4}/parsl.egg-info/SOURCES.txt +1 -8
  17. parsl-2025.7.21/parsl/tests/scaling_tests/htex_local.py +0 -20
  18. parsl-2025.7.21/parsl/tests/scaling_tests/local_threads.py +0 -4
  19. parsl-2025.7.21/parsl/tests/scaling_tests/test_scale.py +0 -135
  20. parsl-2025.7.21/parsl/tests/scaling_tests/vineex_condor.py +0 -9
  21. parsl-2025.7.21/parsl/tests/scaling_tests/vineex_local.py +0 -10
  22. parsl-2025.7.21/parsl/tests/scaling_tests/wqex_condor.py +0 -12
  23. parsl-2025.7.21/parsl/tests/scaling_tests/wqex_local.py +0 -12
  24. parsl-2025.7.21/parsl/usage_tracking/__init__.py +0 -0
  25. {parsl-2025.7.21 → parsl-2025.8.4}/LICENSE +0 -0
  26. {parsl-2025.7.21 → parsl-2025.8.4}/MANIFEST.in +0 -0
  27. {parsl-2025.7.21 → parsl-2025.8.4}/README.rst +0 -0
  28. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/__init__.py +0 -0
  29. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/addresses.py +0 -0
  30. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/app/__init__.py +0 -0
  31. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/app/app.py +0 -0
  32. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/app/bash.py +0 -0
  33. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/app/errors.py +0 -0
  34. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/app/futures.py +0 -0
  35. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/app/python.py +0 -0
  36. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/benchmark/__init__.py +0 -0
  37. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/benchmark/perf.py +0 -0
  38. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/concurrent/__init__.py +0 -0
  39. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/config.py +0 -0
  40. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/ASPIRE1.py +0 -0
  41. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/Azure.py +0 -0
  42. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/__init__.py +0 -0
  43. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/anvil.py +0 -0
  44. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/bridges.py +0 -0
  45. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/cc_in2p3.py +0 -0
  46. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/delta.py +0 -0
  47. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/ec2.py +0 -0
  48. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/expanse.py +0 -0
  49. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/frontera.py +0 -0
  50. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/gc_multisite.py +0 -0
  51. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/gc_tutorial.py +0 -0
  52. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/htex_local.py +0 -0
  53. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/illinoiscluster.py +0 -0
  54. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/improv.py +0 -0
  55. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/kubernetes.py +0 -0
  56. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/local_threads.py +0 -0
  57. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/midway.py +0 -0
  58. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/osg.py +0 -0
  59. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/polaris.py +0 -0
  60. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/stampede2.py +0 -0
  61. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/summit.py +0 -0
  62. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/toss3_llnl.py +0 -0
  63. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/vineex_local.py +0 -0
  64. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/configs/wqex_local.py +0 -0
  65. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/curvezmq.py +0 -0
  66. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/data_provider/__init__.py +0 -0
  67. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/data_provider/data_manager.py +0 -0
  68. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/data_provider/file_noop.py +0 -0
  69. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/data_provider/files.py +0 -0
  70. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/data_provider/ftp.py +0 -0
  71. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/data_provider/globus.py +0 -0
  72. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/data_provider/http.py +0 -0
  73. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/data_provider/rsync.py +0 -0
  74. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/data_provider/staging.py +0 -0
  75. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/data_provider/zip.py +0 -0
  76. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/dataflow/__init__.py +0 -0
  77. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/dataflow/dependency_resolvers.py +0 -0
  78. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/dataflow/errors.py +0 -0
  79. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/dataflow/futures.py +0 -0
  80. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/dataflow/memoization.py +0 -0
  81. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/dataflow/rundirs.py +0 -0
  82. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/dataflow/states.py +0 -0
  83. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/dataflow/taskrecord.py +0 -0
  84. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/errors.py +0 -0
  85. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/__init__.py +0 -0
  86. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/base.py +0 -0
  87. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/errors.py +0 -0
  88. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/execute_task.py +0 -0
  89. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/flux/__init__.py +0 -0
  90. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/flux/execute_parsl_task.py +0 -0
  91. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/flux/executor.py +0 -0
  92. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/flux/flux_instance_manager.py +0 -0
  93. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/globus_compute.py +0 -0
  94. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/high_throughput/__init__.py +0 -0
  95. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/high_throughput/errors.py +0 -0
  96. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/high_throughput/interchange.py +0 -0
  97. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/high_throughput/manager_record.py +0 -0
  98. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/high_throughput/manager_selector.py +0 -0
  99. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  100. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/high_throughput/mpi_executor.py +0 -0
  101. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  102. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
  103. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/high_throughput/probe.py +0 -0
  104. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
  105. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
  106. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/radical/__init__.py +0 -0
  107. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/radical/executor.py +0 -0
  108. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/radical/rpex_resources.py +0 -0
  109. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/radical/rpex_worker.py +0 -0
  110. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/taskvine/__init__.py +0 -0
  111. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/taskvine/errors.py +0 -0
  112. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  113. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/taskvine/factory.py +0 -0
  114. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/taskvine/factory_config.py +0 -0
  115. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/taskvine/manager.py +0 -0
  116. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/taskvine/manager_config.py +0 -0
  117. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/taskvine/utils.py +0 -0
  118. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/threads.py +0 -0
  119. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/workqueue/__init__.py +0 -0
  120. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/workqueue/errors.py +0 -0
  121. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  122. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  123. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  124. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/jobs/__init__.py +0 -0
  125. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/jobs/error_handlers.py +0 -0
  126. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/jobs/errors.py +0 -0
  127. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/jobs/job_status_poller.py +0 -0
  128. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/jobs/states.py +0 -0
  129. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/launchers/__init__.py +0 -0
  130. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/launchers/base.py +0 -0
  131. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/launchers/errors.py +0 -0
  132. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/launchers/launchers.py +0 -0
  133. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/__init__.py +0 -0
  134. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/db_manager.py +0 -0
  135. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/errors.py +0 -0
  136. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/message_type.py +0 -0
  137. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/monitoring.py +0 -0
  138. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/queries/__init__.py +0 -0
  139. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/queries/pandas.py +0 -0
  140. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/radios/__init__.py +0 -0
  141. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/radios/base.py +0 -0
  142. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/radios/filesystem.py +0 -0
  143. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/radios/filesystem_router.py +0 -0
  144. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/radios/htex.py +0 -0
  145. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/radios/multiprocessing.py +0 -0
  146. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/radios/udp.py +0 -0
  147. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/radios/udp_router.py +0 -0
  148. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/radios/zmq.py +0 -0
  149. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/radios/zmq_router.py +0 -0
  150. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/remote.py +0 -0
  151. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/types.py +0 -0
  152. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/__init__.py +0 -0
  153. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/app.py +0 -0
  154. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/models.py +0 -0
  155. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  156. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  157. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  158. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  159. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  160. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  161. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  162. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/templates/app.html +0 -0
  163. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/templates/dag.html +0 -0
  164. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/templates/error.html +0 -0
  165. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/templates/layout.html +0 -0
  166. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  167. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/templates/task.html +0 -0
  168. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  169. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  170. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/utils.py +0 -0
  171. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/version.py +0 -0
  172. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/monitoring/visualization/views.py +0 -0
  173. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/multiprocessing.py +0 -0
  174. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/process_loggers.py +0 -0
  175. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/__init__.py +0 -0
  176. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/aws/__init__.py +0 -0
  177. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/aws/aws.py +0 -0
  178. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/aws/template.py +0 -0
  179. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/azure/__init__.py +0 -0
  180. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/azure/azure.py +0 -0
  181. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/azure/template.py +0 -0
  182. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/base.py +0 -0
  183. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/cluster_provider.py +0 -0
  184. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/condor/__init__.py +0 -0
  185. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/condor/condor.py +0 -0
  186. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/condor/template.py +0 -0
  187. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/errors.py +0 -0
  188. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/googlecloud/__init__.py +0 -0
  189. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/googlecloud/googlecloud.py +0 -0
  190. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/grid_engine/__init__.py +0 -0
  191. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/grid_engine/grid_engine.py +0 -0
  192. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/grid_engine/template.py +0 -0
  193. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/kubernetes/__init__.py +0 -0
  194. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/kubernetes/kube.py +0 -0
  195. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/kubernetes/template.py +0 -0
  196. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/local/__init__.py +0 -0
  197. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/local/local.py +0 -0
  198. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/lsf/__init__.py +0 -0
  199. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/lsf/lsf.py +0 -0
  200. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/lsf/template.py +0 -0
  201. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/pbspro/__init__.py +0 -0
  202. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/pbspro/pbspro.py +0 -0
  203. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/pbspro/template.py +0 -0
  204. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/slurm/__init__.py +0 -0
  205. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/slurm/slurm.py +0 -0
  206. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/slurm/template.py +0 -0
  207. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/torque/__init__.py +0 -0
  208. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/torque/template.py +0 -0
  209. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/providers/torque/torque.py +0 -0
  210. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/py.typed +0 -0
  211. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/serialize/__init__.py +0 -0
  212. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/serialize/base.py +0 -0
  213. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/serialize/concretes.py +0 -0
  214. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/serialize/errors.py +0 -0
  215. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/serialize/facade.py +0 -0
  216. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/serialize/proxystore.py +0 -0
  217. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/__init__.py +0 -0
  218. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/callables_helper.py +0 -0
  219. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/__init__.py +0 -0
  220. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/azure_single_node.py +0 -0
  221. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/bluewaters.py +0 -0
  222. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/bridges.py +0 -0
  223. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/cc_in2p3.py +0 -0
  224. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/comet.py +0 -0
  225. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/ec2_single_node.py +0 -0
  226. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/ec2_spot.py +0 -0
  227. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/flux_local.py +0 -0
  228. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/frontera.py +0 -0
  229. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/globus_compute.py +0 -0
  230. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/htex_local.py +0 -0
  231. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/htex_local_alternate.py +0 -0
  232. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  233. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  234. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/local_radical.py +0 -0
  235. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/local_radical_mpi.py +0 -0
  236. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/local_threads.py +0 -0
  237. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  238. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  239. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  240. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  241. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  242. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/local_threads_globus.py +0 -0
  243. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  244. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  245. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/midway.py +0 -0
  246. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/nscc_singapore.py +0 -0
  247. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/osg_htex.py +0 -0
  248. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/petrelkube.py +0 -0
  249. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/slurm_local.py +0 -0
  250. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/summit.py +0 -0
  251. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/taskvine_ex.py +0 -0
  252. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/user_opts.py +0 -0
  253. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/configs/workqueue_ex.py +0 -0
  254. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/conftest.py +0 -0
  255. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/integration/__init__.py +0 -0
  256. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/integration/latency.py +0 -0
  257. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/integration/test_apps/__init__.py +0 -0
  258. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  259. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/integration/test_stress/__init__.py +0 -0
  260. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  261. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  262. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/manual_tests/__init__.py +0 -0
  263. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/manual_tests/htex_local.py +0 -0
  264. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/manual_tests/test_basic.py +0 -0
  265. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  266. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  267. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  268. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  269. {parsl-2025.7.21/parsl/tests/scaling_tests → parsl-2025.8.4/parsl/tests/site_tests}/__init__.py +0 -0
  270. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/site_tests/site_config_selector.py +0 -0
  271. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/site_tests/test_provider.py +0 -0
  272. {parsl-2025.7.21/parsl/tests/site_tests → parsl-2025.8.4/parsl/tests/sites}/__init__.py +0 -0
  273. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/sites/test_affinity.py +0 -0
  274. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/sites/test_concurrent.py +0 -0
  275. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  276. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/sites/test_ec2.py +0 -0
  277. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/sites/test_launchers.py +0 -0
  278. {parsl-2025.7.21/parsl/tests/sites → parsl-2025.8.4/parsl/tests/sites/test_mpi}/__init__.py +0 -0
  279. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/sites/test_worker_info.py +0 -0
  280. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_aalst_patterns.py +0 -0
  281. {parsl-2025.7.21/parsl/tests/sites/test_mpi → parsl-2025.8.4/parsl/tests/test_bash_apps}/__init__.py +0 -0
  282. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  283. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  284. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  285. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
  286. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  287. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  288. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  289. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  290. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  291. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  292. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  293. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  294. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  295. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_callables.py +0 -0
  296. {parsl-2025.7.21/parsl/tests/test_bash_apps → parsl-2025.8.4/parsl/tests/test_checkpointing}/__init__.py +0 -0
  297. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  298. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  299. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  300. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  301. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  302. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  303. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  304. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_curvezmq.py +0 -0
  305. {parsl-2025.7.21/parsl/tests/test_checkpointing → parsl-2025.8.4/parsl/tests/test_docs}/__init__.py +0 -0
  306. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_docs/test_from_slides.py +0 -0
  307. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_docs/test_kwargs.py +0 -0
  308. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  309. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_docs/test_workflow1.py +0 -0
  310. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_docs/test_workflow2.py +0 -0
  311. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_docs/test_workflow4.py +0 -0
  312. {parsl-2025.7.21/parsl/tests/test_docs → parsl-2025.8.4/parsl/tests/test_error_handling}/__init__.py +0 -0
  313. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_error_handling/test_fail.py +0 -0
  314. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  315. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  316. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  317. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_error_handling/test_retries.py +0 -0
  318. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  319. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  320. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  321. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  322. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_execute_task.py +0 -0
  323. {parsl-2025.7.21/parsl/tests/test_error_handling → parsl-2025.8.4/parsl/tests/test_flowcontrol}/__init__.py +0 -0
  324. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_flux.py +0 -0
  325. {parsl-2025.7.21/parsl/tests/test_flowcontrol → parsl-2025.8.4/parsl/tests/test_htex}/__init__.py +0 -0
  326. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_basic.py +0 -0
  327. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
  328. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  329. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  330. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  331. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  332. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
  333. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_drain.py +0 -0
  334. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_htex.py +0 -0
  335. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +0 -0
  336. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  337. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
  338. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_managers_command.py +0 -0
  339. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  340. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  341. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_priority_queue.py +0 -0
  342. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
  343. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  344. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
  345. {parsl-2025.7.21/parsl/tests/test_htex → parsl-2025.8.4/parsl/tests/test_monitoring}/__init__.py +0 -0
  346. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  347. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_basic.py +0 -0
  348. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  349. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
  350. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
  351. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  352. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  353. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  354. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
  355. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
  356. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
  357. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
  358. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  359. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  360. {parsl-2025.7.21/parsl/tests/test_monitoring → parsl-2025.8.4/parsl/tests/test_mpi_apps}/__init__.py +0 -0
  361. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  362. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  363. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  364. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
  365. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  366. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  367. {parsl-2025.7.21/parsl/tests/test_mpi_apps → parsl-2025.8.4/parsl/tests/test_providers}/__init__.py +0 -0
  368. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
  369. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_providers/test_local_provider.py +0 -0
  370. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  371. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  372. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  373. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  374. {parsl-2025.7.21/parsl/tests/test_providers → parsl-2025.8.4/parsl/tests/test_python_apps}/__init__.py +0 -0
  375. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  376. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_basic.py +0 -0
  377. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  378. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  379. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  380. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  381. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  382. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_fail.py +0 -0
  383. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  384. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  385. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_futures.py +0 -0
  386. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  387. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  388. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
  389. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_join.py +0 -0
  390. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  391. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  392. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  393. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  394. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  395. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  396. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  397. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  398. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  399. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_overview.py +0 -0
  400. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  401. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  402. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_simple.py +0 -0
  403. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  404. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_python_apps/test_type5.py +0 -0
  405. {parsl-2025.7.21/parsl/tests/test_python_apps → parsl-2025.8.4/parsl/tests/test_radical}/__init__.py +0 -0
  406. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  407. {parsl-2025.7.21/parsl/tests/test_radical → parsl-2025.8.4/parsl/tests/test_regression}/__init__.py +0 -0
  408. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_regression/test_1480.py +0 -0
  409. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  410. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_regression/test_1653.py +0 -0
  411. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_regression/test_221.py +0 -0
  412. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_regression/test_226.py +0 -0
  413. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_regression/test_2652.py +0 -0
  414. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_regression/test_69a.py +0 -0
  415. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_regression/test_854.py +0 -0
  416. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  417. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_regression/test_98.py +0 -0
  418. {parsl-2025.7.21/parsl/tests/test_regression → parsl-2025.8.4/parsl/tests/test_scaling}/__init__.py +0 -0
  419. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  420. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  421. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
  422. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  423. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  424. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
  425. {parsl-2025.7.21/parsl/tests/test_scaling → parsl-2025.8.4/parsl/tests/test_serialization}/__init__.py +0 -0
  426. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  427. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  428. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_serialization/test_basic.py +0 -0
  429. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  430. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
  431. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  432. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  433. {parsl-2025.7.21/parsl/tests/test_serialization → parsl-2025.8.4/parsl/tests/test_shutdown}/__init__.py +0 -0
  434. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  435. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/__init__.py +0 -0
  436. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/staging_provider.py +0 -0
  437. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_1316.py +0 -0
  438. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_docs_1.py +0 -0
  439. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_docs_2.py +0 -0
  440. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  441. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_file.py +0 -0
  442. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_file_apps.py +0 -0
  443. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_file_staging.py +0 -0
  444. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  445. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  446. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  447. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  448. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_staging_https.py +0 -0
  449. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  450. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_zip_in.py +0 -0
  451. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_zip_out.py +0 -0
  452. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  453. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_summary.py +0 -0
  454. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_thread_parallelism.py +0 -0
  455. {parsl-2025.7.21/parsl/tests/test_shutdown → parsl-2025.8.4/parsl/tests/test_threads}/__init__.py +0 -0
  456. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_threads/test_configs.py +0 -0
  457. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  458. {parsl-2025.7.21/parsl/tests/test_threads → parsl-2025.8.4/parsl/tests/test_utils}/__init__.py +0 -0
  459. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_utils/test_execute_wait.py +0 -0
  460. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  461. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
  462. {parsl-2025.7.21/parsl/tests/test_utils → parsl-2025.8.4/parsl/tests/unit}/__init__.py +0 -0
  463. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/unit/test_address.py +0 -0
  464. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/unit/test_file.py +0 -0
  465. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
  466. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/unit/test_usage_tracking.py +0 -0
  467. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/tests/utils.py +0 -0
  468. {parsl-2025.7.21/parsl/tests/unit → parsl-2025.8.4/parsl/usage_tracking}/__init__.py +0 -0
  469. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/usage_tracking/api.py +0 -0
  470. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/usage_tracking/levels.py +0 -0
  471. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/usage_tracking/usage.py +0 -0
  472. {parsl-2025.7.21 → parsl-2025.8.4}/parsl/utils.py +0 -0
  473. {parsl-2025.7.21 → parsl-2025.8.4}/parsl.egg-info/dependency_links.txt +0 -0
  474. {parsl-2025.7.21 → parsl-2025.8.4}/parsl.egg-info/entry_points.txt +0 -0
  475. {parsl-2025.7.21 → parsl-2025.8.4}/parsl.egg-info/requires.txt +0 -0
  476. {parsl-2025.7.21 → parsl-2025.8.4}/parsl.egg-info/top_level.txt +0 -0
  477. {parsl-2025.7.21 → parsl-2025.8.4}/requirements.txt +0 -0
  478. {parsl-2025.7.21 → parsl-2025.8.4}/setup.cfg +0 -0
  479. {parsl-2025.7.21 → parsl-2025.8.4}/setup.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.7.21
3
+ Version: 2025.8.4
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/2025.07.21.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.08.04.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -91,8 +91,11 @@ class DataFlowKernel:
91
91
  self._config = config
92
92
  self.run_dir = make_rundir(config.run_dir)
93
93
 
94
+ self._logging_unregister_callback: Optional[Callable[[], None]]
94
95
  if config.initialize_logging:
95
- parsl.set_file_logger("{}/parsl.log".format(self.run_dir), level=logging.DEBUG)
96
+ self._logging_unregister_callback = parsl.set_file_logger("{}/parsl.log".format(self.run_dir), level=logging.DEBUG)
97
+ else:
98
+ self._logging_unregister_callback = None
96
99
 
97
100
  logger.info("Starting DataFlowKernel with config\n{}".format(config))
98
101
 
@@ -1185,12 +1188,9 @@ class DataFlowKernel:
1185
1188
 
1186
1189
  @wrap_with_logs
1187
1190
  def cleanup(self) -> None:
1188
- """DataFlowKernel cleanup.
1189
-
1190
- This involves releasing all resources explicitly.
1191
-
1192
- We call scale_in on each of the executors and call executor.shutdown.
1191
+ """Clean-up by closing all of the components used by the DFK
1193
1192
  """
1193
+
1194
1194
  logger.info("DFK cleanup initiated")
1195
1195
 
1196
1196
  # this check won't detect two DFK cleanups happening from
@@ -1258,6 +1258,13 @@ class DataFlowKernel:
1258
1258
  else:
1259
1259
  logger.debug("Cleaning up non-default DFK - not unregistering")
1260
1260
 
1261
+ if self._logging_unregister_callback:
1262
+ logger.info("Unregistering log handler")
1263
+ self._logging_unregister_callback()
1264
+ logger.info("Unregistered log handler")
1265
+
1266
+ # This message won't go to the default parsl.log, but other handlers
1267
+ # should still see it.
1261
1268
  logger.info("DFK cleanup complete")
1262
1269
 
1263
1270
  def checkpoint(self, tasks: Optional[Sequence[TaskRecord]] = None) -> str:
@@ -621,7 +621,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
621
621
  self.command_client.run("HOLD_WORKER;{}".format(manager_id))
622
622
  logger.debug("Sent hold request to manager: {}".format(manager_id))
623
623
 
624
- @property
625
624
  def outstanding(self) -> int:
626
625
  """Returns the count of tasks outstanding across the interchange
627
626
  and managers"""
@@ -122,7 +122,7 @@ class BlockProviderExecutor(ParslExecutor):
122
122
  else:
123
123
  return self._provider.status_polling_interval
124
124
 
125
- @abstractproperty
125
+ @abstractmethod
126
126
  def outstanding(self) -> int:
127
127
  """This should return the number of tasks that the executor has been given to run (waiting to run, and running now)"""
128
128
 
@@ -573,7 +573,6 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
573
573
  self._worker_command = self._construct_worker_command()
574
574
  self._patch_providers()
575
575
 
576
- @property
577
576
  def outstanding(self) -> int:
578
577
  """Count the number of outstanding tasks."""
579
578
  logger.debug(f"Counted {self._outstanding_tasks} outstanding tasks")
@@ -659,7 +658,7 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
659
658
  with self._outstanding_tasks_lock:
660
659
  self._outstanding_tasks -= 1
661
660
  finally:
662
- logger.debug(f"Marking all {self.outstanding} outstanding tasks as failed")
661
+ logger.debug(f"Marking all {self.outstanding()} outstanding tasks as failed")
663
662
  logger.debug("Acquiring tasks_lock")
664
663
  with self._tasks_lock:
665
664
  logger.debug("Acquired tasks_lock")
@@ -674,7 +674,6 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
674
674
  self.worker_command = self._construct_worker_command()
675
675
  self._patch_providers()
676
676
 
677
- @property
678
677
  def outstanding(self) -> int:
679
678
  """Count the number of outstanding slots required. This is inefficiently
680
679
  implemented and probably could be replaced with a counter.
@@ -983,7 +982,7 @@ def _work_queue_submit_wait(*,
983
982
  continue
984
983
  # When a task is found:
985
984
  executor_task_id = t.tag
986
- logger.debug("Completed Work Queue task {}, executor task {}".format(t.id, t.tag))
985
+ logger.info("Completed Work Queue task {}, executor task {}".format(t.id, t.tag))
987
986
  result_file = result_file_of_task_id.pop(t.tag)
988
987
 
989
988
  # A tasks completes 'succesfully' if it has result file.
@@ -193,7 +193,7 @@ class Strategy:
193
193
  self.executors[label]['first'] = False
194
194
 
195
195
  # Tasks that are either pending completion
196
- active_tasks = executor.outstanding
196
+ active_tasks = executor.outstanding()
197
197
 
198
198
  status = executor.status_facade
199
199
 
@@ -1,18 +1,13 @@
1
- """Following the general logging philosophy of python libraries, by default
2
- Parsl doesn't log anything. However the following helper functions are
3
- provided for logging:
4
-
5
- 1. set_stream_logger
6
- This sets the logger to the StreamHandler. This is quite useful when working from
7
- a Jupyter notebook.
8
-
9
- 2. set_file_logger
10
- This sets the logging to a file. This is ideal for reporting issues to the dev team.
1
+ """This module contains helpers for configuring logging. By default,
2
+ `set_file_logger` is invoked by the DataFlowKernel initializer to log
3
+ parsl messages to parsl.log.
11
4
 
5
+ `set_stream_logger` which by default logs to stderr, can be useful
6
+ when working in a Jupyter notebook.
12
7
  """
13
8
  import io
14
9
  import logging
15
- from typing import Optional
10
+ from typing import Callable, Optional
16
11
 
17
12
  import typeguard
18
13
 
@@ -27,7 +22,7 @@ DEFAULT_FORMAT = (
27
22
  def set_stream_logger(name: str = 'parsl',
28
23
  level: int = logging.DEBUG,
29
24
  format_string: Optional[str] = None,
30
- stream: Optional[io.TextIOWrapper] = None) -> logging.Logger:
25
+ stream: Optional[io.TextIOBase] = None) -> Callable[[], None]:
31
26
  """Add a stream log handler.
32
27
 
33
28
  Args:
@@ -36,9 +31,6 @@ def set_stream_logger(name: str = 'parsl',
36
31
  - format_string (string) : Set to None by default.
37
32
  - stream (io.TextIOWrapper) : Specify sys.stdout or sys.stderr for stream.
38
33
  If not specified, the default stream for logging.StreamHandler is used.
39
-
40
- Returns:
41
- - logger for specified name
42
34
  """
43
35
  if format_string is None:
44
36
  # format_string = "%(asctime)s %(name)s [%(levelname)s] Thread:%(thread)d %(message)s"
@@ -58,14 +50,18 @@ def set_stream_logger(name: str = 'parsl',
58
50
  futures_logger = logging.getLogger("concurrent.futures")
59
51
  futures_logger.addHandler(handler)
60
52
 
61
- return logger
53
+ def unregister_callback():
54
+ logger.removeHandler(handler)
55
+ futures_logger.removeHandler(handler)
56
+
57
+ return unregister_callback
62
58
 
63
59
 
64
60
  @typeguard.typechecked
65
61
  def set_file_logger(filename: str,
66
62
  name: str = 'parsl',
67
63
  level: int = logging.DEBUG,
68
- format_string: Optional[str] = None) -> logging.Logger:
64
+ format_string: Optional[str] = None) -> Callable[[], None]:
69
65
  """Add a file log handler.
70
66
 
71
67
  Args:
@@ -75,7 +71,10 @@ def set_file_logger(filename: str,
75
71
  - format_string (string): Set the format string
76
72
 
77
73
  Returns:
78
- - logger for specified name
74
+ - a callable which, when invoked, will reverse the log handler
75
+ attachments made by this call. (compare to how object based pieces
76
+ of parsl model this as a close/shutdown/cleanup method on the
77
+ object))
79
78
  """
80
79
  if format_string is None:
81
80
  format_string = DEFAULT_FORMAT
@@ -93,4 +92,8 @@ def set_file_logger(filename: str,
93
92
  futures_logger = logging.getLogger("concurrent.futures")
94
93
  futures_logger.addHandler(handler)
95
94
 
96
- return logger
95
+ def unregister_callback():
96
+ logger.removeHandler(handler)
97
+ futures_logger.removeHandler(handler)
98
+
99
+ return unregister_callback
@@ -3,7 +3,7 @@ import argparse
3
3
  import pytest
4
4
 
5
5
  import parsl
6
- from parsl.app.app import python_app # , bash_app
6
+ from parsl.app.app import python_app
7
7
  from parsl.tests.site_tests.site_config_selector import fresh_config
8
8
 
9
9
 
@@ -36,7 +36,7 @@ def test_platform(n=2, sleep_dur=10):
36
36
 
37
37
  print("Executor : ", dfk.executors[name])
38
38
  print("Connected : ", dfk.executors[name].connected_workers)
39
- print("Outstanding : ", dfk.executors[name].outstanding)
39
+ print("Outstanding : ", dfk.executors[name].outstanding())
40
40
 
41
41
  d = []
42
42
  for i in range(0, n):
@@ -48,7 +48,7 @@ def test_htex_strategy_does_not_oscillate(ns):
48
48
  statuses = {}
49
49
 
50
50
  executor.provider = provider
51
- executor.outstanding = n_tasks
51
+ executor.outstanding = lambda: n_tasks
52
52
  executor.status_facade = statuses
53
53
  executor.workers_per_node = n_workers
54
54
 
@@ -97,7 +97,7 @@ def test_htex_strategy_does_not_oscillate(ns):
97
97
  # this assert fails due to issue #3696
98
98
 
99
99
  # Now check scale in happens with 0 load
100
- executor.outstanding = 0
100
+ executor.outstanding = lambda: 0
101
101
  s.strategize([executor])
102
102
  executor.scale_in_facade.assert_called()
103
103
  assert len([k for k in statuses if statuses[k].state == JobState.PENDING]) == 0
@@ -66,7 +66,7 @@ def test_scale_out(tmpd_cwd, try_assert):
66
66
  num_managers = len(dfk.executors['htex_local'].connected_managers())
67
67
 
68
68
  assert num_managers == 0, "Expected 0 managers at start"
69
- assert dfk.executors['htex_local'].outstanding == 0, "Expected 0 tasks at start"
69
+ assert dfk.executors['htex_local'].outstanding() == 0, "Expected 0 tasks at start"
70
70
 
71
71
  ntasks = 10
72
72
  ready_path = tmpd_cwd / "workers_ready"
@@ -85,7 +85,7 @@ def test_scale_out(tmpd_cwd, try_assert):
85
85
  finish_path.touch() # Approximation of Event, via files
86
86
  [x.result() for x in futs]
87
87
 
88
- assert dfk.executors['htex_local'].outstanding == 0
88
+ assert dfk.executors['htex_local'].outstanding() == 0
89
89
 
90
90
  def assert_kernel():
91
91
  return len(dfk.executors['htex_local'].connected_managers()) == _min_blocks
@@ -63,7 +63,7 @@ def test_scale_out(tmpd_cwd, try_assert):
63
63
  num_managers = len(dfk.executors['htex_local'].connected_managers())
64
64
 
65
65
  assert num_managers == 0, "Expected 0 managers at start"
66
- assert dfk.executors['htex_local'].outstanding == 0, "Expected 0 tasks at start"
66
+ assert dfk.executors['htex_local'].outstanding() == 0, "Expected 0 tasks at start"
67
67
 
68
68
  ntasks = _max_blocks * 2
69
69
  ready_path = tmpd_cwd / "workers_ready"
@@ -84,7 +84,7 @@ def test_scale_out(tmpd_cwd, try_assert):
84
84
  finish_path.touch() # Approximation of Event, via files
85
85
  [x.result() for x in futs]
86
86
 
87
- assert dfk.executors['htex_local'].outstanding == 0
87
+ assert dfk.executors['htex_local'].outstanding() == 0
88
88
 
89
89
  # now we can launch one "long" task -
90
90
  # and what should happen is that the connected_managers count "eventually" (?) converges to 1 and stays there.
@@ -0,0 +1,70 @@
1
+ import io
2
+ import logging
3
+
4
+ import pytest
5
+
6
+ from parsl.log_utils import set_file_logger, set_stream_logger
7
+
8
+
9
+ @pytest.mark.local
10
+ def test_stream_close():
11
+ """Tests that set_stream_logger callback detaches log handler.
12
+ """
13
+
14
+ logger = logging.getLogger("parsl")
15
+
16
+ s1 = io.StringIO()
17
+ close_callback_1 = set_stream_logger(stream=s1)
18
+ logger.info("AAA")
19
+ close_callback_1()
20
+
21
+ s2 = io.StringIO()
22
+ close_callback_2 = set_stream_logger(stream=s2)
23
+ logger.info("BBB")
24
+ close_callback_2()
25
+
26
+ logger.info("CCC")
27
+
28
+ assert "AAA" in s1.getvalue()
29
+ assert "AAA" not in s2.getvalue()
30
+
31
+ assert "BBB" not in s1.getvalue()
32
+ assert "BBB" in s2.getvalue()
33
+
34
+ assert "CCC" not in s1.getvalue()
35
+ assert "CCC" not in s2.getvalue()
36
+
37
+
38
+ @pytest.mark.local
39
+ def test_file_close(tmpd_cwd):
40
+ """Tests that set_file_Logger callback detaches log handler.
41
+ """
42
+
43
+ logger = logging.getLogger("parsl")
44
+
45
+ f1 = str(tmpd_cwd / "log1")
46
+ close_callback_1 = set_file_logger(filename=f1)
47
+ logger.info("AAA")
48
+ close_callback_1()
49
+
50
+ f2 = str(tmpd_cwd / "log2")
51
+ close_callback_2 = set_file_logger(filename=f2)
52
+ logger.info("BBB")
53
+ close_callback_2()
54
+
55
+ logger.info("CCC")
56
+
57
+ with open(f1, "r") as f:
58
+ s1 = f.read()
59
+
60
+ with open(f2, "r") as f:
61
+ s2 = f.read()
62
+
63
+ assert "AAA" in s1
64
+ assert "AAA" not in s2
65
+
66
+ assert "BBB" not in s1
67
+ assert "BBB" in s2
68
+
69
+ assert "CCC" not in s1
70
+ assert "CCC" not in s2
@@ -3,4 +3,4 @@
3
3
  Year.Month.Day[alpha/beta/..]
4
4
  Alphas will be numbered like this -> 2024.12.10a0
5
5
  """
6
- VERSION = '2025.07.21'
6
+ VERSION = '2025.08.04'
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.7.21
3
+ Version: 2025.8.4
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/2025.07.21.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.08.04.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -267,14 +267,6 @@ parsl/tests/manual_tests/test_log_filter.py
267
267
  parsl/tests/manual_tests/test_memory_limits.py
268
268
  parsl/tests/manual_tests/test_regression_220.py
269
269
  parsl/tests/manual_tests/test_worker_count.py
270
- parsl/tests/scaling_tests/__init__.py
271
- parsl/tests/scaling_tests/htex_local.py
272
- parsl/tests/scaling_tests/local_threads.py
273
- parsl/tests/scaling_tests/test_scale.py
274
- parsl/tests/scaling_tests/vineex_condor.py
275
- parsl/tests/scaling_tests/vineex_local.py
276
- parsl/tests/scaling_tests/wqex_condor.py
277
- parsl/tests/scaling_tests/wqex_local.py
278
270
  parsl/tests/site_tests/__init__.py
279
271
  parsl/tests/site_tests/site_config_selector.py
280
272
  parsl/tests/site_tests/test_provider.py
@@ -463,6 +455,7 @@ parsl/tests/test_threads/test_configs.py
463
455
  parsl/tests/test_threads/test_lazy_errors.py
464
456
  parsl/tests/test_utils/__init__.py
465
457
  parsl/tests/test_utils/test_execute_wait.py
458
+ parsl/tests/test_utils/test_logutils.py
466
459
  parsl/tests/test_utils/test_representation_mixin.py
467
460
  parsl/tests/test_utils/test_sanitize_dns.py
468
461
  parsl/tests/unit/__init__.py
@@ -1,20 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors import HighThroughputExecutor
3
- from parsl.providers import LocalProvider
4
-
5
- # import os
6
- config = Config(
7
- executors=[
8
- HighThroughputExecutor(
9
- label="htex_local",
10
- cores_per_worker=1,
11
- max_workers_per_node=8,
12
- encrypted=True,
13
- provider=LocalProvider(
14
- init_blocks=1,
15
- max_blocks=1,
16
- ),
17
- )
18
- ],
19
- strategy='none',
20
- )
@@ -1,4 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors.threads import ThreadPoolExecutor
3
-
4
- config = Config(executors=[ThreadPoolExecutor()])
@@ -1,135 +0,0 @@
1
- #!/usr/bin/env python3
2
-
3
- import argparse
4
- import time
5
-
6
- import parsl
7
- from parsl.app.app import python_app # , bash_app
8
-
9
-
10
- @python_app
11
- def double(x):
12
- return x * 2
13
-
14
-
15
- @python_app
16
- def echo(x, string, stdout=None):
17
- print(string)
18
- return x * 5
19
-
20
-
21
- @python_app
22
- def import_echo(x, string, stdout=None):
23
- # from time import sleep
24
- # sleep(0)
25
- print(string)
26
- return x * 5
27
-
28
-
29
- @python_app
30
- def platform(sleep=10, stdout=None):
31
- import platform
32
- import time
33
- time.sleep(sleep)
34
- return platform.uname()
35
-
36
-
37
- def test_simple(n=2):
38
- start = time.time()
39
- x = double(n)
40
- print("Result : ", x.result())
41
- assert x.result() == n * \
42
- 2, "Expected double to return:{0} instead got:{1}".format(
43
- n * 2, x.result())
44
- print("Duration : {0}s".format(time.time() - start))
45
- print("[TEST STATUS] test_parallel_for [SUCCESS]")
46
- return True
47
-
48
-
49
- def test_imports(n=2):
50
- start = time.time()
51
- x = import_echo(n, "hello world")
52
- print("Result : ", x.result())
53
- assert x.result() == n * \
54
- 5, "Expected double to return:{0} instead got:{1}".format(
55
- n * 2, x.result())
56
- print("Duration : {0}s".format(time.time() - start))
57
- print("[TEST STATUS] test_parallel_for [SUCCESS]")
58
- return True
59
-
60
-
61
- def test_platform(n=2, sleep=1):
62
-
63
- dfk = parsl.dfk()
64
- # sync
65
- x = platform(sleep=0)
66
- print(x.result())
67
-
68
- name = list(dfk.executors.keys())[0]
69
- print("Trying to get executor : ", name)
70
-
71
- print("Executor : ", dfk.executors[name])
72
- print("Connected : ", dfk.executors[name].connected_workers)
73
- print("Outstanding : ", dfk.executors[name].outstanding)
74
- d = []
75
- for i in range(0, n):
76
- x = platform(sleep=sleep)
77
- d.append(x)
78
-
79
- print("Connected : ", dfk.executors[name].connected_workers)
80
- print("Outstanding : ", dfk.executors[name].outstanding)
81
-
82
- print(set([i.result()for i in d]))
83
-
84
- print("Connected : ", dfk.executors[name].connected_workers)
85
- print("Outstanding : ", dfk.executors[name].outstanding)
86
-
87
- return True
88
-
89
-
90
- def test_parallel_for(n=2, sleep=1):
91
- d = {}
92
-
93
- start = time.time()
94
- print("Priming ...")
95
- double(10).result()
96
- delta = time.time() - start
97
- print("Priming done in {} seconds".format(delta))
98
-
99
- start = time.time()
100
- for i in range(0, n):
101
- d[i] = platform(sleep=sleep)
102
- # d[i] = double(i)
103
- # time.sleep(0.01)
104
- [d[i].result() for i in d]
105
- delta = time.time() - start
106
- print("Time to complete {} tasks: {:8.3f} s".format(n, delta))
107
- print("Throughput : {:8.3f} Tasks/s".format(n / delta))
108
- return d
109
-
110
-
111
- if __name__ == '__main__':
112
-
113
- parser = argparse.ArgumentParser()
114
- parser.add_argument("-s", "--sleep", default="0")
115
- parser.add_argument("-c", "--count", default="10",
116
- help="Count of apps to launch")
117
- parser.add_argument("-d", "--debug", action='store_true',
118
- help="Count of apps to launch")
119
- parser.add_argument("-f", "--fileconfig", required=True)
120
-
121
- args = parser.parse_args()
122
-
123
- if args.debug:
124
- parsl.set_stream_logger()
125
-
126
- config = None
127
- exec("from {} import config".format(args.fileconfig))
128
- parsl.load(config)
129
- # x = test_simple(int(args.count))
130
- # x = test_imports()
131
- x = test_parallel_for(int(args.count), float(args.sleep))
132
- # x = test_platform(int(args.count), int(args.sleep))
133
- # x = test_parallel_for(int(args.count))
134
- # x = test_stdout()
135
- # x = test_platform()
@@ -1,9 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors.taskvine import TaskVineExecutor, TaskVineManagerConfig
3
- from parsl.providers import CondorProvider
4
-
5
- config = Config(
6
- executors=[TaskVineExecutor(manager_config=TaskVineManagerConfig(port=50055),
7
- provider=CondorProvider(),
8
- )]
9
- )
@@ -1,10 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors.taskvine import TaskVineExecutor, TaskVineManagerConfig
3
- from parsl.providers import LocalProvider
4
-
5
- config = Config(
6
- executors=[TaskVineExecutor(label='VineExec',
7
- worker_launch_method='factory',
8
- manager_config=TaskVineManagerConfig(port=50055),
9
- )]
10
- )
@@ -1,12 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors import WorkQueueExecutor
3
- from parsl.providers import CondorProvider
4
-
5
- config = Config(
6
- executors=[WorkQueueExecutor(port=50055,
7
- source=True,
8
- provider=CondorProvider(),
9
- # init_command='source /home/yadu/src/wq_parsl/setup_parsl_env.sh;
10
- # echo "Ran at $date" > /home/yadu/src/wq_parsl/parsl/tests/workqueue_tests/ran.log',
11
- )]
12
- )
@@ -1,12 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors import WorkQueueExecutor
3
- from parsl.providers import LocalProvider
4
-
5
- config = Config(
6
- executors=[WorkQueueExecutor(port=50055,
7
- source=True,
8
- provider=LocalProvider(),
9
- # init_command='source /home/yadu/src/wq_parsl/setup_parsl_env.sh;
10
- # echo "Ran at $date" > /home/yadu/src/wq_parsl/parsl/tests/workqueue_tests/ran.log',
11
- )]
12
- )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes