ferrum-orm 0.1.14__tar.gz → 0.1.15__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 (82) hide show
  1. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/Cargo.lock +4 -4
  2. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/Cargo.toml +1 -1
  3. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/PKG-INFO +1 -1
  4. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/pyproject.toml +1 -1
  5. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/__init__.py +1 -1
  6. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/postgres.py +43 -5
  7. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/LICENSE +0 -0
  8. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/README.md +0 -0
  9. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/Cargo.toml +0 -0
  10. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/benches/hydrate.rs +0 -0
  11. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/compile/mod.rs +0 -0
  12. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/error.rs +0 -0
  13. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/hydrate/mod.rs +0 -0
  14. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/ir/metadata.rs +0 -0
  15. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/ir/mod.rs +0 -0
  16. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/lib.rs +0 -0
  17. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/migrate/mod.rs +0 -0
  18. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-pyo3/Cargo.toml +0 -0
  19. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-pyo3/src/lib.rs +0 -0
  20. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/Cargo.toml +0 -0
  21. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/benches/compile.rs +0 -0
  22. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/dialect.rs +0 -0
  23. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/emit.rs +0 -0
  24. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/fts/mod.rs +0 -0
  25. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/fts/mssql.rs +0 -0
  26. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/fts/mysql.rs +0 -0
  27. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/fts/postgres.rs +0 -0
  28. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/fts/sqlite.rs +0 -0
  29. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/lib.rs +0 -0
  30. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/_native.pyi +0 -0
  31. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/__init__.py +0 -0
  32. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/app.py +0 -0
  33. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/bootstrap.py +0 -0
  34. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/init.py +0 -0
  35. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/inspectdb_cmd.py +0 -0
  36. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/makemigrations_cmd.py +0 -0
  37. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/migrate_cmd.py +0 -0
  38. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/migrations_cmd.py +0 -0
  39. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/resetdb_cmd.py +0 -0
  40. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/revert_cmd.py +0 -0
  41. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/showmigrations_cmd.py +0 -0
  42. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/sqlmigrate_cmd.py +0 -0
  43. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/config.py +0 -0
  44. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/connection.py +0 -0
  45. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/contrib/__init__.py +0 -0
  46. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/contrib/fastapi.py +0 -0
  47. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/__init__.py +0 -0
  48. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/mssql.py +0 -0
  49. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/mysql.py +0 -0
  50. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/protocol.py +0 -0
  51. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/sqlite.py +0 -0
  52. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/streaming.py +0 -0
  53. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/echo.py +0 -0
  54. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/errors.py +0 -0
  55. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/expressions.py +0 -0
  56. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/ext/__init__.py +0 -0
  57. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/ext/fts.py +0 -0
  58. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/ext/pgvector.py +0 -0
  59. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/hooks.py +0 -0
  60. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/__init__.py +0 -0
  61. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/base.py +0 -0
  62. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/drift.py +0 -0
  63. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/fts/__init__.py +0 -0
  64. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/fts/mssql.py +0 -0
  65. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/fts/mysql.py +0 -0
  66. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/fts/postgres.py +0 -0
  67. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/fts/sqlite.py +0 -0
  68. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/gates.py +0 -0
  69. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/introspect.py +0 -0
  70. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/ledger.py +0 -0
  71. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/loader.py +0 -0
  72. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/operations.py +0 -0
  73. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/orchestrator.py +0 -0
  74. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/tokens.py +0 -0
  75. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/models.py +0 -0
  76. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/observability.py +0 -0
  77. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/py.typed +0 -0
  78. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/queryset.py +0 -0
  79. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/registry.py +0 -0
  80. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/relations.py +0 -0
  81. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/runtime.py +0 -0
  82. {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/session.py +0 -0
@@ -223,7 +223,7 @@ checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
223
223
 
224
224
  [[package]]
225
225
  name = "ferrum-core"
226
- version = "0.1.14"
226
+ version = "0.1.15"
227
227
  dependencies = [
228
228
  "criterion",
229
229
  "proptest",
@@ -234,7 +234,7 @@ dependencies = [
234
234
 
235
235
  [[package]]
236
236
  name = "ferrum-migrate"
237
- version = "0.1.14"
237
+ version = "0.1.15"
238
238
  dependencies = [
239
239
  "ferrum-core",
240
240
  "serde",
@@ -243,7 +243,7 @@ dependencies = [
243
243
 
244
244
  [[package]]
245
245
  name = "ferrum-pyo3"
246
- version = "0.1.14"
246
+ version = "0.1.15"
247
247
  dependencies = [
248
248
  "ferrum-core",
249
249
  "ferrum-sql",
@@ -255,7 +255,7 @@ dependencies = [
255
255
 
256
256
  [[package]]
257
257
  name = "ferrum-sql"
258
- version = "0.1.14"
258
+ version = "0.1.15"
259
259
  dependencies = [
260
260
  "criterion",
261
261
  "ferrum-core",
@@ -3,7 +3,7 @@ members = ["crates/ferrum-core", "crates/ferrum-sql", "crates/ferrum-pyo3"]
3
3
  resolver = "2"
4
4
 
5
5
  [workspace.package]
6
- version = "0.1.14"
6
+ version = "0.1.15"
7
7
  edition = "2021"
8
8
  authors = ["Ferrum Contributors"]
9
9
  license = "Apache-2.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ferrum-orm
3
- Version: 0.1.14
3
+ Version: 0.1.15
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Framework :: AsyncIO
6
6
  Classifier: Intended Audience :: Developers
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "ferrum-orm"
7
- version = "0.1.14"
7
+ version = "0.1.15"
8
8
  description = "Next-generation async ORM for Python with a Rust-powered core"
9
9
  license = { text = "Apache-2.0" }
10
10
  readme = "README.md"
@@ -6,7 +6,7 @@ Import paths are stable API; internal module paths are not.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- __version__ = "0.1.14"
9
+ __version__ = "0.1.15"
10
10
  __all__ = [
11
11
  "Aggregate",
12
12
  "CreateExtension",
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import contextlib
6
+ import json
6
7
  from collections.abc import AsyncGenerator
7
8
  from typing import Any
8
9
 
@@ -11,6 +12,41 @@ from ferrum.drivers.streaming import AsyncpgChunkStream
11
12
  from ferrum.errors import FerrumConfigError, FerrumConnectionError, map_db_error
12
13
 
13
14
 
15
+ def _encode_json_param(value: Any) -> str:
16
+ """Encode a Python value for asyncpg ``json`` / ``jsonb`` text codecs.
17
+
18
+ Ferrum's bind path already ``json.dumps`` JSON fields to text before the
19
+ driver (with SQL ``::jsonb`` casts). Accept pre-serialized strings so a
20
+ codec encoder never double-encodes those binds if a future path sends the
21
+ parameter as a native json/jsonb OID.
22
+ """
23
+ if isinstance(value, str):
24
+ return value
25
+ return json.dumps(value, default=str, separators=(",", ":"))
26
+
27
+
28
+ def _decode_json_param(value: str) -> Any:
29
+ """Decode asyncpg ``json`` / ``jsonb`` text into native Python objects."""
30
+ return json.loads(value)
31
+
32
+
33
+ async def _register_json_codecs(conn: Any) -> None:
34
+ """Make JSONB/JSON columns hydrate as ``dict`` / ``list``, not ``str``.
35
+
36
+ asyncpg's default is to return ``json``/``jsonb`` as text. Without this,
37
+ ``model_construct`` leaves JSON fields as strings and Pydantic consumers
38
+ that expect ``dict`` fail at the agent/MCP boundary.
39
+ """
40
+ for type_name in ("jsonb", "json"):
41
+ await conn.set_type_codec(
42
+ type_name,
43
+ schema="pg_catalog",
44
+ encoder=_encode_json_param,
45
+ decoder=_decode_json_param,
46
+ format="text",
47
+ )
48
+
49
+
14
50
  class _BoundConnection:
15
51
  """Execution surface pinned to a single raw connection inside a transaction.
16
52
 
@@ -139,13 +175,15 @@ class AsyncpgDriver:
139
175
  }
140
176
  if self._max_lifetime is not None:
141
177
  pool_kwargs["max_inactive_connection_lifetime"] = self._max_lifetime
142
- if self._statement_timeout_ms is not None:
143
- timeout_ms = self._statement_timeout_ms
144
178
 
145
- async def _init_conn(conn: Any) -> None:
146
- await conn.execute(f"SET statement_timeout = {timeout_ms}")
179
+ statement_timeout_ms = self._statement_timeout_ms
180
+
181
+ async def _init_conn(conn: Any) -> None:
182
+ await _register_json_codecs(conn)
183
+ if statement_timeout_ms is not None:
184
+ await conn.execute(f"SET statement_timeout = {statement_timeout_ms}")
147
185
 
148
- pool_kwargs["init"] = _init_conn
186
+ pool_kwargs["init"] = _init_conn
149
187
  try:
150
188
  self._pool = await asyncpg.create_pool(self._dsn, **pool_kwargs)
151
189
  except Exception as exc:
File without changes
File without changes