hpcflow-new2 0.2.0a227__py3-none-any.whl → 0.2.0a229__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.0a227"
1
+ __version__ = "0.2.0a229"
hpcflow/sdk/cli.py CHANGED
@@ -190,7 +190,7 @@ def _make_API_CLI(app: BaseApp):
190
190
  format, or a YAML/JSON string.
191
191
 
192
192
  """
193
- wk = app.make_workflow(
193
+ wk_or_sub = app.make_workflow(
194
194
  template_file_or_str=template_file_or_str,
195
195
  is_string=string,
196
196
  template_format=format,
@@ -204,8 +204,12 @@ def _make_API_CLI(app: BaseApp):
204
204
  status=status,
205
205
  add_submission=add_submission,
206
206
  )
207
- assert isinstance(wk, Workflow)
208
- click.echo(wk.path)
207
+ if add_submission:
208
+ assert isinstance(wk_or_sub, Submission)
209
+ click.echo(wk_or_sub.workflow.path)
210
+ else:
211
+ assert isinstance(wk_or_sub, Workflow)
212
+ click.echo(wk_or_sub.path)
209
213
 
210
214
  @click.command(name="go")
211
215
  @click.argument("template_file_or_str")
@@ -3017,6 +3017,7 @@ class Action(JSONLike):
3017
3017
  if all(rule.test(element_iteration=element_iter) for rule in cmd.rules)
3018
3018
  ]
3019
3019
 
3020
+ @TimeIt.decorator
3020
3021
  def get_required_executables(self) -> Iterator[str]:
3021
3022
  """Return executable labels required by this action."""
3022
3023
  for command in self.commands:
@@ -11,6 +11,7 @@ from typing import Any, ClassVar, TYPE_CHECKING
11
11
 
12
12
  import numpy as np
13
13
 
14
+ from hpcflow.sdk.log import TimeIt
14
15
  from hpcflow.sdk.typing import hydrate
15
16
  from hpcflow.sdk.core.element import ElementResources
16
17
  from hpcflow.sdk.core.errors import NoCLIFormatMethodError
@@ -416,6 +417,7 @@ class Command(JSONLike):
416
417
  def _extract_executable_labels(cls, cmd_str: str) -> Sequence[str]:
417
418
  return cls.__EXE_RE.findall(cmd_str)
418
419
 
420
+ @TimeIt.decorator
419
421
  def get_required_executables(self) -> Sequence[str]:
420
422
  """Return executable labels required by this command."""
421
423
  # an executable label might appear in the `command` or `executable` attribute:
@@ -1786,6 +1786,20 @@ class Workflow(AppAware):
1786
1786
  elem: int
1787
1787
  task: int
1788
1788
 
1789
+ @TimeIt.decorator
1790
+ def __get_elements_by_task_idx(
1791
+ self, element_idx_by_task: dict[int, set[int]]
1792
+ ) -> dict[int, dict[int, Element]]:
1793
+ return {
1794
+ task_idx: {
1795
+ idx: element
1796
+ for idx, element in zip(
1797
+ elem_indices, self.tasks[task_idx].elements[list(elem_indices)]
1798
+ )
1799
+ }
1800
+ for task_idx, elem_indices in element_idx_by_task.items()
1801
+ }
1802
+
1789
1803
  @TimeIt.decorator
1790
1804
  def get_elements_from_IDs(self, id_lst: Iterable[int]) -> list[Element]:
1791
1805
  """Return element objects from a list of IDs."""
@@ -1800,10 +1814,7 @@ class Workflow(AppAware):
1800
1814
  index_paths.append(Workflow._IndexPath1(elem_idx, task.index))
1801
1815
  element_idx_by_task[task.index].add(elem_idx)
1802
1816
 
1803
- elements_by_task = {
1804
- task_idx: {idx: self.tasks[task_idx].elements[idx] for idx in elem_idxes}
1805
- for task_idx, elem_idxes in element_idx_by_task.items()
1806
- }
1817
+ elements_by_task = self.__get_elements_by_task_idx(element_idx_by_task)
1807
1818
 
1808
1819
  return [elements_by_task[path.task][path.elem] for path in index_paths]
1809
1820
 
@@ -1832,10 +1843,7 @@ class Workflow(AppAware):
1832
1843
  index_paths.append(Workflow._IndexPath2(iter_idx, elem_idx, task.index))
1833
1844
  element_idx_by_task[task.index].add(elem_idx)
1834
1845
 
1835
- elements_by_task = {
1836
- task_idx: {idx: self.tasks[task_idx].elements[idx] for idx in elem_idx}
1837
- for task_idx, elem_idx in element_idx_by_task.items()
1838
- }
1846
+ elements_by_task = self.__get_elements_by_task_idx(element_idx_by_task)
1839
1847
 
1840
1848
  return [
1841
1849
  elements_by_task[path.task][path.elem].iterations[path.iter]
@@ -3627,7 +3635,8 @@ class Workflow(AppAware):
3627
3635
  if status:
3628
3636
  status.update("Adding new submission: resolving jobscripts...")
3629
3637
 
3630
- cache = ObjectCache.build(self, elements=True, iterations=True, runs=True)
3638
+ with self._store.cache_ctx():
3639
+ cache = ObjectCache.build(self, elements=True, iterations=True, runs=True)
3631
3640
 
3632
3641
  sub_obj: Submission = self._app.Submission(
3633
3642
  index=new_idx,
@@ -3719,7 +3728,7 @@ class Workflow(AppAware):
3719
3728
 
3720
3729
  """
