From ccf41ff68269520753ff731f82c30b8ec1ddab11 Mon Sep 17 00:00:00 2001
From: Red-Giuliano <44534590+Red-Giuliano@users.noreply.github.com>
Date: Tue, 9 Jan 2024 12:47:08 -0500
Subject: [PATCH] App mode fix (#139)
* updated sql cell display and fixed dependency parsing between cells
* edited parser to account for assigning value with var['key']=val syntax
* version bump
* changed toolbar options to allow to increase and decrease font size
* increased WebDriverWait
* not sending unnecessary dataframe data in app mode
* removed run code on ctrl enter in app mode
---------
Co-authored-by: Red-Giuliano
---
setup.cfg | 2 +-
zt_backend/models/request.py | 1 +
zt_backend/runner/code_cell_parser.py | 20 ++++++++++++++++---
zt_backend/tests/test_e2e.py | 10 +++++-----
zt_frontend/src/components/CodeComponent.vue | 3 ++-
.../src/components/EditorComponent.vue | 2 +-
zt_frontend/src/components/SQLComponent.vue | 12 ++++++++---
7 files changed, 36 insertions(+), 14 deletions(-)
diff --git a/setup.cfg b/setup.cfg
index 1a82bb69..94afb58d 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -3,7 +3,7 @@ name = zero-true
description = A collaborative notebook built for data scientists
long_description = file: README.md
long_description_content_type = text/markdown
-version = 0.0.dev38
+version = 0.0.dev39
[options]
include_package_data = true
diff --git a/zt_backend/models/request.py b/zt_backend/models/request.py
index 3d43ba40..77af4bd6 100644
--- a/zt_backend/models/request.py
+++ b/zt_backend/models/request.py
@@ -16,6 +16,7 @@ class Cell(BaseModel):
code: str
defined_names: List[str]
loaded_names: List[str]
+ loaded_modules: List[str] = []
child_cells: List[int] = []
parent_cells: List[int] = []
previous_child_cells: List[int] = []
diff --git a/zt_backend/runner/code_cell_parser.py b/zt_backend/runner/code_cell_parser.py
index b83ee810..af3fd0eb 100644
--- a/zt_backend/runner/code_cell_parser.py
+++ b/zt_backend/runner/code_cell_parser.py
@@ -6,6 +6,8 @@
import re
import logging
import traceback
+from zt_backend.config import settings
+
logger = logging.getLogger("__name__")
@@ -23,7 +25,14 @@ def get_functions(module) -> Tuple[List[str], List[str]]:
return function_names, argument_names
def get_defined_names(module) -> List[str]:
- defined_names = [target.name for defnode in module.nodes_of_class(astroid.Assign) for target in defnode.targets if hasattr(target, 'name')]
+ defined_names = []
+ for defnode in module.nodes_of_class(astroid.Assign):
+ for target in defnode.targets:
+ if hasattr(target, 'name'): # Directly has a name (e.g., AssignName)
+ defined_names.append(target.name)
+ elif isinstance(target, astroid.Subscript): # Is a subscript
+ if hasattr(target.value, 'name'):
+ defined_names.append(target.value.name)
func_def_names = [arg.name for func in module.nodes_of_class(astroid.FunctionDef) for arg in func.args.args]
return list(set(defined_names) - set(func_def_names))
@@ -67,7 +76,10 @@ def generate_sql_code(cell, uuid_value, db_file='my_database.db'):
else:
# If variable_name is not provided, directly use the SQL execution
- data_frame_conversion = f"zt.DataFrame.from_dataframe(id='{uuid_value}', df={sql_execution})"
+ if settings.run_mode == 'app':
+ data_frame_conversion = ''
+ else:
+ data_frame_conversion = f"zt.DataFrame.from_dataframe(id='{uuid_value}', df={sql_execution})"
full_code = f"{base_code}\n{db_init}\n{data_frame_conversion}"
@@ -93,6 +105,7 @@ def parse_cells(request: Request) -> CodeDict:
cell_dict[cell.id] = Cell(**{
'code': cell.code,
'defined_names': defined_names,
+ 'loaded_modules':get_imports(module),
'loaded_names': list(set(loaded_names))})
except Exception as e:
logger.error("Error while parsing cells, returning empty names lists: %s", traceback.format_exc())
@@ -123,7 +136,8 @@ def find_child_cells(cell: Cell, code_dictionary: CodeDict, idx: int) -> List[st
for next_key in list(code_dictionary.cells.keys())[idx + 1:]:
next_cell = code_dictionary.cells[next_key]
next_loaded_names = next_cell.loaded_names
- if set(names).intersection(set(next_loaded_names)):
+ next_loaded_modules = next_cell.loaded_modules
+ if set(names).intersection(set(next_loaded_names)-set(next_loaded_modules)):
child_cells.append(next_key)
return child_cells
diff --git a/zt_backend/tests/test_e2e.py b/zt_backend/tests/test_e2e.py
index 7c66de3c..9520388b 100644
--- a/zt_backend/tests/test_e2e.py
+++ b/zt_backend/tests/test_e2e.py
@@ -101,10 +101,10 @@ def extract_code_cell_info(code_cell, driver):
def wait_for_load(driver):
driver.get("http://localhost:1326")
- WebDriverWait(driver, 10).until(
+ WebDriverWait(driver, 60).until(
EC.presence_of_element_located((By.ID, "appBar")))
- WebDriverWait(driver, 10).until(
+ WebDriverWait(driver, 60).until(
EC.presence_of_element_located((By.XPATH, "//div[contains(@id, 'codeCard')]")))
def clear_codemirror_and_send_text(driver,codemirror_input,text):
@@ -115,9 +115,9 @@ def clear_codemirror_and_send_text(driver,codemirror_input,text):
def wait_for_coderun(driver):
# Wait for the code run
- WebDriverWait(driver, 30).until(
+ WebDriverWait(driver, 60).until(
EC.presence_of_element_located((By.ID, "codeRunProgress")))
- WebDriverWait(driver, 30).until(
+ WebDriverWait(driver, 60).until(
EC.invisibility_of_element_located((By.ID, "codeRunProgress")))
def test_notebook_content(driver):
@@ -158,7 +158,7 @@ def test_adding_new_code_cell(driver):
cell_info = extract_code_cell_info(code_cells[0],driver)
add_icon = cell_info["elements"]["add_cell"]
add_icon.click()
- WebDriverWait(driver, 10).until(
+ WebDriverWait(driver, 60).until(
EC.presence_of_element_located((By.ID, f"addCell_Code_{cell_info['cell_id']}")))
assert driver.find_element(By.ID, f"addCell_Code_{cell_info['cell_id']}"), "Add code cell below not found"
add_code_cell = driver.find_element(By.ID,f"addCell_Code_{cell_info['cell_id']}")
diff --git a/zt_frontend/src/components/CodeComponent.vue b/zt_frontend/src/components/CodeComponent.vue
index 059b6fff..88a9171a 100644
--- a/zt_frontend/src/components/CodeComponent.vue
+++ b/zt_frontend/src/components/CodeComponent.vue
@@ -236,7 +236,8 @@ export default {
{
key: "Ctrl-Enter",
run: () => {
- handleCtrlEnter();
+ if (this.$devMode){
+ handleCtrlEnter()};
return true;
}
}
diff --git a/zt_frontend/src/components/EditorComponent.vue b/zt_frontend/src/components/EditorComponent.vue
index 5cf6a1b3..052972bb 100644
--- a/zt_frontend/src/components/EditorComponent.vue
+++ b/zt_frontend/src/components/EditorComponent.vue
@@ -61,7 +61,7 @@ export default {
init: {
plugins: "autoresize",
toolbar:
- "undo redo | bold italic underline strikethrough | fontselect fontsizeselect formatselect | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist | forecolor backcolor removeformat | pagebreak | charmap emoticons | fullscreen preview save print | insertfile image media template link anchor codesample | ltr rtl",
+ "undo redo | bold italic underline strikethrough | fontfamily fontsize blocks | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist | forecolor backcolor removeformat | pagebreak | charmap emoticons | fullscreen preview save print | insertfile image media template link anchor codesample | ltr rtl",
branding: false,
menubar: false,
statusbar: false,
diff --git a/zt_frontend/src/components/SQLComponent.vue b/zt_frontend/src/components/SQLComponent.vue
index 977c3a07..47fb7d4b 100644
--- a/zt_frontend/src/components/SQLComponent.vue
+++ b/zt_frontend/src/components/SQLComponent.vue
@@ -38,8 +38,13 @@
View Source Code
+
CTRL+Enter to run
-
+
{
- handleCtrlEnter();
+ if (this.$devMode){
+ handleCtrlEnter()};
return true;
}
}