PyBreeze 1.0.7__tar.gz → 1.0.8__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 (119) hide show
  1. {pybreeze-1.0.7 → pybreeze-1.0.8}/PKG-INFO +3 -2
  2. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/__init__.py +2 -2
  3. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/api_testka/api_testka_process.py +5 -5
  4. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/auto_control/auto_control_process.py +5 -5
  5. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/file_automation/file_automation_process.py +5 -5
  6. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/load_density/load_density_process.py +5 -5
  7. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/mail_thunder/mail_thunder_process.py +2 -2
  8. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/process_executor_utils.py +3 -3
  9. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/test_pioneer/test_pioneer_process_manager.py +4 -4
  10. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/web_runner/web_runner_process.py +5 -5
  11. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/editor_main/main_ui.py +3 -3
  12. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_multi_language/extend_english.py +2 -0
  13. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_multi_language/extend_traditional_chinese.py +2 -0
  14. pybreeze-1.0.8/pybreeze/pybreeze_ui/jupyter_lab_gui/jupyer_lab_thread.py +54 -0
  15. pybreeze-1.0.8/pybreeze/pybreeze_ui/jupyter_lab_gui/jupyter_lab_widget.py +58 -0
  16. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/menu/automation_menu/api_testka_menu/build_api_testka_menu.py +3 -3
  17. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/menu/automation_menu/auto_control_menu/build_autocontrol_menu.py +4 -4
  18. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/menu/automation_menu/automation_file_menu/build_automation_file_menu.py +2 -2
  19. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/menu/automation_menu/load_density_menu/build_load_density_menu.py +3 -3
  20. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/menu/automation_menu/mail_thunder_menu/build_mail_thunder_menu.py +2 -2
  21. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/menu/automation_menu/test_pioneer_menu/build_test_pioneer_menu.py +3 -3
  22. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/menu/automation_menu/web_runner_menu/build_webrunner_menu.py +2 -2
  23. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/menu/build_menubar.py +15 -13
  24. pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/extend_jeditor_tab_menu/jupyter_lab_tab.py +31 -0
  25. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/menu/install_menu/automation_menu/build_automation_install_menu.py +8 -8
  26. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/menu/install_menu/install_utils.py +2 -2
  27. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/menu/install_menu/tools_menu/build_tool_install_menu.py +3 -3
  28. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/menu/menu_utils.py +2 -2
  29. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/menu/tools/tools_menu.py +4 -4
  30. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/syntax/syntax_extend.py +2 -2
  31. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/utils/logging/logger.py +6 -4
  32. pybreeze-1.0.8/pybreeze/utils/manager/__init__.py +0 -0
  33. pybreeze-1.0.8/pybreeze/utils/manager/package_manager/__init__.py +0 -0
  34. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze.egg-info/PKG-INFO +3 -2
  35. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze.egg-info/SOURCES.txt +5 -0
  36. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze.egg-info/requires.txt +2 -1
  37. {pybreeze-1.0.7 → pybreeze-1.0.8}/pyproject.toml +3 -2
  38. {pybreeze-1.0.7 → pybreeze-1.0.8}/LICENSE +0 -0
  39. {pybreeze-1.0.7 → pybreeze-1.0.8}/README.md +0 -0
  40. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/__main__.py +0 -0
  41. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/__init__.py +0 -0
  42. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/mail_thunder_extend/__init__.py +0 -0
  43. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/mail_thunder_extend/mail_thunder_setting.py +0 -0
  44. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/__init__.py +0 -0
  45. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/api_testka/__init__.py +0 -0
  46. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/auto_control/__init__.py +0 -0
  47. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/file_automation/__init__.py +0 -0
  48. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/load_density/__init__.py +0 -0
  49. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/mail_thunder/__init__.py +0 -0
  50. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/python_task_process_manager.py +0 -0
  51. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/test_pioneer/__init__.py +0 -0
  52. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/extend/process_executor/web_runner/__init__.py +0 -0
  53. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/__init__.py +0 -0
  54. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/connect_gui/__init__.py +0 -0
  55. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/connect_gui/ssh/__init__.py +0 -0
  56. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_command_widget.py +0 -0
  57. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_file_viewer_widget.py +0 -0
  58. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_login_widget.py +0 -0
  59. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/connect_gui/ssh/ssh_main_widget.py +0 -0
  60. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/connect_gui/url/__init__.py +0 -0
  61. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/connect_gui/url/ai_code_review_gui.py +0 -0
  62. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/editor_main/__init__.py +0 -0
  63. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/__init__.py +0 -0
  64. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/ai_gui_global_variable.py +0 -0
  65. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/code_review/__init__.py +0 -0
  66. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/code_review/code_review_thread.py +0 -0
  67. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/code_review/cot_code_review_gui.py +0 -0
  68. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/__init__.py +0 -0
  69. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/__init__.py +0 -0
  70. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/code_smell_detector.py +0 -0
  71. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/first_code_review.py +0 -0
  72. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/first_summary_prompt.py +0 -0
  73. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/global_rule.py +0 -0
  74. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/judge.py +0 -0
  75. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/judge_single_review.py +0 -0
  76. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/linter.py +0 -0
  77. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/step_by_step_analysis.py +0 -0
  78. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_code_review_prompt_templates/total_summary.py +0 -0
  79. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/cot_prompt_editor_widget.py +0 -0
  80. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/skills_prompt_editor_widget.py +0 -0
  81. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/skills_prompt_templates/__init__.py +0 -0
  82. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/skills_prompt_templates/code_explainer.py +0 -0
  83. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/prompt_edit_gui/skills_prompt_templates/code_review.py +0 -0
  84. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/skills/__init__.py +0 -0
  85. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_ai_gui/skills/skills_send_gui.py +0 -0
  86. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_multi_language/__init__.py +0 -0
  87. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/extend_multi_language/update_language_dict.py +0 -0
  88. {pybreeze-1.0.7/pybreeze/pybreeze_ui/menu → pybreeze-1.0.8/pybreeze/pybreeze_ui/jupyter_lab_gui}/__init__.py +0 -0
  89. {pybreeze-1.0.7/pybreeze/pybreeze_ui/menu/automation_menu → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu}/__init__.py +0 -0
  90. {pybreeze-1.0.7/pybreeze/pybreeze_ui/menu/automation_menu/api_testka_menu → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/automation_menu}/__init__.py +0 -0
  91. {pybreeze-1.0.7/pybreeze/pybreeze_ui/menu/automation_menu/auto_control_menu → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/automation_menu/api_testka_menu}/__init__.py +0 -0
  92. {pybreeze-1.0.7/pybreeze/pybreeze_ui/menu/automation_menu/automation_file_menu → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/automation_menu/auto_control_menu}/__init__.py +0 -0
  93. {pybreeze-1.0.7/pybreeze/pybreeze_ui/menu/automation_menu/load_density_menu → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/automation_menu/automation_file_menu}/__init__.py +0 -0
  94. {pybreeze-1.0.7/pybreeze/pybreeze_ui/menu/automation_menu/mail_thunder_menu → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/automation_menu/load_density_menu}/__init__.py +0 -0
  95. {pybreeze-1.0.7/pybreeze/pybreeze_ui/menu/automation_menu/test_pioneer_menu → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/automation_menu/mail_thunder_menu}/__init__.py +0 -0
  96. {pybreeze-1.0.7/pybreeze/pybreeze_ui/menu/automation_menu/web_runner_menu → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/automation_menu/test_pioneer_menu}/__init__.py +0 -0
  97. {pybreeze-1.0.7/pybreeze/pybreeze_ui/menu/install_menu → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/automation_menu/web_runner_menu}/__init__.py +0 -0
  98. {pybreeze-1.0.7/pybreeze/pybreeze_ui/menu/install_menu/automation_menu → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/extend_jeditor_tab_menu}/__init__.py +0 -0
  99. {pybreeze-1.0.7/pybreeze/pybreeze_ui/menu/install_menu/tools_menu → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/install_menu}/__init__.py +0 -0
  100. {pybreeze-1.0.7/pybreeze/pybreeze_ui/menu/tools → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/install_menu/automation_menu}/__init__.py +0 -0
  101. {pybreeze-1.0.7/pybreeze/pybreeze_ui/show_code_window → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/install_menu/tools_menu}/__init__.py +0 -0
  102. {pybreeze-1.0.7/pybreeze/pybreeze_ui/syntax → pybreeze-1.0.8/pybreeze/pybreeze_ui/menu/tools}/__init__.py +0 -0
  103. {pybreeze-1.0.7/pybreeze/utils → pybreeze-1.0.8/pybreeze/pybreeze_ui/show_code_window}/__init__.py +0 -0
  104. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/show_code_window/code_window.py +0 -0
  105. {pybreeze-1.0.7/pybreeze/utils/exception → pybreeze-1.0.8/pybreeze/pybreeze_ui/syntax}/__init__.py +0 -0
  106. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/pybreeze_ui/syntax/syntax_keyword.py +0 -0
  107. {pybreeze-1.0.7/pybreeze/utils/file_process → pybreeze-1.0.8/pybreeze/utils}/__init__.py +0 -0
  108. {pybreeze-1.0.7/pybreeze/utils/logging → pybreeze-1.0.8/pybreeze/utils/exception}/__init__.py +0 -0
  109. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/utils/exception/exception_tags.py +0 -0
  110. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/utils/exception/exceptions.py +0 -0
  111. {pybreeze-1.0.7/pybreeze/utils/manager → pybreeze-1.0.8/pybreeze/utils/file_process}/__init__.py +0 -0
  112. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/utils/file_process/get_dir_file_list.py +0 -0
  113. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/utils/json_format/__init__.py +0 -0
  114. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/utils/json_format/json_process.py +0 -0
  115. {pybreeze-1.0.7/pybreeze/utils/manager/package_manager → pybreeze-1.0.8/pybreeze/utils/logging}/__init__.py +0 -0
  116. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze/utils/manager/package_manager/package_manager_class.py +0 -0
  117. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze.egg-info/dependency_links.txt +0 -0
  118. {pybreeze-1.0.7 → pybreeze-1.0.8}/pybreeze.egg-info/top_level.txt +0 -0
  119. {pybreeze-1.0.7 → pybreeze-1.0.8}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pybreeze
