vector-inspector 0.3.1__tar.gz → 0.3.3__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.
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/PKG-INFO +9 -2
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/README.md +6 -1
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/pyproject.toml +62 -17
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/connection_manager.py +55 -49
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/connections/base_connection.py +41 -41
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/connections/chroma_connection.py +110 -86
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/connections/pinecone_connection.py +168 -182
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/connections/qdrant_connection.py +109 -126
- vector_inspector-0.3.3/src/vector_inspector/core/connections/qdrant_helpers/__init__.py +4 -0
- vector_inspector-0.3.3/src/vector_inspector/core/connections/qdrant_helpers/qdrant_embedding_resolver.py +35 -0
- vector_inspector-0.3.3/src/vector_inspector/core/connections/qdrant_helpers/qdrant_filter_builder.py +51 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/connections/template_connection.py +55 -65
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/embedding_utils.py +32 -32
- vector_inspector-0.3.3/src/vector_inspector/core/logging.py +27 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/model_registry.py +4 -3
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/main.py +6 -2
- vector_inspector-0.3.3/src/vector_inspector/services/backup_helpers.py +63 -0
- vector_inspector-0.3.3/src/vector_inspector/services/backup_restore_service.py +197 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/services/credential_service.py +33 -40
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/services/import_export_service.py +70 -67
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/services/profile_service.py +92 -94
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/services/settings_service.py +68 -48
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/services/visualization_service.py +40 -39
- vector_inspector-0.3.3/src/vector_inspector/ui/components/splash_window.py +57 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/dialogs/cross_db_migration.py +6 -5
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/main_window.py +200 -146
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/views/info_panel.py +208 -127
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/views/metadata_view.py +8 -7
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/views/search_view.py +97 -75
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/views/visualization_view.py +140 -97
- vector_inspector-0.3.3/src/vector_inspector/utils/version.py +5 -0
- vector_inspector-0.3.3/tests/test_backup_helpers.py +22 -0
- vector_inspector-0.3.3/tests/test_backup_restore_service.py +97 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/tests/test_pinecone_connection.py +5 -2
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/tests/test_settings_service.py +5 -5
- vector_inspector-0.3.1/src/vector_inspector/services/backup_restore_service.py +0 -276
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/__init__.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/__main__.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/config/__init__.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/config/known_embedding_models.json +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/__init__.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/cache_manager.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/connections/__init__.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/embedding_providers/__init__.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/embedding_providers/base_provider.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/embedding_providers/clip_provider.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/embedding_providers/provider_factory.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/embedding_providers/sentence_transformer_provider.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/services/__init__.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/services/filter_service.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/__init__.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/components/__init__.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/components/backup_restore_dialog.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/components/connection_manager_panel.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/components/filter_builder.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/components/item_dialog.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/components/loading_dialog.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/components/profile_manager_panel.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/dialogs/__init__.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/dialogs/embedding_config_dialog.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/dialogs/provider_type_dialog.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/views/__init__.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/views/collection_browser.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/ui/views/connection_view.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/utils/__init__.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/utils/lazy_imports.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/tests/test_connections.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/tests/test_filter_service.py +0 -0
- {vector_inspector-0.3.1 → vector_inspector-0.3.3}/tests/test_runner.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: vector-inspector
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: A comprehensive desktop application for visualizing, querying, and managing vector database data
|
|
5
5
|
Author-Email: Anthony Dawson <anthonypdawson+github@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -24,6 +24,8 @@ Requires-Dist: pyarrow>=14.0.0
|
|
|
24
24
|
Requires-Dist: pinecone>=8.0.0
|
|
25
25
|
Requires-Dist: keyring>=25.7.0
|
|
26
26
|
Requires-Dist: hf-xet>=1.2.0
|
|
27
|
+
Requires-Dist: pymilvus>=2.6.6
|
|
28
|
+
Requires-Dist: lancedb>=0.27.0
|
|
27
29
|
Description-Content-Type: text/markdown
|
|
28
30
|
|
|
29
31
|
|
|
@@ -31,7 +33,10 @@ Description-Content-Type: text/markdown
|
|
|
31
33
|
|
|
32
34
|
> **Disclaimer:** This tool is currently under active development and is **not production ready**. Not all features have been thoroughly tested and code is released frequently. Use with caution in critical or production environments.
|
|
33
35
|
|
|
34
|
-
](https://github.com/anthonypdawson/vector-inspector/actions/workflows/ci-tests.yml)
|
|
37
|
+
[](https://github.com/anthonypdawson/vector-inspector/actions/workflows/publish.yml)
|
|
38
|
+
|
|
39
|
+
[](https://pypi.org/project/vector-inspector/)
|
|
35
40
|
[](https://pepy.tech/projects/vector-inspector)
|
|
36
41
|
|
|
37
42
|
|
|
@@ -62,8 +67,10 @@ Vector Inspector bridges the gap between vector databases and user-friendly data
|
|
|
62
67
|
- Connect to vector databases:
|
|
63
68
|
- ChromaDB (persistent local storage)
|
|
64
69
|
- Qdrant (remote server or embedded local)
|
|
70
|
+
- Pinecone (cloud-hosted)
|
|
65
71
|
- Unified interface regardless of backend provider
|
|
66
72
|
- Automatically saves last connection configuration
|
|
73
|
+
- Secure API key storage for cloud providers
|
|
67
74
|
|
|
68
75
|
### 2. **Data Visualization**
|
|
69
76
|
- **Metadata Explorer**: Browse and filter vector entries by metadata fields
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
|
|
4
4
|
> **Disclaimer:** This tool is currently under active development and is **not production ready**. Not all features have been thoroughly tested and code is released frequently. Use with caution in critical or production environments.
|
|
5
5
|
|
|
6
|
-
](https://github.com/anthonypdawson/vector-inspector/actions/workflows/ci-tests.yml)
|
|
7
|
+
[](https://github.com/anthonypdawson/vector-inspector/actions/workflows/publish.yml)
|
|
8
|
+
|
|
9
|
+
[](https://pypi.org/project/vector-inspector/)
|
|
7
10
|
[](https://pepy.tech/projects/vector-inspector)
|
|
8
11
|
|
|
9
12
|
|
|
@@ -34,8 +37,10 @@ Vector Inspector bridges the gap between vector databases and user-friendly data
|
|
|
34
37
|
- Connect to vector databases:
|
|
35
38
|
- ChromaDB (persistent local storage)
|
|
36
39
|
- Qdrant (remote server or embedded local)
|
|
40
|
+
- Pinecone (cloud-hosted)
|
|
37
41
|
- Unified interface regardless of backend provider
|
|
38
42
|
- Automatically saves last connection configuration
|
|
43
|
+
- Secure API key storage for cloud providers
|
|
39
44
|
|
|
40
45
|
### 2. **Data Visualization**
|
|
41
46
|
- **Metadata Explorer**: Browse and filter vector entries by metadata fields
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "vector-inspector"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.3"
|
|
4
4
|
description = "A comprehensive desktop application for visualizing, querying, and managing vector database data"
|
|
5
5
|
authors = [
|
|
6
6
|
{ name = "Anthony Dawson", email = "anthonypdawson+github@gmail.com" },
|
|
@@ -21,6 +21,8 @@ dependencies = [
|
|
|
21
21
|
"pinecone>=8.0.0",
|
|
22
22
|
"keyring>=25.7.0",
|
|
23
23
|
"hf-xet>=1.2.0",
|
|
24
|
+
"pymilvus>=2.6.6",
|
|
25
|
+
"lancedb>=0.27.0",
|
|
24
26
|
]
|
|
25
27
|
requires-python = ">=3.10,<3.13"
|
|
26
28
|
readme = "README.md"
|
|
@@ -37,6 +39,65 @@ Documentation = "https://github.com/anthonypdawson/vector-inspector#readme"
|
|
|
37
39
|
[project.scripts]
|
|
38
40
|
vector-inspector = "vector_inspector.main:main"
|
|
39
41
|
|
|
42
|
+
[build-system]
|
|
43
|
+
requires = [
|
|
44
|
+
"pdm-backend",
|
|
45
|
+
]
|
|
46
|
+
build-backend = "pdm.backend"
|
|
47
|
+
|
|
48
|
+
[dependency-groups]
|
|
49
|
+
dev = [
|
|
50
|
+
"pytest>=7.4.0",
|
|
51
|
+
"pytest-qt>=4.2.0",
|
|
52
|
+
"black>=23.12.0",
|
|
53
|
+
"ruff>=0.14.14",
|
|
54
|
+
"mypy>=1.19.1",
|
|
55
|
+
"ipython>=8.18.0",
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
[tool.ruff]
|
|
59
|
+
line-length = 100
|
|
60
|
+
target-version = "py310"
|
|
61
|
+
extend-exclude = [
|
|
62
|
+
"build",
|
|
63
|
+
"dist",
|
|
64
|
+
".venv",
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
[tool.ruff.format]
|
|
68
|
+
quote-style = "double"
|
|
69
|
+
indent-style = "space"
|
|
70
|
+
line-ending = "auto"
|
|
71
|
+
skip-magic-trailing-comma = false
|
|
72
|
+
|
|
73
|
+
[tool.ruff.lint]
|
|
74
|
+
select = [
|
|
75
|
+
"E",
|
|
76
|
+
"F",
|
|
77
|
+
"W",
|
|
78
|
+
"I",
|
|
79
|
+
"UP",
|
|
80
|
+
"B",
|
|
81
|
+
"A",
|
|
82
|
+
"C4",
|
|
83
|
+
"DTZ",
|
|
84
|
+
"T20",
|
|
85
|
+
"RET",
|
|
86
|
+
"SIM",
|
|
87
|
+
"ARG",
|
|
88
|
+
"RUF",
|
|
89
|
+
]
|
|
90
|
+
ignore = [
|
|
91
|
+
"E501",
|
|
92
|
+
"I001",
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
[tool.ruff.lint.isort]
|
|
96
|
+
combine-as-imports = true
|
|
97
|
+
known-first-party = [
|
|
98
|
+
"vector_inspector",
|
|
99
|
+
]
|
|
100
|
+
|
|
40
101
|
[tool.pdm]
|
|
41
102
|
distribution = true
|
|
42
103
|
|
|
@@ -48,19 +109,3 @@ cmd = "python -m vector_inspector.main"
|
|
|
48
109
|
|
|
49
110
|
[tool.pdm.scripts.vector-inspector.env]
|
|
50
111
|
PYTHONPATH = "src"
|
|
51
|
-
|
|
52
|
-
[tool.pdm.dev-dependencies]
|
|
53
|
-
dev = [
|
|
54
|
-
"pytest>=7.4.0",
|
|
55
|
-
"pytest-qt>=4.2.0",
|
|
56
|
-
"black>=23.12.0",
|
|
57
|
-
"ruff>=0.1.0",
|
|
58
|
-
"mypy>=1.7.0",
|
|
59
|
-
"ipython>=8.18.0",
|
|
60
|
-
]
|
|
61
|
-
|
|
62
|
-
[build-system]
|
|
63
|
-
requires = [
|
|
64
|
-
"pdm-backend",
|
|
65
|
-
]
|
|
66
|
-
build-backend = "pdm.backend"
|
{vector_inspector-0.3.1 → vector_inspector-0.3.3}/src/vector_inspector/core/connection_manager.py
RENAMED
|
@@ -6,10 +6,12 @@ from enum import Enum
|
|
|
6
6
|
from PySide6.QtCore import QObject, Signal
|
|
7
7
|
|
|
8
8
|
from .connections.base_connection import VectorDBConnection
|
|
9
|
+
from vector_inspector.core.logging import log_error
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
class ConnectionState(Enum):
|
|
12
13
|
"""Possible connection states."""
|
|
14
|
+
|
|
13
15
|
DISCONNECTED = "disconnected"
|
|
14
16
|
CONNECTING = "connecting"
|
|
15
17
|
CONNECTED = "connected"
|
|
@@ -18,18 +20,18 @@ class ConnectionState(Enum):
|
|
|
18
20
|
|
|
19
21
|
class ConnectionInstance:
|
|
20
22
|
"""Represents a single active connection with its state and context."""
|
|
21
|
-
|
|
23
|
+
|
|
22
24
|
def __init__(
|
|
23
25
|
self,
|
|
24
26
|
connection_id: str,
|
|
25
27
|
name: str,
|
|
26
28
|
provider: str,
|
|
27
29
|
connection: VectorDBConnection,
|
|
28
|
-
config: Dict[str, Any]
|
|
30
|
+
config: Dict[str, Any],
|
|
29
31
|
):
|
|
30
32
|
"""
|
|
31
33
|
Initialize a connection instance.
|
|
32
|
-
|
|
34
|
+
|
|
33
35
|
Args:
|
|
34
36
|
connection_id: Unique connection identifier
|
|
35
37
|
name: User-friendly connection name
|
|
@@ -46,11 +48,11 @@ class ConnectionInstance:
|
|
|
46
48
|
self.active_collection: Optional[str] = None
|
|
47
49
|
self.collections: List[str] = []
|
|
48
50
|
self.error_message: Optional[str] = None
|
|
49
|
-
|
|
51
|
+
|
|
50
52
|
def get_display_name(self) -> str:
|
|
51
53
|
"""Get a display-friendly connection name."""
|
|
52
54
|
return f"{self.name} ({self.provider})"
|
|
53
|
-
|
|
55
|
+
|
|
54
56
|
def get_breadcrumb(self) -> str:
|
|
55
57
|
"""Get breadcrumb showing connection > collection."""
|
|
56
58
|
if self.active_collection:
|
|
@@ -60,7 +62,7 @@ class ConnectionInstance:
|
|
|
60
62
|
|
|
61
63
|
class ConnectionManager(QObject):
|
|
62
64
|
"""Manages multiple vector database connections and saved profiles.
|
|
63
|
-
|
|
65
|
+
|
|
64
66
|
Signals:
|
|
65
67
|
connection_opened: Emitted when a new connection is opened (connection_id)
|
|
66
68
|
connection_closed: Emitted when a connection is closed (connection_id)
|
|
@@ -69,7 +71,7 @@ class ConnectionManager(QObject):
|
|
|
69
71
|
active_collection_changed: Emitted when active collection changes (connection_id, collection_name or None)
|
|
70
72
|
collections_updated: Emitted when collections list is updated (connection_id, collections)
|
|
71
73
|
"""
|
|
72
|
-
|
|
74
|
+
|
|
73
75
|
# Signals
|
|
74
76
|
connection_opened = Signal(str) # connection_id
|
|
75
77
|
connection_closed = Signal(str) # connection_id
|
|
@@ -77,116 +79,119 @@ class ConnectionManager(QObject):
|
|
|
77
79
|
active_connection_changed = Signal(object) # connection_id or None
|
|
78
80
|
active_collection_changed = Signal(str, object) # connection_id, collection_name or None
|
|
79
81
|
collections_updated = Signal(str, list) # connection_id, collections
|
|
80
|
-
|
|
82
|
+
|
|
81
83
|
MAX_CONNECTIONS = 10 # Limit to prevent resource exhaustion
|
|
82
|
-
|
|
84
|
+
|
|
83
85
|
def __init__(self):
|
|
84
86
|
"""Initialize the connection manager."""
|
|
85
87
|
super().__init__()
|
|
86
88
|
self._connections: Dict[str, ConnectionInstance] = {}
|
|
87
89
|
self._active_connection_id: Optional[str] = None
|
|
88
|
-
|
|
90
|
+
|
|
89
91
|
def create_connection(
|
|
90
92
|
self,
|
|
91
93
|
name: str,
|
|
92
94
|
provider: str,
|
|
93
95
|
connection: VectorDBConnection,
|
|
94
|
-
config: Dict[str, Any]
|
|
96
|
+
config: Dict[str, Any],
|
|
97
|
+
connection_id: str = None,
|
|
95
98
|
) -> str:
|
|
96
99
|
"""
|
|
97
100
|
Create a new connection instance (not yet connected).
|
|
98
|
-
|
|
101
|
+
|
|
99
102
|
Args:
|
|
100
103
|
name: User-friendly connection name
|
|
101
104
|
provider: Provider type
|
|
102
105
|
connection: The connection object
|
|
103
106
|
config: Connection configuration
|
|
104
|
-
|
|
107
|
+
connection_id: Optional. Use this ID instead of generating a new one (for profiles).
|
|
108
|
+
|
|
105
109
|
Returns:
|
|
106
110
|
The connection ID
|
|
107
|
-
|
|
111
|
+
|
|
108
112
|
Raises:
|
|
109
113
|
RuntimeError: If maximum connections limit reached
|
|
110
114
|
"""
|
|
111
115
|
if len(self._connections) >= self.MAX_CONNECTIONS:
|
|
112
116
|
raise RuntimeError(f"Maximum number of connections ({self.MAX_CONNECTIONS}) reached")
|
|
113
|
-
|
|
114
|
-
connection_id
|
|
117
|
+
|
|
118
|
+
if connection_id is None:
|
|
119
|
+
connection_id = str(uuid.uuid4())
|
|
115
120
|
instance = ConnectionInstance(connection_id, name, provider, connection, config)
|
|
116
121
|
self._connections[connection_id] = instance
|
|
117
|
-
|
|
122
|
+
|
|
118
123
|
# Set as active if it's the first connection
|
|
119
124
|
if len(self._connections) == 1:
|
|
120
125
|
self._active_connection_id = connection_id
|
|
121
126
|
self.active_connection_changed.emit(connection_id)
|
|
122
|
-
|
|
127
|
+
|
|
123
128
|
# Don't emit connection_opened yet - wait until actually connected
|
|
124
129
|
return connection_id
|
|
125
|
-
|
|
130
|
+
|
|
126
131
|
def mark_connection_opened(self, connection_id: str):
|
|
127
132
|
"""
|
|
128
133
|
Mark a connection as opened (after successful connection).
|
|
129
|
-
|
|
134
|
+
|
|
130
135
|
Args:
|
|
131
136
|
connection_id: ID of connection that opened
|
|
132
137
|
"""
|
|
133
138
|
if connection_id in self._connections:
|
|
134
139
|
self.connection_opened.emit(connection_id)
|
|
135
|
-
|
|
140
|
+
|
|
136
141
|
def get_connection(self, connection_id: str) -> Optional[ConnectionInstance]:
|
|
137
142
|
"""Get a connection instance by ID."""
|
|
138
143
|
return self._connections.get(connection_id)
|
|
139
|
-
|
|
144
|
+
|
|
140
145
|
def get_active_connection(self) -> Optional[ConnectionInstance]:
|
|
141
146
|
"""Get the currently active connection instance."""
|
|
142
147
|
if self._active_connection_id:
|
|
143
148
|
return self._connections.get(self._active_connection_id)
|
|
144
149
|
return None
|
|
145
|
-
|
|
150
|
+
|
|
146
151
|
def get_active_connection_id(self) -> Optional[str]:
|
|
147
152
|
"""Get the currently active connection ID."""
|
|
148
153
|
return self._active_connection_id
|
|
149
|
-
|
|
154
|
+
|
|
150
155
|
def set_active_connection(self, connection_id: str) -> bool:
|
|
151
156
|
"""
|
|
152
157
|
Set the active connection.
|
|
153
|
-
|
|
158
|
+
|
|
154
159
|
Args:
|
|
155
160
|
connection_id: ID of connection to make active
|
|
156
|
-
|
|
161
|
+
|
|
157
162
|
Returns:
|
|
158
163
|
True if successful, False if connection not found
|
|
159
164
|
"""
|
|
160
165
|
if connection_id not in self._connections:
|
|
161
166
|
return False
|
|
162
|
-
|
|
167
|
+
|
|
163
168
|
self._active_connection_id = connection_id
|
|
164
169
|
self.active_connection_changed.emit(connection_id)
|
|
165
170
|
return True
|
|
166
|
-
|
|
171
|
+
|
|
167
172
|
def close_connection(self, connection_id: str) -> bool:
|
|
168
173
|
"""
|
|
169
174
|
Close and remove a connection.
|
|
170
|
-
|
|
175
|
+
|
|
171
176
|
Args:
|
|
172
177
|
connection_id: ID of connection to close
|
|
173
|
-
|
|
178
|
+
|
|
174
179
|
Returns:
|
|
175
180
|
True if successful, False if connection not found
|
|
176
181
|
"""
|
|
177
182
|
instance = self._connections.get(connection_id)
|
|
178
183
|
if not instance:
|
|
179
184
|
return False
|
|
180
|
-
|
|
185
|
+
|
|
181
186
|
# Disconnect the connection
|
|
182
187
|
try:
|
|
183
188
|
instance.connection.disconnect()
|
|
184
189
|
except Exception as e:
|
|
185
|
-
|
|
186
|
-
|
|
190
|
+
log_error("Error disconnecting: %s", e)
|
|
191
|
+
|
|
187
192
|
# Remove from connections dict
|
|
188
193
|
del self._connections[connection_id]
|
|
189
|
-
|
|
194
|
+
|
|
190
195
|
# If this was the active connection, set a new one or None
|
|
191
196
|
if self._active_connection_id == connection_id:
|
|
192
197
|
if self._connections:
|
|
@@ -196,14 +201,16 @@ class ConnectionManager(QObject):
|
|
|
196
201
|
else:
|
|
197
202
|
self._active_connection_id = None
|
|
198
203
|
self.active_connection_changed.emit(None)
|
|
199
|
-
|
|
204
|
+
|
|
200
205
|
self.connection_closed.emit(connection_id)
|
|
201
206
|
return True
|
|
202
|
-
|
|
203
|
-
def update_connection_state(
|
|
207
|
+
|
|
208
|
+
def update_connection_state(
|
|
209
|
+
self, connection_id: str, state: ConnectionState, error: Optional[str] = None
|
|
210
|
+
):
|
|
204
211
|
"""
|
|
205
212
|
Update the state of a connection.
|
|
206
|
-
|
|
213
|
+
|
|
207
214
|
Args:
|
|
208
215
|
connection_id: ID of connection
|
|
209
216
|
state: New connection state
|
|
@@ -217,11 +224,11 @@ class ConnectionManager(QObject):
|
|
|
217
224
|
else:
|
|
218
225
|
instance.error_message = None
|
|
219
226
|
self.connection_state_changed.emit(connection_id, state)
|
|
220
|
-
|
|
227
|
+
|
|
221
228
|
def update_collections(self, connection_id: str, collections: List[str]):
|
|
222
229
|
"""
|
|
223
230
|
Update the collections list for a connection.
|
|
224
|
-
|
|
231
|
+
|
|
225
232
|
Args:
|
|
226
233
|
connection_id: ID of connection
|
|
227
234
|
collections: List of collection names
|
|
@@ -230,11 +237,11 @@ class ConnectionManager(QObject):
|
|
|
230
237
|
if instance:
|
|
231
238
|
instance.collections = collections
|
|
232
239
|
self.collections_updated.emit(connection_id, collections)
|
|
233
|
-
|
|
240
|
+
|
|
234
241
|
def set_active_collection(self, connection_id: str, collection_name: Optional[str]):
|
|
235
242
|
"""
|
|
236
243
|
Set the active collection for a connection.
|
|
237
|
-
|
|
244
|
+
|
|
238
245
|
Args:
|
|
239
246
|
connection_id: ID of connection
|
|
240
247
|
collection_name: Name of collection to make active, or None
|
|
@@ -243,29 +250,29 @@ class ConnectionManager(QObject):
|
|
|
243
250
|
if instance:
|
|
244
251
|
instance.active_collection = collection_name
|
|
245
252
|
self.active_collection_changed.emit(connection_id, collection_name)
|
|
246
|
-
|
|
253
|
+
|
|
247
254
|
def get_all_connections(self) -> List[ConnectionInstance]:
|
|
248
255
|
"""Get list of all connection instances."""
|
|
249
256
|
return list(self._connections.values())
|
|
250
|
-
|
|
257
|
+
|
|
251
258
|
def get_connection_count(self) -> int:
|
|
252
259
|
"""Get the number of active connections."""
|
|
253
260
|
return len(self._connections)
|
|
254
|
-
|
|
261
|
+
|
|
255
262
|
def close_all_connections(self):
|
|
256
263
|
"""Close all connections. Typically called on application exit."""
|
|
257
264
|
connection_ids = list(self._connections.keys())
|
|
258
265
|
for conn_id in connection_ids:
|
|
259
266
|
self.close_connection(conn_id)
|
|
260
|
-
|
|
267
|
+
|
|
261
268
|
def rename_connection(self, connection_id: str, new_name: str) -> bool:
|
|
262
269
|
"""
|
|
263
270
|
Rename a connection.
|
|
264
|
-
|
|
271
|
+
|
|
265
272
|
Args:
|
|
266
273
|
connection_id: ID of connection
|
|
267
274
|
new_name: New name for the connection
|
|
268
|
-
|
|
275
|
+
|
|
269
276
|
Returns:
|
|
270
277
|
True if successful, False if connection not found
|
|
271
278
|
"""
|
|
@@ -274,4 +281,3 @@ class ConnectionManager(QObject):
|
|
|
274
281
|
instance.name = new_name
|
|
275
282
|
return True
|
|
276
283
|
return False
|
|
277
|
-
|