je-editor 0.0.186__py3-none-any.whl → 0.0.188__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
je_editor/__init__.py CHANGED
@@ -2,7 +2,7 @@ from je_editor.pyside_ui.browser.browser_widget import BrowserWidget
2
2
  from je_editor.pyside_ui.code.code_process.code_exec import ExecManager
3
3
  from je_editor.pyside_ui.code.shell_process.shell_exec import ShellManager
4
4
  from je_editor.pyside_ui.code.syntax.python_syntax import PythonHighlighter
5
- from je_editor.pyside_ui.code.syntax.syntax_setting import syntax_word_setting_dict, syntax_rule_setting_dict
5
+ from je_editor.pyside_ui.code.syntax.syntax_setting import syntax_extend_setting_dict, syntax_rule_setting_dict
6
6
  from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
7
7
  from je_editor.pyside_ui.main_ui.editor.editor_widget_dock import FullEditorWidget
8
8
  from je_editor.pyside_ui.main_ui.main_editor import EDITOR_EXTEND_TAB
@@ -26,7 +26,7 @@ __all__ = [
26
26
  "start_editor", "EditorMain", "EDITOR_EXTEND_TAB",
27
27
  "JEditorException", "JEditorExecException", "FullEditorWidget",
28
28
  "JEditorRunOnShellException", "JEditorSaveFileException", "syntax_rule_setting_dict",
29
- "JEditorOpenFileException", "JEditorContentFileException", "syntax_word_setting_dict",
29
+ "JEditorOpenFileException", "JEditorContentFileException", "syntax_extend_setting_dict",
30
30
  "JEditorCantFindLanguageException", "JEditorJsonException", "PythonHighlighter",
31
31
  "user_setting_dict", "user_setting_color_dict", "EditorWidget", "BrowserWidget",
32
32
  "ExecManager", "ShellManager", "traditional_chinese_word_dict", "english_word_dict",
je_editor/__main__.py CHANGED
@@ -2,7 +2,7 @@ if __name__ == "__main__":
2
2
  # argparse
3
3
  import argparse
4
4
 
5
- from je_editor.tkinter_ui.editor_main_ui.tkinter_editor import start_editor
5
+ from je_editor.start_editor import start_editor
6
6
 
7
7
  argparse_event_dict = {
8
8
  "start": start_editor,
@@ -131,7 +131,7 @@ class ExecManager(object):
131
131
  # start tkinter_ui update
132
132
  # start timer
133
133
  self.timer = QTimer(self.main_window)
134
- self.timer.setInterval(1)
134
+ self.timer.setInterval(100)
135
135
  self.timer.timeout.connect(self.pull_text)
136
136
  self.timer.start()
137
137
  except Exception as error:
@@ -14,7 +14,8 @@ from typing import Union, List
14
14
  import jedi
15
15
  from PySide6 import QtGui
16
16
  from PySide6.QtCore import Qt, QRect
17
- from PySide6.QtGui import QPainter, QTextCharFormat, QTextFormat, QKeyEvent, QAction, QTextDocument, QTextCursor
17
+ from PySide6.QtGui import QPainter, QTextCharFormat, QTextFormat, QKeyEvent, QAction, QTextDocument, QTextCursor, \
18
+ QTextOption
18
19
  from PySide6.QtWidgets import QPlainTextEdit, QWidget, QTextEdit, QCompleter
19
20
  from jedi.api.classes import Completion
20
21
 
@@ -43,6 +44,7 @@ class CodeEditor(QPlainTextEdit):
43
44
  self.check_env()
44
45
  # Self main window (parent)
45
46
  self.main_window = main_window
47
+ self.current_file = main_window.current_file
46
48
 
47
49
  self.skip_popup_behavior_list = [
48
50
  Qt.Key.Key_Enter, Qt.Key.Key_Return, Qt.Key.Key_Up, Qt.Key.Key_Down,
@@ -64,9 +66,10 @@ class CodeEditor(QPlainTextEdit):
64
66
  self.setTabStopDistance(
65
67
  QtGui.QFontMetricsF(self.font()).horizontalAdvance(" ")
66
68
  )
67
- self.highlighter = PythonHighlighter(self.document())
69
+ self.highlighter = PythonHighlighter(self.document(), main_window=self)
68
70
  self.highlight_current_line()
69
71
  self.setLineWrapMode(self.LineWrapMode.NoWrap)
72
+ self.setWordWrapMode(QTextOption.WrapMode.WrapAnywhere)
70
73
  # Search Text
71
74
  self.search_action = QAction("Search")
72
75
  self.search_action.setShortcut("Ctrl+f")
@@ -79,6 +82,11 @@ class CodeEditor(QPlainTextEdit):
79
82
  self.completer: Union[None, QCompleter] = None
80
83
  self.set_complete([])
81
84
 
85
+ def reset_highlighter(self):
86
+ jeditor_logger.info("CodeEditor reset_highlighter")
87
+ self.highlighter = PythonHighlighter(self.document(), main_window=self)
88
+ self.highlight_current_line()
89
+
82
90
  def check_env(self):
83
91
  jeditor_logger.info("CodeEditor check_env")
84
92
  path = venv_check()
@@ -112,7 +112,7 @@ class ShellManager(object):
112
112
  self.read_program_error_output_from_thread.start()
113
113
  # start timer
114
114
  self.timer = QTimer(self.main_window)
115
- self.timer.setInterval(1)
115
+ self.timer.setInterval(100)
116
116
  self.timer.timeout.connect(self.pull_text)
117
117
  self.timer.start()
118
118
  except Exception as error:
@@ -1,34 +1,57 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+ from typing import TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from je_editor.pyside_ui.code.plaintext_code_edit.code_edit_plaintext import CodeEditor
8
+
1
9
  from PySide6.QtCore import QRegularExpression
2
10
  from PySide6.QtGui import QSyntaxHighlighter
3
11
  from PySide6.QtGui import QTextCharFormat
4
12
 
5
- from je_editor.pyside_ui.code.syntax.syntax_setting import syntax_word_setting_dict, syntax_rule_setting_dict
13
+ from je_editor.pyside_ui.code.syntax.syntax_setting import syntax_word_setting_dict, syntax_rule_setting_dict, \
14
+ syntax_extend_setting_dict
6
15
  from je_editor.utils.logging.loggin_instance import jeditor_logger
7
16
 
8
17
 
9
18
  class PythonHighlighter(QSyntaxHighlighter):
10
- def __init__(self, parent=None):
19
+ def __init__(self, parent=None, main_window: CodeEditor = None):
11
20
  jeditor_logger.info(f"Init PythonHighlighter parent: {parent}")
12
21
  super().__init__(parent)
13
22
 
14
23
  self.highlight_rules = []
15
-
16
- # Highlight
17
- for rule_variable_dict in syntax_word_setting_dict.values():
18
- color = rule_variable_dict.get("color")
19
- text_char_format = QTextCharFormat()
20
- text_char_format.setForeground(color)
21
- for word in rule_variable_dict.get("words"):
22
- pattern = QRegularExpression(rf"\b{word}\b")
23
- self.highlight_rules.append((pattern, text_char_format))
24
-
25
- for rule_variable_dict in syntax_rule_setting_dict.values():
26
- color = rule_variable_dict.get("color")
27
- text_char_format = QTextCharFormat()
28
- text_char_format.setForeground(color)
29
- for rule in rule_variable_dict.get("rules"):
30
- pattern = QRegularExpression(rule)
31
- self.highlight_rules.append((pattern, text_char_format))
24
+ if main_window.current_file is not None:
25
+ current_file_suffix = Path(main_window.current_file).suffix
26
+ else:
27
+ current_file_suffix = ".py"
28
+ if current_file_suffix == ".py":
29
+ # Highlight
30
+ for rule_variable_dict in syntax_word_setting_dict.values():
31
+ color = rule_variable_dict.get("color")
32
+ text_char_format = QTextCharFormat()
33
+ text_char_format.setForeground(color)
34
+ for word in rule_variable_dict.get("words"):
35
+ pattern = QRegularExpression(rf"\b{word}\b")
36
+ self.highlight_rules.append((pattern, text_char_format))
37
+ for rule_variable_dict in syntax_rule_setting_dict.values():
38
+ color = rule_variable_dict.get("color")
39
+ text_char_format = QTextCharFormat()
40
+ text_char_format.setForeground(color)
41
+ for rule in rule_variable_dict.get("rules"):
42
+ pattern = QRegularExpression(rule)
43
+ self.highlight_rules.append((pattern, text_char_format))
44
+ else:
45
+ if syntax_extend_setting_dict.get(current_file_suffix):
46
+ for rule_variable_dict in syntax_extend_setting_dict.get("current_file_suffix").values():
47
+ color = rule_variable_dict.get("color")
48
+ text_char_format = QTextCharFormat()
49
+ text_char_format.setForeground(color)
50
+ for word in rule_variable_dict.get("words"):
51
+ pattern = QRegularExpression(rf"\b{word}\b")
52
+ self.highlight_rules.append((pattern, text_char_format))
53
+ else:
54
+ pass
32
55
 
33
56
  def highlightBlock(self, text) -> None:
34
57
  jeditor_logger.info(f"PythonHighlighter highlightBlock text: {text}")
@@ -61,5 +61,7 @@ syntax_word_setting_dict: dict = {
61
61
  "words": ("self",),
62
62
  "color": QColor(204, 0, 204)
63
63
  }
64
+ }
64
65
 
66
+ syntax_extend_setting_dict: dict = {
65
67
  }
@@ -108,7 +108,7 @@ class EditorWidget(QWidget):
108
108
  self.grid_layout.addWidget(self.full_splitter)
109
109
  # Check format time
110
110
  self.check_format_timer = QTimer()
111
- self.check_format_timer.setInterval(10)
111
+ self.check_format_timer.setInterval(100)
112
112
  self.check_format_timer.timeout.connect(self.check_file_format)
113
113
  self.check_format_timer.start()
114
114
 
@@ -9,10 +9,8 @@ from PySide6.QtCore import QTimer, QEvent
9
9
  from PySide6.QtGui import QFontDatabase, QIcon, Qt
10
10
  from PySide6.QtWidgets import QMainWindow, QWidget, QTabWidget
11
11
  from frontengine import FrontEngineMainUI
12
- from frontengine import RedirectManager
13
12
  from qt_material import QtStyleTools
14
13
 
15
- from je_editor.utils.logging.loggin_instance import jeditor_logger
16
14
  from je_editor.pyside_ui.browser.browser_widget import BrowserWidget
17
15
  from je_editor.pyside_ui.code.auto_save.auto_save_manager import init_new_auto_save_thread, file_is_open_manager_dict
18
16
  from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
@@ -23,6 +21,7 @@ from je_editor.pyside_ui.main_ui.save_settings.user_setting_file import user_set
23
21
  write_user_setting
24
22
  from je_editor.pyside_ui.main_ui.system_tray.extend_system_tray import ExtendSystemTray
25
23
  from je_editor.utils.file.open.open_file import read_file
24
+ from je_editor.utils.logging.loggin_instance import jeditor_logger
26
25
  from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
27
26
  from je_editor.utils.redirect_manager.redirect_manager_class import redirect_manager_instance
28
27
 
@@ -80,7 +79,7 @@ class EditorMain(QMainWindow, QtStyleTools):
80
79
  self.tab_widget.tabCloseRequested.connect(self.close_tab)
81
80
  # Timer to redirect error or message
82
81
  self.redirect_timer = QTimer(self)
83
- self.redirect_timer.setInterval(1)
82
+ self.redirect_timer.setInterval(100)
84
83
  self.redirect_timer.start()
85
84
  self.setWindowTitle(language_wrapper.language_word_dict.get("application_name"))
86
85
  self.setToolTip(language_wrapper.language_word_dict.get("application_name"))
@@ -101,7 +100,7 @@ class EditorMain(QMainWindow, QtStyleTools):
101
100
  redirect_manager_instance.set_redirect()
102
101
  # Timer to redirect error or message
103
102
  self.redirect_timer = QTimer(self)
104
- self.redirect_timer.setInterval(1)
103
+ self.redirect_timer.setInterval(100)
105
104
  self.redirect_timer.timeout.connect(self.redirect)
106
105
  self.redirect_timer.start()
107
106
  # TAB Add
@@ -181,6 +180,8 @@ class EditorMain(QMainWindow, QtStyleTools):
181
180
  if last_file_path.is_file() and last_file_path.exists() and widget.code_save_thread is None:
182
181
  init_new_auto_save_thread(str(last_file_path), widget)
183
182
  widget.code_edit.setPlainText(read_file(widget.current_file)[1])
183
+ widget.code_edit.current_file = widget.current_file
184
+ widget.code_edit.reset_highlighter()
184
185
  file_is_open_manager_dict.update({str(last_file_path): str(last_file_path.name)})
185
186
  widget.rename_self_tab()
186
187
 
@@ -52,8 +52,9 @@ class RedirectManager(object):
52
52
  sys.stderr = redirect_err
53
53
  default_logger = logging.getLogger("RedirectManager")
54
54
  default_logger.addHandler(redirect_err)
55
+ skip_logger_list = ["JEditor", "FrontEngine", "AutomationIDE"]
55
56
  for name in logging.root.manager.loggerDict.keys():
56
- if name == "JEditor":
57
+ if name in skip_logger_list:
57
58
  continue
58
59
  else:
59
60
  logging.getLogger(name).addHandler(redirect_err)
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: je_editor
3
- Version: 0.0.186
3
+ Version: 0.0.188
4
4
  Summary: JEditor is basic but powerful editor include GPT
5
5
  Author-email: JE-Chen <jechenmailman@gmail.com>
6
6
  License: MIT
@@ -1,5 +1,5 @@
1
- je_editor/__init__.py,sha256=HEF6txDvxMvUCZJL86ukqqHBZjDe84V2fNZ38qABGy8,2401
2
- je_editor/__main__.py,sha256=tv19PbVG_8bg4HhRWINNYL_Zu6VtkJR00U_0v56GsK8,598
1
+ je_editor/__init__.py,sha256=IZm-mUID0W7-smb9SYEtwcWrpr8mz6OyF4e5akHGrFU,2405
2
+ je_editor/__main__.py,sha256=2ymm4ESRcqP4K1YQyeaDbGhuK-0C1IausIiEOpbm6Ds,570
3
3
  je_editor/start_editor.py,sha256=hW7JFOjBkcW7hdC7q-9JsaVTeSNCep1GsqxLmbMU4wg,543
4
4
  je_editor/pyside_ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  je_editor/pyside_ui/browser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -15,14 +15,14 @@ je_editor/pyside_ui/code/auto_save/auto_save_thread.py,sha256=Ls2jvz3H8Os5LgPhWB
15
15
  je_editor/pyside_ui/code/code_format/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  je_editor/pyside_ui/code/code_format/pep8_format.py,sha256=zrCkUdz2SG4bnMSkXfccvpHAmUOxXLedSBxL_nkdaoE,3574
17
17
  je_editor/pyside_ui/code/code_process/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- je_editor/pyside_ui/code/code_process/code_exec.py,sha256=p_Qs0ROAc2qzaqJgz5yPB6mSfnCnHl5R69cYrzmyZ78,9839
18
+ je_editor/pyside_ui/code/code_process/code_exec.py,sha256=v1f1KCLgk-fy7yESgNB1yu_yjoOutoDFpTMPFp8RcDw,9841
19
19
  je_editor/pyside_ui/code/plaintext_code_edit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
- je_editor/pyside_ui/code/plaintext_code_edit/code_edit_plaintext.py,sha256=uiJ115eeRZ2hOdtTwA2I6DY7Ww3UauoHzAgGJ747f_8,13875
20
+ je_editor/pyside_ui/code/plaintext_code_edit/code_edit_plaintext.py,sha256=lcwmBemFenH-uDGe6fo70MS47emzPFgy9XL7cipwryY,14249
21
21
  je_editor/pyside_ui/code/shell_process/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- je_editor/pyside_ui/code/shell_process/shell_exec.py,sha256=JpEpq1rXdEAtPyjOmUT7Ib_-fRnWl-c6h46gExau-po,8729
22
+ je_editor/pyside_ui/code/shell_process/shell_exec.py,sha256=GtQxkmAsz8vt1ZW_EEhZNyXZ56qrNBfiMDicNVrXzgI,8731
23
23
  je_editor/pyside_ui/code/syntax/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- je_editor/pyside_ui/code/syntax/python_syntax.py,sha256=Go-AjzbQbocYdYvtlT4vXx3sbd8zJtqdP1FObc2dgLQ,1831
25
- je_editor/pyside_ui/code/syntax/syntax_setting.py,sha256=5mx0bnCJBvdAH6LixV_k6KoQyEdnTnC5sV3ieq06XBw,2243
24
+ je_editor/pyside_ui/code/syntax/python_syntax.py,sha256=FH3YI_aixnkjId98YPGM5QMhU0_AimWaFuKpoFBG0yA,3017
25
+ je_editor/pyside_ui/code/syntax/syntax_setting.py,sha256=oaLRF_83Oa6bcAorf7AlZG0Mrt4FmsK7b4aA-LS_bRo,2284
26
26
  je_editor/pyside_ui/code/textedit_code_result/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  je_editor/pyside_ui/code/textedit_code_result/code_record.py,sha256=pT-CmcADEaXLZ0ih6D6rpe1XywgszrEpcJxtJYgopJE,2162
28
28
  je_editor/pyside_ui/dialog/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -34,11 +34,11 @@ je_editor/pyside_ui/dialog/search_ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
34
34
  je_editor/pyside_ui/dialog/search_ui/search_error_box.py,sha256=GzMXMnIL1k8ZwG3A2a_oMgiUiXXqd7HKW45YlVlL_eo,1168
35
35
  je_editor/pyside_ui/dialog/search_ui/search_text_box.py,sha256=H2MbC-RGpKg9TzjV4MZj7Bw7qs9a9E4cjA4GI5zsv4U,1154
36
36
  je_editor/pyside_ui/main_ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- je_editor/pyside_ui/main_ui/main_editor.py,sha256=SIqi7krbejbHix8fAe4VGJo_snzZqDEjd-tNRcQw7Sg,10962
37
+ je_editor/pyside_ui/main_ui/main_editor.py,sha256=LikWZ1HygZp20--pisV3Wc0NhaEOSJ9s8J8XPPhB4mQ,11064
38
38
  je_editor/pyside_ui/main_ui/dock/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
39
  je_editor/pyside_ui/main_ui/dock/destroy_dock.py,sha256=MTN45BykNm6FA4gMW7gI4Kr9orTdcxVTm7mch3DUhaw,604
40
40
  je_editor/pyside_ui/main_ui/editor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- je_editor/pyside_ui/main_ui/editor/editor_widget.py,sha256=YkPge55yGnMJjughkjVEbUz209gcEqhbKlUam9TC2wQ,9876
41
+ je_editor/pyside_ui/main_ui/editor/editor_widget.py,sha256=yg1LhMIE_HAFg2YiKon3XG1IYPFUlh5O2-x8Jesc3U4,9877
42
42
  je_editor/pyside_ui/main_ui/editor/editor_widget_dock.py,sha256=6oDf0pKx0sThlk_Qz0gduPIpasPqib6OYnMnQ4FRXFo,1930
43
43
  je_editor/pyside_ui/main_ui/editor/process_input.py,sha256=zj29E3He5_PD23HnIaDQ1vn3LWRECXTf8P7MWsX73k0,3401
44
44
  je_editor/pyside_ui/main_ui/ipython_widget/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -98,11 +98,11 @@ je_editor/utils/multi_language/english.py,sha256=Wbku1oGVoxDRpUb3JKy1Qlj8BByDNB6
98
98
  je_editor/utils/multi_language/multi_language_wrapper.py,sha256=_MtYrE51poQ1p_iWvT2eg_604uj6IsiBgGpifWpYLGc,1050
99
99
  je_editor/utils/multi_language/traditional_chinese.py,sha256=tWs9_yhuNoehpYFCv37a6eVYphkzN9Jb_9Pbj267Mcc,5812
100
100
  je_editor/utils/redirect_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
- je_editor/utils/redirect_manager/redirect_manager_class.py,sha256=lQfhfpHbhhFGMRETLCPsf9TSqFRwoarelRMR1Rz2wtk,2095
101
+ je_editor/utils/redirect_manager/redirect_manager_class.py,sha256=RsLRbhBy_YyiwTN5g0YkoobI-BvSdZgX0Ot53nrHm7g,2174
102
102
  je_editor/utils/venv_check/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
103
  je_editor/utils/venv_check/check_venv.py,sha256=oCrMdue4NYUUGrVifh_iHFwIgxVx9azYN4jz3Xiulgg,999
104
- je_editor-0.0.186.dist-info/LICENSE,sha256=KMhUHh6pnIUvmXDW-49L_Sz63bqkOlPDqsecaqKiitU,1091
105
- je_editor-0.0.186.dist-info/METADATA,sha256=vswKw1PvKm_lGoH1xiBMNnI8nK8EHewCg5CGm8tfmz4,3338
106
- je_editor-0.0.186.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
107
- je_editor-0.0.186.dist-info/top_level.txt,sha256=_9YA7BgxpkmdLs-5V_UQILxClcMRgPyG1a3qaE-Bkcs,10
108
- je_editor-0.0.186.dist-info/RECORD,,
104
+ je_editor-0.0.188.dist-info/LICENSE,sha256=KMhUHh6pnIUvmXDW-49L_Sz63bqkOlPDqsecaqKiitU,1091
105
+ je_editor-0.0.188.dist-info/METADATA,sha256=T7oslnNMInAqkp4n7gMcfsx8ssJ0a4JYNs_ABQahy_0,3338
106
+ je_editor-0.0.188.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
107
+ je_editor-0.0.188.dist-info/top_level.txt,sha256=_9YA7BgxpkmdLs-5V_UQILxClcMRgPyG1a3qaE-Bkcs,10
108
+ je_editor-0.0.188.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5