hpcflow-new2 0.2.0a190__py3-none-any.whl → 0.2.0a200__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. hpcflow/__pyinstaller/hook-hpcflow.py +1 -0
  2. hpcflow/_version.py +1 -1
  3. hpcflow/data/scripts/bad_script.py +2 -0
  4. hpcflow/data/scripts/do_nothing.py +2 -0
  5. hpcflow/data/scripts/env_specifier_test/input_file_generator_pass_env_spec.py +4 -0
  6. hpcflow/data/scripts/env_specifier_test/main_script_test_pass_env_spec.py +8 -0
  7. hpcflow/data/scripts/env_specifier_test/output_file_parser_pass_env_spec.py +4 -0
  8. hpcflow/data/scripts/env_specifier_test/v1/input_file_generator_basic.py +4 -0
  9. hpcflow/data/scripts/env_specifier_test/v1/main_script_test_direct_in_direct_out.py +7 -0
  10. hpcflow/data/scripts/env_specifier_test/v1/output_file_parser_basic.py +4 -0
  11. hpcflow/data/scripts/env_specifier_test/v2/main_script_test_direct_in_direct_out.py +7 -0
  12. hpcflow/data/scripts/input_file_generator_basic.py +3 -0
  13. hpcflow/data/scripts/input_file_generator_basic_FAIL.py +3 -0
  14. hpcflow/data/scripts/input_file_generator_test_stdout_stderr.py +8 -0
  15. hpcflow/data/scripts/main_script_test_direct_in.py +3 -0
  16. hpcflow/data/scripts/main_script_test_direct_in_direct_out_2.py +6 -0
  17. hpcflow/data/scripts/main_script_test_direct_in_direct_out_2_fail_allowed.py +6 -0
  18. hpcflow/data/scripts/main_script_test_direct_in_direct_out_2_fail_allowed_group.py +7 -0
  19. hpcflow/data/scripts/main_script_test_direct_in_direct_out_3.py +6 -0
  20. hpcflow/data/scripts/main_script_test_direct_in_group_direct_out_3.py +6 -0
  21. hpcflow/data/scripts/main_script_test_direct_in_group_one_fail_direct_out_3.py +6 -0
  22. hpcflow/data/scripts/main_script_test_hdf5_in_obj_2.py +12 -0
  23. hpcflow/data/scripts/main_script_test_json_out_FAIL.py +3 -0
  24. hpcflow/data/scripts/main_script_test_shell_env_vars.py +12 -0
  25. hpcflow/data/scripts/main_script_test_std_out_std_err.py +6 -0
  26. hpcflow/data/scripts/output_file_parser_basic.py +3 -0
  27. hpcflow/data/scripts/output_file_parser_basic_FAIL.py +7 -0
  28. hpcflow/data/scripts/output_file_parser_test_stdout_stderr.py +8 -0
  29. hpcflow/data/scripts/script_exit_test.py +5 -0
  30. hpcflow/data/template_components/environments.yaml +1 -1
  31. hpcflow/sdk/__init__.py +5 -0
  32. hpcflow/sdk/app.py +166 -92
  33. hpcflow/sdk/cli.py +263 -84
  34. hpcflow/sdk/cli_common.py +99 -5
  35. hpcflow/sdk/config/callbacks.py +38 -1
  36. hpcflow/sdk/config/config.py +102 -13
  37. hpcflow/sdk/config/errors.py +19 -5
  38. hpcflow/sdk/config/types.py +3 -0
  39. hpcflow/sdk/core/__init__.py +25 -1
  40. hpcflow/sdk/core/actions.py +914 -262
  41. hpcflow/sdk/core/cache.py +76 -34
  42. hpcflow/sdk/core/command_files.py +14 -128
  43. hpcflow/sdk/core/commands.py +35 -6
  44. hpcflow/sdk/core/element.py +122 -50
  45. hpcflow/sdk/core/errors.py +58 -2
  46. hpcflow/sdk/core/execute.py +207 -0
  47. hpcflow/sdk/core/loop.py +408 -50
  48. hpcflow/sdk/core/loop_cache.py +4 -4
  49. hpcflow/sdk/core/parameters.py +382 -37
  50. hpcflow/sdk/core/run_dir_files.py +13 -40
  51. hpcflow/sdk/core/skip_reason.py +7 -0
  52. hpcflow/sdk/core/task.py +119 -30
  53. hpcflow/sdk/core/task_schema.py +68 -0
  54. hpcflow/sdk/core/test_utils.py +66 -27
  55. hpcflow/sdk/core/types.py +54 -1
  56. hpcflow/sdk/core/utils.py +136 -19
  57. hpcflow/sdk/core/workflow.py +1587 -356
  58. hpcflow/sdk/data/workflow_spec_schema.yaml +2 -0
  59. hpcflow/sdk/demo/cli.py +7 -0
  60. hpcflow/sdk/helper/cli.py +1 -0
  61. hpcflow/sdk/log.py +42 -15
  62. hpcflow/sdk/persistence/base.py +405 -53
  63. hpcflow/sdk/persistence/json.py +177 -52
  64. hpcflow/sdk/persistence/pending.py +237 -69
  65. hpcflow/sdk/persistence/store_resource.py +3 -2
  66. hpcflow/sdk/persistence/types.py +15 -4
  67. hpcflow/sdk/persistence/zarr.py +928 -81
  68. hpcflow/sdk/submission/jobscript.py +1408 -489
  69. hpcflow/sdk/submission/schedulers/__init__.py +40 -5
  70. hpcflow/sdk/submission/schedulers/direct.py +33 -19
  71. hpcflow/sdk/submission/schedulers/sge.py +51 -16
  72. hpcflow/sdk/submission/schedulers/slurm.py +44 -16
  73. hpcflow/sdk/submission/schedulers/utils.py +7 -2
  74. hpcflow/sdk/submission/shells/base.py +68 -20
  75. hpcflow/sdk/submission/shells/bash.py +222 -129
  76. hpcflow/sdk/submission/shells/powershell.py +200 -150
  77. hpcflow/sdk/submission/submission.py +852 -119
  78. hpcflow/sdk/submission/types.py +18 -21
  79. hpcflow/sdk/typing.py +24 -5
  80. hpcflow/sdk/utils/arrays.py +71 -0
  81. hpcflow/sdk/utils/deferred_file.py +55 -0
  82. hpcflow/sdk/utils/hashing.py +16 -0
  83. hpcflow/sdk/utils/patches.py +12 -0
  84. hpcflow/sdk/utils/strings.py +33 -0
  85. hpcflow/tests/api/test_api.py +32 -0
  86. hpcflow/tests/conftest.py +19 -0
  87. hpcflow/tests/data/benchmark_script_runner.yaml +26 -0
  88. hpcflow/tests/data/multi_path_sequences.yaml +29 -0
  89. hpcflow/tests/data/workflow_test_run_abort.yaml +34 -35
  90. hpcflow/tests/schedulers/sge/test_sge_submission.py +36 -0
  91. hpcflow/tests/scripts/test_input_file_generators.py +282 -0
  92. hpcflow/tests/scripts/test_main_scripts.py +821 -70
  93. hpcflow/tests/scripts/test_non_snippet_script.py +46 -0
  94. hpcflow/tests/scripts/test_ouput_file_parsers.py +353 -0
  95. hpcflow/tests/shells/wsl/test_wsl_submission.py +6 -0
  96. hpcflow/tests/unit/test_action.py +176 -0
  97. hpcflow/tests/unit/test_app.py +20 -0
  98. hpcflow/tests/unit/test_cache.py +46 -0
  99. hpcflow/tests/unit/test_cli.py +133 -0
  100. hpcflow/tests/unit/test_config.py +122 -1
  101. hpcflow/tests/unit/test_element_iteration.py +47 -0
  102. hpcflow/tests/unit/test_jobscript_unit.py +757 -0
  103. hpcflow/tests/unit/test_loop.py +1332 -27
  104. hpcflow/tests/unit/test_meta_task.py +325 -0
  105. hpcflow/tests/unit/test_multi_path_sequences.py +229 -0
  106. hpcflow/tests/unit/test_parameter.py +13 -0
  107. hpcflow/tests/unit/test_persistence.py +190 -8
  108. hpcflow/tests/unit/test_run.py +109 -3
  109. hpcflow/tests/unit/test_run_directories.py +29 -0
  110. hpcflow/tests/unit/test_shell.py +20 -0
  111. hpcflow/tests/unit/test_submission.py +5 -76
  112. hpcflow/tests/unit/test_workflow_template.py +31 -0
  113. hpcflow/tests/unit/utils/test_arrays.py +40 -0
  114. hpcflow/tests/unit/utils/test_deferred_file_writer.py +34 -0
  115. hpcflow/tests/unit/utils/test_hashing.py +65 -0
  116. hpcflow/tests/unit/utils/test_patches.py +5 -0
  117. hpcflow/tests/unit/utils/test_redirect_std.py +50 -0
  118. hpcflow/tests/workflows/__init__.py +0 -0
  119. hpcflow/tests/workflows/test_directory_structure.py +31 -0
  120. hpcflow/tests/workflows/test_jobscript.py +332 -0
  121. hpcflow/tests/workflows/test_run_status.py +198 -0
  122. hpcflow/tests/workflows/test_skip_downstream.py +696 -0
  123. hpcflow/tests/workflows/test_submission.py +140 -0
  124. hpcflow/tests/workflows/test_workflows.py +142 -2
  125. hpcflow/tests/workflows/test_zip.py +18 -0
  126. hpcflow/viz_demo.ipynb +6587 -3
  127. {hpcflow_new2-0.2.0a190.dist-info → hpcflow_new2-0.2.0a200.dist-info}/METADATA +7 -4
  128. hpcflow_new2-0.2.0a200.dist-info/RECORD +222 -0
  129. hpcflow_new2-0.2.0a190.dist-info/RECORD +0 -165
  130. {hpcflow_new2-0.2.0a190.dist-info → hpcflow_new2-0.2.0a200.dist-info}/LICENSE +0 -0
  131. {hpcflow_new2-0.2.0a190.dist-info → hpcflow_new2-0.2.0a200.dist-info}/WHEEL +0 -0
  132. {hpcflow_new2-0.2.0a190.dist-info → hpcflow_new2-0.2.0a200.dist-info}/entry_points.txt +0 -0
