simstack 2.0.1__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 (354) hide show
  1. simstack/__init__.py +0 -0
  2. simstack/_version.py +24 -0
  3. simstack/core/__init__.py +0 -0
  4. simstack/core/artifacts.py +406 -0
  5. simstack/core/asnyc_helper.py +14 -0
  6. simstack/core/config_file.py +60 -0
  7. simstack/core/context.py +283 -0
  8. simstack/core/definitions.py +22 -0
  9. simstack/core/engine.py +115 -0
  10. simstack/core/find_simstack_modules.py +41 -0
  11. simstack/core/hash.py +179 -0
  12. simstack/core/node.py +1137 -0
  13. simstack/core/node_claim.py +31 -0
  14. simstack/core/node_runner.py +362 -0
  15. simstack/core/process_results.py +102 -0
  16. simstack/core/recompute_artifacts.py +117 -0
  17. simstack/core/reset_db.py +12 -0
  18. simstack/core/resource_assignment.py +222 -0
  19. simstack/core/resources.py +90 -0
  20. simstack/core/route_table.py +24 -0
  21. simstack/core/run_docker.py +109 -0
  22. simstack/core/run_node.py +71 -0
  23. simstack/core/runner.py +169 -0
  24. simstack/core/services/__init__.py +11 -0
  25. simstack/core/services/base_service.py +191 -0
  26. simstack/core/services/file_transfer_service.py +117 -0
  27. simstack/core/services/git_restart_service.py +12 -0
  28. simstack/core/services/git_uv_update_service.py +105 -0
  29. simstack/core/services/node_execution_service.py +182 -0
  30. simstack/core/services/resource_branch_monitor_service.py +71 -0
  31. simstack/core/services/runner_cleanup_service.py +149 -0
  32. simstack/core/services/runner_manager.py +163 -0
  33. simstack/core/services/runner_status_service.py +10 -0
  34. simstack/core/services/slurm_status_service.py +67 -0
  35. simstack/core/services/stop_check_service.py +27 -0
  36. simstack/core/services/timeout_restart_service.py +26 -0
  37. simstack/core/simstack_result.py +39 -0
  38. simstack/core/submit_node.py +217 -0
  39. simstack/core/task_id.py +22 -0
  40. simstack/methods/__init__.py +0 -0
  41. simstack/methods/archive_files.py +292 -0
  42. simstack/methods/fire_and_forget_runner.py +113 -0
  43. simstack/methods/generate_test.py +125 -0
  44. simstack/methods/get_file.py +26 -0
  45. simstack/methods/mass_runner.py +154 -0
  46. simstack/methods/multiple_executor.py +307 -0
  47. simstack/methods/switch_git.py +16 -0
  48. simstack/methods/upload_helpers.py +81 -0
  49. simstack/models/__init__.py +74 -0
  50. simstack/models/array_list.py +21 -0
  51. simstack/models/array_storage.py +83 -0
  52. simstack/models/artifact_models.py +127 -0
  53. simstack/models/base_lists.py +51 -0
  54. simstack/models/base_types.py +209 -0
  55. simstack/models/charts_artifact.py +690 -0
  56. simstack/models/dataset.py +451 -0
  57. simstack/models/dataset_metadata.py +390 -0
  58. simstack/models/datasettuple.py +587 -0
  59. simstack/models/file_instance.py +150 -0
  60. simstack/models/file_list.py +45 -0
  61. simstack/models/files.py +424 -0
  62. simstack/models/fire_and_forget_result.py +19 -0
  63. simstack/models/images2d.py +113 -0
  64. simstack/models/log_entry_model.py +37 -0
  65. simstack/models/models.py +52 -0
  66. simstack/models/named_data_reference.py +36 -0
  67. simstack/models/node_registry.py +96 -0
  68. simstack/models/pandas_model.py +239 -0
  69. simstack/models/parameters.py +402 -0
  70. simstack/models/pickle_models.py +300 -0
  71. simstack/models/project.py +13 -0
  72. simstack/models/resource_assignment.py +170 -0
  73. simstack/models/resource_definition.py +125 -0
  74. simstack/models/runner_model.py +39 -0
  75. simstack/models/simple_table.py +79 -0
  76. simstack/models/simstack_model.py +97 -0
  77. simstack/models/slurm_info.py +17 -0
  78. simstack/models/table_artifact.py +87 -0
  79. simstack/models/tag.py +12 -0
  80. simstack/models/unused_test_file.py +5 -0
  81. simstack/simstack_marker.com +1 -0
  82. simstack/static/docs/.buildinfo +4 -0
  83. simstack/static/docs/_images/GUI Concept.webp +0 -0
  84. simstack/static/docs/_modules/index.html +434 -0
  85. simstack/static/docs/_modules/simstack/core/artifacts.html +743 -0
  86. simstack/static/docs/_modules/simstack/core/asnyc_helper.html +330 -0
  87. simstack/static/docs/_modules/simstack/core/config_file.html +379 -0
  88. simstack/static/docs/_modules/simstack/core/definitions.html +341 -0
  89. simstack/static/docs/_modules/simstack/core/engine.html +437 -0
  90. simstack/static/docs/_modules/simstack/core/find_simstack_modules.html +360 -0
  91. simstack/static/docs/_modules/simstack/core/hash.html +528 -0
  92. simstack/static/docs/_modules/simstack/core/node.html +1392 -0
  93. simstack/static/docs/_modules/simstack/core/node_claim.html +347 -0
  94. simstack/static/docs/_modules/simstack/core/node_runner.html +711 -0
  95. simstack/static/docs/_modules/simstack/core/process_results.html +418 -0
  96. simstack/static/docs/_modules/simstack/core/recompute_artifacts.html +433 -0
  97. simstack/static/docs/_modules/simstack/core/reset_db.html +328 -0
  98. simstack/static/docs/_modules/simstack/core/resource_assignment.html +553 -0
  99. simstack/static/docs/_modules/simstack/core/resources.html +424 -0
  100. simstack/static/docs/_modules/simstack/core/route_table.html +349 -0
  101. simstack/static/docs/_modules/simstack/core/run_docker.html +425 -0
  102. simstack/static/docs/_modules/simstack/core/run_node.html +390 -0
  103. simstack/static/docs/_modules/simstack/core/runner.html +491 -0
  104. simstack/static/docs/_modules/simstack/core/services/base_service.html +522 -0
  105. simstack/static/docs/_modules/simstack/core/services/file_transfer_service.html +436 -0
  106. simstack/static/docs/_modules/simstack/core/services/git_restart_service.html +331 -0
  107. simstack/static/docs/_modules/simstack/core/services/git_uv_update_service.html +427 -0
  108. simstack/static/docs/_modules/simstack/core/services/node_execution_service.html +507 -0
  109. simstack/static/docs/_modules/simstack/core/services/resource_branch_monitor_service.html +390 -0
  110. simstack/static/docs/_modules/simstack/core/services/runner_cleanup_service.html +468 -0
  111. simstack/static/docs/_modules/simstack/core/services/runner_manager.html +485 -0
  112. simstack/static/docs/_modules/simstack/core/services/runner_status_service.html +329 -0
  113. simstack/static/docs/_modules/simstack/core/services/slurm_status_service.html +386 -0
  114. simstack/static/docs/_modules/simstack/core/services/stop_check_service.html +346 -0
  115. simstack/static/docs/_modules/simstack/core/services/timeout_restart_service.html +345 -0
  116. simstack/static/docs/_modules/simstack/core/simstack_result.html +355 -0
  117. simstack/static/docs/_modules/simstack/core/submit_node.html +536 -0
  118. simstack/static/docs/_modules/simstack/core/task_id.html +344 -0
  119. simstack/static/docs/_modules/simstack/methods/archive_files.html +598 -0
  120. simstack/static/docs/_modules/simstack/methods/fire_and_forget_runner.html +432 -0
  121. simstack/static/docs/_modules/simstack/methods/generate_test.html +443 -0
  122. simstack/static/docs/_modules/simstack/methods/get_file.html +342 -0
  123. simstack/static/docs/_modules/simstack/methods/mass_runner.html +476 -0
  124. simstack/static/docs/_modules/simstack/methods/multiple_executor.html +674 -0
  125. simstack/static/docs/_modules/simstack/methods/switch_git.html +332 -0
  126. simstack/static/docs/_modules/simstack/methods/upload_helpers.html +403 -0
  127. simstack/static/docs/_modules/simstack/models/array_list.html +337 -0
  128. simstack/static/docs/_modules/simstack/models/array_storage.html +417 -0
  129. simstack/static/docs/_modules/simstack/models/base_lists.html +374 -0
  130. simstack/static/docs/_modules/simstack/models/base_types.html +588 -0
  131. simstack/static/docs/_modules/simstack/models/charts_artifact.html +1035 -0
  132. simstack/static/docs/_modules/simstack/models/dataset.html +866 -0
  133. simstack/static/docs/_modules/simstack/models/dataset_metadata.html +711 -0
  134. simstack/static/docs/_modules/simstack/models/datasettuple.html +1005 -0
  135. simstack/static/docs/_modules/simstack/models/file_instance.html +472 -0
  136. simstack/static/docs/_modules/simstack/models/file_list.html +367 -0
  137. simstack/static/docs/_modules/simstack/models/files.html +773 -0
  138. simstack/static/docs/_modules/simstack/models/fire_and_forget_result.html +335 -0
  139. simstack/static/docs/_modules/simstack/models/images2d.html +447 -0
  140. simstack/static/docs/_modules/simstack/models/log_entry_model.html +356 -0
  141. simstack/static/docs/_modules/simstack/models/models.html +374 -0
  142. simstack/static/docs/_modules/simstack/models/named_data_reference.html +355 -0
  143. simstack/static/docs/_modules/simstack/models/node_registry.html +415 -0
  144. simstack/static/docs/_modules/simstack/models/pandas_model.html +570 -0
  145. simstack/static/docs/_modules/simstack/models/parameters.html +739 -0
  146. simstack/static/docs/_modules/simstack/models/pickle_models.html +631 -0
  147. simstack/static/docs/_modules/simstack/models/project.html +329 -0
  148. simstack/static/docs/_modules/simstack/models/resource_assignment.html +501 -0
  149. simstack/static/docs/_modules/simstack/models/resource_definition.html +477 -0
  150. simstack/static/docs/_modules/simstack/models/runner_model.html +361 -0
  151. simstack/static/docs/_modules/simstack/models/simple_table.html +413 -0
  152. simstack/static/docs/_modules/simstack/models/simstack_model.html +416 -0
  153. simstack/static/docs/_modules/simstack/models/slurm_info.html +333 -0
  154. simstack/static/docs/_modules/simstack/models/table_artifact.html +406 -0
  155. simstack/static/docs/_modules/simstack/models/tag.html +328 -0
  156. simstack/static/docs/_modules/simstack/tables/model_table.html +519 -0
  157. simstack/static/docs/_modules/simstack/tables/node_children.html +538 -0
  158. simstack/static/docs/_modules/simstack/tables/node_table.html +854 -0
  159. simstack/static/docs/_modules/simstack/tables/table_builder.html +642 -0
  160. simstack/static/docs/_modules/simstack/util/async_zip_utils.html +337 -0
  161. simstack/static/docs/_modules/simstack/util/b64mixin.html +339 -0
  162. simstack/static/docs/_modules/simstack/util/cleaned_json_schema.html +336 -0
  163. simstack/static/docs/_modules/simstack/util/config_reader.html +498 -0
  164. simstack/static/docs/_modules/simstack/util/custom_model_dump.html +391 -0
  165. simstack/static/docs/_modules/simstack/util/database_information.html +488 -0
  166. simstack/static/docs/_modules/simstack/util/db.html +1392 -0
  167. simstack/static/docs/_modules/simstack/util/db_logger.html +448 -0
  168. simstack/static/docs/_modules/simstack/util/default_from_dict.html +376 -0
  169. simstack/static/docs/_modules/simstack/util/directory_iterator.html +553 -0
  170. simstack/static/docs/_modules/simstack/util/docstring_parser.html +526 -0
  171. simstack/static/docs/_modules/simstack/util/file_hashing.html +394 -0
  172. simstack/static/docs/_modules/simstack/util/file_transfer_client.html +791 -0
  173. simstack/static/docs/_modules/simstack/util/files.html +733 -0
  174. simstack/static/docs/_modules/simstack/util/find_python_files.html +349 -0
  175. simstack/static/docs/_modules/simstack/util/generate_ui_schema.html +396 -0
  176. simstack/static/docs/_modules/simstack/util/generic_list_mixin.html +487 -0
  177. simstack/static/docs/_modules/simstack/util/get_module_path.html +336 -0
  178. simstack/static/docs/_modules/simstack/util/git_pull.html +381 -0
  179. simstack/static/docs/_modules/simstack/util/git_repository_status.html +411 -0
  180. simstack/static/docs/_modules/simstack/util/import_module.html +377 -0
  181. simstack/static/docs/_modules/simstack/util/importer.html +637 -0
  182. simstack/static/docs/_modules/simstack/util/init_data_source.html +357 -0
  183. simstack/static/docs/_modules/simstack/util/make_graph.html +423 -0
  184. simstack/static/docs/_modules/simstack/util/make_table.html +1171 -0
  185. simstack/static/docs/_modules/simstack/util/mappings.html +378 -0
  186. simstack/static/docs/_modules/simstack/util/minimal_route_finder.html +388 -0
  187. simstack/static/docs/_modules/simstack/util/mock_db.html +472 -0
  188. simstack/static/docs/_modules/simstack/util/module_path_checker.html +354 -0
  189. simstack/static/docs/_modules/simstack/util/object_list_mixin.html +649 -0
  190. simstack/static/docs/_modules/simstack/util/path_manager.html +566 -0
  191. simstack/static/docs/_modules/simstack/util/project_root_finder.html +357 -0
  192. simstack/static/docs/_modules/simstack/util/queue_watcher.html +593 -0
  193. simstack/static/docs/_modules/simstack/util/resource_config.html +532 -0
  194. simstack/static/docs/_modules/simstack/util/route_finder.html +390 -0
  195. simstack/static/docs/_modules/simstack/util/runner_util.html +487 -0
  196. simstack/static/docs/_modules/simstack/util/runner_utils.html +468 -0
  197. simstack/static/docs/_modules/simstack/util/safe_code_executor.html +510 -0
  198. simstack/static/docs/_modules/simstack/util/sample_config.html +414 -0
  199. simstack/static/docs/_modules/simstack/util/sensitive_content_filter.html +364 -0
  200. simstack/static/docs/_modules/simstack/util/setup_logging.html +365 -0
  201. simstack/static/docs/_modules/simstack/util/submit_to_watchdog.html +425 -0
  202. simstack/static/docs/_modules/simstack/util/toml_reader.html +482 -0
  203. simstack/static/docs/_modules/simstack/util/transform_file_name.html +357 -0
  204. simstack/static/docs/_modules/simstack/util/ui_tools.html +541 -0
  205. simstack/static/docs/_sources/architecture.rst.txt +25 -0
  206. simstack/static/docs/_sources/array_lists.rst.txt +60 -0
  207. simstack/static/docs/_sources/ci_pipeline.rst.txt +34 -0
  208. simstack/static/docs/_sources/data.rst.txt +175 -0
  209. simstack/static/docs/_sources/database_migrations.rst.txt +310 -0
  210. simstack/static/docs/_sources/datasets.rst.txt +93 -0
  211. simstack/static/docs/_sources/developer_guide.rst.txt +25 -0
  212. simstack/static/docs/_sources/docker_nodes.rst.txt +149 -0
  213. simstack/static/docs/_sources/files.rst.txt +159 -0
  214. simstack/static/docs/_sources/fire_and_forget_runner.rst.txt +67 -0
  215. simstack/static/docs/_sources/index.rst.txt +25 -0
  216. simstack/static/docs/_sources/installation.rst.txt +213 -0
  217. simstack/static/docs/_sources/lists.rst.txt +111 -0
  218. simstack/static/docs/_sources/mass_runner.rst.txt +91 -0
  219. simstack/static/docs/_sources/misc.rst.txt +106 -0
  220. simstack/static/docs/_sources/overview.rst.txt +91 -0
  221. simstack/static/docs/_sources/recovery.rst.txt +38 -0
  222. simstack/static/docs/_sources/resource_config.rst.txt +141 -0
  223. simstack/static/docs/_sources/simstack/modules/modules.rst.txt +7 -0
  224. simstack/static/docs/_sources/simstack/modules/simstack.core.rst.txt +205 -0
  225. simstack/static/docs/_sources/simstack/modules/simstack.core.services.rst.txt +109 -0
  226. simstack/static/docs/_sources/simstack/modules/simstack.methods.rst.txt +77 -0
  227. simstack/static/docs/_sources/simstack/modules/simstack.models.rst.txt +261 -0
  228. simstack/static/docs/_sources/simstack/modules/simstack.rst.txt +22 -0
  229. simstack/static/docs/_sources/simstack/modules/simstack.tables.rst.txt +45 -0
  230. simstack/static/docs/_sources/simstack/modules/simstack.util.rst.txt +381 -0
  231. simstack/static/docs/_sources/submit.rst.txt +141 -0
  232. simstack/static/docs/_sources/tables.rst.txt +50 -0
  233. simstack/static/docs/_sources/testing_complex_nodes.rst.txt +92 -0
  234. simstack/static/docs/_sources/ui_documentation.rst.txt +272 -0
  235. simstack/static/docs/_sources/workflows.rst.txt +446 -0
  236. simstack/static/docs/_static/base-stemmer.js +476 -0
  237. simstack/static/docs/_static/basic.css +906 -0
  238. simstack/static/docs/_static/cobalt2-theme.css +1 -0
  239. simstack/static/docs/_static/debug.css +69 -0
  240. simstack/static/docs/_static/docs-build-badge.css +51 -0
  241. simstack/static/docs/_static/docs-build-badge.js +51 -0
  242. simstack/static/docs/_static/doctools.js +150 -0
  243. simstack/static/docs/_static/documentation_options.js +13 -0
  244. simstack/static/docs/_static/english-stemmer.js +1066 -0
  245. simstack/static/docs/_static/file.png +0 -0
  246. simstack/static/docs/_static/language_data.js +13 -0
  247. simstack/static/docs/_static/minus.png +0 -0
  248. simstack/static/docs/_static/plus.png +0 -0
  249. simstack/static/docs/_static/pygments.css +250 -0
  250. simstack/static/docs/_static/scripts/furo-extensions.js +0 -0
  251. simstack/static/docs/_static/scripts/furo.js +3 -0
  252. simstack/static/docs/_static/scripts/furo.js.LICENSE.txt +7 -0
  253. simstack/static/docs/_static/scripts/furo.js.map +1 -0
  254. simstack/static/docs/_static/searchtools.js +693 -0
  255. simstack/static/docs/_static/skeleton.css +296 -0
  256. simstack/static/docs/_static/sphinx_highlight.js +159 -0
  257. simstack/static/docs/_static/styles/furo-extensions.css +2 -0
  258. simstack/static/docs/_static/styles/furo-extensions.css.map +1 -0
  259. simstack/static/docs/_static/styles/furo.css +2 -0
  260. simstack/static/docs/_static/styles/furo.css.map +1 -0
  261. simstack/static/docs/architecture.html +340 -0
  262. simstack/static/docs/array_lists.html +678 -0
  263. simstack/static/docs/ci_pipeline.html +385 -0
  264. simstack/static/docs/data.html +545 -0
  265. simstack/static/docs/database_migrations.html +652 -0
  266. simstack/static/docs/datasets.html +1268 -0
  267. simstack/static/docs/developer_guide.html +359 -0
  268. simstack/static/docs/docker_nodes.html +503 -0
  269. simstack/static/docs/files.html +718 -0
  270. simstack/static/docs/fire_and_forget_runner.html +641 -0
  271. simstack/static/docs/genindex.html +6390 -0
  272. simstack/static/docs/index.html +516 -0
  273. simstack/static/docs/installation.html +553 -0
  274. simstack/static/docs/lists.html +478 -0
  275. simstack/static/docs/mass_runner.html +481 -0
  276. simstack/static/docs/misc.html +454 -0
  277. simstack/static/docs/objects.inv +0 -0
  278. simstack/static/docs/overview.html +469 -0
  279. simstack/static/docs/py-modindex.html +1111 -0
  280. simstack/static/docs/recovery.html +371 -0
  281. simstack/static/docs/resource_config.html +590 -0
  282. simstack/static/docs/search.html +327 -0
  283. simstack/static/docs/searchindex.js +1 -0
  284. simstack/static/docs/simstack/modules/modules.html +489 -0
  285. simstack/static/docs/simstack/modules/simstack.core.html +1883 -0
  286. simstack/static/docs/simstack/modules/simstack.core.services.html +698 -0
  287. simstack/static/docs/simstack/modules/simstack.html +3060 -0
  288. simstack/static/docs/simstack/modules/simstack.methods.html +1150 -0
  289. simstack/static/docs/simstack/modules/simstack.models.html +13113 -0
  290. simstack/static/docs/simstack/modules/simstack.tables.html +635 -0
  291. simstack/static/docs/simstack/modules/simstack.util.html +3320 -0
  292. simstack/static/docs/submit.html +487 -0
  293. simstack/static/docs/tables.html +539 -0
  294. simstack/static/docs/testing_complex_nodes.html +458 -0
  295. simstack/static/docs/ui_documentation.html +788 -0
  296. simstack/static/docs/workflows.html +766 -0
  297. simstack/tables/__init__.py +0 -0
  298. simstack/tables/model_table.py +191 -0
  299. simstack/tables/node_children.py +219 -0
  300. simstack/tables/node_table.py +517 -0
  301. simstack/tables/table_builder.py +314 -0
  302. simstack/util/__init__.py +0 -0
  303. simstack/util/async_zip_utils.py +18 -0
  304. simstack/util/b64mixin.py +23 -0
  305. simstack/util/cleaned_json_schema.py +20 -0
  306. simstack/util/config_reader.py +179 -0
  307. simstack/util/custom_model_dump.py +75 -0
  308. simstack/util/database_information.py +160 -0
  309. simstack/util/db.py +1013 -0
  310. simstack/util/db_logger.py +117 -0
  311. simstack/util/default_from_dict.py +57 -0
  312. simstack/util/directory_iterator.py +216 -0
  313. simstack/util/docstring_parser.py +186 -0
  314. simstack/util/file_hashing.py +72 -0
  315. simstack/util/file_transfer_client.py +427 -0
  316. simstack/util/files.py +396 -0
  317. simstack/util/find_python_files.py +33 -0
  318. simstack/util/generate_ui_schema.py +80 -0
  319. simstack/util/generic_list_mixin.py +120 -0
  320. simstack/util/geometry_utils.py +118 -0
  321. simstack/util/get_module_path.py +20 -0
  322. simstack/util/git_pull.py +65 -0
  323. simstack/util/git_repository_status.py +95 -0
  324. simstack/util/import_module.py +63 -0
  325. simstack/util/importer.py +312 -0
  326. simstack/util/init_data_source.py +41 -0
  327. simstack/util/make_graph.py +107 -0
  328. simstack/util/make_table.py +837 -0
  329. simstack/util/mappings.py +41 -0
  330. simstack/util/minimal_route_finder.py +72 -0
  331. simstack/util/mock_db.py +144 -0
  332. simstack/util/module_path_checker.py +38 -0
  333. simstack/util/object_list_mixin.py +282 -0
  334. simstack/util/path_manager.py +223 -0
  335. simstack/util/project_root_finder.py +41 -0
  336. simstack/util/queue_watcher.py +262 -0
  337. simstack/util/resource_config.py +198 -0
  338. simstack/util/route_finder.py +74 -0
  339. simstack/util/runner_util.py +166 -0
  340. simstack/util/runner_utils.py +143 -0
  341. simstack/util/safe_code_executor.py +194 -0
  342. simstack/util/sample_config.py +98 -0
  343. simstack/util/sensitive_content_filter.py +48 -0
  344. simstack/util/setup_logging.py +49 -0
  345. simstack/util/submit_to_watchdog.py +106 -0
  346. simstack/util/toml_reader.py +142 -0
  347. simstack/util/transform_file_name.py +41 -0
  348. simstack/util/ui_tools.py +213 -0
  349. simstack-2.0.1.dist-info/METADATA +454 -0
  350. simstack-2.0.1.dist-info/RECORD +354 -0
  351. simstack-2.0.1.dist-info/WHEEL +5 -0
  352. simstack-2.0.1.dist-info/entry_points.txt +12 -0
  353. simstack-2.0.1.dist-info/licenses/LICENSE +21 -0
  354. simstack-2.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,81 @@
