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.
Files changed (46) hide show
  1. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/PKG-INFO +1 -1
  2. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/pyproject.toml +5 -2
  3. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/pyproject.toml.orig +2 -1
  4. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/__init__.py +1 -1
  5. fastapi_toolsets-5.1.6/src/fastapi_toolsets/_orm.py +31 -0
  6. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/crud/factory.py +276 -185
  7. fastapi_toolsets-5.1.6/src/fastapi_toolsets/crud/search.py +584 -0
  8. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/db/locks.py +1 -1
  9. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/db/watch.py +13 -4
  10. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/fixtures/utils.py +4 -1
  11. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/models/watched.py +15 -20
  12. fastapi_toolsets-5.1.4/src/fastapi_toolsets/crud/search.py +0 -413
  13. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/LICENSE +0 -0
  14. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/README.md +0 -0
  15. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/_imports.py +0 -0
  16. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/__init__.py +0 -0
  17. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/app.py +0 -0
  18. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/commands/__init__.py +0 -0
  19. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/commands/fixtures.py +0 -0
  20. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/config.py +0 -0
  21. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/pyproject.py +0 -0
  22. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/cli/utils.py +0 -0
  23. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/crud/__init__.py +0 -0
  24. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/db/__init__.py +0 -0
  25. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/db/core.py +0 -0
  26. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/db/m2m.py +0 -0
  27. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/db/testing.py +0 -0
  28. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/dependencies.py +0 -0
  29. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/exceptions/__init__.py +0 -0
  30. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/exceptions/exceptions.py +0 -0
  31. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/exceptions/handler.py +0 -0
  32. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/fixtures/__init__.py +0 -0
  33. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/fixtures/enum.py +0 -0
  34. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/fixtures/registry.py +0 -0
  35. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/logger.py +0 -0
  36. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/metrics/__init__.py +0 -0
  37. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/metrics/handler.py +0 -0
  38. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/metrics/registry.py +0 -0
  39. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/models/__init__.py +0 -0
  40. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/models/columns.py +0 -0
  41. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/py.typed +0 -0
  42. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/pytest/__init__.py +0 -0
  43. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/pytest/plugin.py +0 -0
  44. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/pytest/utils.py +0 -0
  45. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/schemas.py +0 -0
  46. {fastapi_toolsets-5.1.4 → fastapi_toolsets-5.1.6}/src/fastapi_toolsets/types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-toolsets
3
- Version: 5.1.4
3
+ Version: 5.1.6
4
4
  Summary: Production-ready utilities for FastAPI applications
5
5
  Keywords: fastapi,sqlalchemy,postgresql
6
6
  Author: d3vyce
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fastapi-toolsets"
3
- version = "5.1.4"
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 = ["ignore::DeprecationWarning"]
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.4"
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]
@@ -24,4 +24,4 @@ Example usage:
24
24
  return Response(data={"user": user.username}, message="Success")
25
25
  """
26
26
 
27
- __version__ = "5.1.4"
27
+ __version__ = "5.1.6"
@@ -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
+ }