fastapi-toolsets 5.1.5__tar.gz → 5.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.
Files changed (46) hide show
  1. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/PKG-INFO +1 -1
  2. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/pyproject.toml +1 -1
  3. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/pyproject.toml.orig +1 -1
  4. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/__init__.py +1 -1
  5. fastapi_toolsets-5.1.7/src/fastapi_toolsets/_orm.py +36 -0
  6. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/crud/factory.py +387 -227
  7. fastapi_toolsets-5.1.7/src/fastapi_toolsets/crud/search.py +622 -0
  8. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/db/watch.py +13 -4
  9. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/dependencies.py +11 -3
  10. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/models/watched.py +33 -30
  11. fastapi_toolsets-5.1.5/src/fastapi_toolsets/crud/search.py +0 -413
  12. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/LICENSE +0 -0
  13. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/README.md +0 -0
  14. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/_imports.py +0 -0
  15. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/cli/__init__.py +0 -0
  16. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/cli/app.py +0 -0
  17. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/cli/commands/__init__.py +0 -0
  18. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/cli/commands/fixtures.py +0 -0
  19. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/cli/config.py +0 -0
  20. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/cli/pyproject.py +0 -0
  21. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/cli/utils.py +0 -0
  22. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/crud/__init__.py +0 -0
  23. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/db/__init__.py +0 -0
  24. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/db/core.py +0 -0
  25. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/db/locks.py +0 -0
  26. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/db/m2m.py +0 -0
  27. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/db/testing.py +0 -0
  28. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/exceptions/__init__.py +0 -0
  29. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/exceptions/exceptions.py +0 -0
  30. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/exceptions/handler.py +0 -0
  31. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/fixtures/__init__.py +0 -0
  32. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/fixtures/enum.py +0 -0
  33. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/fixtures/registry.py +0 -0
  34. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/fixtures/utils.py +0 -0
  35. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/logger.py +0 -0
  36. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/metrics/__init__.py +0 -0
  37. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/metrics/handler.py +0 -0
  38. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/metrics/registry.py +0 -0
  39. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/models/__init__.py +0 -0
  40. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/models/columns.py +0 -0
  41. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/py.typed +0 -0
  42. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/pytest/__init__.py +0 -0
  43. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/pytest/plugin.py +0 -0
  44. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/pytest/utils.py +0 -0
  45. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/src/fastapi_toolsets/schemas.py +0 -0
  46. {fastapi_toolsets-5.1.5 → fastapi_toolsets-5.1.7}/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.5
3
+ Version: 5.1.7
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.5"
3
+ version = "5.1.7"
4
4
  description = "Production-ready utilities for FastAPI applications"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fastapi-toolsets"
3
- version = "5.1.5"
3
+ version = "5.1.7"
4
4
  description = "Production-ready utilities for FastAPI applications"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -24,4 +24,4 @@ Example usage:
24
24
  return Response(data={"user": user.username}, message="Success")
25
25
  """
26
26
 
27
- __version__ = "5.1.5"
27
+ __version__ = "5.1.7"
@@ -0,0 +1,36 @@
1
+ """SQLAlchemy state and expression helpers."""
2
+
3
+ from collections.abc import Iterable, 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_to_many(rels: Iterable[Any]) -> bool:
16
+ """True if the relationship path *rels* crosses a collection."""
17
+ return any(rel.property.uselist for rel in rels)
18
+
19
+
20
+ def is_expired(obj: Any) -> bool:
21
+ """True when *obj* or any of its attributes must be re-read from the database."""
22
+ state = sa_inspect(obj)
23
+ return bool(state.expired or state.expired_attributes)
24
+
25
+
26
+ def loaded_relationships(obj: Any) -> set[str]:
27
+ """Relationship keys currently loaded on *obj*."""
28
+ state = sa_inspect(obj, raiseerr=False)
29
+ if state is None:
30
+ return set()
31
+ unloaded = state.unloaded
32
+ return {
33
+ rel.key
34
+ for rel in state.mapper.relationships
35
+ if rel.key not in unloaded and rel.lazy not in ("dynamic", "write_only")
36
+ }