setta 0.0.13__py3-none-any.whl → 0.0.14__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,8 +14,8 @@
14
14
  <meta name="description" content="setta" />
15
15
 
16
16
  <title>setta.dev</title>
17
- <script type="module" crossorigin src="/static/assets/index-BXPxPFVr.js"></script>
18
- <link rel="stylesheet" crossorigin href="/static/assets/index-xJaZMJy2.css">
17
+ <script type="module" crossorigin src="/static/assets/index-Dt5OgkJW.js"></script>
18
+ <link rel="stylesheet" crossorigin href="/static/assets/index-DG_u-B1j.css">
19
19
  </head>
20
20
  <body>
21
21
  <noscript>You need to enable JavaScript to run this app.</noscript>
setta/tasks/tasks.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import copy
3
+ import json
3
4
  import logging
4
5
  import time
5
6
  from typing import Dict
@@ -64,39 +65,59 @@ class Tasks:
64
65
  websocket_manager=None,
65
66
  call_all=False,
66
67
  subprocess_key=None,
68
+ project_config_id=None,
69
+ section_id=None,
70
+ idx=None,
71
+ call_type="call",
72
+ other_data=None,
67
73
  ):
68
- # Create a list of tasks to run concurrently
69
- tasks = []
74
+ message.content = {tuple(json.loads(k)): v for k, v in message.content.items()}
75
+
76
+ # Group tasks by subprocess to ensure sequential processing per subprocess
77
+ subprocess_tasks = {}
70
78
  results = []
71
79
 
80
+ # First, identify all relevant subprocesses and their functions to call
72
81
  for sp_key, sp_info in self.in_memory_subprocesses.items():
73
- if subprocess_key and sp_key != subprocess_key:
82
+ if (subprocess_key and sp_key != subprocess_key) or (
83
+ not match_subprocess_key(sp_key, project_config_id, section_id, idx)
84
+ ):
74
85
  continue
86
+
87
+ # For each matching subprocess, collect all functions that need to be called
88
+ fns_to_call = []
75
89
  for fn_name, fnInfo in sp_info["fnInfo"].items():
76
90
  if (
77
91
  call_all
78
92
  or None in fnInfo["dependencies"]
79
93
  or any(k in fnInfo["dependencies"] for k in message.content.keys())
80
94
  ):
81
- # Send message to subprocess
82
- sp_info["subprocess"].parent_conn.send(
83
- {"type": "call", "fn_name": fn_name, "message": message}
84
- )
95
+ fns_to_call.append(fn_name)
85
96
 
86
- # Create task for receiving response
87
- task = asyncio.create_task(
88
- self._handle_subprocess_response(
89
- sp_key,
90
- fn_name,
91
- message.id,
92
- sp_info["subprocess"].parent_conn.recv,
93
- websocket_manager,
94
- results,
95
- )
96
- )
97
- tasks.append(task)
97
+ if fns_to_call:
98
+ subprocess_tasks[sp_key] = {
99
+ "subprocess": sp_info["subprocess"],
100
+ "functions": fns_to_call,
101
+ }
102
+
103
+ # Create tasks to process each subprocess sequentially
104
+ tasks = []
105
+ for sp_key, sp_data in subprocess_tasks.items():
106
+ task = asyncio.create_task(
107
+ self._process_subprocess_sequentially(
108
+ sp_key,
109
+ sp_data["subprocess"],
110
+ sp_data["functions"],
111
+ message,
112
+ call_type,
113
+ other_data,
114
+ websocket_manager,
115
+ results,
116
+ )
117
+ )
118
+ tasks.append(task)
98
119
 
99
- # Wait for all tasks to complete concurrently
120
+ # Wait for all subprocess tasks to complete (each subprocess processed sequentially)
100
121
  if tasks:
101
122
  await asyncio.gather(*tasks)
102
123
 
@@ -109,29 +130,53 @@ class Tasks:
109
130
  content.extend(r["content"])
110
131
  return {"content": content, "messageType": C.WS_IN_MEMORY_FN_RETURN}
111
132
 
