hpcflow-new2 0.2.0a213__py3-none-any.whl → 0.2.0a215__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/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.2.0a213"
1
+ __version__ = "0.2.0a215"
hpcflow/sdk/core/utils.py CHANGED
@@ -832,8 +832,8 @@ class JSONLikeDirSnapShot(DirectorySnapshot):
832
832
 
833
833
  #: Where to take the snapshot based at.
834
834
  self.root_path = root_path
835
- self._stat_info: dict[str, os.stat_result] = {}
836
- self._inode_to_path: dict[tuple, str] = {}
835
+ self._stat_info: dict[bytes | str, os.stat_result] = {}
836
+ self._inode_to_path: dict[tuple[int, int], bytes | str] = {}
837
837
 
838
838
  if data:
839
839
  assert root_path
@@ -862,7 +862,7 @@ class JSONLikeDirSnapShot(DirectorySnapshot):
862
862
  # store efficiently:
863
863
  inode_invert = {v: k for k, v in self._inode_to_path.items()}
864
864
  data: dict[str, list] = {
865
- str(PurePath(k).relative_to(root_path)): [
865
+ str(PurePath(cast("str", k)).relative_to(cast("str", root_path))): [
866
866
  str(i) if use_strings else i for i in [*v, *inode_invert[k]]
867
867
  ]
868
868
  for k, v in self._stat_info.items()
@@ -152,8 +152,9 @@ rules:
152
152
  - path: [schedulers, { type: map_value }, defaults]
153
153
  condition:
154
154
  value.allowed_keys: # TODO: split these up based on scheduler type
155
- - shebang_args
156
- - options
155
+ - shebang_executable
156
+ - directives # TODO: only actually allowed in `QueuedScheduler` sub-classes
157
+ - options # deprecated, replaced by directives
157
158
  - submit_cmd
158
159
  - show_cmd
159
160
  - del_cmd
@@ -211,6 +212,7 @@ rules:
211
212
  condition:
212
213
  value.allowed_keys:
213
214
  - executable
215
+ - executable_args
214
216
  - os_args
215
217
  - WSL_executable
216
218
  - WSL_distribution
@@ -7,6 +7,7 @@ from collections.abc import Callable
7
7
  from datetime import timedelta
8
8
  from logging import Logger
9
9
  from pathlib import Path
10
+ from typing import cast
10
11
  from watchdog.observers.polling import PollingObserver
11
12
  from watchdog.events import (
12
13
  FileSystemEvent,
@@ -17,7 +18,7 @@ from watchdog.events import (
17
18
 
18
19
  class _PMEHDelegate(PatternMatchingEventHandler):
19
20
  def __init__(self, pattern: str, on_modified: Callable[[FileSystemEvent], None]):
20
- super().__init__([pattern])
21
+ super().__init__(patterns=[pattern])
21
22
  self.__on_modified = on_modified
22
23
 
23
24
  def on_modified(self, event: FileSystemEvent) -> None:
@@ -64,7 +65,7 @@ class MonitorController:
64
65
  self.observer = PollingObserver(timeout=self.watch_interval)
65
66
  self.observer.schedule(
66
67
  self.event_handler,
67
- path=self.workflow_dirs_file_path.parent,
68
+ path=cast("str", self.workflow_dirs_file_path.parent),
68
69
  recursive=False,
69
70
  )
70
71
 
@@ -112,8 +113,10 @@ class MonitorController:
112
113
  """
113
114
  Callback when files are modified.
114
115
  """
115
- self.logger.info(f"Watch file modified: {event.src_path}")
116
- wks = self.parse_watch_workflows_file(event.src_path, logger=self.logger)
116
+ self.logger.info(f"Watch file modified: {event.src_path!r}")
117
+ wks = self.parse_watch_workflows_file(
118
+ cast("str", event.src_path), logger=self.logger
119
+ )
117
120
  self.workflow_monitor.update_workflow_paths(wks)
118
121
 
119
122
  def join(self) -> None:
@@ -157,7 +160,9 @@ class WorkflowMonitor:
157
160
  observer = PollingObserver(timeout=self.watch_interval)
158
161
  self.observer: PollingObserver | None = observer
159
162
  for i in self.workflow_paths:
160
- observer.schedule(self.event_handler, path=i["path"], recursive=False)
163
+ observer.schedule(
164
+ self.event_handler, path=cast("str", i["path"]), recursive=False
165
+ )
161
166
  self.logger.info(f"Watching workflow: {i['path'].name}")
162
167
 
163
168
  observer.start()
@@ -166,7 +171,7 @@ class WorkflowMonitor:
166
171
  """
167
172
  Triggered on a workflow being modified.
168
173
  """
169
- self.logger.info(f"Workflow modified: {event.src_path}")
174
+ self.logger.info(f"Workflow modified: {event.src_path!r}")
170
175
 
171
176
  def update_workflow_paths(self, new_paths: list[dict[str, Path]]):
172
177
  """
@@ -1440,7 +1440,7 @@ class Jobscript(JSONLike):
1440
1440
  scheduler_name: str | None = None,
1441
1441
  scheduler_args: dict[str, Any] | None = None,
1442
1442
  ) -> str:
1443
- """Prepare the jobscript file string."""
1443
+ """Prepare the jobscript file contents as a string."""
1444
1444
  scheduler_name = scheduler_name or self.scheduler_name
1445
1445
  assert scheduler_name
1446
1446
  assert os_name
@@ -1465,15 +1465,14 @@ class Jobscript(JSONLike):
1465
1465
  }
1466
1466
 
1467
1467
  shebang = shell.JS_SHEBANG.format(
1468
- shebang_executable=" ".join(shell.shebang_executable),
1469
- shebang_args=scheduler.shebang_args,
1468
+ shebang=" ".join(scheduler.shebang_executable or shell.shebang_executable)
1470
1469
  )
1471
1470
  header = shell.JS_HEADER.format(**header_args)
1472
1471
 
1473
1472
  if isinstance(scheduler, QueuedScheduler):
1474
1473
  header = shell.JS_SCHEDULER_HEADER.format(
1475
1474
  shebang=shebang,
1476
- scheduler_options=scheduler.format_options(
1475
+ scheduler_options=scheduler.format_directives(
1477
1476
  resources=self.resources,
1478
1477
  num_elements=self.blocks[0].num_elements, # only used for array jobs
1479
1478
  is_array=self.is_array,
@@ -7,6 +7,7 @@ from abc import ABC, abstractmethod
7
7
  import sys
8
8
  import time
9
9
  from typing import Generic, TypeVar, TYPE_CHECKING
10
+ import warnings
10
11
  from typing_extensions import override
11
12
  from hpcflow.sdk.typing import hydrate
12
13
  from hpcflow.sdk.core.app_aware import AppAware
@@ -39,12 +40,9 @@ class Scheduler(ABC, Generic[JSRefType], AppAware):
39
40
 
40
41
  Parameters
41
42
  ----------
42
- shell_args: str
43
- Arguments to pass to the shell. Pre-quoted.
44
- shebang_args: str
45
- Arguments to set on the shebang line. Pre-quoted.
46
- options: dict
47
- Options to the scheduler.
43
+ shebang_executable: list[str]
44
+ If specified, this will be used in the jobscript's shebang line instead of the
45
+ shell's `executable` and `executable_args` attributes.
48
46
  """
49
47
 
50
48
  # This would be in the docstring except it renders really wrongly!
@@ -53,20 +51,8 @@ class Scheduler(ABC, Generic[JSRefType], AppAware):
53
51
  # T
54
52
  # The type of a jobscript reference.
55
53
 
56
- #: Default value for arguments to the shell.
57
- DEFAULT_SHELL_ARGS: ClassVar[str] = ""
58
- #: Default value for arguments on the shebang line.
59
- DEFAULT_SHEBANG_ARGS: ClassVar[str] = ""
60
-
61
- def __init__(
62
- self,
63
- shell_args: str | None = None,
64
- shebang_args: str | None = None,
65
- options: dict | None = None,
66
- ):
67
- self.shebang_args = shebang_args or self.DEFAULT_SHEBANG_ARGS
68
- self.shell_args = shell_args or self.DEFAULT_SHELL_ARGS
69
- self.options = options or {}
54
+ def __init__(self, shebang_executable: list[str] | None = None):
55
+ self.shebang_executable = shebang_executable
70
56
 
71
57
  @property
72
58
  def unique_properties(self) -> tuple[str, ...]:
@@ -168,6 +154,13 @@ class QueuedScheduler(Scheduler[str]):
168
154
 
169
155
  Parameters
170
156
  ----------
157
+ directives: dict
158
+ Scheduler directives. Each item is written verbatim in the jobscript as a
159
+ scheduler directive, and is not processed in any way. If a value is `None`, the
160
+ key is considered a flag-like directive. If a value is a list, multiple directives
161
+ will be printed to the jobscript with the same key, but different values.
162
+ options: dict
163
+ Deprecated. Please use `directives` instead.
171
164
  submit_cmd: str
172
165
  The submission command, if overridden from default.
173
166
  show_cmd: str
@@ -203,6 +196,8 @@ class QueuedScheduler(Scheduler[str]):
203
196
 
204
197
  def __init__(
205
198
  self,
199
+ directives: dict | None = None,
200
+ options: dict | None = None,
206
201
  submit_cmd: str | None = None,
207
202
  show_cmd: Sequence[str] | None = None,
208
203
  del_cmd: str | None = None,
@@ -215,6 +210,16 @@ class QueuedScheduler(Scheduler[str]):
215
210
  ) -> None:
216
211
  super().__init__(*args, **kwargs)
217
212
 
213
+ if options:
214
+ warnings.warn(
215
+ f"{self.__class__.__name__!r}: Please use `directives` instead of "
216
+ f"`options`, which will be removed in a future release.",
217
+ DeprecationWarning,
218
+ stacklevel=2,
219
+ )
220
+ directives = options
221
+
222
+ self.directives = directives or {}
218
223
  self.submit_cmd: str = submit_cmd or self.DEFAULT_SUBMIT_CMD
219
224
  self.show_cmd = show_cmd or self.DEFAULT_SHOW_CMD
220
225
  self.del_cmd = del_cmd or self.DEFAULT_DEL_CMD
@@ -250,7 +255,7 @@ class QueuedScheduler(Scheduler[str]):
250
255
  time.sleep(2)
251
256
 
252
257
  @abstractmethod
253
- def format_options(
258
+ def format_directives(
254
259
  self,
255
260
  resources: ElementResources,
256
261
  num_elements: int,
@@ -259,7 +264,7 @@ class QueuedScheduler(Scheduler[str]):
259
264
  js_idx: int,
260
265
  ) -> str:
261
266
  """
262
- Render options in a way that the scheduler can handle.
267
+ Render directives in a way that the scheduler can handle.
263
268
  """
264
269
 
265
270
  def get_std_out_err_filename(
@@ -44,14 +44,6 @@ class DirectScheduler(Scheduler[DirectRef]):
44
44
  The correct subclass (:py:class:`DirectPosix` or :py:class:`DirectWindows`) should
45
45
  be used to create actual instances.
46
46
 
47
- Keyword Args
48
- ------------
49
- shell_args: str
50
- Arguments to pass to the shell. Pre-quoted.
51
- shebang_args: str
52
- Arguments to set on the shebang line. Pre-quoted.
53
- options: dict
54
- Options to the jobscript command.
55
47
  """
56
48
 
57
49
  @classmethod
@@ -219,36 +211,16 @@ class DirectPosix(DirectScheduler):
219
211
  """
220
212
  A direct scheduler for POSIX systems.
221
213
 
222
- Keyword Args
223
- ------------
224
- shell_args: str
225
- Arguments to pass to the shell. Pre-quoted.
226
- shebang_args: str
227
- Arguments to set on the shebang line. Pre-quoted.
228
- options: dict
229
- Options to the jobscript command.
230
214
  """
231
215
 
232
- #: Default shell.
233
- DEFAULT_SHELL_EXECUTABLE: ClassVar[str] = "/bin/bash"
234
-
235
216
 
236
217
  @hydrate
237
218
  class DirectWindows(DirectScheduler):
238
219
  """
239
220
  A direct scheduler for Windows.
240
221
 
241
- Keyword Args
242
- ------------
243
- shell_args: str
244
- Arguments to pass to the shell. Pre-quoted.
245
- options: dict
246
- Options to the jobscript command.
247
222
  """
248
223
 
249
- #: Default shell.
250
- DEFAULT_SHELL_EXECUTABLE: ClassVar[str] = "powershell.exe"
251
-
252
224
  @override
253
225
  def get_submit_command(
254
226
  self, shell: Shell, js_path: str, deps: dict[Any, tuple[Any, ...]]
@@ -37,12 +37,11 @@ class SGEPosix(QueuedScheduler):
37
37
  ------------
38
38
  cwd_switch: str
39
39
  Override of default switch to use to set the current working directory.
40
- shell_args: str
41
- Arguments to pass to the shell. Pre-quoted.
42
- shebang_args: str
43
- Arguments to set on the shebang line. Pre-quoted.
44
- options: dict
45
- Options to the jobscript command.
40
+ directives: dict
41
+ Scheduler directives. Each item is written verbatim in the jobscript as a
42
+ scheduler directive, and is not processed in any way. If a value is `None`, the
43
+ key is considered a flag-like directive. If a value is a list, multiple directives
44
+ will be printed to the jobscript with the same key, but different values.
46
45
 
47
46
  Notes
48
47
  -----
@@ -55,8 +54,6 @@ class SGEPosix(QueuedScheduler):
55
54
 
56
55
  """
57
56
 
58
- #: Default args for shebang line.
59
- DEFAULT_SHEBANG_ARGS: ClassVar[str] = ""
60
57
  #: Default submission command.
61
58
  DEFAULT_SUBMIT_CMD: ClassVar[str] = "qsub"
62
59
  #: Default command to show the queue state.
@@ -203,7 +200,7 @@ class SGEPosix(QueuedScheduler):
203
200
  yield f"{self.js_cmd} -e {base}"
204
201
 
205
202
  @override
206
- def format_options(
203
+ def format_directives(
207
204
  self,
208
205
  resources: ElementResources,
209
206
  num_elements: int,
@@ -212,7 +209,7 @@ class SGEPosix(QueuedScheduler):
212
209
  js_idx: int,
213
210
  ) -> str:
214
211
  """
215
- Format the options to the jobscript command.
212
+ Format the directives to the jobscript command.
216
213
  """
217
214
  opts: list[str] = []
218
215
  opts.append(self.format_switch(self.cwd_switch))
@@ -226,7 +223,7 @@ class SGEPosix(QueuedScheduler):
226
223
  )
227
224
  )
228
225
 
229
- for opt_k, opt_v in self.options.items():
226
+ for opt_k, opt_v in self.directives.items():
230
227
  if opt_v is None:
231
228
  opts.append(f"{self.js_cmd} {opt_k}")
232
229
  elif isinstance(opt_v, list):
@@ -37,12 +37,11 @@ class SlurmPosix(QueuedScheduler):
37
37
 
38
38
  Keyword Args
39
39
  ------------
40
- shell_args: str
41
- Arguments to pass to the shell. Pre-quoted.
42
- shebang_args: str
43
- Arguments to set on the shebang line. Pre-quoted.
44
- options: dict
45
- Options to the jobscript command.
40
+ directives: dict
41
+ Scheduler directives. Each item is written verbatim in the jobscript as a
42
+ scheduler directive, and is not processed in any way. If a value is `None`, the
43
+ key is considered a flag-like directive. If a value is a list, multiple directives
44
+ will be printed to the jobscript with the same key, but different values.
46
45
 
47
46
  Notes
48
47
  -----
@@ -59,10 +58,6 @@ class SlurmPosix(QueuedScheduler):
59
58
 
60
59
  """
61
60
 
62
- #: Default shell.
63
- DEFAULT_SHELL_EXECUTABLE: ClassVar[str] = "/bin/bash"
64
- #: Default args for shebang line.
65
- DEFAULT_SHEBANG_ARGS: ClassVar[str] = ""
66
61
  #: Default submission command.
67
62
  DEFAULT_SUBMIT_CMD: ClassVar[str] = "sbatch"
68
63
  #: Default command to show the queue state.
@@ -368,7 +363,7 @@ class SlurmPosix(QueuedScheduler):
368
363
  yield f"{self.js_cmd} --error {base}.err"
369
364
 
370
365
  @override
371
- def format_options(
366
+ def format_directives(
372
367
  self,
373
368
  resources: ElementResources,
374
369
  num_elements: int,
@@ -377,7 +372,7 @@ class SlurmPosix(QueuedScheduler):
377
372
  js_idx: int,
378
373
  ) -> str:
379
374
  """
380
- Format the options to the scheduler.
375
+ Format the directives to the scheduler.
381
376
  """
382
377
  opts: list[str] = []
383
378
  opts.extend(self.__format_core_request_lines(resources))
@@ -391,7 +386,7 @@ class SlurmPosix(QueuedScheduler):
391
386
  )
392
387
  )
393
388
 
394
- for opt_k, opt_v in self.options.items():
389
+ for opt_k, opt_v in self.directives.items():
395
390
  if isinstance(opt_v, list):
396
391
  for i in opt_v:
397
392
  opts.append(f"{self.js_cmd} {opt_k} {i}")
@@ -79,30 +79,39 @@ class Shell(ABC):
79
79
  #: Template for the jobscript footer.
80
80
  JS_FOOTER: ClassVar[str]
81
81
 
82
- __slots__ = ("_executable", "os_args")
82
+ __slots__ = ("_executable", "executable_args", "os_args")
83
83
 
84
84
  def __init__(
85
- self, executable: str | None = None, os_args: dict[str, str] | None = None
85
+ self,
86
+ executable: str | None = None,
87
+ executable_args: list[str] | None = None,
88
+ os_args: dict[str, str] | None = None,
86
89
  ):
87
90
  #: Which executable implements the shell.
88
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 []
89
94
  #: Arguments to pass to the shell.
90
95
  self.os_args = os_args or {}
91
96
 
92
97
  def __eq__(self, other: Any) -> bool:
93
98
  if not isinstance(other, self.__class__):
94
99
  return False
95
- return self._executable == other._executable and self.os_args == other.os_args
100
+ return (
101
+ self._executable == other._executable
102
+ and self.executable_args == other.executable_args
103
+ and self.os_args == other.os_args
104
+ )
96
105
 
97
106
  def __hash__(self):
98
- return get_hash((self._executable, self.os_args))
107
+ return get_hash((self._executable, tuple(self.executable_args), self.os_args))
99
108
 
100
109
  @property
101
110
  def executable(self) -> list[str]:
102
111
  """
103
112
  The executable to use plus any mandatory arguments.
104
113
  """
105
- return [self._executable]
114
+ return [self._executable, *self.executable_args]
106
115
 
107
116
  @property
108
117
  def shebang_executable(self) -> list[str]:
@@ -38,7 +38,7 @@ class Bash(Shell):
38
38
  #: Indent for environment setup.
39
39
  JS_ENV_SETUP_INDENT: ClassVar[str] = 2 * JS_INDENT
40
40
  #: Template for the jobscript shebang line.
41
- JS_SHEBANG: ClassVar[str] = """#!{shebang_executable} {shebang_args}"""
41
+ JS_SHEBANG: ClassVar[str] = """#!{shebang}"""
42
42
  #: Template for the jobscript functions file.
43
43
  JS_FUNCS: ClassVar[str] = dedent(
44
44
  """\
@@ -429,6 +429,10 @@ class WSLBash(Bash):
429
429
 
430
430
  @property
431
431
  def shebang_executable(self) -> list[str]:
432
+ """
433
+ The executable to use in a shebang line, overridden here to exclude the WSL
434
+ command.
435
+ """
432
436
  return super().executable
433
437
 
434
438
  def _get_OS_info_POSIX(self) -> Mapping[str, str]:
@@ -1,4 +1,10 @@
1
1
  from __future__ import annotations
2
+ from pathlib import Path
3
+ import sys
4
+
5
+ import pytest
6
+
7
+ import hpcflow.app as hf
2
8
  from hpcflow.sdk.submission.shells import ALL_SHELLS
3
9
 
4
10
 
@@ -97,3 +103,27 @@ def test_format_array_bash():
97
103
  def test_format_array_get_item_bash():
98
104
  shell = ALL_SHELLS["bash"]["posix"]()
99
105
  assert shell.format_array_get_item("my_arr", 3) == r"${my_arr[3]}"
106
+
107
+
108
+ @pytest.mark.integration
109
+ @pytest.mark.skipif(condition=sys.platform == "win32", reason="This is a bash-only test.")
110
+ def test_executable_args_bash_login(null_config, tmp_path: Path):
111
+ """Check if we provide a `--login` argument to the shell `executable_args`, we end up
112
+ in a login shell on bash."""
113
+
114
+ cmd = "shopt -q login_shell && echo 'Login shell' || echo 'Not login shell'"
115
+ s1 = hf.TaskSchema(
116
+ objective="t1",
117
+ actions=[hf.Action(commands=[hf.Command(command=cmd)])],
118
+ )
119
+ t1 = hf.Task(
120
+ schema=s1,
121
+ resources={"any": {"shell_args": {"executable_args": ["--login"]}}},
122
+ )
123
+ wkt = hf.WorkflowTemplate(name="test_bash_login", tasks=[t1])
124
+ wk = hf.Workflow.from_template(
125
+ template=wkt,
126
+ path=tmp_path,
127
+ )
128
+ wk.submit(wait=True, status=False, add_to_known=False)
129
+ assert wk.submissions[0].jobscripts[0].get_stdout().strip() == "Login shell"
@@ -468,7 +468,11 @@ def test_unique_schedulers_two_direct_and_SLURM(new_null_config, tmp_path) -> No
468
468
 
469
469
  def test_scheduler_config_defaults(new_null_config, tmp_path) -> None:
470
470
  """Check default options defined in the config are merged into jobscript resources."""
471
- hf.config.set("schedulers.direct.defaults.options", {"a": "c"})
471
+
472
+ # note we use the `shebang_executable` for this test. On Windows, this will not be
473
+ # included in the jobscript, so it is effectively ignored, but the test is still
474
+ # valid.
475
+ hf.config.set("schedulers.direct.defaults.shebang_executable", ["/bin/bash"])
472
476
 
473
477
  t1 = hf.Task(
474
478
  schema=hf.task_schemas.test_t1_ps,
@@ -479,7 +483,10 @@ def test_scheduler_config_defaults(new_null_config, tmp_path) -> None:
479
483
  schema=hf.task_schemas.test_t1_ps,
480
484
  inputs={"p1": 1},
481
485
  resources={
482
- "any": {"scheduler": "direct", "scheduler_args": {"options": {"a": "b"}}}
486
+ "any": {
487
+ "scheduler": "direct",
488
+ "scheduler_args": {"shebang_executable": ["bash"]},
489
+ }
483
490
  },
484
491
  )
485
492
  wkt = hf.WorkflowTemplate(name="temp", tasks=[t1, t2])
@@ -489,5 +496,7 @@ def test_scheduler_config_defaults(new_null_config, tmp_path) -> None:
489
496
  )
490
497
  sub = wk.add_submission()
491
498
  assert sub is not None
492
- assert sub.jobscripts[0].resources.scheduler_args == {"options": {"a": "c"}}
493
- assert sub.jobscripts[1].resources.scheduler_args == {"options": {"a": "b"}}
499
+ assert sub.jobscripts[0].resources.scheduler_args == {
500
+ "shebang_executable": ["/bin/bash"]
501
+ }
502
+ assert sub.jobscripts[1].resources.scheduler_args == {"shebang_executable": ["bash"]}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hpcflow-new2
3
- Version: 0.2.0a213
3
+ Version: 0.2.0a215
4
4
  Summary: Computational workflow management
5
5
  License: MPL-2.0
6
6
  Author: aplowman
@@ -36,7 +36,7 @@ Requires-Dist: scipy (>=1.15.2,<2.0.0) ; python_version >= "3.10"
36
36
  Requires-Dist: termcolor (>=1.1.0,<2.0.0)
37
37
  Requires-Dist: typing-extensions (>=4.12.2,<5.0.0)
38
38
  Requires-Dist: valida (>=0.7.5,<0.8.0)
39
- Requires-Dist: watchdog (>=2.1.9,<3.0.0)
39
+ Requires-Dist: watchdog (>=6.0.0,<7.0.0)
40
40
  Requires-Dist: zarr (==2.17.2)
41
41
  Description-Content-Type: text/markdown
42
42
 
@@ -1,7 +1,7 @@
1
1
  hpcflow/__init__.py,sha256=WIETuRHeOp2SqUqHUzpjQ-lk9acbYv-6aWOhZPRdlhs,64
2
2
  hpcflow/__pyinstaller/__init__.py,sha256=YOzBlPSck6slucv6lJM9K80JtsJWxXRL00cv6tRj3oc,98
3
3
  hpcflow/__pyinstaller/hook-hpcflow.py,sha256=P2b-8QdQqkSS7cJB6CB3CudUuJ9iZzTh2fQF4hNdCa4,1118
4
- hpcflow/_version.py,sha256=RoPILa8kxRG1ZkdllsYNNoDukTcfDSzZJNmDHqkuhBU,26
4
+ hpcflow/_version.py,sha256=N2uU-taYEaJObIpekif3SI-_vsdYtshwD-AZYqlrAQw,26
5
5
  hpcflow/app.py,sha256=gl2viVS65PbpDhUp2DARaYHFDqDWQjuoyB3ikrCNRW4,1367
6
6
  hpcflow/cli.py,sha256=G2J3D9v6MnMWOWMMWK6UEKLn_6wnV9lT_qygEBBxg-I,66
7
7
  hpcflow/data/demo_data_manifest/__init__.py,sha256=Hsq0jT8EXM13wu1MpGy5FQgyuz56ygep4VWOnulFn50,41
@@ -96,13 +96,13 @@ hpcflow/sdk/core/task.py,sha256=7jXQUDU0mVS33b3tVimkHAnC6k1QMofwu45qt7xvuKc,1424
96
96
  hpcflow/sdk/core/task_schema.py,sha256=LjHnpS8ccEWGDQFzGhhAzpMvWGeoUlPDY2XTY2_gqMQ,38844
97
97
  hpcflow/sdk/core/test_utils.py,sha256=UXe8P-1b_6Pn6vdgJfMVsTGJdVI65TZ2mSUgWHlVnnc,13766
98
98
  hpcflow/sdk/core/types.py,sha256=kqVXpiH8qwOVVBAw6GFvUQVdNYLEv7qIbgEkgfK0DO8,13021
99
- hpcflow/sdk/core/utils.py,sha256=IFe3nzQjm5UIdRCpmSocHirsbODzwSnhHpQ58dR1PXc,36290
99
+ hpcflow/sdk/core/utils.py,sha256=NTbXX2tkfb2Wp0hpGuisnfpBNAo9j-4EXh-KVqJygqA,36342
100
100
  hpcflow/sdk/core/validation.py,sha256=4-0g5z3CgjFLQ2FCM0p0mjvNqHYuLhIqvQR_kpM0tsU,1838
101
101
  hpcflow/sdk/core/workflow.py,sha256=Id5CSPvjP_dJUCTWuCGU4bNFmRA-ESW05miVoB44yT4,183535
102
102
  hpcflow/sdk/core/zarr_io.py,sha256=i6WqkFXe-q1sJGTCYAbsNRXRrdkxZy6NRahTcuZPuX4,5906
103
103
  hpcflow/sdk/data/__init__.py,sha256=-YzROirohSKU2UGYj5vkCe_J2KejbzhIjUXNaJwKHLk,568
104
104
  hpcflow/sdk/data/config_file_schema.yaml,sha256=7i3z_m3GBRtLyB4c7qPngnlQWqcIq1CyCcOysDyq4es,791
105
- hpcflow/sdk/data/config_schema.yaml,sha256=FOB7hiWySulWA86ERJKeJjzlNKW_eP4q2hUWpV__TEM,6488
105
+ hpcflow/sdk/data/config_schema.yaml,sha256=awQrtWkYIRWb4DmBKmJ0HR2pFwAuEBlMpu8VksdSFRU,6641
106
106
  hpcflow/sdk/data/environments_spec_schema.yaml,sha256=MNNbc49HuATGYdVuItR4sbrvVDvNrADKnvSs3xCYqr0,795
107
107
  hpcflow/sdk/data/files_spec_schema.yaml,sha256=kY--Jol4ia55ctzZa8a5ls8SPTdNwgDLoEoYbpP0EYs,170
108
108
  hpcflow/sdk/data/parameters_spec_schema.yaml,sha256=Wj7CvG7Ul1nZDtBca-oxeFH_aSZkBSz4oQpnuM7VKls,148
@@ -113,7 +113,7 @@ hpcflow/sdk/demo/cli.py,sha256=kwPVmCQk5OILrQNOvE0Tz220IFROEZ7YTk2KgKJ_Lc0,6570
113
113
  hpcflow/sdk/helper/__init__.py,sha256=HPbnZlvgC9xJKpXyjrBuEXGMIfkLfblD_RBefBLJOFc,29
114
114
  hpcflow/sdk/helper/cli.py,sha256=s26xfwzmgjh778nIfjEozqbvs2XvKPoNaHSi_2vr01U,4026
115
115
  hpcflow/sdk/helper/helper.py,sha256=T45BEwhPgTlwvqDNbT4Us4UVmdRKRoszIMt8a9B69kE,9475
116
- hpcflow/sdk/helper/watcher.py,sha256=VEqYoVo87PT_XCkyHmf8pddWt9SOK7LwIlFYY63hdRw,5616
116
+ hpcflow/sdk/helper/watcher.py,sha256=aQyuSnBiPhsp1ijBylwR5mxjIqlwD4rT_zH9DYc83no,5744
117
117
  hpcflow/sdk/log.py,sha256=_wqB0qt65nt4oNNV6eyD39bNZyciyH6biyyOgU_MViQ,8285
118
118
  hpcflow/sdk/persistence/__init__.py,sha256=1e6nVADj6xEsE7XGXHaIsHZur4IkUJAxLuxBlvHi0CE,408
119
119
  hpcflow/sdk/persistence/base.py,sha256=y7L7FFyuTJvy9K_CRFZZH8Cost2seiNz_KKaKZ2XREo,92727
@@ -128,15 +128,15 @@ hpcflow/sdk/persistence/zarr.py,sha256=--H7uWNJ-SlcElFPHvbFZLMqwKsz1qh8oUAogXb8H
128
128
  hpcflow/sdk/runtime.py,sha256=vPNu4_DXYMnRyJenkVLq8yt6_XG4tCuwX69Oew4OWmo,11269
129
129
  hpcflow/sdk/submission/__init__.py,sha256=79xJXVkddsuj3uJz3BV9iOnAV7vCeJvLrhKccOA_dnU,67
130
130
  hpcflow/sdk/submission/enums.py,sha256=DykNHISQDmfa0oDggj6iIKugeFXJd8iF9NwqV3MN2oA,2049
131
- hpcflow/sdk/submission/jobscript.py,sha256=rVgca9LUw6ZkAQteFFEKr8kJ0OnRBMJQu8uIWIPeyZY,90343
132
- hpcflow/sdk/submission/schedulers/__init__.py,sha256=s3IZ44OViHIOKvU-Qw8FhaYNxgLLpiUSuL-erp5-2D0,8814
133
- hpcflow/sdk/submission/schedulers/direct.py,sha256=WyMrCpYRz8kQvq2GFfWvhu-JbnNRsePJHLRcXpvl_Qk,8318
134
- hpcflow/sdk/submission/schedulers/sge.py,sha256=P-EJOLsuhDtmRzidzQHvCuOt9mR4eE4HdimDMv-jFvM,13849
135
- hpcflow/sdk/submission/schedulers/slurm.py,sha256=011oY2H3Vss-uPZU4PVXNkuwGM1ybezsJo5Vmj-EIpc,24761
131
+ hpcflow/sdk/submission/jobscript.py,sha256=Td4z2OKqnqAsXgjZOVciioJph7Gj3nghpHB4396_XHM,90331
132
+ hpcflow/sdk/submission/schedulers/__init__.py,sha256=E-XBhSMflInTrQ5ZBUy8Hhq-JtAuIcCx6IM_7fI1Axw,9291
133
+ hpcflow/sdk/submission/schedulers/direct.py,sha256=b_LS_xB0vu2tRHs-Xd08-16PC-nojRB6aNXwT9qtv0A,7493
134
+ hpcflow/sdk/submission/schedulers/sge.py,sha256=WRohm-1eBEcadcKGg5QPd1DHvGEUV759IVtLbbDx2qU,13927
135
+ hpcflow/sdk/submission/schedulers/slurm.py,sha256=2rjQ2HMtM-sIA4M0mmW_ZIJVxUUafJgomgQ4-RU_LDI,24759
136
136
  hpcflow/sdk/submission/schedulers/utils.py,sha256=0g63XpYFEPaei30u7avBzktCwIanKW9XtkQ0JN3fhLk,662
137
137
  hpcflow/sdk/submission/shells/__init__.py,sha256=1JSisTL5_gY0yMMnIX96dOTtGNhs6ChxgEURBdc_RCk,1557
138
- hpcflow/sdk/submission/shells/base.py,sha256=W8sUVwyIqREZoFOWbM6OIRB57qIRVfmTybprMQ12GSg,7289
139
- hpcflow/sdk/submission/shells/bash.py,sha256=Ql_rjNHBSWaxdYwEu2kZG-0VnlNBhA2SWUeNFqR1TIA,16252
138
+ hpcflow/sdk/submission/shells/base.py,sha256=orjshO0jBmcpt2frMk41Cyc6CeFz7mjiiYuiMnbw1qA,7652
139
+ hpcflow/sdk/submission/shells/bash.py,sha256=x-0hBRX1OlpylWcrHlSS72Bxw8us2ZY7m2PbgWml0-c,16351
140
140
  hpcflow/sdk/submission/shells/os_version.py,sha256=_RK5A56png1Zk4_rzumy17xZ4xVguuPMS0Mll99SKaA,3521
141
141
  hpcflow/sdk/submission/shells/powershell.py,sha256=OFxSEC9Quh-WDFOeYNCQLX_vg-VzO8KdpsYCS9AQfo0,11725
142
142
  hpcflow/sdk/submission/submission.py,sha256=nbbSxf6Kkn2omsZLk5ZQ1PiW4mMttxR_EH7KPLOAXCQ,51985
@@ -193,9 +193,9 @@ hpcflow/tests/unit/test_run.py,sha256=jFRC1-wV5G2ZCEU-KBKYeHVnJdDBUXX6MbxTrB-RJS
193
193
  hpcflow/tests/unit/test_run_directories.py,sha256=VA2xhDRe7agKO7q1Y8kP0101BstkjLiC1RReKrMI6jE,1088
194
194
  hpcflow/tests/unit/test_runtime.py,sha256=xMwIPZK1pXAOkrBb5j8i4hnBTCFMk37P5aAY3On5D-M,365
195
195
  hpcflow/tests/unit/test_schema_input.py,sha256=ApYRvi_ra8pC1zeXo_myyCe18-duUnMKJ7VAsVAWq-g,12116
196
- hpcflow/tests/unit/test_shell.py,sha256=lr3_MDyUnGlW4qYyDf7Ds36TVlQ9NqPPxgY8NEEosJg,4075
196
+ hpcflow/tests/unit/test_shell.py,sha256=vp3brMrwA-NMVhV_cIWuGbSaHd78lpATXgmhZAbMN6Q,5073
197
197
  hpcflow/tests/unit/test_slurm.py,sha256=TGYLsEWtzmZg5hNa0LzWPQTWIQ4ZfINX3_XuxbTVDGk,1155
198
- hpcflow/tests/unit/test_submission.py,sha256=-WVpxZ1RuvJd0yRkFLsrvVJmWptu2TN9YuSFH14Y_oc,15118
198
+ hpcflow/tests/unit/test_submission.py,sha256=N5g5lR5_g4vtGZ7501q74UtB7QP6uEdPY-FAH2HAQJM,15411
199
199
  hpcflow/tests/unit/test_task.py,sha256=vI38Wx-EOCUkEipYoB1LL21Cxr5t073-F8eUluBsP28,83958
200
200
  hpcflow/tests/unit/test_task_schema.py,sha256=8qLioZQxdthDRU_-wFRFqfnuC8ygjyXt9iQGSw-0GGE,5065
201
201
  hpcflow/tests/unit/test_utils.py,sha256=Owr-7BP0_ryAhgnf14CMYFlDkY8_fqfnSwHMJTv8BAc,14645
@@ -216,8 +216,8 @@ hpcflow/tests/workflows/test_submission.py,sha256=SUbBUbD8C8LSulrI7aETkzP9RqED48
216
216
  hpcflow/tests/workflows/test_workflows.py,sha256=9z3rtXjA5iMOp4C0q4TkD_9kLzwourCY-obpeOtnNt0,18927
217
217
  hpcflow/tests/workflows/test_zip.py,sha256=MzEwsIAYV_1A3bD0XRo23zUwUKVzkkmNd8_cil6YdWQ,578
218
218
  hpcflow/viz_demo.ipynb,sha256=6D9uBbWK3oMfbaf93Tnv5riFPtW-2miUTWNr9kGcnd4,228913
219
- hpcflow_new2-0.2.0a213.dist-info/LICENSE,sha256=Xhxf_KsrJNJFGMogumZhXSTPhUOVHCWf7nU-TDzqg0E,16763
220
- hpcflow_new2-0.2.0a213.dist-info/METADATA,sha256=T2JLad7lOJCKVQ-Ebvbkl-gxKu99acAQTKAtVbvGyDw,2671
221
- hpcflow_new2-0.2.0a213.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
222
- hpcflow_new2-0.2.0a213.dist-info/entry_points.txt,sha256=aoGtCnFdfPcXfBdu2zZyMOJoz6fPgdR0elqsgrE-USU,106
223
- hpcflow_new2-0.2.0a213.dist-info/RECORD,,
219
+ hpcflow_new2-0.2.0a215.dist-info/LICENSE,sha256=Xhxf_KsrJNJFGMogumZhXSTPhUOVHCWf7nU-TDzqg0E,16763
220
+ hpcflow_new2-0.2.0a215.dist-info/METADATA,sha256=ZNE5HoIyCfYI3Wmgp5KBMdaNBxmQgepwNMzWtLxA-DM,2671
221
+ hpcflow_new2-0.2.0a215.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
222
+ hpcflow_new2-0.2.0a215.dist-info/entry_points.txt,sha256=aoGtCnFdfPcXfBdu2zZyMOJoz6fPgdR0elqsgrE-USU,106
223
+ hpcflow_new2-0.2.0a215.dist-info/RECORD,,