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.
Files changed (127) hide show
  1. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/PKG-INFO +1 -1
  2. pybreeze_dev-1.0.12/pybreeze/__init__.py +19 -0
  3. pybreeze_dev-1.0.12/pybreeze/__main__.py +3 -0
  4. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/mail_thunder_extend/mail_thunder_setting.py +7 -5
  5. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/api_testka/api_testka_process.py +5 -5
  6. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/auto_control/auto_control_process.py +5 -5
  7. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/file_automation/file_automation_process.py +5 -5
  8. pybreeze_dev-1.0.12/pybreeze/extend/process_executor/file_runner_process.py +240 -0
  9. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/load_density/load_density_process.py +5 -5
  10. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/mail_thunder/mail_thunder_process.py +2 -2
  11. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/process_executor_utils.py +2 -2
  12. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/python_task_process_manager.py +9 -7
  13. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/test_pioneer/test_pioneer_process_manager.py +5 -5
  14. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/web_runner/web_runner_process.py +5 -5
  15. pybreeze_dev-1.0.12/pybreeze/extend_multi_language/extend_english.py +311 -0
  16. pybreeze_dev-1.0.12/pybreeze/extend_multi_language/extend_traditional_chinese.py +312 -0
  17. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_command_widget.py +1 -1
  18. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_file_viewer_widget.py +9 -10
  19. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/url/ai_code_review_gui.py +2 -2
  20. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/editor_main/main_ui.py +5 -3
  21. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/code_review/code_review_thread.py +2 -2
  22. {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
  23. {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
  24. {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
  25. {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
  26. {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
  27. {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
  28. {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
  29. {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
  30. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/skills/skills_send_gui.py +1 -2
  31. 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
  32. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/jupyter_lab_gui/jupyter_lab_widget.py +1 -1
  33. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/build_menubar.py +4 -0
  34. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/extend_jeditor_tab_menu/jupyter_lab_tab.py +1 -2
  35. pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/menu/plugin_menu/build_plugin_menu.py +203 -0
  36. pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/menu/plugin_menu/build_run_with_menu.py +98 -0
  37. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/tools/tools_menu.py +1 -1
  38. pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/syntax/syntax_extend.py +37 -0
  39. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/json_format/json_process.py +4 -4
  40. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/manager/package_manager/package_manager_class.py +1 -1
  41. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/PKG-INFO +1 -1
  42. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/SOURCES.txt +5 -1
  43. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pyproject.toml +1 -1
  44. pybreeze_dev-1.0.11/pybreeze/__init__.py +0 -7
  45. pybreeze_dev-1.0.11/pybreeze/extend_multi_language/extend_english.py +0 -280
  46. pybreeze_dev-1.0.11/pybreeze/extend_multi_language/extend_traditional_chinese.py +0 -280
  47. pybreeze_dev-1.0.11/pybreeze/pybreeze_ui/syntax/syntax_extend.py +0 -40
  48. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/LICENSE +0 -0
  49. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/README.md +0 -0
  50. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/__init__.py +0 -0
  51. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/mail_thunder_extend/__init__.py +0 -0
  52. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/__init__.py +0 -0
  53. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/api_testka/__init__.py +0 -0
  54. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/auto_control/__init__.py +0 -0
  55. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/file_automation/__init__.py +0 -0
  56. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/load_density/__init__.py +0 -0
  57. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/mail_thunder/__init__.py +0 -0
  58. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/test_pioneer/__init__.py +0 -0
  59. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/web_runner/__init__.py +0 -0
  60. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend_multi_language/__init__.py +0 -0
  61. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/extend_multi_language/update_language_dict.py +0 -0
  62. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/__init__.py +0 -0
  63. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/__init__.py +0 -0
  64. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/__init__.py +0 -0
  65. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_login_widget.py +0 -0
  66. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_main_widget.py +0 -0
  67. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/url/__init__.py +0 -0
  68. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/editor_main/__init__.py +0 -0
  69. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/__init__.py +0 -0
  70. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/ai_gui_global_variable.py +0 -0
  71. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/code_review/__init__.py +0 -0
  72. {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
  73. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/__init__.py +0 -0
  74. {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
  75. {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
  76. {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
  77. {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
  78. {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
  79. {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
  80. {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
  81. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/skills/__init__.py +0 -0
  82. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/jupyter_lab_gui/__init__.py +0 -0
  83. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/__init__.py +0 -0
  84. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/__init__.py +0 -0
  85. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/api_testka_menu/__init__.py +0 -0
  86. {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
  87. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/auto_control_menu/__init__.py +0 -0
  88. {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
  89. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/automation_file_menu/__init__.py +0 -0
  90. {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
  91. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/load_density_menu/__init__.py +0 -0
  92. {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
  93. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/mail_thunder_menu/__init__.py +0 -0
  94. {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
  95. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/test_pioneer_menu/__init__.py +0 -0
  96. {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
  97. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/web_runner_menu/__init__.py +0 -0
  98. {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
  99. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/extend_jeditor_tab_menu/__init__.py +0 -0
  100. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/__init__.py +0 -0
  101. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/automation_menu/__init__.py +0 -0
  102. {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
  103. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/install_utils.py +0 -0
  104. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/tools_menu/__init__.py +0 -0
  105. {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
  106. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/menu_utils.py +0 -0
  107. {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
  108. {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
  109. {pybreeze_dev-1.0.11/pybreeze/pybreeze_ui/syntax → pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/show_code_window}/__init__.py +0 -0
  110. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/show_code_window/code_window.py +0 -0
  111. {pybreeze_dev-1.0.11/pybreeze/utils → pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/syntax}/__init__.py +0 -0
  112. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/syntax/syntax_keyword.py +0 -0
  113. {pybreeze_dev-1.0.11/pybreeze/utils/exception → pybreeze_dev-1.0.12/pybreeze/utils}/__init__.py +0 -0
  114. {pybreeze_dev-1.0.11/pybreeze/utils/file_process → pybreeze_dev-1.0.12/pybreeze/utils/exception}/__init__.py +0 -0
  115. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/exception/exception_tags.py +0 -0
  116. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/exception/exceptions.py +0 -0
  117. {pybreeze_dev-1.0.11/pybreeze/utils/logging → pybreeze_dev-1.0.12/pybreeze/utils/file_process}/__init__.py +0 -0
  118. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/file_process/get_dir_file_list.py +0 -0
  119. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/json_format/__init__.py +0 -0
  120. {pybreeze_dev-1.0.11/pybreeze/utils/manager → pybreeze_dev-1.0.12/pybreeze/utils/logging}/__init__.py +0 -0
  121. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze/utils/logging/logger.py +0 -0
  122. {pybreeze_dev-1.0.11/pybreeze/utils/manager/package_manager → pybreeze_dev-1.0.12/pybreeze/utils/manager}/__init__.py +0 -0
  123. /pybreeze_dev-1.0.11/pybreeze/__main__.py → /pybreeze_dev-1.0.12/pybreeze/utils/manager/package_manager/__init__.py +0 -0
  124. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/dependency_links.txt +0 -0
  125. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/requires.txt +0 -0
  126. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/top_level.txt +0 -0
  127. {pybreeze_dev-1.0.11 → pybreeze_dev-1.0.12}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pybreeze_dev
3
- Version: 1.0.11
3
+ Version: 1.0.12
4
4
  Summary: IDE for multi automation
5
5
  Author-email: JE-Chen <jechenmailman@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/Intergration-Automation-Testing/AutomationEditor
@@ -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
+ ]
@@ -0,0 +1,3 @@
1
+ from pybreeze import start_editor
2
+
3
+ start_editor()
@@ -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 is True:
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", "r") as file:
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 is True:
24
+ elif mail_thunder_smtp.login_state:
23
25
  user: str = mail_thunder_smtp.user
24
- with open(html_report_path, "r") as file:
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, Union
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: Union[str, None] = None,
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: Union[str, None] = None,
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, "r") as test_script_json:
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, "r") as test_script_json:
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, Union
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: Union[str, None] = None,
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: Union[str, None] = None,
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, "r") as test_script_json:
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, "r") as test_script_json:
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, Union
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: Union[str, None] = None,
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: Union[str, None] = None,
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, "r") as test_script_json:
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, "r") as test_script_json:
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, Union
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: Union[str, None] = None,
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: Union[str, None] = None,
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, "r") as test_script_json:
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, "r") as test_script_json:
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, Union
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: Union[str, None] = None,
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, Union
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: Union[str, None] = None,
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
- from typing import Union
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(object):
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: Union[threading.Thread, None] = None
32
- self.read_program_output_from_thread: Union[threading.Thread, None] = None
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: Union[subprocess.Popen, None] = None
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, Union
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(object):
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: Union[threading.Thread, None] = None
44
- self._read_program_output_from_thread: Union[threading.Thread, None] = None
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: Union[subprocess.Popen, None] = subprocess.Popen(
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, Union
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: Union[str, None] = None,
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: Union[str, None] = None,
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, "r") as test_script_json:
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, "r") as test_script_json:
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(),