parsl 2025.7.28__tar.gz → 2025.8.11__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.

Potentially problematic release.


This version of parsl might be problematic. Click here for more details.

Files changed (479) hide show
  1. {parsl-2025.7.28/parsl.egg-info → parsl-2025.8.11}/PKG-INFO +2 -2
  2. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/dflow.py +12 -2
  3. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/executor.py +0 -2
  4. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/status_handling.py +1 -1
  5. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/executor.py +1 -2
  6. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/workqueue/executor.py +1 -2
  7. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/jobs/strategy.py +2 -2
  8. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/log_utils.py +21 -3
  9. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/db_manager.py +9 -11
  10. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/test_memory_limits.py +1 -1
  11. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/site_tests/test_site.py +3 -3
  12. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +2 -2
  13. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_scale_down.py +2 -2
  14. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +2 -2
  15. parsl-2025.8.11/parsl/tests/test_utils/test_logutils.py +70 -0
  16. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_utils/test_representation_mixin.py +33 -0
  17. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/version.py +1 -1
  18. {parsl-2025.7.28 → parsl-2025.8.11/parsl.egg-info}/PKG-INFO +2 -2
  19. {parsl-2025.7.28 → parsl-2025.8.11}/parsl.egg-info/SOURCES.txt +1 -8
  20. parsl-2025.7.28/parsl/tests/scaling_tests/htex_local.py +0 -20
  21. parsl-2025.7.28/parsl/tests/scaling_tests/local_threads.py +0 -4
  22. parsl-2025.7.28/parsl/tests/scaling_tests/test_scale.py +0 -135
  23. parsl-2025.7.28/parsl/tests/scaling_tests/vineex_condor.py +0 -9
  24. parsl-2025.7.28/parsl/tests/scaling_tests/vineex_local.py +0 -10
  25. parsl-2025.7.28/parsl/tests/scaling_tests/wqex_condor.py +0 -12
  26. parsl-2025.7.28/parsl/tests/scaling_tests/wqex_local.py +0 -12
  27. parsl-2025.7.28/parsl/usage_tracking/__init__.py +0 -0
  28. {parsl-2025.7.28 → parsl-2025.8.11}/LICENSE +0 -0
  29. {parsl-2025.7.28 → parsl-2025.8.11}/MANIFEST.in +0 -0
  30. {parsl-2025.7.28 → parsl-2025.8.11}/README.rst +0 -0
  31. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/__init__.py +0 -0
  32. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/addresses.py +0 -0
  33. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/app/__init__.py +0 -0
  34. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/app/app.py +0 -0
  35. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/app/bash.py +0 -0
  36. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/app/errors.py +0 -0
  37. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/app/futures.py +0 -0
  38. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/app/python.py +0 -0
  39. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/benchmark/__init__.py +0 -0
  40. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/benchmark/perf.py +0 -0
  41. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/concurrent/__init__.py +0 -0
  42. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/config.py +0 -0
  43. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/ASPIRE1.py +0 -0
  44. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/Azure.py +0 -0
  45. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/__init__.py +0 -0
  46. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/anvil.py +0 -0
  47. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/bridges.py +0 -0
  48. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/cc_in2p3.py +0 -0
  49. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/delta.py +0 -0
  50. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/ec2.py +0 -0
  51. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/expanse.py +0 -0
  52. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/frontera.py +0 -0
  53. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/gc_multisite.py +0 -0
  54. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/gc_tutorial.py +0 -0
  55. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/htex_local.py +0 -0
  56. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/illinoiscluster.py +0 -0
  57. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/improv.py +0 -0
  58. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/kubernetes.py +0 -0
  59. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/local_threads.py +0 -0
  60. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/midway.py +0 -0
  61. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/osg.py +0 -0
  62. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/polaris.py +0 -0
  63. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/stampede2.py +0 -0
  64. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/summit.py +0 -0
  65. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/toss3_llnl.py +0 -0
  66. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/vineex_local.py +0 -0
  67. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/wqex_local.py +0 -0
  68. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/curvezmq.py +0 -0
  69. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/__init__.py +0 -0
  70. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/data_manager.py +0 -0
  71. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/file_noop.py +0 -0
  72. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/files.py +0 -0
  73. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/ftp.py +0 -0
  74. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/globus.py +0 -0
  75. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/http.py +0 -0
  76. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/rsync.py +0 -0
  77. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/staging.py +0 -0
  78. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/zip.py +0 -0
  79. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/__init__.py +0 -0
  80. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/dependency_resolvers.py +0 -0
  81. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/errors.py +0 -0
  82. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/futures.py +0 -0
  83. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/memoization.py +0 -0
  84. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/rundirs.py +0 -0
  85. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/states.py +0 -0
  86. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/taskrecord.py +0 -0
  87. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/errors.py +0 -0
  88. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/__init__.py +0 -0
  89. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/base.py +0 -0
  90. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/errors.py +0 -0
  91. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/execute_task.py +0 -0
  92. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/flux/__init__.py +0 -0
  93. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/flux/execute_parsl_task.py +0 -0
  94. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/flux/executor.py +0 -0
  95. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/flux/flux_instance_manager.py +0 -0
  96. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/globus_compute.py +0 -0
  97. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/__init__.py +0 -0
  98. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/errors.py +0 -0
  99. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/interchange.py +0 -0
  100. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/manager_record.py +0 -0
  101. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/manager_selector.py +0 -0
  102. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  103. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/mpi_executor.py +0 -0
  104. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  105. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
  106. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/probe.py +0 -0
  107. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
  108. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
  109. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/radical/__init__.py +0 -0
  110. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/radical/executor.py +0 -0
  111. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/radical/rpex_resources.py +0 -0
  112. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/radical/rpex_worker.py +0 -0
  113. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/__init__.py +0 -0
  114. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/errors.py +0 -0
  115. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  116. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/factory.py +0 -0
  117. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/factory_config.py +0 -0
  118. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/manager.py +0 -0
  119. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/manager_config.py +0 -0
  120. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/utils.py +0 -0
  121. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/threads.py +0 -0
  122. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/workqueue/__init__.py +0 -0
  123. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/workqueue/errors.py +0 -0
  124. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  125. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  126. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  127. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/jobs/__init__.py +0 -0
  128. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/jobs/error_handlers.py +0 -0
  129. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/jobs/errors.py +0 -0
  130. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/jobs/job_status_poller.py +0 -0
  131. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/jobs/states.py +0 -0
  132. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/launchers/__init__.py +0 -0
  133. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/launchers/base.py +0 -0
  134. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/launchers/errors.py +0 -0
  135. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/launchers/launchers.py +0 -0
  136. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/__init__.py +0 -0
  137. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/errors.py +0 -0
  138. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/message_type.py +0 -0
  139. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/monitoring.py +0 -0
  140. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/queries/__init__.py +0 -0
  141. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/queries/pandas.py +0 -0
  142. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/__init__.py +0 -0
  143. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/base.py +0 -0
  144. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/filesystem.py +0 -0
  145. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/filesystem_router.py +0 -0
  146. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/htex.py +0 -0
  147. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/multiprocessing.py +0 -0
  148. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/udp.py +0 -0
  149. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/udp_router.py +0 -0
  150. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/zmq.py +0 -0
  151. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/zmq_router.py +0 -0
  152. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/remote.py +0 -0
  153. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/types.py +0 -0
  154. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/__init__.py +0 -0
  155. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/app.py +0 -0
  156. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/models.py +0 -0
  157. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  158. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  159. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  160. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  161. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  162. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  163. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  164. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/app.html +0 -0
  165. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/dag.html +0 -0
  166. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/error.html +0 -0
  167. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/layout.html +0 -0
  168. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  169. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/task.html +0 -0
  170. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  171. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  172. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/utils.py +0 -0
  173. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/version.py +0 -0
  174. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/views.py +0 -0
  175. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/multiprocessing.py +0 -0
  176. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/process_loggers.py +0 -0
  177. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/__init__.py +0 -0
  178. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/aws/__init__.py +0 -0
  179. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/aws/aws.py +0 -0
  180. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/aws/template.py +0 -0
  181. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/azure/__init__.py +0 -0
  182. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/azure/azure.py +0 -0
  183. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/azure/template.py +0 -0
  184. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/base.py +0 -0
  185. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/cluster_provider.py +0 -0
  186. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/condor/__init__.py +0 -0
  187. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/condor/condor.py +0 -0
  188. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/condor/template.py +0 -0
  189. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/errors.py +0 -0
  190. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/googlecloud/__init__.py +0 -0
  191. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/googlecloud/googlecloud.py +0 -0
  192. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/grid_engine/__init__.py +0 -0
  193. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/grid_engine/grid_engine.py +0 -0
  194. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/grid_engine/template.py +0 -0
  195. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/kubernetes/__init__.py +0 -0
  196. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/kubernetes/kube.py +0 -0
  197. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/kubernetes/template.py +0 -0
  198. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/local/__init__.py +0 -0
  199. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/local/local.py +0 -0
  200. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/lsf/__init__.py +0 -0
  201. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/lsf/lsf.py +0 -0
  202. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/lsf/template.py +0 -0
  203. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/pbspro/__init__.py +0 -0
  204. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/pbspro/pbspro.py +0 -0
  205. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/pbspro/template.py +0 -0
  206. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/slurm/__init__.py +0 -0
  207. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/slurm/slurm.py +0 -0
  208. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/slurm/template.py +0 -0
  209. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/torque/__init__.py +0 -0
  210. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/torque/template.py +0 -0
  211. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/torque/torque.py +0 -0
  212. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/py.typed +0 -0
  213. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/serialize/__init__.py +0 -0
  214. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/serialize/base.py +0 -0
  215. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/serialize/concretes.py +0 -0
  216. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/serialize/errors.py +0 -0
  217. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/serialize/facade.py +0 -0
  218. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/serialize/proxystore.py +0 -0
  219. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/__init__.py +0 -0
  220. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/callables_helper.py +0 -0
  221. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/__init__.py +0 -0
  222. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/azure_single_node.py +0 -0
  223. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/bluewaters.py +0 -0
  224. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/bridges.py +0 -0
  225. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/cc_in2p3.py +0 -0
  226. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/comet.py +0 -0
  227. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/ec2_single_node.py +0 -0
  228. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/ec2_spot.py +0 -0
  229. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/flux_local.py +0 -0
  230. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/frontera.py +0 -0
  231. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/globus_compute.py +0 -0
  232. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/htex_local.py +0 -0
  233. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/htex_local_alternate.py +0 -0
  234. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  235. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  236. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_radical.py +0 -0
  237. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_radical_mpi.py +0 -0
  238. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads.py +0 -0
  239. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  240. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  241. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  242. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  243. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  244. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_globus.py +0 -0
  245. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  246. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  247. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/midway.py +0 -0
  248. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/nscc_singapore.py +0 -0
  249. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/osg_htex.py +0 -0
  250. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/petrelkube.py +0 -0
  251. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/slurm_local.py +0 -0
  252. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/summit.py +0 -0
  253. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/taskvine_ex.py +0 -0
  254. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/user_opts.py +0 -0
  255. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/workqueue_ex.py +0 -0
  256. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/conftest.py +0 -0
  257. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/__init__.py +0 -0
  258. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/latency.py +0 -0
  259. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/test_apps/__init__.py +0 -0
  260. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  261. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/test_stress/__init__.py +0 -0
  262. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  263. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  264. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/__init__.py +0 -0
  265. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/htex_local.py +0 -0
  266. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/test_basic.py +0 -0
  267. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  268. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  269. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  270. {parsl-2025.7.28/parsl/tests/scaling_tests → parsl-2025.8.11/parsl/tests/site_tests}/__init__.py +0 -0
  271. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/site_tests/site_config_selector.py +0 -0
  272. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/site_tests/test_provider.py +0 -0
  273. {parsl-2025.7.28/parsl/tests/site_tests → parsl-2025.8.11/parsl/tests/sites}/__init__.py +0 -0
  274. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/sites/test_affinity.py +0 -0
  275. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/sites/test_concurrent.py +0 -0
  276. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  277. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/sites/test_ec2.py +0 -0
  278. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/sites/test_launchers.py +0 -0
  279. {parsl-2025.7.28/parsl/tests/sites → parsl-2025.8.11/parsl/tests/sites/test_mpi}/__init__.py +0 -0
  280. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/sites/test_worker_info.py +0 -0
  281. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_aalst_patterns.py +0 -0
  282. {parsl-2025.7.28/parsl/tests/sites/test_mpi → parsl-2025.8.11/parsl/tests/test_bash_apps}/__init__.py +0 -0
  283. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  284. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  285. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  286. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
  287. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  288. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  289. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  290. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  291. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  292. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  293. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  294. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  295. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  296. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_callables.py +0 -0
  297. {parsl-2025.7.28/parsl/tests/test_bash_apps → parsl-2025.8.11/parsl/tests/test_checkpointing}/__init__.py +0 -0
  298. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  299. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  300. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  301. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  302. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  303. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  304. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  305. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_curvezmq.py +0 -0
  306. {parsl-2025.7.28/parsl/tests/test_checkpointing → parsl-2025.8.11/parsl/tests/test_docs}/__init__.py +0 -0
  307. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_docs/test_from_slides.py +0 -0
  308. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_docs/test_kwargs.py +0 -0
  309. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  310. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_docs/test_workflow1.py +0 -0
  311. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_docs/test_workflow2.py +0 -0
  312. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_docs/test_workflow4.py +0 -0
  313. {parsl-2025.7.28/parsl/tests/test_docs → parsl-2025.8.11/parsl/tests/test_error_handling}/__init__.py +0 -0
  314. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_fail.py +0 -0
  315. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  316. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  317. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  318. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_retries.py +0 -0
  319. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  320. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  321. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  322. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  323. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_execute_task.py +0 -0
  324. {parsl-2025.7.28/parsl/tests/test_error_handling → parsl-2025.8.11/parsl/tests/test_flowcontrol}/__init__.py +0 -0
  325. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_flux.py +0 -0
  326. {parsl-2025.7.28/parsl/tests/test_flowcontrol → parsl-2025.8.11/parsl/tests/test_htex}/__init__.py +0 -0
  327. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_basic.py +0 -0
  328. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
  329. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  330. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  331. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  332. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  333. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
  334. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_drain.py +0 -0
  335. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_htex.py +0 -0
  336. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +0 -0
  337. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  338. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
  339. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_managers_command.py +0 -0
  340. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  341. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  342. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_priority_queue.py +0 -0
  343. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
  344. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  345. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
  346. {parsl-2025.7.28/parsl/tests/test_htex → parsl-2025.8.11/parsl/tests/test_monitoring}/__init__.py +0 -0
  347. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  348. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_basic.py +0 -0
  349. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  350. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
  351. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
  352. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  353. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  354. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  355. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
  356. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
  357. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
  358. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
  359. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  360. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  361. {parsl-2025.7.28/parsl/tests/test_monitoring → parsl-2025.8.11/parsl/tests/test_mpi_apps}/__init__.py +0 -0
  362. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  363. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  364. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  365. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
  366. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  367. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  368. {parsl-2025.7.28/parsl/tests/test_mpi_apps → parsl-2025.8.11/parsl/tests/test_providers}/__init__.py +0 -0
  369. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
  370. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_providers/test_local_provider.py +0 -0
  371. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  372. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  373. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  374. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  375. {parsl-2025.7.28/parsl/tests/test_providers → parsl-2025.8.11/parsl/tests/test_python_apps}/__init__.py +0 -0
  376. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  377. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_basic.py +0 -0
  378. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  379. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  380. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  381. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  382. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  383. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_fail.py +0 -0
  384. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  385. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  386. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_futures.py +0 -0
  387. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  388. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  389. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
  390. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_join.py +0 -0
  391. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  392. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  393. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  394. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  395. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  396. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  397. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  398. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  399. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  400. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_overview.py +0 -0
  401. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  402. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  403. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_simple.py +0 -0
  404. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  405. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_type5.py +0 -0
  406. {parsl-2025.7.28/parsl/tests/test_python_apps → parsl-2025.8.11/parsl/tests/test_radical}/__init__.py +0 -0
  407. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  408. {parsl-2025.7.28/parsl/tests/test_radical → parsl-2025.8.11/parsl/tests/test_regression}/__init__.py +0 -0
  409. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_1480.py +0 -0
  410. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  411. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_1653.py +0 -0
  412. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_221.py +0 -0
  413. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_226.py +0 -0
  414. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_2652.py +0 -0
  415. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_69a.py +0 -0
  416. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_854.py +0 -0
  417. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  418. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_98.py +0 -0
  419. {parsl-2025.7.28/parsl/tests/test_regression → parsl-2025.8.11/parsl/tests/test_scaling}/__init__.py +0 -0
  420. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  421. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  422. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
  423. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  424. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  425. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
  426. {parsl-2025.7.28/parsl/tests/test_scaling → parsl-2025.8.11/parsl/tests/test_serialization}/__init__.py +0 -0
  427. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  428. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  429. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_basic.py +0 -0
  430. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  431. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
  432. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  433. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  434. {parsl-2025.7.28/parsl/tests/test_serialization → parsl-2025.8.11/parsl/tests/test_shutdown}/__init__.py +0 -0
  435. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  436. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/__init__.py +0 -0
  437. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/staging_provider.py +0 -0
  438. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_1316.py +0 -0
  439. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_docs_1.py +0 -0
  440. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_docs_2.py +0 -0
  441. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  442. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_file.py +0 -0
  443. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_file_apps.py +0 -0
  444. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_file_staging.py +0 -0
  445. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  446. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  447. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  448. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  449. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_staging_https.py +0 -0
  450. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  451. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_zip_in.py +0 -0
  452. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_zip_out.py +0 -0
  453. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  454. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_summary.py +0 -0
  455. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_thread_parallelism.py +0 -0
  456. {parsl-2025.7.28/parsl/tests/test_shutdown → parsl-2025.8.11/parsl/tests/test_threads}/__init__.py +0 -0
  457. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_threads/test_configs.py +0 -0
  458. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  459. {parsl-2025.7.28/parsl/tests/test_threads → parsl-2025.8.11/parsl/tests/test_utils}/__init__.py +0 -0
  460. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_utils/test_execute_wait.py +0 -0
  461. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
  462. {parsl-2025.7.28/parsl/tests/test_utils → parsl-2025.8.11/parsl/tests/unit}/__init__.py +0 -0
  463. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/unit/test_address.py +0 -0
  464. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/unit/test_file.py +0 -0
  465. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
  466. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/unit/test_usage_tracking.py +0 -0
  467. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/utils.py +0 -0
  468. {parsl-2025.7.28/parsl/tests/unit → parsl-2025.8.11/parsl/usage_tracking}/__init__.py +0 -0
  469. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/usage_tracking/api.py +0 -0
  470. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/usage_tracking/levels.py +0 -0
  471. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/usage_tracking/usage.py +0 -0
  472. {parsl-2025.7.28 → parsl-2025.8.11}/parsl/utils.py +0 -0
  473. {parsl-2025.7.28 → parsl-2025.8.11}/parsl.egg-info/dependency_links.txt +0 -0
  474. {parsl-2025.7.28 → parsl-2025.8.11}/parsl.egg-info/entry_points.txt +0 -0
  475. {parsl-2025.7.28 → parsl-2025.8.11}/parsl.egg-info/requires.txt +0 -0
  476. {parsl-2025.7.28 → parsl-2025.8.11}/parsl.egg-info/top_level.txt +0 -0
  477. {parsl-2025.7.28 → parsl-2025.8.11}/requirements.txt +0 -0
  478. {parsl-2025.7.28 → parsl-2025.8.11}/setup.cfg +0 -0
  479. {parsl-2025.7.28 → parsl-2025.8.11}/setup.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.7.28
