hpcflow-new2 0.2.0a163__py3-none-any.whl → 0.2.0a164__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.0a163"
1
+ __version__ = "0.2.0a164"
@@ -141,6 +141,7 @@ class ElementActionRun:
141
141
  element_action,
142
142
  index: int,
143
143
  data_idx: Dict,
144
+ commands_idx: List[int],
144
145
  start_time: Union[datetime, None],
145
146
  end_time: Union[datetime, None],
146
147
  snapshot_start: Union[Dict, None],
@@ -157,6 +158,7 @@ class ElementActionRun:
157
158
  self._element_action = element_action
158
159
  self._index = index # local index of this run with the action
159
160
  self._data_idx = data_idx
161
+ self._commands_idx = commands_idx
160
162
  self._start_time = start_time
161
163
  self._end_time = end_time
162
164
  self._submission_idx = submission_idx
@@ -222,6 +224,10 @@ class ElementActionRun:
222
224
  def data_idx(self):
223
225
  return self._data_idx
224
226
 
227
+ @property
228
+ def commands_idx(self):
229
+ return self._commands_idx
230
+
225
231
  @property
226
232
  def metadata(self):
227
233
  return self._metadata
@@ -715,11 +721,13 @@ class ElementActionRun:
715
721
 
716
722
  shell_vars = {} # keys are cmd_idx, each value is a list of tuples
717
723
  for cmd_idx, command in enumerate(self.action.commands):
718
- cmd_str, shell_vars_i = command.get_command_line(
719
- EAR=self, shell=jobscript.shell, env=env
720
- )
721
- shell_vars[cmd_idx] = shell_vars_i
722
- command_lns.append(cmd_str)
724
+ if cmd_idx in self.commands_idx:
725
+ # only execute commands that have no rules, or all valid rules:
726
+ cmd_str, shell_vars_i = command.get_command_line(
727
+ EAR=self, shell=jobscript.shell, env=env
728
+ )
729
+ shell_vars[cmd_idx] = shell_vars_i
730
+ command_lns.append(cmd_str)
723
731
 
724
732
  commands = "\n".join(command_lns) + "\n"
725
733
 
@@ -1025,6 +1033,7 @@ class ActionRule(JSONLike):
1025
1033
 
1026
1034
  self.rule = rule
1027
1035
  self.action = None # assigned by parent action
1036
+ self.command = None # assigned by parent command
1028
1037
 
1029
1038
  def __eq__(self, other):
1030
1039
  if type(other) is not self.__class__:
@@ -1958,9 +1967,17 @@ class Action(JSONLike):
1958
1967
  return True
1959
1968
 
1960
1969
  @TimeIt.decorator
1961
- def test_rules(self, element_iter) -> List[bool]:
1970
+ def test_rules(self, element_iter) -> Tuple[bool, List[int]]:
1962
1971
  """Test all rules against the specified element iteration."""
1963
- return [i.test(element_iteration=element_iter) for i in self.rules]
1972
+ rules_valid = [rule.test(element_iteration=element_iter) for rule in self.rules]
1973
+ action_valid = all(rules_valid)
1974
+ commands_idx = []
1975
+ if action_valid:
1976
+ for cmd_idx, cmd in enumerate(self.commands):
1977
+ if any(not i.test(element_iteration=element_iter) for i in cmd.rules):
1978
+ continue
1979
+ commands_idx.append(cmd_idx)
1980
+ return action_valid, commands_idx
1964
1981
 
1965
1982
  def get_required_executables(self) -> Tuple[str]:
1966
1983
  """Return executable labels required by this action."""
@@ -1,4 +1,4 @@
1
- from dataclasses import dataclass
1
+ from dataclasses import dataclass, field
2
2
  from functools import partial
3
3
  from pathlib import Path
4
4
  import re
@@ -6,15 +6,24 @@ from typing import Dict, Iterable, List, Optional, Tuple, Union
6
6
 
7
7
  import numpy as np
8
8
 
9
+ from hpcflow.sdk import app
9
10
  from hpcflow.sdk.core.element import ElementResources
10
11
  from hpcflow.sdk.core.errors import NoCLIFormatMethodError