3721
3730
  with self._app.config.cached_config():
3722
- with self.cached_merged_parameters():
3731
+ with self.cached_merged_parameters(), self._store.cache_ctx():
3723
3732
  js, element_deps = self._resolve_singular_jobscripts(
3724
3733
  cache, tasks, force_array
3725
3734
  )
hpcflow/sdk/demo/cli.py CHANGED
@@ -29,6 +29,7 @@ from hpcflow.sdk.cli_common import (
29
29
  make_status_opt,
30
30
  add_sub_opt,
31
31
  )
32
+ from hpcflow.sdk.submission.submission import Submission
32
33
 
33
34
  if TYPE_CHECKING:
34
35
  from collections.abc import Iterable
@@ -133,7 +134,7 @@ def get_demo_workflow_CLI(app: BaseApp):
133
134
  status: bool = True,
134
135
  add_submission: bool = False,
135
136
  ):
136
- wk = app.make_demo_workflow(
137
+ wk_or_sub = app.make_demo_workflow(
137
138
  workflow_name=workflow_name,
138
139
  template_format=format,
139
140
  path=path,
@@ -146,8 +147,12 @@ def get_demo_workflow_CLI(app: BaseApp):
146
147
  status=status,
147
148
  add_submission=add_submission,
148
149
  )
149
- assert isinstance(wk, Workflow)
150
- click.echo(wk.path)
150
+ if add_submission:
151
+ assert isinstance(wk_or_sub, Submission)
152
+ click.echo(wk_or_sub.workflow.path)
153
+ else:
154
+ assert isinstance(wk_or_sub, Workflow)
155
+ click.echo(wk_or_sub.path)
151
156
 
152
157
  @demo_workflow.command("go")
153
158
  @click.argument("workflow_name")
@@ -1,3 +1,4 @@
1
+ from pathlib import Path
1
2
  import pytest
2
3
 
3
4
  from click.testing import CliRunner
@@ -143,3 +144,27 @@ def test_cli_click_exit_code_non_zero(tmp_path):
143
144
  )
144
145
  assert result.exit_code == 2
145
146
  assert error_file.is_file()
