mdb-engine 0.1.6__tar.gz → 0.2.0__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.
Files changed (114) hide show
  1. mdb_engine-0.2.0/PKG-INFO +313 -0
  2. mdb_engine-0.2.0/README.md +248 -0
  3. mdb_engine-0.2.0/mdb_engine/__init__.py +130 -0
  4. mdb_engine-0.2.0/mdb_engine/auth/ARCHITECTURE.md +112 -0
  5. mdb_engine-0.2.0/mdb_engine/auth/README.md +1268 -0
  6. mdb_engine-0.2.0/mdb_engine/auth/__init__.py +235 -0
  7. mdb_engine-0.2.0/mdb_engine/auth/audit.py +592 -0
  8. mdb_engine-0.2.0/mdb_engine/auth/base.py +252 -0
  9. mdb_engine-0.2.0/mdb_engine/auth/casbin_factory.py +394 -0
  10. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/config_helpers.py +7 -6
  11. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/cookie_utils.py +3 -7
  12. mdb_engine-0.2.0/mdb_engine/auth/csrf.py +373 -0
  13. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/decorators.py +3 -10
  14. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/dependencies.py +47 -50
  15. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/helpers.py +3 -3
  16. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/integration.py +53 -80
  17. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/jwt.py +2 -6
  18. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/middleware.py +77 -34
  19. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/oso_factory.py +18 -38
  20. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/provider.py +270 -171
  21. mdb_engine-0.2.0/mdb_engine/auth/rate_limiter.py +504 -0
  22. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/restrictions.py +8 -24
  23. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/session_manager.py +14 -29
  24. mdb_engine-0.2.0/mdb_engine/auth/shared_middleware.py +600 -0
  25. mdb_engine-0.2.0/mdb_engine/auth/shared_users.py +759 -0
  26. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/token_store.py +14 -28
  27. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/users.py +54 -113
  28. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/utils.py +213 -15
  29. mdb_engine-0.2.0/mdb_engine/cli/commands/generate.py +641 -0
  30. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/cli/commands/validate.py +3 -7
  31. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/cli/utils.py +3 -3
  32. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/config.py +7 -21
  33. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/constants.py +65 -0
  34. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/core/README.md +117 -6
  35. mdb_engine-0.2.0/mdb_engine/core/__init__.py +74 -0
  36. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/core/app_registration.py +22 -41
  37. mdb_engine-0.2.0/mdb_engine/core/app_secrets.py +290 -0
  38. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/core/connection.py +18 -9
  39. mdb_engine-0.2.0/mdb_engine/core/encryption.py +223 -0
  40. mdb_engine-0.2.0/mdb_engine/core/engine.py +1713 -0
  41. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/core/index_management.py +12 -16
  42. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/core/manifest.py +459 -150
  43. mdb_engine-0.2.0/mdb_engine/core/ray_integration.py +435 -0
  44. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/core/seeding.py +10 -18
  45. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/core/service_initialization.py +12 -23
  46. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/core/types.py +2 -5
  47. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/database/README.md +140 -17
  48. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/database/__init__.py +17 -6
  49. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/database/abstraction.py +25 -37
  50. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/database/connection.py +11 -18
  51. mdb_engine-0.2.0/mdb_engine/database/query_validator.py +367 -0
  52. mdb_engine-0.2.0/mdb_engine/database/resource_limiter.py +204 -0
  53. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/database/scoped_wrapper.py +713 -196
  54. mdb_engine-0.2.0/mdb_engine/dependencies.py +426 -0
  55. mdb_engine-0.2.0/mdb_engine/di/__init__.py +34 -0
  56. mdb_engine-0.2.0/mdb_engine/di/container.py +248 -0
  57. mdb_engine-0.2.0/mdb_engine/di/providers.py +205 -0
  58. mdb_engine-0.2.0/mdb_engine/di/scopes.py +139 -0
  59. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/embeddings/README.md +54 -24
  60. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/embeddings/__init__.py +31 -24
  61. mdb_engine-0.2.0/mdb_engine/embeddings/dependencies.py +76 -0
  62. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/embeddings/service.py +11 -25
  63. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/exceptions.py +92 -0
  64. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/indexes/README.md +30 -13
  65. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/indexes/__init__.py +1 -0
  66. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/indexes/helpers.py +1 -1
  67. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/indexes/manager.py +50 -114
  68. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/memory/README.md +2 -2
  69. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/memory/__init__.py +1 -2
  70. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/memory/service.py +30 -87
  71. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/observability/README.md +4 -2
  72. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/observability/__init__.py +26 -9
  73. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/observability/health.py +8 -9
  74. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/observability/metrics.py +32 -12
  75. mdb_engine-0.2.0/mdb_engine/repositories/__init__.py +34 -0
  76. mdb_engine-0.2.0/mdb_engine/repositories/base.py +325 -0
  77. mdb_engine-0.2.0/mdb_engine/repositories/mongo.py +233 -0
  78. mdb_engine-0.2.0/mdb_engine/repositories/unit_of_work.py +166 -0
  79. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/routing/README.md +1 -1
  80. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/routing/__init__.py +1 -3
  81. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/routing/websockets.py +25 -60
  82. mdb_engine-0.2.0/mdb_engine.egg-info/PKG-INFO +313 -0
  83. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine.egg-info/SOURCES.txt +21 -0
  84. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine.egg-info/requires.txt +3 -7
  85. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/pyproject.toml +48 -9
  86. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/setup.py +1 -1
  87. mdb_engine-0.1.6/PKG-INFO +0 -213
  88. mdb_engine-0.1.6/README.md +0 -369
  89. mdb_engine-0.1.6/mdb_engine/__init__.py +0 -37
  90. mdb_engine-0.1.6/mdb_engine/auth/README.md +0 -631
  91. mdb_engine-0.1.6/mdb_engine/auth/__init__.py +0 -128
  92. mdb_engine-0.1.6/mdb_engine/auth/casbin_factory.py +0 -199
  93. mdb_engine-0.1.6/mdb_engine/cli/commands/generate.py +0 -105
  94. mdb_engine-0.1.6/mdb_engine/core/__init__.py +0 -42
  95. mdb_engine-0.1.6/mdb_engine/core/engine.py +0 -749
  96. mdb_engine-0.1.6/mdb_engine/embeddings/dependencies.py +0 -193
  97. mdb_engine-0.1.6/mdb_engine.egg-info/PKG-INFO +0 -213
  98. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/LICENSE +0 -0
  99. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/MANIFEST.in +0 -0
  100. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/README.md +0 -0
  101. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/casbin_models.py +0 -0
  102. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/config_defaults.py +0 -0
  103. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/auth/token_lifecycle.py +0 -0
  104. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/cli/__init__.py +0 -0
  105. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/cli/commands/__init__.py +0 -0
  106. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/cli/commands/migrate.py +0 -0
  107. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/cli/commands/show.py +0 -0
  108. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/cli/main.py +0 -0
  109. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/observability/logging.py +0 -0
  110. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine/utils/__init__.py +0 -0
  111. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine.egg-info/dependency_links.txt +0 -0
  112. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine.egg-info/entry_points.txt +0 -0
  113. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/mdb_engine.egg-info/top_level.txt +0 -0
  114. {mdb_engine-0.1.6 → mdb_engine-0.2.0}/setup.cfg +0 -0
