je-editor 0.0.221__py3-none-any.whl → 0.0.223__py3-none-any.whl

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.

Potentially problematic release.


This version of je-editor might be problematic. Click here for more details.

Files changed (36) hide show
  1. je_editor/__init__.py +2 -2
  2. je_editor/code_scan/ruff_thread.py +33 -6
  3. je_editor/code_scan/watchdog_implement.py +42 -20
  4. je_editor/code_scan/watchdog_thread.py +54 -9
  5. je_editor/git_client/commit_graph.py +32 -43
  6. je_editor/git_client/{git.py → git_action.py} +1 -1
  7. je_editor/git_client/git_cli.py +4 -4
  8. je_editor/pyside_ui/browser/browser_download_window.py +41 -5
  9. je_editor/pyside_ui/browser/browser_serach_lineedit.py +25 -1
  10. je_editor/pyside_ui/browser/browser_view.py +56 -3
  11. je_editor/pyside_ui/browser/browser_widget.py +52 -22
  12. je_editor/pyside_ui/browser/main_browser_widget.py +72 -0
  13. je_editor/pyside_ui/git_ui/code_diff_compare/__init__.py +0 -0
  14. je_editor/pyside_ui/git_ui/code_diff_compare/code_diff_viewer_widget.py +90 -0
  15. je_editor/pyside_ui/git_ui/code_diff_compare/line_number_code_viewer.py +141 -0
  16. je_editor/pyside_ui/git_ui/code_diff_compare/multi_file_diff_viewer.py +88 -0
  17. je_editor/pyside_ui/git_ui/code_diff_compare/side_by_side_diff_widget.py +271 -0
  18. je_editor/pyside_ui/git_ui/git_client/__init__.py +0 -0
  19. je_editor/pyside_ui/git_ui/{git_branch_tree_widget.py → git_client/git_branch_tree_widget.py} +17 -14
  20. je_editor/pyside_ui/git_ui/git_client/git_client_gui.py +799 -0
  21. je_editor/pyside_ui/main_ui/ai_widget/langchain_interface.py +1 -1
  22. je_editor/pyside_ui/main_ui/main_editor.py +5 -8
  23. je_editor/pyside_ui/main_ui/menu/dock_menu/build_dock_menu.py +17 -17
  24. je_editor/pyside_ui/main_ui/menu/help_menu/build_help_menu.py +2 -2
  25. je_editor/pyside_ui/main_ui/menu/tab_menu/build_tab_menu.py +21 -21
  26. je_editor/utils/multi_language/english.py +2 -1
  27. je_editor/utils/multi_language/traditional_chinese.py +2 -2
  28. {je_editor-0.0.221.dist-info → je_editor-0.0.223.dist-info}/METADATA +3 -3
  29. {je_editor-0.0.221.dist-info → je_editor-0.0.223.dist-info}/RECORD +34 -28
  30. je_editor/git_client/github.py +0 -50
  31. je_editor/pyside_ui/git_ui/git_client_gui.py +0 -291
  32. /je_editor/pyside_ui/git_ui/{commit_table.py → git_client/commit_table.py} +0 -0
  33. /je_editor/pyside_ui/git_ui/{graph_view.py → git_client/graph_view.py} +0 -0
  34. {je_editor-0.0.221.dist-info → je_editor-0.0.223.dist-info}/WHEEL +0 -0
  35. {je_editor-0.0.221.dist-info → je_editor-0.0.223.dist-info}/licenses/LICENSE +0 -0
  36. {je_editor-0.0.221.dist-info → je_editor-0.0.223.dist-info}/top_level.txt +0 -0
@@ -5,7 +5,7 @@ import re
5
5
  from typing import Union, TYPE_CHECKING
6
6
 
7
7
  from PySide6.QtWidgets import QMessageBox
8
- from langchain.prompts.chat import SystemMessagePromptTemplate
8
+ from langchain_core.prompts.chat import SystemMessagePromptTemplate
9
9
  from langchain_openai import ChatOpenAI
10
10
  from pydantic import SecretStr
11
11
 
@@ -8,10 +8,10 @@ import jedi.settings
8
8
  from PySide6.QtCore import QTimer, QEvent
9
9
  from PySide6.QtGui import QFontDatabase, QIcon, Qt, QTextCharFormat
10
10
  from PySide6.QtWidgets import QMainWindow, QWidget, QTabWidget
11
- from frontengine import FrontEngineMainUI
12
11
  from qt_material import QtStyleTools
13
12
 
14
13
  from je_editor.pyside_ui.browser.browser_widget import BrowserWidget
14
+ from je_editor.pyside_ui.browser.main_browser_widget import MainBrowserWidget
15
15
  from je_editor.pyside_ui.code.auto_save.auto_save_manager import init_new_auto_save_thread, file_is_open_manager_dict
16
16
  from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
17
17
  from je_editor.pyside_ui.main_ui.menu.set_menu_bar import set_menu_bar
@@ -104,14 +104,11 @@ class EditorMain(QMainWindow, QtStyleTools):
104
104
  self.redirect_timer.timeout.connect(self.redirect)
105
105
  self.redirect_timer.start()
106
106
  # TAB Add
