mindtrace-database 0.12.0__tar.gz → 0.14.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 (28) hide show
  1. {mindtrace_database-0.12.0/mindtrace_database.egg-info → mindtrace_database-0.14.0}/PKG-INFO +3 -3
  2. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/backends/mongo_odm.py +9 -8
  3. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/backends/unified_odm.py +12 -10
  4. mindtrace_database-0.14.0/mindtrace/database/sample/user.py +12 -0
  5. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/testing/suites/mongo_crud.py +3 -3
  6. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/testing/suites/mongo_insert.py +3 -3
  7. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/testing/suites/mongo_read.py +3 -3
  8. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/testing/suites/mongo_update.py +3 -3
  9. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0/mindtrace_database.egg-info}/PKG-INFO +3 -3
  10. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace_database.egg-info/requires.txt +2 -2
  11. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/pyproject.toml +3 -3
  12. mindtrace_database-0.12.0/mindtrace/database/sample/user.py +0 -10
  13. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/LICENSE +0 -0
  14. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/README.md +0 -0
  15. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/__init__.py +0 -0
  16. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/backends/mindtrace_odm.py +0 -0
  17. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/backends/redis_odm.py +0 -0
  18. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/backends/registry_odm.py +0 -0
  19. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/core/exceptions.py +0 -0
  20. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/testing/__init__.py +0 -0
  21. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/testing/suites/__init__.py +0 -0
  22. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/testing/suites/_models.py +0 -0
  23. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace/database/testing/suites/_mongo.py +0 -0
  24. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace_database.egg-info/SOURCES.txt +0 -0
  25. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace_database.egg-info/dependency_links.txt +0 -0
  26. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace_database.egg-info/entry_points.txt +0 -0
  27. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/mindtrace_database.egg-info/top_level.txt +0 -0
  28. {mindtrace_database-0.12.0 → mindtrace_database-0.14.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mindtrace-database
3
- Version: 0.12.0
3
+ Version: 0.14.0
4
4
  Summary: Database functionality for Mindtrace
5
5
  Author: Mindtrace Team
6
6
  License-Expression: Apache-2.0
@@ -11,13 +11,13 @@ Classifier: Programming Language :: Python :: 3.12
11
11
  Description-Content-Type: text/markdown
12
12
  License-File: LICENSE
13
13
  Requires-Dist: beanie<2,>=1.29.0
14
- Requires-Dist: mindtrace-core>=0.12.0
14
+ Requires-Dist: mindtrace-core>=0.14.0
15
15
  Requires-Dist: pydantic>=2.11.1
16
16
  Requires-Dist: redis>=4.0.0
17
17
  Requires-Dist: redis-om>=0.3.5
18
18
  Requires-Dist: motor>=3.3.0
19
19
  Requires-Dist: pymongo>=4.14.0
20
- Requires-Dist: mindtrace-registry>=0.12.0
20
+ Requires-Dist: mindtrace-registry>=0.14.0
21
21
  Dynamic: license-file
22
22
 
23
23
  [![PyPI version](https://img.shields.io/pypi/v/mindtrace-database)](https://pypi.org/project/mindtrace-database/)
@@ -438,15 +438,16 @@ class MongoMindtraceODM[T: MindtraceDocument](MindtraceODM):
438
438
  if "_id" in data:
439
439
  data.pop("_id")
440
440
 
441
+ # Caller ids were already stripped above; a model validator may mint a
442
+ # deterministic id here and it must survive to the write.
441
443
  doc = self.model_cls(**data)
442
- doc.id = None
443
444
 
444
445
  try:
445
446
  if self._motor_routing:
446
447
  raw = self._motor_model_dump(doc)
447
- raw.pop("_id", None)
448
- if raw.get("id") is None:
449
- raw.pop("id", None)
448
+ for key in ("_id", "id"):
449
+ if raw.get(key) is None:
450
+ raw.pop(key, None)
450
451
  result = await self._motor_collection().insert_one(raw)
451
452
  inserted = await self._motor_collection().find_one({"_id": result.inserted_id})
452
453
  if inserted is None:
@@ -481,12 +482,12 @@ class MongoMindtraceODM[T: MindtraceDocument](MindtraceODM):
481
482
  data = obj.model_dump(mode="python", by_alias=True, serialize_as_any=True)
482
483
  data.pop("id", None)
483
484
  data.pop("_id", None)
485
+ # Same as insert(): caller ids stripped above; minted ids survive.
484
486
  doc = self.model_cls(**data)
485
- doc.id = None
486
487
  raw = self._motor_model_dump(doc)
487
- raw.pop("_id", None)
488
- if raw.get("id") is None:
489
- raw.pop("id", None)
488
+ for key in ("_id", "id"):
489
+ if raw.get(key) is None:
490
+ raw.pop(key, None)
490
491
  raw_docs.append(raw)
491
492
 
492
493
  try:
@@ -2,7 +2,7 @@ import asyncio
2
2
  from enum import Enum
3
3
  from typing import Dict, List, Optional, Type, TypeVar, Union
4
4
 
5
- from pydantic import BaseModel, Field
5
+ from pydantic import BaseModel, ConfigDict, Field
6
6
  from redis_om.model.model import model_registry
7
7
 
8
8
  from mindtrace.database.backends.mindtrace_odm import InitMode, MindtraceODM
@@ -39,15 +39,11 @@ class UnifiedMindtraceDocument(BaseModel):
39
39
  # Optional ID field that can be used by both backends
40
40
  id: Optional[str] = Field(default=None, description="Document ID")
41
41
 
42
- class Config:
43
- """Common configuration for unified documents."""
44
-
45
- # Allow arbitrary types for flexibility
46
- arbitrary_types_allowed = True
47
- # Use enum values for serialization
48
- use_enum_values = True
49
- # Validate assignment
50
- validate_assignment = True
42
+ model_config = ConfigDict(
43
+ arbitrary_types_allowed=True,
44
+ use_enum_values=True,
45
+ validate_assignment=True,
46
+ )
51
47
 
52
48
  class Meta:
53
49
  """
@@ -209,10 +205,16 @@ class UnifiedMindtraceDocument(BaseModel):
209
205
  else:
210
206
  annotations[field_name] = processed_type
211
207
 
208
+ # The generated class owns its id field
209
+ from beanie import PydanticObjectId
210
+
211
+ annotations["id"] = Optional[PydanticObjectId]
212
+
212
213
  # Create the class attributes dictionary
213
214
  class_dict = {
214
215
  "__annotations__": annotations,
215
216
  "__module__": cls.__module__,
217
+ "id": None,
216
218
  }
217
219
 
218
220
  # Add default values to class attributes
@@ -0,0 +1,12 @@
1
+ from datetime import datetime
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from mindtrace.core import utcnow
6
+
7
+
8
+ class User(BaseModel):
9
+ name: str
10
+ id: int | None = None
11
+ created_at: datetime = Field(default_factory=utcnow)
12
+ updated_at: datetime = Field(default_factory=utcnow)
@@ -17,7 +17,7 @@ from mindtrace.core import (
17
17
  BenchSuiteConfig,
18
18
  BenchTestSuite,
19
19
  TaskSchema,
20
- utc_now_iso,
20
+ utcnow_iso,
21
21
  )
22
22
  from mindtrace.database import MongoMindtraceODM
23
23
  from mindtrace.database.testing.suites._models import DatabaseBenchDocument
@@ -58,7 +58,7 @@ class DatabaseMongoCrudSmokeSuite(BenchTestSuite):
58
58
  )
59
59
 
60
60
  def execute_bench(self, config: BenchSuiteConfig, reporter: BenchReporter) -> BenchResult:
61
- started = utc_now_iso()
61
+ started = utcnow_iso()
62
62
  mono = time.perf_counter()
63
63
  mongo_backend, mongo_uri, mongo_db_name = resolve_mongo_resources(config)
64
64
  odm = MongoMindtraceODM(model_cls=DatabaseBenchDocument, db_uri=mongo_uri, db_name=mongo_db_name)
@@ -95,7 +95,7 @@ class DatabaseMongoCrudSmokeSuite(BenchTestSuite):
95
95
  suite_id=config.suite_id,
96
96
  status="passed" if reporter.failures == 0 else "failed",
97
97
  started_at=started,
98
- ended_at=utc_now_iso(),
98
+ ended_at=utcnow_iso(),
99
99
  duration_seconds=elapsed,
100
100
  operations=reporter.operations,
101
101
  successes=reporter.successes,
@@ -17,7 +17,7 @@ from mindtrace.core import (
17
17
  BenchSuiteConfig,
18
18
  BenchTestSuite,
19
19
  TaskSchema,
20
- utc_now_iso,
20
+ utcnow_iso,
21
21
  )
22
22
  from mindtrace.database import MongoMindtraceODM
23
23
  from mindtrace.database.testing.suites._models import DatabaseBenchDocument
@@ -64,7 +64,7 @@ class DatabaseMongoInsertCeilingSuite(BenchTestSuite):
64
64
 
65
65
 
66
66
  async def _run_async(config: BenchSuiteConfig, reporter: BenchReporter) -> BenchResult:
67
- started = utc_now_iso()
67
+ started = utcnow_iso()
68
68
  mono = time.perf_counter()
69
69
  mongo_backend, mongo_uri, mongo_db_name = resolve_mongo_resources(config)
70
70
  batch_size = int(config.parameters.get("batch_size", 100))
@@ -97,7 +97,7 @@ async def _run_async(config: BenchSuiteConfig, reporter: BenchReporter) -> Bench
97
97
  suite_id=config.suite_id,
98
98
  status="passed" if reporter.failures == 0 else "failed",
99
99
  started_at=started,
100
- ended_at=utc_now_iso(),
100
+ ended_at=utcnow_iso(),
101
101
  duration_seconds=elapsed,
102
102
  operations=reporter.operations * batch_size,
103
103
  successes=reporter.successes * batch_size,
@@ -18,7 +18,7 @@ from mindtrace.core import (
18
18
  BenchSuiteConfig,
19
19
  BenchTestSuite,
20
20
  TaskSchema,
21
- utc_now_iso,
21
+ utcnow_iso,
22
22
  )
23
23
  from mindtrace.database import MongoMindtraceODM
24
24
  from mindtrace.database.testing.suites._models import DatabaseBenchDocument
@@ -71,7 +71,7 @@ class DatabaseMongoReadCeilingSuite(BenchTestSuite):
71
71
 
72
72
 
73
73
  async def _run_async(config: BenchSuiteConfig, reporter: BenchReporter) -> BenchResult:
74
- started = utc_now_iso()
74
+ started = utcnow_iso()
75
75
  mono = time.perf_counter()
76
76
  mongo_backend, mongo_uri, mongo_db_name = resolve_mongo_resources(config)
77
77
  dataset_size = int(config.parameters.get("dataset_size", 1000))
@@ -115,7 +115,7 @@ async def _run_async(config: BenchSuiteConfig, reporter: BenchReporter) -> Bench
115
115
  suite_id=config.suite_id,
116
116
  status="passed" if reporter.failures == 0 else "failed",
117
117
  started_at=started,
118
- ended_at=utc_now_iso(),
118
+ ended_at=utcnow_iso(),
119
119
  duration_seconds=elapsed,
120
120
  operations=reporter.operations,
121
121
  successes=reporter.successes,
@@ -18,7 +18,7 @@ from mindtrace.core import (
18
18
  BenchSuiteConfig,
19
19
  BenchTestSuite,
20
20
  TaskSchema,
21
- utc_now_iso,
21
+ utcnow_iso,
22
22
  )
23
23
  from mindtrace.database import MongoMindtraceODM
24
24
  from mindtrace.database.testing.suites._models import DatabaseBenchDocument
@@ -67,7 +67,7 @@ class DatabaseMongoUpdateCeilingSuite(BenchTestSuite):
67
67
 
68
68
 
69
69
  async def _run_async(config: BenchSuiteConfig, reporter: BenchReporter) -> BenchResult:
70
- started = utc_now_iso()
70
+ started = utcnow_iso()
71
71
  mono = time.perf_counter()
72
72
  mongo_backend, mongo_uri, mongo_db_name = resolve_mongo_resources(config)
73
73
  dataset_size = int(config.parameters.get("dataset_size", 1000))
@@ -107,7 +107,7 @@ async def _run_async(config: BenchSuiteConfig, reporter: BenchReporter) -> Bench
107
107
  suite_id=config.suite_id,
108
108
  status="passed" if reporter.failures == 0 else "failed",
109
109
  started_at=started,
110
- ended_at=utc_now_iso(),
110
+ ended_at=utcnow_iso(),
111
111
  duration_seconds=elapsed,
112
112
  operations=reporter.operations,
113
113
  successes=reporter.successes,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mindtrace-database
3
- Version: 0.12.0
3
+ Version: 0.14.0
4
4
  Summary: Database functionality for Mindtrace
5
5
  Author: Mindtrace Team
6
6
  License-Expression: Apache-2.0
@@ -11,13 +11,13 @@ Classifier: Programming Language :: Python :: 3.12
11
11
  Description-Content-Type: text/markdown
12
12
  License-File: LICENSE
13
13
  Requires-Dist: beanie<2,>=1.29.0
14
- Requires-Dist: mindtrace-core>=0.12.0
14
+ Requires-Dist: mindtrace-core>=0.14.0
15
15
  Requires-Dist: pydantic>=2.11.1
16
16
  Requires-Dist: redis>=4.0.0
17
17
  Requires-Dist: redis-om>=0.3.5
18
18
  Requires-Dist: motor>=3.3.0
19
19
  Requires-Dist: pymongo>=4.14.0
20
- Requires-Dist: mindtrace-registry>=0.12.0
20
+ Requires-Dist: mindtrace-registry>=0.14.0
21
21
  Dynamic: license-file
22
22
 
23
23
  [![PyPI version](https://img.shields.io/pypi/v/mindtrace-database)](https://pypi.org/project/mindtrace-database/)
@@ -1,8 +1,8 @@
1
1
  beanie<2,>=1.29.0
2
- mindtrace-core>=0.12.0
2
+ mindtrace-core>=0.14.0
3
3
  pydantic>=2.11.1
4
4
  redis>=4.0.0
5
5
  redis-om>=0.3.5
6
6
  motor>=3.3.0
7
7
  pymongo>=4.14.0
8
- mindtrace-registry>=0.12.0
8
+ mindtrace-registry>=0.14.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mindtrace-database"
3
- version = "0.12.0"
3
+ version = "0.14.0"
4
4
  description = "Database functionality for Mindtrace"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -13,13 +13,13 @@ classifiers = [
13
13
  ]
14
14
  dependencies = [
15
15
  "beanie>=1.29.0, <2",
16
- "mindtrace-core>=0.12.0",
16
+ "mindtrace-core>=0.14.0",
17
17
  "pydantic>=2.11.1",
18
18
  "redis>=4.0.0",
19
19
  "redis-om>=0.3.5",
20
20
  "motor>=3.3.0",
21
21
  "pymongo>=4.14.0",
22
- "mindtrace-registry>=0.12.0",
22
+ "mindtrace-registry>=0.14.0",
23
23
  ]
24
24
 
25
25
  [project.entry-points."mindtrace.benchmark_suites"]
@@ -1,10 +0,0 @@
1
- from datetime import datetime
2
-
3
- from pydantic import BaseModel, Field
4
-
5
-
6
- class User(BaseModel):
7
- name: str
8
- id: int | None = None
9
- created_at: datetime = Field(default_factory=datetime.now)
10
- updated_at: datetime = Field(default_factory=datetime.now)