hpcflow 0.1.9__py3-none-any.whl → 0.2.0a271__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.
- hpcflow/__init__.py +2 -11
- hpcflow/__pyinstaller/__init__.py +5 -0
- hpcflow/__pyinstaller/hook-hpcflow.py +40 -0
- hpcflow/_version.py +1 -1
- hpcflow/app.py +43 -0
- hpcflow/cli.py +2 -462
- hpcflow/data/demo_data_manifest/__init__.py +3 -0
- hpcflow/data/demo_data_manifest/demo_data_manifest.json +6 -0
- hpcflow/data/jinja_templates/test/test_template.txt +8 -0
- hpcflow/data/programs/hello_world/README.md +1 -0
- hpcflow/data/programs/hello_world/hello_world.c +87 -0
- hpcflow/data/programs/hello_world/linux/hello_world +0 -0
- hpcflow/data/programs/hello_world/macos/hello_world +0 -0
- hpcflow/data/programs/hello_world/win/hello_world.exe +0 -0
- hpcflow/data/scripts/__init__.py +1 -0
- hpcflow/data/scripts/bad_script.py +2 -0
- hpcflow/data/scripts/demo_task_1_generate_t1_infile_1.py +8 -0
- hpcflow/data/scripts/demo_task_1_generate_t1_infile_2.py +8 -0
- hpcflow/data/scripts/demo_task_1_parse_p3.py +7 -0
- hpcflow/data/scripts/do_nothing.py +2 -0
- hpcflow/data/scripts/env_specifier_test/input_file_generator_pass_env_spec.py +4 -0
- hpcflow/data/scripts/env_specifier_test/main_script_test_pass_env_spec.py +8 -0
- hpcflow/data/scripts/env_specifier_test/output_file_parser_pass_env_spec.py +4 -0
- hpcflow/data/scripts/env_specifier_test/v1/input_file_generator_basic.py +4 -0
- hpcflow/data/scripts/env_specifier_test/v1/main_script_test_direct_in_direct_out.py +7 -0
- hpcflow/data/scripts/env_specifier_test/v1/output_file_parser_basic.py +4 -0
- hpcflow/data/scripts/env_specifier_test/v2/main_script_test_direct_in_direct_out.py +7 -0
- hpcflow/data/scripts/generate_t1_file_01.py +7 -0
- hpcflow/data/scripts/import_future_script.py +7 -0
- hpcflow/data/scripts/input_file_generator_basic.py +3 -0
- hpcflow/data/scripts/input_file_generator_basic_FAIL.py +3 -0
- hpcflow/data/scripts/input_file_generator_test_stdout_stderr.py +8 -0
- hpcflow/data/scripts/main_script_test_direct_in.py +3 -0
- hpcflow/data/scripts/main_script_test_direct_in_direct_out.py +6 -0
- hpcflow/data/scripts/main_script_test_direct_in_direct_out_2.py +6 -0
- hpcflow/data/scripts/main_script_test_direct_in_direct_out_2_fail_allowed.py +6 -0
- hpcflow/data/scripts/main_script_test_direct_in_direct_out_2_fail_allowed_group.py +7 -0
- hpcflow/data/scripts/main_script_test_direct_in_direct_out_3.py +6 -0
- hpcflow/data/scripts/main_script_test_direct_in_direct_out_all_iters_test.py +15 -0
- hpcflow/data/scripts/main_script_test_direct_in_direct_out_env_spec.py +7 -0
- hpcflow/data/scripts/main_script_test_direct_in_direct_out_labels.py +8 -0
- hpcflow/data/scripts/main_script_test_direct_in_group_direct_out_3.py +6 -0
- hpcflow/data/scripts/main_script_test_direct_in_group_one_fail_direct_out_3.py +6 -0
- hpcflow/data/scripts/main_script_test_direct_sub_param_in_direct_out.py +6 -0
- hpcflow/data/scripts/main_script_test_hdf5_in_obj.py +12 -0
- hpcflow/data/scripts/main_script_test_hdf5_in_obj_2.py +12 -0
- hpcflow/data/scripts/main_script_test_hdf5_in_obj_group.py +12 -0
- hpcflow/data/scripts/main_script_test_hdf5_out_obj.py +11 -0
- hpcflow/data/scripts/main_script_test_json_and_direct_in_json_out.py +14 -0
- hpcflow/data/scripts/main_script_test_json_in_json_and_direct_out.py +17 -0
- hpcflow/data/scripts/main_script_test_json_in_json_out.py +14 -0
- hpcflow/data/scripts/main_script_test_json_in_json_out_labels.py +16 -0
- hpcflow/data/scripts/main_script_test_json_in_obj.py +12 -0
- hpcflow/data/scripts/main_script_test_json_out_FAIL.py +3 -0
- hpcflow/data/scripts/main_script_test_json_out_obj.py +10 -0
- hpcflow/data/scripts/main_script_test_json_sub_param_in_json_out_labels.py +16 -0
- hpcflow/data/scripts/main_script_test_shell_env_vars.py +12 -0
- hpcflow/data/scripts/main_script_test_std_out_std_err.py +6 -0
- hpcflow/data/scripts/output_file_parser_basic.py +3 -0
- hpcflow/data/scripts/output_file_parser_basic_FAIL.py +7 -0
- hpcflow/data/scripts/output_file_parser_test_stdout_stderr.py +8 -0
- hpcflow/data/scripts/parse_t1_file_01.py +4 -0
- hpcflow/data/scripts/script_exit_test.py +5 -0
- hpcflow/data/template_components/__init__.py +1 -0
- hpcflow/data/template_components/command_files.yaml +26 -0
- hpcflow/data/template_components/environments.yaml +13 -0
- hpcflow/data/template_components/parameters.yaml +14 -0
- hpcflow/data/template_components/task_schemas.yaml +139 -0
- hpcflow/data/workflows/workflow_1.yaml +5 -0
- hpcflow/examples.ipynb +1037 -0
- hpcflow/sdk/__init__.py +149 -0
- hpcflow/sdk/app.py +4266 -0
- hpcflow/sdk/cli.py +1479 -0
- hpcflow/sdk/cli_common.py +385 -0
- hpcflow/sdk/config/__init__.py +5 -0
- hpcflow/sdk/config/callbacks.py +246 -0
- hpcflow/sdk/config/cli.py +388 -0
- hpcflow/sdk/config/config.py +1410 -0
- hpcflow/sdk/config/config_file.py +501 -0
- hpcflow/sdk/config/errors.py +272 -0
- hpcflow/sdk/config/types.py +150 -0
- hpcflow/sdk/core/__init__.py +38 -0
- hpcflow/sdk/core/actions.py +3857 -0
- hpcflow/sdk/core/app_aware.py +25 -0
- hpcflow/sdk/core/cache.py +224 -0
- hpcflow/sdk/core/command_files.py +814 -0
- hpcflow/sdk/core/commands.py +424 -0
- hpcflow/sdk/core/element.py +2071 -0
- hpcflow/sdk/core/enums.py +221 -0
- hpcflow/sdk/core/environment.py +256 -0
- hpcflow/sdk/core/errors.py +1043 -0
- hpcflow/sdk/core/execute.py +207 -0
- hpcflow/sdk/core/json_like.py +809 -0
- hpcflow/sdk/core/loop.py +1320 -0
- hpcflow/sdk/core/loop_cache.py +282 -0
- hpcflow/sdk/core/object_list.py +933 -0
- hpcflow/sdk/core/parameters.py +3371 -0
- hpcflow/sdk/core/rule.py +196 -0
- hpcflow/sdk/core/run_dir_files.py +57 -0
- hpcflow/sdk/core/skip_reason.py +7 -0
- hpcflow/sdk/core/task.py +3792 -0
- hpcflow/sdk/core/task_schema.py +993 -0
- hpcflow/sdk/core/test_utils.py +538 -0
- hpcflow/sdk/core/types.py +447 -0
- hpcflow/sdk/core/utils.py +1207 -0
- hpcflow/sdk/core/validation.py +87 -0
- hpcflow/sdk/core/values.py +477 -0
- hpcflow/sdk/core/workflow.py +4820 -0
- hpcflow/sdk/core/zarr_io.py +206 -0
- hpcflow/sdk/data/__init__.py +13 -0
- hpcflow/sdk/data/config_file_schema.yaml +34 -0
- hpcflow/sdk/data/config_schema.yaml +260 -0
- hpcflow/sdk/data/environments_spec_schema.yaml +21 -0
- hpcflow/sdk/data/files_spec_schema.yaml +5 -0
- hpcflow/sdk/data/parameters_spec_schema.yaml +7 -0
- hpcflow/sdk/data/task_schema_spec_schema.yaml +3 -0
- hpcflow/sdk/data/workflow_spec_schema.yaml +22 -0
- hpcflow/sdk/demo/__init__.py +3 -0
- hpcflow/sdk/demo/cli.py +242 -0
- hpcflow/sdk/helper/__init__.py +3 -0
- hpcflow/sdk/helper/cli.py +137 -0
- hpcflow/sdk/helper/helper.py +300 -0
- hpcflow/sdk/helper/watcher.py +192 -0
- hpcflow/sdk/log.py +288 -0
- hpcflow/sdk/persistence/__init__.py +18 -0
- hpcflow/sdk/persistence/base.py +2817 -0
- hpcflow/sdk/persistence/defaults.py +6 -0
- hpcflow/sdk/persistence/discovery.py +39 -0
- hpcflow/sdk/persistence/json.py +954 -0
- hpcflow/sdk/persistence/pending.py +948 -0
- hpcflow/sdk/persistence/store_resource.py +203 -0
- hpcflow/sdk/persistence/types.py +309 -0
- hpcflow/sdk/persistence/utils.py +73 -0
- hpcflow/sdk/persistence/zarr.py +2388 -0
- hpcflow/sdk/runtime.py +320 -0
- hpcflow/sdk/submission/__init__.py +3 -0
- hpcflow/sdk/submission/enums.py +70 -0
- hpcflow/sdk/submission/jobscript.py +2379 -0
- hpcflow/sdk/submission/schedulers/__init__.py +281 -0
- hpcflow/sdk/submission/schedulers/direct.py +233 -0
- hpcflow/sdk/submission/schedulers/sge.py +376 -0
- hpcflow/sdk/submission/schedulers/slurm.py +598 -0
- hpcflow/sdk/submission/schedulers/utils.py +25 -0
- hpcflow/sdk/submission/shells/__init__.py +52 -0
- hpcflow/sdk/submission/shells/base.py +229 -0
- hpcflow/sdk/submission/shells/bash.py +504 -0
- hpcflow/sdk/submission/shells/os_version.py +115 -0
- hpcflow/sdk/submission/shells/powershell.py +352 -0
- hpcflow/sdk/submission/submission.py +1402 -0
- hpcflow/sdk/submission/types.py +140 -0
- hpcflow/sdk/typing.py +194 -0
- hpcflow/sdk/utils/arrays.py +69 -0
- hpcflow/sdk/utils/deferred_file.py +55 -0
- hpcflow/sdk/utils/hashing.py +16 -0
- hpcflow/sdk/utils/patches.py +31 -0
- hpcflow/sdk/utils/strings.py +69 -0
- hpcflow/tests/api/test_api.py +32 -0
- hpcflow/tests/conftest.py +123 -0
- hpcflow/tests/data/__init__.py +0 -0
- hpcflow/tests/data/benchmark_N_elements.yaml +6 -0
- hpcflow/tests/data/benchmark_script_runner.yaml +26 -0
- hpcflow/tests/data/multi_path_sequences.yaml +29 -0
- hpcflow/tests/data/workflow_1.json +10 -0
- hpcflow/tests/data/workflow_1.yaml +5 -0
- hpcflow/tests/data/workflow_1_slurm.yaml +8 -0
- hpcflow/tests/data/workflow_1_wsl.yaml +8 -0
- hpcflow/tests/data/workflow_test_run_abort.yaml +42 -0
- hpcflow/tests/jinja_templates/test_jinja_templates.py +161 -0
- hpcflow/tests/programs/test_programs.py +180 -0
- hpcflow/tests/schedulers/direct_linux/test_direct_linux_submission.py +12 -0
- hpcflow/tests/schedulers/sge/test_sge_submission.py +36 -0
- hpcflow/tests/schedulers/slurm/test_slurm_submission.py +14 -0
- hpcflow/tests/scripts/test_input_file_generators.py +282 -0
- hpcflow/tests/scripts/test_main_scripts.py +1361 -0
- hpcflow/tests/scripts/test_non_snippet_script.py +46 -0
- hpcflow/tests/scripts/test_ouput_file_parsers.py +353 -0
- hpcflow/tests/shells/wsl/test_wsl_submission.py +14 -0
- hpcflow/tests/unit/test_action.py +1066 -0
- hpcflow/tests/unit/test_action_rule.py +24 -0
- hpcflow/tests/unit/test_app.py +132 -0
- hpcflow/tests/unit/test_cache.py +46 -0
- hpcflow/tests/unit/test_cli.py +172 -0
- hpcflow/tests/unit/test_command.py +377 -0
- hpcflow/tests/unit/test_config.py +195 -0
- hpcflow/tests/unit/test_config_file.py +162 -0
- hpcflow/tests/unit/test_element.py +666 -0
- hpcflow/tests/unit/test_element_iteration.py +88 -0
- hpcflow/tests/unit/test_element_set.py +158 -0
- hpcflow/tests/unit/test_group.py +115 -0
- hpcflow/tests/unit/test_input_source.py +1479 -0
- hpcflow/tests/unit/test_input_value.py +398 -0
- hpcflow/tests/unit/test_jobscript_unit.py +757 -0
- hpcflow/tests/unit/test_json_like.py +1247 -0
- hpcflow/tests/unit/test_loop.py +2674 -0
- hpcflow/tests/unit/test_meta_task.py +325 -0
- hpcflow/tests/unit/test_multi_path_sequences.py +259 -0
- hpcflow/tests/unit/test_object_list.py +116 -0
- hpcflow/tests/unit/test_parameter.py +243 -0
- hpcflow/tests/unit/test_persistence.py +664 -0
- hpcflow/tests/unit/test_resources.py +243 -0
- hpcflow/tests/unit/test_run.py +286 -0
- hpcflow/tests/unit/test_run_directories.py +29 -0
- hpcflow/tests/unit/test_runtime.py +9 -0
- hpcflow/tests/unit/test_schema_input.py +372 -0
- hpcflow/tests/unit/test_shell.py +129 -0
- hpcflow/tests/unit/test_slurm.py +39 -0
- hpcflow/tests/unit/test_submission.py +502 -0
- hpcflow/tests/unit/test_task.py +2560 -0
- hpcflow/tests/unit/test_task_schema.py +182 -0
- hpcflow/tests/unit/test_utils.py +616 -0
- hpcflow/tests/unit/test_value_sequence.py +549 -0
- hpcflow/tests/unit/test_values.py +91 -0
- hpcflow/tests/unit/test_workflow.py +827 -0
- hpcflow/tests/unit/test_workflow_template.py +186 -0
- hpcflow/tests/unit/utils/test_arrays.py +40 -0
- hpcflow/tests/unit/utils/test_deferred_file_writer.py +34 -0
- hpcflow/tests/unit/utils/test_hashing.py +65 -0
- hpcflow/tests/unit/utils/test_patches.py +5 -0
- hpcflow/tests/unit/utils/test_redirect_std.py +50 -0
- hpcflow/tests/unit/utils/test_strings.py +97 -0
- hpcflow/tests/workflows/__init__.py +0 -0
- hpcflow/tests/workflows/test_directory_structure.py +31 -0
- hpcflow/tests/workflows/test_jobscript.py +355 -0
- hpcflow/tests/workflows/test_run_status.py +198 -0
- hpcflow/tests/workflows/test_skip_downstream.py +696 -0
- hpcflow/tests/workflows/test_submission.py +140 -0
- hpcflow/tests/workflows/test_workflows.py +564 -0
- hpcflow/tests/workflows/test_zip.py +18 -0
- hpcflow/viz_demo.ipynb +6794 -0
- hpcflow-0.2.0a271.dist-info/LICENSE +375 -0
- hpcflow-0.2.0a271.dist-info/METADATA +65 -0
- hpcflow-0.2.0a271.dist-info/RECORD +237 -0
- {hpcflow-0.1.9.dist-info → hpcflow-0.2.0a271.dist-info}/WHEEL +4 -5
- hpcflow-0.2.0a271.dist-info/entry_points.txt +6 -0
- hpcflow/api.py +0 -458
- hpcflow/archive/archive.py +0 -308
- hpcflow/archive/cloud/cloud.py +0 -47
- hpcflow/archive/cloud/errors.py +0 -9
- hpcflow/archive/cloud/providers/dropbox.py +0 -432
- hpcflow/archive/errors.py +0 -5
- hpcflow/base_db.py +0 -4
- hpcflow/config.py +0 -232
- hpcflow/copytree.py +0 -66
- hpcflow/data/examples/_config.yml +0 -14
- hpcflow/data/examples/damask/demo/1.run.yml +0 -4
- hpcflow/data/examples/damask/demo/2.process.yml +0 -29
- hpcflow/data/examples/damask/demo/geom.geom +0 -2052
- hpcflow/data/examples/damask/demo/load.load +0 -1
- hpcflow/data/examples/damask/demo/material.config +0 -185
- hpcflow/data/examples/damask/inputs/geom.geom +0 -2052
- hpcflow/data/examples/damask/inputs/load.load +0 -1
- hpcflow/data/examples/damask/inputs/material.config +0 -185
- hpcflow/data/examples/damask/profiles/_variable_lookup.yml +0 -21
- hpcflow/data/examples/damask/profiles/damask.yml +0 -4
- hpcflow/data/examples/damask/profiles/damask_process.yml +0 -8
- hpcflow/data/examples/damask/profiles/damask_run.yml +0 -5
- hpcflow/data/examples/damask/profiles/default.yml +0 -6
- hpcflow/data/examples/thinking.yml +0 -177
- hpcflow/errors.py +0 -2
- hpcflow/init_db.py +0 -37
- hpcflow/models.py +0 -2549
- hpcflow/nesting.py +0 -9
- hpcflow/profiles.py +0 -455
- hpcflow/project.py +0 -81
- hpcflow/scheduler.py +0 -323
- hpcflow/utils.py +0 -103
- hpcflow/validation.py +0 -167
- hpcflow/variables.py +0 -544
- hpcflow-0.1.9.dist-info/METADATA +0 -168
- hpcflow-0.1.9.dist-info/RECORD +0 -45
- hpcflow-0.1.9.dist-info/entry_points.txt +0 -8
- hpcflow-0.1.9.dist-info/top_level.txt +0 -1
- /hpcflow/{archive → data/jinja_templates}/__init__.py +0 -0
- /hpcflow/{archive/cloud → data/programs}/__init__.py +0 -0
- /hpcflow/{archive/cloud/providers → data/workflows}/__init__.py +0 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Base model of a shell.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
from abc import ABC, abstractmethod
|
|
7
|
+
from typing import TYPE_CHECKING
|
|
8
|
+
from hpcflow.sdk.typing import hydrate
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from collections.abc import Mapping
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any, ClassVar
|
|
14
|
+
from ..types import JobscriptHeaderArgs, VersionInfo
|
|
15
|
+
|
|
16
|
+
from hpcflow.sdk.utils.hashing import get_hash
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@hydrate
|
|
20
|
+
class Shell(ABC):
|
|
21
|
+
"""Class to represent a shell and templates for jobscript composition.
|
|
22
|
+
|
|
23
|
+
This class represents a combination of a shell and an OS. For example, running
|
|
24
|
+
bash on a POSIX OS, and provides snippets that are used to compose a jobscript for
|
|
25
|
+
that combination.
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
executable: str
|
|
30
|
+
Which executable implements the shell.
|
|
31
|
+
os_args:
|
|
32
|
+
Arguments to pass to the shell.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
#: Default for executable name.
|
|
36
|
+
DEFAULT_EXE: ClassVar[str] = "/bin/bash"
|
|
37
|
+
#: File extension for jobscripts.
|
|
38
|
+
JS_EXT: ClassVar[str]
|
|
39
|
+
#: Basic indent.
|
|
40
|
+
JS_INDENT: ClassVar[str]
|
|
41
|
+
#: Indent for environment setup.
|
|
42
|
+
JS_ENV_SETUP_INDENT: ClassVar[str]
|
|
43
|
+
#: Template for the jobscript shebang line.
|
|
44
|
+
JS_SHEBANG: ClassVar[str]
|
|
45
|
+
#: Template for the jobscript functions file.
|
|
46
|
+
JS_FUNCS: ClassVar[str]
|
|
47
|
+
#: Template for the common part of the jobscript header.
|
|
48
|
+
JS_HEADER: ClassVar[str]
|
|
49
|
+
#: Template for the jobscript header when scheduled.
|
|
50
|
+
JS_SCHEDULER_HEADER: ClassVar[str]
|
|
51
|
+
#: Template for the jobscript header when directly executed.
|
|
52
|
+
JS_DIRECT_HEADER: ClassVar[str]
|
|
53
|
+
#: Template for enabling writing of the app log.
|
|
54
|
+
JS_RUN_LOG_PATH_ENABLE: ClassVar[str]
|
|
55
|
+
#: Template for disabling writing of the app log.
|
|
56
|
+
JS_RUN_LOG_PATH_DISABLE: ClassVar[str]
|
|
57
|
+
#: Template for the run execution command.
|
|
58
|
+
JS_RUN_CMD: ClassVar[str]
|
|
59
|
+
#: Template for the execution command for multiple combined runs.
|
|
60
|
+
JS_RUN_CMD_COMBINED: ClassVar[str]
|
|
61
|
+
#: Template for setting up run environment variables and executing the run.
|
|
62
|
+
JS_RUN: ClassVar[str]
|
|
63
|
+
#: Template for the action-run processing loop in a jobscript.
|
|
64
|
+
JS_ACT_MULTI: ClassVar[str]
|
|
65
|
+
#: Template for the single-action-run execution in a jobscript.
|
|
66
|
+
JS_ACT_SINGLE: ClassVar[str]
|
|
67
|
+
#: Template for setting up environment variables and running one or more action-runs.
|
|
68
|
+
JS_MAIN: ClassVar[str]
|
|
69
|
+
#: Template for a jobscript-block header.
|
|
70
|
+
JS_BLOCK_HEADER: ClassVar[str]
|
|
71
|
+
#: Template for single-element execution.
|
|
72
|
+
JS_ELEMENT_SINGLE: ClassVar[str]
|
|
73
|
+
#: Template for the element processing loop in a jobscript.
|
|
74
|
+
JS_ELEMENT_MULTI_LOOP: ClassVar[str]
|
|
75
|
+
#: Template for the array handling code in a jobscript.
|
|
76
|
+
JS_ELEMENT_MULTI_ARRAY: ClassVar[str]
|
|
77
|
+
#: Template for the jobscript block loop in a jobscript.
|
|
78
|
+
JS_BLOCK_LOOP: ClassVar[str]
|
|
79
|
+
#: Template for the jobscript footer.
|
|
80
|
+
JS_FOOTER: ClassVar[str]
|
|
81
|
+
|
|
82
|
+
__slots__ = ("_executable", "executable_args", "os_args")
|
|
83
|
+
|
|
84
|
+
def __init__(
|
|
85
|
+
self,
|
|
86
|
+
executable: str | None = None,
|
|
87
|
+
executable_args: list[str] | None = None,
|
|
88
|
+
os_args: dict[str, str] | None = None,
|
|
89
|
+
):
|
|
90
|
+
#: Which executable implements the shell.
|
|
91
|
+
self._executable = executable or self.DEFAULT_EXE
|
|
92
|
+
#: Arguments to provide to the shell executable (e.g. `--login`).
|
|
93
|
+
self.executable_args = executable_args or []
|
|
94
|
+
#: Arguments to pass to the shell.
|
|
95
|
+
self.os_args = os_args or {}
|
|
96
|
+
|
|
97
|
+
def __eq__(self, other: Any) -> bool:
|
|
98
|
+
if not isinstance(other, self.__class__):
|
|
99
|
+
return False
|
|
100
|
+
return (
|
|
101
|
+
self._executable == other._executable
|
|
102
|
+
and self.executable_args == other.executable_args
|
|
103
|
+
and self.os_args == other.os_args
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
def __hash__(self):
|
|
107
|
+
return get_hash((self._executable, tuple(self.executable_args), self.os_args))
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def executable(self) -> list[str]:
|
|
111
|
+
"""
|
|
112
|
+
The executable to use plus any mandatory arguments.
|
|
113
|
+
"""
|
|
114
|
+
return [self._executable, *self.executable_args]
|
|
115
|
+
|
|
116
|
+
@property
|
|
117
|
+
def shebang_executable(self) -> list[str]:
|
|
118
|
+
"""
|
|
119
|
+
The executable to use in a shebang line.
|
|
120
|
+
"""
|
|
121
|
+
return self.executable
|
|
122
|
+
|
|
123
|
+
def get_direct_submit_command(self, js_path: str) -> list[str]:
|
|
124
|
+
"""Get the command for submitting a non-scheduled jobscript."""
|
|
125
|
+
return self.executable + [js_path]
|
|
126
|
+
|
|
127
|
+
def get_command_file_launch_command(self, cmd_file_path: str) -> list[str]:
|
|
128
|
+
"""Get the command for launching the commands file for a given run."""
|
|
129
|
+
return self.executable + [cmd_file_path]
|
|
130
|
+
|
|
131
|
+
@abstractmethod
|
|
132
|
+
def get_version_info(self, exclude_os: bool = False) -> VersionInfo:
|
|
133
|
+
"""Get shell and operating system information."""
|
|
134
|
+
|
|
135
|
+
def get_wait_command(
|
|
136
|
+
self, workflow_app_alias: str, sub_idx: int, deps: Mapping[int, Any]
|
|
137
|
+
):
|
|
138
|
+
"""
|
|
139
|
+
Get the command to wait for a workflow.
|
|
140
|
+
"""
|
|
141
|
+
if not deps:
|
|
142
|
+
return ""
|
|
143
|
+
return (
|
|
144
|
+
f"{workflow_app_alias} workflow $WK_PATH_ARG wait --jobscripts "
|
|
145
|
+
f'"{sub_idx}:{",".join(str(i) for i in deps)}"'
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
@staticmethod
|
|
149
|
+
def process_app_invoc_executable(app_invoc_exe: str) -> str:
|
|
150
|
+
"""
|
|
151
|
+
Perform any post-processing of an application invocation command name.
|
|
152
|
+
"""
|
|
153
|
+
return app_invoc_exe
|
|
154
|
+
|
|
155
|
+
def process_JS_header_args(
|
|
156
|
+
self, header_args: JobscriptHeaderArgs
|
|
157
|
+
) -> JobscriptHeaderArgs:
|
|
158
|
+
"""
|
|
159
|
+
Process the application invocation key in the jobscript header arguments.
|
|
160
|
+
"""
|
|
161
|
+
app_invoc_ = header_args["app_invoc"]
|
|
162
|
+
if not isinstance(app_invoc_, str):
|
|
163
|
+
app_invoc = self.process_app_invoc_executable(app_invoc_[0])
|
|
164
|
+
for item in app_invoc_[1:]:
|
|
165
|
+
app_invoc += f' "{item}"'
|
|
166
|
+
header_args["app_invoc"] = app_invoc
|
|
167
|
+
return header_args
|
|
168
|
+
|
|
169
|
+
def prepare_JS_path(self, js_path: Path) -> str:
|
|
170
|
+
"""
|
|
171
|
+
Prepare the jobscript path for use.
|
|
172
|
+
"""
|
|
173
|
+
return str(js_path)
|
|
174
|
+
|
|
175
|
+
def prepare_element_run_dirs(self, run_dirs: list[list[Path]]) -> list[list[str]]:
|
|
176
|
+
"""
|
|
177
|
+
Prepare the element run directory names for use.
|
|
178
|
+
"""
|
|
179
|
+
return [[str(path) for path in i] for i in run_dirs]
|
|
180
|
+
|
|
181
|
+
@abstractmethod
|
|
182
|
+
def format_save_parameter(
|
|
183
|
+
self,
|
|
184
|
+
workflow_app_alias: str,
|
|
185
|
+
param_name: str,
|
|
186
|
+
shell_var_name: str,
|
|
187
|
+
cmd_idx: int,
|
|
188
|
+
stderr: bool,
|
|
189
|
+
app_name: str,
|
|
190
|
+
) -> str:
|
|
191
|
+
"""
|
|
192
|
+
Produce code to save a parameter's value into the workflow persistent store.
|
|
193
|
+
"""
|
|
194
|
+
|
|
195
|
+
@abstractmethod
|
|
196
|
+
def format_stream_assignment(self, shell_var_name: str, command: str) -> str:
|
|
197
|
+
"""
|
|
198
|
+
Format a stream assignment.
|
|
199
|
+
"""
|
|
200
|
+
|
|
201
|
+
@abstractmethod
|
|
202
|
+
def format_env_var_get(self, var: str) -> str:
|
|
203
|
+
"""
|
|
204
|
+
Format retrieval of a shell environment variable.
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
@abstractmethod
|
|
208
|
+
def format_array(self, lst: list) -> str:
|
|
209
|
+
"""
|
|
210
|
+
Format construction of a shell array.
|
|
211
|
+
"""
|
|
212
|
+
|
|
213
|
+
@abstractmethod
|
|
214
|
+
def format_array_get_item(self, arr_name: str, index: int | str) -> str:
|
|
215
|
+
"""
|
|
216
|
+
Format retrieval of a shell array item at a specified index.
|
|
217
|
+
"""
|
|
218
|
+
|
|
219
|
+
@abstractmethod
|
|
220
|
+
def format_source_functions_file(self, app_name: str, commands: str) -> str:
|
|
221
|
+
"""
|
|
222
|
+
Format sourcing (i.e. invocation) of the jobscript functions file.
|
|
223
|
+
"""
|
|
224
|
+
|
|
225
|
+
@abstractmethod
|
|
226
|
+
def format_commands_file(self, app_name: str, commands: str) -> str:
|
|
227
|
+
"""
|
|
228
|
+
Format the commands file.
|
|
229
|
+
"""
|