pyqt-code-editor 0.0.37__tar.gz → 0.0.39__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 (79) hide show
  1. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/PKG-INFO +1 -1
  2. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/__init__.py +1 -1
  3. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/_settings.py +13 -1
  4. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/components/find_in_files.py +0 -4
  5. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/components/project_explorer.py +20 -6
  6. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/base.py +3 -0
  7. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/worker/manager.py +25 -1
  8. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/worker/providers/ruff.py +0 -1
  9. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/COPYING +0 -0
  10. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyproject.toml +0 -0
  11. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/app.py +0 -0
  12. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/code_editors/__init__.py +0 -0
  13. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/code_editors/code_editors.py +0 -0
  14. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/code_editors/languages/__init__.py +0 -0
  15. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/code_editors/languages/generic.py +0 -0
  16. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/code_editors/languages/markdown.py +0 -0
  17. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/code_editors/languages/python.py +0 -0
  18. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/code_editors/languages/text.py +0 -0
  19. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/components/__init__.py +0 -0
  20. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/components/editor_panel.py +0 -0
  21. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/components/jupyter_console.py +0 -0
  22. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/components/settings_panel.py +0 -0
  23. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/components/sigmund.py +0 -0
  24. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/components/workspace_explorer.py +0 -0
  25. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/environment_manager.py +0 -0
  26. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/__init__.py +0 -0
  27. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/auto_indent.py +0 -0
  28. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/auto_pair.py +0 -0
  29. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/check.py +0 -0
  30. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/comment.py +0 -0
  31. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/complete.py +0 -0
  32. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/execute.py +0 -0
  33. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/file_link.py +0 -0
  34. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/line_number.py +0 -0
  35. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/python_auto_indent.py +0 -0
  36. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/search_replace.py +0 -0
  37. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/shortcuts.py +0 -0
  38. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/smart_backspace_delete.py +0 -0
  39. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/symbols.py +0 -0
  40. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/theme.py +0 -0
  41. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/widgets/__init__.py +0 -0
  42. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/mixins/zoom.py +0 -0
  43. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/sigmund-analyst.png +0 -0
  44. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/signal_router.py +0 -0
  45. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/syntax_highlighters/__init__.py +0 -0
  46. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/syntax_highlighters/languages/__init__.py +0 -0
  47. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/syntax_highlighters/languages/generic.py +0 -0
  48. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/syntax_highlighters/languages/python.py +0 -0
  49. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/syntax_highlighters/syntax_highlighter.py +0 -0
  50. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/themes.py +0 -0
  51. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/utils/__init__.py +0 -0
  52. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/utils/languages/__init__.py +0 -0
  53. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/utils/languages/python/__init__.py +0 -0
  54. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/utils/languages/python/_auto_indent.py +0 -0
  55. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/utils/languages/python/_extract_cells.py +0 -0
  56. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/utils/languages/python/_mask_str_in_code.py +0 -0
  57. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/watchdog.py +0 -0
  58. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/widgets/__init__.py +0 -0
  59. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/widgets/calltip_widget.py +0 -0
  60. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/widgets/completion_popup.py +0 -0
  61. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/widgets/dock.py +0 -0
  62. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/widgets/quick_open_dialog.py +0 -0
  63. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/widgets/quick_open_file_dialog.py +0 -0
  64. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/widgets/quick_symbol_dialog.py +0 -0
  65. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/widgets/search_replace_frame.py +0 -0
  66. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/widgets/tab_splitter.py +0 -0
  67. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/widgets/tabbed_editor.py +0 -0
  68. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/worker/__init__.py +0 -0
  69. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/worker/languages/__init__.py +0 -0
  70. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/worker/languages/generic.py +0 -0
  71. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/worker/languages/python.py +0 -0
  72. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/worker/process.py +0 -0
  73. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/worker/providers/__init__.py +0 -0
  74. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/worker/providers/codestral.py +0 -0
  75. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/worker/providers/jedi.py +0 -0
  76. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/worker/providers/sigmund.py +0 -0
  77. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/worker/providers/symbol.py +0 -0
  78. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/pyqt_code_editor/worker/settings.py +0 -0
  79. {pyqt_code_editor-0.0.37 → pyqt_code_editor-0.0.39}/readme.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyqt_code_editor
