setta 0.0.14.dev2__tar.gz → 0.0.14.dev3__tar.gz
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.
- {setta-0.0.14.dev2/backend/setta.egg-info → setta-0.0.14.dev3}/PKG-INFO +1 -1
- setta-0.0.14.dev3/backend/setta/__init__.py +1 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/tasks.py +2 -0
- setta-0.0.14.dev3/backend/setta/tasks/utils.py +436 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3/backend/setta.egg-info}/PKG-INFO +1 -1
- setta-0.0.14.dev2/backend/setta/__init__.py +0 -1
- setta-0.0.14.dev2/backend/setta/tasks/utils.py +0 -292
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/LICENSE +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/MANIFEST.in +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/README.md +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/cli/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/cli/connect.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/cli/logger.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/create_runnable_scripts.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/export_selected.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/find_placeholders.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/ast_utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/check_scope.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/generate_code.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/make_parseable.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/position_line_col.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/validate_imports.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/yaml/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/yaml/generate_yaml.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/yaml/section_dict.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/backup.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/artifacts/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/artifacts/load.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/artifacts/save.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/artifacts/save_or_create.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/artifacts/utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/codeInfo/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/codeInfo/copy.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/codeInfo/load.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/codeInfo/save.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/codeInfo/utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/evRefs/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/evRefs/load.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/evRefs/save.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/copy.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/delete.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/load.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/save.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/saveAs.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sectionVariants/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sectionVariants/copy.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sectionVariants/load.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sectionVariants/save.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sectionVariants/utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sections/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sections/copy.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sections/jsonSource.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sections/load.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sections/save.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sections/utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/uiTypes/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/uiTypes/copy.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/uiTypes/load.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/uiTypes/save.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/uiTypes/utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db_init.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db_objs.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/export_db/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/export_db/export_db.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/export_db/export_raw.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/export_db/export_readable.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/export_db/utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/import_db.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/seed.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/settings_file.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/file_watcher.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/completion.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/definition.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/diagnostics.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/documentHighlight.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/references.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/signatureHelp.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/server.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/specific_file_watcher.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/writer.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/artifact.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/code_info.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/dependencies.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/in_memory_fn_stdout_websocket.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/interactive.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/lsp.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/projects.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/reference_renaming.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/sections.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/settings.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/terminals.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/websocket.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/server.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/start.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/constants/BaseUITypes.json +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/constants/Settings.json +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/constants/constants.json +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/constants/db_init.sql +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/constants/defaultValues.json +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/constants/settingsProject.json +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/android-chrome-192x192.png +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/android-chrome-512x512.png +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/apple-touch-icon.png +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/cormorant-garamond-all-700-italic-D-4m7eF5.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/cormorant-garamond-cyrillic-700-italic-C21vCyEA.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/cormorant-garamond-cyrillic-ext-700-italic-gsr366qd.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/cormorant-garamond-latin-700-italic-BQbwEFjx.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/cormorant-garamond-latin-ext-700-italic-DnnS5iSC.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/cormorant-garamond-vietnamese-700-italic-2_nTgjbG.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/index-B_D80dlv.js +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/index-DQjclEVk.css +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-all-400-normal-ByZ5TkcW.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-all-600-normal-BQl_S1BW.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-all-800-normal-BdAoPad8.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-cyrillic-400-normal-BdCE3qi6.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-cyrillic-600-normal-7XOpjHIA.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-cyrillic-800-normal-DGhuWe7d.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-cyrillic-ext-400-normal-BWPw_Wqo.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-cyrillic-ext-600-normal-ejcnWb4M.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-cyrillic-ext-800-normal-DBv1a6vS.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-greek-400-normal-B1y6FevT.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-greek-600-normal-C2fO7_LG.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-greek-800-normal-Cmzsyk9X.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-greek-ext-400-normal-CDYjSWzV.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-greek-ext-600-normal-aFl-DVOe.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-greek-ext-800-normal-BDfRYppl.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-latin-400-normal-C0b7ZYuD.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-latin-600-normal-Do_HpvrI.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-latin-800-normal-4xo3UuPr.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-latin-ext-400-normal-CoAAiu5e.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-latin-ext-600-normal-Dc00Iig3.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-latin-ext-800-normal-MtSFSlwC.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/logo/logo.svg +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/source-code-pro-all-500-normal-r3XLtphf.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/source-code-pro-cyrillic-500-normal-CY1ydVwz.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/source-code-pro-cyrillic-ext-500-normal-CfYAfiCF.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/source-code-pro-greek-500-normal-CAXYj0Fh.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/source-code-pro-latin-500-normal-D9gpC5Cq.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/source-code-pro-latin-ext-500-normal-CRAmHsi-.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-all-400-normal-DjvUmtn7.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-all-500-normal-xIKbAjND.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-all-600-normal-G3qI_FYS.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-all-700-normal-DDAKfh8R.woff +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-latin-400-normal-DiMJuv0g.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-latin-500-normal-Bj5Gxvqh.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-latin-600-normal-DqkZaPuW.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-latin-700-normal-DrOaUiEE.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-latin-ext-400-normal-DVtzt6WA.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-latin-ext-500-normal-Ci3LVpiW.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-latin-ext-600-normal-BROvLH43.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-latin-ext-700-normal-qcgZR4tS.woff2 +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/browserconfig.xml +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/favicon-16x16.png +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/favicon-32x32.png +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/favicon.ico +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/index.html +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/manifest.json +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/mstile-144x144.png +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/mstile-150x150.png +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/mstile-310x150.png +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/mstile-310x310.png +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/mstile-70x70.png +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/robots.txt +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/safari-pinned-tab.svg +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/site.webmanifest +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/seed/.DS_Store +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/seed/examples/.DS_Store +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/codeAreaAutocomplete.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/codeAreaFindTemplateVars.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/codeAreaInitializeCode.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/findEVRefs.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/parametersRequest.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/textFieldAutocomplete.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/textFieldInitializeCode.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/typeCheck.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/task_runner.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/terminals/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/terminals/terminals.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/terminals/utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/__init__.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/constants.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/generate_memorable_string.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/generate_new_filename.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/section_contents.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/utils.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/websocket_manager.py +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta.egg-info/SOURCES.txt +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta.egg-info/dependency_links.txt +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta.egg-info/entry_points.txt +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta.egg-info/requires.txt +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta.egg-info/top_level.txt +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/pyproject.toml +0 -0
- {setta-0.0.14.dev2 → setta-0.0.14.dev3}/setup.cfg +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.0.14.dev3"
|
@@ -151,6 +151,8 @@ class Tasks:
|
|
151
151
|
sp = self.in_memory_subprocesses.get(subprocess_key, {}).get("subprocess")
|
152
152
|
if sp:
|
153
153
|
sp.close()
|
154
|
+
del self.in_memory_subprocesses[subprocess_key]
|
155
|
+
|
154
156
|
sp = SettaInMemoryFnSubprocess(
|
155
157
|
self.stop_event, self.websockets, c["subprocessStartMethod"]
|
156
158
|
)
|
@@ -0,0 +1,436 @@
|
|
1
|
+
import asyncio
|
2
|
+
import importlib.util
|
3
|
+
import logging
|
4
|
+
import multiprocessing
|
5
|
+
import queue
|
6
|
+
import sys
|
7
|
+
import threading
|
8
|
+
import traceback
|
9
|
+
import uuid
|
10
|
+
from collections import defaultdict
|
11
|
+
|
12
|
+
from setta.tasks.fns.utils import TaskDefinition
|
13
|
+
from setta.utils.constants import CWD
|
14
|
+
from setta.utils.utils import nested_access
|
15
|
+
|
16
|
+
logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
|
19
|
+
class SettaInMemoryFnSubprocess:
|
20
|
+
def __init__(self, stop_event, websockets, start_method):
|
21
|
+
logger.debug(
|
22
|
+
f"Creating SettaInMemoryFnSubprocess using {start_method} start_method"
|
23
|
+
)
|
24
|
+
ctx = multiprocessing.get_context(start_method)
|
25
|
+
self.parent_conn, self.child_conn = ctx.Pipe()
|
26
|
+
self.process = ctx.Process(target=self._subprocess_main)
|
27
|
+
self.stdout_parent_conn, self.stdout_child_conn = ctx.Pipe()
|
28
|
+
self.process.daemon = True # Ensure process dies with parent
|
29
|
+
self.process.start()
|
30
|
+
|
31
|
+
self.stop_event = asyncio.Event()
|
32
|
+
self.tasks_stop_event = stop_event
|
33
|
+
self.websockets = websockets
|
34
|
+
self.stdout_queue = queue.Queue()
|
35
|
+
self.stdout_processor_task = None
|
36
|
+
self.stdout_thread = threading.Thread(target=self.stdout_listener, daemon=True)
|
37
|
+
self.stdout_thread.start()
|
38
|
+
|
39
|
+
if len(self.websockets) > 0:
|
40
|
+
self.start_stdout_processor_task()
|
41
|
+
|
42
|
+
def _subprocess_main(self):
|
43
|
+
"""Main loop in subprocess that handles all requests with parallel function execution"""
|
44
|
+
# Initialize store for imported modules
|
45
|
+
fns_dict = {}
|
46
|
+
cache = {}
|
47
|
+
|
48
|
+
# Message queues per function
|
49
|
+
fn_message_queues = defaultdict(queue.Queue)
|
50
|
+
|
51
|
+
# Create a lock for thread-safe operations
|
52
|
+
lock = threading.RLock()
|
53
|
+
send_lock = threading.Lock()
|
54
|
+
|
55
|
+
# Function worker threads
|
56
|
+
fn_workers = {}
|
57
|
+
|
58
|
+
# Redirect stdout as soon as subprocess starts
|
59
|
+
output_capture = OutputCapture(self.stdout_child_conn)
|
60
|
+
sys.stdout = output_capture
|
61
|
+
sys.stderr = output_capture
|
62
|
+
|
63
|
+
while True:
|
64
|
+
msg = self.child_conn.recv() # Wait for requests
|
65
|
+
msg_type = msg["type"]
|
66
|
+
|
67
|
+
if msg_type == "shutdown":
|
68
|
+
# Signal all worker threads to stop
|
69
|
+
for fn_name in fn_workers:
|
70
|
+
fn_message_queues[fn_name].put(None)
|
71
|
+
|
72
|
+
# Wait for all worker threads to finish (with timeout)
|
73
|
+
for fn_name, worker in fn_workers.items():
|
74
|
+
worker.join(timeout=1.0)
|
75
|
+
|
76
|
+
break
|
77
|
+
|
78
|
+
try:
|
79
|
+
if msg_type == "import":
|
80
|
+
dependencies = {}
|
81
|
+
for to_import in msg["imports"]:
|
82
|
+
code = to_import["code"]
|
83
|
+
module_name = to_import["module_name"]
|
84
|
+
# Import and store module
|
85
|
+
module = import_code_from_string(code, module_name)
|
86
|
+
with lock:
|
87
|
+
added_fn_names = add_fns_from_module(
|
88
|
+
fns_dict, module, module_name
|
89
|
+
)
|
90
|
+
for k in added_fn_names:
|
91
|
+
cache[k] = msg["exporter_obj"]
|
92
|
+
dependencies[k] = get_task_metadata(
|
93
|
+
fns_dict[k], cache[k]
|
94
|
+
)
|
95
|
+
# Start a worker thread for each function
|
96
|
+
self._start_worker_for_fn(
|
97
|
+
k,
|
98
|
+
fn_workers,
|
99
|
+
fn_message_queues,
|
100
|
+
fns_dict,
|
101
|
+
cache,
|
102
|
+
lock,
|
103
|
+
send_lock,
|
104
|
+
self.child_conn,
|
105
|
+
)
|
106
|
+
|
107
|
+
with send_lock:
|
108
|
+
self.child_conn.send(
|
109
|
+
{
|
110
|
+
"status": "success",
|
111
|
+
"content": dependencies,
|
112
|
+
}
|
113
|
+
)
|
114
|
+
|
115
|
+
elif msg_type == "call" or msg_type == "call_with_new_exporter_obj":
|
116
|
+
fn_name = msg["fn_name"]
|
117
|
+
|
118
|
+
# Start a worker for this function if needed
|
119
|
+
self._start_worker_for_fn(
|
120
|
+
fn_name,
|
121
|
+
fn_workers,
|
122
|
+
fn_message_queues,
|
123
|
+
fns_dict,
|
124
|
+
cache,
|
125
|
+
lock,
|
126
|
+
send_lock,
|
127
|
+
self.child_conn,
|
128
|
+
)
|
129
|
+
|
130
|
+
# Add the message to the function's queue
|
131
|
+
fn_message_queues[fn_name].put(msg)
|
132
|
+
|
133
|
+
except Exception as e:
|
134
|
+
traceback.print_exc()
|
135
|
+
with send_lock:
|
136
|
+
self.child_conn.send(
|
137
|
+
{
|
138
|
+
"status": "error",
|
139
|
+
"error": str(e),
|
140
|
+
"messageType": None,
|
141
|
+
}
|
142
|
+
)
|
143
|
+
|
144
|
+
def _worker_thread(
|
145
|
+
self, fn_name, fn_message_queues, fns_dict, cache, lock, send_lock, child_conn
|
146
|
+
):
|
147
|
+
"""Worker thread that processes messages for a specific function"""
|
148
|
+
while True:
|
149
|
+
try:
|
150
|
+
# Get a message from the queue
|
151
|
+
msg = fn_message_queues[fn_name].get()
|
152
|
+
|
153
|
+
if msg is None: # Sentinel value to stop the thread
|
154
|
+
break
|
155
|
+
|
156
|
+
msg_type = msg["type"]
|
157
|
+
return_message_type = None
|
158
|
+
|
159
|
+
if msg_type == "call" or msg_type == "call_with_new_exporter_obj":
|
160
|
+
try:
|
161
|
+
# Handle updating exporter_obj for call_with_new_exporter_obj
|
162
|
+
if msg_type == "call_with_new_exporter_obj":
|
163
|
+
with lock:
|
164
|
+
cache[fn_name] = msg["other_data"]["exporter_obj"]
|
165
|
+
|
166
|
+
# Get a thread-safe copy of what we need
|
167
|
+
with lock:
|
168
|
+
in_memory_fn_obj = fns_dict[fn_name]
|
169
|
+
exporter_obj = cache.get(fn_name)
|
170
|
+
|
171
|
+
# Process message
|
172
|
+
message_content = process_message(msg["message"], exporter_obj)
|
173
|
+
|
174
|
+
# Call function
|
175
|
+
result = in_memory_fn_obj.fn(message_content)
|
176
|
+
return_message_type = in_memory_fn_obj.return_message_type
|
177
|
+
|
178
|
+
# Send result back
|
179
|
+
with send_lock:
|
180
|
+
child_conn.send(
|
181
|
+
{
|
182
|
+
"status": "success",
|
183
|
+
"content": result,
|
184
|
+
"messageType": return_message_type,
|
185
|
+
}
|
186
|
+
)
|
187
|
+
except Exception as e:
|
188
|
+
traceback.print_exc()
|
189
|
+
with send_lock:
|
190
|
+
child_conn.send(
|
191
|
+
{
|
192
|
+
"status": "error",
|
193
|
+
"error": str(e),
|
194
|
+
"messageType": return_message_type,
|
195
|
+
}
|
196
|
+
)
|
197
|
+
|
198
|
+
# Mark task as done
|
199
|
+
fn_message_queues[fn_name].task_done()
|
200
|
+
|
201
|
+
except Exception as e:
|
202
|
+
traceback.print_exc()
|
203
|
+
print(f"Error in worker thread for {fn_name}: {e}", flush=True)
|
204
|
+
|
205
|
+
def _start_worker_for_fn(
|
206
|
+
self,
|
207
|
+
fn_name,
|
208
|
+
fn_workers,
|
209
|
+
fn_message_queues,
|
210
|
+
fns_dict,
|
211
|
+
cache,
|
212
|
+
lock,
|
213
|
+
send_lock,
|
214
|
+
child_conn,
|
215
|
+
):
|
216
|
+
"""Start a worker thread for a function if not already running"""
|
217
|
+
if fn_name not in fn_workers or not fn_workers[fn_name].is_alive():
|
218
|
+
worker = threading.Thread(
|
219
|
+
target=self._worker_thread,
|
220
|
+
args=(
|
221
|
+
fn_name,
|
222
|
+
fn_message_queues,
|
223
|
+
fns_dict,
|
224
|
+
cache,
|
225
|
+
lock,
|
226
|
+
send_lock,
|
227
|
+
child_conn,
|
228
|
+
),
|
229
|
+
daemon=True,
|
230
|
+
name=f"worker-{fn_name}",
|
231
|
+
)
|
232
|
+
fn_workers[fn_name] = worker
|
233
|
+
worker.start()
|
234
|
+
|
235
|
+
def close(self):
|
236
|
+
try:
|
237
|
+
logger.debug("Initiating shutdown sequence")
|
238
|
+
|
239
|
+
# Set our stop event - this signals all tasks to stop
|
240
|
+
self.stop_event.set()
|
241
|
+
|
242
|
+
# Send shutdown message to the subprocess
|
243
|
+
try:
|
244
|
+
self.parent_conn.send({"type": "shutdown"})
|
245
|
+
except (BrokenPipeError, EOFError):
|
246
|
+
# Pipe might already be closed, that's okay
|
247
|
+
pass
|
248
|
+
|
249
|
+
# Join the process with timeout
|
250
|
+
self.process.join(timeout=2)
|
251
|
+
|
252
|
+
# If still alive, escalate to terminate
|
253
|
+
if self.process.is_alive():
|
254
|
+
logger.debug(
|
255
|
+
"Process still alive after graceful shutdown, forcing termination"
|
256
|
+
)
|
257
|
+
self.process.terminate()
|
258
|
+
self.process.join(timeout=1)
|
259
|
+
|
260
|
+
# Last resort: kill
|
261
|
+
if self.process.is_alive():
|
262
|
+
logger.debug(
|
263
|
+
"Process still alive after terminate, killing forcefully"
|
264
|
+
)
|
265
|
+
self.process.kill()
|
266
|
+
self.process.join(timeout=1)
|
267
|
+
|
268
|
+
except Exception as e:
|
269
|
+
logger.exception(f"Error during process shutdown: {e}")
|
270
|
+
|
271
|
+
# Now handle the async tasks and threads
|
272
|
+
try:
|
273
|
+
# Cancel the stdout processor task if it exists
|
274
|
+
if self.stdout_processor_task:
|
275
|
+
self.stdout_processor_task.cancel()
|
276
|
+
|
277
|
+
# Close all connections - this will cause pending operations to fail fast
|
278
|
+
for conn in [
|
279
|
+
self.parent_conn,
|
280
|
+
self.child_conn,
|
281
|
+
self.stdout_parent_conn,
|
282
|
+
self.stdout_child_conn,
|
283
|
+
]:
|
284
|
+
try:
|
285
|
+
conn.close()
|
286
|
+
except:
|
287
|
+
pass
|
288
|
+
|
289
|
+
# Join the stdout thread with timeout
|
290
|
+
if self.stdout_thread and self.stdout_thread.is_alive():
|
291
|
+
self.stdout_thread.join(timeout=2)
|
292
|
+
if self.stdout_thread.is_alive():
|
293
|
+
logger.debug("Stdout thread failed to terminate within timeout")
|
294
|
+
|
295
|
+
except Exception as e:
|
296
|
+
logger.exception(f"Error during resource cleanup: {e}")
|
297
|
+
|
298
|
+
def start_stdout_processor_task(self):
|
299
|
+
if self.stdout_processor_task is None or self.stdout_processor_task.done():
|
300
|
+
self.stdout_processor_task = asyncio.create_task(
|
301
|
+
self.process_stdout_queue()
|
302
|
+
)
|
303
|
+
|
304
|
+
async def stop_stdout_processor_task(self):
|
305
|
+
if self.stdout_processor_task and not self.stdout_processor_task.done():
|
306
|
+
self.stdout_processor_task.cancel()
|
307
|
+
try:
|
308
|
+
await self.stdout_processor_task
|
309
|
+
except asyncio.CancelledError:
|
310
|
+
pass
|
311
|
+
self.stdout_processor_task = None
|
312
|
+
|
313
|
+
async def process_stdout_queue(self):
|
314
|
+
while not self.should_stop():
|
315
|
+
try:
|
316
|
+
if self.should_stop():
|
317
|
+
break
|
318
|
+
if len(self.websockets) > 0:
|
319
|
+
stdout_data = self.stdout_queue.get_nowait()
|
320
|
+
stdout_data = stdout_data.replace("\n", "\r\n")
|
321
|
+
for w in self.websockets:
|
322
|
+
await w.send_text(stdout_data)
|
323
|
+
self.stdout_queue.task_done()
|
324
|
+
except queue.Empty:
|
325
|
+
await asyncio.sleep(0.1) # Check for connection every 100ms
|
326
|
+
except asyncio.CancelledError:
|
327
|
+
break
|
328
|
+
except Exception as e:
|
329
|
+
if self.should_stop():
|
330
|
+
break
|
331
|
+
logger.debug(f"Error processing stdout: {e}")
|
332
|
+
|
333
|
+
def stdout_listener(self):
|
334
|
+
while not self.should_stop():
|
335
|
+
if self.stdout_parent_conn.poll(0.1): # Check for data with timeout
|
336
|
+
try:
|
337
|
+
stdout_data = self.stdout_parent_conn.recv()
|
338
|
+
self.stdout_queue.put(stdout_data)
|
339
|
+
except EOFError: # Pipe was closed
|
340
|
+
break
|
341
|
+
except Exception as e:
|
342
|
+
logger.debug(f"Error in stdout listener: {e}")
|
343
|
+
if self.should_stop():
|
344
|
+
break
|
345
|
+
else: # No data available within timeout
|
346
|
+
if self.should_stop():
|
347
|
+
break
|
348
|
+
|
349
|
+
def should_stop(self):
|
350
|
+
return self.stop_event.is_set() or self.tasks_stop_event.is_set()
|
351
|
+
|
352
|
+
|
353
|
+
def add_fns_from_module(fns_dict, module, module_name=None):
|
354
|
+
count = 1
|
355
|
+
added_fn_names = []
|
356
|
+
for attr in vars(module).values():
|
357
|
+
if isinstance(attr, TaskDefinition):
|
358
|
+
if not attr.name:
|
359
|
+
if not module_name:
|
360
|
+
raise ValueError(
|
361
|
+
"Either TaskDefinition must be initialized with a name, or task_name must be specified"
|
362
|
+
)
|
363
|
+
attr.name = f"{module_name}-{count}"
|
364
|
+
count += 1
|
365
|
+
fns_dict[attr.name] = attr
|
366
|
+
added_fn_names.append(attr.name)
|
367
|
+
return added_fn_names
|
368
|
+
|
369
|
+
|
370
|
+
def get_task_metadata(in_memory_fn, exporter_obj):
|
371
|
+
# None means run the task on every change
|
372
|
+
if in_memory_fn.dependencies is None:
|
373
|
+
dependencies = set([None])
|
374
|
+
# Empty array means only run when the task imported.
|
375
|
+
# Non-empty array means run when specified dependencies update.
|
376
|
+
else:
|
377
|
+
dependencies = set(
|
378
|
+
exporter_obj.var_name_reverse_mapping[d] for d in in_memory_fn.dependencies
|
379
|
+
)
|
380
|
+
return dependencies
|
381
|
+
|
382
|
+
|
383
|
+
# Class for capturing and redirecting stdout/stderr
|
384
|
+
class OutputCapture:
|
385
|
+
def __init__(self, stdout_pipe):
|
386
|
+
self.stdout_pipe = stdout_pipe
|
387
|
+
self.lock = threading.Lock()
|
388
|
+
|
389
|
+
def write(self, text):
|
390
|
+
with self.lock:
|
391
|
+
self.stdout_pipe.send(text)
|
392
|
+
|
393
|
+
def flush(self):
|
394
|
+
pass
|
395
|
+
|
396
|
+
|
397
|
+
def process_message(message, exporter_obj):
|
398
|
+
"""Process a message before passing it to a function"""
|
399
|
+
if exporter_obj:
|
400
|
+
for k, v in message.content.items():
|
401
|
+
nice_str = exporter_obj.var_name_mapping.get(k)
|
402
|
+
if not nice_str:
|
403
|
+
continue
|
404
|
+
p_dict, key = nested_access(exporter_obj.output, nice_str)
|
405
|
+
p_dict[key] = v
|
406
|
+
return exporter_obj.output
|
407
|
+
return message.content
|
408
|
+
|
409
|
+
|
410
|
+
def import_code_from_string(code_string, module_name=None, add_to_sys_modules=True):
|
411
|
+
# Generate a unique module name if one isn't provided
|
412
|
+
if module_name is None:
|
413
|
+
module_name = f"setta_dynamic_module_{uuid.uuid4().hex}"
|
414
|
+
|
415
|
+
# Add current directory to sys.path if it's not already there
|
416
|
+
current_dir = str(CWD)
|
417
|
+
if current_dir not in sys.path:
|
418
|
+
sys.path.insert(0, current_dir)
|
419
|
+
|
420
|
+
spec = importlib.util.spec_from_loader(module_name, loader=None)
|
421
|
+
|
422
|
+
# Create a new module based on the spec
|
423
|
+
module = importlib.util.module_from_spec(spec)
|
424
|
+
|
425
|
+
# Optionally add the module to sys.modules
|
426
|
+
if add_to_sys_modules:
|
427
|
+
print(f"adding {module_name} to sys.modules", flush=True)
|
428
|
+
sys.modules[module_name] = module
|
429
|
+
|
430
|
+
# Compile the code string
|
431
|
+
code_object = compile(code_string, module_name, "exec")
|
432
|
+
|
433
|
+
# Execute the compiled code object in the module's namespace
|
434
|
+
exec(code_object, module.__dict__)
|
435
|
+
|
436
|
+
return module
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.0.14.dev2"
|