simstack 2.0.1__py3-none-any.whl → 2.0.3__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 (42) hide show
  1. simstack/_version.py +2 -2
  2. simstack/core/artifacts.py +7 -13
  3. simstack/core/context.py +28 -0
  4. simstack/core/find_simstack_modules.py +1 -1
  5. simstack/core/node.py +771 -111
  6. simstack/core/node_runner.py +2 -1
  7. simstack/core/recompute_artifacts.py +13 -0
  8. simstack/core/resource_assignment.py +41 -14
  9. simstack/core/run_docker.py +623 -37
  10. simstack/core/run_node.py +82 -18
  11. simstack/core/run_node_protocol.py +46 -0
  12. simstack/core/services/git_uv_update_service.py +29 -16
  13. simstack/core/services/node_execution_service.py +154 -19
  14. simstack/core/simstack_result.py +3 -0
  15. simstack/core/submit_node.py +126 -77
  16. simstack/models/artifact_models.py +2 -1
  17. simstack/models/charts_artifact.py +106 -0
  18. simstack/models/node_registry.py +11 -0
  19. simstack/models/parameters.py +50 -6
  20. simstack/models/resource_assignment.py +108 -21
  21. simstack/models/resource_definition.py +3 -4
  22. simstack/models/table_artifact.py +1 -1
  23. simstack/static/docs/_modules/simstack/core/run_docker.html +3 -3
  24. simstack/tables/model_table.py +15 -13
  25. simstack/tables/node_children.py +25 -4
  26. simstack/tables/node_table.py +42 -17
  27. simstack/tables/table_builder.py +5 -6
  28. simstack/util/database_information.py +11 -2
  29. simstack/util/default_from_dict.py +7 -0
  30. simstack/util/import_module.py +9 -9
  31. simstack/util/importer.py +6 -4
  32. simstack/util/project_root_finder.py +11 -1
  33. simstack/util/resource_config.py +34 -7
  34. simstack/util/safe_code_executor.py +2 -3
  35. simstack/util/sanitized_output.py +45 -0
  36. simstack/util/submit_to_watchdog.py +2 -1
  37. {simstack-2.0.1.dist-info → simstack-2.0.3.dist-info}/METADATA +2 -2
  38. {simstack-2.0.1.dist-info → simstack-2.0.3.dist-info}/RECORD +42 -40
  39. {simstack-2.0.1.dist-info → simstack-2.0.3.dist-info}/WHEEL +1 -1
  40. {simstack-2.0.1.dist-info → simstack-2.0.3.dist-info}/entry_points.txt +0 -0
  41. {simstack-2.0.1.dist-info → simstack-2.0.3.dist-info}/licenses/LICENSE +0 -0
  42. {simstack-2.0.1.dist-info → simstack-2.0.3.dist-info}/top_level.txt +0 -0
simstack/_version.py CHANGED
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '2.0.1'
22
- __version_tuple__ = version_tuple = (2, 0, 1)
21
+ __version__ = version = '2.0.3'
22
+ __version_tuple__ = version_tuple = (2, 0, 3)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -8,6 +8,7 @@ from odmantic import ObjectId
8
8
  from simstack.core.context import context
9
9
  from simstack.models.artifact_models import ArtifactMapping, ArtifactModel
10
10
  from simstack.models.charts_artifact import ChartArtifactModel
11
+ from simstack.models.images2d import Image2DArtifactModel
11
12
  from simstack.models.node_registry import find_child_nodes, NodeRegistry
12
13
  from simstack.models.table_artifact import TableArtifactModel
13
14
  from simstack.util.db import Database
@@ -197,23 +198,16 @@ async def create_artifacts(
197
198
  f"{log_string_mapping} Artifact is None, skipping."
198
199
  )
199
200
  continue
200
- if isinstance(artifact, TableArtifactModel):
201
+ if isinstance(artifact, (TableArtifactModel, ChartArtifactModel, ArtifactModel, Image2DArtifactModel)):
201
202
  artifact.parent_id = node_registry.id
203
+ if isinstance(artifact, ArtifactModel):
204
+ artifact.path = call_path
202
205
  saved_artifact = await context.db.save(artifact)
206
+ if isinstance(artifact, ArtifactModel):
207
+ artifact_list.append(saved_artifact)
203
208
  logger.debug(
204
- f"{log_string_mapping} new table: {saved_artifact}"
209
+ f"{log_string_mapping} new artifact: {saved_artifact}"
205
210
  )