3
- Version: 1.0.7
3
+ Version: 1.0.8
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
@@ -21,9 +21,10 @@ Requires-Dist: je_load_density
21
21
  Requires-Dist: je_api_testka
22
22
  Requires-Dist: je-mail-thunder
23
23
  Requires-Dist: automation-file
24
- Requires-Dist: PySide6==6.10.2
24
+ Requires-Dist: PySide6==6.11.0
25
25
  Requires-Dist: test_pioneer
26
26
  Requires-Dist: paramiko
27
+ Requires-Dist: jupyterlab
27
28
  Dynamic: license-file
28
29
 
29
30
  # PyBreeze: The Automation-First IDE
@@ -1,7 +1,7 @@
1
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
1
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
2
2
  from pybreeze.pybreeze_ui.editor_main.main_ui import EDITOR_EXTEND_TAB
3
3
  from pybreeze.pybreeze_ui.editor_main.main_ui import start_editor
4
4
 
5
5
  __all__ = [
6
- "start_editor", "AutomationEditor", "EDITOR_EXTEND_TAB"
6
+ "start_editor", "PyBreezeMainWindow", "EDITOR_EXTEND_TAB"
7
7
  ]
@@ -5,14 +5,14 @@ from typing import TYPE_CHECKING, Union
5
5
  from pybreeze.extend.process_executor.process_executor_utils import build_process