107
+ main_browser_widget = MainBrowserWidget()
107
108
  self.tab_widget.addTab(EditorWidget(self), language_wrapper.language_word_dict.get("tab_name_editor"))
108
- self.tab_widget.addTab(
109
- FrontEngineMainUI(show_system_tray_ray=False, redirect_output=False),
110
- language_wrapper.language_word_dict.get("tab_name_frontengine"))
111
- self.tab_widget.addTab(BrowserWidget(), language_wrapper.language_word_dict.get("tab_name_web_browser"))
112
- self.tab_widget.addTab(
113
- BrowserWidget(start_url="https://stackoverflow.com/", search_prefix="https://stackoverflow.com/search?q="),
114
- language_wrapper.language_word_dict.get("tab_menu_stackoverflow_tab_name"))
109
+ self.tab_widget.addTab(main_browser_widget, language_wrapper.language_word_dict.get("tab_name_web_browser"))
110
+ main_browser_widget.add_browser_tab(
111
+ BrowserWidget(start_url="https://stackoverflow.com/", search_prefix="https://stackoverflow.com/search?q="))
115
112
 
116
113
  for widget_name, widget in EDITOR_EXTEND_TAB.items():
117
114
  self.tab_widget.addTab(widget(), widget_name)
@@ -8,10 +8,11 @@ from PySide6.QtGui import QAction
8
8
  from PySide6.QtWidgets import QFileDialog
9
9
  from frontengine import FrontEngineMainUI
10
10
 
11
- from je_editor.pyside_ui.browser.browser_widget import BrowserWidget
11
+ from je_editor.pyside_ui.git_ui.code_diff_compare.code_diff_viewer_widget import DiffViewerWidget
12
+ from je_editor.pyside_ui.browser.main_browser_widget import MainBrowserWidget
12
13
  from je_editor.pyside_ui.code.variable_inspector.inspector_gui import VariableInspector
13
- from je_editor.pyside_ui.git_ui.git_branch_tree_widget import GitTreeViewGUI
14
- from je_editor.pyside_ui.git_ui.git_client_gui import Gitgui
14
+ from je_editor.pyside_ui.git_ui.git_client.git_branch_tree_widget import GitTreeViewGUI
15
+ from je_editor.pyside_ui.git_ui.git_client.git_client_gui import GitGui
15
16
  from je_editor.pyside_ui.main_ui.ai_widget.chat_ui import ChatUI
16
17
  from je_editor.pyside_ui.main_ui.console_widget.console_gui import ConsoleWidget
17
18
  from je_editor.pyside_ui.main_ui.dock.destroy_dock import DestroyDock
@@ -36,13 +37,6 @@ def set_dock_menu(ui_we_want_to_set: EditorMain) -> None:
36
37
  lambda: add_dock_widget(ui_we_want_to_set)
37
38
  )
38
39
  ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_dock_browser_action)
39
- # Stackoverflow
40
- ui_we_want_to_set.dock_menu.new_dock_stackoverflow_action = QAction(
41
- language_wrapper.language_word_dict.get("dock_stackoverflow_label"))
42
- ui_we_want_to_set.dock_menu.new_dock_stackoverflow_action.triggered.connect(
43
- lambda: add_dock_widget(ui_we_want_to_set, "stackoverflow")
44
- )
45
- ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_dock_stackoverflow_action)
46
40
  # Editor
47
41
  ui_we_want_to_set.dock_menu.new_tab_dock_editor_action = QAction(
48
42
  language_wrapper.language_word_dict.get("dock_editor_label"))
@@ -99,6 +93,13 @@ def set_dock_menu(ui_we_want_to_set: EditorMain) -> None:
99
93
  lambda: add_dock_widget(ui_we_want_to_set, "console_widget")
100
94
  )
101
95
  ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_dynamic_console)
96
+ # Code diff viewer
97
+ ui_we_want_to_set.dock_menu.new_code_diff_viewer = QAction(
98
+ language_wrapper.language_word_dict.get("tab_code_diff_viewer_tab_name"))
99
+ ui_we_want_to_set.dock_menu.new_code_diff_viewer.triggered.connect(
100
+ lambda: add_dock_widget(ui_we_want_to_set, "code_diff_viewer")
101
+ )
102
+ ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_code_diff_viewer)
102
103
 
103
104
  def add_dock_widget(ui_we_want_to_set: EditorMain, widget_type: str = None):
104
105
  jeditor_logger.info("build_dock_menu.py add_dock_widget "
@@ -106,11 +107,7 @@ def add_dock_widget(ui_we_want_to_set: EditorMain, widget_type: str = None):
106
107
  f"widget_type: {widget_type}")
107
108
  # Dock widget
108
109
  dock_widget = DestroyDock()
