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.
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/PKG-INFO +1 -1
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/__init__.py +1 -1
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/base.py +4 -2
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/manager.py +8 -2
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/process.py +5 -1
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/COPYING +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyproject.toml +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/_settings.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/app.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/code_editors.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/languages/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/languages/generic.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/languages/markdown.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/languages/python.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/languages/text.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/editor_panel.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/find_in_files.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/jupyter_console.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/project_explorer.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/settings_panel.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/sigmund.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/workspace_explorer.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/environment_manager.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/auto_indent.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/auto_pair.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/check.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/comment.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/complete.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/execute.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/file_link.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/line_number.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/python_auto_indent.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/search_replace.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/shortcuts.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/smart_backspace_delete.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/symbols.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/theme.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/widgets/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/zoom.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/sigmund-analyst.png +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/signal_router.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/syntax_highlighters/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/syntax_highlighters/languages/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/syntax_highlighters/languages/generic.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/syntax_highlighters/languages/python.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/syntax_highlighters/syntax_highlighter.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/themes.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/utils/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/utils/languages/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/utils/languages/python/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/utils/languages/python/_auto_indent.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/utils/languages/python/_extract_cells.py +0 -0
- {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
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/watchdog.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/calltip_widget.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/completion_popup.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/dock.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/quick_open_dialog.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/quick_open_file_dialog.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/quick_symbol_dialog.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/search_replace_frame.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/tab_splitter.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/tabbed_editor.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/languages/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/languages/generic.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/languages/python.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/__init__.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/codestral.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/jedi.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/ruff.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/sigmund.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/symbol.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/settings.py +0 -0
- {pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/readme.md +0 -0
|
@@ -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
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/__init__.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/code_editors.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/code_editors/languages/text.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/editor_panel.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/find_in_files.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/jupyter_console.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/project_explorer.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/components/settings_panel.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/python_auto_indent.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/search_replace.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/mixins/widgets/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/syntax_highlighters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/utils/languages/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/calltip_widget.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/completion_popup.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/quick_open_dialog.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/quick_symbol_dialog.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/search_replace_frame.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/tab_splitter.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/widgets/tabbed_editor.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/languages/__init__.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/languages/generic.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/languages/python.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/__init__.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/codestral.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/jedi.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/ruff.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/sigmund.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.27 → pyqt_code_editor-0.0.28}/pyqt_code_editor/worker/providers/symbol.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|