@@ -13,6 +13,7 @@ hiddenimports = [
13
13
  "hpcflow.data.workflows",
14
14
  "hpcflow.tests.data",
15
15
  "hpcflow.sdk.core.test_utils",
16
+ "hpcflow.sdk.utils.patches",
16
17
  "click.testing",
17
18
  "requests", # for GitHub fsspec file system
18
19
  "fsspec.implementations.github", # for GitHub fsspec file system
hpcflow/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.2.0a190"
1
+ __version__ = "0.2.0a200"
@@ -0,0 +1,2 @@
1
+ def bad_script():
2
+ raise SyntaxError("oh no!")
@@ -0,0 +1,2 @@
1
+ def do_nothing():
2
+ pass
@@ -0,0 +1,4 @@
1
+ def input_file_generator_pass_env_spec(path, p1, env_spec):
2
+ print(env_spec)
3
+ with path.open("w") as fp:
4
+ fp.write(f"{p1}\n")
@@ -0,0 +1,8 @@
1
+ def main_script_test_pass_env_spec(p1, env_spec):
2
+ # process
3
+ p2 = p1 + 100
4
+
5
+ print(env_spec)
6
+
7
+ # return outputs
8
+ return {"p2": p2}
@@ -0,0 +1,4 @@
1
+ def output_file_parser_pass_env_spec(my_output_file, env_spec):
2
+ print(env_spec)
3
+ with my_output_file.open("r") as fp:
4
+ return int(fp.read().strip())
@@ -0,0 +1,4 @@
1
+ # version: v1
2
+ def input_file_generator_basic(path, p1):
3
+ with path.open("w") as fp:
4
+ fp.write(f"{p1}\n")
@@ -0,0 +1,7 @@
1
+ # version: v1
2
+ def main_script_test_direct_in_direct_out(p1):
3
+ # process
4
+ p2 = p1 + 100
5
+
6
+ # return outputs
7
+ return {"p2": p2}
@@ -0,0 +1,4 @@
1
+ # version: v1
2
+ def output_file_parser_basic(my_output_file):
3
+ with my_output_file.open("r") as fp:
4
+ return int(fp.read().strip())
@@ -0,0 +1,7 @@
1
+ # version: v2
2
+ def main_script_test_direct_in_direct_out(p1):
3
+ # process
4
+ p2 = p1 + 200
5
+
6
+ # return outputs
7
+ return {"p2": p2}
@@ -0,0 +1,3 @@
1
+ def input_file_generator_basic(path, p1):
2
+ with path.open("w") as fp:
3
+ fp.write(f"{p1}\n")
@@ -0,0 +1,3 @@
1
+ def input_file_generator_basic_FAIL(path, p1):
2
+ # silently fail to generate the input file!
3
+ pass
@@ -0,0 +1,8 @@
1
+ import sys
2
+
3
+
4
+ def input_file_generator_test_stdout_stderr(path, p1):
5
+ print(p1)
6
+ print(p1, file=sys.stderr)
7
+ with path.open("w") as fp:
8
+ fp.write(f"{p1}\n")
@@ -0,0 +1,3 @@
1
+ def main_script_test_direct_in(p1):
2
+ # process
3
+ print(p1 + 100)
@@ -0,0 +1,6 @@
1
+ def main_script_test_direct_in_direct_out_2(p2):
2
+ # process
3
+ p3 = p2 + 100
4
+
5
+ # return outputs
6
+ return {"p3": p3}
@@ -0,0 +1,6 @@
1
+ def main_script_test_direct_in_direct_out_2_fail_allowed(p2):
2
+ # process, accounting for possible unset data:
3
+ p3 = (p2 if p2 is not None else 0) + 100
4
+
5
+ # return outputs
6
+ return {"p3": p3}
@@ -0,0 +1,7 @@
1
+ def main_script_test_direct_in_direct_out_2_fail_allowed_group(p2):
2
+ # process, accounting for possible unset data:
3
+ p2_sum = sum(i for i in p2 if i is not None)
4
+ p3 = p2_sum + 100
5
+
6
+ # return outputs
7
+ return {"p3": p3}
@@ -0,0 +1,6 @@
1
+ def main_script_test_direct_in_direct_out_3(p3):
2
+ # process
3
+ p4 = p3 + 100
4
+
5
+ # return outputs
6
+ return {"p4": p4}
@@ -0,0 +1,6 @@
1
+ def main_script_test_direct_in_group_direct_out_3(p3):
2
+ # process
3
+ p4 = sum(p3) + 100
4
+
5
+ # return outputs
6
+ return {"p4": p4}
@@ -0,0 +1,6 @@
1
+ def main_script_test_direct_in_group_one_fail_direct_out_3(p3):
2
+ # process, ignore some un-set inputs:
3
+ p4 = sum([i for i in p3 if i is not None]) + 100
4
+
5
+ # return outputs
6
+ return {"p4": p4}
@@ -0,0 +1,12 @@
1
+ import h5py # type: ignore
2
+
3
+
4
+ def main_script_test_hdf5_in_obj_2(p2, _input_files):
5
+ # read inputs
6
+ with h5py.File(_input_files["hdf5"], mode="r") as fh:
7
+ a = fh["p1c"].attrs["a"].item()
8
+
9
+ # process
10
+ p3 = a + 100
11
+
12
+ return {"p3": p3}
@@ -0,0 +1,3 @@
1
+ def main_script_test_json_out_FAIL(_output_files):
2
+ pass
3
+ # don't generate a JSON output file!
@@ -0,0 +1,12 @@
1
+ import json
2
+ import os
3
+
4
+
5
+ def main_script_test_shell_env_vars(p1):
6
+ with open("env_vars.json", "wt") as fp:
7
+ json.dump(
8
+ {k: v for k, v in os.environ.items() if k.startswith("HPCFLOW")},
9
+ fp,
10
+ indent=4,
11
+ )
12
+ return {"p1": p1 + 1}
@@ -0,0 +1,6 @@
1
+ import sys
2
+
3
+
4
+ def main_script_test_std_out_std_err(stdout_msg, stderr_msg):
5
+ print(stdout_msg)
6
+ print(stderr_msg, file=sys.stderr)
@@ -0,0 +1,3 @@
1
+ def output_file_parser_basic(my_output_file):
2
+ with my_output_file.open("r") as fp:
3
+ return int(fp.read().strip())
@@ -0,0 +1,7 @@
1
+ def output_file_parser_basic_FAIL(my_output_file):
2
+ # parse the output file, but then delete it, so it cannot be saved (when run with
3
+ # `OFP.save_files=True`):
4
+ with my_output_file.open("r") as fp:
5
+ out = int(fp.read().strip())
6
+ my_output_file.unlink()
7
+ return out
@@ -0,0 +1,8 @@
1
+ import sys
2
+
3
+
4
+ def output_file_parser_test_stdout_stderr(my_output_file, p1):
5
+ print(p1)
6
+ print(p1, file=sys.stderr)
7
+ with my_output_file.open("r") as fp:
8
+ return int(fp.read().strip())
@@ -0,0 +1,5 @@
1
+ import sys
2
+
3
+
4
+ def script_exit_test(exit_code):
5
+ sys.exit(exit_code)
@@ -5,7 +5,7 @@
5
5
  executables:
6
6
  - label: python_script
7
7
  instances:
8
- - command: python <<script_name>> <<args>>
8
+ - command: python <<script_path>> <<args>>
9
9
  num_cores: 1
10
10
  parallel_mode: null
11
11
  doc: |
hpcflow/sdk/__init__.py CHANGED
@@ -12,6 +12,7 @@ from typing import Final
12
12
  sdk_classes: Final[Mapping[str, str]] = {
13
13
  "Workflow": "hpcflow.sdk.core.workflow",
14
14
  "Task": "hpcflow.sdk.core.task",
15
+ "MetaTask": "hpcflow.sdk.core.task",
15
16
  "ActionScopeType": "hpcflow.sdk.core.enums",
16
17
  "ActionScope": "hpcflow.sdk.core.actions",
17
18
  "ActionRule": "hpcflow.sdk.core.actions",
@@ -46,6 +47,7 @@ sdk_classes: Final[Mapping[str, str]] = {
46
47
  "NumCores": "hpcflow.sdk.core.environment",
47
48
  "ExecutableInstance": "hpcflow.sdk.core.environment",
48
49
  "Executable": "hpcflow.sdk.core.environment",
50
+ "Executor": "hpcflow.sdk.core.execute",
49
51
  "Environment": "hpcflow.sdk.core.environment",
50
52
  "Loop": "hpcflow.sdk.core.loop",
51
53
  "WorkflowLoop": "hpcflow.sdk.core.loop",
@@ -68,6 +70,7 @@ sdk_classes: Final[Mapping[str, str]] = {
68
70
  "SchemaInput": "hpcflow.sdk.core.parameters",
69
71
  "SchemaOutput": "hpcflow.sdk.core.parameters",
70
72
  "ValueSequence": "hpcflow.sdk.core.parameters",
73
+ "MultiPathSequence": "hpcflow.sdk.core.parameters",
71
74
  "ValuePerturbation": "hpcflow.sdk.core.parameters",
72
75
  "InputValue": "hpcflow.sdk.core.parameters",
73
76
  "ResourceSpec": "hpcflow.sdk.core.parameters",
@@ -77,6 +80,7 @@ sdk_classes: Final[Mapping[str, str]] = {
77
80
  "InputSource": "hpcflow.sdk.core.parameters",
78
81
  "TaskObjective": "hpcflow.sdk.core.task_schema",
79
82
  "TaskSchema": "hpcflow.sdk.core.task_schema",
83
+ "MetaTaskSchema": "hpcflow.sdk.core.task_schema",
80
84
  "ElementSet": "hpcflow.sdk.core.task",
81
85
  "Task": "hpcflow.sdk.core.task",
82
86
  "WorkflowTask": "hpcflow.sdk.core.task",
@@ -89,6 +93,7 @@ sdk_classes: Final[Mapping[str, str]] = {
89
93
  "Workflow": "hpcflow.sdk.core.workflow",
90
94
  "WorkflowBlueprint": "hpcflow.sdk.core.workflow",
91
95
  "Jobscript": "hpcflow.sdk.submission.jobscript",
96
+ "JobscriptBlock": "hpcflow.sdk.submission.jobscript",
92
97
  "Submission": "hpcflow.sdk.submission.submission",
93
98
  "QueuedScheduler": "hpcflow.sdk.submission.schedulers",
94
99
  "DirectWindows": "hpcflow.sdk.submission.schedulers.direct",