PyBreeze-dev 1.0.10__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 (128) hide show
  1. {pybreeze_dev-1.0.10 → 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.10 → pybreeze_dev-1.0.12}/pybreeze/extend/mail_thunder_extend/mail_thunder_setting.py +7 -5
  5. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/api_testka/api_testka_process.py +5 -5
  6. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/auto_control/auto_control_process.py +5 -5
  7. {pybreeze_dev-1.0.10 → 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.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/load_density/load_density_process.py +5 -5
  10. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/mail_thunder/mail_thunder_process.py +2 -2
  11. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/process_executor_utils.py +3 -3
  12. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/python_task_process_manager.py +204 -177
  13. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/test_pioneer/test_pioneer_process_manager.py +200 -181
  14. {pybreeze_dev-1.0.10 → 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.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_command_widget.py +2 -2
  18. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_file_viewer_widget.py +31 -15
  19. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/url/ai_code_review_gui.py +2 -2
  20. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/editor_main/main_ui.py +5 -3
  21. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/code_review/code_review_thread.py +2 -2
  22. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/code_review/cot_code_review_gui.py +3 -1
  23. {pybreeze_dev-1.0.10 → 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
  24. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/judge.py +1 -1
  25. {pybreeze_dev-1.0.10 → 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
  26. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/linter.py +1 -1
  27. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_prompt_editor_widget.py +1 -1
  28. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/skills_prompt_editor_widget.py +1 -1
  29. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/skills_prompt_templates/code_explainer.py +1 -1
  30. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/skills_prompt_templates/code_review.py +1 -1
  31. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/skills/skills_send_gui.py +1 -2
  32. pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/jupyter_lab_gui/jupyter_lab_thread.py +124 -0
  33. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/jupyter_lab_gui/jupyter_lab_widget.py +8 -1
  34. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/build_menubar.py +4 -0
  35. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/extend_jeditor_tab_menu/jupyter_lab_tab.py +1 -2
  36. pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/menu/plugin_menu/build_plugin_menu.py +203 -0
  37. pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/menu/plugin_menu/build_run_with_menu.py +98 -0
  38. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/tools/tools_menu.py +1 -1
  39. pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/syntax/syntax_extend.py +37 -0
  40. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/utils/file_process/get_dir_file_list.py +1 -1
  41. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/utils/json_format/json_process.py +4 -4
  42. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/utils/logging/logger.py +2 -4
  43. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/utils/manager/package_manager/package_manager_class.py +1 -1
  44. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/PKG-INFO +1 -1
  45. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/SOURCES.txt +5 -1
  46. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pyproject.toml +1 -1
  47. pybreeze_dev-1.0.10/pybreeze/__init__.py +0 -7
  48. pybreeze_dev-1.0.10/pybreeze/extend_multi_language/extend_english.py +0 -278
  49. pybreeze_dev-1.0.10/pybreeze/extend_multi_language/extend_traditional_chinese.py +0 -278
  50. pybreeze_dev-1.0.10/pybreeze/pybreeze_ui/jupyter_lab_gui/jupyer_lab_thread.py +0 -95
  51. pybreeze_dev-1.0.10/pybreeze/pybreeze_ui/syntax/syntax_extend.py +0 -40
  52. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/LICENSE +0 -0
  53. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/README.md +0 -0
  54. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/__init__.py +0 -0
  55. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/mail_thunder_extend/__init__.py +0 -0
  56. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/__init__.py +0 -0
  57. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/api_testka/__init__.py +0 -0
  58. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/auto_control/__init__.py +0 -0
  59. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/file_automation/__init__.py +0 -0
  60. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/load_density/__init__.py +0 -0
  61. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/mail_thunder/__init__.py +0 -0
  62. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/test_pioneer/__init__.py +0 -0
  63. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend/process_executor/web_runner/__init__.py +0 -0
  64. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend_multi_language/__init__.py +0 -0
  65. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/extend_multi_language/update_language_dict.py +0 -0
  66. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/__init__.py +0 -0
  67. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/__init__.py +0 -0
  68. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/__init__.py +0 -0
  69. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_login_widget.py +0 -0
  70. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_main_widget.py +0 -0
  71. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/connect_gui/url/__init__.py +0 -0
  72. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/editor_main/__init__.py +0 -0
  73. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/__init__.py +0 -0
  74. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/ai_gui_global_variable.py +0 -0
  75. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/code_review/__init__.py +0 -0
  76. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/__init__.py +0 -0
  77. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/__init__.py +0 -0
  78. {pybreeze_dev-1.0.10 → 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
  79. {pybreeze_dev-1.0.10 → 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
  80. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/global_rule.py +0 -0
  81. {pybreeze_dev-1.0.10 → 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
  82. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/total_summary.py +0 -0
  83. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/skills_prompt_templates/__init__.py +0 -0
  84. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/extend_ai_gui/skills/__init__.py +0 -0
  85. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/jupyter_lab_gui/__init__.py +0 -0
  86. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/__init__.py +0 -0
  87. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/__init__.py +0 -0
  88. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/api_testka_menu/__init__.py +0 -0
  89. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/api_testka_menu/build_api_testka_menu.py +0 -0
  90. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/auto_control_menu/__init__.py +0 -0
  91. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/auto_control_menu/build_autocontrol_menu.py +0 -0
  92. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/automation_file_menu/__init__.py +0 -0
  93. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/automation_file_menu/build_automation_file_menu.py +0 -0
  94. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/load_density_menu/__init__.py +0 -0
  95. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/load_density_menu/build_load_density_menu.py +0 -0
  96. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/mail_thunder_menu/__init__.py +0 -0
  97. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/mail_thunder_menu/build_mail_thunder_menu.py +0 -0
  98. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/test_pioneer_menu/__init__.py +0 -0
  99. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/test_pioneer_menu/build_test_pioneer_menu.py +0 -0
  100. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/web_runner_menu/__init__.py +0 -0
  101. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/automation_menu/web_runner_menu/build_webrunner_menu.py +0 -0
  102. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/extend_jeditor_tab_menu/__init__.py +0 -0
  103. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/__init__.py +0 -0
  104. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/automation_menu/__init__.py +0 -0
  105. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/automation_menu/build_automation_install_menu.py +0 -0
  106. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/install_utils.py +0 -0
  107. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/tools_menu/__init__.py +0 -0
  108. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/install_menu/tools_menu/build_tool_install_menu.py +0 -0
  109. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/menu/menu_utils.py +0 -0
  110. {pybreeze_dev-1.0.10/pybreeze/pybreeze_ui/menu/tools → pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/menu/plugin_menu}/__init__.py +0 -0
  111. {pybreeze_dev-1.0.10/pybreeze/pybreeze_ui/show_code_window → pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/menu/tools}/__init__.py +0 -0
  112. {pybreeze_dev-1.0.10/pybreeze/pybreeze_ui/syntax → pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/show_code_window}/__init__.py +0 -0
  113. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/show_code_window/code_window.py +0 -0
  114. {pybreeze_dev-1.0.10/pybreeze/utils → pybreeze_dev-1.0.12/pybreeze/pybreeze_ui/syntax}/__init__.py +0 -0
  115. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/pybreeze_ui/syntax/syntax_keyword.py +0 -0
  116. {pybreeze_dev-1.0.10/pybreeze/utils/exception → pybreeze_dev-1.0.12/pybreeze/utils}/__init__.py +0 -0
  117. {pybreeze_dev-1.0.10/pybreeze/utils/file_process → pybreeze_dev-1.0.12/pybreeze/utils/exception}/__init__.py +0 -0
  118. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/utils/exception/exception_tags.py +0 -0
  119. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/utils/exception/exceptions.py +0 -0
  120. {pybreeze_dev-1.0.10/pybreeze/utils/logging → pybreeze_dev-1.0.12/pybreeze/utils/file_process}/__init__.py +0 -0
  121. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze/utils/json_format/__init__.py +0 -0
  122. {pybreeze_dev-1.0.10/pybreeze/utils/manager → pybreeze_dev-1.0.12/pybreeze/utils/logging}/__init__.py +0 -0
  123. {pybreeze_dev-1.0.10/pybreeze/utils/manager/package_manager → pybreeze_dev-1.0.12/pybreeze/utils/manager}/__init__.py +0 -0
  124. /pybreeze_dev-1.0.10/pybreeze/__main__.py → /pybreeze_dev-1.0.12/pybreeze/utils/manager/package_manager/__init__.py +0 -0
  125. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/dependency_links.txt +0 -0
  126. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/requires.txt +0 -0
  127. {pybreeze_dev-1.0.10 → pybreeze_dev-1.0.12}/pybreeze_dev.egg-info/top_level.txt +0 -0
  128. {pybreeze_dev-1.0.10 → 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.10
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
  ):
@@ -56,13 +56,13 @@ def start_process(
56
56
  if send_mail:
57
57
  process = TaskProcessManager(
58
58
  main_window=code_window,
59
+ task_done_trigger_function=send_after_test,
59
60
  program_buffer_size=program_buffer,
60
61
  program_encoding=main_window.encoding
61
62
  )
62
63
  else:
63
64
  process = TaskProcessManager(
64
65
  code_window,
65
- task_done_trigger_function=send_after_test,
66
66
  program_buffer_size=program_buffer,
67
67
  program_encoding=main_window.encoding
68
68
  )