3
- Version: 0.0.37
3
+ Version: 0.0.39
4
4
  Summary: Fully featured code-editor widgets for PyQt
5
5
  Keywords: code editor,pyqt,ide
6
6
  Author-email: Sebastiaan Mathôt <s.mathot@cogsci.nl>
@@ -2,4 +2,4 @@
2
2
 
3
3
  from ._settings import settings
4
4
 
5
- __version__ = '0.0.37'
5
+ __version__ = '0.0.39'
@@ -228,11 +228,23 @@ class Settings(QObject):
228
228
  if self.font_family != 'default':
229
229
  return
230
230
  from .utils import get_first_available_font
231
+
231
232
  self.font_family = get_first_available_font(
232
233
  ['Ubuntu Mono', 'Liberation Mono', 'DejaVu Sans Mono', 'Courier New',
233
234
  'monospace'])
235
+
236
+ # Fallback if no font was found
237
+ if self.font_family is None:
238
+ import platform
239
+ system = platform.system()
240
+ if system == 'Windows':
241
+ self.font_family = 'Consolas' # Available on Windows Vista+
242
+ elif system == 'Darwin': # macOS
243
+ self.font_family = 'Menlo' # Default monospace on macOS
244
+ else: # Linux and other Unix-like systems
245
+ self.font_family = 'monospace' # Generic monospace fallback
246
+
234
247
  logger.info(f'setting font family to {self.font_family}')
235
248
 
236
-
237
249
  # Create the singleton instance
238
250
  settings = Settings()
@@ -269,10 +269,6 @@ class FindInFiles(QDockWidget):
269
269
  self._open_file(path, line_no)
270
270
 
271
271
  def _open_file(self, path, line_no=0):
272
- """
273
- Dummy method: In production, integrate with your editor logic.
274
- """
275
- print(f"Opening file: {path}, line {line_no}")
276
272
  self.open_file_requested.emit(path, line_no)
277
273
 
278
274
  def closeEvent(self, event):
@@ -212,12 +212,26 @@ class ProjectExplorer(QDockWidget):
212
212
  self._setup_shortcuts()
213
213
 
214
214
  def _setup_shortcuts(self):
215
- """Set up global keyboard shortcuts for common actions."""
216
- QShortcut(QKeySequence("F2"), self, activated=lambda: self._handle_rename_shortcut())
217
- QShortcut(QKeySequence.Delete, self, activated=lambda: self._handle_delete_shortcut())
218
- QShortcut(QKeySequence.Cut, self, activated=lambda: self._handle_cut_shortcut())
219
- QShortcut(QKeySequence.Copy, self, activated=lambda: self._handle_copy_shortcut())
220
- QShortcut(QKeySequence.Paste, self, activated=lambda: self._handle_paste_shortcut())
215
+ """Set up keyboard shortcuts for common actions."""
216
+ shortcut_f2 = QShortcut(QKeySequence("F2"), self)
217
+ shortcut_f2.setContext(Qt.WidgetWithChildrenShortcut)
218
+ shortcut_f2.activated.connect(lambda: self._handle_rename_shortcut())
219
+
220
+ shortcut_delete = QShortcut(QKeySequence.Delete, self)
221
+ shortcut_delete.setContext(Qt.WidgetWithChildrenShortcut)
222
+ shortcut_delete.activated.connect(lambda: self._handle_delete_shortcut())
223
+
224
+ shortcut_cut = QShortcut(QKeySequence.Cut, self)
225
+ shortcut_cut.setContext(Qt.WidgetWithChildrenShortcut)
226
+ shortcut_cut.activated.connect(lambda: self._handle_cut_shortcut())
227
+
228
+ shortcut_copy = QShortcut(QKeySequence.Copy, self)
229
+ shortcut_copy.setContext(Qt.WidgetWithChildrenShortcut)
230
+ shortcut_copy.activated.connect(lambda: self._handle_copy_shortcut())
231
+
232
+ shortcut_paste = QShortcut(QKeySequence.Paste, self)
233
+ shortcut_paste.setContext(Qt.WidgetWithChildrenShortcut)
234
+ shortcut_paste.activated.connect(lambda: self._handle_paste_shortcut())
221
235
 