3
+ Version: 2025.8.11
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.28.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.08.11.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
 
@@ -1139,7 +1142,7 @@ class DataFlowKernel:
1139
1142
  executor.monitoring_messages = self.monitoring.resource_msgs
1140
1143
  logger.debug("Starting monitoring receiver for executor %s "
1141
1144
  "with remote monitoring radio config %s",
1142
- executor, executor.remote_monitoring_radio)
1145
+ executor.label, executor.remote_monitoring_radio)
1143
1146
 
1144
1147
  executor.monitoring_receiver = executor.remote_monitoring_radio.create_receiver(resource_msgs=executor.monitoring_messages,
1145
1148
  run_dir=executor.run_dir)
@@ -1255,6 +1258,13 @@ class DataFlowKernel:
1255
1258
  else:
1256
1259
  logger.debug("Cleaning up non-default DFK - not unregistering")
1257
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.
1258
1268
  logger.info("DFK cleanup complete")
1259
1269
 
1260
1270
  def checkpoint(self, tasks: Optional[Sequence[TaskRecord]] = None) -> str:
@@ -621,13 +621,11 @@ 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"""
628
627
  return len(self.tasks)
629
628
 
630
- @property
631
629
  def connected_workers(self) -> int:
632
630
  """Returns the count of workers across all connected managers"""
633
631
  return self.command_client.run("WORKERS")
@@ -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
 
@@ -215,7 +215,7 @@ class Strategy:
215
215
 
216
216
  if hasattr(executor, 'connected_workers'):
217
217
  logger.debug('Executor {} has {} active tasks, {}/{} running/pending blocks, and {} connected workers'.format(
218
- label, active_tasks, running, pending, executor.connected_workers))
218
+ label, active_tasks, running, pending, executor.connected_workers()))
219
219
  else:
220
220
  logger.debug('Executor {} has {} active tasks and {}/{} running/pending blocks'.format(
221
221
  label, active_tasks, running, pending))
@@ -7,7 +7,7 @@ when working in a Jupyter notebook.
7
7
  """