109
- if widget_type == "stackoverflow":
110
- dock_widget.setWindowTitle("stackoverflow")
111
- dock_widget.setWidget(BrowserWidget(
112
- start_url="https://stackoverflow.com/", search_prefix="https://stackoverflow.com/search?q="))
113
- elif widget_type == "editor":
110
+ if widget_type == "editor":
114
111
  file_path = QFileDialog().getOpenFileName(
115
112
  parent=ui_we_want_to_set,
116
113
  dir=str(Path.cwd())
@@ -134,7 +131,7 @@ def add_dock_widget(ui_we_want_to_set: EditorMain, widget_type: str = None):
134
131
  dock_widget.setWidget(ChatUI(ui_we_want_to_set))
135
132
  elif widget_type == "git_client":
136
133
  dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_menu_git_client_tab_name"))
137
- dock_widget.setWidget(Gitgui())
134
+ dock_widget.setWidget(GitGui())
138
135
  elif widget_type == "git_branch_tree_view":
139
136
  dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_menu_git_branch_tree_view_tab_name"))
140
137
  dock_widget.setWidget(GitTreeViewGUI())
@@ -144,8 +141,11 @@ def add_dock_widget(ui_we_want_to_set: EditorMain, widget_type: str = None):
144
141
  elif widget_type == "console_widget":
145
142
  dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_menu_console_widget_tab_name"))
146
143
  dock_widget.setWidget(ConsoleWidget())
144
+ elif widget_type == "code_diff_viewer":
145
+ dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_code_diff_viewer_tab_name"))
146
+ dock_widget.setWidget(DiffViewerWidget())
147
147
  else:
148
148
  dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("dock_browser_title"))
149
- dock_widget.setWidget(BrowserWidget())
149
+ dock_widget.setWidget(MainBrowserWidget())
150
150
  if dock_widget.widget() is not None:
151
151
  ui_we_want_to_set.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, dock_widget)
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
- from je_editor.pyside_ui.browser.browser_widget import BrowserWidget
5
+ from je_editor.pyside_ui.browser.main_browser_widget import MainBrowserWidget
6
6
  from je_editor.utils.logging.loggin_instance import jeditor_logger
7
7
 
8
8
  if TYPE_CHECKING:
@@ -53,7 +53,7 @@ def open_web_browser(ui_we_want_to_set: EditorMain, url: str, tab_name: str):
53
53
  f"url: {url} "
54
54
  f"tab_name: {tab_name}")
55
55
  ui_we_want_to_set.tab_widget.addTab(
56
- BrowserWidget(start_url=url),
56
+ MainBrowserWidget(start_url=url),
57
57
  f"{tab_name}{ui_we_want_to_set.tab_widget.count()}"
58
58
  )
59
59
 
@@ -4,10 +4,11 @@ from typing import TYPE_CHECKING
4
4
 
5
5
  from frontengine import FrontEngineMainUI
6
6
 
7
- from je_editor.pyside_ui.browser.browser_widget import BrowserWidget
7
+ from je_editor.pyside_ui.git_ui.code_diff_compare.code_diff_viewer_widget import DiffViewerWidget
8
+ from je_editor.pyside_ui.browser.main_browser_widget import MainBrowserWidget
8
9
  from je_editor.pyside_ui.code.variable_inspector.inspector_gui import VariableInspector
9
- from je_editor.pyside_ui.git_ui.git_branch_tree_widget import GitTreeViewGUI
10
- from je_editor.pyside_ui.git_ui.git_client_gui import Gitgui
10
+ from je_editor.pyside_ui.git_ui.git_client.git_branch_tree_widget import GitTreeViewGUI
11
+ from je_editor.pyside_ui.git_ui.git_client.git_client_gui import GitGui
11
12
  from je_editor.pyside_ui.main_ui.ai_widget.chat_ui import ChatUI
12
13
  from je_editor.pyside_ui.main_ui.console_widget.console_gui import ConsoleWidget
13
14
  from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
@@ -46,13 +47,6 @@ def set_tab_menu(ui_we_want_to_set: EditorMain) -> None:
46
47
  lambda: add_web_tab(ui_we_want_to_set)
47
48
  )
48
49
  ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_web_action)
49
- # Stackoverflow
50
- ui_we_want_to_set.tab_menu.add_stackoverflow_action = QAction(
51
- language_wrapper.language_word_dict.get("tab_menu_add_stackoverflow_label"))
52
- ui_we_want_to_set.tab_menu.add_stackoverflow_action.triggered.connect(
53
- lambda: add_stackoverflow_tab(ui_we_want_to_set)
54
- )
55
- ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_stackoverflow_action)
56
50
  # IPython
57
51
  ui_we_want_to_set.tab_menu.add_ipython_action = QAction(
58
52
  language_wrapper.language_word_dict.get("tab_menu_ipython_tab_name"))
@@ -95,6 +89,13 @@ def set_tab_menu(ui_we_want_to_set: EditorMain) -> None:
95
89
  lambda: add_console_widget_tab(ui_we_want_to_set)
96
90
  )
97
91
  ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_console_widget_ui_action)
92
+ # Code diff viewer
93
+ ui_we_want_to_set.tab_menu.add_code_diff_viewer_ui_action = QAction(
94
+ language_wrapper.language_word_dict.get("tab_code_diff_viewer_tab_name"))
95
+ ui_we_want_to_set.tab_menu.add_code_diff_viewer_ui_action.triggered.connect(
96
+ lambda: add_code_diff_compare_tab(ui_we_want_to_set)
97
+ )
98
+ ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_code_diff_viewer_ui_action)
98
99
 
