ferrum-orm 0.1.6__tar.gz → 0.1.7__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.7}/PKG-INFO +19 -1
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/README.md +18 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/pyproject.toml +1 -1
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/__init__.py +10 -2
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/models.py +27 -2
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/queryset.py +571 -429
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/Cargo.lock +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/Cargo.toml +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/LICENSE +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-core/Cargo.toml +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-core/benches/hydrate.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-core/src/compile/mod.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-core/src/error.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-core/src/hydrate/mod.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-core/src/ir/metadata.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-core/src/ir/mod.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-core/src/lib.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-core/src/migrate/mod.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-pyo3/Cargo.toml +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-pyo3/src/lib.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-sql/Cargo.toml +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-sql/benches/compile.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-sql/src/dialect.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-sql/src/emit.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-sql/src/fts/mod.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-sql/src/fts/mssql.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-sql/src/fts/mysql.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-sql/src/fts/postgres.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-sql/src/fts/sqlite.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/crates/ferrum-sql/src/lib.rs +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/_native.pyi +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/cli/__init__.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/cli/app.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/cli/bootstrap.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/cli/init.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/cli/inspectdb_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/cli/makemigrations_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/cli/migrate_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/cli/migrations_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/cli/resetdb_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/cli/revert_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/cli/showmigrations_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/cli/sqlmigrate_cmd.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/config.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/connection.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/contrib/__init__.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/contrib/fastapi.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/drivers/__init__.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/drivers/mssql.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/drivers/mysql.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/drivers/postgres.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/drivers/protocol.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/drivers/sqlite.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/errors.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/expressions.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/ext/__init__.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/ext/fts.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/ext/pgvector.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/hooks.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/__init__.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/base.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/drift.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/fts/__init__.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/fts/mssql.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/fts/mysql.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/fts/postgres.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/fts/sqlite.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/gates.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/introspect.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/ledger.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/loader.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/operations.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/orchestrator.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/migrations/tokens.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/observability.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/py.typed +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/registry.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/relations.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/runtime.py +0 -0
- {ferrum_orm-0.1.6 → ferrum_orm-0.1.7}/python/ferrum/session.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ferrum-orm
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.7
|
|
4
4
|
Classifier: Development Status :: 3 - Alpha
|
|
5
5
|
Classifier: Framework :: AsyncIO
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -173,6 +173,24 @@ users = await (
|
|
|
173
173
|
)
|
|
174
174
|
```
|
|
175
175
|
|
|
176
|
+
### First-Class IDE Support
|
|
177
|
+
|
|
178
|
+
Ferrum ships a PEP 561 `py.typed` marker, so editors and type checkers (`mypy`, `pyright`,
|
|
179
|
+
`ty`) resolve its inline hints out of the box. `Model.objects` is typed as
|
|
180
|
+
`QuerySet[YourModel]`, chaining preserves the model type, and terminals infer precise results —
|
|
181
|
+
no casts:
|
|
182
|
+
|
|
183
|
+
```python
|
|
184
|
+
users: list[User] = await User.objects.filter(is_active=True).all(conn) # list[User]
|
|
185
|
+
user: User | None = await User.objects.first(conn) # User | None
|
|
186
|
+
rows: list[dict[str, Any]] = await User.objects.values("id", "email").all(conn)
|
|
187
|
+
ids: list[Any] = await User.objects.values_list("id", flat=True).all(conn)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
`values()` / `values_list()` return dedicated `ValuesQuerySet`, `ValuesListQuerySet`, and
|
|
191
|
+
`FlatValuesListQuerySet` variants (all exported from `ferrum`) so `all()` returns
|
|
192
|
+
`list[dict[str, Any]]`, `list[tuple[Any, ...]]`, or `list[Any]` respectively.
|
|
193
|
+
|
|
176
194
|
### Rust-Powered Core
|
|
177
195
|
|
|
178
196
|
Performance-critical components are implemented in Rust:
|
|
@@ -101,6 +101,24 @@ users = await (
|
|
|
101
101
|
)
|
|
102
102
|
```
|
|
103
103
|
|
|
104
|
+
### First-Class IDE Support
|
|
105
|
+
|
|
106
|
+
Ferrum ships a PEP 561 `py.typed` marker, so editors and type checkers (`mypy`, `pyright`,
|
|
107
|
+
`ty`) resolve its inline hints out of the box. `Model.objects` is typed as
|
|
108
|
+
`QuerySet[YourModel]`, chaining preserves the model type, and terminals infer precise results —
|
|
109
|
+
no casts:
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
users: list[User] = await User.objects.filter(is_active=True).all(conn) # list[User]
|
|
113
|
+
user: User | None = await User.objects.first(conn) # User | None
|
|
114
|
+
rows: list[dict[str, Any]] = await User.objects.values("id", "email").all(conn)
|
|
115
|
+
ids: list[Any] = await User.objects.values_list("id", flat=True).all(conn)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`values()` / `values_list()` return dedicated `ValuesQuerySet`, `ValuesListQuerySet`, and
|
|
119
|
+
`FlatValuesListQuerySet` variants (all exported from `ferrum`) so `all()` returns
|
|
120
|
+
`list[dict[str, Any]]`, `list[tuple[Any, ...]]`, or `list[Any]` respectively.
|
|
121
|
+
|
|
104
122
|
### Rust-Powered Core
|
|
105
123
|
|
|
106
124
|
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.7"
|
|
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."
|