8
8
  import io
9
9
  import logging
10
- from typing import Optional
10
+ from typing import Callable, Optional
11
11
 
12
12
  import typeguard
13
13
 
@@ -22,7 +22,7 @@ DEFAULT_FORMAT = (
22
22
  def set_stream_logger(name: str = 'parsl',
23
23
  level: int = logging.DEBUG,
24
24
  format_string: Optional[str] = None,
25
- stream: Optional[io.TextIOWrapper] = None) -> None:
25
+ stream: Optional[io.TextIOBase] = None) -> Callable[[], None]:
26
26
  """Add a stream log handler.
27
27
 
28
28
  Args:
@@ -50,12 +50,18 @@ def set_stream_logger(name: str = 'parsl',
50
50
  futures_logger = logging.getLogger("concurrent.futures")
51
51
  futures_logger.addHandler(handler)
52
52
 
53
+ def unregister_callback():
54
+ logger.removeHandler(handler)
55
+ futures_logger.removeHandler(handler)
56
+
57
+ return unregister_callback
58
+
53
59
 
54
60
  @typeguard.typechecked
55
61
  def set_file_logger(filename: str,
56
62
  name: str = 'parsl',
57
63
  level: int = logging.DEBUG,
58
- format_string: Optional[str] = None) -> None:
64
+ format_string: Optional[str] = None) -> Callable[[], None]:
59
65
  """Add a file log handler.