99
100
  def add_editor_tab(ui_we_want_to_set: EditorMain):
100
101
  jeditor_logger.info(f"build_tab_menu.py add editor tab ui_we_want_to_set: {ui_we_want_to_set}")
@@ -117,19 +118,11 @@ def add_frontengine_tab(ui_we_want_to_set: EditorMain):
117
118
  def add_web_tab(ui_we_want_to_set: EditorMain):
118
119
  jeditor_logger.info(f"build_tab_menu.py add web tab ui_we_want_to_set: {ui_we_want_to_set}")
119
120
  ui_we_want_to_set.tab_widget.addTab(
120
- BrowserWidget(),
121
+ MainBrowserWidget(),
121
122
  f"{language_wrapper.language_word_dict.get('tab_menu_web_tab_name')} "
122
123
  f"{ui_we_want_to_set.tab_widget.count()}")
123
124
 
124
125
 
125
- def add_stackoverflow_tab(ui_we_want_to_set: EditorMain):
126
- jeditor_logger.info(f"build_tab_menu.py add stackoverflow tab ui_we_want_to_set: {ui_we_want_to_set}")
127
- ui_we_want_to_set.tab_widget.addTab(
128
- BrowserWidget(start_url="https://stackoverflow.com/", search_prefix="https://stackoverflow.com/search?q="),
129
- f"{language_wrapper.language_word_dict.get('tab_menu_stackoverflow_tab_name')} "
130
- f"{ui_we_want_to_set.tab_widget.count()}")
131
-
132
-
133
126
  def add_ipython_tab(ui_we_want_to_set: EditorMain):
134
127
  jeditor_logger.info(f"build_tab_menu.py add ipython tab ui_we_want_to_set: {ui_we_want_to_set}")
135
128
  ui_we_want_to_set.tab_widget.addTab(
@@ -149,7 +142,7 @@ def add_chat_ui_tab(ui_we_want_to_set: EditorMain):
149
142
  def add_git_client_tab(ui_we_want_to_set: EditorMain):
150
143
  jeditor_logger.info(f"build_tab_menu.py add git client tab ui_we_want_to_set: {ui_we_want_to_set}")
151
144
  ui_we_want_to_set.tab_widget.addTab(
152
- Gitgui(),
145
+ GitGui(),
153
146
  f"{language_wrapper.language_word_dict.get('tab_menu_git_client_tab_name')} "
154
147
  f"{ui_we_want_to_set.tab_widget.count()}")
155
148
 
@@ -173,4 +166,11 @@ def add_console_widget_tab(ui_we_want_to_set: EditorMain):
173
166
  ui_we_want_to_set.tab_widget.addTab(
174
167
  ConsoleWidget(),
175
168
  f"{language_wrapper.language_word_dict.get('tab_menu_console_widget_tab_name')} "
176
- f"{ui_we_want_to_set.tab_widget.count()}")
169
+ f"{ui_we_want_to_set.tab_widget.count()}")
170
+
171
+ def add_code_diff_compare_tab(ui_we_want_to_set: EditorMain):
172
+ jeditor_logger.info(f"build_tab_menu.py add code diff compare tab ui_we_want_to_set: {ui_we_want_to_set}")
173
+ ui_we_want_to_set.tab_widget.addTab(
174
+ DiffViewerWidget(),
175
+ f"{language_wrapper.language_word_dict.get('tab_code_diff_viewer_tab_name')} "
176
+ f"{ui_we_want_to_set.tab_widget.count()}")
@@ -114,6 +114,7 @@ please make sure that the current encoding is consistent with the default encodi
114
114
  "tab_menu_git_branch_tree_view_tab_name": "Git BranchTreeViewer",
115
115
  "tab_menu_variable_inspector_tab_name": "Variable Inspector",
116
116
  "tab_menu_console_widget_tab_name": "Console Widget",
117
+ "tab_code_diff_viewer_tab_name": "Code Diff Viewer",
117
118
  # Text Menu
118
119
  "text_menu_label": "Text",
119
120
  "text_menu_label_font": "Font",
@@ -216,5 +217,5 @@ please make sure that the current encoding is consistent with the default encodi
216
217
  "dynamic_console_process_running": "Process is running; stop it first",
217
218
  "dynamic_console_done": "[done] exit={code}, status={status}",
218
219
  "dynamic_console_system_prefix": "[system] ",
219
-
220
+ # Code diff viewer
220
221
  }