11
- from hpcflow.sdk.core.json_like import JSONLike
12
+ from hpcflow.sdk.core.json_like import ChildObjectSpec, JSONLike
12
13
  from hpcflow.sdk.core.parameters import ParameterValue
13
14
 
14
15
 
15
16
  @dataclass
16
17
  class Command(JSONLike):
17
18
  _app_attr = "app"
19
+ _child_objects = (
20
+ ChildObjectSpec(
21
+ name="rules",
22
+ class_name="ActionRule",
23
+ is_multiple=True,
24
+ parent_ref="command",
25
+ ),
26
+ )
18
27
 
19
28
  command: Optional[str] = None
20
29
  executable: Optional[str] = None
@@ -23,6 +32,7 @@ class Command(JSONLike):
23
32
  stdout: Optional[str] = None
24
33
  stderr: Optional[str] = None
25
34
  stdin: Optional[str] = None
35
+ rules: Optional[List[app.ActionRule]] = field(default_factory=lambda: [])
26
36
 
27
37
  def __repr__(self) -> str:
28
38
  out = []
@@ -40,6 +50,8 @@ class Command(JSONLike):
40
50
  out.append(f"stderr={self.stderr!r}")
41
51
  if self.stdin:
42
52
  out.append(f"stdin={self.stdin!r}")
53
+ if self.rules:
54
+ out.append(f"rules={self.rules!r}")
43
55
 
44
56
  return f"{self.__class__.__name__}({', '.join(out)})"
45
57
 
hpcflow/sdk/core/task.py CHANGED
@@ -1944,8 +1944,8 @@ class WorkflowTask:
1944
1944
  # run-specific data index to `test_rules` and `generate_data_index`
1945
1945
  # (e.g. if we wanted to increase the memory requirements of a action because
1946
1946
  # it previously failed)
1947
- rules_valid = action.test_rules(element_iter=element_iter)
1948
- if all(rules_valid):
1947
+ act_valid, cmds_idx = action.test_rules(element_iter=element_iter)
1948
+ if act_valid:
1949
1949
  self.app.logger.info(f"All action rules evaluated to true {log_common}")
1950
1950
  EAR_ID = self.workflow.num_EARs + count
1951
1951
  param_source = {
@@ -1969,6 +1969,7 @@ class WorkflowTask:
1969
1969
  run_0 = {
1970
1970
  "elem_iter_ID": element_iter.id_,
1971
1971
  "action_idx": act_idx,
1972
+ "commands_idx": cmds_idx,
1972
1973
  "metadata": {},
1973
1974
  }
1974
1975
  action_runs[(act_idx, EAR_ID)] = run_0
@@ -1982,6 +1983,7 @@ class WorkflowTask:
1982
1983
  self.workflow._store.add_EAR(
1983
1984
  elem_iter_ID=element_iter.id_,
1984
1985
  action_idx=act_idx,
1986
+ commands_idx=run["commands_idx"],
1985
1987
  data_idx=all_data_idx[(act_idx, EAR_ID_i)],
1986
1988
  metadata={},
1987
1989
  )
@@ -528,7 +528,7 @@ class TaskSchema(JSONLike):
528
528
  f'</tr><tr><td class="action-header-cell">scope:</td>'
529
529
  f"<td><code>{act.get_precise_scope().to_string()}</code></td></tr>"
530
530
  f'<tr><td class="action-header-cell">environment:</td>'
531
- f"<td><code>{act.get_environment().name}</code></td></tr>"
531
+ f"<td><code>{act.get_environment_name()}</code></td></tr>"
532
532
  f"{inp_fg_rows}"
533
533
  f"{out_fp_rows}"
534
534
  f"{act_i_script_rows}"
@@ -310,6 +310,7 @@ class StoreEAR:
310
310
  is_pending: bool
311
311
  elem_iter_ID: int
312
312
  action_idx: int
313
+ commands_idx: List[int]
313
314
  data_idx: Dict[str, int]
314
315
  submission_idx: Optional[int] = None
315
316
  skip: Optional[bool] = False
@@ -336,6 +337,7 @@ class StoreEAR:
336
337
  "id_": self.id_,
337
338
  "elem_iter_ID": self.elem_iter_ID,
338
339
  "action_idx": self.action_idx,
340
+ "commands_idx": self.commands_idx,
339
341
  "data_idx": self.data_idx,
340
342
  "submission_idx": self.submission_idx,
341
343
  "success": self.success,
@@ -371,6 +373,7 @@ class StoreEAR:
371
373
  "is_pending": self.is_pending,
372
374
  "elem_iter_ID": self.elem_iter_ID,
373
375
  "action_idx": self.action_idx,
376
+ "commands_idx": self.commands_idx,
374
377
  "data_idx": self.data_idx,
375
378
  "submission_idx": self.submission_idx,
376
379
  "success": self.success,
@@ -414,6 +417,7 @@ class StoreEAR:
414
417
  is_pending=self.is_pending,
415
418
  elem_iter_ID=self.elem_iter_ID,
416
419
  action_idx=self.action_idx,
420
+ commands_idx=self.commands_idx,
417
421
  data_idx=self.data_idx,
418
422
  metadata=self.metadata,
419
423
  submission_idx=sub_idx,
@@ -1013,6 +1017,7 @@ class PersistentStore(ABC):
1013
1017
  self,
1014
1018
  elem_iter_ID: int,
1015
1019
  action_idx: int,
1020
+ commands_idx: List[int],
1016
1021
  data_idx: Dict,
1017
1022
  metadata: Dict,
1018
1023
  save: bool = True,
@@ -1025,6 +1030,7 @@ class PersistentStore(ABC):
1025
1030
  is_pending=True,
1026
1031
  elem_iter_ID=elem_iter_ID,
1027
1032
  action_idx=action_idx,
1033
+ commands_idx=commands_idx,
1028
1034
  data_idx=data_idx,
1029
1035
  metadata=metadata,
1030
1036
  )
