diff --git a/bec_widgets/widgets/editor/editor.py b/bec_widgets/widgets/editor/editor.py index a80411ed..233e8ba8 100644 --- a/bec_widgets/widgets/editor/editor.py +++ b/bec_widgets/widgets/editor/editor.py @@ -3,9 +3,11 @@ import subprocess import qdarktheme from jedi import Script from jedi.api import Completion + +# pylint: disable=no-name-in-module from qtpy.Qsci import QsciScintilla, QsciLexerPython, QsciAPIs -from qtpy.QtCore import QFile, QTextStream, Signal, QThread from qtpy.QtCore import Qt +from qtpy.QtCore import Signal, QThread from qtpy.QtGui import QColor, QFont from qtpy.QtWidgets import ( QApplication, @@ -29,7 +31,7 @@ class AutoCompleter(QThread): """ def __init__(self, file_path: str, api: QsciAPIs, enable_docstring: bool = False): - super(AutoCompleter, self).__init__(None) + super().__init__(None) self.file_path = file_path self.script: Script = None self.api: QsciAPIs = api @@ -78,7 +80,7 @@ class AutoCompleter(QThread): full_docstring = signatures[0].docstring(raw=True) compact_docstring = self.get_compact_docstring(full_docstring) return compact_docstring - elif signatures and self.enable_docstring is False: + if signatures and self.enable_docstring is False: return signatures[0].to_string() except Exception as err: print(f"Signature Error:{err}") @@ -91,7 +93,8 @@ class AutoCompleter(QThread): completions (list[Completion]): A list of Completion objects to be added to the API. """ self.api.clear() - [self.api.add(i.name) for i in completions] + for i in completions: + self.api.add(i.name) self.api.prepare() def get_completions(self, line: int, index: int, text: str): @@ -176,7 +179,7 @@ class BECEditor(QWidget): def __init__(self, toolbar_enabled=True, docstring_tooltip=False): super().__init__() - self.scriptRunnerThread = None + self.script_runner_thread = None self.file_path = None self.docstring_tooltip = docstring_tooltip # TODO just temporary solution, could be extended to other languages @@ -267,7 +270,6 @@ class BECEditor(QWidget): def loaded_autocomplete(self): """Placeholder method for actions after autocompletion data is loaded.""" - pass def set_editor_style(self): """Sets the style and color scheme for the editor.""" @@ -317,9 +319,9 @@ class BECEditor(QWidget): def run_script(self): """Runs the current script in the editor.""" script = self.editor.text() - self.scriptRunnerThread = ScriptRunnerThread(script) - self.scriptRunnerThread.outputSignal.connect(self.update_terminal) - self.scriptRunnerThread.start() + self.script_runner_thread = ScriptRunnerThread(script) + self.script_runner_thread.outputSignal.connect(self.update_terminal) + self.script_runner_thread.start() def update_terminal(self, text): """Updates the terminal with new text. diff --git a/bec_widgets/widgets/toolbar/toolbar.py b/bec_widgets/widgets/toolbar/toolbar.py index 86086c19..58f742a7 100644 --- a/bec_widgets/widgets/toolbar/toolbar.py +++ b/bec_widgets/widgets/toolbar/toolbar.py @@ -9,6 +9,8 @@ from qtpy.QtWidgets import QWidget class ToolBarAction(ABC): + """Abstract base class for action creators for the toolbar.""" + @abstractmethod def create(self, target: QWidget): """Creates and returns an action to be added to a toolbar. @@ -21,10 +23,11 @@ class ToolBarAction(ABC): Returns: QAction: The action created for the toolbar. """ - pass class OpenFileAction: # (ToolBarAction): + """Action creator for the 'Open File' action in the toolbar.""" + def create(self, target: QWidget): """Creates an 'Open File' action for the toolbar. @@ -42,6 +45,8 @@ class OpenFileAction: # (ToolBarAction): class SaveFileAction: + """Action creator for the 'Save File' action in the toolbar.""" + def create(self, target): """Creates a 'Save File' action for the toolbar. @@ -59,6 +64,8 @@ class SaveFileAction: class RunScriptAction: + """Action creator for the 'Run Script' action in the toolbar.""" + def create(self, target): """Creates a 'Run Script' action for the toolbar. diff --git a/tests/test_editor.py b/tests/test_editor.py index fd74c9e7..3cc8302e 100644 --- a/tests/test_editor.py +++ b/tests/test_editor.py @@ -1,16 +1,16 @@ +# pylint: disable=no-name-in-module + import os -import subprocess import tempfile -import time +from unittest.mock import MagicMock +from unittest.mock import patch, mock_open import pytest -from unittest.mock import MagicMock, Mock, patch -from unittest.mock import patch, mock_open -from PyQt6.QtWidgets import QTextEdit -from qtpy.Qsci import QsciScintilla, QsciLexerPython, QsciAPIs -from bec_widgets.widgets import BECEditor -from bec_widgets.widgets.editor.editor import AutoCompleter, ScriptRunnerThread, BECEditor +from qtpy.QtWidgets import QTextEdit +from qtpy.Qsci import QsciScintilla + +from bec_widgets.widgets.editor.editor import AutoCompleter, BECEditor @pytest.fixture(scope="function") @@ -66,7 +66,7 @@ def test_autocompleter_suggestions(mock_script, editor, qtbot): "docstring_enabled, expected_signature", [(True, "Mocked signature with docstring"), (False, "Mocked signature")], ) -def test_autocompleter_signature(mock_script, editor, qtbot, docstring_enabled, expected_signature): +def test_autocompleter_signature(mock_script, editor, docstring_enabled, expected_signature): """Test if the autocompleter provides correct function signature based on docstring setting.""" # Set docstring mode based on parameter editor.docstring_tooltip = docstring_enabled @@ -92,7 +92,7 @@ def test_autocompleter_signature(mock_script, editor, qtbot, docstring_enabled, assert signature == expected_signature -def test_open_file(editor, qtbot): +def test_open_file(editor): """Test open_file method of BECEditor.""" # Create a temporary file with some content with tempfile.NamedTemporaryFile(delete=False, suffix=".py") as temp_file: @@ -104,15 +104,13 @@ def test_open_file(editor, qtbot): editor.open_file() # Verify if the editor's text is set to the file content - assert ( - editor.editor.text() == "test file content" - ), "Editor should contain the text from the opened file" + assert editor.editor.text() == "test file content" # Clean up by removing the temporary file os.remove(temp_file.name) -def test_save_file(editor, qtbot): +def test_save_file(editor): """Test save_file method of BECEditor.""" # Set some text in the editor editor.editor.setText("test save content") @@ -131,7 +129,7 @@ def test_save_file(editor, qtbot): mock_file().write.assert_called_with("test save content") -def test_open_file_through_toolbar(editor, qtbot): +def test_open_file_through_toolbar(editor): """Test the open_file method through the ModularToolBar.""" # Create a temporary file with tempfile.NamedTemporaryFile(delete=False, suffix=".py") as temp_file: @@ -146,15 +144,13 @@ def test_open_file_through_toolbar(editor, qtbot): with patch("builtins.open", new_callable=mock_open, read_data="test file content"): open_action.trigger() # Verify if the editor's text is set to the file content - assert ( - editor.editor.text() == "test file content" - ), "Editor should contain the text from the opened file" + assert editor.editor.text() == "test file content" # Clean up os.remove(temp_file.name) -def test_save_file_through_toolbar(editor, qtbot): +def test_save_file_through_toolbar(editor): """Test the save_file method through the ModularToolBar.""" # Set some text in the editor editor.editor.setText("test save content")