60
66
 
61
67
  Args:
@@ -63,6 +69,12 @@ def set_file_logger(filename: str,
63
69
  - name (string): Logger name
64
70
  - level (logging.LEVEL): Set the logging level.
65
71
  - format_string (string): Set the format string
72
+
73
+ Returns:
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))
66
78
  """
67
79
  if format_string is None:
68
80
  format_string = DEFAULT_FORMAT
@@ -79,3 +91,9 @@ def set_file_logger(filename: str,
79
91
  # concurrent.futures
80
92
  futures_logger = logging.getLogger("concurrent.futures")
81
93
  futures_logger.addHandler(handler)
94
+
95
+ def unregister_callback():
96
+ logger.removeHandler(handler)
97
+ futures_logger.removeHandler(handler)
98
+
99
+ return unregister_callback
@@ -18,7 +18,7 @@ from parsl.monitoring.types import MonitoringMessage, TaggedMonitoringMessage
18
18
  from parsl.process_loggers import wrap_with_logs
19
19
  from parsl.utils import setproctitle
20
20
 
21
- logger = logging.getLogger("database_manager")
21
+ logger = logging.getLogger(__name__)
22
22
 
23
23
  X = TypeVar('X')
24
24
 
@@ -293,11 +293,8 @@ class DatabaseManager:
293
293
  self.run_dir = run_dir
294
294
  os.makedirs(self.run_dir, exist_ok=True)
295
295
 
296
- logger.propagate = False
297
-
298
296
  set_file_logger(f"{self.run_dir}/database_manager.log", level=logging_level,
299
- format_string="%(asctime)s.%(msecs)03d %(name)s:%(lineno)d [%(levelname)s] [%(threadName)s %(thread)d] %(message)s",
300
- name="database_manager")
297
+ format_string="%(asctime)s.%(msecs)03d %(name)s:%(lineno)d [%(levelname)s] [%(threadName)s %(thread)d] %(message)s")
301
298
 
302
299
  logger.debug("Initializing Database Manager process")
303
300
 
@@ -550,20 +547,21 @@ class DatabaseManager:
550
547
  "or some other error. monitoring data may have been lost"
551
548
  )
552
549
  exception_happened = True
550
+
551
+ if self.external_exit_event.is_set():
552
+ self.close()
553
+
553
554
  if exception_happened:
554
555
  raise RuntimeError("An exception happened sometime during database processing and should have been logged in database_manager.log")
555
556
 
556
- @wrap_with_logs(target="database_manager")
557
- def _migrate_logs_to_internal(self, logs_queue: queue.Queue, kill_event: threading.Event) -> None:
557
+ @wrap_with_logs
558
+ def _migrate_logs_to_internal(self, logs_queue: mpq.Queue, kill_event: threading.Event) -> None:
558
559
  logger.info("Starting _migrate_logs_to_internal")
559
560
 
560
561
  while not kill_event.is_set() or logs_queue.qsize() != 0:
561
562
  logger.debug("Checking STOP conditions: kill event: %s, queue has entries: %s",
562
563
  kill_event.is_set(), logs_queue.qsize() != 0)
563
564
 
564
- if self.external_exit_event.is_set():
565
- self.close()
566
-
567
565
  try:
568
566
  x = logs_queue.get(timeout=0.1)
569
567
  except queue.Empty:
@@ -682,7 +680,7 @@ class DatabaseManager:
682
680
  self._kill_event.set()
683
681
 
684
682
 
685
- @wrap_with_logs(target="database_manager")
683
+ @wrap_with_logs
686
684
  @typeguard.typechecked
687
685
  def dbm_starter(resource_msgs: mpq.Queue,
688
686
  db_url: str,
@@ -53,7 +53,7 @@ def test_simple(mem_per_worker):
53
53
  # Prime a worker
54
54
  double(5).result()
55
55
  dfk = parsl.dfk()
56
- connected = dfk.executors['htex_local'].connected_workers
56
+ connected = dfk.executors['htex_local'].connected_workers()
57
57
  print("Connected : ", connected)
58
58
  assert expected_workers == connected, "Expected {} workers, instead got {} workers".format(expected_workers,
59
59
  connected)
@@ -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
 
@@ -35,8 +35,8 @@ def test_platform(n=2, sleep_dur=10):
35
35
  print([i.result() for i in x])
36
36
 
37
37
  print("Executor : ", dfk.executors[name])
38
- print("Connected : ", dfk.executors[name].connected_workers)
39
- print("Outstanding : ", dfk.executors[name].outstanding)
38
+ print("Connected : ", dfk.executors[name].connected_workers())
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
@@ -9,6 +9,12 @@ class GoodRepr(RepresentationMixin):
9
9
  self.y = y
10
10
 
11
11
 
12
+ class GoodReprDefaults(RepresentationMixin):
13
+ def __init__(self, x, y="default 2"):
14
+ self.x = x
15
+ self.y = y
16
+
17
+
12
18
  class BadRepr(RepresentationMixin):
13
19
  """This class incorrectly subclasses RepresentationMixin.