112
- async def _handle_subprocess_response(
113
- self, subprocess_key, fn_name, msg_id, recv_fn, websocket_manager, results
133
+ async def _process_subprocess_sequentially(
134
+ self,
135
+ subprocess_key,
136
+ subprocess,
137
+ fn_names,
138
+ message,
139
+ call_type,
140
+ other_data,
141
+ websocket_manager,
142
+ results,
114
143
  ):
115
- # Run the receive function in a thread
116
- start_time = time.perf_counter()
117
- result = await self.task_runner.run(recv_fn, [], RunType.THREAD)
118
- elapsed_time = time.perf_counter() - start_time
119
- if result["status"] == "success":
120
- self.update_average_subprocess_fn_time(
121
- subprocess_key, fn_name, elapsed_time
144
+ # Process each function sequentially for this subprocess
145
+ for fn_name in fn_names:
146
+ # Send message to subprocess
147
+ subprocess.parent_conn.send(
148
+ {
149
+ "type": call_type,
150
+ "fn_name": fn_name,
151
+ "message": message,
152
+ "other_data": other_data,
153
+ }
122
154
  )
123
- if websocket_manager is not None:
124
- if result["content"]:
125
- await websocket_manager.send_message_to_requester(
126
- msg_id, result["content"], result["messageType"]
127
- )
128
- await self.maybe_send_latest_run_time_info(
129
- subprocess_key, fn_name, msg_id, websocket_manager
155
+
156
+ # Wait for and handle the response before sending the next message
157
+ start_time = time.perf_counter()
158
+ result = await self.task_runner.run(
159
+ subprocess.parent_conn.recv, [], RunType.THREAD
160
+ )
161
+ elapsed_time = time.perf_counter() - start_time
162
+
163
+ if result["status"] == "success":
164
+ self.update_average_subprocess_fn_time(
165
+ subprocess_key, fn_name, elapsed_time
130
166
  )
131
- else:
132
- results.append(result)
133
167
 
134
- async def add_custom_fns(self, code_graph, to_cache):
168
+ if websocket_manager is not None:
169
+ if result["content"]:
170
+ await websocket_manager.send_message_to_requester(
171
+ message.id, result["content"], result["messageType"]
172
+ )
173
+ await self.maybe_send_latest_run_time_info(
174
+ subprocess_key, fn_name, message.id, websocket_manager
175
+ )
176
+ else:
177
+ results.append(result)
178
+
179
+ async def add_custom_fns(self, code_graph, exporter_obj):
135
180
  for c in code_graph:
136
181
  subprocess_key = c["subprocess_key"]
137
182
  sp = self.in_memory_subprocesses.get(subprocess_key, {}).get("subprocess")
@@ -149,7 +194,7 @@ class Tasks:
149
194
  {
150
195
  "type": "import",
151
196
  "imports": c["imports"],
152
- "to_cache": to_cache,
197
+ "exporter_obj": exporter_obj,
153
198
  }
154
199
  )
155
200
  result = await self.task_runner.run(sp.parent_conn.recv, [], RunType.THREAD)
@@ -181,6 +226,20 @@ class Tasks:
181
226
 
182
227
  return initial_result["content"]
183
228
 
229
+ async def call_in_memory_subprocess_fn_with_new_exporter_obj(
230
+ self, project_config_id, idx, exporter_obj
231
+ ):
232
+ initial_result = await self.call_in_memory_subprocess_fn(
233
+ TaskMessage(id=create_new_id(), content={}),
234
+ call_all=True,
235
+ project_config_id=project_config_id,
236
+ idx=idx,
237
+ call_type="call_with_new_exporter_obj",
238
+ other_data={"exporter_obj": exporter_obj},
239
+ )
240
+
241
+ return initial_result["content"]
242
+
184
243
  def close(self):
185
244
  self.stop_event.set()
186
245
  for v in self.in_memory_subprocesses.values():
@@ -217,3 +276,32 @@ class Tasks:
217
276
  for fnInfo in output[sp_key]["fnInfo"].values():
218
277
  fnInfo["dependencies"] = list(fnInfo["dependencies"])
219
278
  return output
279
+
280
+
281
+ def construct_subprocess_key(project_config_id, section_id, idx):
282
+ return f"{project_config_id}_{section_id}_{idx}"
283
+
284
+
285
+ def match_subprocess_key(
286
+ subprocess_key, project_config_id=None, section_id=None, idx=None
287
+ ):
288
+ # If no filters are provided, return True
289
+ if project_config_id is None and section_id is None and idx is None:
290
+ return True
291
+
292
+ # Split the key into its components
293
+ parts = subprocess_key.split("_")
294
+ if len(parts) != 3:
295
+ return False
296
+
297
+ key_project_config_id, key_section_id, key_idx_str = parts
298
+
299
+ # Check if the extracted values match the provided filters
300
+ if project_config_id is not None and key_project_config_id != project_config_id:
301
+ return False
302
+ if section_id is not None and key_section_id != section_id:
303
+ return False
304
+ if idx is not None and key_idx_str != str(idx):
305
+ return False
306
+
307
+ return True
setta/tasks/utils.py CHANGED
@@ -1,6 +1,5 @@
1
1
  import asyncio
2
2
  import importlib.util
3
- import json
4
3
  import logging
5
4
  import multiprocessing
6
5
  import queue
@@ -109,7 +108,7 @@ class SettaInMemoryFnSubprocess:
109
108
  fns_dict, module, module_name
110
109
  )
111
110
  for k in added_fn_names:
112
- cache[k] = msg["to_cache"]
111
+ cache[k] = msg["exporter_obj"]
113
112
  dependencies[k] = get_task_metadata(fns_dict[k], cache[k])
114
113
 
115
114
  self.child_conn.send(
@@ -120,12 +119,23 @@ class SettaInMemoryFnSubprocess:
120
119
  )
121
120
 
122
121
  elif msg_type == "call":
123
- fn_name = msg["fn_name"]
124
- message = self.process_message(fn_name, msg["message"], cache)
125
- fn = fns_dict[fn_name]
126
- result = fn.fn(message)
127
- return_message_type = fn.return_message_type
122
+ result, return_message_type = self.call_imported_fn(
123
+ msg, fns_dict, cache
124
+ )
125
+ self.child_conn.send(
126
+ {
127
+ "status": "success",
128
+ "content": result,
129
+ "messageType": return_message_type,
130
+ }
131
+ )
128
132
 
133
+ elif msg_type == "call_with_new_exporter_obj":
134
+ # replace old exporter_obj
135
+ cache[msg["fn_name"]] = msg["other_data"]["exporter_obj"]
136
+ result, return_message_type = self.call_imported_fn(
137
+ msg, fns_dict, cache
138
+ )
129
139
  self.child_conn.send(
130
140
  {
131
141
  "status": "success",
@@ -144,6 +154,14 @@ class SettaInMemoryFnSubprocess:
144
154
  }
145
155
  )
146
156
 
157
+ def call_imported_fn(self, msg, fns_dict, cache):
158
+ fn_name = msg["fn_name"]
159
+ message = self.process_message(fn_name, msg["message"], cache)
160
+ fn = fns_dict[fn_name]
161
+ result = fn.fn(message)
162
+ return_message_type = fn.return_message_type
163
+ return result, return_message_type
164
+
147
165
  def close(self):
148
166
  try:
149
167
  logger.debug("Initiating shutdown sequence")
@@ -181,7 +199,9 @@ class SettaInMemoryFnSubprocess:
181
199
  if fn_name in cache:
182
200
  exporter_obj = cache[fn_name]
183
201
  for k, v in message.content.items():
184
- nice_str = exporter_obj.var_name_mapping[tuple(json.loads(k))]
202
+ nice_str = exporter_obj.var_name_mapping.get(k)
203
+ if not nice_str:
204
+ continue
185
205
  p_dict, key = nested_access(exporter_obj.output, nice_str)
186
206
  p_dict[key] = v
187
207
  message.content = exporter_obj.output
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: setta
3
- Version: 0.0.13
3
+ Version: 0.0.14
4
4
  Summary: Python without the donkeywork.
5
5
  Home-page: https://setta.dev
6
6
  Author: Kevin Musgrave, Jeff Musgrave
@@ -42,6 +42,11 @@ Requires-Dist: flake8==6.1.0; extra == "dev"
42
42
 
43
43
  ## News
44
44
 
45
+ **March 5**: [v0.0.14](https://github.com/settadev/setta/releases/tag/v0.0.14)
46
+ - Allow access to individual layers of Drawing sections, as well as the combined output.
47
+ - Added button + shortcut for sending current full project state to in-memory functions.
48
+
49
+
45
50
  **March 4**: [v0.0.13](https://github.com/settadev/setta/releases/tag/v0.0.13)
46
51
  - Updated frontend javascript dependencies.
47
52
 
@@ -61,21 +66,6 @@ Requires-Dist: flake8==6.1.0; extra == "dev"
61
66
  </table>
62
67
 
63
68
 
64
- **March 2**: [v0.0.11](https://github.com/settadev/setta/releases/tag/v0.0.11)
65
- - Added User View mode. This allows you to quickly create a simplified version of your UI.
66
- Here's an example of what Developer View and User View look like:
67
-
68
- <table>
69
- <tr>
70
- <th width="50%">Developer View</th>
71
- <th width="50%">User View</th>
72
- </tr>
73
- <tr>
74
- <td><img src="https://github.com/user-attachments/assets/4ecbb85a-1857-413c-b768-9ac17f226b6f" /></td>
75
- <td><img src="https://github.com/user-attachments/assets/1126649e-7559-4785-80b9-7eda6466c2e0" /></td>
76
- </tr>
77
- </table>
78
-
79
69
  ## What does Setta do?
80
70
 
81
71
  Setta is a general-purpose developer tool that streamlines Python coding, configuration, UI creation, and onboarding.
@@ -1,4 +1,4 @@
1
- setta/__init__.py,sha256=SxvRes_80c-42zwvn5BXPvpGVs_EZ69FUEtUBF1k9Ts,23
1
+ setta/__init__.py,sha256=71Tw8stu19MsLPyF1q_DF5mb_BefzOTPYggLlSLvCms,23
2
2
  setta/server.py,sha256=q4w9WG7SuLxwYtgXUCQyLt7t_HLmQV4y5abqvm7-uEA,4861
3
3
  setta/start.py,sha256=5sMZ7WH3KV9Q0v186PsaYqsWOz7hebyrpXbBOp9wQww,3589
4
4
  setta/cli/__init__.py,sha256=UxZG_VOMuF6lEBT3teUgTS9ulsK3wt3Gu3BbAQiAmt8,47
@@ -6,7 +6,7 @@ setta/cli/connect.py,sha256=Pj2Ten7CQcLQGNnyi5Y-vYslQDN3J8csPcWetlvu_J0,1273
6
6
  setta/cli/logger.py,sha256=M-gGOcYt8Xj7ldNGBAUfA9yL1nX4UpBuQR1lkg_qiSs,6130
7
7
  setta/code_gen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  setta/code_gen/create_runnable_scripts.py,sha256=LXRu8ErO3_e5HCNomnlgfsyxKp2h-Pmm2VFXzBgDDhA,17444
9
- setta/code_gen/export_selected.py,sha256=iLHiCU1Hy1XYBox6mQFDL_dZTApSt2Au25QKSfsjErU,28330
9
+ setta/code_gen/export_selected.py,sha256=5s31IXEMeXAuR_wWythZQtq_zH_-sd5e8xAhzAZfviM,28611
10
10
  setta/code_gen/find_placeholders.py,sha256=aTdSSGoh44J2YFZXH9eZJv0D5mvnIMfG2fHSHCn69Ws,575
11
11
  setta/code_gen/utils.py,sha256=ArBPYA__ekeHjZVUDXanlMEnqCX5-Z_R1rMM-1UbEV0,4088
12
12
  setta/code_gen/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -67,7 +67,7 @@ setta/database/db/uiTypes/utils.py,sha256=H-19aXlhna1oxNmlBGY0RdGCoBFYAv0f0x_x86
67
67
  setta/database/export_db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
68
  setta/database/export_db/export_db.py,sha256=5uG-FaNQfxkC5PtvT7UgGOpXSst2HAuuRWaGu16zxZs,1295
69
69
  setta/database/export_db/export_raw.py,sha256=exRPZXOzPXUgZhcG6d4zolOOnsWuV25TtZAA5ZgoBYc,1811
70
- setta/database/export_db/export_readable.py,sha256=Ri3YpVX19UQBZCV3wR_oC_D-4hwyUg9CToXhphcy9Bo,8683
70
+ setta/database/export_db/export_readable.py,sha256=SaARqTlFKku6sorgIEHYm5rYXCrjDMNZV-CMG-Y9xzU,8695
71
71
  setta/database/export_db/utils.py,sha256=wgEqo0m-8uJKNn0okH5iQbjBxBkGqKdbcN3gvZEkH_M,523
72
72
  setta/lsp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
73
  setta/lsp/file_watcher.py,sha256=1Ar5_aTZBIgU-Z4JGx-awmMRT2mwq5XMdCv-gnv3nG8,3253
@@ -88,7 +88,7 @@ setta/routers/artifact.py,sha256=9wHdreg5DsLshhET-6gEDw2Apw_-r8bRF1x3-_dD9mU,266
88
88
  setta/routers/code_info.py,sha256=rDBLkr5VQOlktap3hWA73ls0VrBi5y4mc_SfWzw9ad0,857
89
89
  setta/routers/dependencies.py,sha256=0pz1HuvhlJDIVopvkfRTgmLJhDPGw0g33uj2qXgpxQs,1228
90
90
  setta/routers/in_memory_fn_stdout_websocket.py,sha256=T2BpLzh6PwYQP0qIkFS4r_VfEKBlwl4gkwIaq6r6Phs,604
91
- setta/routers/interactive.py,sha256=mp-A9xFpVw4nDPHiKhz1rnQtO0c6R-tRcLJxl4UHXTA,4912
91
+ setta/routers/interactive.py,sha256=TNXAupBXIuCn711olZPJemFB6WrBKWyy4inHbjNh9aw,5646
92
92
  setta/routers/lsp.py,sha256=DAZqdiRKDWJ9ikjwQetV4_8s9U-EDC91ToJA3u57qnU,385
93
93
  setta/routers/projects.py,sha256=p3zPD3jobYOxBGJSSIYS1Aqu1w-PrJCcEN6dPJ0DT6E,5255
94
94
  setta/routers/reference_renaming.py,sha256=Ec1hz2Nz_hYqk8GyGmUcWKvXo-lVEDbIIK2YbX-wi00,3598
@@ -97,10 +97,10 @@ setta/routers/settings.py,sha256=1S7Epj4O7jElixjNaNlRplBGiYdkj9mFeNQeeOrtQw4,103
97
97
  setta/routers/terminals.py,sha256=91I3tVUPJtLyCD_-E_qBQ_k8uuNUrcXl5P7sCTQuDQE,2435
98
98
  setta/routers/websocket.py,sha256=6fSROv9C5PobPXppUWwNLDDO0p8VADYaf2KcgIuTQp4,1121
99
99
  setta/static/constants/BaseUITypes.json,sha256=WQUgvN4eq9uU6ifhDBhtyEIoQFsAC022DSEut-E-4bA,4057
100
- setta/static/constants/Settings.json,sha256=VJFMO1iq61Euws5QjD5iaBgGh33YRy8GB7MokuEI4IA,3482
101
- setta/static/constants/constants.json,sha256=idIyNVecbvyH-AhirWdxxG9lA8QZZzxIS1061Q1_mJI,5326
100
+ setta/static/constants/Settings.json,sha256=uE9PWakebkxUaLx-UyiplyTFTwVj2ogomgoalNnQSkw,3532
101
+ setta/static/constants/constants.json,sha256=vzBINDWfx-4kbbz-2B8OASzykm9aCqr3yyD2yKoKzWU,5403
102
102
  setta/static/constants/db_init.sql,sha256=rdc0C5Hx_6d-QWEEbSqscArTyc77w9cMj8vbIVS8ZBw,8436
103
- setta/static/constants/defaultValues.json,sha256=nU8ncmvIAmrZVKqtiAJXxu1JP3GgGfbTH-s65zA4-GU,3108
103
+ setta/static/constants/defaultValues.json,sha256=Vh8WQZJYSc0QBu5WnNQO2dQtuYHZuy3WKfQEr9sBSqE,3063
104
104
  setta/static/constants/settingsProject.json,sha256=3s2PQSBXqV9BYnibKY1xbLZfEYjL6JeLnPVEusfmz9c,14678
105
105
  setta/static/frontend/android-chrome-192x192.png,sha256=v4139zj56AAgR2JCm32ecRwaEu8RDiqnxfMb4VLW-KM,5575
106
106
  setta/static/frontend/android-chrome-512x512.png,sha256=A_4VOJ6FvQd9TM7MogJWxQ7svo0oXX9_81117lef7UQ,15222
@@ -109,7 +109,7 @@ setta/static/frontend/browserconfig.xml,sha256=w0iw1t89kA7-965LTfyLYrFzewTQnUWE_
109
109
  setta/static/frontend/favicon-16x16.png,sha256=q67Crpy8s3wryu7Y3kffPeysN99Lt4XeFygXhPKize8,740
110
110
  setta/static/frontend/favicon-32x32.png,sha256=4NKXYticYdMrRHmVveHjxqnBU1HWgBT5JyJG8lx3BNE,1027
111
111
  setta/static/frontend/favicon.ico,sha256=02qhEBLsvsgBTZX6dcZElMyivlvrR7Yr6wB8ItEZFsc,15086
112
- setta/static/frontend/index.html,sha256=im3UelODkM9EaDgzS59c5afzyb867NKPN7o9jmkCC9I,1298
112
+ setta/static/frontend/index.html,sha256=U1UZyMEJa63yPQd4pByzD8WjS6H7nnIdtUIajcyu7D4,1298
113
113
  setta/static/frontend/manifest.json,sha256=ULPYw5A68_eNhxuUVXqxT045yhkurKPSz6hjyGcnmhQ,492
114
114
  setta/static/frontend/mstile-144x144.png,sha256=wQqckmRWre2NCCevevI3rv4j0tcduVMkpYr2tPj73cs,2692
115
115
  setta/static/frontend/mstile-150x150.png,sha256=FUwy6PipTofnhmJB5CdXWYgwy-2inq_sIOdOwdDklcY,2674
@@ -184,8 +184,8 @@ setta/static/frontend/assets/cormorant-garamond-cyrillic-ext-700-italic-gsr366qd
184
184
  setta/static/frontend/assets/cormorant-garamond-latin-700-italic-BQbwEFjx.woff2,sha256=C8U-EgDBT8MpU4FpUNBJdybVpKvRhg_3WDpUDCw9XZg,20348
185
185
  setta/static/frontend/assets/cormorant-garamond-latin-ext-700-italic-DnnS5iSC.woff2,sha256=Ulc44CPXdUiI5dY86W76HLk7801Fm9_QywCV-8GRtFU,17240
186
186
  setta/static/frontend/assets/cormorant-garamond-vietnamese-700-italic-2_nTgjbG.woff2,sha256=mVYwN54qI0RLXqyrDGPUNpBHWSJDKjgUyBRWa2FJ_ao,5248
187
- setta/static/frontend/assets/index-BXPxPFVr.js,sha256=w6apVF3Jod90afTslOC3bnF6L5geMop1-Iea73-3YOQ,3079282
188
- setta/static/frontend/assets/index-xJaZMJy2.css,sha256=GYtWBugj7xeHa-wj2KanVfLDnK6kxFimUj3Gcr8FvGU,237888
187
+ setta/static/frontend/assets/index-DG_u-B1j.css,sha256=p4Gqww92nEx28I_kek53IZqFoHhzWcpbVL0O4oOP6R4,238489
188
+ setta/static/frontend/assets/index-Dt5OgkJW.js,sha256=cLdvItpsahooHnL7c2KT2RSWnDSxjH4RmZwQK8n1g90,3082294
189
189
  setta/static/frontend/assets/inter-all-400-normal-ByZ5TkcW.woff,sha256=BU8S0GmcIMyYte4ESEdQJO-WvL2Rb-38m1n0ujdbYxI,128624
190
190
  setta/static/frontend/assets/inter-all-600-normal-BQl_S1BW.woff,sha256=wDdp5VNyQL_IbxcPThD2qI-ETg_QKj7AmCwMCjqDfLE,139072
191
191
  setta/static/frontend/assets/inter-all-800-normal-BdAoPad8.woff,sha256=FdxuS9xuVumB5nbVcCXyt3IWqzS4Z75qiRz_0FV5al0,139120
@@ -230,8 +230,8 @@ setta/static/seed/.DS_Store,sha256=ENxJvDQd7Te_U8gExcXtHE-mAeBUYOHELRfDWgN1NmA,6
230
230
  setta/static/seed/examples/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
231
231
  setta/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
232
232
  setta/tasks/task_runner.py,sha256=gMXpfZWFMQbix2MfrHVCKB7BxQCjO8JH2P8cxUmt1ms,849
233
- setta/tasks/tasks.py,sha256=CuL-JslPrD1nghaO9SgQq3CkpPhmXDAPGUldZa5Qv5Q,8231
234
- setta/tasks/utils.py,sha256=Ak9XbGMcYBLmu0hl4eB9pyLYzvdCu8FDSK-USUOtFS4,9810
233
+ setta/tasks/tasks.py,sha256=jhfTdncE6fMtxMUdnmixMbbtKV-Qu_xHLvbDkmm3M4g,10993
234
+ setta/tasks/utils.py,sha256=iqbsLYBcu4Qd-MAHd0SWK9wPaJezgEh1Yg5YC9goOLU,10631
235
235
  setta/tasks/fns/__init__.py,sha256=JhGzzQGaT9BWtF3pOmguh6pzIF9kdG3jdDNLyYZ2w7g,461
236
236
  setta/tasks/fns/codeAreaAutocomplete.py,sha256=gJ5JbjkWDyTothr-UF-YlOxrbVzj2iyOVK7XD3lfhSQ,6416
237
237
  setta/tasks/fns/codeAreaFindTemplateVars.py,sha256=vD9rY8VNPavv6VKa1bnxRPPRDNvFQy6mPIZRl-_3GnY,3708
@@ -252,9 +252,9 @@ setta/utils/generate_new_filename.py,sha256=KBLX6paDmTvXR-027TpqQkfijIXc7mCfhen-
252
252
  setta/utils/section_contents.py,sha256=V2HQPik6DfSXw4j7IalbP5AZ3OEGCbtL5ub3xL-Q_Qo,4141
253
253
  setta/utils/utils.py,sha256=KjzcvgM3Ab3IcE8vaWYtgBpwzPLKg0LmblnHLoYZJHM,9164
254
254
  setta/utils/websocket_manager.py,sha256=MBIMI8xxOFQF4lT3on4pupi1ttEWXdWPV4fI2YP_UJU,3925
255
- setta-0.0.13.dist-info/LICENSE,sha256=us9fuCq9wmiZVzayjKxNZ2iJYF6dROe0Qp57ToCO7XU,11361
256
- setta-0.0.13.dist-info/METADATA,sha256=Xhwxw8FjGL2Ht1llbEYQIvfROuQC2W-jCW15xzu9RVU,7512
257
- setta-0.0.13.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
258
- setta-0.0.13.dist-info/entry_points.txt,sha256=P0qCESy9fWF2q1EQ9JufGldCSnPHplDPn8J6Bgk5hB0,42
259
- setta-0.0.13.dist-info/top_level.txt,sha256=8G4lmRzVOnJ11_DescPVHE6MQZH-o06A0nGsDDV2ngY,6
260
- setta-0.0.13.dist-info/RECORD,,
255
+ setta-0.0.14.dist-info/LICENSE,sha256=us9fuCq9wmiZVzayjKxNZ2iJYF6dROe0Qp57ToCO7XU,11361
256
+ setta-0.0.14.dist-info/METADATA,sha256=E6dXRdAQwxksMYyBhAKdjXRZt_rOLJOva5BxxzG2b5k,7197
257
+ setta-0.0.14.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
258
+ setta-0.0.14.dist-info/entry_points.txt,sha256=P0qCESy9fWF2q1EQ9JufGldCSnPHplDPn8J6Bgk5hB0,42
259
+ setta-0.0.14.dist-info/top_level.txt,sha256=8G4lmRzVOnJ11_DescPVHE6MQZH-o06A0nGsDDV2ngY,6
260
+ setta-0.0.14.dist-info/RECORD,,