6
6
 
7
7
  if TYPE_CHECKING:
8
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
8
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
9
9
  import sys
10
10
 
11
11
  from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list
12
12
 
13
13
 
14
14
  def call_api_testka(
15
- main_window: AutomationEditor,
15
+ main_window: PyBreezeMainWindow,
16
16
  exec_str: Union[str, None] = None,
17
17
  program_buffer: int = 1024000
18
18
  ):
@@ -20,7 +20,7 @@ def call_api_testka(
20
20
 
21
21
 
22
22
  def call_api_testka_with_send(
23
- main_window: AutomationEditor,
23
+ main_window: PyBreezeMainWindow,
24
24
  exec_str: Union[str, None] = None,
25
25
  program_buffer: int = 1024000
26
26
  ):
@@ -28,7 +28,7 @@ def call_api_testka_with_send(
28
28
 
29
29
 
30
30
  def call_api_testka_multi_file(
31
- main_window: AutomationEditor,
31
+ main_window: PyBreezeMainWindow,
32
32
  program_buffer: int = 1024000
33
33
  ):
34
34
  try:
@@ -47,7 +47,7 @@ def call_api_testka_multi_file(
47
47
 
48
48
 
49
49
  def call_api_testka_multi_file_and_send(
50
- main_window: AutomationEditor,
50
+ main_window: PyBreezeMainWindow,
51
51
  program_buffer: int = 1024000
52
52
  ):
53
53
  try:
@@ -5,14 +5,14 @@ from typing import TYPE_CHECKING, Union
5
5
  from pybreeze.extend.process_executor.process_executor_utils import build_process
6
6
 
7
7
  if TYPE_CHECKING:
8
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
8
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
9
9
  import sys
10
10
 
11
11
  from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list
12
12
 
13
13
 
14
14
  def call_auto_control(
15
- main_window: AutomationEditor,
15
+ main_window: PyBreezeMainWindow,
16
16
  exec_str: Union[str, None] = None,
17
17
  program_buffer: int = 1024000
18
18
  ):
@@ -20,7 +20,7 @@ def call_auto_control(
20
20
 
21
21
 
22
22
  def call_auto_control_with_send(
23
- main_window: AutomationEditor,
23
+ main_window: PyBreezeMainWindow,
24
24
  exec_str: Union[str, None] = None,
25
25
  program_buffer: int = 1024000
26
26
  ):
@@ -28,7 +28,7 @@ def call_auto_control_with_send(
28
28
 
29
29
 
30
30
  def call_auto_control_multi_file(
31
- main_window: AutomationEditor,
31
+ main_window: PyBreezeMainWindow,
32
32
  program_buffer: int = 1024000
33
33
  ):
34
34
  need_to_execute_list: list = ask_and_get_dir_files_as_list(main_window)
@@ -44,7 +44,7 @@ def call_auto_control_multi_file(
44
44
 
45
45
 
46
46
  def call_auto_control_multi_file_and_send(
47
- main_window: AutomationEditor,
47
+ main_window: PyBreezeMainWindow,
48
48
  program_buffer: int = 1024000
49
49
  ):
50
50
  try:
@@ -5,14 +5,14 @@ from typing import TYPE_CHECKING, Union
5
5
  from pybreeze.extend.process_executor.process_executor_utils import build_process
6
6
 
7
7
  if TYPE_CHECKING:
8
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
8
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
9
9
  import sys
10
10
 
11
11
  from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list
12
12
 
13
13
 
14
14
  def call_file_automation_test(
15
- main_window: AutomationEditor,
15
+ main_window: PyBreezeMainWindow,
16
16
  exec_str: Union[str, None] = None,
17
17
  program_buffer: int = 1024000
18
18
  ):
@@ -20,7 +20,7 @@ def call_file_automation_test(
20
20
 
21
21
 
22
22
  def call_file_automation_test_with_send(
23
- main_window: AutomationEditor,
23
+ main_window: PyBreezeMainWindow,
24
24
  exec_str: Union[str, None] = None,
25
25
  program_buffer: int = 1024000
26
26
  ):
@@ -28,7 +28,7 @@ def call_file_automation_test_with_send(
28
28
 
29
29
 
30
30
  def call_file_automation_test_multi_file(
31
- main_window: AutomationEditor,
31
+ main_window: PyBreezeMainWindow,
32
32
  program_buffer: int = 1024000
33
33
  ):
34
34
  try:
@@ -47,7 +47,7 @@ def call_file_automation_test_multi_file(
47
47
 
48
48
 
49
49
  def call_file_automation_test_multi_file_and_send(
50
- main_window: AutomationEditor,
50
+ main_window: PyBreezeMainWindow,
51
51
  program_buffer: int = 1024000
52
52
  ):
53
53
  try:
@@ -5,14 +5,14 @@ from typing import TYPE_CHECKING, Union
5
5
  from pybreeze.extend.process_executor.process_executor_utils import build_process
6
6
 
7
7
  if TYPE_CHECKING:
8
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
8
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
9
9
  import sys
10
10
 
11
11
  from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list
12
12
 
13
13
 
14
14
  def call_load_density(
15
- main_window: AutomationEditor,
15
+ main_window: PyBreezeMainWindow,
16
16
  exec_str: Union[str, None] = None,
17
17
  program_buffer: int = 1024000
18
18
  ):
@@ -20,7 +20,7 @@ def call_load_density(
20
20
 
21
21
 
22
22
  def call_load_density_with_send(
23
- main_window: AutomationEditor,
23
+ main_window: PyBreezeMainWindow,
24
24
  exec_str: Union[str, None] = None,
25
25
  program_buffer: int = 1024000
26
26
  ):
@@ -28,7 +28,7 @@ def call_load_density_with_send(
28
28
 
29
29
 
30
30
  def call_load_density_multi_file(
31
- main_window: AutomationEditor,
31
+ main_window: PyBreezeMainWindow,
32
32
  program_buffer: int = 1024000
33
33
  ):
34
34
  try:
@@ -47,7 +47,7 @@ def call_load_density_multi_file(
47
47
 
48
48
 
49
49
  def call_load_density_multi_file_and_send(
50
- main_window: AutomationEditor,
50
+ main_window: PyBreezeMainWindow,
51
51
  program_buffer: int = 1024000
52
52
  ):
53
53
  try:
@@ -5,11 +5,11 @@ from typing import TYPE_CHECKING, Union
5
5
  from pybreeze.extend.process_executor.process_executor_utils import build_process
6
6
 
7
7
  if TYPE_CHECKING:
8
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
8
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
9
9
 
10
10
 
11
11
  def call_mail_thunder(
12
- main_window: AutomationEditor,
12
+ main_window: PyBreezeMainWindow,
13
13
  exec_str: Union[str, None] = None,
14
14
  program_buffer: int = 1024000
15
15
  ):
@@ -13,11 +13,11 @@ from pybreeze.utils.exception.exception_tags import wrong_test_data_format_excep
13
13
  from pybreeze.utils.exception.exceptions import ITETestExecutorException
14
14
 
15
15
  if TYPE_CHECKING:
16
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
16
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
17
17
 
18
18
 
19
19
  def build_process(
20
- main_window: AutomationEditor,
20
+ main_window: PyBreezeMainWindow,
21
21
  package: str,
22
22
  exec_str: Union[str, None] = None,
23
23
  send_mail: bool = False,
@@ -42,7 +42,7 @@ def build_process(
42
42
 
43
43
 
44
44
  def start_process(
45
- main_window: AutomationEditor,
45
+ main_window: PyBreezeMainWindow,
46
46
  package: str,
47
47
  test_format_code: str,
48
48
  send_mail: bool = False,
@@ -17,19 +17,19 @@ from je_editor.utils.venv_check.check_venv import check_and_choose_venv
17
17
  from pybreeze.pybreeze_ui.show_code_window.code_window import CodeWindow
18
18
 
19
19
  if TYPE_CHECKING:
20
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
20
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
21
21
 
22
22
 
23
23
  class TestPioneerProcess(object):
24
24
 
25
25
  def __init__(
26
26
  self,
27
- main_window: AutomationEditor,
27
+ main_window: PyBreezeMainWindow,
28
28
  executable_path: str,
29
29
  program_buffer: int = 1024000,
30
30
  encoding: str = "utf-8",
31
31
  ):
32
- self._main_window: AutomationEditor = main_window
32
+ self._main_window: PyBreezeMainWindow = main_window
33
33
  self._widget: QWidget = main_window.tab_widget.currentWidget()
34
34
  # Code window init
35
35
  self._code_window = CodeWindow()
@@ -175,7 +175,7 @@ class TestPioneerProcess(object):
175
175
  self._timer.start()
176
176
 
177
177
 
178
- def init_and_start_test_pioneer_process(ui_we_want_to_set: AutomationEditor, file_path: str):
178
+ def init_and_start_test_pioneer_process(ui_we_want_to_set: PyBreezeMainWindow, file_path: str):
179
179
  test_pioneer_process_manager = TestPioneerProcess(
180
180
  main_window=ui_we_want_to_set, executable_path=file_path)
181
181
  test_pioneer_process_manager.start_test_pioneer_process()
@@ -5,14 +5,14 @@ from typing import TYPE_CHECKING, Union
5
5
  from pybreeze.extend.process_executor.process_executor_utils import build_process
6
6
 
7
7
  if TYPE_CHECKING:
8
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
8
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
9
9
  import sys
10
10
 
11
11
  from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list
12
12
 
13
13
 
14
14
  def call_web_runner_test(
15
- main_window: AutomationEditor,
15
+ main_window: PyBreezeMainWindow,
16
16
  exec_str: Union[str, None] = None,
17
17
  program_buffer: int = 1024000
18
18
  ):
@@ -20,7 +20,7 @@ def call_web_runner_test(
20
20
 
21
21
 
22
22
  def call_web_runner_test_with_send(
23
- main_window: AutomationEditor,
23
+ main_window: PyBreezeMainWindow,
24
24
  exec_str: Union[str, None] = None,
25
25
  program_buffer: int = 1024000
26
26
  ):
@@ -28,7 +28,7 @@ def call_web_runner_test_with_send(
28
28
 
29
29
 
30
30
  def call_web_runner_test_multi_file(
31
- main_window: AutomationEditor,
31
+ main_window: PyBreezeMainWindow,
32
32
  program_buffer: int = 1024000
33
33
  ):
34
34
  try:
@@ -47,7 +47,7 @@ def call_web_runner_test_multi_file(
47
47
 
48
48
 
49
49
  def call_web_runner_test_multi_file_and_send(
50
- main_window: AutomationEditor,
50
+ main_window: PyBreezeMainWindow,
51
51
  program_buffer: int = 1024000
52
52
  ):
53
53
  try:
@@ -4,7 +4,7 @@ from os import environ
4
4
  from pathlib import Path
5
5
  from typing import List, Dict, Type
6
6
 
7
- from pybreeze.utils.logging.logger import automation_ide_logger
7
+ from pybreeze.utils.logging.logger import pybreeze_logger
8
8
 
9
9
  environ["LOCUST_SKIP_MONKEY_PATCH"] = "1"
10
10
 
@@ -24,7 +24,7 @@ EDITOR_EXTEND_TAB: Dict[str, Type[QWidget]] = {
24
24
  }
25
25
 
26
26
 
27
- class AutomationEditor(EditorMain):
27
+ class PyBreezeMainWindow(EditorMain):
28
28
 
29
29
  def __init__(self, debug_mode: bool = False, show_system_tray_ray: bool = False, extend: bool = False) -> None:
30
30
  super().__init__(debug_mode, show_system_tray_ray, extend=True)
@@ -94,7 +94,7 @@ def start_editor(debug_mode: bool = False, **kwargs) -> None:
94
94
  new_ide = QCoreApplication.instance()
95
95
  if new_ide is None:
96
96
  new_ide = QApplication(sys.argv)
97
- window = AutomationEditor(debug_mode=debug_mode, **kwargs)
97
+ window = PyBreezeMainWindow(debug_mode=debug_mode, **kwargs)
98
98
  apply_stylesheet(new_ide, theme="dark_amber.xml")
99
99
  window.showMaximized()
100
100
  try:
@@ -13,6 +13,8 @@ def update_english_word_dict():
13
13
  "run_label": "Run",
14
14
  "help_label": "HELP",
15
15
  "project_label": "Project",
16
+ # Tab tools menu
17
+ "tab_menu_jupyterlab_tab_name": "JupyterLab",
16
18
  # APITestka Menu
17
19
  "apitestka_menu_label": "APITestka",
18
20
  "apitestka_run_script_label": "Run APITestka Script",
@@ -13,6 +13,8 @@ def update_traditional_chinese_word_dict():
13
13
  "run_label": "運行",
14
14
  "help_label": "幫助",
15
15
  "project_label": "專案",
16
+ # Tab tools menu
17
+ "tab_menu_jupyterlab_tab_name": "JupyterLab",
16
18
  # APITestka Menu
17
19
  "apitestka_menu_label": "APITestka",
18
20
  "apitestka_run_script_label": "運行 APITestka 腳本",
@@ -0,0 +1,54 @@
1
+ import socket
2
+ import subprocess
3
+ import sys
4
+ from PySide6.QtCore import QThread, Signal
5
+ import time
6
+
7
+
8
+ def find_free_port():
9
+ s = socket.socket()
10
+ s.bind(("", 0))
11
+ port = s.getsockname()[1]
12
+ s.close()
13
+ return port
14
+
15
+
16
+ class JupyterServerThread(QThread):
17
+ server_ready = Signal(str)
18
+
19
+ def __init__(self):
20
+ super().__init__()
21
+ self.process = None
22
+
23
+ def run(self):
24
+ port = find_free_port()
25
+
26
+ cmd = [
27
+ sys.executable,
28
+ "-m",
29
+ "jupyterlab",
30
+ "--no-browser",
31
+ f"--ServerApp.port={port}",
32
+ "--ServerApp.token=",
33
+ "--ServerApp.password=",
34
+ "--ServerApp.allow_origin=*",
35
+ "--ServerApp.disable_check_xsrf=True",
36
+ ]
37
+
38
+ self.process = subprocess.Popen(cmd)
39
+
40
+ # 輪詢 port,直到可連
41
+ while True:
42
+ try:
43
+ s = socket.create_connection(("localhost", port), timeout=0.5)
44
+ s.close()
45
+ break
46
+ except OSError:
47
+ time.sleep(0.1)
48
+
49
+ # Server ready,發射 signal
50
+ self.server_ready.emit(f"http://localhost:{port}/lab")
51
+
52
+ def stop(self):
53
+ if self.process:
54
+ self.process.terminate()
@@ -0,0 +1,58 @@
1
+ import sys
2
+
3
+ from PySide6.QtCore import QUrl
4
+ from PySide6.QtWebEngineWidgets import QWebEngineView
5
+ from PySide6.QtWidgets import QApplication, QVBoxLayout, QWidget
6
+
7
+ from pybreeze.pybreeze_ui.jupyter_lab_gui.jupyer_lab_thread import JupyterServerThread
8
+
9
+
10
+ class JupyterLabWidget(QWidget):
11
+
12
+ def __init__(self):
13
+ super().__init__()
14
+
15
+ layout = QVBoxLayout(self)
16
+
17
+ self.browser = QWebEngineView()
18
+ layout.addWidget(self.browser)
19
+
20
+ # 啟動 Jupyter server thread
21
+ self.thread = JupyterServerThread()
22
+ self.thread.server_ready.connect(self.load_lab)
23
+ self.thread.start()
24
+
25
+ def load_lab(self, url: str):
26
+ """Load JupyterLab URL into WebEngine"""
27
+
28
+ if not url:
29
+ print("Invalid JupyterLab URL")
30
+ return
31
+
32
+ print("JupyterLab running at:", url)
33
+
34
+ qurl = QUrl(url)
35
+
36
+ if not qurl.isValid():
37
+ print("Invalid QUrl:", url)
38
+ return
39
+
40
+ self.browser.setUrl(qurl)
41
+
42
+ def closeEvent(self, event):
43
+
44
+ if hasattr(self, "thread") and self.thread.isRunning():
45
+ self.thread.stop()
46
+ self.thread.quit()
47
+ self.thread.wait()
48
+
49
+ event.accept()
50
+
51
+
52
+ if __name__ == "__main__":
53
+ app = QApplication(sys.argv)
54
+
55
+ win = JupyterLabWidget()
56
+ win.show()
57
+
58
+ sys.exit(app.exec())
@@ -8,7 +8,7 @@ from je_editor import language_wrapper
8
8
  from pybreeze.pybreeze_ui.menu.menu_utils import open_web_browser
9
9
 
10
10
  if TYPE_CHECKING:
11
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
11
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
12
12
  import sys
13
13
 
14
14
  from PySide6.QtGui import QAction
@@ -17,7 +17,7 @@ from pybreeze.extend.process_executor.api_testka.api_testka_process import call_
17
17
  call_api_testka_with_send, call_api_testka_multi_file, call_api_testka_multi_file_and_send
18
18
 
19
19
 
20
- def set_apitestka_menu(ui_we_want_to_set: AutomationEditor):
20
+ def set_apitestka_menu(ui_we_want_to_set: PyBreezeMainWindow):
21
21
  """
22
22
  Build menu include APITestka feature.
23
23
  :param ui_we_want_to_set: main window to add menu.
@@ -131,7 +131,7 @@ def create_project() -> None:
131
131
  print(repr(error), file=sys.stderr)
132
132
 
133
133
 
134
- def add_api_testka_gui(ui_we_want_to_set: AutomationEditor) -> None:
134
+ def add_api_testka_gui(ui_we_want_to_set: PyBreezeMainWindow) -> None:
135
135
  ui_we_want_to_set.tab_widget.addTab(
136
136
  APITestkaWidget(), "APITestka GUI"
137
137
  )
@@ -9,7 +9,7 @@ from je_editor.pyside_ui.main_ui.save_settings.user_color_setting_file import ac
9
9
  from pybreeze.pybreeze_ui.menu.menu_utils import open_web_browser
10
10
 
11
11
  if TYPE_CHECKING:
12
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
12
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
13
13
  import sys
14
14
 
15
15
  import je_auto_control
@@ -20,7 +20,7 @@ from pybreeze.extend.process_executor.auto_control.auto_control_process import \
20
20
  call_auto_control_multi_file_and_send
21
21
 
22
22
 
23
- def set_autocontrol_menu(ui_we_want_to_set: AutomationEditor):
23
+ def set_autocontrol_menu(ui_we_want_to_set: PyBreezeMainWindow):
24
24
  """
25
25
  Build menu include AutoControl feature.
26
26
  :param ui_we_want_to_set: main window to add menu.
@@ -153,7 +153,7 @@ def create_project() -> None:
153
153
  print(repr(error), file=sys.stderr)
154
154
 
155
155
 
156
- def stop_record(editor_instance: AutomationEditor):
156
+ def stop_record(editor_instance: PyBreezeMainWindow):
157
157
  widget = editor_instance.tab_widget.currentWidget()
158
158
  if isinstance(widget, EditorWidget):
159
159
  text_cursor = widget.code_edit.textCursor()
@@ -163,7 +163,7 @@ def stop_record(editor_instance: AutomationEditor):
163
163
  text_cursor.insertBlock()
164
164
 
165
165
 
166
- def add_autocontrol_gui(ui_we_want_to_set: AutomationEditor) -> None:
166
+ def add_autocontrol_gui(ui_we_want_to_set: PyBreezeMainWindow) -> None:
167
167
  ui_we_want_to_set.tab_widget.addTab(
168
168
  AutoControlGUIWidget(), "AutoControl GUI"
169
169
  )
@@ -7,7 +7,7 @@ from je_editor import language_wrapper
7
7
  from pybreeze.pybreeze_ui.menu.menu_utils import open_web_browser
8
8
 
9
9
  if TYPE_CHECKING:
10
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
10
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
11
11
  import sys
12
12
 
13
13
  from PySide6.QtGui import QAction
@@ -17,7 +17,7 @@ from pybreeze.extend.process_executor.file_automation.file_automation_process im
17
17
  call_file_automation_test_multi_file_and_send
18
18
 
19
19
 
20
- def set_automation_file_menu(ui_we_want_to_set: AutomationEditor):
20
+ def set_automation_file_menu(ui_we_want_to_set: PyBreezeMainWindow):
21
21
  """
22
22
  Build menu include WebRunner feature.
23
23
  :param ui_we_want_to_set: main window to add menu.
@@ -8,7 +8,7 @@ from je_load_density.gui.main_widget import LoadDensityWidget
8
8
  from pybreeze.pybreeze_ui.menu.menu_utils import open_web_browser
9
9
 
10
10
  if TYPE_CHECKING:
11
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
11
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
12
12
  import sys
13
13
 
14
14
  from PySide6.QtGui import QAction
@@ -18,7 +18,7 @@ from pybreeze.extend.process_executor.load_density.load_density_process import \
18
18
  call_load_density_multi_file_and_send
19
19
 
20
20
 
21
- def set_load_density_menu(ui_we_want_to_set: AutomationEditor):
21
+ def set_load_density_menu(ui_we_want_to_set: PyBreezeMainWindow):
22
22
  """
23
23
  Build menu include LoadDensity feature.
24
24
  :param ui_we_want_to_set: main window to add menu.
@@ -131,7 +131,7 @@ def create_project() -> None:
131
131
  print(repr(error), file=sys.stderr)
132
132
 
133
133
 
134
- def add_load_density_gui(ui_we_want_to_set: AutomationEditor) -> None:
134
+ def add_load_density_gui(ui_we_want_to_set: PyBreezeMainWindow) -> None:
135
135
  ui_we_want_to_set.tab_widget.addTab(
136
136
  LoadDensityWidget(), "LoadDensity GUI"
137
137
  )
@@ -7,7 +7,7 @@ from je_editor import language_wrapper
7
7
  from pybreeze.pybreeze_ui.menu.menu_utils import open_web_browser
8
8
 
9
9
  if TYPE_CHECKING:
10
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
10
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
11
11
  import sys
12
12
 
13
13
  from PySide6.QtGui import QAction
@@ -15,7 +15,7 @@ from PySide6.QtGui import QAction
15
15
  from pybreeze.extend.process_executor.mail_thunder.mail_thunder_process import call_mail_thunder
16
16
 
17
17
 
18
- def set_mail_thunder_menu(ui_we_want_to_set: AutomationEditor):
18
+ def set_mail_thunder_menu(ui_we_want_to_set: PyBreezeMainWindow):
19
19
  """
20
20
  Build menu include LoadDensity feature.
21
21
  :param ui_we_want_to_set: main window to add menu.
@@ -9,14 +9,14 @@ from pybreeze.extend.process_executor.test_pioneer.test_pioneer_process_manager
9
9
  init_and_start_test_pioneer_process
10
10
 
11
11
  if TYPE_CHECKING:
12
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
12
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
13
13
 
14
14
  from PySide6.QtGui import QAction
15
15
  from je_editor import language_wrapper
16
16
  from test_pioneer import create_template_dir
17
17
 
18
18
 
19
- def set_test_pioneer_menu(ui_we_want_to_set: AutomationEditor):
19
+ def set_test_pioneer_menu(ui_we_want_to_set: PyBreezeMainWindow):
20
20
  """
21
21
  Build menu include Test Pioneer feature.
22
22
  :param ui_we_want_to_set: main window to add menu.
@@ -44,7 +44,7 @@ def set_test_pioneer_menu(ui_we_want_to_set: AutomationEditor):
44
44
  )
45
45
 
46
46
 
47
- def check_file(ui_we_want_to_set: AutomationEditor):
47
+ def check_file(ui_we_want_to_set: PyBreezeMainWindow):
48
48
  dialog = QFileDialog(ui_we_want_to_set)
49
49
  dialog.setNameFilter("Yaml (*.yml)")
50
50
  file_tuple = dialog.getOpenFileName()
@@ -7,7 +7,7 @@ from je_editor import language_wrapper
7
7
  from pybreeze.pybreeze_ui.menu.menu_utils import open_web_browser
8
8
 
9
9
  if TYPE_CHECKING:
10
- from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
10
+ from pybreeze.pybreeze_ui.editor_main.main_ui import PyBreezeMainWindow
11
11
  import sys
12
12
 
13
13
  from PySide6.QtGui import QAction
@@ -16,7 +16,7 @@ from pybreeze.extend.process_executor.web_runner.web_runner_process import call_
16
16
  call_web_runner_test_with_send, call_web_runner_test_multi_file, call_web_runner_test_multi_file_and_send
17
17
 
18
18
 
19
- def set_web_runner_menu(ui_we_want_to_set: AutomationEditor):
19
+ def set_web_runner_menu(ui_we_want_to_set: PyBreezeMainWindow):
20
20
  """
21
21
  Build menu include WebRunner feature.
22
22
  :param ui_we_want_to_set: main window to add menu.