setta 0.0.1.dev0__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.dev0.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.dev0.dist-info/METADATA +0 -18
  264. setta-0.0.1.dev0.dist-info/RECORD +0 -5
  265. {setta-0.0.1.dev0.dist-info → setta-0.0.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,184 @@
1
+ import json
2
+
3
+ from setta.database.db.evRefs.load import (
4
+ load_ev_refs_into_data_structures,
5
+ load_template_vars_into_data_structures,
6
+ )
7
+ from setta.database.db.projects.utils import with_project_config_defaults
8
+ from setta.utils.utils import recursive_dict_merge
9
+
10
+ from ..codeInfo.load import load_code_info_cols
11
+ from ..sections.load import (
12
+ load_json_sources_into_data_structures,
13
+ load_section_configs,
14
+ load_sections,
15
+ )
16
+
17
+
18
+ class ProjectNotFound(Exception):
19
+ pass
20
+
21
+
22
+ def load_all_project_config_metadata(db):
23
+ query = """
24
+ SELECT
25
+ pc.id,
26
+ pc.name,
27
+ pc.data,
28
+ pcc.x,
29
+ pcc.y,
30
+ pcc.zIndex,
31
+ pcc.w,
32
+ pcc.h
33
+ FROM
34
+ ProjectConfig pc
35
+ LEFT JOIN
36
+ ProjectConfigChildren pcc ON pc.id = pcc.parentId
37
+ ORDER BY
38
+ pc.id;
39
+ """
40
+ db.execute(query)
41
+ output = {}
42
+ for row in db.fetchall():
43
+ id = row["id"]
44
+ if id not in output:
45
+ output[id] = with_project_config_defaults(
46
+ id=row["id"],
47
+ name=row["name"],
48
+ childrenForPreviewImg=[],
49
+ **json.loads(row["data"]),
50
+ )
51
+ if row["x"]:
52
+ output[id]["childrenForPreviewImg"].append(
53
+ {
54
+ "x": row["x"],
55
+ "y": row["y"],
56
+ "zIndex": row["zIndex"],
57
+ "w": row["w"],
58
+ "h": row["h"],
59
+ }
60
+ )
61
+
62
+ default_name = load_default_config_name(db)
63
+ return list(output.values()), default_name
64
+
65
+
66
+ def load_project_config_metadata(db, config_name):
67
+ query = """
68
+ SELECT
69
+ ProjectConfig.id,
70
+ ProjectConfig.name,
71
+ ProjectConfig.data,
72
+ pcc.childId as childId,
73
+ pcc.x,
74
+ pcc.y,
75
+ pcc.zIndex,
76
+ pcc.w,
77
+ pcc.h
78
+ FROM
79
+ ProjectConfig
80
+ LEFT JOIN
81
+ ProjectConfigChildren pcc
82
+ ON
83
+ ProjectConfig.id = pcc.parentId
84
+ WHERE
85
+ name = :name
86
+ """
87
+
88
+ query_params = {"name": config_name}
89
+ db.execute(query, query_params)
90
+ output = {}
91
+ for row in db.fetchall():
92
+ id = row["id"]
93
+ if id not in output:
94
+ output[id] = with_project_config_defaults(
95
+ id=row["id"],
96
+ name=row["name"],
97
+ **json.loads(row["data"]),
98
+ )
99
+ if row["childId"]:
100
+ output[id]["children"][row["childId"]] = {
101
+ "x": row["x"],
102
+ "y": row["y"],
103
+ "zIndex": row["zIndex"],
104
+ "w": row["w"],
105
+ "h": row["h"],
106
+ }
107
+
108
+ if len(output) > 1:
109
+ raise ValueError(f"output should be of length 1 but has length {len(output)}")
110
+ if len(output) == 0:
111
+ raise ProjectNotFound(f"{config_name} not found")
112
+
113
+ return list(output.values())[0]
114
+
115
+
116
+ def load_project_config(db, project_config_name):
117
+ projectConfig = load_project_config_metadata(db, project_config_name)
118
+ sections_data = load_sections(db, list(projectConfig["children"].keys()))
119
+ sectionConfigs = load_section_configs(db, projectConfig["id"])
120
+ sections = recursive_dict_merge(
121
+ sections_data["sections"], sectionConfigs, strict_top_level_keys=True
122
+ )
123
+ sectionVariants = sections_data["sectionVariants"]
124
+ artifactGroups = sections_data["artifactGroups"]
125
+ uiTypeCols = sections_data["uiTypeCols"]
126
+ uiTypes = sections_data["nonPresetUITypes"]
127
+ codeInfo, codeInfoCols = load_code_info_cols(db, sectionVariants)
128
+ load_ev_refs_into_data_structures(db, sectionVariants, codeInfo)
129
+ load_template_vars_into_data_structures(db, sectionVariants)
130
+ load_json_sources_into_data_structures(
131
+ sections, codeInfo, codeInfoCols, sectionVariants
132
+ )
133
+
134
+ return {
135
+ "projectConfig": projectConfig,
136
+ "sections": sections,
137
+ "sectionVariants": sectionVariants,
138
+ "artifactGroups": artifactGroups,
139
+ "uiTypes": uiTypes,
140
+ "uiTypeCols": uiTypeCols,
141
+ "codeInfo": codeInfo,
142
+ "codeInfoCols": codeInfoCols,
143
+ }
144
+
145
+
146
+ def load_project_config_names(db, excludeProjectConfigName=None):
147
+ query = """
148
+ SELECT
149
+ name
150
+ FROM
151
+ ProjectConfig
152
+ """
153
+
154
+ if excludeProjectConfigName:
155
+ query += "WHERE name != :excludeProjectConfigName"
156
+
157
+ db.execute(query, {"excludeProjectConfigName": excludeProjectConfigName})
158
+
159
+ return [r[0] for r in db.fetchall()]
160
+
161
+
162
+ def load_full_project(db, excludeProjectConfigName=None):
163
+ config_names = load_project_config_names(db, excludeProjectConfigName)
164
+ configs = []
165
+ for c in config_names:
166
+ p = load_project_config(db, c)
167
+ configs.append(p)
168
+
169
+ return configs
170
+
171
+
172
+ def load_default_config_name(db):
173
+ query = """
174
+ SELECT pc.name
175
+ FROM Metadata m
176
+ JOIN ProjectConfig pc ON m.defaultProject = pc.id
177
+ WHERE m.id = 1;
178
+ """
179
+
180
+ db.execute(query)
181
+ results = db.fetchall()
182
+ if len(results) > 0:
183
+ return results[0][0]
184
+ return None
@@ -0,0 +1,267 @@
1
+ import json
2
+ from collections import defaultdict
3
+
4
+ from setta.code_gen.export_selected import get_section_variants
5
+ from setta.database.db.artifacts.save import save_artifact_groups, save_artifacts
6
+ from setta.database.db.evRefs.save import save_ev_refs, save_template_vars
7
+ from setta.database.utils import create_new_id
8
+ from setta.utils.constants import (
9
+ DEFAULT_VALUES,
10
+ PROJECT_CONFIG_TABLE_DATA_JSON_FIELDS,
11
+ SECTION_CONFIG_TABLE_DATA_JSON_FIELDS,
12
+ USER_SETTINGS,
13
+ )
14
+ from setta.utils.generate_memorable_string import generate_memorable_available_string
15
+ from setta.utils.utils import filter_dict
16
+
17
+ from ..codeInfo.save import save_code_info, save_code_info_col
18
+ from ..sections.jsonSource import remove_json_source_data, save_json_source_data
19
+ from ..sections.save import save_sections
20
+ from ..sectionVariants.save import save_section_variants
21
+ from ..uiTypes.save import save_ui_type_cols, save_ui_types
22
+
23
+
24
+ def save_project_details(db, p):
25
+ save_json_source_data(p)
26
+ remove_json_source_data(p)
27
+ save_artifacts(db, p["artifacts"])
28
+ save_artifact_groups(db, p["artifactGroups"])
29
+ save_code_info(db, p["codeInfo"])
30
+ save_code_info_col(db, p["codeInfoCols"])
31
+ save_ui_types(db, p["uiTypes"])
32
+ save_ui_type_cols(db, p["uiTypeCols"])
33
+ save_section_variants(db, p["sectionVariants"])
34
+ save_sections(db, p["sections"], p["sectionVariants"])
35
+ save_ev_refs(db, p["sectionVariants"], p["codeInfo"])
36
+ save_template_vars(db, p["sectionVariants"])
37
+ save_project(db, p["projectConfig"])
38
+ save_section_configs(db, p["projectConfig"]["id"], p["sections"])
39
+ update_linked_project_configs(db, p)
40
+
41
+
42
+ def save_project(db, project):
43
+ query = """
44
+ INSERT INTO ProjectConfig (id, name, data)
45
+ VALUES (:id, :name, :data)
46
+ ON CONFLICT (id)
47
+ DO UPDATE SET
48
+ name = :name,
49
+ data = :data
50
+ """
51
+
52
+ query_params = {
53
+ "id": project["id"],
54
+ "name": project["name"],
55
+ "data": json.dumps(
56
+ filter_dict(
57
+ project,
58
+ PROJECT_CONFIG_TABLE_DATA_JSON_FIELDS,
59
+ DEFAULT_VALUES["projectConfig"],
60
+ )
61
+ ),
62
+ }
63
+ db.execute(query, query_params)
64
+
65
+ query = """
66
+ DELETE FROM ProjectConfigChildren
67
+ WHERE parentId = :parentId
68
+ """
69
+ db.execute(query, {"parentId": project["id"]})
70
+
71
+ query = """
72
+ INSERT INTO ProjectConfigChildren (parentId, childId, x, y, zIndex, w, h)
73
+ VALUES (:parentId, :childId, :x, :y, :zIndex, :w, :h)
74
+ """
75
+ query_params = []
76
+ query_params.extend(
77
+ [
78
+ {
79
+ "parentId": project["id"],
80
+ "childId": childId,
81
+ "x": details["x"],
82
+ "y": details["y"],
83
+ "zIndex": details["zIndex"],
84
+ "w": details["w"],
85
+ "h": details["h"],
86
+ }
87
+ for childId, details in project["children"].items()
88
+ ]
89
+ )
90
+ db.executemany(query, query_params)
91
+
92
+
93
+ def create_project_config(db, name, previewImgColor):
94
+ query = """
95
+ SELECT name
96
+ FROM ProjectConfig
97
+ """
98
+ db.execute(query)
99
+ taken_names = [row[0] for row in db.fetchall()]
100
+
101
+ name = generate_memorable_available_string(taken_names)
102
+
103
+ query = """
104
+ INSERT INTO ProjectConfig (id, name, data)
105
+ VALUES (:id, :name, :data)
106
+ """
107
+ projectId = create_new_id()
108
+ query_params = {
109
+ "id": projectId,
110
+ "name": name,
111
+ "data": json.dumps(
112
+ {
113
+ "previewImgColor": previewImgColor,
114
+ "viewport": {
115
+ "x": 0,
116
+ "y": 0,
117
+ "zoom": USER_SETTINGS["gui"]["defaultZoomLevel"],
118
+ },
119
+ }
120
+ ),
121
+ }
122
+ db.execute(query, query_params)
123
+ return name
124
+
125
+
126
+ def save_project_config_name(db, curr_name, new_name):
127
+ query = """
128
+ UPDATE ProjectConfig
129
+ SET name = :new_name
130
+ WHERE name = :curr_name
131
+ """
132
+ query_params = {"curr_name": curr_name, "new_name": new_name}
133
+ db.execute(query, query_params)
134
+
135
+
136
+ def set_as_default_project(db, projectId):
137
+ query = """
138
+ UPDATE Metadata
139
+ SET defaultProject = :projectId
140
+ WHERE id = 1;
141
+ """
142
+ db.execute(query, {"projectId": projectId})
143
+
144
+
145
+ def save_section_configs(db, project_config_id, sections):
146
+ query_params = []
147
+ for section_id in sections.keys():
148
+ query_params.extend([project_config_id, section_id])
149
+ placeholders = ", ".join(["(?, ?)"] * (len(query_params) // 2))
150
+ query = f"""
151
+ DELETE FROM SectionConfig
152
+ WHERE (projectConfigId, sectionId) IN ({placeholders})
153
+ """
154
+ db.execute(query, query_params)
155
+
156
+ query = f"""
157
+ DELETE FROM SectionConfigSelectedVariants
158
+ WHERE (projectConfigId, sectionId) IN ({placeholders})
159
+ """
160
+ db.execute(query, query_params)
161
+
162
+ id_pairs = [(project_config_id, s) for s in sections.keys()]
163
+ insert_section_configs(db, sections, id_pairs)
164
+
165
+
166
+ def insert_section_configs(db, sections, id_pairs):
167
+ query = """
168
+ INSERT INTO SectionConfig (projectConfigId, sectionId, variantId, data)
169
+ VALUES (:projectConfigId, :sectionId, :variantId, :data)
170
+ """
171
+
172
+ query_params = [
173
+ {
174
+ "projectConfigId": projectConfigId,
175
+ "sectionId": sections[c]["id"],
176
+ "variantId": sections[c]["variantId"],
177
+ "data": json.dumps(
178
+ filter_dict(
179
+ sections[c],
180
+ SECTION_CONFIG_TABLE_DATA_JSON_FIELDS,
181
+ DEFAULT_VALUES["section"],
182
+ )
183
+ ),
184
+ }
185
+ for projectConfigId, c in id_pairs
186
+ ]
187
+
188
+ db.executemany(query, query_params)
189
+
190
+ query = """
191
+ INSERT INTO SectionConfigSelectedVariants (projectConfigId, sectionId, variantId)
192
+ VALUES (:projectConfigId, :sectionId, :variantId)
193
+ """
194
+ query_params = []
195
+ for projectConfigId, c in id_pairs:
196
+ query_params.extend(
197
+ {
198
+ "projectConfigId": projectConfigId,
199
+ "sectionId": sections[c]["id"],
200
+ "variantId": k,
201
+ }
202
+ for k in sections[c]["selectedVariantIds"].keys()
203
+ )
204
+
205
+ db.executemany(query, query_params)
206
+
207
+
208
+ # If multiple project configs share a section,
209
+ # and that section has children,
210
+ # then if a new child is added in one of those project configs,
211
+ # an entry in SectionConfig needs to be added for ALL project configs.
212
+ # Otherwise when loading those other project configs,
213
+ # the data for the new child will be missing.
214
+ def update_linked_project_configs(db, project):
215
+ query = """
216
+ SELECT projectConfigId, sectionId
217
+ FROM SectionConfig
218
+ WHERE projectConfigId != ?
219
+ """
220
+ project_config = project["projectConfig"]
221
+ db.execute(query, (project_config["id"],))
222
+ sections_to_project_configs = defaultdict(set)
223
+ project_configs_to_sections = defaultdict(set)
224
+ for row in db.fetchall():
225
+ sections_to_project_configs[row["sectionId"]].add(row["projectConfigId"])
226
+ project_configs_to_sections[row["projectConfigId"]].add(row["sectionId"])
227
+
228
+ section_configs_to_add = set()
229
+ children_have_been_visited = set()
230
+ has_been_visited_as_child = set()
231
+ # we start with top level sections that are also in other project configs
232
+ ids = set(
233
+ k for k in project_config["children"].keys() if k in sections_to_project_configs
234
+ )
235
+ while len(ids) > 0:
236
+ curr = ids.pop()
237
+ if curr in children_have_been_visited:
238
+ continue
239
+ children_have_been_visited.add(curr)
240
+ for variant in get_section_variants(project, curr):
241
+ children = variant["children"]
242
+ for c in children:
243
+ if c in has_been_visited_as_child:
244
+ continue
245
+ has_been_visited_as_child.add(c)
246
+ c_already_in_at_least_one_other_config = False
247
+ for other_project_config in sections_to_project_configs[curr]:
248
+ other_project_section_configs = project_configs_to_sections[
249
+ other_project_config
250
+ ]
251
+ # The parent (curr) is in other project configs, but the child is not.
252
+ # So we need to add the child to the other project configs that it's not in.
253
+ if c not in other_project_section_configs:
254
+ section_configs_to_add.add((other_project_config, c))
255
+ else:
256
+ c_already_in_at_least_one_other_config = True
257
+
258
+ # The child is already in at least one other project config.
259
+ # So we need to recurse into the child, to see if its children
260
+ # need to be added.
261
+ if (
262
+ c_already_in_at_least_one_other_config
263
+ and c not in children_have_been_visited
264
+ ):
265
+ ids.add(c)
266
+
267
+ insert_section_configs(db, project["sections"], section_configs_to_add)
@@ -0,0 +1,40 @@
1
+ import copy
2
+
3
+ from ..sections.jsonSource import remove_json_source_data
4
+ from .copy import copy_project_config, copy_project_details
5
+ from .save import save_project_details
6
+
7
+
8
+ def save_as_new_project_config(db, project, new_config_name, with_refs):
9
+ remove_json_source_data(project)
10
+ if not with_refs:
11
+ project_to_save = copy_project_details(
12
+ project, new_config_name, do_create_new_id=True
13
+ )
14
+ else:
15
+ project_to_save = copy.deepcopy(project)
16
+ project_to_save["projectConfig"] = copy_project_config(
17
+ project_to_save["projectConfig"], new_config_name, do_create_new_id=True
18
+ )
19
+ save_project_details(db, project_to_save)
20
+ return project_to_save
21
+
22
+
23
+ def save_as_existing_project_config(db, project, config_name):
24
+ remove_json_source_data(project)
25
+ query = """
26
+ SELECT *
27
+ FROM ProjectConfig
28
+ WHERE name = :config_name
29
+ """
30
+
31
+ db.execute(query, {"config_name": config_name})
32
+ x = db.fetchone()
33
+ project["projectConfig"] = {
34
+ **project["projectConfig"],
35
+ "id": x["id"],
36
+ "name": x["name"],
37
+ }
38
+ project_to_save = copy_project_details(project)
39
+ save_project_details(db, project_to_save)
40
+ return project_to_save
@@ -0,0 +1,135 @@
1
+ import copy
2
+
3
+ from setta.database.db.artifacts.utils import add_defaults_to_artifacts
4
+ from setta.database.db.codeInfo.utils import (
5
+ add_defaults_to_code_info,
6
+ add_defaults_to_code_info_cols,
7
+ )
8
+ from setta.database.db.sections.load import load_json_sources_into_data_structures
9
+ from setta.database.db.sections.utils import add_defaults_to_sections
10
+ from setta.database.db.sectionVariants.utils import add_defaults_to_section_variants
11
+ from setta.database.db.uiTypes.utils import (
12
+ add_defaults_to_ui_type_cols,
13
+ add_defaults_to_ui_types,
14
+ )
15
+ from setta.utils.constants import DEFAULT_VALUES
16
+ from setta.utils.utils import filter_dict, recursive_dict_merge
17
+
18
+
19
+ def with_project_config_defaults(**kwargs):
20
+ return recursive_dict_merge(copy.deepcopy(DEFAULT_VALUES["projectConfig"]), kwargs)
21
+
22
+
23
+ def add_defaults_to_project(p):
24
+ p["projectConfig"] = with_project_config_defaults(**p["projectConfig"])
25
+ add_defaults_to_artifacts(p["artifacts"])
26
+ add_defaults_to_sections(p["sections"])
27
+ add_defaults_to_section_variants(p["sectionVariants"])
28
+ add_defaults_to_code_info(p["codeInfo"])
29
+ add_defaults_to_code_info_cols(p["codeInfoCols"])
30
+ add_defaults_to_ui_types(p["uiTypes"])
31
+ add_defaults_to_ui_type_cols(p["uiTypeCols"])
32
+
33
+
34
+ def add_defaults_to_project_and_load_json_sources(p):
35
+ add_defaults_to_project(p)
36
+ load_json_sources_into_data_structures(
37
+ p["sections"], p["codeInfo"], p["codeInfoCols"], p["sectionVariants"]
38
+ )
39
+
40
+
41
+ def remove_empty(x):
42
+ return {k: v for k, v in x.items() if len(v) > 0}
43
+
44
+
45
+ def filter_data_for_json_export(p):
46
+ p["projectConfig"] = filter_dict(
47
+ p["projectConfig"],
48
+ DEFAULT_VALUES["projectConfig"].keys(),
49
+ DEFAULT_VALUES["projectConfig"],
50
+ )
51
+
52
+ for k, v in p["codeInfo"].items():
53
+ p["codeInfo"][k] = filter_dict(
54
+ p["codeInfo"][k],
55
+ DEFAULT_VALUES["codeInfo"].keys(),
56
+ DEFAULT_VALUES["codeInfo"],
57
+ )
58
+ for idx in range(len(v["evRefs"])):
59
+ v["evRefs"][idx] = filter_dict(
60
+ v["evRefs"][idx],
61
+ DEFAULT_VALUES["evRefEntry"].keys(),
62
+ DEFAULT_VALUES["evRefEntry"],
63
+ )
64
+
65
+ for k, v in p["codeInfoCols"].items():
66
+ p["codeInfoCols"][k] = filter_dict(
67
+ p["codeInfoCols"][k],
68
+ DEFAULT_VALUES["codeInfoCol"].keys(),
69
+ DEFAULT_VALUES["codeInfoCol"],
70
+ )
71
+ p["codeInfoCols"] = remove_empty(p["codeInfoCols"])
72
+
73
+ for k, v in p["uiTypes"].items():
74
+ p["uiTypes"][k] = filter_dict(
75
+ p["uiTypes"][k], DEFAULT_VALUES["uiType"].keys(), DEFAULT_VALUES["uiType"]
76
+ )
77
+
78
+ for k, v in p["uiTypeCols"].items():
79
+ for paramId, uiTypeColInfo in v.items():
80
+ p["uiTypeCols"][k][paramId] = filter_dict(
81
+ p["uiTypeCols"][k][paramId],
82
+ DEFAULT_VALUES["uiTypeColEntry"].keys(),
83
+ DEFAULT_VALUES["uiTypeColEntry"],
84
+ )
85
+
86
+ p["uiTypeCols"][k] = remove_empty(p["uiTypeCols"][k])
87
+ p["uiTypeCols"] = remove_empty(p["uiTypeCols"])
88
+
89
+ for k, v in p["sections"].items():
90
+ if len(p["uiTypeCols"].get(v["uiTypeColId"], {})) == 0:
91
+ v["uiTypeColId"] = None
92
+
93
+ p["sections"][k] = filter_dict(
94
+ p["sections"][k],
95
+ DEFAULT_VALUES["section"].keys(),
96
+ DEFAULT_VALUES["section"],
97
+ )
98
+
99
+ for k, v in p["sectionVariants"].items():
100
+ if len(p["codeInfoCols"].get(v["codeInfoColId"], {})) == 0:
101
+ v["codeInfoColId"] = None
102
+
103
+ curr = p["sectionVariants"]
104
+ curr[k] = filter_dict(
105
+ curr[k],
106
+ DEFAULT_VALUES["sectionVariant"].keys(),
107
+ DEFAULT_VALUES["sectionVariant"],
108
+ )
109
+
110
+ if "evRefs" in curr[k]:
111
+ evRefs = curr[k]["evRefs"]
112
+ for idx in range(len(evRefs)):
113
+ evRefs[idx] = filter_dict(
114
+ evRefs[idx],
115
+ DEFAULT_VALUES["evRefEntry"].keys(),
116
+ DEFAULT_VALUES["evRefEntry"],
117
+ )
118
+
119
+ if "values" in curr[k]:
120
+ for paramId in curr[k]["values"].keys():
121
+ evRefs = curr[k]["values"][paramId]["evRefs"]
122
+ for idx in range(len(evRefs)):
123
+ evRefs[idx] = filter_dict(
124
+ evRefs[idx],
125
+ DEFAULT_VALUES["evRefEntry"].keys(),
126
+ DEFAULT_VALUES["evRefEntry"],
127
+ )
128
+
129
+ curr[k]["values"][paramId] = filter_dict(
130
+ curr[k]["values"][paramId],
131
+ DEFAULT_VALUES["evEntry"].keys(),
132
+ DEFAULT_VALUES["evEntry"],
133
+ )
134
+
135
+ curr[k]["values"] = remove_empty(curr[k]["values"])
File without changes
@@ -0,0 +1,28 @@
1
+ from setta.database.utils import remap_ids, rename_keys
2
+ from setta.utils.generate_memorable_string import generate_memorable_string
3
+
4
+
5
+ def copy_section_variants(section_variants, code_info_id_map, code_info_col_id_map):
6
+ new_section_variants, section_variant_id_map = remap_ids(section_variants)
7
+
8
+ for obj in new_section_variants.values():
9
+ obj["name"] = generate_memorable_string()
10
+ obj["values"] = rename_keys(obj["values"], code_info_id_map)
11
+ if obj["codeInfoColId"]:
12
+ obj["codeInfoColId"] = code_info_col_id_map[obj["codeInfoColId"]]
13
+ if obj["selectedItem"]:
14
+ obj["selectedItem"] = code_info_id_map[obj["selectedItem"]]
15
+
16
+ # param sweep
17
+ for s in obj["sweep"]:
18
+ if s["selectedItem"]:
19
+ s["selectedItem"] = code_info_id_map[s["selectedItem"]]
20
+ for p in s["params"]:
21
+ p["paramInfoId"] = code_info_id_map[p["paramInfoId"]]
22
+
23
+ return new_section_variants, section_variant_id_map
24
+
25
+
26
+ def update_section_variant_children(section_variants, section_id_map):
27
+ for obj in section_variants.values():
28
+ obj["children"] = [section_id_map[x] for x in obj["children"]]