ferrum-orm 0.1.6__tar.gz → 0.1.8__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.6 → ferrum_orm-0.1.8}/Cargo.lock +6 -6
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/Cargo.toml +1 -1
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/PKG-INFO +27 -1
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/README.md +26 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/pyproject.toml +1 -1
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/__init__.py +10 -2
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/models.py +27 -2
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/queryset.py +886 -535
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/LICENSE +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-core/Cargo.toml +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-core/benches/hydrate.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-core/src/compile/mod.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-core/src/error.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-core/src/hydrate/mod.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-core/src/ir/metadata.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-core/src/ir/mod.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-core/src/lib.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-core/src/migrate/mod.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-pyo3/Cargo.toml +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-pyo3/src/lib.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-sql/Cargo.toml +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-sql/benches/compile.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-sql/src/dialect.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-sql/src/emit.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-sql/src/fts/mod.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-sql/src/fts/mssql.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-sql/src/fts/mysql.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-sql/src/fts/postgres.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-sql/src/fts/sqlite.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/crates/ferrum-sql/src/lib.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/_native.pyi +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/cli/__init__.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/cli/app.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/cli/bootstrap.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/cli/init.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/cli/inspectdb_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/cli/makemigrations_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/cli/migrate_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/cli/migrations_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/cli/resetdb_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/cli/revert_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/cli/showmigrations_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/cli/sqlmigrate_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/config.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/connection.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/contrib/__init__.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/contrib/fastapi.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/drivers/__init__.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/drivers/mssql.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/drivers/mysql.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/drivers/postgres.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/drivers/protocol.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/drivers/sqlite.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/errors.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/expressions.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/ext/__init__.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/ext/fts.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/ext/pgvector.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/hooks.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/__init__.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/base.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/drift.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/fts/__init__.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/fts/mssql.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/fts/mysql.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/fts/postgres.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/fts/sqlite.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/gates.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/introspect.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/ledger.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/loader.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/operations.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/orchestrator.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/migrations/tokens.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/observability.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/py.typed +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/registry.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/relations.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/runtime.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.8}/python/ferrum/session.py +0 -0
|
@@ -174,9 +174,9 @@ dependencies = [
|
|
|
174
174
|
|
|
175
175
|
[[package]]
|
|
176
176
|
name = "crossbeam-epoch"
|
|
177
|
-
version = "0.9.
|
|
177
|
+
version = "0.9.20"
|
|
178
178
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
179
|
-
checksum = "
|
|
179
|
+
checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f"
|
|
180
180
|
dependencies = [
|
|
181
181
|
"crossbeam-utils",
|
|
182
182
|
]
|
|
@@ -223,7 +223,7 @@ checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
|
|
|
223
223
|
|
|
224
224
|
[[package]]
|
|
225
225
|
name = "ferrum-core"
|
|
226
|
-
version = "0.1.
|
|
226
|
+
version = "0.1.8"
|
|
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.8"
|
|
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.8"
|
|
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.8"
|
|
259
259
|
dependencies = [
|
|
260
260
|
"criterion",
|
|
261
261
|
"ferrum-core",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ferrum-orm
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.8
|
|
4
4
|
Classifier: Development Status :: 3 - Alpha
|
|
5
5
|
Classifier: Framework :: AsyncIO
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -121,6 +121,14 @@ user = await User.objects.create(
|
|
|
121
121
|
email="john@example.com",
|
|
122
122
|
)
|
|
123
123
|
|
|
124
|
+
# Insert from an instance (sentinel PK is dropped so the DB default runs)
|
|
125
|
+
draft = User(id=0, email="dana@example.com")
|
|
126
|
+
created = await User.objects.create(conn, draft)
|
|
127
|
+
|
|
128
|
+
# Persist one instance's changes by primary key
|
|
129
|
+
created.is_active = False
|
|
130
|
+
await User.objects.update_instance(conn, created, fields=["is_active"])
|
|
131
|
+
|
|
124
132
|
users = await (
|
|
125
133
|
User.objects
|
|
126
134
|
.filter(is_active=True)
|
|
@@ -173,6 +181,24 @@ users = await (
|
|
|
173
181
|
)
|
|
174
182
|
```
|
|
175
183
|
|
|
184
|
+
### First-Class IDE Support
|
|
185
|
+
|
|
186
|
+
Ferrum ships a PEP 561 `py.typed` marker, so editors and type checkers (`mypy`, `pyright`,
|
|
187
|
+
`ty`) resolve its inline hints out of the box. `Model.objects` is typed as
|
|
188
|
+
`QuerySet[YourModel]`, chaining preserves the model type, and terminals infer precise results —
|
|
189
|
+
no casts:
|
|
190
|
+
|
|
191
|
+
```python
|
|
192
|
+
users: list[User] = await User.objects.filter(is_active=True).all(conn) # list[User]
|
|
193
|
+
user: User | None = await User.objects.first(conn) # User | None
|
|
194
|
+
rows: list[dict[str, Any]] = await User.objects.values("id", "email").all(conn)
|
|
195
|
+
ids: list[Any] = await User.objects.values_list("id", flat=True).all(conn)
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
`values()` / `values_list()` return dedicated `ValuesQuerySet`, `ValuesListQuerySet`, and
|
|
199
|
+
`FlatValuesListQuerySet` variants (all exported from `ferrum`) so `all()` returns
|
|
200
|
+
`list[dict[str, Any]]`, `list[tuple[Any, ...]]`, or `list[Any]` respectively.
|
|
201
|
+
|
|
176
202
|
### Rust-Powered Core
|
|
177
203
|
|
|
178
204
|
Performance-critical components are implemented in Rust:
|
|
@@ -49,6 +49,14 @@ user = await User.objects.create(
|
|
|
49
49
|
email="john@example.com",
|
|
50
50
|
)
|
|
51
51
|
|
|
52
|
+
# Insert from an instance (sentinel PK is dropped so the DB default runs)
|
|
53
|
+
draft = User(id=0, email="dana@example.com")
|
|
54
|
+
created = await User.objects.create(conn, draft)
|
|
55
|
+
|
|
56
|
+
# Persist one instance's changes by primary key
|
|
57
|
+
created.is_active = False
|
|
58
|
+
await User.objects.update_instance(conn, created, fields=["is_active"])
|
|
59
|
+
|
|
52
60
|
users = await (
|
|
53
61
|
User.objects
|
|
54
62
|
.filter(is_active=True)
|
|
@@ -101,6 +109,24 @@ users = await (
|
|
|
101
109
|
)
|
|
102
110
|
```
|
|
103
111
|
|
|
112
|
+
### First-Class IDE Support
|
|
113
|
+
|
|
114
|
+
Ferrum ships a PEP 561 `py.typed` marker, so editors and type checkers (`mypy`, `pyright`,
|
|
115
|
+
`ty`) resolve its inline hints out of the box. `Model.objects` is typed as
|
|
116
|
+
`QuerySet[YourModel]`, chaining preserves the model type, and terminals infer precise results —
|
|
117
|
+
no casts:
|
|
118
|
+
|
|
119
|
+
```python
|
|
120
|
+
users: list[User] = await User.objects.filter(is_active=True).all(conn) # list[User]
|
|
121
|
+
user: User | None = await User.objects.first(conn) # User | None
|
|
122
|
+
rows: list[dict[str, Any]] = await User.objects.values("id", "email").all(conn)
|
|
123
|
+
ids: list[Any] = await User.objects.values_list("id", flat=True).all(conn)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
`values()` / `values_list()` return dedicated `ValuesQuerySet`, `ValuesListQuerySet`, and
|
|
127
|
+
`FlatValuesListQuerySet` variants (all exported from `ferrum`) so `all()` returns
|
|
128
|
+
`list[dict[str, Any]]`, `list[tuple[Any, ...]]`, or `list[Any]` respectively.
|
|
129
|
+
|
|
104
130
|
### Rust-Powered Core
|
|
105
131
|
|
|
106
132
|
Performance-critical components are implemented in Rust:
|
|
@@ -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.
|
|
9
|
+
__version__ = "0.1.8"
|
|
10
10
|
__all__ = [
|
|
11
11
|
"CreateExtension",
|
|
12
12
|
"CreateFunction",
|
|
@@ -30,6 +30,7 @@ __all__ = [
|
|
|
30
30
|
"FerrumSchemaError",
|
|
31
31
|
"FerrumTimeoutError",
|
|
32
32
|
"Field",
|
|
33
|
+
"FlatValuesListQuerySet",
|
|
33
34
|
"ForeignKey",
|
|
34
35
|
"FullTextIndex",
|
|
35
36
|
"Index",
|
|
@@ -43,6 +44,8 @@ __all__ = [
|
|
|
43
44
|
"RetryPolicy",
|
|
44
45
|
"TSVector",
|
|
45
46
|
"Transaction",
|
|
47
|
+
"ValuesListQuerySet",
|
|
48
|
+
"ValuesQuerySet",
|
|
46
49
|
"Vector",
|
|
47
50
|
"clear_hooks",
|
|
48
51
|
"connect",
|
|
@@ -101,7 +104,12 @@ from ferrum.models import (
|
|
|
101
104
|
Vector,
|
|
102
105
|
)
|
|
103
106
|
from ferrum.observability import enable_metrics, enable_opentelemetry, get_metrics
|
|
104
|
-
from ferrum.queryset import
|
|
107
|
+
from ferrum.queryset import (
|
|
108
|
+
FlatValuesListQuerySet,
|
|
109
|
+
QuerySet,
|
|
110
|
+
ValuesListQuerySet,
|
|
111
|
+
ValuesQuerySet,
|
|
112
|
+
)
|
|
105
113
|
from ferrum.runtime import RetryPolicy
|
|
106
114
|
from ferrum.session import (
|
|
107
115
|
current_setting as get_session_config,
|
|
@@ -19,7 +19,20 @@ import re
|
|
|
19
19
|
import types as _types
|
|
20
20
|
from datetime import date, datetime, time
|
|
21
21
|
from decimal import Decimal
|
|
22
|
-
from typing import
|
|
22
|
+
from typing import (
|
|
23
|
+
TYPE_CHECKING,
|
|
24
|
+
Annotated,
|
|
25
|
+
Any,
|
|
26
|
+
ClassVar,
|
|
27
|
+
Literal,
|
|
28
|
+
NoReturn,
|
|
29
|
+
TypeVar,
|
|
30
|
+
Union,
|
|
31
|
+
cast,
|
|
32
|
+
get_args,
|
|
33
|
+
get_origin,
|
|
34
|
+
overload,
|
|
35
|
+
)
|
|
23
36
|
from uuid import UUID
|
|
24
37
|
|
|
25
38
|
from pydantic import BaseModel as _PydanticBaseModel
|
|
@@ -950,6 +963,13 @@ def _build_metadata(cls: type[_PydanticBaseModel]) -> ModelMetadata:
|
|
|
950
963
|
# Manager descriptor
|
|
951
964
|
# ---------------------------------------------------------------------------
|
|
952
965
|
|
|
966
|
+
if TYPE_CHECKING:
|
|
967
|
+
from ferrum.queryset import QuerySet
|
|
968
|
+
|
|
969
|
+
# Bound to the accessing model type via ``owner`` so ``User.objects`` infers
|
|
970
|
+
# ``QuerySet[User]`` in IDEs / type checkers (PEP 561 descriptor idiom).
|
|
971
|
+
_M = TypeVar("_M", bound="Model")
|
|
972
|
+
|
|
953
973
|
|
|
954
974
|
class _Manager:
|
|
955
975
|
"""Descriptor that vends a fresh ``QuerySet`` bound to the model class.
|
|
@@ -962,7 +982,12 @@ class _Manager:
|
|
|
962
982
|
``ferrum.queryset`` (models is the lower layer; queryset depends on it).
|
|
963
983
|
"""
|
|
964
984
|
|
|
965
|
-
|
|
985
|
+
@overload
|
|
986
|
+
def __get__(self, obj: None, owner: type[_M]) -> QuerySet[_M]: ...
|
|
987
|
+
@overload
|
|
988
|
+
def __get__(self, obj: Model, owner: type[_M]) -> NoReturn: ...
|
|
989
|
+
|
|
990
|
+
def __get__(self, obj: object, owner: type | None = None) -> Any:
|
|
966
991
|
if obj is not None:
|
|
967
992
|
raise AttributeError(
|
|
968
993
|
"'objects' is a class-level manager and cannot be accessed on a model instance."
|