147
+
148
+
149
+ def test_cli_make_demo_workflow(new_null_config, tmp_path):
150
+ """Check the demo workflow directory is generated."""
151
+ runner = CliRunner()
152
+ result = runner.invoke(
153
+ hf.cli, args=f'demo-workflow make workflow_1 --path "{str(tmp_path)}"'
154
+ )
155
+ assert result.exit_code == 0
156
+ assert Path(result.stdout_bytes.decode().strip()).is_dir()
157
+
158
+
159
+ def test_cli_make_demo_workflow_add_sub(new_null_config, tmp_path):
160
+ """Check the demo workflow directory is generated, and a submission is added."""
161
+ runner = CliRunner()
162
+ result = runner.invoke(
163
+ hf.cli,
164
+ args=f'demo-workflow make workflow_1 --path "{str(tmp_path)}" --add-submission',
165
+ )
166
+ assert result.exit_code == 0
167
+ wk_path = Path(result.stdout_bytes.decode().strip())
168
+ assert wk_path.is_dir()
169
+ wk = hf.Workflow(wk_path)
170
+ assert len(wk.submissions) == 1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hpcflow-new2
3
- Version: 0.2.0a227
3
+ Version: 0.2.0a229
4
4
  Summary: Computational workflow management
5
5
  License: MPL-2.0
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=P2b-8QdQqkSS7cJB6CB3CudUuJ9iZzTh2fQF4hNdCa4,1118
4
- hpcflow/_version.py,sha256=Jgo3POaN0i9GWVRAfP7uEOtWUMY-0Fis95oTeRaSmHQ,26
4
+ hpcflow/_version.py,sha256=N1YPfrQRLSWxAxps9EY74f8NTNfrZeI0hAp1gPseh58,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
@@ -65,7 +65,7 @@ hpcflow/data/workflows/workflow_1.yaml,sha256=lF7Re2SVc_5gQk5AwB0gXaq-n-T5ia4su3
65
65
  hpcflow/examples.ipynb,sha256=cLKp4QsxwwMXRanDnfWY9kqsV23q6G4raOpu6IZXnMw,28553
66
66
  hpcflow/sdk/__init__.py,sha256=BEbIz8adCAX06ZmvEcquEu29PmQDvVP1I1qn_q78dYc,6289
67
67
  hpcflow/sdk/app.py,sha256=UWnpxdEqVD07VE-Rr23xhVHesF3zZI6ryLJ1-yXKp7M,146820
68
- hpcflow/sdk/cli.py,sha256=qMFACsIA32gD2oLC8_FD9JjFYgidCoGxOH-L3qM2xx0,45818
68
+ hpcflow/sdk/cli.py,sha256=982MaA8xbrQr3AGniHoahiZkmgQccE-DJ2ykwV21EFc,45989
69
69
  hpcflow/sdk/cli_common.py,sha256=MO0TbC280JdZTLnxSV15wE7PDNx83sotpJsyAN1E2F4,10458
70
70
  hpcflow/sdk/config/__init__.py,sha256=pkufl_CXm_Kswk1x7LTavuplWjUbUCitK0AJ2E60gwM,137
71
71
  hpcflow/sdk/config/callbacks.py,sha256=cuW31ZW0YTOi5K5P-NYHuiK1YLsglMEH3c_u6mddVE8,8078
@@ -75,11 +75,11 @@ hpcflow/sdk/config/config_file.py,sha256=wfDjozV9lXTnaxQoe-z-1Y7dtO0N4o1kgEwKtrL
75
75
  hpcflow/sdk/config/errors.py,sha256=Ft0e0rqIh9NoxWu3R8RSHel2fLONrXrgmFdNGZ_nOac,8341
76
76
  hpcflow/sdk/config/types.py,sha256=hw8latN2PqgGB_cOcD2pmgf5hSE7Dl94xLGKosydpCo,3935
77
77
  hpcflow/sdk/core/__init__.py,sha256=uxvGIUmzvFvylxFL4OGoKHs8GABHHPFaki-Xyc7Nquk,861
78
- hpcflow/sdk/core/actions.py,sha256=zLsCmeKW8dmRZ-6MEkO8M4kboFxldASLu0IdCwGU-uk,118467
78
+ hpcflow/sdk/core/actions.py,sha256=ZoM-2L9qPc52fi26YBDwKHr1axPqhSI_89lRPsmnokM,118489
79
79
  hpcflow/sdk/core/app_aware.py,sha256=SnQCix09IHhqPAHBpbdhQAf3wDKvO6n6ym4XJ8vrv1s,569
80
80
  hpcflow/sdk/core/cache.py,sha256=6b0emvJGP-yf5UxKmEY_s4_gdyUfaNaXafq-qQaoBfU,8174
