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; } }