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