synapse-sdk 1.0.0a35__py3-none-any.whl → 2025.11.7__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.
Potentially problematic release.
This version of synapse-sdk might be problematic. Click here for more details.
- synapse_sdk/__init__.py +24 -0
- synapse_sdk/cli/__init__.py +308 -5
- synapse_sdk/cli/alias/utils.py +1 -1
- synapse_sdk/cli/code_server.py +687 -0
- synapse_sdk/cli/config.py +440 -0
- synapse_sdk/cli/devtools.py +90 -0
- synapse_sdk/cli/plugin/publish.py +23 -15
- synapse_sdk/clients/agent/__init__.py +9 -3
- synapse_sdk/clients/agent/container.py +133 -0
- synapse_sdk/clients/agent/core.py +19 -0
- synapse_sdk/clients/agent/ray.py +298 -9
- synapse_sdk/clients/backend/__init__.py +28 -12
- synapse_sdk/clients/backend/annotation.py +9 -1
- synapse_sdk/clients/backend/core.py +31 -4
- synapse_sdk/clients/backend/data_collection.py +186 -0
- synapse_sdk/clients/backend/hitl.py +1 -1
- synapse_sdk/clients/backend/integration.py +4 -3
- synapse_sdk/clients/backend/ml.py +1 -1
- synapse_sdk/clients/backend/models.py +35 -1
- synapse_sdk/clients/base.py +309 -36
- synapse_sdk/clients/ray/serve.py +2 -0
- synapse_sdk/devtools/__init__.py +0 -0
- synapse_sdk/devtools/config.py +94 -0
- synapse_sdk/devtools/docs/.gitignore +20 -0
- synapse_sdk/devtools/docs/README.md +41 -0
- synapse_sdk/devtools/docs/blog/2019-05-28-first-blog-post.md +12 -0
- synapse_sdk/devtools/docs/blog/2019-05-29-long-blog-post.md +44 -0
- synapse_sdk/devtools/docs/blog/2021-08-01-mdx-blog-post.mdx +24 -0
- synapse_sdk/devtools/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
- synapse_sdk/devtools/docs/blog/2021-08-26-welcome/index.md +29 -0
- synapse_sdk/devtools/docs/blog/authors.yml +25 -0
- synapse_sdk/devtools/docs/blog/tags.yml +19 -0
- synapse_sdk/devtools/docs/docs/api/clients/agent.md +43 -0
- synapse_sdk/devtools/docs/docs/api/clients/annotation-mixin.md +378 -0
- synapse_sdk/devtools/docs/docs/api/clients/backend.md +420 -0
- synapse_sdk/devtools/docs/docs/api/clients/base.md +257 -0
- synapse_sdk/devtools/docs/docs/api/clients/core-mixin.md +477 -0
- synapse_sdk/devtools/docs/docs/api/clients/data-collection-mixin.md +422 -0
- synapse_sdk/devtools/docs/docs/api/clients/hitl-mixin.md +554 -0
- synapse_sdk/devtools/docs/docs/api/clients/index.md +391 -0
- synapse_sdk/devtools/docs/docs/api/clients/integration-mixin.md +571 -0
- synapse_sdk/devtools/docs/docs/api/clients/ml-mixin.md +578 -0
- synapse_sdk/devtools/docs/docs/api/clients/ray.md +342 -0
- synapse_sdk/devtools/docs/docs/api/index.md +52 -0
- synapse_sdk/devtools/docs/docs/api/plugins/categories.md +43 -0
- synapse_sdk/devtools/docs/docs/api/plugins/models.md +114 -0
- synapse_sdk/devtools/docs/docs/api/plugins/utils.md +328 -0
- synapse_sdk/devtools/docs/docs/categories.md +0 -0
- synapse_sdk/devtools/docs/docs/cli-usage.md +280 -0
- synapse_sdk/devtools/docs/docs/concepts/index.md +38 -0
- synapse_sdk/devtools/docs/docs/configuration.md +83 -0
- synapse_sdk/devtools/docs/docs/contributing.md +306 -0
- synapse_sdk/devtools/docs/docs/examples/index.md +29 -0
- synapse_sdk/devtools/docs/docs/faq.md +179 -0
- synapse_sdk/devtools/docs/docs/features/converters/index.md +455 -0
- synapse_sdk/devtools/docs/docs/features/index.md +24 -0
- synapse_sdk/devtools/docs/docs/features/utils/file.md +415 -0
- synapse_sdk/devtools/docs/docs/features/utils/network.md +378 -0
- synapse_sdk/devtools/docs/docs/features/utils/storage.md +57 -0
- synapse_sdk/devtools/docs/docs/features/utils/types.md +51 -0
- synapse_sdk/devtools/docs/docs/installation.md +94 -0
- synapse_sdk/devtools/docs/docs/introduction.md +47 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/neural-net-plugins/train-action-overview.md +814 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
- synapse_sdk/devtools/docs/docs/plugins/export-plugins.md +1092 -0
- synapse_sdk/devtools/docs/docs/plugins/plugins.md +852 -0
- synapse_sdk/devtools/docs/docs/quickstart.md +78 -0
- synapse_sdk/devtools/docs/docs/troubleshooting.md +519 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/_category_.json +8 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/congratulations.md +23 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-blog-post.md +34 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-document.md +57 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-page.md +43 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/deploy-your-site.md +31 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/markdown-features.mdx +152 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/_category_.json +7 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/img/docsVersionDropdown.png +0 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/img/localeDropdown.png +0 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/manage-docs-versions.md +55 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/translate-your-site.md +88 -0
- synapse_sdk/devtools/docs/docusaurus.config.ts +148 -0
- synapse_sdk/devtools/docs/i18n/ko/code.json +325 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/agent.md +43 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/annotation-mixin.md +289 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/backend.md +420 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/base.md +257 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/core-mixin.md +417 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/data-collection-mixin.md +356 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/hitl-mixin.md +192 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/index.md +391 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/integration-mixin.md +479 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ml-mixin.md +284 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ray.md +342 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/index.md +52 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/plugins/models.md +114 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/categories.md +0 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/cli-usage.md +280 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/concepts/index.md +38 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md +83 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/contributing.md +306 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/examples/index.md +29 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/faq.md +179 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/converters/index.md +30 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/index.md +24 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/file.md +415 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/network.md +378 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/storage.md +60 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/types.md +51 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/installation.md +94 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/introduction.md +47 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/neural-net-plugins/train-action-overview.md +815 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/export-plugins.md +1092 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/plugins.md +117 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md +78 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/troubleshooting.md +519 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current.json +34 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/footer.json +42 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/navbar.json +18 -0
- synapse_sdk/devtools/docs/package-lock.json +18784 -0
- synapse_sdk/devtools/docs/package.json +48 -0
- synapse_sdk/devtools/docs/sidebars.ts +122 -0
- synapse_sdk/devtools/docs/src/components/HomepageFeatures/index.tsx +71 -0
- synapse_sdk/devtools/docs/src/components/HomepageFeatures/styles.module.css +11 -0
- synapse_sdk/devtools/docs/src/css/custom.css +30 -0
- synapse_sdk/devtools/docs/src/pages/index.module.css +23 -0
- synapse_sdk/devtools/docs/src/pages/index.tsx +21 -0
- synapse_sdk/devtools/docs/src/pages/markdown-page.md +7 -0
- synapse_sdk/devtools/docs/static/.nojekyll +0 -0
- synapse_sdk/devtools/docs/static/img/docusaurus-social-card.jpg +0 -0
- synapse_sdk/devtools/docs/static/img/docusaurus.png +0 -0
- synapse_sdk/devtools/docs/static/img/favicon.ico +0 -0
- synapse_sdk/devtools/docs/static/img/logo.png +0 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_mountain.svg +171 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_react.svg +170 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_tree.svg +40 -0
- synapse_sdk/devtools/docs/tsconfig.json +8 -0
- synapse_sdk/devtools/server.py +41 -0
- synapse_sdk/devtools/streamlit_app/__init__.py +5 -0
- synapse_sdk/devtools/streamlit_app/app.py +128 -0
- synapse_sdk/devtools/streamlit_app/services/__init__.py +11 -0
- synapse_sdk/devtools/streamlit_app/services/job_service.py +233 -0
- synapse_sdk/devtools/streamlit_app/services/plugin_service.py +236 -0
- synapse_sdk/devtools/streamlit_app/services/serve_service.py +95 -0
- synapse_sdk/devtools/streamlit_app/ui/__init__.py +15 -0
- synapse_sdk/devtools/streamlit_app/ui/config_tab.py +76 -0
- synapse_sdk/devtools/streamlit_app/ui/deployment_tab.py +66 -0
- synapse_sdk/devtools/streamlit_app/ui/http_tab.py +125 -0
- synapse_sdk/devtools/streamlit_app/ui/jobs_tab.py +573 -0
- synapse_sdk/devtools/streamlit_app/ui/serve_tab.py +346 -0
- synapse_sdk/devtools/streamlit_app/ui/status_bar.py +118 -0
- synapse_sdk/devtools/streamlit_app/utils/__init__.py +40 -0
- synapse_sdk/devtools/streamlit_app/utils/json_viewer.py +197 -0
- synapse_sdk/devtools/streamlit_app/utils/log_formatter.py +38 -0
- synapse_sdk/devtools/streamlit_app/utils/styles.py +241 -0
- synapse_sdk/devtools/streamlit_app/utils/ui_components.py +289 -0
- synapse_sdk/devtools/streamlit_app.py +10 -0
- synapse_sdk/loggers.py +65 -7
- synapse_sdk/plugins/README.md +1340 -0
- synapse_sdk/plugins/categories/base.py +73 -11
- synapse_sdk/plugins/categories/data_validation/actions/validation.py +72 -0
- synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +33 -5
- synapse_sdk/plugins/categories/export/actions/__init__.py +3 -0
- synapse_sdk/plugins/categories/export/actions/export/__init__.py +28 -0
- synapse_sdk/plugins/categories/export/actions/export/action.py +165 -0
- synapse_sdk/plugins/categories/export/actions/export/enums.py +113 -0
- synapse_sdk/plugins/categories/export/actions/export/exceptions.py +53 -0
- synapse_sdk/plugins/categories/export/actions/export/models.py +74 -0
- synapse_sdk/plugins/categories/export/actions/export/run.py +195 -0
- synapse_sdk/plugins/categories/export/actions/{export.py → export/utils.py} +47 -82
- synapse_sdk/plugins/categories/export/templates/config.yaml +19 -1
- synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +390 -0
- synapse_sdk/plugins/categories/export/templates/plugin/export.py +153 -129
- synapse_sdk/plugins/categories/neural_net/actions/deployment.py +9 -62
- synapse_sdk/plugins/categories/neural_net/actions/train.py +1062 -32
- synapse_sdk/plugins/categories/neural_net/actions/tune.py +534 -0
- synapse_sdk/plugins/categories/neural_net/templates/config.yaml +27 -5
- synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +26 -10
- synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +4 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/__init__.py +3 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/action.py +10 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/__init__.py +28 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/action.py +145 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/enums.py +269 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/exceptions.py +14 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/factory.py +76 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/models.py +97 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/orchestrator.py +250 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/run.py +64 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/__init__.py +17 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/annotation.py +287 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/base.py +170 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/extraction.py +83 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/metrics.py +87 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/preprocessor.py +127 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/validation.py +143 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py +966 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +19 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py +40 -0
- synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +19 -0
- synapse_sdk/plugins/categories/upload/actions/upload/action.py +232 -0
- synapse_sdk/plugins/categories/upload/actions/upload/context.py +185 -0
- synapse_sdk/plugins/categories/upload/actions/upload/enums.py +471 -0
- synapse_sdk/plugins/categories/upload/actions/upload/exceptions.py +36 -0
- synapse_sdk/plugins/categories/upload/actions/upload/factory.py +138 -0
- synapse_sdk/plugins/categories/upload/actions/upload/models.py +203 -0
- synapse_sdk/plugins/categories/upload/actions/upload/orchestrator.py +183 -0
- synapse_sdk/plugins/categories/upload/actions/upload/registry.py +113 -0
- synapse_sdk/plugins/categories/upload/actions/upload/run.py +179 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/base.py +107 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/cleanup.py +62 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/collection.py +63 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/generate.py +84 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/initialize.py +82 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/metadata.py +235 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/organize.py +203 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/upload.py +97 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/validate.py +71 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/base.py +82 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/batch.py +39 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/single.py +29 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/flat.py +258 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py +281 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/excel.py +174 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/none.py +16 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/sync.py +84 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/default.py +60 -0
- synapse_sdk/plugins/categories/upload/actions/upload/utils.py +250 -0
- synapse_sdk/plugins/categories/upload/templates/README.md +470 -0
- synapse_sdk/plugins/categories/upload/templates/config.yaml +29 -2
- synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +294 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +88 -30
- synapse_sdk/plugins/models.py +122 -16
- synapse_sdk/plugins/templates/plugin-config-schema.json +406 -0
- synapse_sdk/plugins/templates/schema.json +491 -0
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +1 -1
- synapse_sdk/plugins/utils/__init__.py +46 -0
- synapse_sdk/plugins/utils/actions.py +119 -0
- synapse_sdk/plugins/utils/config.py +203 -0
- synapse_sdk/plugins/{utils.py → utils/legacy.py} +26 -46
- synapse_sdk/plugins/utils/ray_gcs.py +66 -0
- synapse_sdk/plugins/utils/registry.py +58 -0
- synapse_sdk/shared/__init__.py +25 -0
- synapse_sdk/shared/enums.py +93 -0
- synapse_sdk/utils/converters/__init__.py +240 -0
- synapse_sdk/utils/converters/coco/__init__.py +0 -0
- synapse_sdk/utils/converters/coco/from_dm.py +322 -0
- synapse_sdk/utils/converters/coco/to_dm.py +215 -0
- synapse_sdk/utils/converters/dm/__init__.py +56 -0
- synapse_sdk/utils/converters/dm/from_v1.py +627 -0
- synapse_sdk/utils/converters/dm/to_v1.py +367 -0
- synapse_sdk/utils/converters/pascal/__init__.py +0 -0
- synapse_sdk/utils/converters/pascal/from_dm.py +244 -0
- synapse_sdk/utils/converters/pascal/to_dm.py +214 -0
- synapse_sdk/utils/converters/yolo/__init__.py +0 -0
- synapse_sdk/utils/converters/yolo/from_dm.py +384 -0
- synapse_sdk/utils/converters/yolo/to_dm.py +267 -0
- synapse_sdk/utils/dataset.py +46 -0
- synapse_sdk/utils/encryption.py +158 -0
- synapse_sdk/utils/file/__init__.py +39 -0
- synapse_sdk/utils/file/archive.py +32 -0
- synapse_sdk/utils/file/checksum.py +56 -0
- synapse_sdk/utils/file/chunking.py +31 -0
- synapse_sdk/utils/file/download.py +385 -0
- synapse_sdk/utils/file/encoding.py +40 -0
- synapse_sdk/utils/file/io.py +22 -0
- synapse_sdk/utils/file/video/__init__.py +29 -0
- synapse_sdk/utils/file/video/transcode.py +307 -0
- synapse_sdk/utils/{file.py → file.py.backup} +84 -2
- synapse_sdk/utils/http.py +138 -0
- synapse_sdk/utils/network.py +293 -0
- synapse_sdk/utils/storage/__init__.py +36 -2
- synapse_sdk/utils/storage/providers/__init__.py +141 -0
- synapse_sdk/utils/storage/providers/file_system.py +134 -0
- synapse_sdk/utils/storage/providers/http.py +190 -0
- synapse_sdk/utils/storage/providers/s3.py +54 -6
- synapse_sdk/utils/storage/providers/sftp.py +31 -0
- synapse_sdk/utils/storage/registry.py +6 -0
- synapse_sdk-2025.11.7.dist-info/METADATA +122 -0
- synapse_sdk-2025.11.7.dist-info/RECORD +386 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/WHEEL +1 -1
- synapse_sdk/clients/backend/dataset.py +0 -102
- synapse_sdk/plugins/categories/upload/actions/upload.py +0 -293
- synapse_sdk-1.0.0a35.dist-info/METADATA +0 -47
- synapse_sdk-1.0.0a35.dist-info/RECORD +0 -137
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/licenses/LICENSE +0 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/top_level.txt +0 -0
|
@@ -1,3 +1,22 @@
|
|
|
1
1
|
actions:
|
|
2
2
|
pre_annotation:
|
|
3
3
|
entrypoint: plugin.pre_annotation.pre_annotate
|
|
4
|
+
to_task:
|
|
5
|
+
entrypoint: plugin.to_task.AnnotationToTask
|
|
6
|
+
inference_options:
|
|
7
|
+
required_cpu_count: 1
|
|
8
|
+
required_gpu_count: 0.1
|
|
9
|
+
ui_schema:
|
|
10
|
+
- $formkit: "radio"
|
|
11
|
+
name: "schema_to_convert"
|
|
12
|
+
label: "변환 스키마"
|
|
13
|
+
help: "변환 스키마 선택"
|
|
14
|
+
required: True
|
|
15
|
+
value: "<yolo>"
|
|
16
|
+
option:
|
|
17
|
+
- label: "Yolo"
|
|
18
|
+
value: "yolo"
|
|
19
|
+
- label: "Coco"
|
|
20
|
+
value: "coco"
|
|
21
|
+
- label: "Pascal"
|
|
22
|
+
value: "pascal"
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
class AnnotationToTask:
|
|
2
|
+
def __init__(self, run, *args, **kwargs):
|
|
3
|
+
"""Initialize the plugin task pre annotation action class.
|
|
4
|
+
|
|
5
|
+
Args:
|
|
6
|
+
run: Plugin run object.
|
|
7
|
+
"""
|
|
8
|
+
self.run = run
|
|
9
|
+
|
|
10
|
+
def convert_data_from_file(
|
|
11
|
+
self,
|
|
12
|
+
primary_file_url: str,
|
|
13
|
+
primary_file_original_name: str,
|
|
14
|
+
data_file_url: str,
|
|
15
|
+
data_file_original_name: str,
|
|
16
|
+
) -> dict:
|
|
17
|
+
"""Convert the data from a file to a task object.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
primary_file_url (str): primary file url.
|
|
21
|
+
primary_file_original_name (str): primary file original name.
|
|
22
|
+
data_file_url (str): data file url.
|
|
23
|
+
data_file_original_name (str): data file original name.
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
dict: The converted data.
|
|
27
|
+
"""
|
|
28
|
+
converted_data = {}
|
|
29
|
+
return converted_data
|
|
30
|
+
|
|
31
|
+
def convert_data_from_inference(self, data: dict) -> dict:
|
|
32
|
+
"""Convert the data from inference result to a task object.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
data: Converted data.
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
dict: The converted data.
|
|
39
|
+
"""
|
|
40
|
+
return data
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from .action import UploadAction
|
|
2
|
+
from .enums import LOG_MESSAGES, LogCode, UploadStatus
|
|
3
|
+
from .exceptions import ExcelParsingError, ExcelSecurityError
|
|
4
|
+
from .models import UploadParams
|
|
5
|
+
from .run import UploadRun
|
|
6
|
+
from .utils import ExcelSecurityConfig, PathAwareJSONEncoder
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
'UploadAction',
|
|
10
|
+
'UploadRun',
|
|
11
|
+
'UploadParams',
|
|
12
|
+
'UploadStatus',
|
|
13
|
+
'LogCode',
|
|
14
|
+
'LOG_MESSAGES',
|
|
15
|
+
'ExcelSecurityError',
|
|
16
|
+
'ExcelParsingError',
|
|
17
|
+
'PathAwareJSONEncoder',
|
|
18
|
+
'ExcelSecurityConfig',
|
|
19
|
+
]
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
from typing import Any, Dict
|
|
2
|
+
|
|
3
|
+
from synapse_sdk.plugins.categories.base import Action
|
|
4
|
+
from synapse_sdk.plugins.categories.decorators import register_action
|
|
5
|
+
from synapse_sdk.plugins.enums import PluginCategory, RunMethod
|
|
6
|
+
from synapse_sdk.plugins.exceptions import ActionError
|
|
7
|
+
|
|
8
|
+
from .context import UploadContext
|
|
9
|
+
from .enums import LogCode
|
|
10
|
+
from .factory import StrategyFactory
|
|
11
|
+
from .models import UploadParams
|
|
12
|
+
from .orchestrator import UploadOrchestrator
|
|
13
|
+
from .registry import StepRegistry
|
|
14
|
+
from .run import UploadRun
|
|
15
|
+
from .steps.cleanup import CleanupStep
|
|
16
|
+
from .steps.collection import AnalyzeCollectionStep
|
|
17
|
+
from .steps.generate import GenerateDataUnitsStep
|
|
18
|
+
from .steps.initialize import InitializeStep
|
|
19
|
+
from .steps.metadata import ProcessMetadataStep
|
|
20
|
+
from .steps.organize import OrganizeFilesStep
|
|
21
|
+
from .steps.upload import UploadFilesStep
|
|
22
|
+
from .steps.validate import ValidateFilesStep
|
|
23
|
+
from .utils import ExcelSecurityConfig
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@register_action
|
|
27
|
+
class UploadAction(Action):
|
|
28
|
+
"""Upload action for processing and uploading files to storage.
|
|
29
|
+
|
|
30
|
+
This implementation uses Strategy and Facade patterns to provide a clean,
|
|
31
|
+
extensible architecture for upload operations. The monolithic legacy
|
|
32
|
+
implementation has been refactored into pluggable strategies and workflow steps.
|
|
33
|
+
|
|
34
|
+
Features:
|
|
35
|
+
- Strategy pattern for pluggable behaviors (validation, file discovery, etc.)
|
|
36
|
+
- Facade pattern with UploadOrchestrator for simplified workflow management
|
|
37
|
+
- Step-based workflow with automatic rollback on failures
|
|
38
|
+
- Comprehensive error handling and progress tracking
|
|
39
|
+
- Easy extensibility for new strategies and workflow steps
|
|
40
|
+
|
|
41
|
+
Class Attributes:
|
|
42
|
+
name (str): Action identifier ('upload')
|
|
43
|
+
category (PluginCategory): UPLOAD category
|
|
44
|
+
method (RunMethod): JOB execution method
|
|
45
|
+
run_class (type): UploadRun for specialized logging
|
|
46
|
+
params_model (type): UploadParams for parameter validation
|
|
47
|
+
progress_categories (dict): Progress tracking configuration
|
|
48
|
+
metrics_categories (dict): Metrics collection configuration
|
|
49
|
+
|
|
50
|
+
Example:
|
|
51
|
+
>>> action = UploadAction(
|
|
52
|
+
... params={
|
|
53
|
+
... 'name': 'Data Upload',
|
|
54
|
+
... 'path': '/data/files',
|
|
55
|
+
... 'storage': 1,
|
|
56
|
+
... 'data_collection': 5
|
|
57
|
+
... },
|
|
58
|
+
... plugin_config=config
|
|
59
|
+
... )
|
|
60
|
+
>>> result = action.start()
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
name = 'upload'
|
|
64
|
+
category = PluginCategory.UPLOAD
|
|
65
|
+
method = RunMethod.JOB
|
|
66
|
+
run_class = UploadRun
|
|
67
|
+
params_model = UploadParams
|
|
68
|
+
progress_categories = {
|
|
69
|
+
'analyze_collection': {
|
|
70
|
+
'proportion': 2,
|
|
71
|
+
},
|
|
72
|
+
'upload_data_files': {
|
|
73
|
+
'proportion': 38,
|
|
74
|
+
},
|
|
75
|
+
'generate_data_units': {
|
|
76
|
+
'proportion': 60,
|
|
77
|
+
},
|
|
78
|
+
}
|
|
79
|
+
metrics_categories = {
|
|
80
|
+
'data_files': {
|
|
81
|
+
'stand_by': 0,
|
|
82
|
+
'failed': 0,
|
|
83
|
+
'success': 0,
|
|
84
|
+
},
|
|
85
|
+
'data_units': {
|
|
86
|
+
'stand_by': 0,
|
|
87
|
+
'failed': 0,
|
|
88
|
+
'success': 0,
|
|
89
|
+
},
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
def __init__(self, *args, **kwargs):
|
|
93
|
+
"""Initialize the upload action."""
|
|
94
|
+
super().__init__(*args, **kwargs)
|
|
95
|
+
|
|
96
|
+
# Initialize Excel configuration from config.yaml
|
|
97
|
+
self.excel_config = ExcelSecurityConfig.from_action_config(self.config)
|
|
98
|
+
self.strategy_factory = StrategyFactory()
|
|
99
|
+
self.step_registry = StepRegistry()
|
|
100
|
+
self._configure_workflow()
|
|
101
|
+
|
|
102
|
+
def _configure_workflow(self) -> None:
|
|
103
|
+
"""Configure workflow steps based on parameters.
|
|
104
|
+
|
|
105
|
+
Registers all workflow steps in the correct order. Steps can be
|
|
106
|
+
dynamically added, removed, or reordered for different use cases.
|
|
107
|
+
"""
|
|
108
|
+
# Register steps in execution order
|
|
109
|
+
self.step_registry.register(InitializeStep())
|
|
110
|
+
self.step_registry.register(ProcessMetadataStep())
|
|
111
|
+
self.step_registry.register(AnalyzeCollectionStep())
|
|
112
|
+
self.step_registry.register(OrganizeFilesStep())
|
|
113
|
+
self.step_registry.register(ValidateFilesStep())
|
|
114
|
+
self.step_registry.register(UploadFilesStep())
|
|
115
|
+
self.step_registry.register(GenerateDataUnitsStep())
|
|
116
|
+
self.step_registry.register(CleanupStep())
|
|
117
|
+
|
|
118
|
+
def start(self) -> Dict[str, Any]:
|
|
119
|
+
"""Execute upload workflow with uploader integration.
|
|
120
|
+
|
|
121
|
+
This method integrates the essential uploader mechanism with the new
|
|
122
|
+
strategy pattern architecture while maintaining backward compatibility.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Dict[str, Any]: Upload result with file counts, success status, and metrics
|
|
126
|
+
|
|
127
|
+
Raises:
|
|
128
|
+
ActionError: If upload workflow fails
|
|
129
|
+
"""
|
|
130
|
+
try:
|
|
131
|
+
# Ensure params is not None
|
|
132
|
+
params = self.params or {}
|
|
133
|
+
|
|
134
|
+
# Create upload context for sharing state between steps
|
|
135
|
+
context = UploadContext(params, self.run, self.client, action=self)
|
|
136
|
+
|
|
137
|
+
# Configure strategies based on parameters with context
|
|
138
|
+
strategies = self._configure_strategies(context)
|
|
139
|
+
|
|
140
|
+
# Create orchestrator but run it with uploader integration
|
|
141
|
+
orchestrator = UploadOrchestrator(context, self.step_registry, strategies)
|
|
142
|
+
|
|
143
|
+
# Execute the workflow steps, but intercept after organize step
|
|
144
|
+
result = self._execute_with_uploader_integration(orchestrator, context)
|
|
145
|
+
|
|
146
|
+
return result
|
|
147
|
+
|
|
148
|
+
except Exception as e:
|
|
149
|
+
# Log the error and re-raise as ActionError
|
|
150
|
+
if self.run:
|
|
151
|
+
self.run.log_message_with_code(LogCode.UPLOAD_WORKFLOW_FAILED, str(e))
|
|
152
|
+
raise ActionError(f'Upload failed: {str(e)}')
|
|
153
|
+
|
|
154
|
+
def _execute_with_uploader_integration(self, orchestrator, context) -> Dict[str, Any]:
|
|
155
|
+
"""Execute workflow with proper uploader integration."""
|
|
156
|
+
# Inject strategies into context before executing steps
|
|
157
|
+
orchestrator._inject_strategies_into_context()
|
|
158
|
+
|
|
159
|
+
# Run initial steps up to file organization
|
|
160
|
+
steps = orchestrator.step_registry.get_steps()
|
|
161
|
+
|
|
162
|
+
# Execute steps one by one until we reach the organization step
|
|
163
|
+
for i, step in enumerate(steps):
|
|
164
|
+
if step.name in ['initialize', 'process_metadata', 'analyze_collection', 'organize_files']:
|
|
165
|
+
try:
|
|
166
|
+
result = step.safe_execute(context)
|
|
167
|
+
context.update(result)
|
|
168
|
+
if not result.success:
|
|
169
|
+
raise Exception(f"Step '{step.name}' failed: {result.error}")
|
|
170
|
+
except Exception as e:
|
|
171
|
+
raise ActionError(f"Failed at step '{step.name}': {str(e)}")
|
|
172
|
+
|
|
173
|
+
# Execute remaining steps
|
|
174
|
+
for step in steps:
|
|
175
|
+
if step.name in ['validate_files', 'upload_files', 'generate_data_units', 'cleanup']:
|
|
176
|
+
try:
|
|
177
|
+
result = step.safe_execute(context)
|
|
178
|
+
context.update(result)
|
|
179
|
+
if not result.success:
|
|
180
|
+
raise Exception(f"Step '{step.name}' failed: {result.error}")
|
|
181
|
+
except Exception as e:
|
|
182
|
+
raise ActionError(f"Failed at step '{step.name}': {str(e)}")
|
|
183
|
+
|
|
184
|
+
# Return the final result from context
|
|
185
|
+
return context.get_result()
|
|
186
|
+
|
|
187
|
+
def _configure_strategies(self, context=None) -> Dict[str, Any]:
|
|
188
|
+
"""Configure strategies based on parameters.
|
|
189
|
+
|
|
190
|
+
Uses the Strategy pattern to create appropriate strategy implementations
|
|
191
|
+
based on the action parameters. This allows for runtime selection of
|
|
192
|
+
different behaviors (recursive vs flat discovery, batch vs single data unit creation, etc.).
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
context: UploadContext for strategies that need access to client/run
|
|
196
|
+
|
|
197
|
+
Returns:
|
|
198
|
+
Dict[str, Any]: Dictionary of strategy instances keyed by type
|
|
199
|
+
"""
|
|
200
|
+
# Ensure params is not None
|
|
201
|
+
params = self.params or {}
|
|
202
|
+
|
|
203
|
+
return {
|
|
204
|
+
'validation': self.strategy_factory.create_validation_strategy(params, context),
|
|
205
|
+
'file_discovery': self.strategy_factory.create_file_discovery_strategy(params, context),
|
|
206
|
+
'metadata': self.strategy_factory.create_metadata_strategy(params, context),
|
|
207
|
+
'upload': self.strategy_factory.create_upload_strategy(params, context),
|
|
208
|
+
'data_unit': self.strategy_factory.create_data_unit_strategy(params, context),
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
def get_uploader(self, path, file_specification, organized_files, params: Dict = {}):
|
|
212
|
+
"""Get uploader from entrypoint (compatibility method).
|
|
213
|
+
|
|
214
|
+
This method is kept for backward compatibility with existing code
|
|
215
|
+
that may still call it directly.
|
|
216
|
+
"""
|
|
217
|
+
return self.entrypoint(
|
|
218
|
+
self.run, path, file_specification, organized_files, extra_params=params.get('extra_params')
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
def get_workflow_summary(self) -> Dict[str, Any]:
|
|
222
|
+
"""Get summary of configured workflow.
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
Dict[str, Any]: Summary of steps and strategies
|
|
226
|
+
"""
|
|
227
|
+
return {
|
|
228
|
+
'steps': [step.name for step in self.step_registry.get_steps()],
|
|
229
|
+
'step_count': len(self.step_registry),
|
|
230
|
+
'total_progress_weight': self.step_registry.get_total_progress_weight(),
|
|
231
|
+
'available_strategies': self.strategy_factory.get_available_strategies(),
|
|
232
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Any, Dict, List, Optional
|
|
4
|
+
|
|
5
|
+
from .run import UploadRun
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class StepResult:
|
|
9
|
+
"""Result of a workflow step execution."""
|
|
10
|
+
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
success: bool = True,
|
|
14
|
+
data: Dict[str, Any] = None,
|
|
15
|
+
error: str = None,
|
|
16
|
+
rollback_data: Dict[str, Any] = None,
|
|
17
|
+
skipped: bool = False,
|
|
18
|
+
original_exception: Optional[Exception] = None,
|
|
19
|
+
):
|
|
20
|
+
self.success = success
|
|
21
|
+
self.data = data or {}
|
|
22
|
+
self.error = error
|
|
23
|
+
self.rollback_data = rollback_data or {}
|
|
24
|
+
self.skipped = skipped
|
|
25
|
+
self.original_exception = original_exception
|
|
26
|
+
self.timestamp = datetime.now()
|
|
27
|
+
|
|
28
|
+
def __bool__(self):
|
|
29
|
+
return self.success
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class UploadContext:
|
|
33
|
+
"""Shared context for all upload workflow steps."""
|
|
34
|
+
|
|
35
|
+
def __init__(self, params: Dict, run: UploadRun, client: Any, action: Any = None):
|
|
36
|
+
self.params = params
|
|
37
|
+
self.run = run
|
|
38
|
+
self.client = client
|
|
39
|
+
self._action = action # Reference to parent action for uploader access
|
|
40
|
+
|
|
41
|
+
# Core state
|
|
42
|
+
self.storage = None
|
|
43
|
+
self.pathlib_cwd = None
|
|
44
|
+
self.metadata: Dict[str, Dict[str, Any]] = {}
|
|
45
|
+
self.file_specifications: Dict[str, Any] = {}
|
|
46
|
+
self.organized_files: List[Dict[str, Any]] = []
|
|
47
|
+
self.uploaded_files: List[Dict[str, Any]] = []
|
|
48
|
+
self.data_units: List[Dict[str, Any]] = []
|
|
49
|
+
|
|
50
|
+
# Progress and metrics
|
|
51
|
+
self.metrics: Dict[str, Any] = {}
|
|
52
|
+
self.errors: List[str] = []
|
|
53
|
+
self.step_results: List[StepResult] = []
|
|
54
|
+
|
|
55
|
+
# Strategies (injected by orchestrator)
|
|
56
|
+
self.strategies: Dict[str, Any] = {}
|
|
57
|
+
|
|
58
|
+
# Rollback information
|
|
59
|
+
self.rollback_data: Dict[str, Any] = {}
|
|
60
|
+
|
|
61
|
+
def update(self, result: StepResult) -> None:
|
|
62
|
+
"""Update context with step results."""
|
|
63
|
+
self.step_results.append(result)
|
|
64
|
+
|
|
65
|
+
if result.success:
|
|
66
|
+
# Update context state with step data
|
|
67
|
+
for key, value in result.data.items():
|
|
68
|
+
if hasattr(self, key):
|
|
69
|
+
setattr(self, key, value)
|
|
70
|
+
else:
|
|
71
|
+
# Store in a general data dictionary
|
|
72
|
+
if not hasattr(self, 'step_data'):
|
|
73
|
+
self.step_data = {}
|
|
74
|
+
self.step_data[key] = value
|
|
75
|
+
|
|
76
|
+
# Store rollback data
|
|
77
|
+
if result.rollback_data:
|
|
78
|
+
self.rollback_data.update(result.rollback_data)
|
|
79
|
+
else:
|
|
80
|
+
# Record error
|
|
81
|
+
if result.error:
|
|
82
|
+
self.errors.append(result.error)
|
|
83
|
+
|
|
84
|
+
def get_result(self) -> Dict[str, Any]:
|
|
85
|
+
"""Get final result dictionary."""
|
|
86
|
+
return {
|
|
87
|
+
'uploaded_files_count': len(self.uploaded_files),
|
|
88
|
+
'generated_data_units_count': len(self.data_units),
|
|
89
|
+
'success': len(self.errors) == 0,
|
|
90
|
+
'errors': self.errors,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
def has_errors(self) -> bool:
|
|
94
|
+
"""Check if context has any errors."""
|
|
95
|
+
return len(self.errors) > 0
|
|
96
|
+
|
|
97
|
+
def get_last_step_result(self) -> Optional[StepResult]:
|
|
98
|
+
"""Get the result of the last executed step."""
|
|
99
|
+
return self.step_results[-1] if self.step_results else None
|
|
100
|
+
|
|
101
|
+
def get_step_result_by_name(self, step_name: str) -> Optional[StepResult]:
|
|
102
|
+
"""Get step result by step name (stored in rollback_data)."""
|
|
103
|
+
for result in self.step_results:
|
|
104
|
+
if result.rollback_data.get('step_name') == step_name:
|
|
105
|
+
return result
|
|
106
|
+
return None
|
|
107
|
+
|
|
108
|
+
def clear_errors(self) -> None:
|
|
109
|
+
"""Clear all errors (useful for retry scenarios)."""
|
|
110
|
+
self.errors.clear()
|
|
111
|
+
|
|
112
|
+
def add_error(self, error: str) -> None:
|
|
113
|
+
"""Add an error to the context."""
|
|
114
|
+
self.errors.append(error)
|
|
115
|
+
|
|
116
|
+
def get_param(self, key: str, default: Any = None) -> Any:
|
|
117
|
+
"""Get parameter value with default."""
|
|
118
|
+
return self.params.get(key, default)
|
|
119
|
+
|
|
120
|
+
def set_storage(self, storage: Any) -> None:
|
|
121
|
+
"""Set storage object."""
|
|
122
|
+
self.storage = storage
|
|
123
|
+
|
|
124
|
+
def set_pathlib_cwd(self, path: Path) -> None:
|
|
125
|
+
"""Set current working directory path."""
|
|
126
|
+
self.pathlib_cwd = path
|
|
127
|
+
|
|
128
|
+
def set_file_specifications(self, specs: Dict[str, Any]) -> None:
|
|
129
|
+
"""Set file specifications."""
|
|
130
|
+
self.file_specifications = specs
|
|
131
|
+
|
|
132
|
+
def add_organized_files(self, files: List[Dict[str, Any]]) -> None:
|
|
133
|
+
"""Add organized files to context."""
|
|
134
|
+
self.organized_files.extend(files)
|
|
135
|
+
|
|
136
|
+
def add_uploaded_files(self, files: List[Dict[str, Any]]) -> None:
|
|
137
|
+
"""Add uploaded files to context."""
|
|
138
|
+
self.uploaded_files.extend(files)
|
|
139
|
+
|
|
140
|
+
def add_data_units(self, units: List[Dict[str, Any]]) -> None:
|
|
141
|
+
"""Add data units to context."""
|
|
142
|
+
self.data_units.extend(units)
|
|
143
|
+
|
|
144
|
+
def update_metrics(self, category: str, metrics: Dict[str, Any]) -> None:
|
|
145
|
+
"""Update metrics for a specific category."""
|
|
146
|
+
if category not in self.metrics:
|
|
147
|
+
self.metrics[category] = {}
|
|
148
|
+
self.metrics[category].update(metrics)
|
|
149
|
+
|
|
150
|
+
def get(self, key: str, default: Any = None) -> Any:
|
|
151
|
+
"""Get value from context by key."""
|
|
152
|
+
# First check direct attributes
|
|
153
|
+
if hasattr(self, key):
|
|
154
|
+
return getattr(self, key)
|
|
155
|
+
|
|
156
|
+
# Then check step_data if it exists
|
|
157
|
+
if hasattr(self, 'step_data') and key in self.step_data:
|
|
158
|
+
return self.step_data[key]
|
|
159
|
+
|
|
160
|
+
# Special mappings for expected keys
|
|
161
|
+
if key == 'file_specification_template':
|
|
162
|
+
return self.file_specifications
|
|
163
|
+
elif key == 'pathlib_cwd':
|
|
164
|
+
return self.pathlib_cwd
|
|
165
|
+
elif key == 'organized_files':
|
|
166
|
+
return self.organized_files
|
|
167
|
+
|
|
168
|
+
return default
|
|
169
|
+
|
|
170
|
+
def set(self, key: str, value: Any) -> None:
|
|
171
|
+
"""Set value in context by key."""
|
|
172
|
+
# Special mappings for expected keys
|
|
173
|
+
if key == 'file_specification_template':
|
|
174
|
+
self.file_specifications = value
|
|
175
|
+
elif key == 'pathlib_cwd':
|
|
176
|
+
self.pathlib_cwd = value
|
|
177
|
+
elif key == 'organized_files':
|
|
178
|
+
self.organized_files = value
|
|
179
|
+
elif hasattr(self, key):
|
|
180
|
+
setattr(self, key, value)
|
|
181
|
+
else:
|
|
182
|
+
# Store in step_data
|
|
183
|
+
if not hasattr(self, 'step_data'):
|
|
184
|
+
self.step_data = {}
|
|
185
|
+
self.step_data[key] = value
|