1
+ import zipfile
2
+ import tarfile
3
+ import os
4
+ from pathlib import Path
5
+
6
+ from simstack.core.context import context
7
+ from simstack.core.node import node
8
+ from simstack.models import FileListModel
9
+ from simstack.models.files import FileStack
10
+
11
+
12
+ @node
13
+ async def archive_upload(file_upload: FileStack, **kwargs):
14
+ """
15
+ Asynchronously processes a file upload, extracts files from supported archive formats
16
+ (.zip, .tar, .tar.gz), and returns a list of extracted files wrapped in FileStack
17
+ instances. If the file is not an archive, it is added as-is to the output.
18
+
19
+ Args:
20
+ file_upload (FileStack): The uploaded file to be processed.
21
+ **kwargs: Additional keyword arguments.
22
+ node_runner: An optional object for logging or processing context. If supplied,
23
+ it will log file paths and extraction details using its `info` method.
24
+
25
+ Returns:
26
+ FileListModel: A model containing a list of FileStack instances representing
27
+ the extracted files or the original file if it is not an archive.
28
+ """
29
+ node_runner = kwargs.get('node_runner', None)
30
+ local_file = file_upload.get()
31
+
32
+ local_file_path = Path(local_file)
33
+ node_runner.info(f"Local file path: {local_file_path}")
34
+ extract_dir = local_file_path.parent
35
+
36
+ output_file_list = FileListModel(field_name="extracted_files")
37
+ if local_file_path.suffix == '.zip':
38
+ with zipfile.ZipFile(local_file_path, 'r') as zip_ref:
39
+ node_runner.info(f"Extracting files from {local_file_path} to {extract_dir}")
40
+ zip_ref.extractall(extract_dir)
41
+
42
+ for root, dirs, files in os.walk(extract_dir):
43
+ for file in files:
44
+ file_path = Path(root) / file
45
+ if file_path != local_file_path:
46
+ node_runner.info(f"Storing extracted file: {file_path}")
47
+ file_stack = FileStack.from_local_file(file_path, in_memory=True, is_hashable=True, secure_source=True)
48
+ output_file_list.append(file_stack)
49
+
50
+ elif local_file_path.suffix == '.tar' or local_file_path.name.endswith('.tar.gz'):
51
+ with tarfile.open(local_file_path, 'r:*') as tar_ref:
52
+ node_runner.info(f"Extracting files from {local_file_path} to {extract_dir}")
53
+ tar_ref.extractall(extract_dir)
54
+
55
+ for root, dirs, files in os.walk(extract_dir):
56
+ for file in files:
57
+ file_path = Path(root) / file
58
+ if file_path != local_file_path:
59
+ node_runner.info(f"Storing extracted file: {file_path}")
60
+ file_stack = FileStack.from_local_file(file_path, in_memory=True, is_hashable=True, secure_source=True)
61
+ output_file_list.append(file_stack)
62
+ else:
63
+ output_file_list.append(file_upload)
64
+
65
+ return output_file_list
66
+
67
+ @node
68
+ async def file_list_upload_test(file_list: FileListModel,**kwargs):
69
+ node_runner = kwargs.get('node_runner', None)
70
+ # Ensure cache is loaded before iterating synchronously
71
+ for file_stack in file_list:
72
+ local_file = file_stack.get()
73
+ node_runner.info(f"Local file path: {local_file}")
74
+ return True
75
+
76
+ @node
77
+ async def file_list_upload_all(file_stack: FileStack,**kwargs):
78
+ file_list = await archive_upload(file_stack, **kwargs)
79
+ unpacked = await file_list_upload_test(file_list, **kwargs)
80
+ return unpacked
81
+
@@ -0,0 +1,74 @@
1
+ from .fire_and_forget_result import FireAndForgetResult
2
+ from .simstack_model import simstack_model
3
+ from .artifact_models import ArtifactMapping, ArtifactModel
4
+ from .base_types import (
5
+ IntData,
6
+ FloatData,
7
+ StringData,
8
+ BooleanData,
9
+ BinaryOperationInput,
10
+ IteratorInput,
11
+ )
12
+ from .base_lists import StringDataList, StringList
13
+ from .array_list import ArrayList
14
+ from .file_list import FileList, FileListModel
15
+ from .models import (
16
+ ModelMapping,
17
+ NodeModel,
18
+ )
19
+ from .files import FileStack
20
+ from .parameters import Parameters
21
+ from .node_registry import NodeRegistry
22
+ from .named_data_reference import NamedDataReference
23
+ from .project import Project
24
+ from .tag import Tag
25
+ from .resource_assignment import ResourceAssignmentRule, SlurmParametersPatch
26
+ from .datasettuple import (
27
+ DataSetTuple,
28
+ DataSetTupleSection,
29
+ DataSetTupleSelection,
30
+ DataSetTupleSelectionField,
31
+ )
32
+ from .dataset import DataSet, DataSetSection, DataSetSelection, DataSetSelectionField
33
+ from .dataset_metadata import DataSetMetadata, DataSetMetadataTemplate
34
+ from .images2d import Image2DArtifactModel
35
+
36
+
37
+ __all__ = [
38
+ "FireAndForgetResult",
39
+ "ModelMapping",
40
+ "NodeModel",
41
+ "IntData",
42
+ "FloatData",
43
+ "StringData",
44
+ "BooleanData",
45
+ "ArrayList",
46
+ "BinaryOperationInput",
47
+ "IteratorInput",
48
+ "ArtifactMapping",
49
+ "ArtifactModel",
50
+ "FileListModel",
51
+ "Parameters",
52
+ "NodeRegistry",
53
+ "NamedDataReference",
54
+ "FileStack",
55
+ "Project",
56
+ "Tag",
57
+ "ResourceAssignmentRule",
58
+ "SlurmParametersPatch",
59
+ "simstack_model",
60
+ "DataSet",
61
+ "DataSetSection",
62
+ "DataSetSelection",
63
+ "DataSetTuple",
64
+ "DataSetTupleSection",
65
+ "DataSetTupleSelectionField",
66
+ "DataSetMetadata",
67
+ "DataSetSelectionField",
68
+ "DataSetTupleSelection",
69
+ "FileList",
70
+ "DataSetMetadataTemplate",
71
+ "Image2DArtifactModel",
72
+ "StringDataList",
73
+ "StringList",
74
+ ]
@@ -0,0 +1,21 @@
1
+ from typing import List, Optional
2
+
3
+ from odmantic import Model, Field, ObjectId
4
+
5
+ from simstack.models import simstack_model
6
+ from simstack.models.array_storage import ArrayStorage
7
+ from simstack.util.object_list_mixin import ObjectListMixin
8
+
9
+ @simstack_model
10
+ class ArrayList(Model, ObjectListMixin[ArrayStorage]):
11
+ elements: List[ObjectId] = Field(default_factory=list)
12
+
13
+ def __init__(self, **data):
14
+ data, cache = self._normalize_elements_for_init(data)
15
+ Model.__init__(self, **data)
16
+ if cache is not None:
17
+ self._set_cache(cache)
18
+
19
+ def __iter__(self):
20
+ return ObjectListMixin.__iter__(self)
21
+
@@ -0,0 +1,83 @@
1
+ import json
2
+ import zlib
3
+ from typing import Optional
4
+
5
+ from odmantic import Model
6
+ from pydantic import model_validator
7
+
8
+ from simstack.models.simstack_model import simstack_model
9
+ from simstack.util.ui_tools import ui_hide_fields
10
+ from simstack.util.b64mixin import BytesB64Mixin
11
+
12
+
13
+ @simstack_model
14
+ class ArrayStorage(BytesB64Mixin, Model):
15
+ name: Optional[str]
16
+ shape: Optional[str] = None # Store array shape as string like "3,3"
17
+ field_name: Optional[str] = None # Store flattened array data as compressed JSON
18
+ data_json: Optional[str] = None
19
+
20
+ @model_validator(mode='before')
21
+ @classmethod
22
+ def copy_name_to_field_name(cls, values):
23
+ if isinstance(values, dict) and 'name' in values and 'field_name' not in values:
24
+ values['field_name'] = values['name']
25
+ return values
26
+
27
+ def set_array(self, array):
28
+ """Store a numpy array"""
29
+ self.shape = ",".join(str(dim) for dim in array.shape)
30
+ data_str = json.dumps(array.flatten().tolist())
31
+ self.data_json = self._compress_bytes(data_str.encode())
32
+
33
+
34
+ def get_array(self):
35
+ """Retrieve the numpy array"""
36
+ import numpy as np
37
+
38
+ shape = tuple(int(dim) for dim in self.shape.split(",")) if self.shape else ()
39
+ flat_array = np.array([])
40
+ if self.data_json:
41
+ try:
42
+ # Try to decompress assuming it's compressed
43
+ data_str = self._decompress_bytes(self.data_json).decode()
44
+ except (zlib.error, Exception):
45
+ # If decompression fails, treat as uncompressed
46
+ data_str = self.data_json
47
+ flat_array = np.array(json.loads(data_str))
48
+ return flat_array.reshape(shape)
49
+
50
+ @property
51
+ def array(self):
52
+ """Property getter for array"""
53
+ return self.get_array()
54
+
55
+ @array.setter
56
+ def array(self, value):
57
+ """Property setter for array"""
58
+ self.set_array(value)
59
+
60
+ def make_table_entries(
61
+ self,
62
+ max_recursion_level=1,
63
+ drop_id=True,
64
+ current_level=0,
65
+ visited=None,
66
+ field_prefix="",
67
+ ):
68
+ return {"name": self.name}
69
+
70
+ def make_column_defs_instance(
71
+ self,
72
+ table_name=None,
73
+ max_recursion_level=1,
74
+ drop_id=True,
75
+ current_level=0,
76
+ visited=None,
77
+ field_prefix="",
78
+ ):
79
+ return [{"field": "name", "headerName": "Array"}]
80
+
81
+ @classmethod
82
+ def ui_schema(cls, **kwargs) -> dict:
83
+ return ui_hide_fields({}, ["shape", "field_name"])
@@ -0,0 +1,127 @@
1
+ from typing import Optional, Dict, Any
2
+
3
+ from odmantic import Field, Model
4
+
5
+ from simstack.models.pickle_models import FunctionPickle
6
+ from simstack.models.simstack_model import simstack_model
7
+
8
+
9
+ # class ArtifactList(list):
10
+ # """A list that knows how to update its parent Artifact when modified."""
11
+ #
12
+ # def __init__(self, parent_artifact, key, initial_values=None):
13
+ # super().__init__(initial_values or [])
14
+ # self.parent_artifact = parent_artifact
15
+ # self.key = key
16
+ #
17
+ # def append(self, value):
18
+ # super().append(value)
19
+ # self.parent_artifact[self.key] = self # Update the parent
20
+ #
21
+ # def extend(self, values):
22
+ # super().extend(values)
23
+ # self.parent_artifact[self.key] = self # Update the parent
24
+ #
25
+ # # Add other list methods that modify the list
26
+ # def __setitem__(self, index, value):
27
+ # super().__setitem__(index, value)
28
+ # self.parent_artifact[self.key] = self
29
+ #
30
+ # def __delitem__(self, index):
31
+ # super().__delitem__(index)
32
+ # self.parent_artifact[self.key] = self
33
+ #
34
+ # def insert(self, index, value):
35
+ # super().insert(index, value)
36
+ # self.parent_artifact[self.key] = self
37
+ #
38
+ # def pop(self, index=-1):
39
+ # value = super().pop(index)
40
+ # self.parent_artifact[self.key] = self
41
+ # return value
42
+ #
43
+ # def remove(self, value):
44
+ # super().remove(value)
45
+ # self.parent_artifact[self.key] = self
46
+ #
47
+ # def clear(self):
48
+ # super().clear()
49
+ # self.parent_artifact[self.key] = self
50
+ #
51
+ # def sort(self, *args, **kwargs):
52
+ # super().sort(*args, **kwargs)
53
+ # self.parent_artifact[self.key] = self
54
+ #
55
+ # def reverse(self):
56
+ # super().reverse()
57
+ # self.parent_artifact[self.key] = self
58
+
59
+
60
+ @simstack_model
61
+ class ArtifactModel(Model):
62
+ name: str
63
+ description: Optional[str] = None
64
+ data: Dict[str, Any] = Field(default_factory=dict)
65
+ path: Optional[str] = None
66
+
67
+ model_config = {
68
+ "collection": "artifacts" # All subclasses will use the same collection
69
+ }
70
+
71
+
72
+ # class IntArtifactModel(ArtifactModel):
73
+ # type: Literal["int"] = "int" # Fixed value for this subclass
74
+ # value: int
75
+ #
76
+ # class FloatArtifactModel(ArtifactModel):
77
+ # type: Literal["float"] = "float" # Fixed value for this subclass
78
+ # value: float
79
+ #
80
+ # class StringArtifactModel(ArtifactModel):
81
+ # type: Literal["string"] = "string" # Fixed value for this subclass
82
+ # value: str
83
+ #
84
+ # class ImageArtifactModel(ArtifactModel):
85
+ # type: Literal["image"] = "image" # Fixed value for this subclass
86
+ # value: str # the image is stored as a base64 string or a file path
87
+ #
88
+ # # Forward reference for type hints
89
+ # ArtifactType = Union[ArtifactModel, IntArtifactModel, FloatArtifactModel, StringArtifactModel, 'ArtifactModelList', ImageArtifactModel]
90
+ #
91
+ # # List subclass - can contain other items
92
+ # class ArtifactModelList(ArtifactModel):
93
+ # type: Literal["list"] = "list"
94
+ # items: List[ArtifactType] = Field(default_factory=list) # List of Item objects
95
+
96
+
97
+ class ArtifactMapping(Model):
98
+ """
99
+ ArtifactsMapper is a mapping between the artifact and a node registry-path.
100
+ The workflow executor passes a path of the type
101
+
102
+ node1.node2.node4. ... .nodeN
103
+
104
+ where node is the function name of the node
105
+
106
+ Regex can maps this to the target path of the ArtifactsMapping, e.g. a path
107
+
108
+ *.parent1.node
109
+
110
+ it would map on all nodes with name node that have been directly called by a node with the name parent1.
111
+
112
+
113
+ """
114
+
115
+ name: str = Field(default="artifact", unique=True)
116
+ regex_pattern: str = Field(default="")
117
+ function_mapping: str = Field(default="")
118
+ function_code: str = Field(default="")
119
+ pickle_function: Optional[FunctionPickle] = None
120
+
121
+ def set_values(self, other: "ArtifactMapping") -> "ArtifactMapping":
122
+ self.name = other.name
123
+ self.regex_pattern = other.regex_pattern
124
+ self.function_mapping = other.function_mapping
125
+ self.function_code = other.function_code
126
+ self.pickle_function = other.pickle_function
127
+ return self
@@ -0,0 +1,51 @@
1
+ from typing import Iterator, List, TypeVar
2
+
3
+ from odmantic import Field, Model, ObjectId
4
+
5
+ from simstack.models.base_types import BooleanData, StringData
6
+ from simstack.models.simstack_model import simstack_model
7
+ from simstack.util.generic_list_mixin import GenericListMixin
8
+ from simstack.util.object_list_mixin import ObjectListMixin
9
+
10
+ T = TypeVar("T")
11
+
12
+ @simstack_model
13
+ class StringDataList(Model, ObjectListMixin[StringData]):
14
+ field_name: str = "string_data_list"
15
+ elements: List[ObjectId] = Field(default_factory=list, description="List of StringData ObjectIDs")
16
+
17
+ def __iter__(self) -> Iterator[StringData]:
18
+ return ObjectListMixin.__iter__(self)
19
+
20
+ def __init__(self, **data):
21
+ data, cache = self._normalize_elements_for_init(data)
22
+ Model.__init__(self, **data)
23
+ if cache is not None:
24
+ self._set_cache(cache)
25
+
26
+
27
+ @simstack_model
28
+ class BooleanDataList(Model, ObjectListMixin[BooleanData]):
29
+ field_name: str = "boolean_data_list"
30
+ elements: List[ObjectId] = Field(default_factory=list, description="List of BooleanData ObjectIDs")
31
+
32
+ def __iter__(self) -> Iterator[BooleanData]:
33
+ return ObjectListMixin.__iter__(self)
34
+
35
+ def __init__(self, **data):
36
+ data, cache = self._normalize_elements_for_init(data)
37
+ Model.__init__(self, **data)
38
+ if cache is not None:
39
+ self._set_cache(cache)
40
+
41
+
42
+ @simstack_model
43
+ class StringList(Model, GenericListMixin[str]):
44
+ field_name: str = "string_list"
45
+ elements: List[str] = Field(default_factory=list, description="List of strings")
46
+
47
+ def __iter__(self) -> Iterator[T]:
48
+ return iter(self.elements)
49
+
50
+ def __len__(self) -> int:
51
+ return len(self.elements)
@@ -0,0 +1,209 @@
1
+ from odmantic import Model, Reference
2
+ from pydantic import model_validator
3
+
4
+ from simstack.models import simstack_model
5
+
6
+
7
+ @simstack_model
8
+ class IntData(Model):
9
+ field_name: str = "int"
10
+ value: int
11
+
12
+ @model_validator(mode="before")
13
+ @classmethod
14
+ def ensure_fieldname(cls, data):
15
+ """Ensure fieldname is set for existing documents"""
16
+ if isinstance(data, dict) and "field_name" not in data:
17
+ data["field_name"] = "int"
18
+ return data
19
+
20
+ def make_table_entries(
21
+ self,
22
+ max_recursion_level=1,
23
+ drop_id=True,
24
+ current_level=0,
25
+ visited=None,
26
+ field_prefix="",
27
+ ):
28
+ return {self.field_name: self.value}
29
+
30
+ def make_column_defs_instance(
31
+ self,
32
+ table_name=None,
33
+ max_recursion_level=1,
34
+ drop_id=True,
35
+ current_level=0,
36
+ visited=None,
37
+ field_prefix="",
38
+ ):
39
+ return [
40
+ {
41
+ "field": self.field_name,
42
+ "headerName": self.field_name,
43
+ "type": "numericColumn",
44
+ }
45
+ ]
46
+
47
+ @classmethod
48
+ def ui_schema(cls, **kwargs) -> dict:
49
+ return {
50
+ "ui:field": "IntDataField"
51
+ } # This tells RJSF to use the custom component
52
+
53
+
54
+ @simstack_model
55
+ class FloatData(Model):
56
+ field_name: str = "float"
57
+ value: float
58
+
59
+ @model_validator(mode="before")
60
+ @classmethod
61
+ def ensure_fieldname(cls, data):
62
+ """Ensure fieldname is set for existing documents"""
63
+ if isinstance(data, dict) and "field_name" not in data:
64
+ data["field_name"] = "float"
65
+ return data
66
+
67
+ def make_table_entries(
68
+ self,
69
+ max_recursion_level=1,
70
+ drop_id=True,
71
+ current_level=0,
72
+ visited=None,
73
+ field_prefix="",
74
+ ):
75
+ return {self.field_name: self.value}
76
+
77
+ def make_column_defs_instance(
78
+ self,
79
+ table_name=None,
80
+ max_recursion_level=1,
81
+ drop_id=True,
82
+ current_level=0,
83
+ visited=None,
84
+ field_prefix="",
85
+ ):
86
+ return [
87
+ {
88
+ "field": self.field_name,
89
+ "headerName": self.field_name,
90
+ "type": "numericColumn",
91
+ }
92
+ ]
93
+
94
+ @classmethod
95
+ def ui_schema(cls, **kwargs) -> dict:
96
+ return {
97
+ "ui:field": "FloatDataField"
98
+ } # This tells RJSF to use the custom component
99
+
100
+
101
+ @simstack_model
102
+ class StringData(Model):
103
+ field_name: str = "text"
104
+ value: str
105
+
106
+ @model_validator(mode="before")
107
+ @classmethod
108
+ def ensure_fieldname(cls, data):
109
+ """Ensure fieldname is set for existing documents"""
110
+ if isinstance(data, dict) and "field_name" not in data:
111
+ data["field_name"] = "text"
112
+ return data
113
+
114
+ def make_table_entries(
115
+ self,
116
+ max_recursion_level=1,
117
+ drop_id=True,
118
+ current_level=0,
119
+ visited=None,
120
+ field_prefix="",
121
+ ):
122
+ return {self.field_name: self.value}
123
+
124
+ def make_column_defs_instance(
125
+ self,
126
+ table_name=None,
127
+ max_recursion_level=1,
128
+ drop_id=True,
129
+ current_level=0,
130
+ visited=None,
131
+ field_prefix="",
132
+ ):
133
+ return [
134
+ {
135
+ "field": self.field_name,
136
+ "headerName": self.field_name,
137
+ "type": "textColumn",
138
+ }
139
+ ]
140
+
141
+ @classmethod
142
+ def ui_schema(cls, **kwargs) -> dict:
143
+ return {
144
+ "ui:field": "StringDataField"
145
+ } # This tells RJSF to use the custom component
146
+
147
+
148
+ @simstack_model
149
+ class BooleanData(Model):
150
+ field_name: str = "boolean"
151
+ value: bool
152
+
153
+ @model_validator(mode="before")
154
+ @classmethod
155
+ def ensure_fieldname(cls, data):
156
+ """Ensure fieldname is set for existing documents"""
157
+ if isinstance(data, dict) and "field_name" not in data:
158
+ data["field_name"] = "boolean"
159
+ return data
160
+
161
+ def make_table_entries(
162
+ self,
163
+ max_recursion_level=1,
164
+ drop_id=True,
165
+ current_level=0,
166
+ visited=None,
167
+ field_prefix="",
168
+ ):
169
+ return {self.field_name: self.value}
170
+
171
+ def make_column_defs_instance(
172
+ self,
173
+ table_name=None,
174
+ max_recursion_level=1,
175
+ drop_id=True,
176
+ current_level=0,
177
+ visited=None,
178
+ field_prefix="",
179
+ ):
180
+ return [
181
+ {
182
+ "field": self.field_name,
183
+ "headerName": self.field_name,
184
+ "type": "booleanColumn",
185
+ }
186
+ ]
187
+
188
+ @classmethod
189
+ def ui_schema(cls, **kwargs) -> dict:
190
+ return {
191
+ "ui:field": "BooleanDataField"
192
+ } # This tells RJSF to use the custom component
193
+
194
+
195
+ @simstack_model
196
+ class BinaryOperationInput(Model):
197
+ field_name: str = "binary_operation"
198
+ arg1: FloatData = Reference()
199
+ arg2: FloatData = Reference()
200
+
201
+ def __str__(self):
202
+ return f"BinaryOperationInput(arg1={self.arg1}, arg2={self.arg2})"
203
+
204
+
205
+ @simstack_model
206
+ class IteratorInput(Model):
207
+ start: int
208
+ stop: int
209
+ generator: str = "range"