pomera-ai-commander 1.1.1 → 1.2.2
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.
- package/LICENSE +21 -21
- package/README.md +105 -680
- package/bin/pomera-ai-commander.js +62 -62
- package/core/__init__.py +65 -65
- package/core/app_context.py +482 -482
- package/core/async_text_processor.py +421 -421
- package/core/backup_manager.py +655 -655
- package/core/backup_recovery_manager.py +1199 -1033
- package/core/content_hash_cache.py +508 -508
- package/core/context_menu.py +313 -313
- package/core/data_directory.py +549 -0
- package/core/data_validator.py +1066 -1066
- package/core/database_connection_manager.py +744 -744
- package/core/database_curl_settings_manager.py +608 -608
- package/core/database_promera_ai_settings_manager.py +446 -446
- package/core/database_schema.py +411 -411
- package/core/database_schema_manager.py +395 -395
- package/core/database_settings_manager.py +1507 -1507
- package/core/database_settings_manager_interface.py +456 -456
- package/core/dialog_manager.py +734 -734
- package/core/diff_utils.py +239 -0
- package/core/efficient_line_numbers.py +540 -510
- package/core/error_handler.py +746 -746
- package/core/error_service.py +431 -431
- package/core/event_consolidator.py +511 -511
- package/core/mcp/__init__.py +43 -43
- package/core/mcp/find_replace_diff.py +334 -0
- package/core/mcp/protocol.py +288 -288
- package/core/mcp/schema.py +251 -251
- package/core/mcp/server_stdio.py +299 -299
- package/core/mcp/tool_registry.py +2699 -2345
- package/core/memento.py +275 -0
- package/core/memory_efficient_text_widget.py +711 -711
- package/core/migration_manager.py +914 -914
- package/core/migration_test_suite.py +1085 -1085
- package/core/migration_validator.py +1143 -1143
- package/core/optimized_find_replace.py +714 -714
- package/core/optimized_pattern_engine.py +424 -424
- package/core/optimized_search_highlighter.py +552 -552
- package/core/performance_monitor.py +674 -674
- package/core/persistence_manager.py +712 -712
- package/core/progressive_stats_calculator.py +632 -632
- package/core/regex_pattern_cache.py +529 -529
- package/core/regex_pattern_library.py +350 -350
- package/core/search_operation_manager.py +434 -434
- package/core/settings_defaults_registry.py +1087 -1087
- package/core/settings_integrity_validator.py +1111 -1111
- package/core/settings_serializer.py +557 -557
- package/core/settings_validator.py +1823 -1823
- package/core/smart_stats_calculator.py +709 -709
- package/core/statistics_update_manager.py +619 -619
- package/core/stats_config_manager.py +858 -858
- package/core/streaming_text_handler.py +723 -723
- package/core/task_scheduler.py +596 -596
- package/core/update_pattern_library.py +168 -168
- package/core/visibility_monitor.py +596 -596
- package/core/widget_cache.py +498 -498
- package/mcp.json +51 -61
- package/migrate_data.py +127 -0
- package/package.json +64 -57
- package/pomera.py +7883 -7482
- package/pomera_mcp_server.py +183 -144
- package/requirements.txt +33 -0
- package/scripts/Dockerfile.alpine +43 -0
- package/scripts/Dockerfile.gui-test +54 -0
- package/scripts/Dockerfile.linux +43 -0
- package/scripts/Dockerfile.test-linux +80 -0
- package/scripts/Dockerfile.ubuntu +39 -0
- package/scripts/README.md +53 -0
- package/scripts/build-all.bat +113 -0
- package/scripts/build-docker.bat +53 -0
- package/scripts/build-docker.sh +55 -0
- package/scripts/build-optimized.bat +101 -0
- package/scripts/build.sh +78 -0
- package/scripts/docker-compose.test.yml +27 -0
- package/scripts/docker-compose.yml +32 -0
- package/scripts/postinstall.js +62 -0
- package/scripts/requirements-minimal.txt +33 -0
- package/scripts/test-linux-simple.bat +28 -0
- package/scripts/validate-release-workflow.py +450 -0
- package/tools/__init__.py +4 -4
- package/tools/ai_tools.py +2891 -2891
- package/tools/ascii_art_generator.py +352 -352
- package/tools/base64_tools.py +183 -183
- package/tools/base_tool.py +511 -511
- package/tools/case_tool.py +308 -308
- package/tools/column_tools.py +395 -395
- package/tools/cron_tool.py +884 -884
- package/tools/curl_history.py +600 -600
- package/tools/curl_processor.py +1207 -1207
- package/tools/curl_settings.py +502 -502
- package/tools/curl_tool.py +5467 -5467
- package/tools/diff_viewer.py +1817 -1072
- package/tools/email_extraction_tool.py +248 -248
- package/tools/email_header_analyzer.py +425 -425
- package/tools/extraction_tools.py +250 -250
- package/tools/find_replace.py +2289 -1750
- package/tools/folder_file_reporter.py +1463 -1463
- package/tools/folder_file_reporter_adapter.py +480 -480
- package/tools/generator_tools.py +1216 -1216
- package/tools/hash_generator.py +255 -255
- package/tools/html_tool.py +656 -656
- package/tools/jsonxml_tool.py +729 -729
- package/tools/line_tools.py +419 -419
- package/tools/markdown_tools.py +561 -561
- package/tools/mcp_widget.py +1417 -1417
- package/tools/notes_widget.py +978 -973
- package/tools/number_base_converter.py +372 -372
- package/tools/regex_extractor.py +571 -571
- package/tools/slug_generator.py +310 -310
- package/tools/sorter_tools.py +458 -458
- package/tools/string_escape_tool.py +392 -392
- package/tools/text_statistics_tool.py +365 -365
- package/tools/text_wrapper.py +430 -430
- package/tools/timestamp_converter.py +421 -421
- package/tools/tool_loader.py +710 -710
- package/tools/translator_tools.py +522 -522
- package/tools/url_link_extractor.py +261 -261
- package/tools/url_parser.py +204 -204
- package/tools/whitespace_tools.py +355 -355
- package/tools/word_frequency_counter.py +146 -146
- package/core/__pycache__/__init__.cpython-313.pyc +0 -0
- package/core/__pycache__/app_context.cpython-313.pyc +0 -0
- package/core/__pycache__/async_text_processor.cpython-313.pyc +0 -0
- package/core/__pycache__/backup_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/backup_recovery_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/content_hash_cache.cpython-313.pyc +0 -0
- package/core/__pycache__/context_menu.cpython-313.pyc +0 -0
- package/core/__pycache__/data_validator.cpython-313.pyc +0 -0
- package/core/__pycache__/database_connection_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_curl_settings_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_promera_ai_settings_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_schema.cpython-313.pyc +0 -0
- package/core/__pycache__/database_schema_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_settings_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_settings_manager_interface.cpython-313.pyc +0 -0
- package/core/__pycache__/dialog_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/efficient_line_numbers.cpython-313.pyc +0 -0
- package/core/__pycache__/error_handler.cpython-313.pyc +0 -0
- package/core/__pycache__/error_service.cpython-313.pyc +0 -0
- package/core/__pycache__/event_consolidator.cpython-313.pyc +0 -0
- package/core/__pycache__/memory_efficient_text_widget.cpython-313.pyc +0 -0
- package/core/__pycache__/migration_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/migration_test_suite.cpython-313.pyc +0 -0
- package/core/__pycache__/migration_validator.cpython-313.pyc +0 -0
- package/core/__pycache__/optimized_find_replace.cpython-313.pyc +0 -0
- package/core/__pycache__/optimized_pattern_engine.cpython-313.pyc +0 -0
- package/core/__pycache__/optimized_search_highlighter.cpython-313.pyc +0 -0
- package/core/__pycache__/performance_monitor.cpython-313.pyc +0 -0
- package/core/__pycache__/persistence_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/progressive_stats_calculator.cpython-313.pyc +0 -0
- package/core/__pycache__/regex_pattern_cache.cpython-313.pyc +0 -0
- package/core/__pycache__/regex_pattern_library.cpython-313.pyc +0 -0
- package/core/__pycache__/search_operation_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/settings_defaults_registry.cpython-313.pyc +0 -0
- package/core/__pycache__/settings_integrity_validator.cpython-313.pyc +0 -0
- package/core/__pycache__/settings_serializer.cpython-313.pyc +0 -0
- package/core/__pycache__/settings_validator.cpython-313.pyc +0 -0
- package/core/__pycache__/smart_stats_calculator.cpython-313.pyc +0 -0
- package/core/__pycache__/statistics_update_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/stats_config_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/streaming_text_handler.cpython-313.pyc +0 -0
- package/core/__pycache__/task_scheduler.cpython-313.pyc +0 -0
- package/core/__pycache__/visibility_monitor.cpython-313.pyc +0 -0
- package/core/__pycache__/widget_cache.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/__init__.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/protocol.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/schema.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/server_stdio.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/tool_registry.cpython-313.pyc +0 -0
- package/tools/__pycache__/__init__.cpython-313.pyc +0 -0
- package/tools/__pycache__/ai_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/ascii_art_generator.cpython-313.pyc +0 -0
- package/tools/__pycache__/base64_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/base_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/case_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/column_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/cron_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/curl_history.cpython-313.pyc +0 -0
- package/tools/__pycache__/curl_processor.cpython-313.pyc +0 -0
- package/tools/__pycache__/curl_settings.cpython-313.pyc +0 -0
- package/tools/__pycache__/curl_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/diff_viewer.cpython-313.pyc +0 -0
- package/tools/__pycache__/email_extraction_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/email_header_analyzer.cpython-313.pyc +0 -0
- package/tools/__pycache__/extraction_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/find_replace.cpython-313.pyc +0 -0
- package/tools/__pycache__/folder_file_reporter.cpython-313.pyc +0 -0
- package/tools/__pycache__/folder_file_reporter_adapter.cpython-313.pyc +0 -0
- package/tools/__pycache__/generator_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/hash_generator.cpython-313.pyc +0 -0
- package/tools/__pycache__/html_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/huggingface_helper.cpython-313.pyc +0 -0
- package/tools/__pycache__/jsonxml_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/line_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/list_comparator.cpython-313.pyc +0 -0
- package/tools/__pycache__/markdown_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/mcp_widget.cpython-313.pyc +0 -0
- package/tools/__pycache__/notes_widget.cpython-313.pyc +0 -0
- package/tools/__pycache__/number_base_converter.cpython-313.pyc +0 -0
- package/tools/__pycache__/regex_extractor.cpython-313.pyc +0 -0
- package/tools/__pycache__/slug_generator.cpython-313.pyc +0 -0
- package/tools/__pycache__/sorter_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/string_escape_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/text_statistics_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/text_wrapper.cpython-313.pyc +0 -0
- package/tools/__pycache__/timestamp_converter.cpython-313.pyc +0 -0
- package/tools/__pycache__/tool_loader.cpython-313.pyc +0 -0
- package/tools/__pycache__/translator_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/url_link_extractor.cpython-313.pyc +0 -0
- package/tools/__pycache__/url_parser.cpython-313.pyc +0 -0
- package/tools/__pycache__/whitespace_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/word_frequency_counter.cpython-313.pyc +0 -0
|
@@ -1,457 +1,457 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Database Settings Manager Interface Compatibility Layer
|
|
3
|
-
|
|
4
|
-
This module provides interface compatibility classes that ensure all existing
|
|
5
|
-
settings manager interfaces work with the database backend without requiring
|
|
6
|
-
code changes in the tools that use them.
|
|
7
|
-
|
|
8
|
-
Author: Pomera AI Commander
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
import logging
|
|
12
|
-
from typing import Dict, List, Any, Optional
|
|
13
|
-
from abc import ABC, abstractmethod
|
|
14
|
-
|
|
15
|
-
from .database_settings_manager import DatabaseSettingsManager
|
|
16
|
-
from .database_curl_settings_manager import DatabaseCurlSettingsManager
|
|
17
|
-
from .database_promera_ai_settings_manager import DatabasePromeraAISettingsManager, DatabaseDialogSettingsAdapter
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class SettingsManagerInterface(ABC):
|
|
21
|
-
"""
|
|
22
|
-
Abstract base class defining the settings manager interface expected by tools.
|
|
23
|
-
|
|
24
|
-
This interface ensures compatibility with existing tool code while allowing
|
|
25
|
-
different backend implementations (JSON file, database, etc.).
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
@abstractmethod
|
|
29
|
-
def get_tool_settings(self, tool_name: str) -> Dict[str, Any]:
|
|
30
|
-
"""Get settings for a specific tool."""
|
|
31
|
-
pass
|
|
32
|
-
|
|
33
|
-
@abstractmethod
|
|
34
|
-
def save_settings(self):
|
|
35
|
-
"""Save current settings to persistent storage."""
|
|
36
|
-
pass
|
|
37
|
-
|
|
38
|
-
@abstractmethod
|
|
39
|
-
def get_pattern_library(self) -> List[Dict[str, str]]:
|
|
40
|
-
"""Get the regex pattern library."""
|
|
41
|
-
pass
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
class DatabaseSettingsManagerAdapter(SettingsManagerInterface):
|
|
45
|
-
"""
|
|
46
|
-
Adapter that provides the SettingsManager interface using database backend.
|
|
47
|
-
|
|
48
|
-
This adapter ensures that existing tools like FindReplaceWidget can work
|
|
49
|
-
with the database backend without any code changes.
|
|
50
|
-
"""
|
|
51
|
-
|
|
52
|
-
def __init__(self, database_settings_manager: DatabaseSettingsManager, logger=None):
|
|
53
|
-
"""
|
|
54
|
-
Initialize the settings manager adapter.
|
|
55
|
-
|
|
56
|
-
Args:
|
|
57
|
-
database_settings_manager: DatabaseSettingsManager instance
|
|
58
|
-
logger: Optional logger instance
|
|
59
|
-
"""
|
|
60
|
-
self.database_manager = database_settings_manager
|
|
61
|
-
self.promera_ai_manager = DatabasePromeraAISettingsManager(database_settings_manager, logger)
|
|
62
|
-
self.logger = logger or logging.getLogger(__name__)
|
|
63
|
-
|
|
64
|
-
def get_tool_settings(self, tool_name: str) -> Dict[str, Any]:
|
|
65
|
-
"""
|
|
66
|
-
Get settings for a specific tool.
|
|
67
|
-
|
|
68
|
-
Args:
|
|
69
|
-
tool_name: Name of the tool
|
|
70
|
-
|
|
71
|
-
Returns:
|
|
72
|
-
Dictionary of tool settings
|
|
73
|
-
"""
|
|
74
|
-
return self.promera_ai_manager.get_tool_settings(tool_name)
|
|
75
|
-
|
|
76
|
-
def save_settings(self):
|
|
77
|
-
"""Save current settings to persistent storage."""
|
|
78
|
-
self.promera_ai_manager.save_settings()
|
|
79
|
-
|
|
80
|
-
def get_pattern_library(self) -> List[Dict[str, str]]:
|
|
81
|
-
"""
|
|
82
|
-
Get the regex pattern library.
|
|
83
|
-
|
|
84
|
-
Returns:
|
|
85
|
-
List of pattern dictionaries
|
|
86
|
-
"""
|
|
87
|
-
return self.promera_ai_manager.get_pattern_library()
|
|
88
|
-
|
|
89
|
-
# Additional methods for enhanced functionality
|
|
90
|
-
|
|
91
|
-
def set_tool_setting(self, tool_name: str, key: str, value: Any) -> None:
|
|
92
|
-
"""Set a specific tool setting."""
|
|
93
|
-
self.promera_ai_manager.set_tool_setting(tool_name, key, value)
|
|
94
|
-
|
|
95
|
-
def get_tool_setting(self, tool_name: str, key: str, default: Any = None) -> Any:
|
|
96
|
-
"""Get a specific tool setting."""
|
|
97
|
-
return self.promera_ai_manager.get_tool_setting(tool_name, key, default)
|
|
98
|
-
|
|
99
|
-
def get_setting(self, key: str, default: Any = None) -> Any:
|
|
100
|
-
"""Get a core application setting."""
|
|
101
|
-
return self.promera_ai_manager.get_setting(key, default)
|
|
102
|
-
|
|
103
|
-
def set_setting(self, key: str, value: Any) -> None:
|
|
104
|
-
"""Set a core application setting."""
|
|
105
|
-
self.promera_ai_manager.set_setting(key, value)
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
class DatabaseSettingsManagerFactory:
|
|
109
|
-
"""
|
|
110
|
-
Factory class for creating database-compatible settings managers.
|
|
111
|
-
|
|
112
|
-
This factory provides a centralized way to create all the different types
|
|
113
|
-
of settings managers needed by the application while ensuring they all
|
|
114
|
-
use the same database backend.
|
|
115
|
-
"""
|
|
116
|
-
|
|
117
|
-
def __init__(self, db_path: str = ":memory:", backup_path: Optional[str] = None,
|
|
118
|
-
json_settings_path: str = "settings.json", logger=None):
|
|
119
|
-
"""
|
|
120
|
-
Initialize the settings manager factory.
|
|
121
|
-
|
|
122
|
-
Args:
|
|
123
|
-
db_path: Path to SQLite database file
|
|
124
|
-
backup_path: Path for automatic backups
|
|
125
|
-
json_settings_path: Path to JSON settings file for migration
|
|
126
|
-
logger: Optional logger instance
|
|
127
|
-
"""
|
|
128
|
-
self.db_path = db_path
|
|
129
|
-
self.backup_path = backup_path
|
|
130
|
-
self.json_settings_path = json_settings_path
|
|
131
|
-
self.logger = logger or logging.getLogger(__name__)
|
|
132
|
-
|
|
133
|
-
# Create the main database settings manager
|
|
134
|
-
self.database_manager = DatabaseSettingsManager(
|
|
135
|
-
db_path=db_path,
|
|
136
|
-
backup_path=backup_path,
|
|
137
|
-
json_settings_path=json_settings_path
|
|
138
|
-
)
|
|
139
|
-
|
|
140
|
-
# Cache for created managers
|
|
141
|
-
self._managers_cache = {}
|
|
142
|
-
|
|
143
|
-
def get_main_settings_manager(self) -> DatabaseSettingsManager:
|
|
144
|
-
"""
|
|
145
|
-
Get the main database settings manager.
|
|
146
|
-
|
|
147
|
-
Returns:
|
|
148
|
-
DatabaseSettingsManager instance
|
|
149
|
-
"""
|
|
150
|
-
return self.database_manager
|
|
151
|
-
|
|
152
|
-
def get_curl_settings_manager(self) -> DatabaseCurlSettingsManager:
|
|
153
|
-
"""
|
|
154
|
-
Get a cURL-specific settings manager.
|
|
155
|
-
|
|
156
|
-
Returns:
|
|
157
|
-
DatabaseCurlSettingsManager instance
|
|
158
|
-
"""
|
|
159
|
-
if 'curl' not in self._managers_cache:
|
|
160
|
-
self._managers_cache['curl'] = DatabaseCurlSettingsManager(
|
|
161
|
-
self.database_manager, self.logger
|
|
162
|
-
)
|
|
163
|
-
return self._managers_cache['curl']
|
|
164
|
-
|
|
165
|
-
def get_promera_ai_settings_manager(self) -> DatabasePromeraAISettingsManager:
|
|
166
|
-
"""
|
|
167
|
-
Get a PromeraAI-compatible settings manager.
|
|
168
|
-
|
|
169
|
-
Returns:
|
|
170
|
-
DatabasePromeraAISettingsManager instance
|
|
171
|
-
"""
|
|
172
|
-
if 'promera_ai' not in self._managers_cache:
|
|
173
|
-
self._managers_cache['promera_ai'] = DatabasePromeraAISettingsManager(
|
|
174
|
-
self.database_manager, self.logger
|
|
175
|
-
)
|
|
176
|
-
return self._managers_cache['promera_ai']
|
|
177
|
-
|
|
178
|
-
def get_settings_manager_adapter(self) -> DatabaseSettingsManagerAdapter:
|
|
179
|
-
"""
|
|
180
|
-
Get a settings manager adapter for tool compatibility.
|
|
181
|
-
|
|
182
|
-
Returns:
|
|
183
|
-
DatabaseSettingsManagerAdapter instance
|
|
184
|
-
"""
|
|
185
|
-
if 'adapter' not in self._managers_cache:
|
|
186
|
-
self._managers_cache['adapter'] = DatabaseSettingsManagerAdapter(
|
|
187
|
-
self.database_manager, self.logger
|
|
188
|
-
)
|
|
189
|
-
return self._managers_cache['adapter']
|
|
190
|
-
|
|
191
|
-
def get_dialog_settings_adapter(self) -> DatabaseDialogSettingsAdapter:
|
|
192
|
-
"""
|
|
193
|
-
Get a dialog settings adapter.
|
|
194
|
-
|
|
195
|
-
Returns:
|
|
196
|
-
DatabaseDialogSettingsAdapter instance
|
|
197
|
-
"""
|
|
198
|
-
if 'dialog' not in self._managers_cache:
|
|
199
|
-
self._managers_cache['dialog'] = DatabaseDialogSettingsAdapter(
|
|
200
|
-
self.database_manager, self.logger
|
|
201
|
-
)
|
|
202
|
-
return self._managers_cache['dialog']
|
|
203
|
-
|
|
204
|
-
def create_tool_specific_manager(self, tool_name: str) -> 'ToolSpecificSettingsManager':
|
|
205
|
-
"""
|
|
206
|
-
Create a tool-specific settings manager.
|
|
207
|
-
|
|
208
|
-
Args:
|
|
209
|
-
tool_name: Name of the tool
|
|
210
|
-
|
|
211
|
-
Returns:
|
|
212
|
-
ToolSpecificSettingsManager instance
|
|
213
|
-
"""
|
|
214
|
-
return ToolSpecificSettingsManager(self.database_manager, tool_name, self.logger)
|
|
215
|
-
|
|
216
|
-
def close_all(self) -> None:
|
|
217
|
-
"""Close all settings managers and cleanup resources."""
|
|
218
|
-
try:
|
|
219
|
-
self.database_manager.close()
|
|
220
|
-
self._managers_cache.clear()
|
|
221
|
-
self.logger.info("All settings managers closed")
|
|
222
|
-
except Exception as e:
|
|
223
|
-
self.logger.error(f"Error closing settings managers: {e}")
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
class ToolSpecificSettingsManager:
|
|
227
|
-
"""
|
|
228
|
-
A tool-specific settings manager that provides a focused interface
|
|
229
|
-
for individual tools to manage their settings.
|
|
230
|
-
"""
|
|
231
|
-
|
|
232
|
-
def __init__(self, database_settings_manager: DatabaseSettingsManager,
|
|
233
|
-
tool_name: str, logger=None):
|
|
234
|
-
"""
|
|
235
|
-
Initialize the tool-specific settings manager.
|
|
236
|
-
|
|
237
|
-
Args:
|
|
238
|
-
database_settings_manager: DatabaseSettingsManager instance
|
|
239
|
-
tool_name: Name of the tool this manager is for
|
|
240
|
-
logger: Optional logger instance
|
|
241
|
-
"""
|
|
242
|
-
self.database_manager = database_settings_manager
|
|
243
|
-
self.tool_name = tool_name
|
|
244
|
-
self.logger = logger or logging.getLogger(__name__)
|
|
245
|
-
|
|
246
|
-
def get_settings(self) -> Dict[str, Any]:
|
|
247
|
-
"""
|
|
248
|
-
Get all settings for this tool.
|
|
249
|
-
|
|
250
|
-
Returns:
|
|
251
|
-
Dictionary of tool settings
|
|
252
|
-
"""
|
|
253
|
-
return self.database_manager.get_tool_settings(self.tool_name)
|
|
254
|
-
|
|
255
|
-
def get_setting(self, key: str, default: Any = None) -> Any:
|
|
256
|
-
"""
|
|
257
|
-
Get a specific setting for this tool.
|
|
258
|
-
|
|
259
|
-
Args:
|
|
260
|
-
key: Setting key
|
|
261
|
-
default: Default value if not found
|
|
262
|
-
|
|
263
|
-
Returns:
|
|
264
|
-
Setting value or default
|
|
265
|
-
"""
|
|
266
|
-
settings = self.get_settings()
|
|
267
|
-
return settings.get(key, default)
|
|
268
|
-
|
|
269
|
-
def set_setting(self, key: str, value: Any) -> None:
|
|
270
|
-
"""
|
|
271
|
-
Set a specific setting for this tool.
|
|
272
|
-
|
|
273
|
-
Args:
|
|
274
|
-
key: Setting key
|
|
275
|
-
value: Setting value
|
|
276
|
-
"""
|
|
277
|
-
self.database_manager.set_tool_setting(self.tool_name, key, value)
|
|
278
|
-
|
|
279
|
-
def update_settings(self, settings_update: Dict[str, Any]) -> None:
|
|
280
|
-
"""
|
|
281
|
-
Update multiple settings for this tool.
|
|
282
|
-
|
|
283
|
-
Args:
|
|
284
|
-
settings_update: Dictionary of setting updates
|
|
285
|
-
"""
|
|
286
|
-
for key, value in settings_update.items():
|
|
287
|
-
self.set_setting(key, value)
|
|
288
|
-
|
|
289
|
-
def reset_to_defaults(self, defaults: Dict[str, Any]) -> None:
|
|
290
|
-
"""
|
|
291
|
-
Reset tool settings to provided defaults.
|
|
292
|
-
|
|
293
|
-
Args:
|
|
294
|
-
defaults: Dictionary of default settings
|
|
295
|
-
"""
|
|
296
|
-
# Clear existing settings for this tool
|
|
297
|
-
current_settings = self.get_settings()
|
|
298
|
-
for key in current_settings.keys():
|
|
299
|
-
if key not in defaults:
|
|
300
|
-
# Remove settings that are no longer in defaults
|
|
301
|
-
# Note: This would require implementing a delete method
|
|
302
|
-
pass
|
|
303
|
-
|
|
304
|
-
# Set all default values
|
|
305
|
-
self.update_settings(defaults)
|
|
306
|
-
|
|
307
|
-
def export_settings(self, filepath: str) -> bool:
|
|
308
|
-
"""
|
|
309
|
-
Export this tool's settings to a file.
|
|
310
|
-
|
|
311
|
-
Args:
|
|
312
|
-
filepath: Target file path
|
|
313
|
-
|
|
314
|
-
Returns:
|
|
315
|
-
True if successful, False otherwise
|
|
316
|
-
"""
|
|
317
|
-
try:
|
|
318
|
-
import json
|
|
319
|
-
settings = self.get_settings()
|
|
320
|
-
|
|
321
|
-
with open(filepath, 'w', encoding='utf-8') as f:
|
|
322
|
-
json.dump({self.tool_name: settings}, f, indent=4, ensure_ascii=False)
|
|
323
|
-
|
|
324
|
-
self.logger.info(f"Tool settings for {self.tool_name} exported to {filepath}")
|
|
325
|
-
return True
|
|
326
|
-
|
|
327
|
-
except Exception as e:
|
|
328
|
-
self.logger.error(f"Error exporting tool settings for {self.tool_name}: {e}")
|
|
329
|
-
return False
|
|
330
|
-
|
|
331
|
-
def import_settings(self, filepath: str) -> bool:
|
|
332
|
-
"""
|
|
333
|
-
Import this tool's settings from a file.
|
|
334
|
-
|
|
335
|
-
Args:
|
|
336
|
-
filepath: Source file path
|
|
337
|
-
|
|
338
|
-
Returns:
|
|
339
|
-
True if successful, False otherwise
|
|
340
|
-
"""
|
|
341
|
-
try:
|
|
342
|
-
import json
|
|
343
|
-
import os
|
|
344
|
-
|
|
345
|
-
if not os.path.exists(filepath):
|
|
346
|
-
self.logger.error(f"Import file not found: {filepath}")
|
|
347
|
-
return False
|
|
348
|
-
|
|
349
|
-
with open(filepath, 'r', encoding='utf-8') as f:
|
|
350
|
-
imported_data = json.load(f)
|
|
351
|
-
|
|
352
|
-
# Handle different import formats
|
|
353
|
-
if self.tool_name in imported_data:
|
|
354
|
-
settings = imported_data[self.tool_name]
|
|
355
|
-
elif isinstance(imported_data, dict):
|
|
356
|
-
# Assume the entire file is settings for this tool
|
|
357
|
-
settings = imported_data
|
|
358
|
-
else:
|
|
359
|
-
self.logger.error("Invalid import file format")
|
|
360
|
-
return False
|
|
361
|
-
|
|
362
|
-
self.update_settings(settings)
|
|
363
|
-
self.logger.info(f"Tool settings for {self.tool_name} imported from {filepath}")
|
|
364
|
-
return True
|
|
365
|
-
|
|
366
|
-
except Exception as e:
|
|
367
|
-
self.logger.error(f"Error importing tool settings for {self.tool_name}: {e}")
|
|
368
|
-
return False
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
# Convenience functions for backward compatibility
|
|
372
|
-
|
|
373
|
-
def create_find_replace_settings_manager(database_settings_manager: DatabaseSettingsManager,
|
|
374
|
-
logger=None) -> DatabaseSettingsManagerAdapter:
|
|
375
|
-
"""
|
|
376
|
-
Create a settings manager compatible with FindReplaceWidget.
|
|
377
|
-
|
|
378
|
-
Args:
|
|
379
|
-
database_settings_manager: DatabaseSettingsManager instance
|
|
380
|
-
logger: Optional logger instance
|
|
381
|
-
|
|
382
|
-
Returns:
|
|
383
|
-
DatabaseSettingsManagerAdapter instance
|
|
384
|
-
"""
|
|
385
|
-
return DatabaseSettingsManagerAdapter(database_settings_manager, logger)
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
def create_legacy_settings_manager(database_settings_manager: DatabaseSettingsManager,
|
|
389
|
-
logger=None) -> DatabasePromeraAISettingsManager:
|
|
390
|
-
"""
|
|
391
|
-
Create a legacy-compatible settings manager.
|
|
392
|
-
|
|
393
|
-
This function provides backward compatibility for code that expects
|
|
394
|
-
the original PromeraAISettingsManager interface.
|
|
395
|
-
|
|
396
|
-
Args:
|
|
397
|
-
database_settings_manager: DatabaseSettingsManager instance
|
|
398
|
-
logger: Optional logger instance
|
|
399
|
-
|
|
400
|
-
Returns:
|
|
401
|
-
DatabasePromeraAISettingsManager instance
|
|
402
|
-
"""
|
|
403
|
-
return DatabasePromeraAISettingsManager(database_settings_manager, logger)
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
# Global factory instance for easy access
|
|
407
|
-
_global_factory: Optional[DatabaseSettingsManagerFactory] = None
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
def initialize_global_settings_factory(db_path: str = ":memory:",
|
|
411
|
-
backup_path: Optional[str] = None,
|
|
412
|
-
json_settings_path: str = "settings.json",
|
|
413
|
-
logger=None) -> DatabaseSettingsManagerFactory:
|
|
414
|
-
"""
|
|
415
|
-
Initialize the global settings manager factory.
|
|
416
|
-
|
|
417
|
-
Args:
|
|
418
|
-
db_path: Path to SQLite database file
|
|
419
|
-
backup_path: Path for automatic backups
|
|
420
|
-
json_settings_path: Path to JSON settings file for migration
|
|
421
|
-
logger: Optional logger instance
|
|
422
|
-
|
|
423
|
-
Returns:
|
|
424
|
-
DatabaseSettingsManagerFactory instance
|
|
425
|
-
"""
|
|
426
|
-
global _global_factory
|
|
427
|
-
_global_factory = DatabaseSettingsManagerFactory(
|
|
428
|
-
db_path=db_path,
|
|
429
|
-
backup_path=backup_path,
|
|
430
|
-
json_settings_path=json_settings_path,
|
|
431
|
-
logger=logger
|
|
432
|
-
)
|
|
433
|
-
return _global_factory
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
def get_global_settings_factory() -> DatabaseSettingsManagerFactory:
|
|
437
|
-
"""
|
|
438
|
-
Get the global settings manager factory.
|
|
439
|
-
|
|
440
|
-
Returns:
|
|
441
|
-
DatabaseSettingsManagerFactory instance
|
|
442
|
-
|
|
443
|
-
Raises:
|
|
444
|
-
RuntimeError: If factory not initialized
|
|
445
|
-
"""
|
|
446
|
-
global _global_factory
|
|
447
|
-
if _global_factory is None:
|
|
448
|
-
raise RuntimeError("Global settings factory not initialized. Call initialize_global_settings_factory() first.")
|
|
449
|
-
return _global_factory
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
def close_global_settings_factory() -> None:
|
|
453
|
-
"""Close the global settings manager factory."""
|
|
454
|
-
global _global_factory
|
|
455
|
-
if _global_factory is not None:
|
|
456
|
-
_global_factory.close_all()
|
|
1
|
+
"""
|
|
2
|
+
Database Settings Manager Interface Compatibility Layer
|
|
3
|
+
|
|
4
|
+
This module provides interface compatibility classes that ensure all existing
|
|
5
|
+
settings manager interfaces work with the database backend without requiring
|
|
6
|
+
code changes in the tools that use them.
|
|
7
|
+
|
|
8
|
+
Author: Pomera AI Commander
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
from typing import Dict, List, Any, Optional
|
|
13
|
+
from abc import ABC, abstractmethod
|
|
14
|
+
|
|
15
|
+
from .database_settings_manager import DatabaseSettingsManager
|
|
16
|
+
from .database_curl_settings_manager import DatabaseCurlSettingsManager
|
|
17
|
+
from .database_promera_ai_settings_manager import DatabasePromeraAISettingsManager, DatabaseDialogSettingsAdapter
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SettingsManagerInterface(ABC):
|
|
21
|
+
"""
|
|
22
|
+
Abstract base class defining the settings manager interface expected by tools.
|
|
23
|
+
|
|
24
|
+
This interface ensures compatibility with existing tool code while allowing
|
|
25
|
+
different backend implementations (JSON file, database, etc.).
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
def get_tool_settings(self, tool_name: str) -> Dict[str, Any]:
|
|
30
|
+
"""Get settings for a specific tool."""
|
|
31
|
+
pass
|
|
32
|
+
|
|
33
|
+
@abstractmethod
|
|
34
|
+
def save_settings(self):
|
|
35
|
+
"""Save current settings to persistent storage."""
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
@abstractmethod
|
|
39
|
+
def get_pattern_library(self) -> List[Dict[str, str]]:
|
|
40
|
+
"""Get the regex pattern library."""
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class DatabaseSettingsManagerAdapter(SettingsManagerInterface):
|
|
45
|
+
"""
|
|
46
|
+
Adapter that provides the SettingsManager interface using database backend.
|
|
47
|
+
|
|
48
|
+
This adapter ensures that existing tools like FindReplaceWidget can work
|
|
49
|
+
with the database backend without any code changes.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(self, database_settings_manager: DatabaseSettingsManager, logger=None):
|
|
53
|
+
"""
|
|
54
|
+
Initialize the settings manager adapter.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
database_settings_manager: DatabaseSettingsManager instance
|
|
58
|
+
logger: Optional logger instance
|
|
59
|
+
"""
|
|
60
|
+
self.database_manager = database_settings_manager
|
|
61
|
+
self.promera_ai_manager = DatabasePromeraAISettingsManager(database_settings_manager, logger)
|
|
62
|
+
self.logger = logger or logging.getLogger(__name__)
|
|
63
|
+
|
|
64
|
+
def get_tool_settings(self, tool_name: str) -> Dict[str, Any]:
|
|
65
|
+
"""
|
|
66
|
+
Get settings for a specific tool.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
tool_name: Name of the tool
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Dictionary of tool settings
|
|
73
|
+
"""
|
|
74
|
+
return self.promera_ai_manager.get_tool_settings(tool_name)
|
|
75
|
+
|
|
76
|
+
def save_settings(self):
|
|
77
|
+
"""Save current settings to persistent storage."""
|
|
78
|
+
self.promera_ai_manager.save_settings()
|
|
79
|
+
|
|
80
|
+
def get_pattern_library(self) -> List[Dict[str, str]]:
|
|
81
|
+
"""
|
|
82
|
+
Get the regex pattern library.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
List of pattern dictionaries
|
|
86
|
+
"""
|
|
87
|
+
return self.promera_ai_manager.get_pattern_library()
|
|
88
|
+
|
|
89
|
+
# Additional methods for enhanced functionality
|
|
90
|
+
|
|
91
|
+
def set_tool_setting(self, tool_name: str, key: str, value: Any) -> None:
|
|
92
|
+
"""Set a specific tool setting."""
|
|
93
|
+
self.promera_ai_manager.set_tool_setting(tool_name, key, value)
|
|
94
|
+
|
|
95
|
+
def get_tool_setting(self, tool_name: str, key: str, default: Any = None) -> Any:
|
|
96
|
+
"""Get a specific tool setting."""
|
|
97
|
+
return self.promera_ai_manager.get_tool_setting(tool_name, key, default)
|
|
98
|
+
|
|
99
|
+
def get_setting(self, key: str, default: Any = None) -> Any:
|
|
100
|
+
"""Get a core application setting."""
|
|
101
|
+
return self.promera_ai_manager.get_setting(key, default)
|
|
102
|
+
|
|
103
|
+
def set_setting(self, key: str, value: Any) -> None:
|
|
104
|
+
"""Set a core application setting."""
|
|
105
|
+
self.promera_ai_manager.set_setting(key, value)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class DatabaseSettingsManagerFactory:
|
|
109
|
+
"""
|
|
110
|
+
Factory class for creating database-compatible settings managers.
|
|
111
|
+
|
|
112
|
+
This factory provides a centralized way to create all the different types
|
|
113
|
+
of settings managers needed by the application while ensuring they all
|
|
114
|
+
use the same database backend.
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
def __init__(self, db_path: str = ":memory:", backup_path: Optional[str] = None,
|
|
118
|
+
json_settings_path: str = "settings.json", logger=None):
|
|
119
|
+
"""
|
|
120
|
+
Initialize the settings manager factory.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
db_path: Path to SQLite database file
|
|
124
|
+
backup_path: Path for automatic backups
|
|
125
|
+
json_settings_path: Path to JSON settings file for migration
|
|
126
|
+
logger: Optional logger instance
|
|
127
|
+
"""
|
|
128
|
+
self.db_path = db_path
|
|
129
|
+
self.backup_path = backup_path
|
|
130
|
+
self.json_settings_path = json_settings_path
|
|
131
|
+
self.logger = logger or logging.getLogger(__name__)
|
|
132
|
+
|
|
133
|
+
# Create the main database settings manager
|
|
134
|
+
self.database_manager = DatabaseSettingsManager(
|
|
135
|
+
db_path=db_path,
|
|
136
|
+
backup_path=backup_path,
|
|
137
|
+
json_settings_path=json_settings_path
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
# Cache for created managers
|
|
141
|
+
self._managers_cache = {}
|
|
142
|
+
|
|
143
|
+
def get_main_settings_manager(self) -> DatabaseSettingsManager:
|
|
144
|
+
"""
|
|
145
|
+
Get the main database settings manager.
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
DatabaseSettingsManager instance
|
|
149
|
+
"""
|
|
150
|
+
return self.database_manager
|
|
151
|
+
|
|
152
|
+
def get_curl_settings_manager(self) -> DatabaseCurlSettingsManager:
|
|
153
|
+
"""
|
|
154
|
+
Get a cURL-specific settings manager.
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
DatabaseCurlSettingsManager instance
|
|
158
|
+
"""
|
|
159
|
+
if 'curl' not in self._managers_cache:
|
|
160
|
+
self._managers_cache['curl'] = DatabaseCurlSettingsManager(
|
|
161
|
+
self.database_manager, self.logger
|
|
162
|
+
)
|
|
163
|
+
return self._managers_cache['curl']
|
|
164
|
+
|
|
165
|
+
def get_promera_ai_settings_manager(self) -> DatabasePromeraAISettingsManager:
|
|
166
|
+
"""
|
|
167
|
+
Get a PromeraAI-compatible settings manager.
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
DatabasePromeraAISettingsManager instance
|
|
171
|
+
"""
|
|
172
|
+
if 'promera_ai' not in self._managers_cache:
|
|
173
|
+
self._managers_cache['promera_ai'] = DatabasePromeraAISettingsManager(
|
|
174
|
+
self.database_manager, self.logger
|
|
175
|
+
)
|
|
176
|
+
return self._managers_cache['promera_ai']
|
|
177
|
+
|
|
178
|
+
def get_settings_manager_adapter(self) -> DatabaseSettingsManagerAdapter:
|
|
179
|
+
"""
|
|
180
|
+
Get a settings manager adapter for tool compatibility.
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
DatabaseSettingsManagerAdapter instance
|
|
184
|
+
"""
|
|
185
|
+
if 'adapter' not in self._managers_cache:
|
|
186
|
+
self._managers_cache['adapter'] = DatabaseSettingsManagerAdapter(
|
|
187
|
+
self.database_manager, self.logger
|
|
188
|
+
)
|
|
189
|
+
return self._managers_cache['adapter']
|
|
190
|
+
|
|
191
|
+
def get_dialog_settings_adapter(self) -> DatabaseDialogSettingsAdapter:
|
|
192
|
+
"""
|
|
193
|
+
Get a dialog settings adapter.
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
DatabaseDialogSettingsAdapter instance
|
|
197
|
+
"""
|
|
198
|
+
if 'dialog' not in self._managers_cache:
|
|
199
|
+
self._managers_cache['dialog'] = DatabaseDialogSettingsAdapter(
|
|
200
|
+
self.database_manager, self.logger
|
|
201
|
+
)
|
|
202
|
+
return self._managers_cache['dialog']
|
|
203
|
+
|
|
204
|
+
def create_tool_specific_manager(self, tool_name: str) -> 'ToolSpecificSettingsManager':
|
|
205
|
+
"""
|
|
206
|
+
Create a tool-specific settings manager.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
tool_name: Name of the tool
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
ToolSpecificSettingsManager instance
|
|
213
|
+
"""
|
|
214
|
+
return ToolSpecificSettingsManager(self.database_manager, tool_name, self.logger)
|
|
215
|
+
|
|
216
|
+
def close_all(self) -> None:
|
|
217
|
+
"""Close all settings managers and cleanup resources."""
|
|
218
|
+
try:
|
|
219
|
+
self.database_manager.close()
|
|
220
|
+
self._managers_cache.clear()
|
|
221
|
+
self.logger.info("All settings managers closed")
|
|
222
|
+
except Exception as e:
|
|
223
|
+
self.logger.error(f"Error closing settings managers: {e}")
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
class ToolSpecificSettingsManager:
|
|
227
|
+
"""
|
|
228
|
+
A tool-specific settings manager that provides a focused interface
|
|
229
|
+
for individual tools to manage their settings.
|
|
230
|
+
"""
|
|
231
|
+
|
|
232
|
+
def __init__(self, database_settings_manager: DatabaseSettingsManager,
|
|
233
|
+
tool_name: str, logger=None):
|
|
234
|
+
"""
|
|
235
|
+
Initialize the tool-specific settings manager.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
database_settings_manager: DatabaseSettingsManager instance
|
|
239
|
+
tool_name: Name of the tool this manager is for
|
|
240
|
+
logger: Optional logger instance
|
|
241
|
+
"""
|
|
242
|
+
self.database_manager = database_settings_manager
|
|
243
|
+
self.tool_name = tool_name
|
|
244
|
+
self.logger = logger or logging.getLogger(__name__)
|
|
245
|
+
|
|
246
|
+
def get_settings(self) -> Dict[str, Any]:
|
|
247
|
+
"""
|
|
248
|
+
Get all settings for this tool.
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
Dictionary of tool settings
|
|
252
|
+
"""
|
|
253
|
+
return self.database_manager.get_tool_settings(self.tool_name)
|
|
254
|
+
|
|
255
|
+
def get_setting(self, key: str, default: Any = None) -> Any:
|
|
256
|
+
"""
|
|
257
|
+
Get a specific setting for this tool.
|
|
258
|
+
|
|
259
|
+
Args:
|
|
260
|
+
key: Setting key
|
|
261
|
+
default: Default value if not found
|
|
262
|
+
|
|
263
|
+
Returns:
|
|
264
|
+
Setting value or default
|
|
265
|
+
"""
|
|
266
|
+
settings = self.get_settings()
|
|
267
|
+
return settings.get(key, default)
|
|
268
|
+
|
|
269
|
+
def set_setting(self, key: str, value: Any) -> None:
|
|
270
|
+
"""
|
|
271
|
+
Set a specific setting for this tool.
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
key: Setting key
|
|
275
|
+
value: Setting value
|
|
276
|
+
"""
|
|
277
|
+
self.database_manager.set_tool_setting(self.tool_name, key, value)
|
|
278
|
+
|
|
279
|
+
def update_settings(self, settings_update: Dict[str, Any]) -> None:
|
|
280
|
+
"""
|
|
281
|
+
Update multiple settings for this tool.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
settings_update: Dictionary of setting updates
|
|
285
|
+
"""
|
|
286
|
+
for key, value in settings_update.items():
|
|
287
|
+
self.set_setting(key, value)
|
|
288
|
+
|
|
289
|
+
def reset_to_defaults(self, defaults: Dict[str, Any]) -> None:
|
|
290
|
+
"""
|
|
291
|
+
Reset tool settings to provided defaults.
|
|
292
|
+
|
|
293
|
+
Args:
|
|
294
|
+
defaults: Dictionary of default settings
|
|
295
|
+
"""
|
|
296
|
+
# Clear existing settings for this tool
|
|
297
|
+
current_settings = self.get_settings()
|
|
298
|
+
for key in current_settings.keys():
|
|
299
|
+
if key not in defaults:
|
|
300
|
+
# Remove settings that are no longer in defaults
|
|
301
|
+
# Note: This would require implementing a delete method
|
|
302
|
+
pass
|
|
303
|
+
|
|
304
|
+
# Set all default values
|
|
305
|
+
self.update_settings(defaults)
|
|
306
|
+
|
|
307
|
+
def export_settings(self, filepath: str) -> bool:
|
|
308
|
+
"""
|
|
309
|
+
Export this tool's settings to a file.
|
|
310
|
+
|
|
311
|
+
Args:
|
|
312
|
+
filepath: Target file path
|
|
313
|
+
|
|
314
|
+
Returns:
|
|
315
|
+
True if successful, False otherwise
|
|
316
|
+
"""
|
|
317
|
+
try:
|
|
318
|
+
import json
|
|
319
|
+
settings = self.get_settings()
|
|
320
|
+
|
|
321
|
+
with open(filepath, 'w', encoding='utf-8') as f:
|
|
322
|
+
json.dump({self.tool_name: settings}, f, indent=4, ensure_ascii=False)
|
|
323
|
+
|
|
324
|
+
self.logger.info(f"Tool settings for {self.tool_name} exported to {filepath}")
|
|
325
|
+
return True
|
|
326
|
+
|
|
327
|
+
except Exception as e:
|
|
328
|
+
self.logger.error(f"Error exporting tool settings for {self.tool_name}: {e}")
|
|
329
|
+
return False
|
|
330
|
+
|
|
331
|
+
def import_settings(self, filepath: str) -> bool:
|
|
332
|
+
"""
|
|
333
|
+
Import this tool's settings from a file.
|
|
334
|
+
|
|
335
|
+
Args:
|
|
336
|
+
filepath: Source file path
|
|
337
|
+
|
|
338
|
+
Returns:
|
|
339
|
+
True if successful, False otherwise
|
|
340
|
+
"""
|
|
341
|
+
try:
|
|
342
|
+
import json
|
|
343
|
+
import os
|
|
344
|
+
|
|
345
|
+
if not os.path.exists(filepath):
|
|
346
|
+
self.logger.error(f"Import file not found: {filepath}")
|
|
347
|
+
return False
|
|
348
|
+
|
|
349
|
+
with open(filepath, 'r', encoding='utf-8') as f:
|
|
350
|
+
imported_data = json.load(f)
|
|
351
|
+
|
|
352
|
+
# Handle different import formats
|
|
353
|
+
if self.tool_name in imported_data:
|
|
354
|
+
settings = imported_data[self.tool_name]
|
|
355
|
+
elif isinstance(imported_data, dict):
|
|
356
|
+
# Assume the entire file is settings for this tool
|
|
357
|
+
settings = imported_data
|
|
358
|
+
else:
|
|
359
|
+
self.logger.error("Invalid import file format")
|
|
360
|
+
return False
|
|
361
|
+
|
|
362
|
+
self.update_settings(settings)
|
|
363
|
+
self.logger.info(f"Tool settings for {self.tool_name} imported from {filepath}")
|
|
364
|
+
return True
|
|
365
|
+
|
|
366
|
+
except Exception as e:
|
|
367
|
+
self.logger.error(f"Error importing tool settings for {self.tool_name}: {e}")
|
|
368
|
+
return False
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
# Convenience functions for backward compatibility
|
|
372
|
+
|
|
373
|
+
def create_find_replace_settings_manager(database_settings_manager: DatabaseSettingsManager,
|
|
374
|
+
logger=None) -> DatabaseSettingsManagerAdapter:
|
|
375
|
+
"""
|
|
376
|
+
Create a settings manager compatible with FindReplaceWidget.
|
|
377
|
+
|
|
378
|
+
Args:
|
|
379
|
+
database_settings_manager: DatabaseSettingsManager instance
|
|
380
|
+
logger: Optional logger instance
|
|
381
|
+
|
|
382
|
+
Returns:
|
|
383
|
+
DatabaseSettingsManagerAdapter instance
|
|
384
|
+
"""
|
|
385
|
+
return DatabaseSettingsManagerAdapter(database_settings_manager, logger)
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
def create_legacy_settings_manager(database_settings_manager: DatabaseSettingsManager,
|
|
389
|
+
logger=None) -> DatabasePromeraAISettingsManager:
|
|
390
|
+
"""
|
|
391
|
+
Create a legacy-compatible settings manager.
|
|
392
|
+
|
|
393
|
+
This function provides backward compatibility for code that expects
|
|
394
|
+
the original PromeraAISettingsManager interface.
|
|
395
|
+
|
|
396
|
+
Args:
|
|
397
|
+
database_settings_manager: DatabaseSettingsManager instance
|
|
398
|
+
logger: Optional logger instance
|
|
399
|
+
|
|
400
|
+
Returns:
|
|
401
|
+
DatabasePromeraAISettingsManager instance
|
|
402
|
+
"""
|
|
403
|
+
return DatabasePromeraAISettingsManager(database_settings_manager, logger)
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
# Global factory instance for easy access
|
|
407
|
+
_global_factory: Optional[DatabaseSettingsManagerFactory] = None
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
def initialize_global_settings_factory(db_path: str = ":memory:",
|
|
411
|
+
backup_path: Optional[str] = None,
|
|
412
|
+
json_settings_path: str = "settings.json",
|
|
413
|
+
logger=None) -> DatabaseSettingsManagerFactory:
|
|
414
|
+
"""
|
|
415
|
+
Initialize the global settings manager factory.
|
|
416
|
+
|
|
417
|
+
Args:
|
|
418
|
+
db_path: Path to SQLite database file
|
|
419
|
+
backup_path: Path for automatic backups
|
|
420
|
+
json_settings_path: Path to JSON settings file for migration
|
|
421
|
+
logger: Optional logger instance
|
|
422
|
+
|
|
423
|
+
Returns:
|
|
424
|
+
DatabaseSettingsManagerFactory instance
|
|
425
|
+
"""
|
|
426
|
+
global _global_factory
|
|
427
|
+
_global_factory = DatabaseSettingsManagerFactory(
|
|
428
|
+
db_path=db_path,
|
|
429
|
+
backup_path=backup_path,
|
|
430
|
+
json_settings_path=json_settings_path,
|
|
431
|
+
logger=logger
|
|
432
|
+
)
|
|
433
|
+
return _global_factory
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
def get_global_settings_factory() -> DatabaseSettingsManagerFactory:
|
|
437
|
+
"""
|
|
438
|
+
Get the global settings manager factory.
|
|
439
|
+
|
|
440
|
+
Returns:
|
|
441
|
+
DatabaseSettingsManagerFactory instance
|
|
442
|
+
|
|
443
|
+
Raises:
|
|
444
|
+
RuntimeError: If factory not initialized
|
|
445
|
+
"""
|
|
446
|
+
global _global_factory
|
|
447
|
+
if _global_factory is None:
|
|
448
|
+
raise RuntimeError("Global settings factory not initialized. Call initialize_global_settings_factory() first.")
|
|
449
|
+
return _global_factory
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
def close_global_settings_factory() -> None:
|
|
453
|
+
"""Close the global settings manager factory."""
|
|
454
|
+
global _global_factory
|
|
455
|
+
if _global_factory is not None:
|
|
456
|
+
_global_factory.close_all()
|
|
457
457
|
_global_factory = None
|