mdb-engine 0.1.6__py3-none-any.whl
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.
- mdb_engine/README.md +144 -0
- mdb_engine/__init__.py +37 -0
- mdb_engine/auth/README.md +631 -0
- mdb_engine/auth/__init__.py +128 -0
- mdb_engine/auth/casbin_factory.py +199 -0
- mdb_engine/auth/casbin_models.py +46 -0
- mdb_engine/auth/config_defaults.py +71 -0
- mdb_engine/auth/config_helpers.py +213 -0
- mdb_engine/auth/cookie_utils.py +158 -0
- mdb_engine/auth/decorators.py +350 -0
- mdb_engine/auth/dependencies.py +747 -0
- mdb_engine/auth/helpers.py +64 -0
- mdb_engine/auth/integration.py +578 -0
- mdb_engine/auth/jwt.py +225 -0
- mdb_engine/auth/middleware.py +241 -0
- mdb_engine/auth/oso_factory.py +323 -0
- mdb_engine/auth/provider.py +570 -0
- mdb_engine/auth/restrictions.py +271 -0
- mdb_engine/auth/session_manager.py +477 -0
- mdb_engine/auth/token_lifecycle.py +213 -0
- mdb_engine/auth/token_store.py +289 -0
- mdb_engine/auth/users.py +1516 -0
- mdb_engine/auth/utils.py +614 -0
- mdb_engine/cli/__init__.py +13 -0
- mdb_engine/cli/commands/__init__.py +7 -0
- mdb_engine/cli/commands/generate.py +105 -0
- mdb_engine/cli/commands/migrate.py +83 -0
- mdb_engine/cli/commands/show.py +70 -0
- mdb_engine/cli/commands/validate.py +63 -0
- mdb_engine/cli/main.py +41 -0
- mdb_engine/cli/utils.py +92 -0
- mdb_engine/config.py +217 -0
- mdb_engine/constants.py +160 -0
- mdb_engine/core/README.md +542 -0
- mdb_engine/core/__init__.py +42 -0
- mdb_engine/core/app_registration.py +392 -0
- mdb_engine/core/connection.py +243 -0
- mdb_engine/core/engine.py +749 -0
- mdb_engine/core/index_management.py +162 -0
- mdb_engine/core/manifest.py +2793 -0
- mdb_engine/core/seeding.py +179 -0
- mdb_engine/core/service_initialization.py +355 -0
- mdb_engine/core/types.py +413 -0
- mdb_engine/database/README.md +522 -0
- mdb_engine/database/__init__.py +31 -0
- mdb_engine/database/abstraction.py +635 -0
- mdb_engine/database/connection.py +387 -0
- mdb_engine/database/scoped_wrapper.py +1721 -0
- mdb_engine/embeddings/README.md +184 -0
- mdb_engine/embeddings/__init__.py +62 -0
- mdb_engine/embeddings/dependencies.py +193 -0
- mdb_engine/embeddings/service.py +759 -0
- mdb_engine/exceptions.py +167 -0
- mdb_engine/indexes/README.md +651 -0
- mdb_engine/indexes/__init__.py +21 -0
- mdb_engine/indexes/helpers.py +145 -0
- mdb_engine/indexes/manager.py +895 -0
- mdb_engine/memory/README.md +451 -0
- mdb_engine/memory/__init__.py +30 -0
- mdb_engine/memory/service.py +1285 -0
- mdb_engine/observability/README.md +515 -0
- mdb_engine/observability/__init__.py +42 -0
- mdb_engine/observability/health.py +296 -0
- mdb_engine/observability/logging.py +161 -0
- mdb_engine/observability/metrics.py +297 -0
- mdb_engine/routing/README.md +462 -0
- mdb_engine/routing/__init__.py +73 -0
- mdb_engine/routing/websockets.py +813 -0
- mdb_engine/utils/__init__.py +7 -0
- mdb_engine-0.1.6.dist-info/METADATA +213 -0
- mdb_engine-0.1.6.dist-info/RECORD +75 -0
- mdb_engine-0.1.6.dist-info/WHEEL +5 -0
- mdb_engine-0.1.6.dist-info/entry_points.txt +2 -0
- mdb_engine-0.1.6.dist-info/licenses/LICENSE +661 -0
- mdb_engine-0.1.6.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Helper functions for index management.
|
|
3
|
+
|
|
4
|
+
This module contains shared utility functions to reduce code duplication
|
|
5
|
+
in index creation and management.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
from typing import Any, Dict, List, Optional, Tuple, Union
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def normalize_keys(
|
|
15
|
+
keys: Union[Dict[str, Any], List[Tuple[str, Any]]]
|
|
16
|
+
) -> List[Tuple[str, Any]]:
|
|
17
|
+
"""
|
|
18
|
+
Normalize index keys to a consistent format.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
keys: Index keys as dict or list of tuples
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
List of (field_name, direction) tuples
|
|
25
|
+
"""
|
|
26
|
+
if isinstance(keys, dict):
|
|
27
|
+
return [(k, v) for k, v in keys.items()]
|
|
28
|
+
return keys
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def keys_to_dict(keys: Union[Dict[str, Any], List[Tuple[str, Any]]]) -> Dict[str, Any]:
|
|
32
|
+
"""
|
|
33
|
+
Convert index keys to dictionary format for comparison.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
keys: Index keys as dict or list of tuples
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
Dictionary representation of keys
|
|
40
|
+
"""
|
|
41
|
+
if isinstance(keys, dict):
|
|
42
|
+
return keys
|
|
43
|
+
return {k: v for k, v in keys}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def is_id_index(keys: Union[Dict[str, Any], List[Tuple[str, Any]]]) -> bool:
|
|
47
|
+
"""
|
|
48
|
+
Check if index keys target the _id field (which MongoDB creates automatically).
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
keys: Index keys to check
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
True if this is an _id index
|
|
55
|
+
"""
|
|
56
|
+
if isinstance(keys, dict):
|
|
57
|
+
return len(keys) == 1 and "_id" in keys
|
|
58
|
+
elif isinstance(keys, list):
|
|
59
|
+
return len(keys) == 1 and len(keys[0]) >= 1 and keys[0][0] == "_id"
|
|
60
|
+
return False
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
async def check_and_update_index(
|
|
64
|
+
index_manager: Any,
|
|
65
|
+
index_name: str,
|
|
66
|
+
expected_keys: Union[Dict[str, Any], List[Tuple[str, Any]]],
|
|
67
|
+
expected_options: Optional[Dict[str, Any]] = None,
|
|
68
|
+
log_prefix: str = "",
|
|
69
|
+
) -> Tuple[bool, Optional[Dict[str, Any]]]:
|
|
70
|
+
"""
|
|
71
|
+
Check if an index exists and matches the expected definition.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
index_manager: AsyncAtlasIndexManager instance
|
|
75
|
+
index_name: Name of the index
|
|
76
|
+
expected_keys: Expected index keys
|
|
77
|
+
expected_options: Expected index options (for comparison)
|
|
78
|
+
log_prefix: Logging prefix for messages
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
Tuple of (index_exists, existing_index_dict or None)
|
|
82
|
+
If index exists and matches, returns (True, existing_index)
|
|
83
|
+
If index exists but doesn't match, returns (True, None) and drops it
|
|
84
|
+
If index doesn't exist, returns (False, None)
|
|
85
|
+
"""
|
|
86
|
+
existing_index = await index_manager.get_index(index_name)
|
|
87
|
+
|
|
88
|
+
if not existing_index:
|
|
89
|
+
return (False, None)
|
|
90
|
+
|
|
91
|
+
# Compare keys
|
|
92
|
+
existing_key = existing_index.get("key", {})
|
|
93
|
+
expected_key_dict = keys_to_dict(expected_keys)
|
|
94
|
+
|
|
95
|
+
keys_match = existing_key == expected_key_dict
|
|
96
|
+
|
|
97
|
+
# Compare options if provided
|
|
98
|
+
options_match = True
|
|
99
|
+
if expected_options:
|
|
100
|
+
for key, value in expected_options.items():
|
|
101
|
+
if key == "name":
|
|
102
|
+
continue # Skip name comparison
|
|
103
|
+
if existing_index.get(key) != value:
|
|
104
|
+
options_match = False
|
|
105
|
+
break
|
|
106
|
+
|
|
107
|
+
if keys_match and options_match:
|
|
108
|
+
return (True, existing_index)
|
|
109
|
+
|
|
110
|
+
# Index exists but doesn't match - drop it
|
|
111
|
+
logger.warning(
|
|
112
|
+
f"{log_prefix} Index '{index_name}' definition mismatch. "
|
|
113
|
+
f"Existing: keys={existing_key}, Expected: keys={expected_key_dict}. "
|
|
114
|
+
f"Dropping existing index and recreating."
|
|
115
|
+
)
|
|
116
|
+
await index_manager.drop_index(index_name)
|
|
117
|
+
return (True, None)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def validate_index_definition_basic(
|
|
121
|
+
index_def: Dict[str, Any],
|
|
122
|
+
index_name: str,
|
|
123
|
+
required_fields: List[str],
|
|
124
|
+
log_prefix: str = "",
|
|
125
|
+
) -> Tuple[bool, Optional[str]]:
|
|
126
|
+
"""
|
|
127
|
+
Basic validation for index definitions.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
index_def: Index definition dictionary
|
|
131
|
+
index_name: Name of the index
|
|
132
|
+
required_fields: List of required field names
|
|
133
|
+
log_prefix: Logging prefix
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
Tuple of (is_valid, error_message)
|
|
137
|
+
"""
|
|
138
|
+
for field in required_fields:
|
|
139
|
+
if field not in index_def or not index_def[field]:
|
|
140
|
+
return (
|
|
141
|
+
False,
|
|
142
|
+
f"{log_prefix} Missing '{field}' field on index '{index_name}'. "
|
|
143
|
+
f"Index requires a '{field}' field. Skipping this index definition.",
|
|
144
|
+
)
|
|
145
|
+
return (True, None)
|