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.
- simstack/__init__.py +0 -0
- simstack/_version.py +24 -0
- simstack/core/__init__.py +0 -0
- simstack/core/artifacts.py +406 -0
- simstack/core/asnyc_helper.py +14 -0
- simstack/core/config_file.py +60 -0
- simstack/core/context.py +283 -0
- simstack/core/definitions.py +22 -0
- simstack/core/engine.py +115 -0
- simstack/core/find_simstack_modules.py +41 -0
- simstack/core/hash.py +179 -0
- simstack/core/node.py +1137 -0
- simstack/core/node_claim.py +31 -0
- simstack/core/node_runner.py +362 -0
- simstack/core/process_results.py +102 -0
- simstack/core/recompute_artifacts.py +117 -0
- simstack/core/reset_db.py +12 -0
- simstack/core/resource_assignment.py +222 -0
- simstack/core/resources.py +90 -0
- simstack/core/route_table.py +24 -0
- simstack/core/run_docker.py +109 -0
- simstack/core/run_node.py +71 -0
- simstack/core/runner.py +169 -0
- simstack/core/services/__init__.py +11 -0
- simstack/core/services/base_service.py +191 -0
- simstack/core/services/file_transfer_service.py +117 -0
- simstack/core/services/git_restart_service.py +12 -0
- simstack/core/services/git_uv_update_service.py +105 -0
- simstack/core/services/node_execution_service.py +182 -0
- simstack/core/services/resource_branch_monitor_service.py +71 -0
- simstack/core/services/runner_cleanup_service.py +149 -0
- simstack/core/services/runner_manager.py +163 -0
- simstack/core/services/runner_status_service.py +10 -0
- simstack/core/services/slurm_status_service.py +67 -0
- simstack/core/services/stop_check_service.py +27 -0
- simstack/core/services/timeout_restart_service.py +26 -0
- simstack/core/simstack_result.py +39 -0
- simstack/core/submit_node.py +217 -0
- simstack/core/task_id.py +22 -0
- simstack/methods/__init__.py +0 -0
- simstack/methods/archive_files.py +292 -0
- simstack/methods/fire_and_forget_runner.py +113 -0
- simstack/methods/generate_test.py +125 -0
- simstack/methods/get_file.py +26 -0
- simstack/methods/mass_runner.py +154 -0
- simstack/methods/multiple_executor.py +307 -0
- simstack/methods/switch_git.py +16 -0
- simstack/methods/upload_helpers.py +81 -0
- simstack/models/__init__.py +74 -0
- simstack/models/array_list.py +21 -0
- simstack/models/array_storage.py +83 -0
- simstack/models/artifact_models.py +127 -0
- simstack/models/base_lists.py +51 -0
- simstack/models/base_types.py +209 -0
- simstack/models/charts_artifact.py +690 -0
- simstack/models/dataset.py +451 -0
- simstack/models/dataset_metadata.py +390 -0
- simstack/models/datasettuple.py +587 -0
- simstack/models/file_instance.py +150 -0
- simstack/models/file_list.py +45 -0
- simstack/models/files.py +424 -0
- simstack/models/fire_and_forget_result.py +19 -0
- simstack/models/images2d.py +113 -0
- simstack/models/log_entry_model.py +37 -0
- simstack/models/models.py +52 -0
- simstack/models/named_data_reference.py +36 -0
- simstack/models/node_registry.py +96 -0
- simstack/models/pandas_model.py +239 -0
- simstack/models/parameters.py +402 -0
- simstack/models/pickle_models.py +300 -0
- simstack/models/project.py +13 -0
- simstack/models/resource_assignment.py +170 -0
- simstack/models/resource_definition.py +125 -0
- simstack/models/runner_model.py +39 -0
- simstack/models/simple_table.py +79 -0
- simstack/models/simstack_model.py +97 -0
- simstack/models/slurm_info.py +17 -0
- simstack/models/table_artifact.py +87 -0
- simstack/models/tag.py +12 -0
- simstack/models/unused_test_file.py +5 -0
- simstack/simstack_marker.com +1 -0
- simstack/static/docs/.buildinfo +4 -0
- simstack/static/docs/_images/GUI Concept.webp +0 -0
- simstack/static/docs/_modules/index.html +434 -0
- simstack/static/docs/_modules/simstack/core/artifacts.html +743 -0
- simstack/static/docs/_modules/simstack/core/asnyc_helper.html +330 -0
- simstack/static/docs/_modules/simstack/core/config_file.html +379 -0
- simstack/static/docs/_modules/simstack/core/definitions.html +341 -0
- simstack/static/docs/_modules/simstack/core/engine.html +437 -0
- simstack/static/docs/_modules/simstack/core/find_simstack_modules.html +360 -0
- simstack/static/docs/_modules/simstack/core/hash.html +528 -0
- simstack/static/docs/_modules/simstack/core/node.html +1392 -0
- simstack/static/docs/_modules/simstack/core/node_claim.html +347 -0
- simstack/static/docs/_modules/simstack/core/node_runner.html +711 -0
- simstack/static/docs/_modules/simstack/core/process_results.html +418 -0
- simstack/static/docs/_modules/simstack/core/recompute_artifacts.html +433 -0
- simstack/static/docs/_modules/simstack/core/reset_db.html +328 -0
- simstack/static/docs/_modules/simstack/core/resource_assignment.html +553 -0
- simstack/static/docs/_modules/simstack/core/resources.html +424 -0
- simstack/static/docs/_modules/simstack/core/route_table.html +349 -0
- simstack/static/docs/_modules/simstack/core/run_docker.html +425 -0
- simstack/static/docs/_modules/simstack/core/run_node.html +390 -0
- simstack/static/docs/_modules/simstack/core/runner.html +491 -0
- simstack/static/docs/_modules/simstack/core/services/base_service.html +522 -0
- simstack/static/docs/_modules/simstack/core/services/file_transfer_service.html +436 -0
- simstack/static/docs/_modules/simstack/core/services/git_restart_service.html +331 -0
- simstack/static/docs/_modules/simstack/core/services/git_uv_update_service.html +427 -0
- simstack/static/docs/_modules/simstack/core/services/node_execution_service.html +507 -0
- simstack/static/docs/_modules/simstack/core/services/resource_branch_monitor_service.html +390 -0
- simstack/static/docs/_modules/simstack/core/services/runner_cleanup_service.html +468 -0
- simstack/static/docs/_modules/simstack/core/services/runner_manager.html +485 -0
- simstack/static/docs/_modules/simstack/core/services/runner_status_service.html +329 -0
- simstack/static/docs/_modules/simstack/core/services/slurm_status_service.html +386 -0
- simstack/static/docs/_modules/simstack/core/services/stop_check_service.html +346 -0
- simstack/static/docs/_modules/simstack/core/services/timeout_restart_service.html +345 -0
- simstack/static/docs/_modules/simstack/core/simstack_result.html +355 -0
- simstack/static/docs/_modules/simstack/core/submit_node.html +536 -0
- simstack/static/docs/_modules/simstack/core/task_id.html +344 -0
- simstack/static/docs/_modules/simstack/methods/archive_files.html +598 -0
- simstack/static/docs/_modules/simstack/methods/fire_and_forget_runner.html +432 -0
- simstack/static/docs/_modules/simstack/methods/generate_test.html +443 -0
- simstack/static/docs/_modules/simstack/methods/get_file.html +342 -0
- simstack/static/docs/_modules/simstack/methods/mass_runner.html +476 -0
- simstack/static/docs/_modules/simstack/methods/multiple_executor.html +674 -0
- simstack/static/docs/_modules/simstack/methods/switch_git.html +332 -0
- simstack/static/docs/_modules/simstack/methods/upload_helpers.html +403 -0
- simstack/static/docs/_modules/simstack/models/array_list.html +337 -0
- simstack/static/docs/_modules/simstack/models/array_storage.html +417 -0
- simstack/static/docs/_modules/simstack/models/base_lists.html +374 -0
- simstack/static/docs/_modules/simstack/models/base_types.html +588 -0
- simstack/static/docs/_modules/simstack/models/charts_artifact.html +1035 -0
- simstack/static/docs/_modules/simstack/models/dataset.html +866 -0
- simstack/static/docs/_modules/simstack/models/dataset_metadata.html +711 -0
- simstack/static/docs/_modules/simstack/models/datasettuple.html +1005 -0
- simstack/static/docs/_modules/simstack/models/file_instance.html +472 -0
- simstack/static/docs/_modules/simstack/models/file_list.html +367 -0
- simstack/static/docs/_modules/simstack/models/files.html +773 -0
- simstack/static/docs/_modules/simstack/models/fire_and_forget_result.html +335 -0
- simstack/static/docs/_modules/simstack/models/images2d.html +447 -0
- simstack/static/docs/_modules/simstack/models/log_entry_model.html +356 -0
- simstack/static/docs/_modules/simstack/models/models.html +374 -0
- simstack/static/docs/_modules/simstack/models/named_data_reference.html +355 -0
- simstack/static/docs/_modules/simstack/models/node_registry.html +415 -0
- simstack/static/docs/_modules/simstack/models/pandas_model.html +570 -0
- simstack/static/docs/_modules/simstack/models/parameters.html +739 -0
- simstack/static/docs/_modules/simstack/models/pickle_models.html +631 -0
- simstack/static/docs/_modules/simstack/models/project.html +329 -0
- simstack/static/docs/_modules/simstack/models/resource_assignment.html +501 -0
- simstack/static/docs/_modules/simstack/models/resource_definition.html +477 -0
- simstack/static/docs/_modules/simstack/models/runner_model.html +361 -0
- simstack/static/docs/_modules/simstack/models/simple_table.html +413 -0
- simstack/static/docs/_modules/simstack/models/simstack_model.html +416 -0
- simstack/static/docs/_modules/simstack/models/slurm_info.html +333 -0
- simstack/static/docs/_modules/simstack/models/table_artifact.html +406 -0
- simstack/static/docs/_modules/simstack/models/tag.html +328 -0
- simstack/static/docs/_modules/simstack/tables/model_table.html +519 -0
- simstack/static/docs/_modules/simstack/tables/node_children.html +538 -0
- simstack/static/docs/_modules/simstack/tables/node_table.html +854 -0
- simstack/static/docs/_modules/simstack/tables/table_builder.html +642 -0
- simstack/static/docs/_modules/simstack/util/async_zip_utils.html +337 -0
- simstack/static/docs/_modules/simstack/util/b64mixin.html +339 -0
- simstack/static/docs/_modules/simstack/util/cleaned_json_schema.html +336 -0
- simstack/static/docs/_modules/simstack/util/config_reader.html +498 -0
- simstack/static/docs/_modules/simstack/util/custom_model_dump.html +391 -0
- simstack/static/docs/_modules/simstack/util/database_information.html +488 -0
- simstack/static/docs/_modules/simstack/util/db.html +1392 -0
- simstack/static/docs/_modules/simstack/util/db_logger.html +448 -0
- simstack/static/docs/_modules/simstack/util/default_from_dict.html +376 -0
- simstack/static/docs/_modules/simstack/util/directory_iterator.html +553 -0
- simstack/static/docs/_modules/simstack/util/docstring_parser.html +526 -0
- simstack/static/docs/_modules/simstack/util/file_hashing.html +394 -0
- simstack/static/docs/_modules/simstack/util/file_transfer_client.html +791 -0
- simstack/static/docs/_modules/simstack/util/files.html +733 -0
- simstack/static/docs/_modules/simstack/util/find_python_files.html +349 -0
- simstack/static/docs/_modules/simstack/util/generate_ui_schema.html +396 -0
- simstack/static/docs/_modules/simstack/util/generic_list_mixin.html +487 -0
- simstack/static/docs/_modules/simstack/util/get_module_path.html +336 -0
- simstack/static/docs/_modules/simstack/util/git_pull.html +381 -0
- simstack/static/docs/_modules/simstack/util/git_repository_status.html +411 -0
- simstack/static/docs/_modules/simstack/util/import_module.html +377 -0
- simstack/static/docs/_modules/simstack/util/importer.html +637 -0
- simstack/static/docs/_modules/simstack/util/init_data_source.html +357 -0
- simstack/static/docs/_modules/simstack/util/make_graph.html +423 -0
- simstack/static/docs/_modules/simstack/util/make_table.html +1171 -0
- simstack/static/docs/_modules/simstack/util/mappings.html +378 -0
- simstack/static/docs/_modules/simstack/util/minimal_route_finder.html +388 -0
- simstack/static/docs/_modules/simstack/util/mock_db.html +472 -0
- simstack/static/docs/_modules/simstack/util/module_path_checker.html +354 -0
- simstack/static/docs/_modules/simstack/util/object_list_mixin.html +649 -0
- simstack/static/docs/_modules/simstack/util/path_manager.html +566 -0
- simstack/static/docs/_modules/simstack/util/project_root_finder.html +357 -0
- simstack/static/docs/_modules/simstack/util/queue_watcher.html +593 -0
- simstack/static/docs/_modules/simstack/util/resource_config.html +532 -0
- simstack/static/docs/_modules/simstack/util/route_finder.html +390 -0
- simstack/static/docs/_modules/simstack/util/runner_util.html +487 -0
- simstack/static/docs/_modules/simstack/util/runner_utils.html +468 -0
- simstack/static/docs/_modules/simstack/util/safe_code_executor.html +510 -0
- simstack/static/docs/_modules/simstack/util/sample_config.html +414 -0
- simstack/static/docs/_modules/simstack/util/sensitive_content_filter.html +364 -0
- simstack/static/docs/_modules/simstack/util/setup_logging.html +365 -0
- simstack/static/docs/_modules/simstack/util/submit_to_watchdog.html +425 -0
- simstack/static/docs/_modules/simstack/util/toml_reader.html +482 -0
- simstack/static/docs/_modules/simstack/util/transform_file_name.html +357 -0
- simstack/static/docs/_modules/simstack/util/ui_tools.html +541 -0
- simstack/static/docs/_sources/architecture.rst.txt +25 -0
- simstack/static/docs/_sources/array_lists.rst.txt +60 -0
- simstack/static/docs/_sources/ci_pipeline.rst.txt +34 -0
- simstack/static/docs/_sources/data.rst.txt +175 -0
- simstack/static/docs/_sources/database_migrations.rst.txt +310 -0
- simstack/static/docs/_sources/datasets.rst.txt +93 -0
- simstack/static/docs/_sources/developer_guide.rst.txt +25 -0
- simstack/static/docs/_sources/docker_nodes.rst.txt +149 -0
- simstack/static/docs/_sources/files.rst.txt +159 -0
- simstack/static/docs/_sources/fire_and_forget_runner.rst.txt +67 -0
- simstack/static/docs/_sources/index.rst.txt +25 -0
- simstack/static/docs/_sources/installation.rst.txt +213 -0
- simstack/static/docs/_sources/lists.rst.txt +111 -0
- simstack/static/docs/_sources/mass_runner.rst.txt +91 -0
- simstack/static/docs/_sources/misc.rst.txt +106 -0
- simstack/static/docs/_sources/overview.rst.txt +91 -0
- simstack/static/docs/_sources/recovery.rst.txt +38 -0
- simstack/static/docs/_sources/resource_config.rst.txt +141 -0
- simstack/static/docs/_sources/simstack/modules/modules.rst.txt +7 -0
- simstack/static/docs/_sources/simstack/modules/simstack.core.rst.txt +205 -0
- simstack/static/docs/_sources/simstack/modules/simstack.core.services.rst.txt +109 -0
- simstack/static/docs/_sources/simstack/modules/simstack.methods.rst.txt +77 -0
- simstack/static/docs/_sources/simstack/modules/simstack.models.rst.txt +261 -0
- simstack/static/docs/_sources/simstack/modules/simstack.rst.txt +22 -0
- simstack/static/docs/_sources/simstack/modules/simstack.tables.rst.txt +45 -0
- simstack/static/docs/_sources/simstack/modules/simstack.util.rst.txt +381 -0
- simstack/static/docs/_sources/submit.rst.txt +141 -0
- simstack/static/docs/_sources/tables.rst.txt +50 -0
- simstack/static/docs/_sources/testing_complex_nodes.rst.txt +92 -0
- simstack/static/docs/_sources/ui_documentation.rst.txt +272 -0
- simstack/static/docs/_sources/workflows.rst.txt +446 -0
- simstack/static/docs/_static/base-stemmer.js +476 -0
- simstack/static/docs/_static/basic.css +906 -0
- simstack/static/docs/_static/cobalt2-theme.css +1 -0
- simstack/static/docs/_static/debug.css +69 -0
- simstack/static/docs/_static/docs-build-badge.css +51 -0
- simstack/static/docs/_static/docs-build-badge.js +51 -0
- simstack/static/docs/_static/doctools.js +150 -0
- simstack/static/docs/_static/documentation_options.js +13 -0
- simstack/static/docs/_static/english-stemmer.js +1066 -0
- simstack/static/docs/_static/file.png +0 -0
- simstack/static/docs/_static/language_data.js +13 -0
- simstack/static/docs/_static/minus.png +0 -0
- simstack/static/docs/_static/plus.png +0 -0
- simstack/static/docs/_static/pygments.css +250 -0
- simstack/static/docs/_static/scripts/furo-extensions.js +0 -0
- simstack/static/docs/_static/scripts/furo.js +3 -0
- simstack/static/docs/_static/scripts/furo.js.LICENSE.txt +7 -0
- simstack/static/docs/_static/scripts/furo.js.map +1 -0
- simstack/static/docs/_static/searchtools.js +693 -0
- simstack/static/docs/_static/skeleton.css +296 -0
- simstack/static/docs/_static/sphinx_highlight.js +159 -0
- simstack/static/docs/_static/styles/furo-extensions.css +2 -0
- simstack/static/docs/_static/styles/furo-extensions.css.map +1 -0
- simstack/static/docs/_static/styles/furo.css +2 -0
- simstack/static/docs/_static/styles/furo.css.map +1 -0
- simstack/static/docs/architecture.html +340 -0
- simstack/static/docs/array_lists.html +678 -0
- simstack/static/docs/ci_pipeline.html +385 -0
- simstack/static/docs/data.html +545 -0
- simstack/static/docs/database_migrations.html +652 -0
- simstack/static/docs/datasets.html +1268 -0
- simstack/static/docs/developer_guide.html +359 -0
- simstack/static/docs/docker_nodes.html +503 -0
- simstack/static/docs/files.html +718 -0
- simstack/static/docs/fire_and_forget_runner.html +641 -0
- simstack/static/docs/genindex.html +6390 -0
- simstack/static/docs/index.html +516 -0
- simstack/static/docs/installation.html +553 -0
- simstack/static/docs/lists.html +478 -0
- simstack/static/docs/mass_runner.html +481 -0
- simstack/static/docs/misc.html +454 -0
- simstack/static/docs/objects.inv +0 -0
- simstack/static/docs/overview.html +469 -0
- simstack/static/docs/py-modindex.html +1111 -0
- simstack/static/docs/recovery.html +371 -0
- simstack/static/docs/resource_config.html +590 -0
- simstack/static/docs/search.html +327 -0
- simstack/static/docs/searchindex.js +1 -0
- simstack/static/docs/simstack/modules/modules.html +489 -0
- simstack/static/docs/simstack/modules/simstack.core.html +1883 -0
- simstack/static/docs/simstack/modules/simstack.core.services.html +698 -0
- simstack/static/docs/simstack/modules/simstack.html +3060 -0
- simstack/static/docs/simstack/modules/simstack.methods.html +1150 -0
- simstack/static/docs/simstack/modules/simstack.models.html +13113 -0
- simstack/static/docs/simstack/modules/simstack.tables.html +635 -0
- simstack/static/docs/simstack/modules/simstack.util.html +3320 -0
- simstack/static/docs/submit.html +487 -0
- simstack/static/docs/tables.html +539 -0
- simstack/static/docs/testing_complex_nodes.html +458 -0
- simstack/static/docs/ui_documentation.html +788 -0
- simstack/static/docs/workflows.html +766 -0
- simstack/tables/__init__.py +0 -0
- simstack/tables/model_table.py +191 -0
- simstack/tables/node_children.py +219 -0
- simstack/tables/node_table.py +517 -0
- simstack/tables/table_builder.py +314 -0
- simstack/util/__init__.py +0 -0
- simstack/util/async_zip_utils.py +18 -0
- simstack/util/b64mixin.py +23 -0
- simstack/util/cleaned_json_schema.py +20 -0
- simstack/util/config_reader.py +179 -0
- simstack/util/custom_model_dump.py +75 -0
- simstack/util/database_information.py +160 -0
- simstack/util/db.py +1013 -0
- simstack/util/db_logger.py +117 -0
- simstack/util/default_from_dict.py +57 -0
- simstack/util/directory_iterator.py +216 -0
- simstack/util/docstring_parser.py +186 -0
- simstack/util/file_hashing.py +72 -0
- simstack/util/file_transfer_client.py +427 -0
- simstack/util/files.py +396 -0
- simstack/util/find_python_files.py +33 -0
- simstack/util/generate_ui_schema.py +80 -0
- simstack/util/generic_list_mixin.py +120 -0
- simstack/util/geometry_utils.py +118 -0
- simstack/util/get_module_path.py +20 -0
- simstack/util/git_pull.py +65 -0
- simstack/util/git_repository_status.py +95 -0
- simstack/util/import_module.py +63 -0
- simstack/util/importer.py +312 -0
- simstack/util/init_data_source.py +41 -0
- simstack/util/make_graph.py +107 -0
- simstack/util/make_table.py +837 -0
- simstack/util/mappings.py +41 -0
- simstack/util/minimal_route_finder.py +72 -0
- simstack/util/mock_db.py +144 -0
- simstack/util/module_path_checker.py +38 -0
- simstack/util/object_list_mixin.py +282 -0
- simstack/util/path_manager.py +223 -0
- simstack/util/project_root_finder.py +41 -0
- simstack/util/queue_watcher.py +262 -0
- simstack/util/resource_config.py +198 -0
- simstack/util/route_finder.py +74 -0
- simstack/util/runner_util.py +166 -0
- simstack/util/runner_utils.py +143 -0
- simstack/util/safe_code_executor.py +194 -0
- simstack/util/sample_config.py +98 -0
- simstack/util/sensitive_content_filter.py +48 -0
- simstack/util/setup_logging.py +49 -0
- simstack/util/submit_to_watchdog.py +106 -0
- simstack/util/toml_reader.py +142 -0
- simstack/util/transform_file_name.py +41 -0
- simstack/util/ui_tools.py +213 -0
- simstack-2.0.1.dist-info/METADATA +454 -0
- simstack-2.0.1.dist-info/RECORD +354 -0
- simstack-2.0.1.dist-info/WHEEL +5 -0
- simstack-2.0.1.dist-info/entry_points.txt +12 -0
- simstack-2.0.1.dist-info/licenses/LICENSE +21 -0
- 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"
|