@@ -237,6 +237,7 @@ class ZarrStoreEAR(StoreEAR):
237
237
  self.exit_code,
238
238
  self.metadata,
239
239
  self.run_hostname,
240
+ self.commands_idx,
240
241
  ]
241
242
  return EAR_enc
242
243
 
@@ -258,6 +259,7 @@ class ZarrStoreEAR(StoreEAR):
258
259
  "exit_code": EAR_dat[11],
259
260
  "metadata": EAR_dat[12],
260
261
  "run_hostname": EAR_dat[13],
262
+ "commands_idx": EAR_dat[14],
261
263
  }
262
264
  return cls(is_pending=False, **obj_dat)
263
265
 
@@ -618,3 +618,173 @@ def test_ActionEnvironment_env_dict(null_config):
618
618
  def test_ActionEnvironment_raises_on_missing_name(null_config):
619
619
  with pytest.raises(ActionEnvironmentMissingNameError):
620
620
  hf.ActionEnvironment(environment={"key": "value"})
621
+
622
+
623
+ def test_rules_allow_runs_initialised(null_config, tmp_path):
624
+ """Test rules that do not depend on execution allow for runs to be initialised."""
625
+ act = hf.Action(
626
+ script="<<script:path/to/some/script>>",
627
+ rules=[hf.ActionRule(path="inputs.p1", condition={"value.less_than": 2})],
628
+ )
629
+ ts = hf.TaskSchema(
630
+ objective="ts1",
631
+ inputs=[hf.SchemaInput("p1")],
632
+ actions=[act],
633
+ )
634
+ t1 = hf.Task(
635
+ schema=ts, sequences=[hf.ValueSequence(path="inputs.p1", values=[1.5, 2.5])]
636
+ )
637
+ wk = hf.Workflow.from_template_data(
638
+ template_name="test",
639
+ path=tmp_path,
640
+ tasks=[t1],
641
+ )
642
+ assert wk.tasks[0].elements[0].iterations[0].EARs_initialised
643
+ assert wk.tasks[0].elements[1].iterations[0].EARs_initialised
644
+ assert len(wk.tasks[0].elements[0].actions) == 1
645
+ assert len(wk.tasks[0].elements[1].actions) == 0
646
+
647
+
648
+ def test_rules_prevent_runs_initialised(null_config, tmp_path):
649
+ """Test rules that depend on execution prevent initialising runs."""
650
+ act1 = hf.Action(script="<<script:path/to/some/script>>")
651
+ act2 = hf.Action(
652
+ script="<<script:path/to/some/script>>",
653
+ rules=[hf.ActionRule(path="inputs.p2", condition={"value.less_than": 2})],
654
+ )
655
+ ts1 = hf.TaskSchema(
656
+ objective="ts1",
657
+ inputs=[hf.SchemaInput("p1")],
658
+ outputs=[hf.SchemaOutput("p2")],
659
+ actions=[act1],
660
+ )
661
+ ts2 = hf.TaskSchema(
662
+ objective="ts2",
663
+ inputs=[hf.SchemaInput("p2")],
664
+ actions=[act2],
665
+ )
666
+ t1 = hf.Task(schema=ts1, inputs={"p1": 1.2})
667
+ t2 = hf.Task(schema=ts2)
668
+ wk = hf.Workflow.from_template_data(
669
+ template_name="test",
670
+ path=tmp_path,
671
+ tasks=[t1, t2],
672
+ )
673
+ assert wk.tasks[0].elements[0].iterations[0].EARs_initialised
674
+ assert not wk.tasks[1].elements[0].iterations[0].EARs_initialised
675
+
676
+
677
+ def test_command_rules_allow_runs_initialised(null_config, tmp_path):
678
+ """Test command rules that do not depend on execution allow for runs to be
679
+ initialised."""
680
+ act = hf.Action(
681
+ commands=[
682
+ hf.Command(
683
+ command='echo "p1=<<parameter:p1>>"',
684
+ rules=[hf.ActionRule(path="inputs.p1", condition={"value.less_than": 2})],
685
+ )
686
+ ],
687
+ )
688
+ ts = hf.TaskSchema(
689
+ objective="ts1",
690
+ inputs=[hf.SchemaInput("p1")],
691
+ actions=[act],
692
+ )
693
+ t1 = hf.Task(
694
+ schema=ts, sequences=[hf.ValueSequence(path="inputs.p1", values=[1.5, 2.5])]
695
+ )
696
+ wk = hf.Workflow.from_template_data(
697
+ template_name="test",
698
+ path=tmp_path,
699
+ tasks=[t1],
700
+ )
701
+ assert wk.tasks[0].elements[0].iterations[0].EARs_initialised
702
+ assert wk.tasks[0].elements[1].iterations[0].EARs_initialised
703
+ assert len(wk.tasks[0].elements[0].actions) == 1
704
+ assert len(wk.tasks[0].elements[1].actions) == 1
705
+ assert len(wk.tasks[0].elements[0].action_runs[0].commands_idx) == 1
706
+ assert len(wk.tasks[0].elements[1].action_runs[0].commands_idx) == 0
707
+
708
+
709
+ def test_command_rules_prevent_runs_initialised(null_config, tmp_path):
710
+ """Test command rules that do depend on execution prevent runs being initialised."""
711
+ act1 = hf.Action(
712
+ commands=[
713
+ hf.Command(command='echo "p1=<<parameter:p1>>"', stdout="<<parameter:p2>>")
714
+ ]
715
+ )
716
+ act2 = hf.Action(
717
+ commands=[
718
+ hf.Command(
719
+ command='echo "p1=<<parameter:p2>>"',
720
+ rules=[hf.ActionRule(path="inputs.p2", condition={"value.less_than": 2})],
721
+ )
722
+ ],
723
+ )
724
+ ts1 = hf.TaskSchema(
725
+ objective="ts1",
726
+ inputs=[hf.SchemaInput("p1")],
727
+ outputs=[hf.SchemaOutput("p2")],
728
+ actions=[act1],
729
+ )
730
+ ts2 = hf.TaskSchema(
731
+ objective="ts2",
732
+ inputs=[hf.SchemaInput("p2")],
733
+ actions=[act2],
734
+ )
735
+ t1 = hf.Task(schema=ts1, inputs={"p1": 0})
736
+ t2 = hf.Task(schema=ts2)
737
+ wk = hf.Workflow.from_template_data(
738
+ template_name="test",
739
+ path=tmp_path,
740
+ tasks=[t1, t2],
741
+ )
742
+ assert wk.tasks[0].elements[0].iterations[0].EARs_initialised
743
+ assert len(wk.tasks[0].elements[0].action_runs[0].commands_idx) == 1
744
+ assert not wk.tasks[1].elements[0].iterations[0].EARs_initialised
745
+
746
+
747
+ def test_command_rules_prevent_runs_initialised_with_valid_action_rules(
748
+ null_config, tmp_path
749
+ ):
750
+ """Test command rules that do depend on execution prevent runs being initialised, even
751
+ when the parent action rules can be tested and are valid."""
752
+ act1 = hf.Action(
753
+ commands=[
754
+ hf.Command(command='echo "p1=<<parameter:p1>>"', stdout="<<parameter:p2>>")
755
+ ]
756
+ )
757
+
758
+ # action rule is testable and valid, but command rule is not testable, so the action
759
+ # runs should not be initialised:
760
+ act2 = hf.Action(
761
+ commands=[
762
+ hf.Command(
763
+ command='echo "p1=<<parameter:p1>>; p2=<<parameter:p2>>"',
764
+ rules=[hf.ActionRule(path="inputs.p2", condition={"value.less_than": 2})],
765
+ )
766
+ ],
767
+ rules=[hf.ActionRule(path="inputs.p1", condition={"value.less_than": 2})],
768
+ )
769
+ ts1 = hf.TaskSchema(
770
+ objective="ts1",
771
+ inputs=[hf.SchemaInput("p1")],
772
+ outputs=[hf.SchemaOutput("p2")],
773
+ actions=[act1],
774
+ )
775
+ ts2 = hf.TaskSchema(
776
+ objective="ts2",
777
+ inputs=[hf.SchemaInput("p1"), hf.SchemaInput("p2")],
778
+ actions=[act2],
779
+ )
780
+ t1 = hf.Task(schema=ts1, inputs={"p1": 0})
781
+ t2 = hf.Task(schema=ts2)
782
+ wk = hf.Workflow.from_template_data(
783
+ template_name="test",
784
+ path=tmp_path,
785
+ tasks=[t1, t2],
786
+ )
787
+ assert wk.tasks[0].elements[0].iterations[0].EARs_initialised
788
+ assert len(wk.tasks[0].elements[0].action_runs[0].commands_idx) == 1
789
+
790
+ assert not wk.tasks[1].elements[0].iterations[0].EARs_initialised
@@ -74,6 +74,7 @@ def test_store_pending_add_EAR(tmp_path):
74
74
  EAR_ID = store.add_EAR(
75
75
  elem_iter_ID=0,
76
76
  action_idx=0,
77
+ commands_idx=[],
77
78
  data_idx={},
78
79
  metadata={},
79
80
  )