81
81
  hpcflow/sdk/core/command_files.py,sha256=LcrK7wjQnxmTDUrsC0Xgbjsy1NGodf62LrrTSNAAxxE,24942
82
- hpcflow/sdk/core/commands.py,sha256=vFyZ9Cv_tvGqSGtVEnAHAeXA-HAxWoF0nmf1e0bFCvs,15993
82
+ hpcflow/sdk/core/commands.py,sha256=mm4FVTpkjVXxfCOlyHcfEPy2DrBkhPaOaq0gk5ExvKA,16050
83
83
  hpcflow/sdk/core/element.py,sha256=pPRezx0HATKH55qEstXp1xOG4S8oGLVnJ3sQcEmLsXo,68152
84
84
  hpcflow/sdk/core/enums.py,sha256=scp7b7gbFSefu1bks2M2u6amq6G_lB_j_h8U_TPM4bU,5316
85
85
  hpcflow/sdk/core/environment.py,sha256=m0Qp4Y1XcPJ1yPrdHp6RJv9_H61nA9Qo2ZJV_-wGne8,7959
@@ -99,7 +99,7 @@ hpcflow/sdk/core/test_utils.py,sha256=UXe8P-1b_6Pn6vdgJfMVsTGJdVI65TZ2mSUgWHlVnn
99
99
  hpcflow/sdk/core/types.py,sha256=kqVXpiH8qwOVVBAw6GFvUQVdNYLEv7qIbgEkgfK0DO8,13021
100
100
  hpcflow/sdk/core/utils.py,sha256=EFflyTr6Ju8v0AfZYQuFnJm-hNjtx0XbnFuccM7cV-k,36950
101
101
  hpcflow/sdk/core/validation.py,sha256=4-0g5z3CgjFLQ2FCM0p0mjvNqHYuLhIqvQR_kpM0tsU,1838
102
- hpcflow/sdk/core/workflow.py,sha256=aM4JTfaIhtDA3dOeNC4ThTA1L7_EGOyBOPMcvf6KjC8,183779
102
+ hpcflow/sdk/core/workflow.py,sha256=qZdQm0AxcV9XhZ2WrzqZNkPOTyWh9ifsZmoYMasH_q0,184085
103
103
  hpcflow/sdk/core/zarr_io.py,sha256=i6WqkFXe-q1sJGTCYAbsNRXRrdkxZy6NRahTcuZPuX4,5906
104
104
  hpcflow/sdk/data/__init__.py,sha256=-YzROirohSKU2UGYj5vkCe_J2KejbzhIjUXNaJwKHLk,568
105
105
  hpcflow/sdk/data/config_file_schema.yaml,sha256=7i3z_m3GBRtLyB4c7qPngnlQWqcIq1CyCcOysDyq4es,791
@@ -110,7 +110,7 @@ hpcflow/sdk/data/parameters_spec_schema.yaml,sha256=Wj7CvG7Ul1nZDtBca-oxeFH_aSZk
110
110
  hpcflow/sdk/data/task_schema_spec_schema.yaml,sha256=6NROg7x-493bdvRwvY4M71R7POT-tNnmROkEsnnoL4k,93
111
111
  hpcflow/sdk/data/workflow_spec_schema.yaml,sha256=GsagSNksSYIPEJpjpkXd8rWpru7-77tQNxpzCt8aTWE,430
112
112
  hpcflow/sdk/demo/__init__.py,sha256=8mgXFcEpn817_vO6L785GW268JUBrZt69bTCGszgvf0,28
113
- hpcflow/sdk/demo/cli.py,sha256=Esc2E5wUR3ExB1_CfMGX4JqVxIeLQVOPEN5WKTWVpQI,6576
113
+ hpcflow/sdk/demo/cli.py,sha256=mEncltwW4KeybiMxhvL1cl4k7uFzyca8TRzyEMziZx0,6804
114
114
  hpcflow/sdk/helper/__init__.py,sha256=HPbnZlvgC9xJKpXyjrBuEXGMIfkLfblD_RBefBLJOFc,29
115
115
  hpcflow/sdk/helper/cli.py,sha256=s26xfwzmgjh778nIfjEozqbvs2XvKPoNaHSi_2vr01U,4026
