setta 0.0.1__py3-none-any.whl → 0.0.2__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (265) hide show
  1. setta/__init__.py +1 -1
  2. setta/cli/__init__.py +1 -0
  3. setta/cli/connect.py +43 -0
  4. setta/cli/logger.py +225 -0
  5. setta/code_gen/__init__.py +0 -0
  6. setta/code_gen/create_runnable_scripts.py +466 -0
  7. setta/code_gen/export_selected.py +776 -0
  8. setta/code_gen/find_placeholders.py +13 -0
  9. setta/code_gen/python/__init__.py +0 -0
  10. setta/code_gen/python/ast_utils.py +183 -0
  11. setta/code_gen/python/check_scope.py +187 -0
  12. setta/code_gen/python/generate_code.py +280 -0
  13. setta/code_gen/python/make_parseable.py +97 -0
  14. setta/code_gen/python/position_line_col.py +33 -0
  15. setta/code_gen/python/validate_imports.py +87 -0
  16. setta/code_gen/utils.py +120 -0
  17. setta/code_gen/yaml/__init__.py +0 -0
  18. setta/code_gen/yaml/generate_yaml.py +23 -0
  19. setta/code_gen/yaml/section_dict.py +93 -0
  20. setta/database/__init__.py +0 -0
  21. setta/database/backup.py +80 -0
  22. setta/database/db/__init__.py +0 -0
  23. setta/database/db/artifacts/__init__.py +0 -0
  24. setta/database/db/artifacts/load.py +93 -0
  25. setta/database/db/artifacts/save.py +85 -0
  26. setta/database/db/artifacts/save_or_create.py +68 -0
  27. setta/database/db/artifacts/utils.py +13 -0
  28. setta/database/db/codeInfo/__init__.py +0 -0
  29. setta/database/db/codeInfo/copy.py +26 -0
  30. setta/database/db/codeInfo/load.py +65 -0
  31. setta/database/db/codeInfo/save.py +75 -0
  32. setta/database/db/codeInfo/utils.py +33 -0
  33. setta/database/db/evRefs/__init__.py +0 -0
  34. setta/database/db/evRefs/load.py +45 -0
  35. setta/database/db/evRefs/save.py +95 -0
  36. setta/database/db/projects/__init__.py +0 -0
  37. setta/database/db/projects/copy.py +36 -0
  38. setta/database/db/projects/delete.py +7 -0
  39. setta/database/db/projects/load.py +184 -0
  40. setta/database/db/projects/save.py +267 -0
  41. setta/database/db/projects/saveAs.py +40 -0
  42. setta/database/db/projects/utils.py +135 -0
  43. setta/database/db/sectionVariants/__init__.py +0 -0
  44. setta/database/db/sectionVariants/copy.py +28 -0
  45. setta/database/db/sectionVariants/load.py +139 -0
  46. setta/database/db/sectionVariants/save.py +140 -0
  47. setta/database/db/sectionVariants/utils.py +44 -0
  48. setta/database/db/sections/__init__.py +0 -0
  49. setta/database/db/sections/copy.py +70 -0
  50. setta/database/db/sections/jsonSource.py +119 -0
  51. setta/database/db/sections/load.py +350 -0
  52. setta/database/db/sections/save.py +204 -0
  53. setta/database/db/sections/utils.py +13 -0
  54. setta/database/db/uiTypes/__init__.py +0 -0
  55. setta/database/db/uiTypes/copy.py +33 -0
  56. setta/database/db/uiTypes/load.py +51 -0
  57. setta/database/db/uiTypes/save.py +99 -0
  58. setta/database/db/uiTypes/utils.py +27 -0
  59. setta/database/db_init.py +36 -0
  60. setta/database/db_objs.py +102 -0
  61. setta/database/db_path.py +8 -0
  62. setta/database/export_db/__init__.py +0 -0
  63. setta/database/export_db/export_db.py +43 -0
  64. setta/database/export_db/export_raw.py +53 -0
  65. setta/database/export_db/export_readable.py +242 -0
  66. setta/database/export_db/utils.py +16 -0
  67. setta/database/import_db.py +28 -0
  68. setta/database/seed.py +41 -0
  69. setta/database/settings_file.py +118 -0
  70. setta/database/utils.py +32 -0
  71. setta/lsp/__init__.py +0 -0
  72. setta/lsp/file_watcher.py +113 -0
  73. setta/lsp/reader.py +184 -0
  74. setta/lsp/reader_fns/__init__.py +0 -0
  75. setta/lsp/reader_fns/completion.py +84 -0
  76. setta/lsp/reader_fns/definition.py +2 -0
  77. setta/lsp/reader_fns/diagnostics.py +99 -0
  78. setta/lsp/reader_fns/documentHighlight.py +25 -0
  79. setta/lsp/reader_fns/references.py +34 -0
  80. setta/lsp/reader_fns/signatureHelp.py +99 -0
  81. setta/lsp/server.py +150 -0
  82. setta/lsp/utils.py +60 -0
  83. setta/lsp/writer.py +306 -0
  84. setta/routers/__init__.py +11 -0
  85. setta/routers/artifact.py +105 -0
  86. setta/routers/code_info.py +32 -0
  87. setta/routers/dependencies.py +49 -0
  88. setta/routers/in_memory_fn_stdout_websocket.py +21 -0
  89. setta/routers/interactive.py +119 -0
  90. setta/routers/lsp.py +14 -0
  91. setta/routers/projects.py +188 -0
  92. setta/routers/reference_renaming.py +111 -0
  93. setta/routers/sections.py +174 -0
  94. setta/routers/settings.py +40 -0
  95. setta/routers/terminals.py +83 -0
  96. setta/routers/websocket.py +36 -0
  97. setta/server.py +141 -0
  98. setta/start.py +112 -0
  99. setta/static/constants/BaseUITypes.json +153 -0
  100. setta/static/constants/Settings.json +113 -0
  101. setta/static/constants/constants.json +117 -0
  102. setta/static/constants/db_init.sql +249 -0
  103. setta/static/constants/defaultValues.json +125 -0
  104. setta/static/constants/settingsProject.json +276 -0
  105. setta/static/frontend/android-chrome-192x192.png +0 -0
  106. setta/static/frontend/android-chrome-512x512.png +0 -0
  107. setta/static/frontend/apple-touch-icon.png +0 -0
  108. setta/static/frontend/assets/KaTeX_AMS-Regular-0cdd387c.woff2 +0 -0
  109. setta/static/frontend/assets/KaTeX_AMS-Regular-30da91e8.woff +0 -0
  110. setta/static/frontend/assets/KaTeX_AMS-Regular-68534840.ttf +0 -0
  111. setta/static/frontend/assets/KaTeX_Caligraphic-Bold-07d8e303.ttf +0 -0
  112. setta/static/frontend/assets/KaTeX_Caligraphic-Bold-1ae6bd74.woff +0 -0
  113. setta/static/frontend/assets/KaTeX_Caligraphic-Bold-de7701e4.woff2 +0 -0
  114. setta/static/frontend/assets/KaTeX_Caligraphic-Regular-3398dd02.woff +0 -0
  115. setta/static/frontend/assets/KaTeX_Caligraphic-Regular-5d53e70a.woff2 +0 -0
  116. setta/static/frontend/assets/KaTeX_Caligraphic-Regular-ed0b7437.ttf +0 -0
  117. setta/static/frontend/assets/KaTeX_Fraktur-Bold-74444efd.woff2 +0 -0
  118. setta/static/frontend/assets/KaTeX_Fraktur-Bold-9163df9c.ttf +0 -0
  119. setta/static/frontend/assets/KaTeX_Fraktur-Bold-9be7ceb8.woff +0 -0
  120. setta/static/frontend/assets/KaTeX_Fraktur-Regular-1e6f9579.ttf +0 -0
  121. setta/static/frontend/assets/KaTeX_Fraktur-Regular-51814d27.woff2 +0 -0
  122. setta/static/frontend/assets/KaTeX_Fraktur-Regular-5e28753b.woff +0 -0
  123. setta/static/frontend/assets/KaTeX_Main-Bold-0f60d1b8.woff2 +0 -0
  124. setta/static/frontend/assets/KaTeX_Main-Bold-138ac28d.ttf +0 -0
  125. setta/static/frontend/assets/KaTeX_Main-Bold-c76c5d69.woff +0 -0
  126. setta/static/frontend/assets/KaTeX_Main-BoldItalic-70ee1f64.ttf +0 -0
  127. setta/static/frontend/assets/KaTeX_Main-BoldItalic-99cd42a3.woff2 +0 -0
  128. setta/static/frontend/assets/KaTeX_Main-BoldItalic-a6f7ec0d.woff +0 -0
  129. setta/static/frontend/assets/KaTeX_Main-Italic-0d85ae7c.ttf +0 -0
  130. setta/static/frontend/assets/KaTeX_Main-Italic-97479ca6.woff2 +0 -0
  131. setta/static/frontend/assets/KaTeX_Main-Italic-f1d6ef86.woff +0 -0
  132. setta/static/frontend/assets/KaTeX_Main-Regular-c2342cd8.woff2 +0 -0
  133. setta/static/frontend/assets/KaTeX_Main-Regular-c6368d87.woff +0 -0
  134. setta/static/frontend/assets/KaTeX_Main-Regular-d0332f52.ttf +0 -0
  135. setta/static/frontend/assets/KaTeX_Math-BoldItalic-850c0af5.woff +0 -0
  136. setta/static/frontend/assets/KaTeX_Math-BoldItalic-dc47344d.woff2 +0 -0
  137. setta/static/frontend/assets/KaTeX_Math-BoldItalic-f9377ab0.ttf +0 -0
  138. setta/static/frontend/assets/KaTeX_Math-Italic-08ce98e5.ttf +0 -0
  139. setta/static/frontend/assets/KaTeX_Math-Italic-7af58c5e.woff2 +0 -0
  140. setta/static/frontend/assets/KaTeX_Math-Italic-8a8d2445.woff +0 -0
  141. setta/static/frontend/assets/KaTeX_SansSerif-Bold-1ece03f7.ttf +0 -0
  142. setta/static/frontend/assets/KaTeX_SansSerif-Bold-e99ae511.woff2 +0 -0
  143. setta/static/frontend/assets/KaTeX_SansSerif-Bold-ece03cfd.woff +0 -0
  144. setta/static/frontend/assets/KaTeX_SansSerif-Italic-00b26ac8.woff2 +0 -0
  145. setta/static/frontend/assets/KaTeX_SansSerif-Italic-3931dd81.ttf +0 -0
  146. setta/static/frontend/assets/KaTeX_SansSerif-Italic-91ee6750.woff +0 -0
  147. setta/static/frontend/assets/KaTeX_SansSerif-Regular-11e4dc8a.woff +0 -0
  148. setta/static/frontend/assets/KaTeX_SansSerif-Regular-68e8c73e.woff2 +0 -0
  149. setta/static/frontend/assets/KaTeX_SansSerif-Regular-f36ea897.ttf +0 -0
  150. setta/static/frontend/assets/KaTeX_Script-Regular-036d4e95.woff2 +0 -0
  151. setta/static/frontend/assets/KaTeX_Script-Regular-1c67f068.ttf +0 -0
  152. setta/static/frontend/assets/KaTeX_Script-Regular-d96cdf2b.woff +0 -0
  153. setta/static/frontend/assets/KaTeX_Size1-Regular-6b47c401.woff2 +0 -0
  154. setta/static/frontend/assets/KaTeX_Size1-Regular-95b6d2f1.ttf +0 -0
  155. setta/static/frontend/assets/KaTeX_Size1-Regular-c943cc98.woff +0 -0
  156. setta/static/frontend/assets/KaTeX_Size2-Regular-2014c523.woff +0 -0
  157. setta/static/frontend/assets/KaTeX_Size2-Regular-a6b2099f.ttf +0 -0
  158. setta/static/frontend/assets/KaTeX_Size2-Regular-d04c5421.woff2 +0 -0
  159. setta/static/frontend/assets/KaTeX_Size3-Regular-500e04d5.ttf +0 -0
  160. setta/static/frontend/assets/KaTeX_Size3-Regular-6ab6b62e.woff +0 -0
  161. setta/static/frontend/assets/KaTeX_Size4-Regular-99f9c675.woff +0 -0
  162. setta/static/frontend/assets/KaTeX_Size4-Regular-a4af7d41.woff2 +0 -0
  163. setta/static/frontend/assets/KaTeX_Size4-Regular-c647367d.ttf +0 -0
  164. setta/static/frontend/assets/KaTeX_Typewriter-Regular-71d517d6.woff2 +0 -0
  165. setta/static/frontend/assets/KaTeX_Typewriter-Regular-e14fed02.woff +0 -0
  166. setta/static/frontend/assets/KaTeX_Typewriter-Regular-f01f3e87.ttf +0 -0
  167. setta/static/frontend/assets/cormorant-garamond-all-700-italic-c9b58582.woff +0 -0
  168. setta/static/frontend/assets/cormorant-garamond-cyrillic-700-italic-9101ad5f.woff2 +0 -0
  169. setta/static/frontend/assets/cormorant-garamond-cyrillic-ext-700-italic-950de0d6.woff2 +0 -0
  170. setta/static/frontend/assets/cormorant-garamond-latin-700-italic-0bc53e12.woff2 +0 -0
  171. setta/static/frontend/assets/cormorant-garamond-latin-ext-700-italic-525738e0.woff2 +0 -0
  172. setta/static/frontend/assets/cormorant-garamond-vietnamese-700-italic-99563037.woff2 +0 -0
  173. setta/static/frontend/assets/erase-5e0448ea.svg +15 -0
  174. setta/static/frontend/assets/index-1d4b4ecf.css +32 -0
  175. setta/static/frontend/assets/index-ee99dc72.js +678 -0
  176. setta/static/frontend/assets/inter-all-400-normal-054f12d0.woff +0 -0
  177. setta/static/frontend/assets/inter-all-600-normal-c03769e5.woff +0 -0
  178. setta/static/frontend/assets/inter-all-800-normal-15dc6e4b.woff +0 -0
  179. setta/static/frontend/assets/inter-cyrillic-400-normal-a4eee61a.woff2 +0 -0
  180. setta/static/frontend/assets/inter-cyrillic-600-normal-8b14f703.woff2 +0 -0
  181. setta/static/frontend/assets/inter-cyrillic-800-normal-e706eaaa.woff2 +0 -0
  182. setta/static/frontend/assets/inter-cyrillic-ext-400-normal-70047a3b.woff2 +0 -0
  183. setta/static/frontend/assets/inter-cyrillic-ext-600-normal-d4ab9bc4.woff2 +0 -0
  184. setta/static/frontend/assets/inter-cyrillic-ext-800-normal-eae7515a.woff2 +0 -0
  185. setta/static/frontend/assets/inter-greek-400-normal-381ea30d.woff2 +0 -0
  186. setta/static/frontend/assets/inter-greek-600-normal-601f93a2.woff2 +0 -0
  187. setta/static/frontend/assets/inter-greek-800-normal-7af4fb64.woff2 +0 -0
  188. setta/static/frontend/assets/inter-greek-ext-400-normal-27027b17.woff2 +0 -0
  189. setta/static/frontend/assets/inter-greek-ext-600-normal-f2ddf9de.woff2 +0 -0
  190. setta/static/frontend/assets/inter-greek-ext-800-normal-4cb6189e.woff2 +0 -0
  191. setta/static/frontend/assets/inter-latin-400-normal-d56fec21.woff2 +0 -0
  192. setta/static/frontend/assets/inter-latin-600-normal-ff769fa6.woff2 +0 -0
  193. setta/static/frontend/assets/inter-latin-800-normal-5eea1309.woff2 +0 -0
  194. setta/static/frontend/assets/inter-latin-ext-400-normal-bb698d85.woff2 +0 -0
  195. setta/static/frontend/assets/inter-latin-ext-600-normal-ca4808f9.woff2 +0 -0
  196. setta/static/frontend/assets/inter-latin-ext-800-normal-ebdacc0f.woff2 +0 -0
  197. setta/static/frontend/assets/logo/logo.svg +8 -0
  198. setta/static/frontend/assets/pen-455d7d8a.svg +19 -0
  199. setta/static/frontend/assets/source-code-pro-all-500-normal-6bdaa03b.woff +0 -0
  200. setta/static/frontend/assets/source-code-pro-cyrillic-500-normal-288a0d68.woff2 +0 -0
  201. setta/static/frontend/assets/source-code-pro-cyrillic-ext-500-normal-b110a13b.woff2 +0 -0
  202. setta/static/frontend/assets/source-code-pro-greek-500-normal-04328acb.woff2 +0 -0
  203. setta/static/frontend/assets/source-code-pro-latin-500-normal-06edef1e.woff2 +0 -0
  204. setta/static/frontend/assets/source-code-pro-latin-ext-500-normal-6dc60d5e.woff2 +0 -0
  205. setta/static/frontend/assets/web-vitals-44a8e082.js +1 -0
  206. setta/static/frontend/assets/work-sans-all-400-normal-38034a3c.woff +0 -0
  207. setta/static/frontend/assets/work-sans-all-500-normal-550d64e5.woff +0 -0
  208. setta/static/frontend/assets/work-sans-all-600-normal-ccf14060.woff +0 -0
  209. setta/static/frontend/assets/work-sans-all-700-normal-494c2971.woff +0 -0
  210. setta/static/frontend/assets/work-sans-latin-400-normal-36735bc1.woff2 +0 -0
  211. setta/static/frontend/assets/work-sans-latin-500-normal-3790bfda.woff2 +0 -0
  212. setta/static/frontend/assets/work-sans-latin-600-normal-5fba494e.woff2 +0 -0
  213. setta/static/frontend/assets/work-sans-latin-700-normal-a5033d0a.woff2 +0 -0
  214. setta/static/frontend/assets/work-sans-latin-ext-400-normal-c20f571a.woff2 +0 -0
  215. setta/static/frontend/assets/work-sans-latin-ext-500-normal-0f5ac96c.woff2 +0 -0
  216. setta/static/frontend/assets/work-sans-latin-ext-600-normal-97a237d1.woff2 +0 -0
  217. setta/static/frontend/assets/work-sans-latin-ext-700-normal-103e112c.woff2 +0 -0
  218. setta/static/frontend/browserconfig.xml +9 -0
  219. setta/static/frontend/favicon-16x16.png +0 -0
  220. setta/static/frontend/favicon-32x32.png +0 -0
  221. setta/static/frontend/favicon.ico +0 -0
  222. setta/static/frontend/index.html +30 -0
  223. setta/static/frontend/manifest.json +25 -0
  224. setta/static/frontend/mstile-144x144.png +0 -0
  225. setta/static/frontend/mstile-150x150.png +0 -0
  226. setta/static/frontend/mstile-310x150.png +0 -0
  227. setta/static/frontend/mstile-310x310.png +0 -0
  228. setta/static/frontend/mstile-70x70.png +0 -0
  229. setta/static/frontend/robots.txt +3 -0
  230. setta/static/frontend/safari-pinned-tab.svg +18 -0
  231. setta/static/frontend/site.webmanifest +19 -0
  232. setta/static/seed/.DS_Store +0 -0
  233. setta/static/seed/examples/.DS_Store +0 -0
  234. setta/tasks/__init__.py +0 -0
  235. setta/tasks/fns/__init__.py +9 -0
  236. setta/tasks/fns/codeAreaAutocomplete.py +209 -0
  237. setta/tasks/fns/codeAreaFindTemplateVars.py +128 -0
  238. setta/tasks/fns/codeAreaInitializeCode.py +98 -0
  239. setta/tasks/fns/findEVRefs.py +236 -0
  240. setta/tasks/fns/parametersRequest.py +71 -0
  241. setta/tasks/fns/textFieldAutocomplete.py +210 -0
  242. setta/tasks/fns/textFieldInitializeCode.py +99 -0
  243. setta/tasks/fns/typeCheck.py +40 -0
  244. setta/tasks/fns/utils.py +134 -0
  245. setta/tasks/task_runner.py +29 -0
  246. setta/tasks/tasks.py +152 -0
  247. setta/tasks/utils.py +178 -0
  248. setta/terminals/__init__.py +0 -0
  249. setta/terminals/terminals.py +242 -0
  250. setta/terminals/utils.py +37 -0
  251. setta/utils/__init__.py +0 -0
  252. setta/utils/constants.py +148 -0
  253. setta/utils/generate_memorable_string.py +431 -0
  254. setta/utils/generate_new_filename.py +80 -0
  255. setta/utils/section_contents.py +133 -0
  256. setta/utils/utils.py +271 -0
  257. setta/utils/websocket_manager.py +91 -0
  258. setta-0.0.2.dist-info/LICENSE +201 -0
  259. setta-0.0.2.dist-info/METADATA +24 -0
  260. setta-0.0.2.dist-info/RECORD +263 -0
  261. {setta-0.0.1.dist-info → setta-0.0.2.dist-info}/WHEEL +1 -1
  262. setta-0.0.2.dist-info/entry_points.txt +2 -0
  263. setta-0.0.1.dist-info/METADATA +0 -18
  264. setta-0.0.1.dist-info/RECORD +0 -5
  265. {setta-0.0.1.dist-info → setta-0.0.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,139 @@
1
+ import json
2
+
3
+ from setta.database.db.sectionVariants.utils import (
4
+ with_ev_entry_defaults,
5
+ with_section_variant_defaults,
6
+ )
7
+
8
+
9
+ def load_section_variants(db, ids):
10
+ placeholders = ", ".join(["?"] * len(ids))
11
+ query = f"""
12
+ SELECT SectionVariantId.id, SectionVariantId.name, SectionVariantId.data, SectionVariantId.selectedItem, SectionVariantId.codeInfoColId, SectionVariantEV.codeInfoId, SectionVariantEV.data as valueData
13
+ FROM SectionVariantId
14
+ LEFT JOIN SectionVariantEV
15
+ ON SectionVariantId.id = SectionVariantEV.idid
16
+ WHERE SectionVariantId.id in ({placeholders})
17
+ """
18
+ db.execute(query, ids)
19
+ output = {}
20
+ for row in db.fetchall():
21
+ id = row["id"]
22
+ if id not in output:
23
+ output[id] = with_section_variant_defaults(
24
+ name=row["name"],
25
+ selectedItem=row["selectedItem"],
26
+ codeInfoColId=row["codeInfoColId"],
27
+ **json.loads(row["data"]),
28
+ )
29
+ if row["valueData"]:
30
+ output[id]["values"][row["codeInfoId"]] = with_ev_entry_defaults(
31
+ **json.loads(row["valueData"])
32
+ )
33
+
34
+ query = f"""
35
+ SELECT SectionVariantId.id, SectionVariantChildren.childId, SectionVariantChildren."order"
36
+ FROM SectionVariantId
37
+ JOIN SectionVariantChildren
38
+ ON SectionVariantId.id = SectionVariantChildren.idid
39
+ WHERE SectionVariantId.id in ({placeholders})
40
+ ORDER BY SectionVariantChildren."order"
41
+ """
42
+ db.execute(query, ids)
43
+ for row in db.fetchall():
44
+ output[row["id"]]["children"].append(row["childId"])
45
+
46
+ query = f"""
47
+ SELECT SectionVariantId.id, SectionVariantParamSweep.selectedItemGroupNum, SectionVariantParamSweep.paramInfoGroupNum, SectionVariantParamSweep.selectedItem, SectionVariantParamSweep.paramInfoId, SectionVariantParamSweep.value
48
+ FROM SectionVariantId
49
+ LEFT JOIN SectionVariantParamSweep
50
+ ON SectionVariantId.id = SectionVariantParamSweep.idid
51
+ WHERE SectionVariantId.id in ({placeholders})
52
+ ORDER BY SectionVariantParamSweep."order"
53
+ """
54
+ db.execute(query, ids)
55
+ for row in db.fetchall():
56
+ id = row["id"]
57
+ if "sweep" not in output[id]:
58
+ output[id]["sweep"] = []
59
+ curr = output[id]["sweep"]
60
+
61
+ selectedItemGroupNum = row["selectedItemGroupNum"]
62
+ if selectedItemGroupNum is None:
63
+ continue
64
+ if len(curr) <= selectedItemGroupNum:
65
+ curr.append({"selectedItem": row["selectedItem"], "params": []})
66
+ curr = curr[selectedItemGroupNum]["params"]
67
+
68
+ paramInfoGroupNum = row["paramInfoGroupNum"]
69
+ if paramInfoGroupNum is None:
70
+ continue
71
+ if len(curr) <= paramInfoGroupNum:
72
+ curr.append({"paramInfoId": row["paramInfoId"], "values": []})
73
+ curr = curr[paramInfoGroupNum]["values"]
74
+
75
+ if row["value"] is not None:
76
+ curr.append(row["value"])
77
+
78
+ query = f"""
79
+ SELECT
80
+ SectionVariantId.id,
81
+ SectionVariantRunGroup.sectionId,
82
+ SectionVariantRunGroup.parentVariantId,
83
+ SectionVariantRunGroup.selected,
84
+ SectionVariantRunGroupVersions.versionId,
85
+ SectionVariantRunGroupVersions.selected as version_selected,
86
+ SectionVariantRunGroupParamSweeps.sweepId,
87
+ SectionVariantRunGroupParamSweeps.selected as sweep_selected
88
+ FROM SectionVariantId
89
+ LEFT JOIN SectionVariantRunGroup
90
+ ON SectionVariantId.id = SectionVariantRunGroup.idid
91
+ LEFT JOIN SectionVariantRunGroupVersions
92
+ ON SectionVariantRunGroup.idid = SectionVariantRunGroupVersions.idid
93
+ AND SectionVariantRunGroup.sectionId = SectionVariantRunGroupVersions.sectionId
94
+ AND (
95
+ (SectionVariantRunGroup.parentVariantId IS NULL AND SectionVariantRunGroupVersions.parentVariantId IS NULL)
96
+ OR SectionVariantRunGroup.parentVariantId = SectionVariantRunGroupVersions.parentVariantId
97
+ )
98
+ LEFT JOIN SectionVariantRunGroupParamSweeps
99
+ ON SectionVariantRunGroup.idid = SectionVariantRunGroupParamSweeps.idid
100
+ AND SectionVariantRunGroup.sectionId = SectionVariantRunGroupParamSweeps.sectionId
101
+ AND (
102
+ (SectionVariantRunGroup.parentVariantId IS NULL AND SectionVariantRunGroupParamSweeps.parentVariantId IS NULL)
103
+ OR SectionVariantRunGroup.parentVariantId = SectionVariantRunGroupParamSweeps.parentVariantId
104
+ )
105
+ WHERE SectionVariantId.id in ({placeholders})
106
+ """
107
+ db.execute(query, ids)
108
+ for row in db.fetchall():
109
+ id = row["id"]
110
+ if "runGroup" not in output[id]:
111
+ output[id]["runGroup"] = {}
112
+ curr = output[id]["runGroup"]
113
+ sectionId = row["sectionId"]
114
+
115
+ if not sectionId:
116
+ continue
117
+
118
+ if sectionId not in curr:
119
+ curr[sectionId] = {}
120
+ if row["parentVariantId"] not in curr[sectionId]:
121
+ curr[sectionId][row["parentVariantId"]] = {
122
+ "selected": bool(row["selected"]),
123
+ "versions": {},
124
+ "paramSweeps": {},
125
+ }
126
+
127
+ # Add version data if present
128
+ if row["versionId"] is not None:
129
+ curr[sectionId][row["parentVariantId"]]["versions"][
130
+ row["versionId"]
131
+ ] = bool(row["version_selected"])
132
+
133
+ # Add param sweep data if present
134
+ if row["sweepId"] is not None:
135
+ curr[sectionId][row["parentVariantId"]]["paramSweeps"][
136
+ row["sweepId"]
137
+ ] = bool(row["sweep_selected"])
138
+
139
+ return output
@@ -0,0 +1,140 @@
1
+ import json
2
+
3
+ from setta.utils.constants import (
4
+ DEFAULT_VALUES,
5
+ SECTION_VARIANT_EV_TABLE_DATA_JSON_FIELDS,
6
+ SECTION_VARIANT_ID_TABLE_DATA_JSON_FIELDS,
7
+ )
8
+ from setta.utils.utils import filter_dict
9
+
10
+
11
+ def save_section_variants(db, section_variants):
12
+ query = """
13
+ INSERT INTO SectionVariantId (id, name, data, selectedItem, codeInfoColId)
14
+ VALUES (:id, :name, :data, :selectedItem, :codeInfoColId)
15
+ ON CONFLICT (id)
16
+ DO UPDATE SET
17
+ name = :name,
18
+ data = :data,
19
+ selectedItem = :selectedItem,
20
+ codeInfoColId = :codeInfoColId
21
+ """
22
+
23
+ query_params = [
24
+ {
25
+ "id": k,
26
+ "name": v["name"],
27
+ "selectedItem": v["selectedItem"],
28
+ "codeInfoColId": v["codeInfoColId"],
29
+ "data": json.dumps(
30
+ filter_dict(
31
+ v,
32
+ SECTION_VARIANT_ID_TABLE_DATA_JSON_FIELDS,
33
+ DEFAULT_VALUES["sectionVariant"],
34
+ )
35
+ ),
36
+ }
37
+ for k, v in section_variants.items()
38
+ ]
39
+ db.executemany(query, query_params)
40
+
41
+ # delete entered values
42
+ placeholders = ", ".join(["?"] * len(section_variants))
43
+ query = f"""
44
+ DELETE FROM SectionVariantEV
45
+ WHERE idid IN ({placeholders})
46
+ """
47
+ query_params = list(section_variants.keys())
48
+ db.execute(query, query_params)
49
+
50
+ # add entered values
51
+ query = """
52
+ INSERT INTO SectionVariantEV (idid, codeInfoId, data)
53
+ VALUES (:idid, :codeInfoId, :data)
54
+ """
55
+ query_params = []
56
+ for idid, variant in section_variants.items():
57
+ for code_info_id, value_info in variant["values"].items():
58
+ query_params.append(
59
+ {
60
+ "idid": idid,
61
+ "codeInfoId": code_info_id,
62
+ "data": json.dumps(
63
+ filter_dict(
64
+ value_info,
65
+ SECTION_VARIANT_EV_TABLE_DATA_JSON_FIELDS,
66
+ DEFAULT_VALUES["evEntry"],
67
+ )
68
+ ),
69
+ }
70
+ )
71
+ db.executemany(query, query_params)
72
+
73
+ query = f"""
74
+ DELETE FROM SectionVariantParamSweep
75
+ WHERE idid IN ({placeholders})
76
+ """
77
+ query_params = list(section_variants.keys())
78
+ db.execute(query, query_params)
79
+
80
+ query = """
81
+ INSERT INTO SectionVariantParamSweep (idid, selectedItemGroupNum, paramInfoGroupNum, selectedItem, paramInfoId, "order", value)
82
+ VALUES (:idid, :selectedItemGroupNum, :paramInfoGroupNum, :selectedItem, :paramInfoId, :order, :value)
83
+ """
84
+
85
+ query_params = []
86
+ for id, variant in section_variants.items():
87
+ order = 0
88
+ for selectedItemGroupNum, s in enumerate(variant["sweep"]):
89
+ selected_item = s["selectedItem"]
90
+ if len(s["params"]) == 0:
91
+ query_params.append(
92
+ generate_query_param(
93
+ id,
94
+ selectedItemGroupNum,
95
+ None,
96
+ selected_item,
97
+ None,
98
+ order,
99
+ None,
100
+ )
101
+ )
102
+ order += 1
103
+ else:
104
+ for paramInfoGroupNum, param in enumerate(s["params"]):
105
+ values = param["values"] or [None]
106
+ for value in values:
107
+ query_params.append(
108
+ generate_query_param(
109
+ id,
110
+ selectedItemGroupNum,
111
+ paramInfoGroupNum,
112
+ selected_item,
113
+ param["paramInfoId"],
114
+ order,
115
+ value,
116
+ )
117
+ )
118
+ order += 1
119
+
120
+ db.executemany(query, query_params)
121
+
122
+
123
+ def generate_query_param(
124
+ id,
125
+ selectedItemGroupNum,
126
+ paramInfoGroupNum,
127
+ selected_item,
128
+ param_info_id,
129
+ order,
130
+ value,
131
+ ):
132
+ return {
133
+ "idid": id,
134
+ "selectedItemGroupNum": selectedItemGroupNum,
135
+ "paramInfoGroupNum": paramInfoGroupNum,
136
+ "selectedItem": selected_item,
137
+ "paramInfoId": param_info_id,
138
+ "order": order,
139
+ "value": value,
140
+ }
@@ -0,0 +1,44 @@
1
+ import copy
2
+
3
+ from setta.database.utils import create_new_id
4
+ from setta.utils.constants import DEFAULT_VALUES
5
+ from setta.utils.generate_memorable_string import generate_memorable_string
6
+ from setta.utils.utils import recursive_dict_merge
7
+
8
+
9
+ def new_section_variant(**kwargs):
10
+ id = kwargs.get("id", create_new_id())
11
+ kwargs["name"] = kwargs.get("name", generate_memorable_string())
12
+ obj = with_section_variant_defaults(**kwargs)
13
+ return id, obj
14
+
15
+
16
+ def with_section_variant_defaults(**kwargs):
17
+ return recursive_dict_merge(copy.deepcopy(DEFAULT_VALUES["sectionVariant"]), kwargs)
18
+
19
+
20
+ def add_defaults_to_section_variants(section_variants):
21
+ for k, v in section_variants.items():
22
+ section_variants[k] = with_section_variant_defaults(**v)
23
+
24
+ for paramId, valueInfo in section_variants[k]["values"].items():
25
+ section_variants[k]["values"][paramId] = with_ev_entry_defaults(**valueInfo)
26
+ evRefs = section_variants[k]["values"][paramId]["evRefs"]
27
+ for idx in range(len(evRefs)):
28
+ evRefs[idx] = with_ev_ref_entry_defaults(**evRefs[idx])
29
+
30
+ evRefs = section_variants[k]["evRefs"]
31
+ for idx in range(len(evRefs)):
32
+ evRefs[idx] = with_ev_ref_entry_defaults(**evRefs[idx])
33
+
34
+
35
+ def with_ev_entry_defaults(**kwargs):
36
+ return recursive_dict_merge(copy.deepcopy(DEFAULT_VALUES["evEntry"]), kwargs)
37
+
38
+
39
+ def new_ev_entry(**kwargs):
40
+ return with_ev_entry_defaults(**kwargs)
41
+
42
+
43
+ def with_ev_ref_entry_defaults(**kwargs):
44
+ return recursive_dict_merge(copy.deepcopy(DEFAULT_VALUES["evRefEntry"]), kwargs)
File without changes
@@ -0,0 +1,70 @@
1
+ from setta.database.utils import remap_ids, rename_keys
2
+
3
+ from ..codeInfo.copy import copy_code_info, copy_code_info_col
4
+ from ..sectionVariants.copy import (
5
+ copy_section_variants,
6
+ update_section_variant_children,
7
+ )
8
+ from ..uiTypes.copy import copy_ui_type_cols, copy_ui_types
9
+
10
+
11
+ def copy_sections(
12
+ sections,
13
+ section_variant_id_map,
14
+ ui_type_id_map,
15
+ ui_type_col_id_map,
16
+ ):
17
+ new_sections, section_id_map = remap_ids(sections)
18
+ for section in new_sections.values():
19
+ section["id"] = section_id_map[section["id"]]
20
+ section["variantId"] = section_variant_id_map[section["variantId"]]
21
+ section["uiTypeId"] = ui_type_id_map[section["uiTypeId"]]
22
+ if section["uiTypeColId"]:
23
+ section["uiTypeColId"] = ui_type_col_id_map[section["uiTypeColId"]]
24
+ section["variantIds"] = [
25
+ section_variant_id_map[x] for x in section["variantIds"]
26
+ ]
27
+ section["nonPresetUITypeIds"] = [
28
+ ui_type_id_map[x] for x in section["nonPresetUITypeIds"]
29
+ ]
30
+ section["paramSweepSectionId"] = section_id_map.get(
31
+ section["paramSweepSectionId"], None
32
+ )
33
+ section["parentId"] = section_id_map.get(section["parentId"], None)
34
+
35
+ return new_sections, section_id_map
36
+
37
+
38
+ def copy_sections_and_other_info(x):
39
+ new_code_info, code_info_id_map = copy_code_info(x["codeInfo"])
40
+ new_code_info_cols, code_info_col_id_map = copy_code_info_col(
41
+ x["codeInfoCols"], code_info_id_map
42
+ )
43
+ new_section_variants, section_variant_id_map = copy_section_variants(
44
+ x["sectionVariants"], code_info_id_map, code_info_col_id_map
45
+ )
46
+ new_ui_types, ui_type_id_map = copy_ui_types(x["uiTypes"])
47
+ new_ui_type_cols, ui_type_col_id_map = copy_ui_type_cols(
48
+ x["uiTypeCols"], ui_type_id_map, code_info_id_map
49
+ )
50
+ new_sections, section_id_map = copy_sections(
51
+ x["sections"],
52
+ section_variant_id_map,
53
+ ui_type_id_map,
54
+ ui_type_col_id_map,
55
+ )
56
+ update_section_variant_children(new_section_variants, section_id_map)
57
+
58
+ return {
59
+ "codeInfo": new_code_info,
60
+ "codeInfoCols": new_code_info_cols,
61
+ "sectionVariants": new_section_variants,
62
+ "uiTypes": new_ui_types,
63
+ "uiTypeCols": new_ui_type_cols,
64
+ "sections": new_sections,
65
+ "section_id_map": section_id_map,
66
+ }
67
+
68
+
69
+ def copy_relative_positions(relative_positions, section_id_map):
70
+ return rename_keys(relative_positions, section_id_map)
@@ -0,0 +1,119 @@
1
+ import json
2
+ from collections import defaultdict
3
+
4
+ from setta.utils.constants import BASE_UI_TYPE_IDS, C, is_from_json_source
5
+ from setta.utils.utils import recursive_dict_merge, save_json_to_file, try_json
6
+
7
+
8
+ def save_json_source_data(p, section_ids=None, forking_from=None):
9
+ sections = {
10
+ k: v
11
+ for k, v in p["sections"].items()
12
+ if v.get("jsonSource", None) and ((not section_ids) or k in section_ids)
13
+ }
14
+
15
+ to_be_saved = defaultdict(dict)
16
+
17
+ forking_from_data = {}
18
+ if forking_from:
19
+ with open(forking_from, "r") as f:
20
+ forking_from_data = json.load(f)
21
+
22
+ for s in sections.values():
23
+ for variantId in s["variantIds"]:
24
+ variant = p["sectionVariants"][variantId]
25
+ codeInfoCol = p["codeInfoCols"][variant["codeInfoColId"]]
26
+ filename = variant["name"]
27
+ for k, children in codeInfoCol["children"].items():
28
+ if is_from_json_source(k):
29
+ metadata = json.loads(k.removeprefix(C.JSON_SOURCE_PREFIX))
30
+ key_path = metadata["key"]
31
+ value = try_getting_value(variant, k, children)
32
+
33
+ current_dict = add_key_path_to_dict(
34
+ to_be_saved[filename], key_path[:-1]
35
+ )
36
+
37
+ # Set the value at the final position
38
+ if key_path: # Only set if we have a path
39
+ current_dict[key_path[-1]] = value
40
+
41
+ # Make sure the jsonSourceKeys are present.
42
+ # (They might not be because they are completely empty)
43
+ add_key_path_to_dict(to_be_saved[filename], s["jsonSourceKeys"])
44
+
45
+ # Save each file
46
+ for filename, data in to_be_saved.items():
47
+ data = recursive_dict_merge(forking_from_data, data)
48
+ save_json_to_file(filename, data)
49
+
50
+ return to_be_saved
51
+
52
+
53
+ def try_getting_value(variant, codeInfoId, codeInfoChildren):
54
+ if len(codeInfoChildren) == 0:
55
+ if codeInfoId in variant["values"]:
56
+ return try_json(variant["values"][codeInfoId]["value"])
57
+ return ""
58
+ return {}
59
+
60
+
61
+ def add_key_path_to_dict(output, key_path):
62
+ for path_part in key_path:
63
+ # Create nested dictionaries if they don't exist
64
+ if path_part not in output:
65
+ output[path_part] = {}
66
+ output = output[path_part]
67
+ return output
68
+
69
+
70
+ def condition_keep_code_info(k, jsonCodeInfoWithUIType, keepCodeInfoThatHaveUITypes):
71
+ if keepCodeInfoThatHaveUITypes:
72
+ return k in jsonCodeInfoWithUIType or not is_from_json_source(k)
73
+ return not is_from_json_source(k)
74
+
75
+
76
+ def remove_json_source_data(p, keepCodeInfoThatHaveUITypes=True):
77
+ for variant in p["sectionVariants"].values():
78
+ variant["values"] = {
79
+ k: v for k, v in variant["values"].items() if not is_from_json_source(k)
80
+ }
81
+
82
+ jsonCodeInfoWithUIType = set()
83
+ if keepCodeInfoThatHaveUITypes:
84
+ for uiTypeCol in p["uiTypeCols"].values():
85
+ for paramInfoId, uiTypeInfo in uiTypeCol.items():
86
+ # we want to know which json source params have an associated uiTypeId
87
+ # only if it's not the base TEXT type, since that's the default
88
+ if (
89
+ is_from_json_source(paramInfoId)
90
+ and uiTypeInfo["uiTypeId"] != BASE_UI_TYPE_IDS[C.TEXT]
91
+ ):
92
+ jsonCodeInfoWithUIType.add(paramInfoId)
93
+
94
+ p["codeInfo"] = {
95
+ k: v
96
+ for k, v in p["codeInfo"].items()
97
+ if condition_keep_code_info(
98
+ k, jsonCodeInfoWithUIType, keepCodeInfoThatHaveUITypes
99
+ )
100
+ }
101
+
102
+ for codeInfoColId in p["codeInfoCols"].keys():
103
+ codeInfoCol = p["codeInfoCols"][codeInfoColId]
104
+ codeInfoCol["children"] = {
105
+ k: v
106
+ for k, v in codeInfoCol["children"].items()
107
+ if k is None
108
+ or condition_keep_code_info(
109
+ k, jsonCodeInfoWithUIType, keepCodeInfoThatHaveUITypes
110
+ )
111
+ }
112
+ for id, children in codeInfoCol["children"].items():
113
+ codeInfoCol["children"][id] = [
114
+ c
115
+ for c in children
116
+ if condition_keep_code_info(
117
+ c, jsonCodeInfoWithUIType, keepCodeInfoThatHaveUITypes
118
+ )
119
+ ]