222
236
  def _handle_rename_shortcut(self):
223
237
  """Handle F2 shortcut for rename."""
@@ -74,6 +74,9 @@ class Base:
74
74
  so we can handle multiple concurrent requests.
75
75
  """
76
76
  result_queue, pid = manager.send_worker_request(**data)
77
+ if result_queue is None:
78
+ logger.info('Request ignored')
79
+ return
77
80
  self._active_requests[pid] = result_queue
78
81
  logger.info(f"Sent request to worker {pid}, now tracking {len(self._active_requests)} active requests.")
79
82
 
@@ -7,6 +7,7 @@ logger = logging.getLogger(__name__)
7
7
  STOP_UNUSED_INTERVAL = 10
8
8
  _last_stop_unused_time = 0
9
9
  _workers = {} # pid -> {"process", "request_queue", "result_queue", "is_free"}
10
+ suspended = False
10
11
 
11
12
 
12
13
  def send_worker_request(**data) -> (Queue, int):
@@ -16,7 +17,11 @@ def send_worker_request(**data) -> (Queue, int):
16
17
 
17
18
  The caller can poll the result_queue for responses, and once done,
18
19
  call mark_worker_as_free(pid) to release this worker for future use.
20
+
21
+ If workers are suspended, return (None, None).
19
22
  """
23
+ if suspended:
24
+ return None, None
20
25
  # 1. Look for an existing free worker
21
26
  for pid, w in list(_workers.items()):
22
27
  if w["is_free"] and w["process"].is_alive():
@@ -100,7 +105,7 @@ def stop_all_workers():
100
105
  """
101
106
  Cleanly shut down all worker processes.
102
107
  """
103
- logger.info("Stopping all worker processes...")
108
+ logger.info(f"Stopping {len(_workers)} worker processes...")
104
109
  for pid, w in list(_workers.items()):
105
110
  if w["process"].is_alive():
106
111
  logger.info(f"Stopping worker {pid}.")
@@ -116,4 +121,23 @@ def update_setting(name, value):
116
121
  for pid, w in _workers.items():
117
122
  if w["process"].is_alive():
118
123
  w["request_queue"].put(settings_action)
124
+
125
+
126
+ def suspend():
127
+ """Stops all worker processes and ignores all requests until resume() is
128
+ called.
129
+ """
130
+ global suspended
131
+ suspended = True
132
+ logger.info("Suspending worker processes...")
133
+ stop_all_workers()
134
+
135
+
136
+ def resume():
137
+ """Resumes accepting requests."""
138
+ global suspended
139
+ suspended = False
140
+ logger.info("Resuming worker processes...")
141
+
142
+
119
143
  settings.setting_changed.connect(update_setting)
@@ -24,7 +24,6 @@ def ruff_check(code: str, prefix: str | None = None) -> list[dict]:
24
24
  with tempfile.NamedTemporaryFile(delete=False, suffix=".py", mode="w") as tmp_file:
25
25
  tmp_file.write(code)
26
26
  tmp_file_path = tmp_file.name
27
- print(tmp_file.name)
28
27
  cmd = ["ruff", "check", tmp_file_path, "--output-format", "json"]
29
28
 
30
29
  # Set creation flags for Windows to prevent console window from appearing