@@ -0,0 +1,313 @@
1
+ Metadata-Version: 2.4
2
+ Name: mdb-engine
3
+ Version: 0.2.0
4
+ Summary: MongoDB Engine
5
+ Home-page: https://github.com/ranfysvalle02/mdb-engine
6
+ Author: Your Name
7
+ Author-email: Your Name <your.email@example.com>
8
+ License: AGPL-3.0
9
+ Project-URL: Homepage, https://github.com/ranfysvalle02/mdb-engine
10
+ Project-URL: Documentation, https://github.com/ranfysvalle02/mdb-engine#readme
11
+ Project-URL: Repository, https://github.com/ranfysvalle02/mdb-engine
12
+ Project-URL: Issues, https://github.com/ranfysvalle02/mdb-engine/issues
13
+ Keywords: mongodb,runtime,engine,database,scoping
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.8
19
+ Classifier: Programming Language :: Python :: 3.9
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Topic :: Database
23
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
+ Requires-Python: >=3.8
25
+ Description-Content-Type: text/markdown
26
+ License-File: LICENSE
27
+ Requires-Dist: motor>=3.0.0
28
+ Requires-Dist: pymongo>=4.0.0
29
+ Requires-Dist: fastapi>=0.100.0
30
+ Requires-Dist: pydantic>=2.0.0
31
+ Requires-Dist: pyjwt>=2.8.0
32
+ Requires-Dist: jsonschema>=4.0.0
33
+ Requires-Dist: bcrypt>=4.0.0
34
+ Requires-Dist: cryptography>=41.0.0
35
+ Requires-Dist: mem0ai>=1.0.0
36
+ Requires-Dist: semantic-text-splitter>=0.9.0
37
+ Requires-Dist: numpy<2.0.0,>=1.0.0
38
+ Requires-Dist: openai>=1.0.0
39
+ Requires-Dist: azure-identity>=1.15.0
40
+ Requires-Dist: click>=8.0.0
41
+ Provides-Extra: casbin
42
+ Requires-Dist: casbin>=1.0.0; extra == "casbin"
43
+ Requires-Dist: casbin-motor-adapter>=0.1.0; extra == "casbin"
44
+ Provides-Extra: oso
45
+ Requires-Dist: oso-cloud>=0.1.0; extra == "oso"
46
+ Provides-Extra: llm
47
+ Provides-Extra: test
48
+ Requires-Dist: pytest>=7.4.0; extra == "test"
49
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
50
+ Requires-Dist: pytest-cov>=4.1.0; extra == "test"
51
+ Requires-Dist: pytest-mock>=3.11.0; extra == "test"
52
+ Requires-Dist: pytest-timeout>=2.1.0; extra == "test"
53
+ Requires-Dist: testcontainers>=3.7.0; extra == "test"
54
+ Provides-Extra: dev
55
+ Requires-Dist: ruff>=0.4.0; extra == "dev"
56
+ Requires-Dist: semgrep>=1.50.0; extra == "dev"
57
+ Provides-Extra: all
58
+ Requires-Dist: casbin>=1.0.0; extra == "all"
59
+ Requires-Dist: casbin-motor-adapter>=0.1.0; extra == "all"
60
+ Requires-Dist: oso-cloud>=0.1.0; extra == "all"
61
+ Dynamic: author
62
+ Dynamic: home-page
63
+ Dynamic: license-file
64
+ Dynamic: requires-python
65
+
66
+ # mdb-engine
67
+
68
+ **The MongoDB Engine for Python Apps** — Auto-sandboxing, index management, and auth in one package.
69
+
70
+ [![PyPI](https://img.shields.io/pypi/v/mdb-engine)](https://pypi.org/project/mdb-engine/)
71
+ [![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
72
+ [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](https://opensource.org/licenses/AGPL-3.0)
73
+
74
+ ---
75
+
76
+ ## Installation
77
+
78
+ ```bash
79
+ pip install mdb-engine
80
+ ```
81
+
82
+ ---
83
+
84
+ ## 30-Second Quick Start
85
+
86
+ ```python
87
+ from pathlib import Path
88
+ from fastapi import Depends
89
+ from mdb_engine import MongoDBEngine
90
+ from mdb_engine.dependencies import get_scoped_db
91
+
92
+ # 1. Initialize the engine
93
+ engine = MongoDBEngine(
94
+ mongo_uri="mongodb://localhost:27017",
95
+ db_name="my_database"
96
+ )
97
+
98
+ # 2. Create a FastAPI app with automatic lifecycle management
99
+ app = engine.create_app(slug="my_app", manifest=Path("manifest.json"))
100
+
101
+ # 3. Use request-scoped dependencies - all queries automatically isolated
102
+ @app.post("/tasks")
103
+ async def create_task(task: dict, db=Depends(get_scoped_db)):
104
+ result = await db.tasks.insert_one(task)
105
+ return {"id": str(result.inserted_id)}
106
+ ```
107
+
108
+ That's it. Your data is automatically sandboxed, indexes are created, and cleanup is handled.
109
+
110
+ ---
111
+
112
+ ## Basic Examples
113
+
114
+ ### 1. Index Management
115
+
116
+ Define indexes in your `manifest.json` — they're auto-created on startup:
117
+
118
+ ```json
119
+ {
120
+ "schema_version": "2.0",
121
+ "slug": "my_app",
122
+ "name": "My App",
123
+ "status": "active",
124
+ "managed_indexes": {
125
+ "tasks": [
126
+ {
127
+ "type": "regular",
128
+ "keys": {"status": 1, "created_at": -1},
129
+ "name": "status_sort"
130
+ },
131
+ {
132
+ "type": "regular",
133
+ "keys": {"priority": -1},
134
+ "name": "priority_idx"
135
+ }
136
+ ],
137
+ "users": [
138
+ {
139
+ "type": "regular",
140
+ "keys": {"email": 1},
141
+ "name": "email_unique",
142
+ "unique": true
143
+ }
144
+ ]
145
+ }
146
+ }
147
+ ```
148
+
149
+ Supported index types: `regular`, `text`, `vector`, `ttl`, `compound`.
150
+
151
+ ### 2. CRUD Operations (Auto-Scoped)
152
+
153
+ All database operations are automatically scoped to your app. Use `Depends(get_scoped_db)` in route handlers:
154
+
155
+ ```python
156
+ from mdb_engine.dependencies import get_scoped_db
157
+
158
+ @app.post("/tasks")
159
+ async def create_task(task: dict, db=Depends(get_scoped_db)):
160
+ result = await db.tasks.insert_one(task)
161
+ return {"id": str(result.inserted_id)}
162
+
163
+ @app.get("/tasks")
164
+ async def list_tasks(db=Depends(get_scoped_db)):
165
+ return await db.tasks.find({"status": "pending"}).to_list(length=10)
166
+
167
+ @app.put("/tasks/{task_id}")
168
+ async def update_task(task_id: str, db=Depends(get_scoped_db)):
169
+ await db.tasks.update_one({"_id": task_id}, {"$set": {"status": "done"}})
170
+ return {"updated": True}
171
+
172
+ @app.delete("/tasks/{task_id}")
173
+ async def delete_task(task_id: str, db=Depends(get_scoped_db)):
174
+ await db.tasks.delete_one({"_id": task_id})
175
+ return {"deleted": True}
176
+ ```
177
+
178
+ **What happens under the hood:**
179
+ ```python
180
+ # You write:
181
+ await db.tasks.find({}).to_list(length=10)
182
+
183
+ # Engine executes:
184
+ # Collection: my_app_tasks
185
+ # Query: {"app_id": "my_app"}
186
+ ```
187
+
188
+ ### 3. Health Checks
189
+
190
+ Built-in observability:
191
+
192
+ ```python
193
+ @app.get("/health")
194
+ async def health():
195
+ status = await engine.get_health_status()
196
+ return {"status": status.get("status", "unknown")}
197
+ ```
198
+
199
+ ---
200
+
201
+ ## Why mdb-engine?
202
+
203
+ - **Zero boilerplate** — No more connection setup, index creation scripts, or auth handlers
204
+ - **Data isolation** — Multi-tenant ready with automatic app sandboxing
205
+ - **Manifest-driven** — Define your app's "DNA" in JSON, not scattered code
206
+ - **No lock-in** — Standard Motor/PyMongo underneath; export anytime with `mongodump --query='{"app_id":"my_app"}'`
207
+
208
+ ---
209
+
210
+ ## Advanced Features
211
+
212
+ | Feature | Description | Learn More |
213
+ |---------|-------------|------------|
214
+ | **Authentication** | JWT + Casbin/OSO RBAC | [Auth Guide](https://github.com/ranfysvalle02/mdb-engine/blob/main/docs/AUTHZ.md) |
215
+ | **Vector Search** | Atlas Vector Search + embeddings | [RAG Example](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/interactive_rag) |
216
+ | **Memory Service** | Persistent AI memory with Mem0 | [Chat Example](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/chit_chat) |
217
+ | **WebSockets** | Real-time updates from manifest | [Docs](https://github.com/ranfysvalle02/mdb-engine/blob/main/docs/ARCHITECTURE.md) |
218
+ | **Multi-App** | Secure cross-app data access | [Multi-App Example](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/advanced/multi_app) |
219
+ | **SSO** | Shared auth across apps | [Shared Auth Example](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/advanced/multi_app_shared) |
220
+
221
+ ### AppContext — All Services in One Place ✨
222
+
223
+ ```python
224
+ from fastapi import Depends
225
+ from mdb_engine.dependencies import AppContext
226
+
227
+ @app.post("/ai-chat")
228
+ async def chat(query: str, ctx: AppContext = Depends()):
229
+ user = ctx.require_user() # 401 if not logged in
230
+ ctx.require_role("user") # 403 if missing role
231
+
232
+ # Everything available: ctx.db, ctx.embedding_service, ctx.memory, ctx.llm
233
+ if ctx.llm:
234
+ response = ctx.llm.chat.completions.create(
235
+ model=ctx.llm_model,
236
+ messages=[{"role": "user", "content": query}]
237
+ )
238
+ return {"response": response.choices[0].message.content}
239
+ ```
240
+
241
+ ---
242
+
243
+ ## Full Examples
244
+
245
+ Clone and run:
246
+
247
+ ```bash
248
+ git clone https://github.com/ranfysvalle02/mdb-engine.git
249
+ cd mdb-engine/examples/basic/chit_chat
250
+ docker-compose up --build
251
+ ```
252
+
253
+ ### Basic Examples
254
+
255
+ | Example | Description |
256
+ |---------|-------------|
257
+ | [chit_chat](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/chit_chat) | AI chat with persistent memory |
258
+ | [interactive_rag](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/interactive_rag) | RAG with vector search |
259
+ | [oso_hello_world](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/oso_hello_world) | OSO Cloud authorization |
260
+ | [parallax](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/parallax) | Dynamic schema generation |
261
+ | [vector_hacking](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/vector_hacking) | Vector embeddings & attacks |
262
+
263
+ ### Advanced Examples
264
+
265
+ | Example | Description |
266
+ |---------|-------------|
267
+ | [simple_app](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/advanced/simple_app) | Task management with `create_app()` pattern |
268
+ | [multi_app](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/advanced/multi_app) | Multi-tenant with cross-app access |
269
+ | [multi_app_shared](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/advanced/multi_app_shared) | SSO with shared user pool |
270
+
271
+ ---
272
+
273
+ ## Manual Setup (Alternative)
274
+
275
+ If you need more control over the FastAPI lifecycle:
276
+
277
+ ```python
278
+ from pathlib import Path
279
+ from fastapi import FastAPI
280
+ from mdb_engine import MongoDBEngine
281
+
282
+ app = FastAPI()
283
+ engine = MongoDBEngine(mongo_uri="mongodb://localhost:27017", db_name="my_database")
284
+
285
+ @app.on_event("startup")
286
+ async def startup():
287
+ await engine.initialize()
288
+ manifest = await engine.load_manifest(Path("manifest.json"))
289
+ await engine.register_app(manifest, create_indexes=True)
290
+
291
+ @app.on_event("shutdown")
292
+ async def shutdown():
293
+ await engine.shutdown()
294
+
295
+ @app.get("/items")
296
+ async def get_items():
297
+ db = engine.get_scoped_db("my_app")
298
+ return await db.items.find({}).to_list(length=10)
299
+ ```
300
+
301
+ ---
302
+
303
+ ## Links
304
+
305
+ - [GitHub Repository](https://github.com/ranfysvalle02/mdb-engine)
306
+ - [Documentation](https://github.com/ranfysvalle02/mdb-engine/tree/main/docs)
307
+ - [All Examples](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples)
308
+ - [Quick Start Guide](https://github.com/ranfysvalle02/mdb-engine/blob/main/docs/QUICK_START.md)
309
+ - [Contributing](https://github.com/ranfysvalle02/mdb-engine/blob/main/CONTRIBUTING.md)
310
+
311
+ ---
312
+
313
+ **Stop building scaffolding. Start building features.**
@@ -0,0 +1,248 @@
1
+ # mdb-engine
2
+
3
+ **The MongoDB Engine for Python Apps** — Auto-sandboxing, index management, and auth in one package.
4
+
5
+ [![PyPI](https://img.shields.io/pypi/v/mdb-engine)](https://pypi.org/project/mdb-engine/)
6
+ [![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
7
+ [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](https://opensource.org/licenses/AGPL-3.0)
8
+
9
+ ---
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ pip install mdb-engine
15
+ ```
16
+
17
+ ---
18
+
19
+ ## 30-Second Quick Start
20
+
21
+ ```python
22
+ from pathlib import Path
23
+ from fastapi import Depends
24
+ from mdb_engine import MongoDBEngine
25
+ from mdb_engine.dependencies import get_scoped_db
26
+
27
+ # 1. Initialize the engine
28
+ engine = MongoDBEngine(
29
+ mongo_uri="mongodb://localhost:27017",
30
+ db_name="my_database"
31
+ )
32
+
33
+ # 2. Create a FastAPI app with automatic lifecycle management
34
+ app = engine.create_app(slug="my_app", manifest=Path("manifest.json"))
35
+
36
+ # 3. Use request-scoped dependencies - all queries automatically isolated
37
+ @app.post("/tasks")
38
+ async def create_task(task: dict, db=Depends(get_scoped_db)):
39
+ result = await db.tasks.insert_one(task)
40
+ return {"id": str(result.inserted_id)}
41
+ ```
42
+
43
+ That's it. Your data is automatically sandboxed, indexes are created, and cleanup is handled.
44
+
45
+ ---
46
+
47
+ ## Basic Examples
48
+
49
+ ### 1. Index Management
50
+
51
+ Define indexes in your `manifest.json` — they're auto-created on startup:
52
+
53
+ ```json
54
+ {
55
+ "schema_version": "2.0",
56
+ "slug": "my_app",
57
+ "name": "My App",
58
+ "status": "active",
59
+ "managed_indexes": {
60
+ "tasks": [
61
+ {
62
+ "type": "regular",
63
+ "keys": {"status": 1, "created_at": -1},
64
+ "name": "status_sort"
65
+ },
66
+ {
67
+ "type": "regular",
68
+ "keys": {"priority": -1},
69
+ "name": "priority_idx"
70
+ }
71
+ ],
72
+ "users": [
73
+ {
74
+ "type": "regular",
75
+ "keys": {"email": 1},
76
+ "name": "email_unique",
77
+ "unique": true
78
+ }
79
+ ]
80
+ }
81
+ }
82
+ ```
83
+
84
+ Supported index types: `regular`, `text`, `vector`, `ttl`, `compound`.
85
+
86
+ ### 2. CRUD Operations (Auto-Scoped)
87
+
88
+ All database operations are automatically scoped to your app. Use `Depends(get_scoped_db)` in route handlers:
89
+
90
+ ```python
91
+ from mdb_engine.dependencies import get_scoped_db
92
+
93
+ @app.post("/tasks")
94
+ async def create_task(task: dict, db=Depends(get_scoped_db)):
95
+ result = await db.tasks.insert_one(task)
96
+ return {"id": str(result.inserted_id)}
97
+
98
+ @app.get("/tasks")
99
+ async def list_tasks(db=Depends(get_scoped_db)):
100
+ return await db.tasks.find({"status": "pending"}).to_list(length=10)
101
+
102
+ @app.put("/tasks/{task_id}")
103
+ async def update_task(task_id: str, db=Depends(get_scoped_db)):
104
+ await db.tasks.update_one({"_id": task_id}, {"$set": {"status": "done"}})
105
+ return {"updated": True}
106
+
107
+ @app.delete("/tasks/{task_id}")
108
+ async def delete_task(task_id: str, db=Depends(get_scoped_db)):
109
+ await db.tasks.delete_one({"_id": task_id})
110
+ return {"deleted": True}
111
+ ```
112
+
113
+ **What happens under the hood:**
114
+ ```python
115
+ # You write:
116
+ await db.tasks.find({}).to_list(length=10)
117
+
118
+ # Engine executes:
119
+ # Collection: my_app_tasks
120
+ # Query: {"app_id": "my_app"}
121
+ ```
122
+
123
+ ### 3. Health Checks
124
+
125
+ Built-in observability:
126
+
127
+ ```python
128
+ @app.get("/health")
129
+ async def health():
130
+ status = await engine.get_health_status()
131
+ return {"status": status.get("status", "unknown")}
132
+ ```
133
+
134
+ ---
135
+
136
+ ## Why mdb-engine?
137
+
138
+ - **Zero boilerplate** — No more connection setup, index creation scripts, or auth handlers
139
+ - **Data isolation** — Multi-tenant ready with automatic app sandboxing
140
+ - **Manifest-driven** — Define your app's "DNA" in JSON, not scattered code
141
+ - **No lock-in** — Standard Motor/PyMongo underneath; export anytime with `mongodump --query='{"app_id":"my_app"}'`
142
+
143
+ ---
144
+
145
+ ## Advanced Features
146
+
147
+ | Feature | Description | Learn More |
148
+ |---------|-------------|------------|
149
+ | **Authentication** | JWT + Casbin/OSO RBAC | [Auth Guide](https://github.com/ranfysvalle02/mdb-engine/blob/main/docs/AUTHZ.md) |
150
+ | **Vector Search** | Atlas Vector Search + embeddings | [RAG Example](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/interactive_rag) |
151
+ | **Memory Service** | Persistent AI memory with Mem0 | [Chat Example](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/chit_chat) |
152
+ | **WebSockets** | Real-time updates from manifest | [Docs](https://github.com/ranfysvalle02/mdb-engine/blob/main/docs/ARCHITECTURE.md) |
153
+ | **Multi-App** | Secure cross-app data access | [Multi-App Example](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/advanced/multi_app) |
154
+ | **SSO** | Shared auth across apps | [Shared Auth Example](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/advanced/multi_app_shared) |
155
+
156
+ ### AppContext — All Services in One Place ✨
157
+
158
+ ```python
159
+ from fastapi import Depends
160
+ from mdb_engine.dependencies import AppContext
161
+
162
+ @app.post("/ai-chat")
163
+ async def chat(query: str, ctx: AppContext = Depends()):
164
+ user = ctx.require_user() # 401 if not logged in
165
+ ctx.require_role("user") # 403 if missing role
166
+
167
+ # Everything available: ctx.db, ctx.embedding_service, ctx.memory, ctx.llm
168
+ if ctx.llm:
169
+ response = ctx.llm.chat.completions.create(
170
+ model=ctx.llm_model,
171
+ messages=[{"role": "user", "content": query}]
172
+ )
173
+ return {"response": response.choices[0].message.content}
174
+ ```
175
+
176
+ ---
177
+
178
+ ## Full Examples
179
+
180
+ Clone and run:
181
+
182
+ ```bash
183
+ git clone https://github.com/ranfysvalle02/mdb-engine.git
184
+ cd mdb-engine/examples/basic/chit_chat
185
+ docker-compose up --build
186
+ ```
187
+
188
+ ### Basic Examples
189
+
190
+ | Example | Description |
191
+ |---------|-------------|
192
+ | [chit_chat](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/chit_chat) | AI chat with persistent memory |
193
+ | [interactive_rag](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/interactive_rag) | RAG with vector search |
194
+ | [oso_hello_world](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/oso_hello_world) | OSO Cloud authorization |
195
+ | [parallax](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/parallax) | Dynamic schema generation |
196
+ | [vector_hacking](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/basic/vector_hacking) | Vector embeddings & attacks |
197
+
198
+ ### Advanced Examples
199
+
200
+ | Example | Description |
201
+ |---------|-------------|
202
+ | [simple_app](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/advanced/simple_app) | Task management with `create_app()` pattern |
203
+ | [multi_app](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/advanced/multi_app) | Multi-tenant with cross-app access |
204
+ | [multi_app_shared](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples/advanced/multi_app_shared) | SSO with shared user pool |
205
+
206
+ ---
207
+
208
+ ## Manual Setup (Alternative)
209
+
210
+ If you need more control over the FastAPI lifecycle:
211
+
212
+ ```python
213
+ from pathlib import Path
214
+ from fastapi import FastAPI
215
+ from mdb_engine import MongoDBEngine
216
+
217
+ app = FastAPI()
218
+ engine = MongoDBEngine(mongo_uri="mongodb://localhost:27017", db_name="my_database")
219
+
220
+ @app.on_event("startup")
221
+ async def startup():
222
+ await engine.initialize()
223
+ manifest = await engine.load_manifest(Path("manifest.json"))
224
+ await engine.register_app(manifest, create_indexes=True)
225
+
226
+ @app.on_event("shutdown")
227
+ async def shutdown():
228
+ await engine.shutdown()
229
+
230
+ @app.get("/items")
231
+ async def get_items():
232
+ db = engine.get_scoped_db("my_app")
233
+ return await db.items.find({}).to_list(length=10)
234
+ ```
235
+
236
+ ---
237
+
238
+ ## Links
239
+
240
+ - [GitHub Repository](https://github.com/ranfysvalle02/mdb-engine)
241
+ - [Documentation](https://github.com/ranfysvalle02/mdb-engine/tree/main/docs)
242
+ - [All Examples](https://github.com/ranfysvalle02/mdb-engine/tree/main/examples)
243
+ - [Quick Start Guide](https://github.com/ranfysvalle02/mdb-engine/blob/main/docs/QUICK_START.md)
244
+ - [Contributing](https://github.com/ranfysvalle02/mdb-engine/blob/main/CONTRIBUTING.md)
245
+
246
+ ---
247
+
248
+ **Stop building scaffolding. Start building features.**
@@ -0,0 +1,130 @@
1
+ """
2
+ MDB_ENGINE - MongoDB Engine
3
+
4
+ Enterprise-grade engine for building applications with:
5
+ - Automatic database scoping and data isolation
6
+ - Proper dependency injection with service lifetimes
7
+ - Repository pattern for clean data access
8
+ - Authentication and authorization
9
+
10
+ Usage:
11
+ # Simple usage
12
+ from mdb_engine import MongoDBEngine
13
+ engine = MongoDBEngine(mongo_uri=..., db_name=...)
14
+ await engine.initialize()
15
+ db = engine.get_scoped_db("my_app")
16
+
17
+ # With FastAPI integration
18
+ app = engine.create_app(slug="my_app", manifest=Path("manifest.json"))
19
+
20
+ # In routes - use RequestContext for clean DI
21
+ from mdb_engine import RequestContext
22
+
23
+ @app.get("/users/{user_id}")
24
+ async def get_user(user_id: str, ctx: RequestContext = Depends()):
25
+ user = await ctx.uow.users.get(user_id)
26
+ return user
27
+ """
28
+
29
+ # Authentication
30
+ from .auth import AuthorizationProvider, require_admin
31
+ from .auth import get_current_user as auth_get_current_user # noqa: F401
32
+
33
+ # Core MongoDB Engine
34
+ from .core import (
35
+ RAY_AVAILABLE,
36
+ AppRayActor,
37
+ ManifestParser,
38
+ ManifestValidator,
39
+ MongoDBEngine,
40
+ get_ray_actor_handle,
41
+ ray_actor_decorator,
42
+ )
43
+
44
+ # Database layer
45
+ from .database import AppDB, ScopedMongoWrapper
46
+
47
+ # FastAPI dependencies
48
+ from .dependencies import (
49
+ Inject,
50
+ RequestContext,
51
+ get_app_config,
52
+ get_app_slug,
53
+ get_authz_provider,
54
+ get_current_user,
55
+ get_embedding_service,
56
+ get_engine,
57
+ get_llm_client,
58
+ get_llm_model_name,
59
+ get_memory_service,
60
+ get_scoped_db,
61
+ get_unit_of_work,
62
+ get_user_roles,
63
+ inject,
64
+ require_role,
65
+ require_user,
66
+ )
67
+
68
+ # DI Container
69
+ from .di import Container, Scope, ScopeManager
70
+
71
+ # Index management
72
+ from .indexes import (
73
+ AsyncAtlasIndexManager,
74
+ AutoIndexManager,
75
+ run_index_creation_for_collection,
76
+ )
77
+
78
+ # Repository pattern
79
+ from .repositories import Entity, MongoRepository, Repository, UnitOfWork
80
+
81
+ __version__ = "0.2.0" # Major version bump for new DI system
82
+
83
+ __all__ = [
84
+ # Core Engine
85
+ "MongoDBEngine",
86
+ "ManifestValidator",
87
+ "ManifestParser",
88
+ # Ray Integration (optional)
89
+ "RAY_AVAILABLE",
90
+ "AppRayActor",
91
+ "get_ray_actor_handle",
92
+ "ray_actor_decorator",
93
+ # Database
94
+ "ScopedMongoWrapper",
95
+ "AppDB",
96
+ # DI Container
97
+ "Container",
98
+ "Scope",
99
+ "ScopeManager",
100
+ # Repository Pattern
101
+ "Repository",
102
+ "MongoRepository",
103
+ "Entity",
104
+ "UnitOfWork",
105
+ # Auth
106
+ "AuthorizationProvider",
107
+ "require_admin",
108
+ # FastAPI Dependencies
109
+ "RequestContext",
110
+ "get_engine",
111
+ "get_app_slug",
112
+ "get_app_config",
113
+ "get_scoped_db",
114
+ "get_unit_of_work",
115
+ "get_embedding_service",
116
+ "get_memory_service",
117
+ "get_llm_client",
118
+ "get_llm_model_name",
119
+ "get_authz_provider",
120
+ "get_current_user",
121
+ "get_user_roles",
122
+ "require_user",
123
+ "require_role",
124
+ "inject",
125
+ "Inject",
126
+ # Indexes
127
+ "AsyncAtlasIndexManager",
128
+ "AutoIndexManager",
129
+ "run_index_creation_for_collection",
130
+ ]