@@ -104,10 +104,11 @@ traditional_chinese_word_dict = {
104
104
  "tab_menu_stackoverflow_tab_name": "Stackoverflow",
105
105
  "tab_menu_ipython_tab_name": "IPython(Jupyter)",
106
106
  "tab_menu_chat_ui_tab_name": "ChatUI",
107
- "tab_menu_git_client_tab_name": "Git Client",
107
+ "tab_menu_git_client_tab_name": "Git History",
108
108
  "tab_menu_git_branch_tree_view_tab_name": "Git BranchTreeViewer",
109
109
  "tab_menu_variable_inspector_tab_name": "Variable Inspector",
110
110
  "tab_menu_console_widget_tab_name": "ConsoleWidget",
111
+ "tab_code_diff_viewer_tab_name": "Code Diff Viewer",
111
112
  # Text Menu
112
113
  "text_menu_label": "文字",
113
114
  "text_menu_label_font": "字體",
@@ -210,5 +211,4 @@ traditional_chinese_word_dict = {
210
211
  "dynamic_console_process_running": "程序正在執行;請先停止",
211
212
  "dynamic_console_done": "[完成] 退出碼={code}, 狀態={status}",
212
213
  "dynamic_console_system_prefix": "[系統] ",
213
-
214
214
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: je_editor
3
- Version: 0.0.221
3
+ Version: 0.0.223
4
4
  Summary: JEditor is basic but powerful editor include GPT
5
5
  Author-email: JE-Chen <jechenmailman@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/JE-Chen/je_editor
@@ -23,8 +23,8 @@ Requires-Dist: frontengine
23
23
  Requires-Dist: pycodestyle
24
24
  Requires-Dist: jedi
25
25
  Requires-Dist: qtconsole
26
- Requires-Dist: langchain_openai
27
- Requires-Dist: langchain
26
+ Requires-Dist: langchain_openai==1.0.0
27
+ Requires-Dist: langchain==1.0.0
28
28
  Requires-Dist: pydantic
29
29
  Requires-Dist: watchdog
30
30
  Requires-Dist: ruff
@@ -1,21 +1,21 @@
1
- je_editor/__init__.py,sha256=IZm-mUID0W7-smb9SYEtwcWrpr8mz6OyF4e5akHGrFU,2405
1
+ je_editor/__init__.py,sha256=yIUH6MZZUrVYKo0emfnHmq4hzjTu1NygO2lbIpmYkao,2418
2
2
  je_editor/__main__.py,sha256=2ymm4ESRcqP4K1YQyeaDbGhuK-0C1IausIiEOpbm6Ds,570
3
3
  je_editor/start_editor.py,sha256=hW7JFOjBkcW7hdC7q-9JsaVTeSNCep1GsqxLmbMU4wg,543
4
4
  je_editor/code_scan/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- je_editor/code_scan/ruff_thread.py,sha256=pQjfsaQXI2ZJ6nAGq0Fpw-k3S2V_gYQ0lPgYnNC9Re0,938
6
- je_editor/code_scan/watchdog_implement.py,sha256=9N5TCvWQKi66DSrViUaNhUwP5TkYhmbz_ncS9KTGPx8,1313
7
- je_editor/code_scan/watchdog_thread.py,sha256=kMrZIe9HMd2DWWjZ35sKqTa4T_0ISYc8ZawPGdGOVTs,832
5
+ je_editor/code_scan/ruff_thread.py,sha256=DNM4cEZt5PBqIDtyy5GXq9BFwLhSuLu8FFBxn3_9xRE,1983
6
+ je_editor/code_scan/watchdog_implement.py,sha256=tjkA_9_bHEzGdTm_O1IPSwCka9ELMR4cI_nBKEHHV34,2114
7
+ je_editor/code_scan/watchdog_thread.py,sha256=UPIYpUCdgAox-44gJnp10ooJfBono1Hkkj5JFi2B_As,2609
8
8
  je_editor/git_client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- je_editor/git_client/commit_graph.py,sha256=Zg0HD-yxbyGQAOAX27QKz7enwQ9UAhNaXgXll36199o,3486
10
- je_editor/git_client/git.py,sha256=mxv-WRryIKRUONLU6V8X9ZMzIgYp76f-k3pZpqLqIbc,6253
11
- je_editor/git_client/git_cli.py,sha256=yINNHrFHQl-7zQxSk2Dhbw38EJCpOg5jbSe1ChKTVSM,2119
12
- je_editor/git_client/github.py,sha256=7ipQwkTS2ovjTe66kOyxlJth6HlEpqEZJ21PlKpKDw0,2124
9
+ je_editor/git_client/commit_graph.py,sha256=z5as1qS0rQMp_u8xdtIn0b0FKyZzUm68l3EiTjvykCU,2677
10
+ je_editor/git_client/git_action.py,sha256=FgIvS_xPZSu0H_UIQoaqJKJa-JZiQwj1oGLVOeSD1nA,6256
11
+ je_editor/git_client/git_cli.py,sha256=Ad-OdPyOQvAvUHeXWVwvHPCi7xo6o3ljKMTlUzOW53Q,2096
13
12
  je_editor/pyside_ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
13
  je_editor/pyside_ui/browser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- je_editor/pyside_ui/browser/browser_download_window.py,sha256=KEO8AoZYSDuES0z5os9ziD44lS47kIo3kbd5iOUM2Go,2018
16
- je_editor/pyside_ui/browser/browser_serach_lineedit.py,sha256=GYX6faCIxl-HtRXHZoc3EAuK6Ll41jgUV3ksawY5rsc,899
17
- je_editor/pyside_ui/browser/browser_view.py,sha256=WbX_Z6seD2uBIEauJ7MftIY9QVfghxgZFuhRNGiHOMA,1568
18
- je_editor/pyside_ui/browser/browser_widget.py,sha256=0fVnl6ye4FBz3bnxm-0SSEWW8bGlHS5DqQmMew5CKDk,3031
14
+ je_editor/pyside_ui/browser/browser_download_window.py,sha256=cCOj1WeglNIbabJZdXL0eXWE6bZT-U9huZGFbSSKXgw,3397
15
+ je_editor/pyside_ui/browser/browser_serach_lineedit.py,sha256=78Wa1X9LWoJW_ppCVTOmD51rJzjOElJGkdPkk4VBkBY,1875
16
+ je_editor/pyside_ui/browser/browser_view.py,sha256=UgzOyHBx8egGO7Pt4Ch18Hie9IrFtMFBvax2tItWJq0,3122
17
+ je_editor/pyside_ui/browser/browser_widget.py,sha256=YrNF918BUt2PlraeUqzhp1cyc9QCaqHv6lo5GmhmEZA,4123
18
+ je_editor/pyside_ui/browser/main_browser_widget.py,sha256=Ib5buoyDUQn0VIXfBPB8xN29QdDUDnLaWPF-WUMw0kY,2955
19
19
  je_editor/pyside_ui/code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  je_editor/pyside_ui/code/running_process_manager.py,sha256=VdfdprPNlPmMySOKDOjEEl5X9IsJVPSDb0a2KDKgiQg,1008
21
21
  je_editor/pyside_ui/code/auto_save/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -47,17 +47,23 @@ je_editor/pyside_ui/dialog/search_ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
47
47
  je_editor/pyside_ui/dialog/search_ui/search_error_box.py,sha256=jSa423cQW_xQ2WAj46CCWPsCP0Gy7g-UDe5o8LQyKQk,1190
48
48
  je_editor/pyside_ui/dialog/search_ui/search_text_box.py,sha256=ul-98FVByq_TNkkLZcBSF4VSwIQNBBj-4e6jYlh6YEA,1229
49
49
  je_editor/pyside_ui/git_ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
- je_editor/pyside_ui/git_ui/commit_table.py,sha256=5NkPx27omhtql1n0E51i5wuXqojnioxRD3SJPq-X0Xg,1136
51
- je_editor/pyside_ui/git_ui/git_branch_tree_widget.py,sha256=zCVz-_67Rtz_TtKVnzGxoX3ia8FLb2qgkpeXQthwQbc,4473
52
- je_editor/pyside_ui/git_ui/git_client_gui.py,sha256=kirBElyTiqpOtNlYSi5lDtRChAp6nkUD7hOhzG6SZuc,11668
53
- je_editor/pyside_ui/git_ui/graph_view.py,sha256=0qLxZMzRZMpDFACiUlv0EyyVkAZiYFlU7d2jE5NuVIE,6045
50
+ je_editor/pyside_ui/git_ui/code_diff_compare/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
+ je_editor/pyside_ui/git_ui/code_diff_compare/code_diff_viewer_widget.py,sha256=9TyUydcMO3_II9U-lALEfxfwQFJOj1Xlk0RKBOU4NUQ,3411
52
+ je_editor/pyside_ui/git_ui/code_diff_compare/line_number_code_viewer.py,sha256=VFC98ERf-Wj78MTD0bwAXOKtFRTjcdkndA-SiuiTI0g,5638
53
+ je_editor/pyside_ui/git_ui/code_diff_compare/multi_file_diff_viewer.py,sha256=Y8Z0MUBkxWjV6dnvMnmopDFCmxmUX49cAmX3DHgs-50,3195
54
+ je_editor/pyside_ui/git_ui/code_diff_compare/side_by_side_diff_widget.py,sha256=v07KV3V4C6vBLqyoJg4YuFWStx_cVH31jaeniH9V2lw,11100
55
+ je_editor/pyside_ui/git_ui/git_client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
+ je_editor/pyside_ui/git_ui/git_client/commit_table.py,sha256=5NkPx27omhtql1n0E51i5wuXqojnioxRD3SJPq-X0Xg,1136
57
+ je_editor/pyside_ui/git_ui/git_client/git_branch_tree_widget.py,sha256=wZ2OwY1LZ-Qv4TFx_7uuDGgb2jUsUKiUVgZoU_mg__I,4748
58
+ je_editor/pyside_ui/git_ui/git_client/git_client_gui.py,sha256=oMJl2TKz_C-JxrbKiq7S_7wl_e01EKfEVXPq-qNwWU8,34230
59
+ je_editor/pyside_ui/git_ui/git_client/graph_view.py,sha256=0qLxZMzRZMpDFACiUlv0EyyVkAZiYFlU7d2jE5NuVIE,6045
54
60
  je_editor/pyside_ui/main_ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- je_editor/pyside_ui/main_ui/main_editor.py,sha256=-EZ-GqtR3_5zyhc4x2CxDsGGvTQ245QEzjdpWLa1_7E,11533
61
+ je_editor/pyside_ui/main_ui/main_editor.py,sha256=ZGOiqKwa5qolDFXUTczItUYC6GUEvJiCT4gC0wFEdes,11354
56
62
  je_editor/pyside_ui/main_ui/ai_widget/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
63
  je_editor/pyside_ui/main_ui/ai_widget/ai_config.py,sha256=Uc9UkrIeALqjmZCF5ukXtSgU1EB4xa5223gk3CfYXX4,459
58
64
  je_editor/pyside_ui/main_ui/ai_widget/ask_thread.py,sha256=ma5Cnwlr0RbU-sytmodcYabWueyGE8DKKISZ_0zf3Eo,571
59
65
  je_editor/pyside_ui/main_ui/ai_widget/chat_ui.py,sha256=yBoWXvGvgUCWjmPoBcOhj0mtOm0R42mYEs7FokYQmnE,6763
60
- je_editor/pyside_ui/main_ui/ai_widget/langchain_interface.py,sha256=OgBaUcUMR0Z2VQUO9QfCX2wJc_qBFw3IvoMCiEGBTug,1768
66
+ je_editor/pyside_ui/main_ui/ai_widget/langchain_interface.py,sha256=_jykolLkwrGXL1Y_Scyf6Y9560rb9blGwDlpflRm9RI,1773
61
67
  je_editor/pyside_ui/main_ui/console_widget/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
68
  je_editor/pyside_ui/main_ui/console_widget/console_gui.py,sha256=3H0Ocj9oDtgAoH7mT2YjDsSeFW3FphsstJqtIesS4yA,5572
63
69
  je_editor/pyside_ui/main_ui/console_widget/qprocess_adapter.py,sha256=UIyIoCEyt6hMxc2oLH68ioERFyuPDnPub05_Yi_-rGs,2304
@@ -74,11 +80,11 @@ je_editor/pyside_ui/main_ui/menu/set_menu_bar.py,sha256=I12DXLyRO4cKe17fQY-QDazK
74
80
  je_editor/pyside_ui/main_ui/menu/check_style_menu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
81
  je_editor/pyside_ui/main_ui/menu/check_style_menu/build_check_style_menu.py,sha256=1wD6FI21Dw3IcQONuTkHP9rUPGwY70OvCtSc-ZcTKMk,3793
76
82
  je_editor/pyside_ui/main_ui/menu/dock_menu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
- je_editor/pyside_ui/main_ui/menu/dock_menu/build_dock_menu.py,sha256=Wf03lbITEifq5YywEvqsXqzLxes6R-CBsAE00giTwA0,8402
83
+ je_editor/pyside_ui/main_ui/menu/dock_menu/build_dock_menu.py,sha256=2G9KaqjC9WwGE6ZkVBtuDFqcfnGBlqr_DYnvJw1hjZU,8478
78
84
  je_editor/pyside_ui/main_ui/menu/file_menu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
85
  je_editor/pyside_ui/main_ui/menu/file_menu/build_file_menu.py,sha256=YT6kvXShRbfM4Qo51VveO_IK8uDqlNrGwHZUiM6_Tes,6881
80
86
  je_editor/pyside_ui/main_ui/menu/help_menu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
- je_editor/pyside_ui/main_ui/menu/help_menu/build_help_menu.py,sha256=iy1xDpV-u4DhZp8ZsetVKwHuJCctYgCWMpkIv12u3V0,2869
87
+ je_editor/pyside_ui/main_ui/menu/help_menu/build_help_menu.py,sha256=KjMDwPNxpiOGlHoiJ_XPkYbCtm7LuNUTso_rwM5fIY0,2882
82
88
  je_editor/pyside_ui/main_ui/menu/language_menu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
89
  je_editor/pyside_ui/main_ui/menu/language_menu/build_language_server.py,sha256=23jKdAYxN65xJMVd5NbCwhIjwh2kfXVDszN1wmIs1A0,2333
84
90
  je_editor/pyside_ui/main_ui/menu/python_env_menu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -93,7 +99,7 @@ je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/utils.py,sha256=zk5adQ7
93
99
  je_editor/pyside_ui/main_ui/menu/style_menu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
100
  je_editor/pyside_ui/main_ui/menu/style_menu/build_style_menu.py,sha256=OjfcjQ7fA1Z1rMwIS9oGkIkC-jy-e0jdGoYo1btTqUQ,1852
95
101
  je_editor/pyside_ui/main_ui/menu/tab_menu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
- je_editor/pyside_ui/main_ui/menu/tab_menu/build_tab_menu.py,sha256=XPyNSkNM-pZJbRfpeymYooWNokv_IT36csvJfEgXP-Q,9238
102
+ je_editor/pyside_ui/main_ui/menu/tab_menu/build_tab_menu.py,sha256=gUua9jFTGbfW6tN9Jd_TQluSObaXJC75YfEcqY-I0q8,9312
97
103
  je_editor/pyside_ui/main_ui/menu/text_menu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
104
  je_editor/pyside_ui/main_ui/menu/text_menu/build_text_menu.py,sha256=k3pOpK4i8ccs3D8VIrNx8g3kUDp1fZdqv9H5uEvNl5c,3558
99
105
  je_editor/pyside_ui/main_ui/save_settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -120,15 +126,15 @@ je_editor/utils/json_format/json_process.py,sha256=tszo48OnVivVkuuPrl-FtGaaq-1YO
120
126
  je_editor/utils/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
127
  je_editor/utils/logging/loggin_instance.py,sha256=5MUuLesU_WpR_Iu1uoAATi5Bj2yMYkimZrMfiXbk5pI,881
122
128
  je_editor/utils/multi_language/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
- je_editor/utils/multi_language/english.py,sha256=Od7UyWqtg2xE-my7xNmAjL4ahTDSzbD5Zvkgi07IsUk,9967
129
+ je_editor/utils/multi_language/english.py,sha256=r1GSpQZNGoeqgvOvaz1r9rJgEMGLjHIIyn7UHiKILBg,10047
124
130
  je_editor/utils/multi_language/multi_language_wrapper.py,sha256=_MtYrE51poQ1p_iWvT2eg_604uj6IsiBgGpifWpYLGc,1050
125
- je_editor/utils/multi_language/traditional_chinese.py,sha256=12rUsAbpTEi2q7OwfSsbXe2zWwYebrmwIOSPbS9Rg10,10045
131
+ je_editor/utils/multi_language/traditional_chinese.py,sha256=JS47iDkVgPQBQi-13Zr32joN8rnz22HBR79vaiEz8W4,10102
126
132
  je_editor/utils/redirect_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
133
  je_editor/utils/redirect_manager/redirect_manager_class.py,sha256=1gICetKpohBvmxmVhnqeCRq7AQS2YWK4AURmrqnVYVw,2277
128
134
  je_editor/utils/venv_check/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
135
  je_editor/utils/venv_check/check_venv.py,sha256=oCrMdue4NYUUGrVifh_iHFwIgxVx9azYN4jz3Xiulgg,999
130
- je_editor-0.0.221.dist-info/licenses/LICENSE,sha256=KMhUHh6pnIUvmXDW-49L_Sz63bqkOlPDqsecaqKiitU,1091
131
- je_editor-0.0.221.dist-info/METADATA,sha256=CJ8LAgKWyP7PBMu2Dj9SGqeTuRNxxWSSylrvtZw5qoo,3473
132
- je_editor-0.0.221.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
133
- je_editor-0.0.221.dist-info/top_level.txt,sha256=_9YA7BgxpkmdLs-5V_UQILxClcMRgPyG1a3qaE-Bkcs,10
134
- je_editor-0.0.221.dist-info/RECORD,,
136
+ je_editor-0.0.223.dist-info/licenses/LICENSE,sha256=KMhUHh6pnIUvmXDW-49L_Sz63bqkOlPDqsecaqKiitU,1091
137
+ je_editor-0.0.223.dist-info/METADATA,sha256=tEHTB17ubfoQ13yiiKadUPfiuztKPQGQkWVcdOuSHhg,3487
138
+ je_editor-0.0.223.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
139
+ je_editor-0.0.223.dist-info/top_level.txt,sha256=_9YA7BgxpkmdLs-5V_UQILxClcMRgPyG1a3qaE-Bkcs,10
140
+ je_editor-0.0.223.dist-info/RECORD,,
@@ -1,50 +0,0 @@
1
- import datetime
2
- import traceback
3
-
4
- from git import Repo, GitCommandError, InvalidGitRepositoryError, NoSuchPathError
5
-
6
-
7
- class GitCloneHandler:
8
- """
9
- Handles cloning of remote Git repositories with audit logging.
10
- Can be reused in UI or CLI contexts.
11
- """
12
-
13
- def __init__(self, audit_log_path: str = "git_clone_audit.log"):
14
- self.audit_log_path = audit_log_path
15
-
16
- def clone_repo(self, remote_url: str, local_path: str) -> str:
17
- """
18
- Clone a remote repository to a local path.
19
-
20
- :param remote_url: The Git repository URL (e.g., https://github.com/user/repo.git)
21
- :param local_path: The local directory to clone into
22
- :return: The path to the cloned repository
23
- :raises: Exception if cloning fails
24
- """
25
- try:
26
- self._log_audit(f"Cloning started: {remote_url} -> {local_path}")
27
- Repo.clone_from(remote_url, local_path)
28
- self._log_audit(f"Cloning completed: {remote_url} -> {local_path}")
29
- return local_path
30
- except (GitCommandError, InvalidGitRepositoryError, NoSuchPathError) as e:
31
- self._log_audit(
32
- f"ERROR: Git operation failed: {remote_url} -> {local_path}\n{str(e)}\nTraceback:\n{traceback.format_exc()}")
33
- raise RuntimeError(f"Git operation failed: {str(e)}") from e
34
- except Exception as e:
35
- self._log_audit(
36
- f"ERROR: Unexpected error during clone: {remote_url} -> {local_path}\n{str(e)}\nTraceback:\n{traceback.format_exc()}")
37
- raise RuntimeError(f"Unexpected error during clone: {str(e)}") from e
38
-
39
- def _log_audit(self, message: str):
40
- """
41
- Append an audit log entry with timestamp.
42
- """
43
- timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
44
- log_entry = f"[{timestamp}] {message}\n"
45
- try:
46
- with open(self.audit_log_path, "a", encoding="utf-8") as f:
47
- f.write(log_entry)
48
- except Exception:
49
- # Never let audit logging failure break the flow
50
- pass