116
116
  hpcflow/sdk/helper/helper.py,sha256=T45BEwhPgTlwvqDNbT4Us4UVmdRKRoszIMt8a9B69kE,9475
@@ -171,7 +171,7 @@ hpcflow/tests/unit/test_action.py,sha256=3fSQy0euZwu3CH8xl7nG9vWV1arKiFEHpO8vZNC
171
171
  hpcflow/tests/unit/test_action_rule.py,sha256=h7CPBXdHMoHZLqMnYn7EAMEyUsK5KduB4XiJV-N3WAY,729
172
172
  hpcflow/tests/unit/test_app.py,sha256=j_FeS6nMU5W2qftNZBQ-HbpBiNzKYLPsaOFSMInvEKw,4200
173
173
  hpcflow/tests/unit/test_cache.py,sha256=pSv2sxBpHYlUjVc_PLhbciykGMOOcXF6-C39fPLEbWM,1368
174
- hpcflow/tests/unit/test_cli.py,sha256=Ypn0k-QXeoeLK77bKGvylqhWgf_khukmNPh4OwG-_zs,4544
174
+ hpcflow/tests/unit/test_cli.py,sha256=LbOcFPglkjWc6NDt8r3gi0mvXQ2sVXp6WiX8fDaVUMc,5426
175
175
  hpcflow/tests/unit/test_command.py,sha256=oooZPOYM62j4IHIAgR5kKhY0_cYaCVqFtuH8buGnlYo,23182
176
176
  hpcflow/tests/unit/test_config.py,sha256=__rJADdEIia1lA2eSoT40IVw-7ArZSA86PDCQiWP7_M,6182
177
177
  hpcflow/tests/unit/test_config_file.py,sha256=H0jXqPDEz4KKJ-VcnhpY9Xf_iVxFZr9eOvKvGRzmHCU,4599
@@ -218,8 +218,8 @@ hpcflow/tests/workflows/test_submission.py,sha256=SUbBUbD8C8LSulrI7aETkzP9RqED48
218
218
  hpcflow/tests/workflows/test_workflows.py,sha256=9z3rtXjA5iMOp4C0q4TkD_9kLzwourCY-obpeOtnNt0,18927
219
219
  hpcflow/tests/workflows/test_zip.py,sha256=MzEwsIAYV_1A3bD0XRo23zUwUKVzkkmNd8_cil6YdWQ,578
220
220
  hpcflow/viz_demo.ipynb,sha256=6D9uBbWK3oMfbaf93Tnv5riFPtW-2miUTWNr9kGcnd4,228913
221
- hpcflow_new2-0.2.0a227.dist-info/LICENSE,sha256=Xhxf_KsrJNJFGMogumZhXSTPhUOVHCWf7nU-TDzqg0E,16763
222
- hpcflow_new2-0.2.0a227.dist-info/METADATA,sha256=Q7I7tq_F1uXnwwuKuvhGjdBbBs-AujyfsWgJ4KZ_NFg,2663
223
- hpcflow_new2-0.2.0a227.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
224
- hpcflow_new2-0.2.0a227.dist-info/entry_points.txt,sha256=aoGtCnFdfPcXfBdu2zZyMOJoz6fPgdR0elqsgrE-USU,106
225
- hpcflow_new2-0.2.0a227.dist-info/RECORD,,
221
+ hpcflow_new2-0.2.0a229.dist-info/LICENSE,sha256=Xhxf_KsrJNJFGMogumZhXSTPhUOVHCWf7nU-TDzqg0E,16763
222
+ hpcflow_new2-0.2.0a229.dist-info/METADATA,sha256=-5FqegeQRZ9QG__KPPlPn0sqUvd-QcDvP5Y1gMeW0TE,2663
223
+ hpcflow_new2-0.2.0a229.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
224
+ hpcflow_new2-0.2.0a229.dist-info/entry_points.txt,sha256=aoGtCnFdfPcXfBdu2zZyMOJoz6fPgdR0elqsgrE-USU,106
225
+ hpcflow_new2-0.2.0a229.dist-info/RECORD,,