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.
Files changed (268) hide show
  1. {setta-0.0.14.dev2/backend/setta.egg-info → setta-0.0.14.dev3}/PKG-INFO +1 -1
  2. setta-0.0.14.dev3/backend/setta/__init__.py +1 -0
  3. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/tasks.py +2 -0
  4. setta-0.0.14.dev3/backend/setta/tasks/utils.py +436 -0
  5. {setta-0.0.14.dev2 → setta-0.0.14.dev3/backend/setta.egg-info}/PKG-INFO +1 -1
  6. setta-0.0.14.dev2/backend/setta/__init__.py +0 -1
  7. setta-0.0.14.dev2/backend/setta/tasks/utils.py +0 -292
  8. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/LICENSE +0 -0
  9. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/MANIFEST.in +0 -0
  10. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/README.md +0 -0
  11. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/cli/__init__.py +0 -0
  12. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/cli/connect.py +0 -0
  13. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/cli/logger.py +0 -0
  14. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/__init__.py +0 -0
  15. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/create_runnable_scripts.py +0 -0
  16. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/export_selected.py +0 -0
  17. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/find_placeholders.py +0 -0
  18. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/__init__.py +0 -0
  19. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/ast_utils.py +0 -0
  20. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/check_scope.py +0 -0
  21. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/generate_code.py +0 -0
  22. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/make_parseable.py +0 -0
  23. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/position_line_col.py +0 -0
  24. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/python/validate_imports.py +0 -0
  25. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/utils.py +0 -0
  26. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/yaml/__init__.py +0 -0
  27. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/yaml/generate_yaml.py +0 -0
  28. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/code_gen/yaml/section_dict.py +0 -0
  29. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/__init__.py +0 -0
  30. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/backup.py +0 -0
  31. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/__init__.py +0 -0
  32. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/artifacts/__init__.py +0 -0
  33. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/artifacts/load.py +0 -0
  34. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/artifacts/save.py +0 -0
  35. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/artifacts/save_or_create.py +0 -0
  36. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/artifacts/utils.py +0 -0
  37. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/codeInfo/__init__.py +0 -0
  38. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/codeInfo/copy.py +0 -0
  39. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/codeInfo/load.py +0 -0
  40. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/codeInfo/save.py +0 -0
  41. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/codeInfo/utils.py +0 -0
  42. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/evRefs/__init__.py +0 -0
  43. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/evRefs/load.py +0 -0
  44. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/evRefs/save.py +0 -0
  45. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/__init__.py +0 -0
  46. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/copy.py +0 -0
  47. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/delete.py +0 -0
  48. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/load.py +0 -0
  49. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/save.py +0 -0
  50. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/saveAs.py +0 -0
  51. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/projects/utils.py +0 -0
  52. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sectionVariants/__init__.py +0 -0
  53. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sectionVariants/copy.py +0 -0
  54. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sectionVariants/load.py +0 -0
  55. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sectionVariants/save.py +0 -0
  56. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sectionVariants/utils.py +0 -0
  57. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sections/__init__.py +0 -0
  58. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sections/copy.py +0 -0
  59. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sections/jsonSource.py +0 -0
  60. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sections/load.py +0 -0
  61. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sections/save.py +0 -0
  62. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/sections/utils.py +0 -0
  63. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/uiTypes/__init__.py +0 -0
  64. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/uiTypes/copy.py +0 -0
  65. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/uiTypes/load.py +0 -0
  66. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/uiTypes/save.py +0 -0
  67. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db/uiTypes/utils.py +0 -0
  68. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db_init.py +0 -0
  69. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/db_objs.py +0 -0
  70. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/export_db/__init__.py +0 -0
  71. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/export_db/export_db.py +0 -0
  72. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/export_db/export_raw.py +0 -0
  73. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/export_db/export_readable.py +0 -0
  74. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/export_db/utils.py +0 -0
  75. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/import_db.py +0 -0
  76. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/seed.py +0 -0
  77. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/settings_file.py +0 -0
  78. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/database/utils.py +0 -0
  79. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/__init__.py +0 -0
  80. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/file_watcher.py +0 -0
  81. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader.py +0 -0
  82. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/__init__.py +0 -0
  83. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/completion.py +0 -0
  84. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/definition.py +0 -0
  85. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/diagnostics.py +0 -0
  86. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/documentHighlight.py +0 -0
  87. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/references.py +0 -0
  88. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/reader_fns/signatureHelp.py +0 -0
  89. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/server.py +0 -0
  90. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/specific_file_watcher.py +0 -0
  91. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/utils.py +0 -0
  92. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/lsp/writer.py +0 -0
  93. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/__init__.py +0 -0
  94. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/artifact.py +0 -0
  95. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/code_info.py +0 -0
  96. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/dependencies.py +0 -0
  97. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/in_memory_fn_stdout_websocket.py +0 -0
  98. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/interactive.py +0 -0
  99. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/lsp.py +0 -0
  100. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/projects.py +0 -0
  101. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/reference_renaming.py +0 -0
  102. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/sections.py +0 -0
  103. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/settings.py +0 -0
  104. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/terminals.py +0 -0
  105. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/routers/websocket.py +0 -0
  106. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/server.py +0 -0
  107. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/start.py +0 -0
  108. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/constants/BaseUITypes.json +0 -0
  109. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/constants/Settings.json +0 -0
  110. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/constants/constants.json +0 -0
  111. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/constants/db_init.sql +0 -0
  112. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/constants/defaultValues.json +0 -0
  113. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/constants/settingsProject.json +0 -0
  114. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/android-chrome-192x192.png +0 -0
  115. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/android-chrome-512x512.png +0 -0
  116. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/apple-touch-icon.png +0 -0
  117. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  118. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  119. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  120. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  121. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  122. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  123. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  124. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  125. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  126. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  127. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  128. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  129. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  130. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  131. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  132. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  133. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  134. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  135. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  136. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  137. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  138. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  139. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  140. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  141. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  142. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  143. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  144. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  145. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  146. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  147. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  148. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  149. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  150. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  151. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  152. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  153. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  154. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  155. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  156. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  157. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  158. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  159. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  160. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  161. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  162. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  163. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  164. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  165. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  166. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  167. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  168. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  169. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  170. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  171. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  172. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  173. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  174. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  175. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  176. {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
  177. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/cormorant-garamond-cyrillic-700-italic-C21vCyEA.woff2 +0 -0
  178. {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
  179. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/cormorant-garamond-latin-700-italic-BQbwEFjx.woff2 +0 -0
  180. {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
  181. {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
  182. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/index-B_D80dlv.js +0 -0
  183. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/index-DQjclEVk.css +0 -0
  184. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-all-400-normal-ByZ5TkcW.woff +0 -0
  185. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-all-600-normal-BQl_S1BW.woff +0 -0
  186. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-all-800-normal-BdAoPad8.woff +0 -0
  187. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-cyrillic-400-normal-BdCE3qi6.woff2 +0 -0
  188. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-cyrillic-600-normal-7XOpjHIA.woff2 +0 -0
  189. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-cyrillic-800-normal-DGhuWe7d.woff2 +0 -0
  190. {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
  191. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-cyrillic-ext-600-normal-ejcnWb4M.woff2 +0 -0
  192. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-cyrillic-ext-800-normal-DBv1a6vS.woff2 +0 -0
  193. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-greek-400-normal-B1y6FevT.woff2 +0 -0
  194. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-greek-600-normal-C2fO7_LG.woff2 +0 -0
  195. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-greek-800-normal-Cmzsyk9X.woff2 +0 -0
  196. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-greek-ext-400-normal-CDYjSWzV.woff2 +0 -0
  197. {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
  198. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-greek-ext-800-normal-BDfRYppl.woff2 +0 -0
  199. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-latin-400-normal-C0b7ZYuD.woff2 +0 -0
  200. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-latin-600-normal-Do_HpvrI.woff2 +0 -0
  201. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-latin-800-normal-4xo3UuPr.woff2 +0 -0
  202. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-latin-ext-400-normal-CoAAiu5e.woff2 +0 -0
  203. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-latin-ext-600-normal-Dc00Iig3.woff2 +0 -0
  204. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/inter-latin-ext-800-normal-MtSFSlwC.woff2 +0 -0
  205. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/logo/logo.svg +0 -0
  206. {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
  207. {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
  208. {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
  209. {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
  210. {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
  211. {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
  212. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-all-400-normal-DjvUmtn7.woff +0 -0
  213. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-all-500-normal-xIKbAjND.woff +0 -0
  214. {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
  215. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-all-700-normal-DDAKfh8R.woff +0 -0
  216. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-latin-400-normal-DiMJuv0g.woff2 +0 -0
  217. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-latin-500-normal-Bj5Gxvqh.woff2 +0 -0
  218. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-latin-600-normal-DqkZaPuW.woff2 +0 -0
  219. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/assets/work-sans-latin-700-normal-DrOaUiEE.woff2 +0 -0
  220. {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
  221. {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
  222. {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
  223. {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
  224. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/browserconfig.xml +0 -0
  225. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/favicon-16x16.png +0 -0
  226. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/favicon-32x32.png +0 -0
  227. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/favicon.ico +0 -0
  228. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/index.html +0 -0
  229. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/manifest.json +0 -0
  230. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/mstile-144x144.png +0 -0
  231. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/mstile-150x150.png +0 -0
  232. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/mstile-310x150.png +0 -0
  233. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/mstile-310x310.png +0 -0
  234. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/mstile-70x70.png +0 -0
  235. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/robots.txt +0 -0
  236. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/safari-pinned-tab.svg +0 -0
  237. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/frontend/site.webmanifest +0 -0
  238. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/seed/.DS_Store +0 -0
  239. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/static/seed/examples/.DS_Store +0 -0
  240. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/__init__.py +0 -0
  241. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/__init__.py +0 -0
  242. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/codeAreaAutocomplete.py +0 -0
  243. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/codeAreaFindTemplateVars.py +0 -0
  244. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/codeAreaInitializeCode.py +0 -0
  245. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/findEVRefs.py +0 -0
  246. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/parametersRequest.py +0 -0
  247. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/textFieldAutocomplete.py +0 -0
  248. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/textFieldInitializeCode.py +0 -0
  249. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/typeCheck.py +0 -0
  250. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/fns/utils.py +0 -0
  251. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/tasks/task_runner.py +0 -0
  252. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/terminals/__init__.py +0 -0
  253. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/terminals/terminals.py +0 -0
  254. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/terminals/utils.py +0 -0
  255. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/__init__.py +0 -0
  256. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/constants.py +0 -0
  257. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/generate_memorable_string.py +0 -0
  258. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/generate_new_filename.py +0 -0
  259. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/section_contents.py +0 -0
  260. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/utils.py +0 -0
  261. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta/utils/websocket_manager.py +0 -0
  262. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta.egg-info/SOURCES.txt +0 -0
  263. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta.egg-info/dependency_links.txt +0 -0
  264. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta.egg-info/entry_points.txt +0 -0
  265. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta.egg-info/requires.txt +0 -0
  266. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/backend/setta.egg-info/top_level.txt +0 -0
  267. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/pyproject.toml +0 -0
  268. {setta-0.0.14.dev2 → setta-0.0.14.dev3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: setta
3
- Version: 0.0.14.dev2
3
+ Version: 0.0.14.dev3
4
4
  Summary: Python without the donkeywork.
5
5
  Home-page: https://setta.dev
6
6
  Author: Kevin Musgrave, Jeff Musgrave
@@ -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,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: setta
3
- Version: 0.0.14.dev2
3
+ Version: 0.0.14.dev3
4
4
  Summary: Python without the donkeywork.
5
5
  Home-page: https://setta.dev
6
6
  Author: Kevin Musgrave, Jeff Musgrave
@@ -1 +0,0 @@
1
- __version__ = "0.0.14.dev2"