fastapi-toolsets 5.1.4__tar.gz → 5.1.6__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.
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/PKG-INFO +1 -1
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/pyproject.toml +5 -2
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/pyproject.toml.orig +2 -1
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/__init__.py +1 -1
- fastapi_toolsets-5.1.6/src/fastapi_toolsets/_orm.py +31 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/crud/factory.py +276 -185
- fastapi_toolsets-5.1.6/src/fastapi_toolsets/crud/search.py +584 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/db/locks.py +1 -1
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/db/watch.py +13 -4
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/fixtures/utils.py +4 -1
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/models/watched.py +15 -20
- fastapi_toolsets-5.1.4/src/fastapi_toolsets/crud/search.py +0 -413
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/LICENSE +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/README.md +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/_imports.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/__init__.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/app.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/commands/__init__.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/commands/fixtures.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/config.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/pyproject.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/utils.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/crud/__init__.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/db/__init__.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/db/core.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/db/m2m.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/db/testing.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/dependencies.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/exceptions/__init__.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/exceptions/exceptions.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/exceptions/handler.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/fixtures/__init__.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/fixtures/enum.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/fixtures/registry.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/logger.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/metrics/__init__.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/metrics/handler.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/metrics/registry.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/models/__init__.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/models/columns.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/py.typed +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/pytest/__init__.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/pytest/plugin.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/pytest/utils.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/schemas.py +0 -0
- {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/types.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fastapi-toolsets"
|
|
3
|
-
version = "5.1.
|
|
3
|
+
version = "5.1.6"
|
|
4
4
|
description = "Production-ready utilities for FastAPI applications"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
@@ -115,7 +115,10 @@ extend-immutable-calls = [
|
|
|
115
115
|
|
|
116
116
|
[tool.pytest.ini_options]
|
|
117
117
|
testpaths = ["tests"]
|
|
118
|
-
filterwarnings = [
|
|
118
|
+
filterwarnings = [
|
|
119
|
+
"ignore::DeprecationWarning",
|
|
120
|
+
"error::sqlalchemy.exc.SADeprecationWarning",
|
|
121
|
+
]
|
|
119
122
|
|
|
120
123
|
[tool.coverage.run]
|
|
121
124
|
source = ["src/fastapi_toolsets"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fastapi-toolsets"
|
|
3
|
-
version = "5.1.
|
|
3
|
+
version = "5.1.6"
|
|
4
4
|
description = "Production-ready utilities for FastAPI applications"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
@@ -110,6 +110,7 @@ extend-immutable-calls = ["fastapi.Depends", "fastapi.Security"]
|
|
|
110
110
|
testpaths = ["tests"]
|
|
111
111
|
filterwarnings = [
|
|
112
112
|
"ignore::DeprecationWarning",
|
|
113
|
+
"error::sqlalchemy.exc.SADeprecationWarning",
|
|
113
114
|
]
|
|
114
115
|
|
|
115
116
|
[tool.coverage.run]
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""SQLAlchemy state and expression helpers."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Sequence
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from sqlalchemy import inspect as sa_inspect
|
|
7
|
+
from sqlalchemy import tuple_
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def key_expr(columns: Sequence[Any]) -> Any:
|
|
11
|
+
"""*columns* as one comparable expression: the column, or a tuple of them."""
|
|
12
|
+
return columns[0] if len(columns) == 1 else tuple_(*columns)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def is_expired(obj: Any) -> bool:
|
|
16
|
+
"""True when *obj* or any of its attributes must be re-read from the database."""
|
|
17
|
+
state = sa_inspect(obj)
|
|
18
|
+
return bool(state.expired or state.expired_attributes)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def loaded_relationships(obj: Any) -> set[str]:
|
|
22
|
+
"""Relationship keys currently loaded on *obj*."""
|
|
23
|
+
state = sa_inspect(obj, raiseerr=False)
|
|
24
|
+
if state is None:
|
|
25
|
+
return set()
|
|
26
|
+
unloaded = state.unloaded
|
|
27
|
+
return {
|
|
28
|
+
rel.key
|
|
29
|
+
for rel in state.mapper.relationships
|
|
30
|
+
if rel.key not in unloaded and rel.lazy not in ("dynamic", "write_only")
|
|
31
|
+
}
|