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.
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/Cargo.lock +4 -4
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/Cargo.toml +1 -1
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/PKG-INFO +1 -1
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/pyproject.toml +1 -1
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/__init__.py +1 -1
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/postgres.py +43 -5
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/LICENSE +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/README.md +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/Cargo.toml +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/benches/hydrate.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/compile/mod.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/error.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/hydrate/mod.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/ir/metadata.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/ir/mod.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/lib.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-core/src/migrate/mod.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-pyo3/Cargo.toml +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-pyo3/src/lib.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/Cargo.toml +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/benches/compile.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/dialect.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/emit.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/fts/mod.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/fts/mssql.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/fts/mysql.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/fts/postgres.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/fts/sqlite.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/crates/ferrum-sql/src/lib.rs +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/_native.pyi +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/__init__.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/app.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/bootstrap.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/init.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/inspectdb_cmd.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/makemigrations_cmd.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/migrate_cmd.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/migrations_cmd.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/resetdb_cmd.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/revert_cmd.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/showmigrations_cmd.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/cli/sqlmigrate_cmd.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/config.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/connection.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/contrib/__init__.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/contrib/fastapi.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/__init__.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/mssql.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/mysql.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/protocol.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/sqlite.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/drivers/streaming.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/echo.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/errors.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/expressions.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/ext/__init__.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/ext/fts.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/ext/pgvector.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/hooks.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/__init__.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/base.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/drift.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/fts/__init__.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/fts/mssql.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/fts/mysql.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/fts/postgres.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/fts/sqlite.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/gates.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/introspect.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/ledger.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/loader.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/operations.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/orchestrator.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/migrations/tokens.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/models.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/observability.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/py.typed +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/queryset.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/registry.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/relations.py +0 -0
- {ferrum_orm-0.1.14 → ferrum_orm-0.1.15}/python/ferrum/runtime.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
258
|
+
version = "0.1.15"
|
|
259
259
|
dependencies = [
|
|
260
260
|
"criterion",
|
|
261
261
|
"ferrum-core",
|
|
@@ -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
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|