pyqt-code-editor 0.0.27__tar.gz → 0.0.28__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.27 → pyqt_code_editor-0.0.28}/PKG-INFO +1 -1
  2. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/__init__.py +1 -1
  3. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/base.py +4 -2
  4. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/manager.py +8 -2
  5. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/process.py +5 -1
  6. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/COPYING +0 -0
  7. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyproject.toml +0 -0
  8. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/_settings.py +0 -0
  9. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/app.py +0 -0
  10. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/__init__.py +0 -0
  11. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/code_editors.py +0 -0
  12. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/languages/__init__.py +0 -0
  13. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/languages/generic.py +0 -0
  14. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/languages/markdown.py +0 -0
  15. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/languages/python.py +0 -0
  16. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/languages/text.py +0 -0
  17. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/__init__.py +0 -0
  18. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/editor_panel.py +0 -0
  19. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/find_in_files.py +0 -0
  20. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/jupyter_console.py +0 -0
  21. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/project_explorer.py +0 -0
  22. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/settings_panel.py +0 -0
  23. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/sigmund.py +0 -0
  24. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/workspace_explorer.py +0 -0
  25. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/environment_manager.py +0 -0
  26. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/__init__.py +0 -0
  27. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/auto_indent.py +0 -0
  28. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/auto_pair.py +0 -0
  29. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/check.py +0 -0
  30. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/comment.py +0 -0
  31. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/complete.py +0 -0
  32. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/execute.py +0 -0
  33. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/file_link.py +0 -0
  34. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/line_number.py +0 -0
  35. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/python_auto_indent.py +0 -0
  36. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/search_replace.py +0 -0
  37. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/shortcuts.py +0 -0
  38. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/smart_backspace_delete.py +0 -0
  39. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/symbols.py +0 -0
  40. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/theme.py +0 -0
  41. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/widgets/__init__.py +0 -0
  42. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/zoom.py +0 -0
  43. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/sigmund-analyst.png +0 -0
  44. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/signal_router.py +0 -0
  45. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/syntax_highlighters/__init__.py +0 -0
  46. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/syntax_highlighters/languages/__init__.py +0 -0
  47. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/syntax_highlighters/languages/generic.py +0 -0
  48. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/syntax_highlighters/languages/python.py +0 -0
  49. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/syntax_highlighters/syntax_highlighter.py +0 -0
  50. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/themes.py +0 -0
  51. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/utils/__init__.py +0 -0
  52. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/utils/languages/__init__.py +0 -0
  53. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/utils/languages/python/__init__.py +0 -0
  54. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/utils/languages/python/_auto_indent.py +0 -0
  55. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/utils/languages/python/_extract_cells.py +0 -0
  56. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/utils/languages/python/_mask_str_in_code.py +0 -0
  57. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/watchdog.py +0 -0
  58. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/__init__.py +0 -0
  59. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/calltip_widget.py +0 -0
  60. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/completion_popup.py +0 -0
  61. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/dock.py +0 -0
  62. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/quick_open_dialog.py +0 -0
  63. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/quick_open_file_dialog.py +0 -0
  64. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/quick_symbol_dialog.py +0 -0
  65. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/search_replace_frame.py +0 -0
  66. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/tab_splitter.py +0 -0
  67. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/tabbed_editor.py +0 -0
  68. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/__init__.py +0 -0
  69. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/languages/__init__.py +0 -0
  70. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/languages/generic.py +0 -0
  71. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/languages/python.py +0 -0
  72. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/__init__.py +0 -0
  73. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/codestral.py +0 -0
  74. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/jedi.py +0 -0
  75. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/ruff.py +0 -0
  76. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/sigmund.py +0 -0
  77. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/symbol.py +0 -0
  78. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/settings.py +0 -0
  79. {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/readme.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyqt_code_editor
3
- Version: 0.0.27
3
+ Version: 0.0.28
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.27'
5
+ __version__ = '0.0.28'
@@ -125,9 +125,11 @@ class Base:
125
125
  # 6) We're done with this particular request
126
126
  to_remove.append(pid)
127
127
 
128
- # Cleanup: remove completed or dead requests
128
+ # Cleanup: remove completed or dead requests. Also stop unused workers.
129
+ # This function periodically prunes worker processes if they are unused.
129
130
  for pid in to_remove:
130
- self._active_requests.pop(pid, None)
131
+ self._active_requests.pop(pid, None)
132
+ manager.stop_unused_workers()
131
133
 
132
134
  def set_modified(self, modified):
133
135
  logger.info(f'modified: {modified}')
@@ -1,9 +1,11 @@
1
1
  import logging
2
+ import time
2
3
  from multiprocessing import Process, Queue
3
4
  from .process import main_worker_process_function
4
5
  from .. import watchdog, settings
5
6
  logger = logging.getLogger(__name__)
6
-
7
+ STOP_UNUSED_INTERVAL = 10
8
+ _last_stop_unused_time = 0
7
9
  _workers = {} # pid -> {"process", "request_queue", "result_queue", "is_free"}
8
10
 
9
11
 
@@ -63,11 +65,15 @@ def check_worker_alive(pid: int) -> bool:
63
65
  w = _workers.get(pid)
64
66
  return w and w["process"].is_alive()
65
67
 
66
- def stop_unused_workers(max_free: int = 1):
68
+ def stop_unused_workers(max_free: int = 1, force: bool = False):
67
69
  """
68
70
  Stop free worker processes until there is at most 'max_free' free processes left.
69
71
  This keeps us from accumulating too many idle worker processes.
70
72
  """
73
+ global _last_stop_unused_time
74
+ if force or time.time() - _last_stop_unused_time < STOP_UNUSED_INTERVAL:
75
+ return
76
+ _last_stop_unused_time = time.time()
71
77
  # Gather a list of free worker PIDs
72
78
  free_pids = [pid for pid, w in _workers.items() if w["is_free"] and w["process"].is_alive()]
73
79
  logger.info(f"stop_unused_workers called: max_free={max_free}, found {len(free_pids)} free workers")
@@ -1,6 +1,7 @@
1
1
  import logging
2
2
  import importlib
3
3
  from . import settings
4
+ import queue
4
5
  logger = logging.getLogger(__name__)
5
6
  worker_functions_cache = {}
6
7
 
@@ -17,7 +18,10 @@ def main_worker_process_function(request_queue, result_queue):
17
18
  """
18
19
  logger.info("Started completion worker.")
19
20
  while True:
20
- request = request_queue.get()
21
+ try:
22
+ request = request_queue.get(True, 5)
23
+ except queue.Empty:
24
+ continue
21
25
  if request is None:
22
26
  logger.info("Received None request (possibly legacy or invalid). Skipping.")
23
27
  continue