PyBreeze-dev 1.0.11__tar.gz → 1.0.12__tar.gz
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.
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/PKG-INFO +1 -1
- pybreeze_dev-1.0.12/pybreeze/__init__.py +19 -0
- pybreeze_dev-1.0.12/pybreeze/__main__.py +3 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/mail_thunder_extend/mail_thunder_setting.py +7 -5
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/api_testka/api_testka_process.py +5 -5
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/auto_control/auto_control_process.py +5 -5
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/file_automation/file_automation_process.py +5 -5
- pybreeze_dev-1.0.12/pybreeze/extend/process_executor/file_runner_process.py +240 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/load_density/load_density_process.py +5 -5
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/mail_thunder/mail_thunder_process.py +2 -2
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/process_executor_utils.py +2 -2
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/python_task_process_manager.py +9 -7
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/test_pioneer/test_pioneer_process_manager.py +5 -5
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/web_runner/web_runner_process.py +5 -5
- pybreeze_dev-1.0.12/pybreeze/extend_multi_language/extend_english.py +311 -0
- pybreeze_dev-1.0.12/pybreeze/extend_multi_language/extend_traditional_chinese.py +312 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_command_widget.py +1 -1
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_file_viewer_widget.py +9 -10
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/url/ai_code_review_gui.py +2 -2
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/editor_main/main_ui.py +5 -3
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/code_review/code_review_thread.py +2 -2
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/code_smell_detector.py +1 -1
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/judge.py +1 -1
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/judge_single_review.py +1 -1
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/linter.py +1 -1
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_prompt_editor_widget.py +1 -1
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/skills_prompt_editor_widget.py +1 -1
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/skills_prompt_templates/code_explainer.py +1 -1
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/skills_prompt_templates/code_review.py +1 -1
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/skills/skills_send_gui.py +1 -2
- pybreeze_dev-1.0.11/pybreeze/pybreeze_ui/jupyter_lab_gui/jupyer_lab_thread.py → pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/jupyter_lab_gui/jupyter_lab_thread.py +2 -3
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/jupyter_lab_gui/jupyter_lab_widget.py +1 -1
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/build_menubar.py +4 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/extend_jeditor_tab_menu/jupyter_lab_tab.py +1 -2
- pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/menu/plugin_menu/build_plugin_menu.py +203 -0
- pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/menu/plugin_menu/build_run_with_menu.py +98 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/tools/tools_menu.py +1 -1
- pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/syntax/syntax_extend.py +37 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/json_format/json_process.py +4 -4
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/manager/package_manager/package_manager_class.py +1 -1
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/PKG-INFO +1 -1
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/SOURCES.txt +5 -1
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pyproject.toml +1 -1
- pybreeze_dev-1.0.11/pybreeze/__init__.py +0 -7
- pybreeze_dev-1.0.11/pybreeze/extend_multi_language/extend_english.py +0 -280
- pybreeze_dev-1.0.11/pybreeze/extend_multi_language/extend_traditional_chinese.py +0 -280
- pybreeze_dev-1.0.11/pybreeze/pybreeze_ui/syntax/syntax_extend.py +0 -40
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/LICENSE +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/README.md +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/mail_thunder_extend/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/api_testka/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/auto_control/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/file_automation/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/load_density/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/mail_thunder/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/test_pioneer/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/web_runner/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend_multi_language/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend_multi_language/update_language_dict.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_login_widget.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_main_widget.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/url/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/editor_main/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/ai_gui_global_variable.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/code_review/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/code_review/cot_code_review_gui.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/first_code_review.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/first_summary_prompt.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/global_rule.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/step_by_step_analysis.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/total_summary.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/skills_prompt_templates/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/skills/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/jupyter_lab_gui/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/api_testka_menu/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/api_testka_menu/build_api_testka_menu.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/auto_control_menu/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/auto_control_menu/build_autocontrol_menu.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/automation_file_menu/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/automation_file_menu/build_automation_file_menu.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/load_density_menu/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/load_density_menu/build_load_density_menu.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/mail_thunder_menu/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/mail_thunder_menu/build_mail_thunder_menu.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/test_pioneer_menu/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/test_pioneer_menu/build_test_pioneer_menu.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/web_runner_menu/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/web_runner_menu/build_webrunner_menu.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/extend_jeditor_tab_menu/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/automation_menu/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/automation_menu/build_automation_install_menu.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/install_utils.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/tools_menu/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/tools_menu/build_tool_install_menu.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/menu_utils.py +0 -0
- {pybreeze_dev-1.0.11/pybreeze/pybreeze_ui/menu/tools → pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/menu/plugin_menu}/__init__.py +0 -0
- {pybreeze_dev-1.0.11/pybreeze/pybreeze_ui/show_code_window → pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/menu/tools}/__init__.py +0 -0
- {pybreeze_dev-1.0.11/pybreeze/pybreeze_ui/syntax → pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/show_code_window}/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/show_code_window/code_window.py +0 -0
- {pybreeze_dev-1.0.11/pybreeze/utils → pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/syntax}/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/syntax/syntax_keyword.py +0 -0
- {pybreeze_dev-1.0.11/pybreeze/utils/exception → pybreeze_dev-1.0.12/pybreeze/utils}/__init__.py +0 -0
- {pybreeze_dev-1.0.11/pybreeze/utils/file_process → pybreeze_dev-1.0.12/pybreeze/utils/exception}/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/exception/exception_tags.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/exception/exceptions.py +0 -0
- {pybreeze_dev-1.0.11/pybreeze/utils/logging → pybreeze_dev-1.0.12/pybreeze/utils/file_process}/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/file_process/get_dir_file_list.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/json_format/__init__.py +0 -0
- {pybreeze_dev-1.0.11/pybreeze/utils/manager → pybreeze_dev-1.0.12/pybreeze/utils/logging}/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/logging/logger.py +0 -0
- {pybreeze_dev-1.0.11/pybreeze/utils/manager/package_manager → pybreeze_dev-1.0.12/pybreeze/utils/manager}/__init__.py +0 -0
- /pybreeze_dev-1.0.11/pybreeze/__main__.py → /pybreeze_dev-1.0.12/pybreeze/utils/manager/package_manager/__init__.py +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/dependency_links.txt +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/requires.txt +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/top_level.txt +0 -0
- {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/setup.cfg +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from pybreeze.pybreeze_ui.editor_main.main_ui import EDITOR_EXTEND_TAB
|
|
2
|
+
from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
|
|
3
|
+
from pybreeze.pybreeze_ui.editor_main.main_ui import start_editor
|
|
4
|
+
|
|
5
|
+
# Re-export jeditor plugin API for convenience
|
|
6
|
+
from je_editor import (
|
|
7
|
+
load_external_plugins,
|
|
8
|
+
register_natural_language,
|
|
9
|
+
register_programming_language,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"EDITOR_EXTEND_TAB",
|
|
14
|
+
"PyBreezeMainWindow",
|
|
15
|
+
"load_external_plugins",
|
|
16
|
+
"register_natural_language",
|
|
17
|
+
"register_programming_language",
|
|
18
|
+
"start_editor",
|
|
19
|
+
]
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
import sys
|
|
2
4
|
from email.mime.multipart import MIMEMultipart
|
|
3
5
|
|
|
@@ -5,13 +7,13 @@ from pybreeze.utils.exception.exception_tags import send_html_exception_tag
|
|
|
5
7
|
from pybreeze.utils.exception.exceptions import ITESendHtmlReportException
|
|
6
8
|
|
|
7
9
|
|
|
8
|
-
def send_after_test(html_report_path: str = None) -> None:
|
|
10
|
+
def send_after_test(html_report_path: str | None = None) -> None:
|
|
9
11
|
try:
|
|
10
12
|
from je_mail_thunder import SMTPWrapper
|
|
11
13
|
mail_thunder_smtp: SMTPWrapper = SMTPWrapper()
|
|
12
|
-
if html_report_path is None and mail_thunder_smtp.login_state
|
|
14
|
+
if html_report_path is None and mail_thunder_smtp.login_state:
|
|
13
15
|
user: str = mail_thunder_smtp.user
|
|
14
|
-
with open("default_name.html"
|
|
16
|
+
with open("default_name.html") as file:
|
|
15
17
|
html_string: str = file.read()
|
|
16
18
|
message = mail_thunder_smtp.create_message_with_attach(
|
|
17
19
|
html_string,
|
|
@@ -19,9 +21,9 @@ def send_after_test(html_report_path: str = None) -> None:
|
|
|
19
21
|
"default_name.html", use_html=True)
|
|
20
22
|
mail_thunder_smtp.send_message(message)
|
|
21
23
|
mail_thunder_smtp.quit()
|
|
22
|
-
elif mail_thunder_smtp.login_state
|
|
24
|
+
elif mail_thunder_smtp.login_state:
|
|
23
25
|
user: str = mail_thunder_smtp.user
|
|
24
|
-
with open(html_report_path
|
|
26
|
+
with open(html_report_path) as file:
|
|
25
27
|
html_string: str = file.read()
|
|
26
28
|
message: MIMEMultipart = mail_thunder_smtp.create_message_with_attach(
|
|
27
29
|
html_string,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
4
|
|
|
5
5
|
from pybreeze.extend.process_executor.process_executor_utils import build_process
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@ from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_
|
|
|
13
13
|
|
|
14
14
|
def call_api_testka(
|
|
15
15
|
main_window: PyBreezeMainWindow,
|
|
16
|
-
exec_str:
|
|
16
|
+
exec_str: str | None = None,
|
|
17
17
|
program_buffer: int = 1024000
|
|
18
18
|
):
|
|
19
19
|
build_process(main_window, "je_api_testka", exec_str, False, program_buffer)
|
|
@@ -21,7 +21,7 @@ def call_api_testka(
|
|
|
21
21
|
|
|
22
22
|
def call_api_testka_with_send(
|
|
23
23
|
main_window: PyBreezeMainWindow,
|
|
24
|
-
exec_str:
|
|
24
|
+
exec_str: str | None = None,
|
|
25
25
|
program_buffer: int = 1024000
|
|
26
26
|
):
|
|
27
27
|
build_process(main_window, "je_api_testka", exec_str, True, program_buffer)
|
|
@@ -36,7 +36,7 @@ def call_api_testka_multi_file(
|
|
|
36
36
|
if need_to_execute_list is not None \
|
|
37
37
|
and isinstance(need_to_execute_list, list) and len(need_to_execute_list) > 0:
|
|
38
38
|
for execute_file in need_to_execute_list:
|
|
39
|
-
with open(execute_file
|
|
39
|
+
with open(execute_file) as test_script_json:
|
|
40
40
|
call_api_testka(
|
|
41
41
|
main_window,
|
|
42
42
|
test_script_json.read(),
|
|
@@ -56,7 +56,7 @@ def call_api_testka_multi_file_and_send(
|
|
|
56
56
|
if need_to_execute_list is not None \
|
|
57
57
|
and isinstance(need_to_execute_list, list) and len(need_to_execute_list) > 0:
|
|
58
58
|
for execute_file in need_to_execute_list:
|
|
59
|
-
with open(execute_file
|
|
59
|
+
with open(execute_file) as test_script_json:
|
|
60
60
|
call_api_testka_with_send(
|
|
61
61
|
main_window,
|
|
62
62
|
test_script_json.read(),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
4
|
|
|
5
5
|
from pybreeze.extend.process_executor.process_executor_utils import build_process
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@ from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_
|
|
|
13
13
|
|
|
14
14
|
def call_auto_control(
|
|
15
15
|
main_window: PyBreezeMainWindow,
|
|
16
|
-
exec_str:
|
|
16
|
+
exec_str: str | None = None,
|
|
17
17
|
program_buffer: int = 1024000
|
|
18
18
|
):
|
|
19
19
|
build_process(main_window, "je_auto_control", exec_str, False, program_buffer)
|
|
@@ -21,7 +21,7 @@ def call_auto_control(
|
|
|
21
21
|
|
|
22
22
|
def call_auto_control_with_send(
|
|
23
23
|
main_window: PyBreezeMainWindow,
|
|
24
|
-
exec_str:
|
|
24
|
+
exec_str: str | None = None,
|
|
25
25
|
program_buffer: int = 1024000
|
|
26
26
|
):
|
|
27
27
|
build_process(main_window, "je_auto_control", exec_str, True, program_buffer)
|
|
@@ -35,7 +35,7 @@ def call_auto_control_multi_file(
|
|
|
35
35
|
if need_to_execute_list is not None \
|
|
36
36
|
and isinstance(need_to_execute_list, list) and len(need_to_execute_list) > 0:
|
|
37
37
|
for execute_file in need_to_execute_list:
|
|
38
|
-
with open(execute_file
|
|
38
|
+
with open(execute_file) as test_script_json:
|
|
39
39
|
call_auto_control(
|
|
40
40
|
main_window,
|
|
41
41
|
test_script_json.read(),
|
|
@@ -52,7 +52,7 @@ def call_auto_control_multi_file_and_send(
|
|
|
52
52
|
if need_to_execute_list is not None \
|
|
53
53
|
and isinstance(need_to_execute_list, list) and len(need_to_execute_list) > 0:
|
|
54
54
|
for execute_file in need_to_execute_list:
|
|
55
|
-
with open(execute_file
|
|
55
|
+
with open(execute_file) as test_script_json:
|
|
56
56
|
call_auto_control_with_send(
|
|
57
57
|
main_window,
|
|
58
58
|
test_script_json.read(),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
4
|
|
|
5
5
|
from pybreeze.extend.process_executor.process_executor_utils import build_process
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@ from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_
|
|
|
13
13
|
|
|
14
14
|
def call_file_automation_test(
|
|
15
15
|
main_window: PyBreezeMainWindow,
|
|
16
|
-
exec_str:
|
|
16
|
+
exec_str: str | None = None,
|
|
17
17
|
program_buffer: int = 1024000
|
|
18
18
|
):
|
|
19
19
|
build_process(main_window, "automation_file", exec_str, False, program_buffer)
|
|
@@ -21,7 +21,7 @@ def call_file_automation_test(
|
|
|
21
21
|
|
|
22
22
|
def call_file_automation_test_with_send(
|
|
23
23
|
main_window: PyBreezeMainWindow,
|
|
24
|
-
exec_str:
|
|
24
|
+
exec_str: str | None = None,
|
|
25
25
|
program_buffer: int = 1024000
|
|
26
26
|
):
|
|
27
27
|
build_process(main_window, "automation_file", exec_str, True, program_buffer)
|
|
@@ -36,7 +36,7 @@ def call_file_automation_test_multi_file(
|
|
|
36
36
|
if need_to_execute_list is not None \
|
|
37
37
|
and isinstance(need_to_execute_list, list) and len(need_to_execute_list) > 0:
|
|
38
38
|
for execute_file in need_to_execute_list:
|
|
39
|
-
with open(execute_file
|
|
39
|
+
with open(execute_file) as test_script_json:
|
|
40
40
|
call_file_automation_test(
|
|
41
41
|
main_window,
|
|
42
42
|
test_script_json.read(),
|
|
@@ -56,7 +56,7 @@ def call_file_automation_test_multi_file_and_send(
|
|
|
56
56
|
if need_to_execute_list is not None \
|
|
57
57
|
and isinstance(need_to_execute_list, list) and len(need_to_execute_list) > 0:
|
|
58
58
|
for execute_file in need_to_execute_list:
|
|
59
|
-
with open(execute_file
|
|
59
|
+
with open(execute_file) as test_script_json:
|
|
60
60
|
call_file_automation_test_with_send(
|
|
61
61
|
main_window,
|
|
62
62
|
test_script_json.read(),
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"""
|
|
2
|
+
File Runner Process - runs arbitrary language files via plugin run configs.
|
|
3
|
+
|
|
4
|
+
Supports two modes:
|
|
5
|
+
- Direct run: compiler [args...] file (e.g. go run main.go, java Main.java)
|
|
6
|
+
- Compile then run: compiler file -o output && ./output (e.g. gcc main.c -o main)
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import os
|
|
11
|
+
import queue
|
|
12
|
+
import subprocess
|
|
13
|
+
import sys
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from queue import Queue
|
|
16
|
+
from threading import Thread
|
|
17
|
+
|
|
18
|
+
from PySide6.QtCore import QTimer
|
|
19
|
+
from PySide6.QtGui import QTextCharFormat
|
|
20
|
+
|
|
21
|
+
from je_editor.pyside_ui.main_ui.save_settings.user_color_setting_file import actually_color_dict
|
|
22
|
+
|
|
23
|
+
from pybreeze.pybreeze_ui.show_code_window.code_window import CodeWindow
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class FileRunnerProcess:
|
|
27
|
+
"""Manages subprocess execution for any language file."""
|
|
28
|
+
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
main_window: CodeWindow,
|
|
32
|
+
program_encoding: str = "utf-8",
|
|
33
|
+
program_buffer_size: int = 1024,
|
|
34
|
+
):
|
|
35
|
+
self.main_window = main_window
|
|
36
|
+
self.program_encoding = program_encoding
|
|
37
|
+
self.program_buffer_size = program_buffer_size
|
|
38
|
+
self.still_running: bool = False
|
|
39
|
+
self.process: subprocess.Popen | None = None
|
|
40
|
+
self.output_queue: Queue = Queue()
|
|
41
|
+
self.error_queue: Queue = Queue()
|
|
42
|
+
self.timer: QTimer | None = None
|
|
43
|
+
self._stdout_thread: Thread | None = None
|
|
44
|
+
self._stderr_thread: Thread | None = None
|
|
45
|
+
|
|
46
|
+
def run_file(self, run_config: dict, file_path: str) -> None:
|
|
47
|
+
"""
|
|
48
|
+
Run a file using the given plugin run config.
|
|
49
|
+
|
|
50
|
+
run_config keys:
|
|
51
|
+
name: str - display name
|
|
52
|
+
compiler: str - executable name (e.g. "go", "gcc", "java")
|
|
53
|
+
args: tuple[str] - args between compiler and file (e.g. ("run",))
|
|
54
|
+
compile_then_run: bool (optional) - if True, compile first then run output
|
|
55
|
+
output_flag: str (optional) - flag for output file (e.g. "-o")
|
|
56
|
+
"""
|
|
57
|
+
compile_then_run = run_config.get("compile_then_run", False)
|
|
58
|
+
compiler = run_config["compiler"]
|
|
59
|
+
args = list(run_config.get("args", ()))
|
|
60
|
+
|
|
61
|
+
if compile_then_run:
|
|
62
|
+
self._compile_and_run(compiler, args, run_config.get("output_flag", "-o"), file_path)
|
|
63
|
+
else:
|
|
64
|
+
command = [compiler] + args + [file_path]
|
|
65
|
+
self._start_process(command)
|
|
66
|
+
|
|
67
|
+
def _compile_and_run(self, compiler: str, args: list, output_flag: str, file_path: str) -> None:
|
|
68
|
+
"""Compile, then run the output binary."""
|
|
69
|
+
path = Path(file_path)
|
|
70
|
+
output_name = str(path.with_suffix(""))
|
|
71
|
+
if sys.platform in ("win32", "cygwin", "msys"):
|
|
72
|
+
output_name += ".exe"
|
|
73
|
+
|
|
74
|
+
compile_cmd = [compiler] + args + [file_path, output_flag, output_name]
|
|
75
|
+
self._append_text(f"[Compile] {' '.join(compile_cmd)}\n", is_error=False)
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
result = subprocess.run(
|
|
79
|
+
compile_cmd,
|
|
80
|
+
capture_output=True,
|
|
81
|
+
timeout=60,
|
|
82
|
+
)
|
|
83
|
+
except FileNotFoundError:
|
|
84
|
+
self._append_text(f"[Error] Compiler not found: {compiler}\n", is_error=True)
|
|
85
|
+
return
|
|
86
|
+
except subprocess.TimeoutExpired:
|
|
87
|
+
self._append_text("[Error] Compilation timed out (60s)\n", is_error=True)
|
|
88
|
+
return
|
|
89
|
+
|
|
90
|
+
if result.stdout:
|
|
91
|
+
self._append_text(result.stdout.decode(self.program_encoding, "replace"), is_error=False)
|
|
92
|
+
if result.stderr:
|
|
93
|
+
self._append_text(result.stderr.decode(self.program_encoding, "replace"), is_error=True)
|
|
94
|
+
|
|
95
|
+
if result.returncode != 0:
|
|
96
|
+
self._append_text(f"[Compile failed] exit code {result.returncode}\n", is_error=True)
|
|
97
|
+
return
|
|
98
|
+
|
|
99
|
+
self._append_text(f"[Run] {output_name}\n", is_error=False)
|
|
100
|
+
self._start_process([output_name], cleanup_binary=output_name)
|
|
101
|
+
|
|
102
|
+
def _start_process(self, command: list[str], cleanup_binary: str | None = None) -> None:
|
|
103
|
+
"""Launch subprocess and start output reading."""
|
|
104
|
+
self._cleanup_binary = cleanup_binary
|
|
105
|
+
|
|
106
|
+
cmd_display = " ".join(command)
|
|
107
|
+
self._append_text(f"> {cmd_display}\n", is_error=False)
|
|
108
|
+
|
|
109
|
+
try:
|
|
110
|
+
self.process = subprocess.Popen(
|
|
111
|
+
command,
|
|
112
|
+
stdout=subprocess.PIPE,
|
|
113
|
+
stderr=subprocess.PIPE,
|
|
114
|
+
stdin=subprocess.PIPE,
|
|
115
|
+
shell=False,
|
|
116
|
+
)
|
|
117
|
+
except FileNotFoundError:
|
|
118
|
+
self._append_text(f"[Error] Command not found: {command[0]}\n", is_error=True)
|
|
119
|
+
return
|
|
120
|
+
|
|
121
|
+
self.still_running = True
|
|
122
|
+
|
|
123
|
+
self._stdout_thread = Thread(target=self._read_stdout, daemon=True)
|
|
124
|
+
self._stdout_thread.start()
|
|
125
|
+
|
|
126
|
+
self._stderr_thread = Thread(target=self._read_stderr, daemon=True)
|
|
127
|
+
self._stderr_thread.start()
|
|
128
|
+
|
|
129
|
+
self.main_window.show()
|
|
130
|
+
self.timer = QTimer()
|
|
131
|
+
self.timer.setInterval(50)
|
|
132
|
+
self.timer.timeout.connect(self._pull_text)
|
|
133
|
+
self.timer.start()
|
|
134
|
+
|
|
135
|
+
def _pull_text(self) -> None:
|
|
136
|
+
"""Timer callback: pump queues to UI."""
|
|
137
|
+
try:
|
|
138
|
+
while not self.output_queue.empty():
|
|
139
|
+
msg = self.output_queue.get_nowait()
|
|
140
|
+
msg = str(msg).strip()
|
|
141
|
+
if msg:
|
|
142
|
+
self._append_text(msg + "\n", is_error=False)
|
|
143
|
+
except queue.Empty:
|
|
144
|
+
pass
|
|
145
|
+
|
|
146
|
+
try:
|
|
147
|
+
while not self.error_queue.empty():
|
|
148
|
+
msg = self.error_queue.get_nowait()
|
|
149
|
+
msg = str(msg).strip()
|
|
150
|
+
if msg:
|
|
151
|
+
self._append_text(msg + "\n", is_error=True)
|
|
152
|
+
except queue.Empty:
|
|
153
|
+
pass
|
|
154
|
+
|
|
155
|
+
if self.process is not None:
|
|
156
|
+
self.process.poll()
|
|
157
|
+
if self.process.returncode is not None:
|
|
158
|
+
self._finish()
|
|
159
|
+
|
|
160
|
+
def _finish(self) -> None:
|
|
161
|
+
"""Clean up after process exits."""
|
|
162
|
+
self.still_running = False
|
|
163
|
+
if self.timer and self.timer.isActive():
|
|
164
|
+
self.timer.stop()
|
|
165
|
+
|
|
166
|
+
# Drain remaining output directly (not via _pull_text to avoid recursion)
|
|
167
|
+
self._drain_queues()
|
|
168
|
+
|
|
169
|
+
if self.process is not None:
|
|
170
|
+
self._append_text(
|
|
171
|
+
f"\n[Process exited with code {self.process.returncode}]\n",
|
|
172
|
+
is_error=self.process.returncode != 0,
|
|
173
|
+
)
|
|
174
|
+
self.process = None
|
|
175
|
+
|
|
176
|
+
# Clean up compiled binary
|
|
177
|
+
if self._cleanup_binary:
|
|
178
|
+
try:
|
|
179
|
+
os.remove(self._cleanup_binary)
|
|
180
|
+
except OSError:
|
|
181
|
+
pass
|
|
182
|
+
|
|
183
|
+
def _drain_queues(self) -> None:
|
|
184
|
+
"""Drain all remaining messages from output/error queues to UI."""
|
|
185
|
+
while not self.output_queue.empty():
|
|
186
|
+
try:
|
|
187
|
+
msg = self.output_queue.get_nowait()
|
|
188
|
+
msg = str(msg).strip()
|
|
189
|
+
if msg:
|
|
190
|
+
self._append_text(msg + "\n", is_error=False)
|
|
191
|
+
except queue.Empty:
|
|
192
|
+
break
|
|
193
|
+
while not self.error_queue.empty():
|
|
194
|
+
try:
|
|
195
|
+
msg = self.error_queue.get_nowait()
|
|
196
|
+
msg = str(msg).strip()
|
|
197
|
+
if msg:
|
|
198
|
+
self._append_text(msg + "\n", is_error=True)
|
|
199
|
+
except queue.Empty:
|
|
200
|
+
break
|
|
201
|
+
|
|
202
|
+
def _read_stdout(self) -> None:
|
|
203
|
+
try:
|
|
204
|
+
while self.still_running:
|
|
205
|
+
proc = self.process
|
|
206
|
+
if proc is None:
|
|
207
|
+
break
|
|
208
|
+
data = proc.stdout.readline(self.program_buffer_size)
|
|
209
|
+
if not data and proc.poll() is not None:
|
|
210
|
+
break
|
|
211
|
+
if isinstance(data, bytes):
|
|
212
|
+
data = data.decode(self.program_encoding, "replace")
|
|
213
|
+
if data:
|
|
214
|
+
self.output_queue.put(data)
|
|
215
|
+
except (OSError, ValueError):
|
|
216
|
+
pass
|
|
217
|
+
|
|
218
|
+
def _read_stderr(self) -> None:
|
|
219
|
+
try:
|
|
220
|
+
while self.still_running:
|
|
221
|
+
proc = self.process
|
|
222
|
+
if proc is None:
|
|
223
|
+
break
|
|
224
|
+
data = proc.stderr.readline(self.program_buffer_size)
|
|
225
|
+
if not data and proc.poll() is not None:
|
|
226
|
+
break
|
|
227
|
+
if isinstance(data, bytes):
|
|
228
|
+
data = data.decode(self.program_encoding, "replace")
|
|
229
|
+
if data:
|
|
230
|
+
self.error_queue.put(data)
|
|
231
|
+
except (OSError, ValueError):
|
|
232
|
+
pass
|
|
233
|
+
|
|
234
|
+
def _append_text(self, text: str, is_error: bool) -> None:
|
|
235
|
+
"""Append text to the code result widget."""
|
|
236
|
+
text_cursor = self.main_window.code_result.textCursor()
|
|
237
|
+
text_format = QTextCharFormat()
|
|
238
|
+
color_key = "error_output_color" if is_error else "normal_output_color"
|
|
239
|
+
text_format.setForeground(actually_color_dict.get(color_key))
|
|
240
|
+
text_cursor.insertText(text, text_format)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
4
|
|
|
5
5
|
from pybreeze.extend.process_executor.process_executor_utils import build_process
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@ from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_
|
|
|
13
13
|
|
|
14
14
|
def call_load_density(
|
|
15
15
|
main_window: PyBreezeMainWindow,
|
|
16
|
-
exec_str:
|
|
16
|
+
exec_str: str | None = None,
|
|
17
17
|
program_buffer: int = 1024000
|
|
18
18
|
):
|
|
19
19
|
build_process(main_window, "je_load_density", exec_str, False, program_buffer)
|
|
@@ -21,7 +21,7 @@ def call_load_density(
|
|
|
21
21
|
|
|
22
22
|
def call_load_density_with_send(
|
|
23
23
|
main_window: PyBreezeMainWindow,
|
|
24
|
-
exec_str:
|
|
24
|
+
exec_str: str | None = None,
|
|
25
25
|
program_buffer: int = 1024000
|
|
26
26
|
):
|
|
27
27
|
build_process(main_window, "je_load_density", exec_str, True, program_buffer)
|
|
@@ -36,7 +36,7 @@ def call_load_density_multi_file(
|
|
|
36
36
|
if need_to_execute_list is not None and isinstance(need_to_execute_list, list) and len(
|
|
37
37
|
need_to_execute_list) > 0:
|
|
38
38
|
for execute_file in need_to_execute_list:
|
|
39
|
-
with open(execute_file
|
|
39
|
+
with open(execute_file) as test_script_json:
|
|
40
40
|
call_load_density(
|
|
41
41
|
main_window,
|
|
42
42
|
test_script_json.read(),
|
|
@@ -56,7 +56,7 @@ def call_load_density_multi_file_and_send(
|
|
|
56
56
|
if need_to_execute_list is not None and isinstance(need_to_execute_list, list) and len(
|
|
57
57
|
need_to_execute_list) > 0:
|
|
58
58
|
for execute_file in need_to_execute_list:
|
|
59
|
-
with open(execute_file
|
|
59
|
+
with open(execute_file) as test_script_json:
|
|
60
60
|
call_load_density_with_send(
|
|
61
61
|
main_window,
|
|
62
62
|
test_script_json.read(),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
4
|
|
|
5
5
|
from pybreeze.extend.process_executor.process_executor_utils import build_process
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@ if TYPE_CHECKING:
|
|
|
10
10
|
|
|
11
11
|
def call_mail_thunder(
|
|
12
12
|
main_window: PyBreezeMainWindow,
|
|
13
|
-
exec_str:
|
|
13
|
+
exec_str: str | None = None,
|
|
14
14
|
program_buffer: int = 1024000
|
|
15
15
|
):
|
|
16
16
|
build_process(main_window, "je_mail_thunder", exec_str, False, program_buffer)
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
import sys
|
|
5
|
-
from typing import TYPE_CHECKING
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
6
|
|
|
7
7
|
from je_editor import EditorWidget
|
|
8
8
|
|
|
@@ -19,7 +19,7 @@ if TYPE_CHECKING:
|
|
|
19
19
|
def build_process(
|
|
20
20
|
main_window: PyBreezeMainWindow,
|
|
21
21
|
package: str,
|
|
22
|
-
exec_str:
|
|
22
|
+
exec_str: str | None = None,
|
|
23
23
|
send_mail: bool = False,
|
|
24
24
|
program_buffer: int = 1024000,
|
|
25
25
|
):
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
import queue
|
|
2
4
|
import subprocess
|
|
3
5
|
import sys
|
|
@@ -6,7 +8,7 @@ import typing
|
|
|
6
8
|
from pathlib import Path
|
|
7
9
|
from queue import Queue
|
|
8
10
|
from threading import Thread
|
|
9
|
-
|
|
11
|
+
|
|
10
12
|
|
|
11
13
|
from PySide6.QtCore import QTimer
|
|
12
14
|
from PySide6.QtGui import QTextCharFormat
|
|
@@ -16,27 +18,27 @@ from je_editor.utils.venv_check.check_venv import check_and_choose_venv
|
|
|
16
18
|
from pybreeze.pybreeze_ui.show_code_window.code_window import CodeWindow
|
|
17
19
|
|
|
18
20
|
|
|
19
|
-
class TaskProcessManager
|
|
21
|
+
class TaskProcessManager:
|
|
20
22
|
def __init__(
|
|
21
23
|
self,
|
|
22
24
|
main_window: CodeWindow,
|
|
23
|
-
task_done_trigger_function: typing.Callable = None,
|
|
24
|
-
error_trigger_function: typing.Callable = None,
|
|
25
|
+
task_done_trigger_function: typing.Callable | None = None,
|
|
26
|
+
error_trigger_function: typing.Callable | None = None,
|
|
25
27
|
program_buffer_size: int = 1024,
|
|
26
28
|
program_encoding: str = "utf-8"
|
|
27
29
|
):
|
|
28
30
|
super().__init__()
|
|
29
31
|
self.compiler_path = None
|
|
30
32
|
# ite_instance param
|
|
31
|
-
self.read_program_error_output_from_thread:
|
|
32
|
-
self.read_program_output_from_thread:
|
|
33
|
+
self.read_program_error_output_from_thread: threading.Thread | None = None
|
|
34
|
+
self.read_program_output_from_thread: threading.Thread | None = None
|
|
33
35
|
self.main_window: CodeWindow = main_window
|
|
34
36
|
self.timer: QTimer = QTimer(self.main_window)
|
|
35
37
|
self.still_run_program: bool = True
|
|
36
38
|
self.program_encoding: str = program_encoding
|
|
37
39
|
self.run_output_queue: Queue = Queue()
|
|
38
40
|
self.run_error_queue: Queue = Queue()
|
|
39
|
-
self.process:
|
|
41
|
+
self.process: subprocess.Popen | None = None
|
|
40
42
|
|
|
41
43
|
self.task_done_trigger_function: typing.Callable = task_done_trigger_function
|
|
42
44
|
self.error_trigger_function: typing.Callable = error_trigger_function
|
|
@@ -6,7 +6,7 @@ import sys
|
|
|
6
6
|
import threading
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
from queue import Queue
|
|
9
|
-
from typing import TYPE_CHECKING
|
|
9
|
+
from typing import TYPE_CHECKING
|
|
10
10
|
|
|
11
11
|
from PySide6.QtCore import QTimer
|
|
12
12
|
from PySide6.QtGui import QTextCharFormat
|
|
@@ -20,7 +20,7 @@ if TYPE_CHECKING:
|
|
|
20
20
|
from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
class TestPioneerProcess
|
|
23
|
+
class TestPioneerProcess:
|
|
24
24
|
|
|
25
25
|
def __init__(
|
|
26
26
|
self,
|
|
@@ -40,8 +40,8 @@ class TestPioneerProcess(object):
|
|
|
40
40
|
self._program_encoding = encoding
|
|
41
41
|
self._run_output_queue: Queue = Queue()
|
|
42
42
|
self._run_error_queue: Queue = Queue()
|
|
43
|
-
self._read_program_error_output_from_thread:
|
|
44
|
-
self._read_program_output_from_thread:
|
|
43
|
+
self._read_program_error_output_from_thread: threading.Thread | None = None
|
|
44
|
+
self._read_program_output_from_thread: threading.Thread | None = None
|
|
45
45
|
self._timer: QTimer = QTimer(self._code_window)
|
|
46
46
|
if self._main_window.python_compiler is None:
|
|
47
47
|
# Renew compiler path
|
|
@@ -59,7 +59,7 @@ class TestPioneerProcess(object):
|
|
|
59
59
|
"-e",
|
|
60
60
|
executable_path
|
|
61
61
|
]
|
|
62
|
-
self._process:
|
|
62
|
+
self._process: subprocess.Popen | None = subprocess.Popen(
|
|
63
63
|
args,
|
|
64
64
|
stdin=subprocess.PIPE,
|
|
65
65
|
stdout=subprocess.PIPE,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
4
|
|
|
5
5
|
from pybreeze.extend.process_executor.process_executor_utils import build_process
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@ from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_
|
|
|
13
13
|
|
|
14
14
|
def call_web_runner_test(
|
|
15
15
|
main_window: PyBreezeMainWindow,
|
|
16
|
-
exec_str:
|
|
16
|
+
exec_str: str | None = None,
|
|
17
17
|
program_buffer: int = 1024000
|
|
18
18
|
):
|
|
19
19
|
build_process(main_window, "je_web_runner", exec_str, False, program_buffer)
|
|
@@ -21,7 +21,7 @@ def call_web_runner_test(
|
|
|
21
21
|
|
|
22
22
|
def call_web_runner_test_with_send(
|
|
23
23
|
main_window: PyBreezeMainWindow,
|
|
24
|
-
exec_str:
|
|
24
|
+
exec_str: str | None = None,
|
|
25
25
|
program_buffer: int = 1024000
|
|
26
26
|
):
|
|
27
27
|
build_process(main_window, "je_web_runner", exec_str, True, program_buffer)
|
|
@@ -36,7 +36,7 @@ def call_web_runner_test_multi_file(
|
|
|
36
36
|
if need_to_execute_list is not None and isinstance(need_to_execute_list, list) and len(
|
|
37
37
|
need_to_execute_list) > 0:
|
|
38
38
|
for execute_file in need_to_execute_list:
|
|
39
|
-
with open(execute_file
|
|
39
|
+
with open(execute_file) as test_script_json:
|
|
40
40
|
call_web_runner_test(
|
|
41
41
|
main_window,
|
|
42
42
|
test_script_json.read(),
|
|
@@ -56,7 +56,7 @@ def call_web_runner_test_multi_file_and_send(
|
|
|
56
56
|
if need_to_execute_list is not None and isinstance(need_to_execute_list, list) and len(
|
|
57
57
|
need_to_execute_list) > 0:
|
|
58
58
|
for execute_file in need_to_execute_list:
|
|
59
|
-
with open(execute_file
|
|
59
|
+
with open(execute_file) as test_script_json:
|
|
60
60
|
call_web_runner_test_with_send(
|
|
61
61
|
main_window,
|
|
62
62
|
test_script_json.read(),
|