206
- elif isinstance(artifact, ChartArtifactModel):
207
- artifact.parent_id = node_registry.id
208
- saved_artifact = await context.db.save(artifact)
209
- logger.debug(
210
- f"{log_string_mapping} new table: {saved_artifact}"
211
- )
212
- elif isinstance(artifact, ArtifactModel):
213
- artifact.path = call_path
214
- saved_artifact = await context.db.save(artifact)
215
- logger.debug(f"{log_string_mapping} new: {saved_artifact}")
216
- artifact_list.append(saved_artifact)
217
211
  else:
218
212
  raise ValueError(
219
213
  f"{log_string_mapping} not an ArtifactModel object. Got {artifact} instead."
simstack/core/context.py CHANGED
@@ -55,6 +55,8 @@ class GlobalState:
55
55
  cls._instance._model_mappings = None
56
56
  cls._instance._node_mappings = None
57
57
  cls._instance._resource_config = None
58
+ cls._instance._in_docker = False
59
+ cls._instance._current_node_name = None
58
60
  return cls._instance
59
61
 
60
62
  def __init__(self, **kwargs):
@@ -73,6 +75,8 @@ class GlobalState:
73
75
  self._model_mappings = None
74
76
  self._node_mappings = None
75
77
  self._resource_config = None
78
+ self._in_docker = False
79
+ self._current_node_name = None
76
80
 
77
81
  def __getattribute__(self, name):
78
82
  # These special attributes should always be accessible
@@ -80,6 +84,8 @@ class GlobalState:
80
84
  "_initialized",
81
85
  "initialize",
82
86
  "initialized",
87
+ "_in_docker",
88
+ "_current_node_name",
83
89
  ):
84
90
  return object.__getattribute__(self, name)
85
91
 
@@ -111,6 +117,8 @@ class GlobalState:
111
117
  - resource (str, optional): Specifies the resource identifier for the configuration reader.
112
118
  Defaults to `"self"`.
113
119
  - config_file (str, optional): Specifies the path to the configuration file, defaults to simstack.toml
120
+ - in_docker (bool, optional): True when this process is already inside a
121
+ container (`run_node --in-docker`). Defaults to `False`.
114
122
 
115
123
  Logic:
116
124
  if all values for the DB are provided in the kwargs, use the provided values
@@ -134,6 +142,8 @@ class GlobalState:
134
142
  if not is_test:
135
143
  return
136
144
  self._initialized = True # required because some later functions use context
145
+ self._in_docker = bool(kwargs.get("in_docker", False))
146
+ self._current_node_name = None
137
147
 
138
148
  project_root = kwargs.get("project_root", find_project_root())
139
149
  if project_root is None: # maybe None was passed
@@ -151,6 +161,8 @@ class GlobalState:
151
161
  if db_name is None or connection_string is None or db_type is None:
152
162
  # use not all info in the kwargs
153
163
  simstack_toml_path = project_root / "simstack.toml"
164
+ if not simstack_toml_path.exists():
165
+ raise ValueError(f"simstack.toml not found in {project_root}")
154
166
  toml_reader = TomlReader(project_root, config_file=Path(simstack_toml_path).resolve())
155
167
  db_info = DatabaseInformation.from_config(toml_reader.config, **kwargs)
156
168
  else:
@@ -274,6 +286,22 @@ class GlobalState:
274
286
  def resource_config(self) -> "ResourceConfig":
275
287
  return self._resource_config
276
288
 
289
+ @property
290
+ def in_docker(self) -> bool:
291
+ return bool(self._in_docker)
292
+
293
+ @in_docker.setter
294
+ def in_docker(self, value: bool) -> None:
295
+ self._in_docker = bool(value)
296
+
297
+ @property
298
+ def current_node_name(self) -> str | None:
299
+ return self._current_node_name
300
+
301
+ @current_node_name.setter
302
+ def current_node_name(self, value: str | None) -> None:
303
+ self._current_node_name = value
304
+
277
305
  @property
278
306
  def initialized(self):
279
307
  return self._initialized
@@ -3,7 +3,7 @@ import pkgutil
3
3
  from importlib.metadata import entry_points
4
4
  from logging import getLogger
5
5
 
6
- logger = getLogger("find_simstack_modules")
6
+ logger = getLogger("find_modules")
7
7
 
8
8
 
9
9
  def walk_packages(package_name, all_modules):