mdb-engine 0.2.1__py3-none-any.whl → 0.2.4__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/__init__.py +7 -1
- mdb_engine/auth/README.md +6 -0
- mdb_engine/auth/audit.py +40 -40
- mdb_engine/auth/base.py +3 -3
- mdb_engine/auth/casbin_factory.py +6 -6
- mdb_engine/auth/config_defaults.py +5 -5
- mdb_engine/auth/config_helpers.py +12 -12
- mdb_engine/auth/cookie_utils.py +9 -9
- mdb_engine/auth/csrf.py +9 -8
- mdb_engine/auth/decorators.py +7 -6
- mdb_engine/auth/dependencies.py +22 -21
- mdb_engine/auth/integration.py +9 -9
- mdb_engine/auth/jwt.py +9 -9
- mdb_engine/auth/middleware.py +4 -3
- mdb_engine/auth/oso_factory.py +6 -6
- mdb_engine/auth/provider.py +4 -4
- mdb_engine/auth/rate_limiter.py +12 -11
- mdb_engine/auth/restrictions.py +16 -15
- mdb_engine/auth/session_manager.py +11 -13
- mdb_engine/auth/shared_middleware.py +344 -132
- mdb_engine/auth/shared_users.py +20 -20
- mdb_engine/auth/token_lifecycle.py +10 -12
- mdb_engine/auth/token_store.py +4 -5
- mdb_engine/auth/users.py +51 -52
- mdb_engine/auth/utils.py +29 -33
- mdb_engine/cli/commands/generate.py +6 -6
- mdb_engine/cli/utils.py +4 -4
- mdb_engine/config.py +6 -7
- mdb_engine/core/app_registration.py +12 -12
- mdb_engine/core/app_secrets.py +1 -2
- mdb_engine/core/connection.py +3 -4
- mdb_engine/core/encryption.py +1 -2
- mdb_engine/core/engine.py +43 -44
- mdb_engine/core/manifest.py +80 -58
- mdb_engine/core/ray_integration.py +10 -9
- mdb_engine/core/seeding.py +3 -3
- mdb_engine/core/service_initialization.py +10 -9
- mdb_engine/core/types.py +40 -40
- mdb_engine/database/abstraction.py +15 -16
- mdb_engine/database/connection.py +40 -12
- mdb_engine/database/query_validator.py +8 -8
- mdb_engine/database/resource_limiter.py +7 -7
- mdb_engine/database/scoped_wrapper.py +51 -58
- mdb_engine/dependencies.py +14 -13
- mdb_engine/di/container.py +12 -13
- mdb_engine/di/providers.py +14 -13
- mdb_engine/di/scopes.py +5 -5
- mdb_engine/embeddings/dependencies.py +2 -2
- mdb_engine/embeddings/service.py +67 -50
- mdb_engine/exceptions.py +20 -20
- mdb_engine/indexes/helpers.py +11 -11
- mdb_engine/indexes/manager.py +9 -9
- mdb_engine/memory/README.md +93 -2
- mdb_engine/memory/service.py +361 -1109
- mdb_engine/observability/health.py +10 -9
- mdb_engine/observability/logging.py +10 -10
- mdb_engine/observability/metrics.py +8 -7
- mdb_engine/repositories/base.py +25 -25
- mdb_engine/repositories/mongo.py +17 -17
- mdb_engine/repositories/unit_of_work.py +6 -6
- mdb_engine/routing/websockets.py +19 -18
- mdb_engine/utils/__init__.py +3 -1
- mdb_engine/utils/mongo.py +117 -0
- {mdb_engine-0.2.1.dist-info → mdb_engine-0.2.4.dist-info}/METADATA +88 -13
- mdb_engine-0.2.4.dist-info/RECORD +97 -0
- {mdb_engine-0.2.1.dist-info → mdb_engine-0.2.4.dist-info}/WHEEL +1 -1
- mdb_engine-0.2.1.dist-info/RECORD +0 -96
- {mdb_engine-0.2.1.dist-info → mdb_engine-0.2.4.dist-info}/entry_points.txt +0 -0
- {mdb_engine-0.2.1.dist-info → mdb_engine-0.2.4.dist-info}/licenses/LICENSE +0 -0
- {mdb_engine-0.2.1.dist-info → mdb_engine-0.2.4.dist-info}/top_level.txt +0 -0
mdb_engine/routing/websockets.py
CHANGED
|
@@ -23,9 +23,10 @@ This module is part of MDB_ENGINE - MongoDB Engine.
|
|
|
23
23
|
import asyncio
|
|
24
24
|
import json
|
|
25
25
|
import logging
|
|
26
|
+
from collections.abc import Awaitable, Callable
|
|
26
27
|
from dataclasses import dataclass
|
|
27
28
|
from datetime import datetime
|
|
28
|
-
from typing import Any
|
|
29
|
+
from typing import Any
|
|
29
30
|
|
|
30
31
|
# Check if FastAPI WebSocket support is available (OPTIONAL dependency)
|
|
31
32
|
try:
|
|
@@ -47,8 +48,8 @@ class WebSocketConnection:
|
|
|
47
48
|
|
|
48
49
|
websocket: Any
|
|
49
50
|
app_slug: str
|
|
50
|
-
user_id:
|
|
51
|
-
user_email:
|
|
51
|
+
user_id: str | None = None
|
|
52
|
+
user_email: str | None = None
|
|
52
53
|
connected_at: datetime = None
|
|
53
54
|
|
|
54
55
|
def __post_init__(self):
|
|
@@ -72,15 +73,15 @@ class WebSocketConnectionManager:
|
|
|
72
73
|
app_slug: App slug for scoping connections (ensures isolation)
|
|
73
74
|
"""
|
|
74
75
|
self.app_slug = app_slug
|
|
75
|
-
self.active_connections:
|
|
76
|
+
self.active_connections: list[WebSocketConnection] = [] # List of connection metadata
|
|
76
77
|
self._lock = asyncio.Lock()
|
|
77
78
|
logger.debug(f"Initialized WebSocket manager for app: {app_slug}")
|
|
78
79
|
|
|
79
80
|
async def connect(
|
|
80
81
|
self,
|
|
81
82
|
websocket: Any,
|
|
82
|
-
user_id:
|
|
83
|
-
user_email:
|
|
83
|
+
user_id: str | None = None,
|
|
84
|
+
user_email: str | None = None,
|
|
84
85
|
) -> WebSocketConnection:
|
|
85
86
|
"""
|
|
86
87
|
Accept and register a WebSocket connection with metadata.
|
|
@@ -134,7 +135,7 @@ class WebSocketConnectionManager:
|
|
|
134
135
|
|
|
135
136
|
asyncio.create_task(_disconnect())
|
|
136
137
|
|
|
137
|
-
async def broadcast(self, message:
|
|
138
|
+
async def broadcast(self, message: dict[str, Any], filter_by_user: str | None = None) -> int:
|
|
138
139
|
"""
|
|
139
140
|
Broadcast a message to all connected clients for this app.
|
|
140
141
|
|
|
@@ -196,7 +197,7 @@ class WebSocketConnectionManager:
|
|
|
196
197
|
|
|
197
198
|
return sent_count
|
|
198
199
|
|
|
199
|
-
async def send_to_connection(self, websocket: Any, message:
|
|
200
|
+
async def send_to_connection(self, websocket: Any, message: dict[str, Any]) -> None:
|
|
200
201
|
"""
|
|
201
202
|
Send a message to a specific WebSocket connection.
|
|
202
203
|
|
|
@@ -232,7 +233,7 @@ class WebSocketConnectionManager:
|
|
|
232
233
|
logger.debug(f"Error sending message to specific WebSocket: {e}")
|
|
233
234
|
self.disconnect(websocket)
|
|
234
235
|
|
|
235
|
-
def get_connections_by_user(self, user_id: str) ->
|
|
236
|
+
def get_connections_by_user(self, user_id: str) -> list[WebSocketConnection]:
|
|
236
237
|
"""
|
|
237
238
|
Get all connections for a specific user.
|
|
238
239
|
|
|
@@ -262,12 +263,12 @@ class WebSocketConnectionManager:
|
|
|
262
263
|
|
|
263
264
|
|
|
264
265
|
# Global registry of WebSocket managers per app (app-level isolation)
|
|
265
|
-
_websocket_managers:
|
|
266
|
+
_websocket_managers: dict[str, WebSocketConnectionManager] = {}
|
|
266
267
|
_manager_lock = asyncio.Lock()
|
|
267
268
|
|
|
268
269
|
# Global registry of message handlers per app (for listening to client messages)
|
|
269
270
|
# Note: Registration happens synchronously during app startup, so no lock needed
|
|
270
|
-
_message_handlers:
|
|
271
|
+
_message_handlers: dict[str, dict[str, Callable[[Any, dict[str, Any]], Awaitable[None]]]] = {}
|
|
271
272
|
|
|
272
273
|
|
|
273
274
|
async def get_websocket_manager(app_slug: str) -> WebSocketConnectionManager:
|
|
@@ -308,7 +309,7 @@ def get_websocket_manager_sync(app_slug: str) -> WebSocketConnectionManager:
|
|
|
308
309
|
|
|
309
310
|
async def authenticate_websocket(
|
|
310
311
|
websocket: Any, app_slug: str, require_auth: bool = True
|
|
311
|
-
) ->
|
|
312
|
+
) -> tuple[str | None, str | None]:
|
|
312
313
|
"""
|
|
313
314
|
Authenticate a WebSocket connection.
|
|
314
315
|
|
|
@@ -416,7 +417,7 @@ async def authenticate_websocket(
|
|
|
416
417
|
def register_message_handler(
|
|
417
418
|
app_slug: str,
|
|
418
419
|
endpoint_name: str,
|
|
419
|
-
handler: Callable[[Any,
|
|
420
|
+
handler: Callable[[Any, dict[str, Any]], Awaitable[None]],
|
|
420
421
|
) -> None:
|
|
421
422
|
"""
|
|
422
423
|
Register a message handler for a WebSocket endpoint.
|
|
@@ -453,7 +454,7 @@ def register_message_handler(
|
|
|
453
454
|
|
|
454
455
|
def get_message_handler(
|
|
455
456
|
app_slug: str, endpoint_name: str
|
|
456
|
-
) ->
|
|
457
|
+
) -> Callable[[Any, dict[str, Any]], Awaitable[None]] | None:
|
|
457
458
|
"""
|
|
458
459
|
Get a registered message handler for an endpoint.
|
|
459
460
|
|
|
@@ -528,11 +529,11 @@ async def _authenticate_websocket_connection(
|
|
|
528
529
|
|
|
529
530
|
async def _handle_websocket_message(
|
|
530
531
|
websocket: Any,
|
|
531
|
-
message:
|
|
532
|
+
message: dict[str, Any],
|
|
532
533
|
manager: Any,
|
|
533
534
|
app_slug: str,
|
|
534
535
|
endpoint_name: str,
|
|
535
|
-
handler:
|
|
536
|
+
handler: Callable | None,
|
|
536
537
|
) -> bool:
|
|
537
538
|
"""Handle incoming WebSocket message. Returns True if should continue, False if disconnect."""
|
|
538
539
|
if message.get("type") == "websocket.disconnect":
|
|
@@ -569,7 +570,7 @@ def create_websocket_endpoint(
|
|
|
569
570
|
app_slug: str,
|
|
570
571
|
path: str,
|
|
571
572
|
endpoint_name: str,
|
|
572
|
-
handler:
|
|
573
|
+
handler: Callable[[Any, dict[str, Any]], Awaitable[None]] | None = None,
|
|
573
574
|
require_auth: bool = True,
|
|
574
575
|
ping_interval: int = 30,
|
|
575
576
|
) -> Callable:
|
|
@@ -741,7 +742,7 @@ def create_websocket_endpoint(
|
|
|
741
742
|
|
|
742
743
|
|
|
743
744
|
async def broadcast_to_app(
|
|
744
|
-
app_slug: str, message:
|
|
745
|
+
app_slug: str, message: dict[str, Any], user_id: str | None = None
|
|
745
746
|
) -> int:
|
|
746
747
|
"""
|
|
747
748
|
Convenience function to broadcast a message to all WebSocket clients for an app.
|
mdb_engine/utils/__init__.py
CHANGED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"""
|
|
2
|
+
MongoDB utility functions for MDB Engine.
|
|
3
|
+
|
|
4
|
+
This module provides utility functions for working with MongoDB documents,
|
|
5
|
+
including JSON serialization helpers.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def clean_mongo_doc(doc: dict[str, Any] | None) -> dict[str, Any] | None:
|
|
12
|
+
"""
|
|
13
|
+
Convert MongoDB document to JSON-serializable format.
|
|
14
|
+
|
|
15
|
+
Recursively converts MongoDB-specific types to JSON-compatible types:
|
|
16
|
+
- ObjectId -> str
|
|
17
|
+
- datetime -> ISO format string
|
|
18
|
+
- Nested dictionaries and lists are processed recursively
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
doc: MongoDB document (dict) or None
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
Cleaned document with all MongoDB types converted, or None if input was None
|
|
25
|
+
|
|
26
|
+
Example:
|
|
27
|
+
```python
|
|
28
|
+
from mdb_engine.utils import clean_mongo_doc
|
|
29
|
+
|
|
30
|
+
# MongoDB document with ObjectId and datetime
|
|
31
|
+
doc = {
|
|
32
|
+
"_id": ObjectId("507f1f77bcf86cd799439011"),
|
|
33
|
+
"name": "John",
|
|
34
|
+
"created_at": datetime(2024, 1, 1, 12, 0, 0),
|
|
35
|
+
"nested": {
|
|
36
|
+
"id": ObjectId("507f1f77bcf86cd799439012")
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
# Convert to JSON-serializable format
|
|
41
|
+
cleaned = clean_mongo_doc(doc)
|
|
42
|
+
# {
|
|
43
|
+
# "_id": "507f1f77bcf86cd799439011",
|
|
44
|
+
# "name": "John",
|
|
45
|
+
# "created_at": "2024-01-01T12:00:00",
|
|
46
|
+
# "nested": {
|
|
47
|
+
# "id": "507f1f77bcf86cd799439012"
|
|
48
|
+
# }
|
|
49
|
+
# }
|
|
50
|
+
```
|
|
51
|
+
"""
|
|
52
|
+
from datetime import datetime
|
|
53
|
+
|
|
54
|
+
from bson import ObjectId
|
|
55
|
+
|
|
56
|
+
if doc is None:
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
if not isinstance(doc, dict):
|
|
60
|
+
# If it's not a dict, try to convert it
|
|
61
|
+
if isinstance(doc, ObjectId):
|
|
62
|
+
return str(doc)
|
|
63
|
+
elif isinstance(doc, datetime):
|
|
64
|
+
return doc.isoformat() if hasattr(doc, "isoformat") else str(doc)
|
|
65
|
+
else:
|
|
66
|
+
return doc
|
|
67
|
+
|
|
68
|
+
cleaned: dict[str, Any] = {}
|
|
69
|
+
|
|
70
|
+
for key, value in doc.items():
|
|
71
|
+
if isinstance(value, ObjectId):
|
|
72
|
+
cleaned[key] = str(value)
|
|
73
|
+
elif isinstance(value, datetime):
|
|
74
|
+
cleaned[key] = value.isoformat() if hasattr(value, "isoformat") else str(value)
|
|
75
|
+
elif isinstance(value, dict):
|
|
76
|
+
cleaned[key] = clean_mongo_doc(value)
|
|
77
|
+
elif isinstance(value, list):
|
|
78
|
+
cleaned[key] = [
|
|
79
|
+
clean_mongo_doc(item)
|
|
80
|
+
if isinstance(item, dict)
|
|
81
|
+
else (
|
|
82
|
+
str(item)
|
|
83
|
+
if isinstance(item, ObjectId)
|
|
84
|
+
else (item.isoformat() if isinstance(item, datetime) else item)
|
|
85
|
+
)
|
|
86
|
+
for item in value
|
|
87
|
+
]
|
|
88
|
+
else:
|
|
89
|
+
cleaned[key] = value
|
|
90
|
+
|
|
91
|
+
return cleaned
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def clean_mongo_docs(docs: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
95
|
+
"""
|
|
96
|
+
Convert a list of MongoDB documents to JSON-serializable format.
|
|
97
|
+
|
|
98
|
+
Convenience function that applies clean_mongo_doc to each document in a list.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
docs: List of MongoDB documents
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
List of cleaned documents
|
|
105
|
+
|
|
106
|
+
Example:
|
|
107
|
+
```python
|
|
108
|
+
from mdb_engine.utils import clean_mongo_docs
|
|
109
|
+
|
|
110
|
+
# List of MongoDB documents
|
|
111
|
+
docs = await db.collection.find({}).to_list(length=10)
|
|
112
|
+
|
|
113
|
+
# Convert all to JSON-serializable format
|
|
114
|
+
cleaned = clean_mongo_docs(docs)
|
|
115
|
+
```
|
|
116
|
+
"""
|
|
117
|
+
return [clean_mongo_doc(doc) for doc in docs]
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mdb-engine
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: MongoDB Engine
|
|
5
5
|
Home-page: https://github.com/ranfysvalle02/mdb-engine
|
|
6
|
-
Author:
|
|
7
|
-
Author-email:
|
|
6
|
+
Author: Fabian Valle
|
|
7
|
+
Author-email: Fabian Valle <oblivio.company@gmail.com>
|
|
8
8
|
License: AGPL-3.0
|
|
9
9
|
Project-URL: Homepage, https://github.com/ranfysvalle02/mdb-engine
|
|
10
10
|
Project-URL: Documentation, https://github.com/ranfysvalle02/mdb-engine#readme
|
|
@@ -15,13 +15,12 @@ Classifier: Development Status :: 4 - Beta
|
|
|
15
15
|
Classifier: Intended Audience :: Developers
|
|
16
16
|
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
|
|
17
17
|
Classifier: Programming Language :: Python :: 3
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
20
18
|
Classifier: Programming Language :: Python :: 3.10
|
|
21
19
|
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
21
|
Classifier: Topic :: Database
|
|
23
22
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
|
-
Requires-Python: >=3.
|
|
23
|
+
Requires-Python: >=3.10
|
|
25
24
|
Description-Content-Type: text/markdown
|
|
26
25
|
License-File: LICENSE
|
|
27
26
|
Requires-Dist: motor>=3.0.0
|
|
@@ -32,7 +31,7 @@ Requires-Dist: pyjwt>=2.8.0
|
|
|
32
31
|
Requires-Dist: jsonschema>=4.0.0
|
|
33
32
|
Requires-Dist: bcrypt>=4.0.0
|
|
34
33
|
Requires-Dist: cryptography>=41.0.0
|
|
35
|
-
Requires-Dist: mem0ai>=1.
|
|
34
|
+
Requires-Dist: mem0ai>=0.1.7
|
|
36
35
|
Requires-Dist: semantic-text-splitter>=0.9.0
|
|
37
36
|
Requires-Dist: numpy<2.0.0,>=1.0.0
|
|
38
37
|
Requires-Dist: openai>=1.0.0
|
|
@@ -50,9 +49,10 @@ Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
|
|
|
50
49
|
Requires-Dist: pytest-cov>=4.1.0; extra == "test"
|
|
51
50
|
Requires-Dist: pytest-mock>=3.11.0; extra == "test"
|
|
52
51
|
Requires-Dist: pytest-timeout>=2.1.0; extra == "test"
|
|
52
|
+
Requires-Dist: pytest-xdist>=3.3.0; extra == "test"
|
|
53
53
|
Requires-Dist: testcontainers>=3.7.0; extra == "test"
|
|
54
54
|
Provides-Extra: dev
|
|
55
|
-
Requires-Dist: ruff
|
|
55
|
+
Requires-Dist: ruff<0.6.0,>=0.4.0; extra == "dev"
|
|
56
56
|
Requires-Dist: semgrep>=1.50.0; extra == "dev"
|
|
57
57
|
Provides-Extra: all
|
|
58
58
|
Requires-Dist: casbin>=1.0.0; extra == "all"
|
|
@@ -73,6 +73,31 @@ Dynamic: requires-python
|
|
|
73
73
|
|
|
74
74
|
---
|
|
75
75
|
|
|
76
|
+
## 🎯 manifest.json: The Key to Everything
|
|
77
|
+
|
|
78
|
+
**`manifest.json` is the foundation of your application.** It's a single configuration file that defines your app's identity, data structure, authentication, indexes, and services. Everything flows from this file.
|
|
79
|
+
|
|
80
|
+
### Your First manifest.json
|
|
81
|
+
|
|
82
|
+
Create a `manifest.json` file with just 3 fields:
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"schema_version": "2.0",
|
|
87
|
+
"slug": "my_app",
|
|
88
|
+
"name": "My App"
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
That's it! This minimal manifest gives you:
|
|
93
|
+
- ✅ Automatic data scoping (all queries filtered by `app_id`)
|
|
94
|
+
- ✅ Collection name prefixing (`db.tasks` → `my_app_tasks`)
|
|
95
|
+
- ✅ App registration and lifecycle management
|
|
96
|
+
|
|
97
|
+
**Learn more**: [Quick Start Guide](docs/QUICK_START.md) | [Manifest Deep Dive](docs/MANIFEST_DEEP_DIVE.md)
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
76
101
|
## Installation
|
|
77
102
|
|
|
78
103
|
```bash
|
|
@@ -83,28 +108,55 @@ pip install mdb-engine
|
|
|
83
108
|
|
|
84
109
|
## 30-Second Quick Start
|
|
85
110
|
|
|
111
|
+
**Step 1**: Create your `manifest.json`:
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"schema_version": "2.0",
|
|
116
|
+
"slug": "my_app",
|
|
117
|
+
"name": "My App",
|
|
118
|
+
"managed_indexes": {
|
|
119
|
+
"tasks": [
|
|
120
|
+
{
|
|
121
|
+
"type": "regular",
|
|
122
|
+
"keys": {"status": 1, "created_at": -1},
|
|
123
|
+
"name": "status_sort"
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Step 2**: Create your FastAPI app:
|
|
131
|
+
|
|
86
132
|
```python
|
|
87
133
|
from pathlib import Path
|
|
88
134
|
from fastapi import Depends
|
|
89
135
|
from mdb_engine import MongoDBEngine
|
|
90
136
|
from mdb_engine.dependencies import get_scoped_db
|
|
91
137
|
|
|
92
|
-
#
|
|
138
|
+
# Initialize the engine
|
|
93
139
|
engine = MongoDBEngine(
|
|
94
140
|
mongo_uri="mongodb://localhost:27017",
|
|
95
141
|
db_name="my_database"
|
|
96
142
|
)
|
|
97
143
|
|
|
98
|
-
#
|
|
144
|
+
# Create app - manifest.json is loaded automatically!
|
|
99
145
|
app = engine.create_app(slug="my_app", manifest=Path("manifest.json"))
|
|
100
146
|
|
|
101
|
-
#
|
|
147
|
+
# Use request-scoped dependencies - all queries automatically isolated
|
|
102
148
|
@app.post("/tasks")
|
|
103
149
|
async def create_task(task: dict, db=Depends(get_scoped_db)):
|
|
104
150
|
result = await db.tasks.insert_one(task)
|
|
105
151
|
return {"id": str(result.inserted_id)}
|
|
106
152
|
```
|
|
107
153
|
|
|
154
|
+
**What just happened?**
|
|
155
|
+
- ✅ Engine loaded your `manifest.json`
|
|
156
|
+
- ✅ Indexes created automatically from `managed_indexes`
|
|
157
|
+
- ✅ Database queries automatically scoped to your app
|
|
158
|
+
- ✅ Lifecycle management handled (startup/shutdown)
|
|
159
|
+
|
|
108
160
|
That's it. Your data is automatically sandboxed, indexes are created, and cleanup is handled.
|
|
109
161
|
|
|
110
162
|
---
|
|
@@ -200,9 +252,11 @@ async def health():
|
|
|
200
252
|
|
|
201
253
|
## Why mdb-engine?
|
|
202
254
|
|
|
255
|
+
- **manifest.json is everything** — Single source of truth for your entire app configuration
|
|
203
256
|
- **Zero boilerplate** — No more connection setup, index creation scripts, or auth handlers
|
|
204
257
|
- **Data isolation** — Multi-tenant ready with automatic app sandboxing
|
|
205
258
|
- **Manifest-driven** — Define your app's "DNA" in JSON, not scattered code
|
|
259
|
+
- **Incremental adoption** — Start minimal, add features as needed
|
|
206
260
|
- **No lock-in** — Standard Motor/PyMongo underneath; export anytime with `mongodump --query='{"app_id":"my_app"}'`
|
|
207
261
|
|
|
208
262
|
---
|
|
@@ -300,13 +354,34 @@ async def get_items():
|
|
|
300
354
|
|
|
301
355
|
---
|
|
302
356
|
|
|
357
|
+
## Understanding manifest.json
|
|
358
|
+
|
|
359
|
+
Your `manifest.json` is the heart of your application. It defines:
|
|
360
|
+
|
|
361
|
+
- **App Identity**: `slug`, `name`, `description`
|
|
362
|
+
- **Data Access**: `data_access.read_scopes`, `data_access.write_scope`
|
|
363
|
+
- **Indexes**: `managed_indexes` (regular, vector, text, TTL, compound)
|
|
364
|
+
- **Authentication**: `auth.policy`, `auth.users` (Casbin/OSO, demo users)
|
|
365
|
+
- **AI Services**: `embedding_config`, `memory_config`
|
|
366
|
+
- **Real-time**: `websockets` endpoints
|
|
367
|
+
- **CORS**: `cors` settings
|
|
368
|
+
|
|
369
|
+
**Start minimal, grow as needed.** You can begin with just `slug`, `name`, and `schema_version`, then add features incrementally.
|
|
370
|
+
|
|
371
|
+
**📖 Learn More:**
|
|
372
|
+
- [Quick Start Guide](docs/QUICK_START.md) - Get started with manifest.json
|
|
373
|
+
- [Manifest Deep Dive](docs/MANIFEST_DEEP_DIVE.md) - Comprehensive manifest.json guide
|
|
374
|
+
- [Examples](examples/) - Real-world manifest.json files
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
303
378
|
## Links
|
|
304
379
|
|
|
305
380
|
- [GitHub Repository](https://github.com/ranfysvalle02/mdb-engine)
|
|
306
381
|
- [Documentation](https://github.com/ranfysvalle02/mdb-engine/tree/main/docs)
|
|
307
382
|
- [All Examples](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples)
|
|
308
|
-
- [Quick Start Guide](
|
|
309
|
-
- [Contributing](
|
|
383
|
+
- [Quick Start Guide](docs/QUICK_START.md) - **Start here!**
|
|
384
|
+
- [Contributing](CONTRIBUTING.md)
|
|
310
385
|
|
|
311
386
|
---
|
|
312
387
|
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
mdb_engine/README.md,sha256=T3EFGcPopY9LslYW3lxgG3hohWkAOmBNbYG0FDMUJiY,3502
|
|
2
|
+
mdb_engine/__init__.py,sha256=ll3Xc4FaoNqqK_lnWOJTyFHY3uAyoB40g3NnBjwyx5U,3155
|
|
3
|
+
mdb_engine/config.py,sha256=DTAyxfKB8ogyI0v5QR9Y-SJOgXQr_eDBCKxNBSqEyLc,7269
|
|
4
|
+
mdb_engine/constants.py,sha256=eaotvW57TVOg7rRbLziGrVNoP7adgw_G9iVByHezc_A,7837
|
|
5
|
+
mdb_engine/dependencies.py,sha256=MJuYQhZ9ZGzXlip1ha5zba9Rvn04HDPWahJFJH81Q2s,14107
|
|
6
|
+
mdb_engine/exceptions.py,sha256=NkBSdTBNP9bVTtI6w6mAoEfeVZDq-Bg7vCF2L26ZDZo,8442
|
|
7
|
+
mdb_engine/auth/ARCHITECTURE.md,sha256=JXZsjEIpNz4Szk18KaOiEabhEuz1pmYWXQRN-EJEHDM,4076
|
|
8
|
+
mdb_engine/auth/README.md,sha256=IVlUOat96V3yM6wk4T-u4GxJ4-WF05eBSJBlvIexyBo,37285
|
|
9
|
+
mdb_engine/auth/__init__.py,sha256=QemWqAVvqlxjF-UbzMTGP5AUOeuaAsUEtK4PMxmozmA,5852
|
|
10
|
+
mdb_engine/auth/audit.py,sha256=UQ0Bj5Zxp5et9A21YZCVkUjaABFqO1CXaMrWxNcdxm8,17352
|
|
11
|
+
mdb_engine/auth/base.py,sha256=4E3XkbruZLG9lc6aC56w0ypjnfiR5RbtjQKwn4am8to,7418
|
|
12
|
+
mdb_engine/auth/casbin_factory.py,sha256=oZLHIPyVA1hiho__ledRVDoBisaZgo96WZIKa0-kQic,16610
|
|
13
|
+
mdb_engine/auth/casbin_models.py,sha256=7XtFmRBhhjw1nKprnluvjyJoTj5fzdPeQwVvo6fI-r0,955
|
|
14
|
+
mdb_engine/auth/config_defaults.py,sha256=1YI_hIHuTiEXpkEYMcufNHdLr1oxPiJylg3CKrJCSGY,2012
|
|
15
|
+
mdb_engine/auth/config_helpers.py,sha256=Qharb2YagLOKDGtE7XhYRDbBoQ_KGykrcIKrsOwWIJ4,6303
|
|
16
|
+
mdb_engine/auth/cookie_utils.py,sha256=j04qXq5GiJrnnJUAP5Z_N1CAFbx9CZiyF5u9xIiQ3vo,4876
|
|
17
|
+
mdb_engine/auth/csrf.py,sha256=u6lhb3YighSaGsmFTkHt2ohHUYnBDdSU4dCBFiH_gYI,12440
|
|
18
|
+
mdb_engine/auth/decorators.py,sha256=LkVVEuRrT0Iz8EwctN14BEi3fSV-xtN6DaGXgtbiYYo,12287
|
|
19
|
+
mdb_engine/auth/dependencies.py,sha256=JB1iYvZJgTR6gcaiGe_GJFCS6NdUKMxWBZRv6vVxnzw,27112
|
|
20
|
+
mdb_engine/auth/helpers.py,sha256=BCrid985cYh-3h5ZMUV9TES0q40uJXio4oYKQZta7KA,1970
|
|
21
|
+
mdb_engine/auth/integration.py,sha256=6PMjGKS71bl-OrwxG_kksY1069jB9nNZZNFs2C2H2qk,22740
|
|
22
|
+
mdb_engine/auth/jwt.py,sha256=HKcGOaza62zdIQx0mHLV9zBSibCLlrM6NnCXg1HCGUc,7206
|
|
23
|
+
mdb_engine/auth/middleware.py,sha256=e21eZQYrgNPChb0uL6Uw1hV2Rzw92D9ZWAkqWv4nHSE,10866
|
|
24
|
+
mdb_engine/auth/oso_factory.py,sha256=EwRgN1OjjcwZPU4In35Zwrc5Qsm_aCUjyR3nxNqqwiw,11264
|
|
25
|
+
mdb_engine/auth/provider.py,sha256=FOSHn-jp4VYtxvmjnzho5kH6y-xDKWbcKUorYRRl1C4,26576
|
|
26
|
+
mdb_engine/auth/rate_limiter.py,sha256=l3EYZE1Kz9yVfZwNrKq_1AgdD7GXB1WOLSqqGQVSSgA,15808
|
|
27
|
+
mdb_engine/auth/restrictions.py,sha256=tOyQBO_w0bK9zmTsOPZf9cbvh4oITvpNfSxIXt-XrcU,8824
|
|
28
|
+
mdb_engine/auth/session_manager.py,sha256=ywWJjTarm-obgJ3zO3s-1cdqEYe0XrozlY00q_yMJ8I,15396
|
|
29
|
+
mdb_engine/auth/shared_middleware.py,sha256=3lvm6aC0W_7ECvno_Mj3eu_93DZ--JiXhZ9hte8tvhM,30480
|
|
30
|
+
mdb_engine/auth/shared_users.py,sha256=25OBks4VRHaYZW7R61vnplV7wmr7RRpDctSgnej_nxc,26773
|
|
31
|
+
mdb_engine/auth/token_lifecycle.py,sha256=Q9S1X2Y6W7Ckt5PvyYXswBRh2Tg9DGpyRv_3Xve7VYQ,6708
|
|
32
|
+
mdb_engine/auth/token_store.py,sha256=-B8j5RH5YEoKsswF4rnMoI51BaxMe4icke3kuehXmcI,9121
|
|
33
|
+
mdb_engine/auth/users.py,sha256=t9Us2_A_wKOL9qy1O_SBwTvapAyNztn0v8padxJVq6A,49891
|
|
34
|
+
mdb_engine/auth/utils.py,sha256=g7fXkxIb8yuvlZrhKeQxAR0KxiUakXRK5WtKG4opihk,26019
|
|
35
|
+
mdb_engine/cli/__init__.py,sha256=PANRi4THmL34d1mawlqxIrnuItXMdqoMTq5Z1zHd7rM,301
|
|
36
|
+
mdb_engine/cli/main.py,sha256=Y5ELFhvsr8zxFWv4WScOGNHiLUTdSXAJeUFLpRXCelg,811
|
|
37
|
+
mdb_engine/cli/utils.py,sha256=bNRGJgdzxUjXAOVe1aoxWJ5M_IqtAE-eW4pfAkwiDDM,2760
|
|
38
|
+
mdb_engine/cli/commands/__init__.py,sha256=ZSzMhKdV9ILD5EbOSxDV9nURHo1e4bQ0c8AWpqsTEqM,115
|
|
39
|
+
mdb_engine/cli/commands/generate.py,sha256=VEcn7qNQkIPQlLEK3oXUBgYMwD-G0FyomXQcWTtKsbs,17304
|
|
40
|
+
mdb_engine/cli/commands/migrate.py,sha256=VqNiobSq-ykUhv7NyHJZ-wZ60a8X0B6OqXz8OACsCr0,2077
|
|
41
|
+
mdb_engine/cli/commands/show.py,sha256=-PmyMfzzG1HP-PsD9n8LECyxwvlXypNS3g_VDwFg4oY,1914
|
|
42
|
+
mdb_engine/cli/commands/validate.py,sha256=tD8GkhuW8LKsRMUXvBs-wvVWQunw1XFlLvbpE_SQ9Zg,1688
|
|
43
|
+
mdb_engine/core/README.md,sha256=cl19Sw4Hj-BPBsh_FIhPpop_6S88V-KaHC6rnUCx8xw,17039
|
|
44
|
+
mdb_engine/core/__init__.py,sha256=xhnXyXWZ0a2Qr49QrYvLE5QuqSalcpo05hHHRVtDz_M,1952
|
|
45
|
+
mdb_engine/core/app_registration.py,sha256=7szt2a7aBkpSppjmhdkkPPYMKGKo0MkLKZeEeWk-Rq8,13356
|
|
46
|
+
mdb_engine/core/app_secrets.py,sha256=bo-syg9UUATibNyXEZs-0TTYWG-JaY-2S0yNSGA12n0,10524
|
|
47
|
+
mdb_engine/core/connection.py,sha256=XnwuPG34pJ7kJGJ84T0mhj1UZ6_CLz_9qZf6NRYGIS8,8346
|
|
48
|
+
mdb_engine/core/encryption.py,sha256=RZ5LPF5g28E3ZBn6v1IMw_oas7u9YGFtBcEj8lTi9LM,7515
|
|
49
|
+
mdb_engine/core/engine.py,sha256=ciQHxHEcFh-DOQ0X9gV5kKk9WAxj3GKg5JDIPfFZjMg,69459
|
|
50
|
+
mdb_engine/core/index_management.py,sha256=9-r7MIy3JnjQ35sGqsbj8K_I07vAUWtAVgSWC99lJcE,5555
|
|
51
|
+
mdb_engine/core/manifest.py,sha256=ROaMKrlHY2gi77ScQCWu8U_QB7CVCoR8CQrP1gmtrtw,134756
|
|
52
|
+
mdb_engine/core/ray_integration.py,sha256=vexYOzztscvRYje1xTNmXJbi99oJxCaVJAwKfTNTF_E,13610
|
|
53
|
+
mdb_engine/core/seeding.py,sha256=c5IhdwlqUf_4Q5FFTAhPLaHPaUr_Txo3z_DUwZmWsFs,6421
|
|
54
|
+
mdb_engine/core/service_initialization.py,sha256=rtb6BaPvFqomwT_s7bdbbvqi5m74llT0LkJFEhVG9Gg,12996
|
|
55
|
+
mdb_engine/core/types.py,sha256=x7ahgb61vXVikn7nKHWGxQRW3StMG9lTHwr-Uvpnt_g,11150
|
|
56
|
+
mdb_engine/database/README.md,sha256=-31mVxBeVQaYsF3AD1-gQbD2NCYVcPjdFoA6sZ6b02Y,19354
|
|
57
|
+
mdb_engine/database/__init__.py,sha256=rrc3eZFli3K2zrvVdDbMBi8YkmoHYzP6JNT0AUBE5VU,981
|
|
58
|
+
mdb_engine/database/abstraction.py,sha256=H6f2WYY80r3onqN6s139uDSyG9W_QpadaoQ84hJuG1E,23438
|
|
59
|
+
mdb_engine/database/connection.py,sha256=-6FL6QwIlZxd7Sm7kbTaeISNrDD8A4dHGSbIEkKzqF0,15071
|
|
60
|
+
mdb_engine/database/query_validator.py,sha256=5xcGWd3Csk2qgvgJTIccEsc3bV10WNZUEKaI2loLwQs,13239
|
|
61
|
+
mdb_engine/database/resource_limiter.py,sha256=BCIACGexVRVhUcDERQFmg1LW8CPBQos_ZvmfLcJ4Opk,6905
|
|
62
|
+
mdb_engine/database/scoped_wrapper.py,sha256=5ToXG2NSFFG9Js87sRPkwE51XIUJwVUGgSta03W2t9A,94661
|
|
63
|
+
mdb_engine/di/__init__.py,sha256=uy9Q153a0QE678TkJ_AEwLuxPY3OyEum2I42_JsuwrI,912
|
|
64
|
+
mdb_engine/di/container.py,sha256=imr_3buWcJDNCEgn4-HTQvBV8DOU7gz8UfghI8FpqUA,7410
|
|
65
|
+
mdb_engine/di/providers.py,sha256=-KPYM4lz8pBxh3J1fuNJyFHwBuqL1vvWk7VgJxew4uo,5927
|
|
66
|
+
mdb_engine/di/scopes.py,sha256=pZgdkZ9ziW-vYCMvecC8Mv3Ud_Xk4ScsDYZ2eWHvar0,4165
|
|
67
|
+
mdb_engine/embeddings/README.md,sha256=XjGWUXSdbSpXCAEEVfYmcJoFKBVmXDoM3eTjenrM5Z0,5926
|
|
68
|
+
mdb_engine/embeddings/__init__.py,sha256=BM8tfcekVZv_iPQj3OuZBQ3hHr0eRQetNLEMysRTZkE,2129
|
|
69
|
+
mdb_engine/embeddings/dependencies.py,sha256=0LIEU5L1jvZBKO4yhYxh4WxDhzJaZI9ohZGBNa6B7IY,2182
|
|
70
|
+
mdb_engine/embeddings/service.py,sha256=3JUqAU-e5TVLOpry5MdP-O4q6tHoqkXA8PyvcxqFoik,26983
|
|
71
|
+
mdb_engine/indexes/README.md,sha256=r7duq-1vtqHhBk1cwoBMYYh_dfTzxiaQaPE3mLB_3JQ,15341
|
|
72
|
+
mdb_engine/indexes/__init__.py,sha256=9QFJ6qo_yD26dZcKyKjj-hhesFpaomBt-mWTtYTQvqc,613
|
|
73
|
+
mdb_engine/indexes/helpers.py,sha256=tJHqDm18jKLrW-P2ofmnUnaf4_-V5xDLjqP_WU8W9MM,4190
|
|
74
|
+
mdb_engine/indexes/manager.py,sha256=XSjvFNMOv67yey5Vi4mKBt6_w4b6Hqtv24fiAXnfLi0,32460
|
|
75
|
+
mdb_engine/memory/README.md,sha256=uOE4SnPyq8TdoxGrttof5fSj2KSqnrgzUorMCV_1wg0,13624
|
|
76
|
+
mdb_engine/memory/__init__.py,sha256=e4kAYgxd_-WAH8GovTwjEBO9hvASu_kXEupMgksAL-U,1008
|
|
77
|
+
mdb_engine/memory/service.py,sha256=l2bkKVN9AyUjO9K9ykb5BK9dZjs3ns78FJLOD5LajsY,18454
|
|
78
|
+
mdb_engine/observability/README.md,sha256=CMgQaC1H8ESmCitfbhJifz6-XoXH_FPNE4MvuZ-oFas,13085
|
|
79
|
+
mdb_engine/observability/__init__.py,sha256=jjLsrW6Gy2ayrbfLrgHsDB61NxWWkYLHwv0q-N3fxjA,1213
|
|
80
|
+
mdb_engine/observability/health.py,sha256=eFd8a-Rv3NWML0EDdZ8thZWTiqP_FUZbub97hV2z57g,9190
|
|
81
|
+
mdb_engine/observability/logging.py,sha256=lJV9iIk-cKb87LEfeMAIP0PPN5vg8-pdRdPzwD29SAM,4039
|
|
82
|
+
mdb_engine/observability/metrics.py,sha256=_5ZlObbYNgEanWvt-n0wIg9QOAnHBpePs_wKysSoJxQ,10728
|
|
83
|
+
mdb_engine/repositories/__init__.py,sha256=048N4QmFLVhJyLdYrWHTTBqujhaF--B8g0z6fUSMuJs,858
|
|
84
|
+
mdb_engine/repositories/base.py,sha256=9AP3baJzJeU2zIhh04TfvP1f3q5HyHdkrSW11xrcY70,8514
|
|
85
|
+
mdb_engine/repositories/mongo.py,sha256=Wg32_6v0KHAHumhz5z8QkoqJRWAMJFA7Y2lYIJ7LZIk,7142
|
|
86
|
+
mdb_engine/repositories/unit_of_work.py,sha256=XvmwGOspEDj4hsfOULPsQKjB1QZqh83TJo6vGV4tiqU,5118
|
|
87
|
+
mdb_engine/routing/README.md,sha256=WVvTQXDq0amryrjkCu0wP_piOEwFjLukjmPz2mroWHY,13658
|
|
88
|
+
mdb_engine/routing/__init__.py,sha256=reupjHi_RTc2ZBA4AH5XzobAmqy4EQIsfSUcTkFknUM,2438
|
|
89
|
+
mdb_engine/routing/websockets.py,sha256=3X4OjQv_Nln4UmeifJky0gFhMG8A6alR77I8g1iIOLY,29311
|
|
90
|
+
mdb_engine/utils/__init__.py,sha256=lDxQSGqkV4fVw5TWIk6FA6_eey_ZnEtMY0fir3cpAe8,236
|
|
91
|
+
mdb_engine/utils/mongo.py,sha256=Oqtv4tQdpiiZzrilGLEYQPo8Vmh8WsTQypxQs8Of53s,3369
|
|
92
|
+
mdb_engine-0.2.4.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
|
|
93
|
+
mdb_engine-0.2.4.dist-info/METADATA,sha256=DRYO0436-KCFjF-HHi1deGWWoO0Yq3vzKl53qow2ldE,12750
|
|
94
|
+
mdb_engine-0.2.4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
95
|
+
mdb_engine-0.2.4.dist-info/entry_points.txt,sha256=INCbYdFbBzJalwPwxliEzLmPfR57IvQ7RAXG_pn8cL8,48
|
|
96
|
+
mdb_engine-0.2.4.dist-info/top_level.txt,sha256=PH0UEBwTtgkm2vWvC9He_EOMn7hVn_Wg_Jyc0SmeO8k,11
|
|
97
|
+
mdb_engine-0.2.4.dist-info/RECORD,,
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
mdb_engine/README.md,sha256=T3EFGcPopY9LslYW3lxgG3hohWkAOmBNbYG0FDMUJiY,3502
|
|
2
|
-
mdb_engine/__init__.py,sha256=-W3Gdj2GAoptKsR_T4xluYnmnelZTdKrTxCthIytZ48,3008
|
|
3
|
-
mdb_engine/config.py,sha256=EsB0PHrRCCt24db6Ly88s6PQ3sm1esSLMa2G4AHpt5k,7315
|
|
4
|
-
mdb_engine/constants.py,sha256=eaotvW57TVOg7rRbLziGrVNoP7adgw_G9iVByHezc_A,7837
|
|
5
|
-
mdb_engine/dependencies.py,sha256=bkKwYz6CnucDNDcXdxTvRCqmQpsWbAXQFf5w-AcKMH8,14107
|
|
6
|
-
mdb_engine/exceptions.py,sha256=N8WYOgh1fOH0yJeR9I3FTXqpACIL_EQX3zcfUgrFvPI,8521
|
|
7
|
-
mdb_engine/auth/ARCHITECTURE.md,sha256=JXZsjEIpNz4Szk18KaOiEabhEuz1pmYWXQRN-EJEHDM,4076
|
|
8
|
-
mdb_engine/auth/README.md,sha256=STL4PHyMlYpSNEAqo4RBKTEm4kz1GbWpI9c_lS94nV4,36802
|
|
9
|
-
mdb_engine/auth/__init__.py,sha256=QemWqAVvqlxjF-UbzMTGP5AUOeuaAsUEtK4PMxmozmA,5852
|
|
10
|
-
mdb_engine/auth/audit.py,sha256=LtdG9GdwYTSMI30zMygB0K8w4l179GaGvkNbxWgoQ2I,17461
|
|
11
|
-
mdb_engine/auth/base.py,sha256=tIcC30_ViVuhmR8PCpY-MYBzu6Y9Ak1DZkAQishQyMg,7434
|
|
12
|
-
mdb_engine/auth/casbin_factory.py,sha256=66unyPRqNPydi0Bln8NNpsPt8gMwl7Hwc_nEsqfJj9U,16633
|
|
13
|
-
mdb_engine/auth/casbin_models.py,sha256=7XtFmRBhhjw1nKprnluvjyJoTj5fzdPeQwVvo6fI-r0,955
|
|
14
|
-
mdb_engine/auth/config_defaults.py,sha256=7JYX8CFI7OP7GHFIDHTf3Jns09LJcQ7f0_GL9yBnyuA,2018
|
|
15
|
-
mdb_engine/auth/config_helpers.py,sha256=DpQ8QZAO2FVVKFmhTJIa4FYPS8Iy8O7vcVh_tg0INLg,6309
|
|
16
|
-
mdb_engine/auth/cookie_utils.py,sha256=F88p6_aMG0aSmGXCn0KYjweSMPHqfce1lrKHU4P5yQk,4913
|
|
17
|
-
mdb_engine/auth/csrf.py,sha256=Rx9qYt8owSJJwwj7Z_w4nzkaLbaqWoVpNv13qnqosIA,12458
|
|
18
|
-
mdb_engine/auth/decorators.py,sha256=47uyOK_6WmK18J6ELRKwwgaIkcp6kHOILXuARj82Ijw,12288
|
|
19
|
-
mdb_engine/auth/dependencies.py,sha256=-JooBflCsyndw8oUJ864nX01QOX9Pq09KQhY43oaSJk,27156
|
|
20
|
-
mdb_engine/auth/helpers.py,sha256=BCrid985cYh-3h5ZMUV9TES0q40uJXio4oYKQZta7KA,1970
|
|
21
|
-
mdb_engine/auth/integration.py,sha256=zaTeo4ZXnxnTbw6iZCawZ6dDXDQQCaX6XYc6cbRw6xs,22759
|
|
22
|
-
mdb_engine/auth/jwt.py,sha256=aRXLfgFjsebIARmPqgfcA5zSgSN44HD7BgSyOEFaQCM,7244
|
|
23
|
-
mdb_engine/auth/middleware.py,sha256=uMx1dOO1NaR4K2nDet3k_ASR7rc7ZbKD0HlEkVYGJvU,10869
|
|
24
|
-
mdb_engine/auth/oso_factory.py,sha256=FPDzL5zYrFWd--amBoqKk_1FHET8QzlmiYTLinZeezU,11289
|
|
25
|
-
mdb_engine/auth/provider.py,sha256=m7G1rMgMezalALcV_74Kb0G77exyAIP-eOGyI2XfApc,26595
|
|
26
|
-
mdb_engine/auth/rate_limiter.py,sha256=kYuYIDlgkmYB2jx_UUmM9VrndUq2iTkdP7DZV-Jfu8o,15825
|
|
27
|
-
mdb_engine/auth/restrictions.py,sha256=TXa2lO3lZQeMtokhyVLP19-XbWwq2R8JMTw2KfaiDMg,8852
|
|
28
|
-
mdb_engine/auth/session_manager.py,sha256=XjYeE4i1998tBIefhp8VH3Oe7reyA_CC_qjw6zZ5EVY,15459
|
|
29
|
-
mdb_engine/auth/shared_middleware.py,sha256=nrW-JN3P6SQ-WjJcXU9scX8auuS3-LdKEQX9Iy-IjJw,22343
|
|
30
|
-
mdb_engine/auth/shared_users.py,sha256=7f1Wl0u-egcnaMPj1a2XzclMnulrYXpzOcFQM6Mvvus,26828
|
|
31
|
-
mdb_engine/auth/token_lifecycle.py,sha256=NiYDEUyooZRNAaT79yPHAyAfTK3MGOu8eNJtClR-PL0,6753
|
|
32
|
-
mdb_engine/auth/token_store.py,sha256=Mpvln3sPEE0l5zQmFtWxpVUKYjelWv8FJTLhOOn55MY,9161
|
|
33
|
-
mdb_engine/auth/users.py,sha256=gMEHC936aTkjtnGN5E3YzA1k5IThDcLFhzs0-02ujxI,50037
|
|
34
|
-
mdb_engine/auth/utils.py,sha256=g5ILBsrSxvBbhHKsJc9oVjlnmodrM3QJjQQKbnEy4Mk,26126
|
|
35
|
-
mdb_engine/cli/__init__.py,sha256=PANRi4THmL34d1mawlqxIrnuItXMdqoMTq5Z1zHd7rM,301
|
|
36
|
-
mdb_engine/cli/main.py,sha256=Y5ELFhvsr8zxFWv4WScOGNHiLUTdSXAJeUFLpRXCelg,811
|
|
37
|
-
mdb_engine/cli/utils.py,sha256=0bpxHB5PmHapnCRjlN4T2YRp5kzJsp87Uh_65MsCFJY,2766
|
|
38
|
-
mdb_engine/cli/commands/__init__.py,sha256=ZSzMhKdV9ILD5EbOSxDV9nURHo1e4bQ0c8AWpqsTEqM,115
|
|
39
|
-
mdb_engine/cli/commands/generate.py,sha256=2XDnyROYm5OOcEFczGeS6P0AtFgM74XigQbxbMTPvU4,17329
|
|
40
|
-
mdb_engine/cli/commands/migrate.py,sha256=VqNiobSq-ykUhv7NyHJZ-wZ60a8X0B6OqXz8OACsCr0,2077
|
|
41
|
-
mdb_engine/cli/commands/show.py,sha256=-PmyMfzzG1HP-PsD9n8LECyxwvlXypNS3g_VDwFg4oY,1914
|
|
42
|
-
mdb_engine/cli/commands/validate.py,sha256=tD8GkhuW8LKsRMUXvBs-wvVWQunw1XFlLvbpE_SQ9Zg,1688
|
|
43
|
-
mdb_engine/core/README.md,sha256=cl19Sw4Hj-BPBsh_FIhPpop_6S88V-KaHC6rnUCx8xw,17039
|
|
44
|
-
mdb_engine/core/__init__.py,sha256=xhnXyXWZ0a2Qr49QrYvLE5QuqSalcpo05hHHRVtDz_M,1952
|
|
45
|
-
mdb_engine/core/app_registration.py,sha256=zRK2JTeT0rDW4XdOgFAV-j9Og7xijXdov4u1VVp7p1Y,13386
|
|
46
|
-
mdb_engine/core/app_secrets.py,sha256=ipLsC_QdnIFhrCLNQ3nXvBAfndSor4WNRJyqPc0-J8Q,10555
|
|
47
|
-
mdb_engine/core/connection.py,sha256=9WRccQ2Zz8K6PS6yC2XXxhZkppALvAWZJhfLmsJBnbI,8383
|
|
48
|
-
mdb_engine/core/encryption.py,sha256=jblhUuu_L_lht0qlbn5vqDsdj9rN80uL9DCFDCD-zxw,7540
|
|
49
|
-
mdb_engine/core/engine.py,sha256=YmsoTNqMaLi4kcUFySSpCQZ1O8Fd41YryhwubfMfc0g,69566
|
|
50
|
-
mdb_engine/core/index_management.py,sha256=9-r7MIy3JnjQ35sGqsbj8K_I07vAUWtAVgSWC99lJcE,5555
|
|
51
|
-
mdb_engine/core/manifest.py,sha256=4Dk7iDOoxOrpZ20BA2onaX6cqMhWVSIA0bryeKPsXDQ,133677
|
|
52
|
-
mdb_engine/core/ray_integration.py,sha256=Qe3jAYQhOKeBBlWFAcqzciDWN2zctJh_6uMTIai1tS0,13617
|
|
53
|
-
mdb_engine/core/seeding.py,sha256=I5g43xdoEdC4rNwc_Ih0L6QOZguPcpAWrS6HvJ2a3fE,6433
|
|
54
|
-
mdb_engine/core/service_initialization.py,sha256=gJNIB0As4vg6UXRgt1EDo5p3zzlHfF8NZqjCAlB75mA,12997
|
|
55
|
-
mdb_engine/core/types.py,sha256=v_lSnBTyl2JHX39cPvPsnOxXhu8xaGC92UektvYPOvg,11239
|
|
56
|
-
mdb_engine/database/README.md,sha256=-31mVxBeVQaYsF3AD1-gQbD2NCYVcPjdFoA6sZ6b02Y,19354
|
|
57
|
-
mdb_engine/database/__init__.py,sha256=rrc3eZFli3K2zrvVdDbMBi8YkmoHYzP6JNT0AUBE5VU,981
|
|
58
|
-
mdb_engine/database/abstraction.py,sha256=FLVhFuS4OTZIRQyDkUBZdIlhqRndqNA89EO0cJvNsN0,23462
|
|
59
|
-
mdb_engine/database/connection.py,sha256=PDmwkjb4wYhLTUjlcYHscorces69rIuSxt5wdYixGQw,13777
|
|
60
|
-
mdb_engine/database/query_validator.py,sha256=AIWkQ-c6HAqJ-ixn-hq_0yfC2vdf1-jbEpzYZNmfEqs,13275
|
|
61
|
-
mdb_engine/database/resource_limiter.py,sha256=n54-I6bjEk5jxNGMXyb6_fArDCiyJ69_h9goFW5GzUs,6936
|
|
62
|
-
mdb_engine/database/scoped_wrapper.py,sha256=S_QIqGVyCteKAYlSUHNIqqc0S80jWhzHV-Lfa-ezNG4,94794
|
|
63
|
-
mdb_engine/di/__init__.py,sha256=uy9Q153a0QE678TkJ_AEwLuxPY3OyEum2I42_JsuwrI,912
|
|
64
|
-
mdb_engine/di/container.py,sha256=Wf4-O69Kg_hLC3aHmAf847K7p0sHLh4aYKMGOTmvzok,7441
|
|
65
|
-
mdb_engine/di/providers.py,sha256=jCgez_w1NkfAHCa6O3tsoGHiKcZt-fAbmgvn7KXmTCU,5940
|
|
66
|
-
mdb_engine/di/scopes.py,sha256=0pNzm2I5aRr7H_IBCRhcwd4dW4LzwD4uC2PmWyZI1Ps,4187
|
|
67
|
-
mdb_engine/embeddings/README.md,sha256=XjGWUXSdbSpXCAEEVfYmcJoFKBVmXDoM3eTjenrM5Z0,5926
|
|
68
|
-
mdb_engine/embeddings/__init__.py,sha256=BM8tfcekVZv_iPQj3OuZBQ3hHr0eRQetNLEMysRTZkE,2129
|
|
69
|
-
mdb_engine/embeddings/dependencies.py,sha256=BphKvHYF5iYo6k7v4rYkEOYKZCtlGsPfMdrT6v1J430,2195
|
|
70
|
-
mdb_engine/embeddings/service.py,sha256=v5Ch4VMADDUw-tqNs8XbaG9JJktvO7cqniNJ8Mes56k,25991
|
|
71
|
-
mdb_engine/indexes/README.md,sha256=r7duq-1vtqHhBk1cwoBMYYh_dfTzxiaQaPE3mLB_3JQ,15341
|
|
72
|
-
mdb_engine/indexes/__init__.py,sha256=9QFJ6qo_yD26dZcKyKjj-hhesFpaomBt-mWTtYTQvqc,613
|
|
73
|
-
mdb_engine/indexes/helpers.py,sha256=v5iYqS3yOekqwxdbgnI1ifYH4oESatgXYJiJO1GvhSU,4259
|
|
74
|
-
mdb_engine/indexes/manager.py,sha256=CkA62LofmRLtfcm1cyzyx89p6Nge8yb3MIshmWAWPC8,32472
|
|
75
|
-
mdb_engine/memory/README.md,sha256=vy2FSXADcqG18YrFBfrMph9a1vYKuLijhs8ziNFdvRk,10631
|
|
76
|
-
mdb_engine/memory/__init__.py,sha256=e4kAYgxd_-WAH8GovTwjEBO9hvASu_kXEupMgksAL-U,1008
|
|
77
|
-
mdb_engine/memory/service.py,sha256=evoQhnslLVc3fEUhikdby_mt5iz9_T2LPeCEQX4Psd0,47553
|
|
78
|
-
mdb_engine/observability/README.md,sha256=CMgQaC1H8ESmCitfbhJifz6-XoXH_FPNE4MvuZ-oFas,13085
|
|
79
|
-
mdb_engine/observability/__init__.py,sha256=jjLsrW6Gy2ayrbfLrgHsDB61NxWWkYLHwv0q-N3fxjA,1213
|
|
80
|
-
mdb_engine/observability/health.py,sha256=kZ9LXcJ3_8tKXRWXNNCz3qsj0PkZ0BSTdzisc8ds2vw,9197
|
|
81
|
-
mdb_engine/observability/logging.py,sha256=yo_KnUtqjPx_KvqNrAxW8ud6HQjI7Lk6T7Lj7IMW1uY,4073
|
|
82
|
-
mdb_engine/observability/metrics.py,sha256=EL9-ZFOaxxIdU8PWIqPRyPZHhP3fc4VyUawRSS2GIY4,10726
|
|
83
|
-
mdb_engine/repositories/__init__.py,sha256=048N4QmFLVhJyLdYrWHTTBqujhaF--B8g0z6fUSMuJs,858
|
|
84
|
-
mdb_engine/repositories/base.py,sha256=-Llwhn5NxEh-5S6CJAzZx1nF6J2Sch0WxIpMaaPQhs4,8575
|
|
85
|
-
mdb_engine/repositories/mongo.py,sha256=aR_JFDYtWIZiZA616tDbOPrLN_Gi8diD6Hc9UfeaT-w,7177
|
|
86
|
-
mdb_engine/repositories/unit_of_work.py,sha256=obTsGCcZgsNhQdFOvNGLtvq-guyykmPZzBo-GM_ROAo,5146
|
|
87
|
-
mdb_engine/routing/README.md,sha256=WVvTQXDq0amryrjkCu0wP_piOEwFjLukjmPz2mroWHY,13658
|
|
88
|
-
mdb_engine/routing/__init__.py,sha256=reupjHi_RTc2ZBA4AH5XzobAmqy4EQIsfSUcTkFknUM,2438
|
|
89
|
-
mdb_engine/routing/websockets.py,sha256=X6-MG0mAN8ZEgdmZD8edaiDx8DqMCN-hV3coIOdgZNc,29346
|
|
90
|
-
mdb_engine/utils/__init__.py,sha256=_xjHB5p6WLWBql1DyDqf5zdjj2xpfMlK25Y6BH9-oFk,145
|
|
91
|
-
mdb_engine-0.2.1.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
|
|
92
|
-
mdb_engine-0.2.1.dist-info/METADATA,sha256=LaeDnv88ajuRpA0YnOwmMNDSF_4BSRmy-AoxsmFC80U,10470
|
|
93
|
-
mdb_engine-0.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
94
|
-
mdb_engine-0.2.1.dist-info/entry_points.txt,sha256=INCbYdFbBzJalwPwxliEzLmPfR57IvQ7RAXG_pn8cL8,48
|
|
95
|
-
mdb_engine-0.2.1.dist-info/top_level.txt,sha256=PH0UEBwTtgkm2vWvC9He_EOMn7hVn_Wg_Jyc0SmeO8k,11
|
|
96
|
-
mdb_engine-0.2.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|