14
20
  It does not store the parameter x on self.
@@ -31,6 +37,33 @@ def test_repr_good():
31
37
  assert p2 in r
32
38
 
33
39
 
40
+ @pytest.mark.local
41
+ def test_repr_good_defaults_overridden():
42
+ p1 = "parameter 1"
43
+ p2 = "the second parameter"
44
+
45
+ # repr should not raise an exception
46
+ r = repr(GoodReprDefaults(p1, p2))
47
+
48
+ # representation should contain both values supplied
49
+ # at object creation.
50
+ assert p1 in r
51
+ assert p2 in r
52
+
53
+
54
+ @pytest.mark.local
55
+ def test_repr_good_defaults_defaulted():
56
+ p1 = "parameter 1"
57
+
58
+ # repr should not raise an exception
59
+ r = repr(GoodReprDefaults(p1))
60
+
61
+ # representation should contain one value supplied
62
+ # at object creation, and the other defaulted.
63
+ assert p1 in r
64
+ assert "default 2" in r
65
+
66
+
34
67
  @pytest.mark.local
35
68
  def test_repr_bad():
36
69
  p1 = "parameter 1"
@@ -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.28'
6
+ VERSION = '2025.08.11'
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.7.28
3
+ Version: 2025.8.11
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.28.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.08.11.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
- )