@@ -83,6 +84,7 @@ def test_store_pending_add_EAR(tmp_path):
83
84
  is_pending=True,
84
85
  elem_iter_ID=0,
85
86
  action_idx=0,
87
+ commands_idx=[],
86
88
  data_idx={},
87
89
  metadata={},
88
90
  )
@@ -186,7 +188,7 @@ def test_get_task_elements_single_element_iter_EAR_pending(tmp_path):
186
188
  store = JSONPersistentStore.make_test_store_from_spec(
187
189
  [{"elements": [{"iterations": [{}]}]}], dir=tmp_path
188
190
  )
189
- store.add_EAR(elem_iter_ID=0, action_idx=0, data_idx={}, metadata={})
191
+ store.add_EAR(elem_iter_ID=0, action_idx=0, commands_idx=[], data_idx={}, metadata={})
190
192
  assert store.get_task_elements(0, slice(0, None)) == [
191
193
  {
192
194
  "id": 0,
@@ -209,6 +211,7 @@ def test_get_task_elements_single_element_iter_EAR_pending(tmp_path):
209
211
  "is_pending": True,
210
212
  "elem_iter_ID": 0,
211
213
  "action_idx": 0,
214
+ "commands_idx": [],
212
215
  "data_idx": {},
213
216
  "metadata": {},
214
217
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hpcflow-new2
3
- Version: 0.2.0a163
3
+ Version: 0.2.0a164
4
4
  Summary: Computational workflow management
5
5
  License: MIT
6
6
  Author: aplowman
@@ -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=SeMopsPkhCyd9gqIrzwFNRj3ZlkUlUYl-74QYz61mo4,1089
4
- hpcflow/_version.py,sha256=tzJ7gQAiw2i0b3GePOxSiCgH-4Y_tYLsEdO5QIx3ceg,26
4
+ hpcflow/_version.py,sha256=R9jeM3QgojiIsBflXpjJhqXm0gfjNECHSLEUIKEcqB4,26
5
5
  hpcflow/app.py,sha256=d-kgfnZNlqlCi2H8bK26714brD_u3ibN3FaEZgjF9aA,1332
6
6
  hpcflow/cli.py,sha256=G2J3D9v6MnMWOWMMWK6UEKLn_6wnV9lT_qygEBBxg-I,66
7
7
  hpcflow/data/demo_data_manifest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -45,9 +45,9 @@ hpcflow/sdk/config/config.py,sha256=7kUqTsU4-SDW99lWXaDZ-_s03J3SJubcVUjzYvO2Vho,
45
45
  hpcflow/sdk/config/config_file.py,sha256=JlMcprj0aujFVk8552ahP2f8EXB0tglMaHwzbcGZH6w,12373
46
46
  hpcflow/sdk/config/errors.py,sha256=2D7HJ1dbyeoD3xk4MuaGSsbJsUyQzyw8kaThEBZfP2I,6876
47
47
  hpcflow/sdk/core/__init__.py,sha256=GcIklEsXy3M5PWpmxyhd2KoI0u6HjXRIjD_aR1bgRjo,215
48
- hpcflow/sdk/core/actions.py,sha256=F9FxsIqkz-GRFZEiQ4W3MR7YSKx1oaEHnjoOrzZYlaA,76336
48
+ hpcflow/sdk/core/actions.py,sha256=66CHgwYAB0oCR6oB5bNbBdUGRGTU3juS1XcMNjj3vP0,77068
49
49
  hpcflow/sdk/core/command_files.py,sha256=GEFlgZv7g9lkFoNgwyDtmlI_90e2TWliCJuJimnJZts,18685
50
- hpcflow/sdk/core/commands.py,sha256=EgcakapQshyFcj1AUEt91OF3cqH8EbZUnBrX0Py8w-c,12348
50
+ hpcflow/sdk/core/commands.py,sha256=5SKxSBuYz8sSvfpp9p5utBwMoQV6Pd2KlGBCpXAHDxE,12741
51
51
  hpcflow/sdk/core/element.py,sha256=hTAR2kxfGSRf4vFgWwrnyuP5z5RnKYOd2X6c6Xd70zo,47048
52
52
  hpcflow/sdk/core/environment.py,sha256=DGUz1NvliKh6opP0IueGHD69rn_8wFLhDsq6kAmEgM4,4849
53
53
  hpcflow/sdk/core/errors.py,sha256=yZnO9xuXFSfjI5lg6cepB38-VIytGdkzjW6mNEx3sh4,8962
@@ -58,8 +58,8 @@ hpcflow/sdk/core/parallel.py,sha256=LI-g-qOuOR1oaEUWVT0qW0hmiP9hsJyUP8_IfSTKYYo,
58
58
  hpcflow/sdk/core/parameters.py,sha256=ooJLzXjSFvKQANfDbGCTbs0IrgMyV-BiJ26d44Mswlk,64820
59
59
  hpcflow/sdk/core/rule.py,sha256=3jVsSZCBv4Odxy8QbSbKo9ZcRuU-5DRJoNK8adXCEpI,4567
60
60
  hpcflow/sdk/core/run_dir_files.py,sha256=_k-hA7dlry9GZw5ZXcntFcPGxg07p03hnHSM5S-2G2Y,2197
61
- hpcflow/sdk/core/task.py,sha256=RARewE_M7DuglyvJHHoBuMlX_rccf_cn7lR8qCATxW4,113514
62
- hpcflow/sdk/core/task_schema.py,sha256=_IYGgMDbL6PNlBUHlnUPNlbym9zvzH9K0Q6jFTm8o8w,32346
61
+ hpcflow/sdk/core/task.py,sha256=_tOVRa533YED0d0P-4cynEjfwgvfrKwYC1fQUdqr2NU,113611
62
+ hpcflow/sdk/core/task_schema.py,sha256=TipXzC2guu9zilv0En-rHt6lUCTSIj5faI4lVWQdUbA,32346
63
63
  hpcflow/sdk/core/test_utils.py,sha256=UKitv3qvZpSz8vE_HRaJjPDnaOeojy6WVntSskPs03Q,9354
64
64
  hpcflow/sdk/core/utils.py,sha256=pReOwnmuxJqexPUdaA8UMjJ4o8ucllBVVssWjb_LNQc,25651
65
65
  hpcflow/sdk/core/validation.py,sha256=KBKiy5DdfGiGmMaB0HdKTY0V972u5dJzvkYkX0_KtCo,518
@@ -81,12 +81,12 @@ hpcflow/sdk/helper/helper.py,sha256=MkjYKHox1F4XOpy-20sCCDUTWUbQY84QpWZkcpSq9n8,
81
81
  hpcflow/sdk/helper/watcher.py,sha256=hLqgwXtZw-6ihNUUcWYnZw8TCyD_AdhYE7abOrO2r_0,4003
82
82
  hpcflow/sdk/log.py,sha256=_DA5nNS8BoSIFB3d9nrIjbxNDxFflEaL3Ubkq8UYQK8,5735
83
83
  hpcflow/sdk/persistence/__init__.py,sha256=IzWycfiO6rDn_7Kocw4Df5ETe9BSoaqqxG7Yp4FW_ls,900
84
- hpcflow/sdk/persistence/base.py,sha256=K4Lp8HmybEGMxnthBV6a2h5KajiJL4gDawuiGukNHsY,60367
84
+ hpcflow/sdk/persistence/base.py,sha256=JNGFKsg7CEjAAyVUfRnSesHvutBLVlPDnrnKu0YB4bc,60605
85
85
  hpcflow/sdk/persistence/json.py,sha256=5_a73kUmukhNw1LR_evKPKcHo0YcbUzzAtYiS9lN07c,21416
86
86
  hpcflow/sdk/persistence/pending.py,sha256=4V4Xf760GV6JsCl95bm72z8Y78Gw8cbPiBiHZ031orU,24471
87
87
  hpcflow/sdk/persistence/store_resource.py,sha256=oEyocRqa8Uym-57UFosrwate-Xw9O7i2FM82TxHc4m0,4307
88
88
  hpcflow/sdk/persistence/utils.py,sha256=yQT6gS-Ipj2N6grtlV5d0czxxKE0CaeqAkXA1247XGo,1522
89
- hpcflow/sdk/persistence/zarr.py,sha256=V1ydOFf9qRWTHl6uEpemqxPi-EnTb5IYauUwmzdE-IA,45135
89
+ hpcflow/sdk/persistence/zarr.py,sha256=HJYghGZk4D7OfQ1NRWJqlZ1Poqoq9kWRi5kYipBiGYg,45207
90
90
  hpcflow/sdk/runtime.py,sha256=_in5ojiy9R8fD1ZNbdE6PDmZx6kSaiG9WPB6kVBFE7k,9217
91
91
  hpcflow/sdk/submission/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
92
  hpcflow/sdk/submission/jobscript.py,sha256=Z9NUzkIcmoFw-XAtG8FdLpO2LtMt3czk1v1BnbM1eZw,44678
@@ -115,7 +115,7 @@ hpcflow/tests/schedulers/direct_linux/test_direct_linux_submission.py,sha256=pgH
115
115
  hpcflow/tests/schedulers/slurm/test_slurm_submission.py,sha256=IpLq4TBwhK8_3KrvsySctIn4rA_1oyyWLFonzL28o4Q,403
116
116
  hpcflow/tests/scripts/test_main_scripts.py,sha256=6mZvcppeFf9yL7XipYwHKxQvILKzCox4Wcpg2t1DWWc,18737
117
117
  hpcflow/tests/shells/wsl/test_wsl_submission.py,sha256=IrpvsxVfsQCUmS8KKn7w9DiVFR8z_ak_IWyAd1E0KKc,516
118
- hpcflow/tests/unit/test_action.py,sha256=sgTqUqvW8W_rYD5X-P6jedsolxqmyqvx1a3HuaH5Svk,20495
118
+ hpcflow/tests/unit/test_action.py,sha256=GDyx2ak6H-gvuHAG7-oia39crFcX1bGC3h2M7j8teOs,26334
119
119
  hpcflow/tests/unit/test_action_rule.py,sha256=vX7hMo_9AO5iUGWdDF8uP8rM4jghZidusiY4ZvNcEKo,556
120
120
  hpcflow/tests/unit/test_app.py,sha256=dujHPEpUMAHVWgA-TB0zeACMfmmMgFTDAJgX0Dd3qzQ,2967
121
121
  hpcflow/tests/unit/test_cli.py,sha256=9oQZOlX0z5LC4e2JFLuIgGnUXgmR2RCAtbXR5XRwqJs,288
@@ -131,7 +131,7 @@ hpcflow/tests/unit/test_json_like.py,sha256=aGCiGfT-tNiFu3yzW6d_T-oDc5QLwSUgq3pN
131
131
  hpcflow/tests/unit/test_loop.py,sha256=vBnCnoweiFIi2T68bu6PCQ4yH829pxK6Oe4Comg0bHo,21060
132
132
  hpcflow/tests/unit/test_object_list.py,sha256=nDpbRpCu4XqoYxKMr1_QmDS1s2_6nQOpIEBRHSAXoVg,3049
133
133
  hpcflow/tests/unit/test_parameter.py,sha256=g-4pZeIYW0GQyy2rL9JkKBpOC6p1PuGOiq4cbBIwzq0,6132
134
- hpcflow/tests/unit/test_persistence.py,sha256=UEAaDamuOdmb3nJEJ2v3S23mFG8u_Nai2AED2Ydwv5U,8005
134
+ hpcflow/tests/unit/test_persistence.py,sha256=DPXFiuY2v8vj0zZ7299nf-KtgYT8LhHI52fq7UPoa6Y,8128
135
135
  hpcflow/tests/unit/test_resources.py,sha256=2RRFIn5brKyD1UNmkmnvyjPZowa-dokQd0EuCEeo7so,7799
136
136
  hpcflow/tests/unit/test_run.py,sha256=uvG2BbVOD0JJAJCbdh0MMRJME8tVzOm7H4PTLzPLWZY,2613
137
137
  hpcflow/tests/unit/test_runtime.py,sha256=HjHPTS3UkX1LcwheFgpp4px_VlRis8KAE2HoeqxRbA8,322
@@ -148,7 +148,7 @@ hpcflow/tests/unit/test_workflow_template.py,sha256=fF7LNveMwCledgncNCRfD9Nd9dL9
148
148
  hpcflow/tests/workflows/test_jobscript.py,sha256=9sp1o0g72JZbv2QlOl5v7wCZEFjotxiIKGNUxVaFgaA,724
149
149
  hpcflow/tests/workflows/test_workflows.py,sha256=xai6FRtGqG4lStJk6KmsqPUSuvqs9FrsBOxMVALshIs,13400
150
150
  hpcflow/viz_demo.ipynb,sha256=1QdnVsk72vihv2L6hOGyk318uEa22ZSgGxQCa7hW2oo,6238
151
- hpcflow_new2-0.2.0a163.dist-info/METADATA,sha256=hSeoy8fTr81qWMY501ncjzmBmPaxmcFCBp5O-gYNMzs,2473
152
- hpcflow_new2-0.2.0a163.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
153
- hpcflow_new2-0.2.0a163.dist-info/entry_points.txt,sha256=aoGtCnFdfPcXfBdu2zZyMOJoz6fPgdR0elqsgrE-USU,106
154
- hpcflow_new2-0.2.0a163.dist-info/RECORD,,
151
+ hpcflow_new2-0.2.0a164.dist-info/METADATA,sha256=xONNW9D3OecXiNTVC-RYksxn5h6boxU6PZzFQ43TI0E,2473
152
+ hpcflow_new2-0.2.0a164.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
153
+ hpcflow_new2-0.2.0a164.dist-info/entry_points.txt,sha256=aoGtCnFdfPcXfBdu2zZyMOJoz6fPgdR0elqsgrE-USU,106
154
+ hpcflow_new2-0.2.0a164.dist-info/RECORD,,