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.
Files changed (75) hide show
  1. mdb_engine/README.md +144 -0
  2. mdb_engine/__init__.py +37 -0
  3. mdb_engine/auth/README.md +631 -0
  4. mdb_engine/auth/__init__.py +128 -0
  5. mdb_engine/auth/casbin_factory.py +199 -0
  6. mdb_engine/auth/casbin_models.py +46 -0
  7. mdb_engine/auth/config_defaults.py +71 -0
  8. mdb_engine/auth/config_helpers.py +213 -0
  9. mdb_engine/auth/cookie_utils.py +158 -0
  10. mdb_engine/auth/decorators.py +350 -0
  11. mdb_engine/auth/dependencies.py +747 -0
  12. mdb_engine/auth/helpers.py +64 -0
  13. mdb_engine/auth/integration.py +578 -0
  14. mdb_engine/auth/jwt.py +225 -0
  15. mdb_engine/auth/middleware.py +241 -0
  16. mdb_engine/auth/oso_factory.py +323 -0
  17. mdb_engine/auth/provider.py +570 -0
  18. mdb_engine/auth/restrictions.py +271 -0
  19. mdb_engine/auth/session_manager.py +477 -0
  20. mdb_engine/auth/token_lifecycle.py +213 -0
  21. mdb_engine/auth/token_store.py +289 -0
  22. mdb_engine/auth/users.py +1516 -0
  23. mdb_engine/auth/utils.py +614 -0
  24. mdb_engine/cli/__init__.py +13 -0
  25. mdb_engine/cli/commands/__init__.py +7 -0
  26. mdb_engine/cli/commands/generate.py +105 -0
  27. mdb_engine/cli/commands/migrate.py +83 -0
  28. mdb_engine/cli/commands/show.py +70 -0
  29. mdb_engine/cli/commands/validate.py +63 -0
  30. mdb_engine/cli/main.py +41 -0
  31. mdb_engine/cli/utils.py +92 -0
  32. mdb_engine/config.py +217 -0
  33. mdb_engine/constants.py +160 -0
  34. mdb_engine/core/README.md +542 -0
  35. mdb_engine/core/__init__.py +42 -0
  36. mdb_engine/core/app_registration.py +392 -0
  37. mdb_engine/core/connection.py +243 -0
  38. mdb_engine/core/engine.py +749 -0
  39. mdb_engine/core/index_management.py +162 -0
  40. mdb_engine/core/manifest.py +2793 -0
  41. mdb_engine/core/seeding.py +179 -0
  42. mdb_engine/core/service_initialization.py +355 -0
  43. mdb_engine/core/types.py +413 -0
  44. mdb_engine/database/README.md +522 -0
  45. mdb_engine/database/__init__.py +31 -0
  46. mdb_engine/database/abstraction.py +635 -0
  47. mdb_engine/database/connection.py +387 -0
  48. mdb_engine/database/scoped_wrapper.py +1721 -0
  49. mdb_engine/embeddings/README.md +184 -0
  50. mdb_engine/embeddings/__init__.py +62 -0
  51. mdb_engine/embeddings/dependencies.py +193 -0
  52. mdb_engine/embeddings/service.py +759 -0
  53. mdb_engine/exceptions.py +167 -0
  54. mdb_engine/indexes/README.md +651 -0
  55. mdb_engine/indexes/__init__.py +21 -0
  56. mdb_engine/indexes/helpers.py +145 -0
  57. mdb_engine/indexes/manager.py +895 -0
  58. mdb_engine/memory/README.md +451 -0
  59. mdb_engine/memory/__init__.py +30 -0
  60. mdb_engine/memory/service.py +1285 -0
  61. mdb_engine/observability/README.md +515 -0
  62. mdb_engine/observability/__init__.py +42 -0
  63. mdb_engine/observability/health.py +296 -0
  64. mdb_engine/observability/logging.py +161 -0
  65. mdb_engine/observability/metrics.py +297 -0
  66. mdb_engine/routing/README.md +462 -0
  67. mdb_engine/routing/__init__.py +73 -0
  68. mdb_engine/routing/websockets.py +813 -0
  69. mdb_engine/utils/__init__.py +7 -0
  70. mdb_engine-0.1.6.dist-info/METADATA +213 -0
  71. mdb_engine-0.1.6.dist-info/RECORD +75 -0
  72. mdb_engine-0.1.6.dist-info/WHEEL +5 -0
  73. mdb_engine-0.1.6.dist-info/entry_points.txt +2 -0
  74. mdb_engine-0.1.6.dist-info/licenses/LICENSE +661 -0
  75. 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)