fastapi-factory-utilities 0.3.4__tar.gz → 0.3.5__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.

Potentially problematic release.


This version of fastapi-factory-utilities might be problematic. Click here for more details.

Files changed (78) hide show
  1. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/PKG-INFO +1 -1
  2. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/pyproject.toml +1 -1
  3. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/exceptions.py +2 -1
  4. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/odm_plugin/repositories.py +10 -22
  5. fastapi_factory_utilities-0.3.5/src/fastapi_factory_utilities/core/security/kratos.py +98 -0
  6. fastapi_factory_utilities-0.3.4/src/fastapi_factory_utilities/core/security/kratos.py +0 -78
  7. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/LICENSE +0 -0
  8. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/README.md +0 -0
  9. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/__main__.py +0 -0
  10. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/__init__.py +0 -0
  11. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/api/__init__.py +0 -0
  12. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/api/tags.py +0 -0
  13. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/api/v1/sys/__init__.py +0 -0
  14. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/api/v1/sys/health.py +0 -0
  15. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/api/v1/sys/readiness.py +0 -0
  16. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/app/__init__.py +0 -0
  17. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/app/application.py +0 -0
  18. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/app/builder.py +0 -0
  19. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/app/config.py +0 -0
  20. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/app/enums.py +0 -0
  21. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/app/exceptions.py +0 -0
  22. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/app/fastapi_builder.py +0 -0
  23. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/app/plugin_manager/__init__.py +0 -0
  24. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/app/plugin_manager/exceptions.py +0 -0
  25. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/app/plugin_manager/plugin_manager.py +0 -0
  26. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/__init__.py +0 -0
  27. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/example/__init__.py +0 -0
  28. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/httpx_plugin/__init__.py +0 -0
  29. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/odm_plugin/__init__.py +0 -0
  30. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/odm_plugin/builder.py +0 -0
  31. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/odm_plugin/configs.py +0 -0
  32. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/odm_plugin/depends.py +0 -0
  33. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/odm_plugin/documents.py +0 -0
  34. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/odm_plugin/exceptions.py +0 -0
  35. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/opentelemetry_plugin/__init__.py +0 -0
  36. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/opentelemetry_plugin/builder.py +0 -0
  37. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/opentelemetry_plugin/configs.py +0 -0
  38. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/opentelemetry_plugin/exceptions.py +0 -0
  39. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/plugins/opentelemetry_plugin/helpers.py +0 -0
  40. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/protocols.py +0 -0
  41. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/security/jwt.py +0 -0
  42. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/services/kratos/__init__.py +0 -0
  43. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/services/kratos/enums.py +0 -0
  44. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/services/kratos/exceptions.py +0 -0
  45. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/services/kratos/objects.py +0 -0
  46. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/services/kratos/services.py +0 -0
  47. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/services/status/__init__.py +0 -0
  48. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/services/status/enums.py +0 -0
  49. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/services/status/exceptions.py +0 -0
  50. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/services/status/health_calculator_strategies.py +0 -0
  51. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/services/status/readiness_calculator_strategies.py +0 -0
  52. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/services/status/services.py +0 -0
  53. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/services/status/types.py +0 -0
  54. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/utils/configs.py +0 -0
  55. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/utils/importlib.py +0 -0
  56. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/utils/log.py +0 -0
  57. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/utils/status.py +0 -0
  58. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/utils/uvicorn.py +0 -0
  59. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/core/utils/yaml_reader.py +0 -0
  60. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/__init__.py +0 -0
  61. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/__main__.py +0 -0
  62. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/api/__init__.py +0 -0
  63. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/api/books/__init__.py +0 -0
  64. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/api/books/responses.py +0 -0
  65. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/api/books/routes.py +0 -0
  66. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/app.py +0 -0
  67. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/application.yaml +0 -0
  68. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/entities/books/__init__.py +0 -0
  69. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/entities/books/entities.py +0 -0
  70. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/entities/books/enums.py +0 -0
  71. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/entities/books/types.py +0 -0
  72. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/models/__init__.py +0 -0
  73. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/models/books/__init__.py +0 -0
  74. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/models/books/document.py +0 -0
  75. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/models/books/repository.py +0 -0
  76. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/services/books/__init__.py +0 -0
  77. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/example/services/books/services.py +0 -0
  78. {fastapi_factory_utilities-0.3.4 → fastapi_factory_utilities-0.3.5}/src/fastapi_factory_utilities/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fastapi_factory_utilities
3
- Version: 0.3.4
3
+ Version: 0.3.5
4
4
  Summary: Consolidate libraries and utilities to create microservices in Python with FastAPI, Beanie, Httpx, AioPika and OpenTelemetry.
5
5
  License: MIT
6
6
  Keywords: python,fastapi,beanie,httpx,opentelemetry,microservices
@@ -3,7 +3,7 @@ name = "fastapi_factory_utilities"
3
3
  homepage = "https://github.com/miragecentury/fastapi_factory_utilities"
4
4
  repository = "https://github.com/miragecentury/fastapi_factory_utilities"
5
5
  keywords = ["python", "fastapi", "beanie", "httpx", "opentelemetry", "microservices"]
6
- version = "0.3.4"
6
+ version = "0.3.5"
7
7
  description = "Consolidate libraries and utilities to create microservices in Python with FastAPI, Beanie, Httpx, AioPika and OpenTelemetry."
8
8
  authors = ["miragecentury <victorien.vanroye@gmail.com>"]
9
9
  maintainers = ["miragecentury <victorien.vanroye@gmail.com>"]
@@ -1,7 +1,8 @@
1
1
  """FastAPI Factory Utilities exceptions."""
2
2
 
3
3
  import logging
4
- from typing import Any, Sequence
4
+ from collections.abc import Sequence
5
+ from typing import Any
5
6
 
6
7
  from opentelemetry.trace import Span, get_current_span
7
8
  from opentelemetry.util.types import AttributeValue
@@ -2,24 +2,12 @@
2
2
 
3
3
  import datetime
4
4
  from abc import ABC
5
- from collections.abc import AsyncGenerator, Callable
5
+ from collections.abc import AsyncGenerator, Callable, Mapping
6
6
  from contextlib import asynccontextmanager
7
- from typing import (
8
- Any,
9
- Dict,
10
- Generic,
11
- List,
12
- Mapping,
13
- Optional,
14
- Tuple,
15
- TypeVar,
16
- Union,
17
- get_args,
18
- )
7
+ from typing import Any, Generic, TypeVar, get_args
19
8
  from uuid import UUID
20
9
 
21
10
  from beanie import SortDirection
22
- from beanie.odm.queries.find import FindMany
23
11
  from motor.motor_asyncio import AsyncIOMotorClientSession, AsyncIOMotorDatabase
24
12
  from pydantic import BaseModel
25
13
  from pymongo.errors import DuplicateKeyError, PyMongoError
@@ -229,19 +217,19 @@ class AbstractRepository(ABC, Generic[DocumentGenericType, EntityGenericType]):
229
217
  raise OperationError("Failed to delete document.")
230
218
 
231
219
  @managed_session()
232
- async def find(
220
+ async def find( # noqa: PLR0913
233
221
  self,
234
- *args: Union[Mapping[str, Any], bool],
222
+ *args: Mapping[str, Any] | bool,
235
223
  projection_model: None = None,
236
- skip: Optional[int] = None,
237
- limit: Optional[int] = None,
238
- sort: Union[None, str, List[Tuple[str, SortDirection]]] = None,
239
- session: Optional[AsyncIOMotorClientSession] = None,
224
+ skip: int | None = None,
225
+ limit: int | None = None,
226
+ sort: None | str | list[tuple[str, SortDirection]] = None,
227
+ session: AsyncIOMotorClientSession | None = None,
240
228
  ignore_cache: bool = False,
241
229
  fetch_links: bool = False,
242
230
  lazy_parse: bool = False,
243
- nesting_depth: Optional[int] = None,
244
- nesting_depths_per_field: Optional[Dict[str, int]] = None,
231
+ nesting_depth: int | None = None,
232
+ nesting_depths_per_field: dict[str, int] | None = None,
245
233
  **pymongo_kwargs: Any,
246
234
  ) -> list[EntityGenericType]:
247
235
  """Find documents in the database.
@@ -0,0 +1,98 @@
1
+ """Provide Kratos Session and Identity classes."""
2
+
3
+ from enum import StrEnum
4
+ from typing import Annotated
5
+
6
+ from fastapi import Depends, HTTPException, Request
7
+
8
+ from fastapi_factory_utilities.core.services.kratos import (
9
+ KratosOperationError,
10
+ KratosService,
11
+ KratosSessionInvalidError,
12
+ KratosSessionObject,
13
+ depends_kratos_service,
14
+ )
15
+
16
+
17
+ class KratosSessionAuthenticationErrors(StrEnum):
18
+ """Kratos Session Authentication Errors."""
19
+
20
+ MISSING_CREDENTIALS = "Missing Credentials"
21
+ INVALID_CREDENTIALS = "Invalid Credentials"
22
+ INTERNAL_SERVER_ERROR = "Internal Server Error"
23
+
24
+
25
+ class KratosSessionAuthentication:
26
+ """Kratos Session class."""
27
+
28
+ DEFAULT_COOKIE_NAME: str = "ory_kratos_session"
29
+
30
+ def __init__(self, cookie_name: str = DEFAULT_COOKIE_NAME, raise_exception: bool = True) -> None:
31
+ """Initialize the KratosSessionAuthentication class.
32
+
33
+ Args:
34
+ cookie_name (str): Name of the cookie to extract the session
35
+ raise_exception (bool): Whether to raise an exception or return None
36
+ """
37
+ self._cookie_name: str = cookie_name
38
+ self._raise_exception: bool = raise_exception
39
+
40
+ def _extract_cookie(self, request: Request) -> str | None:
41
+ """Extract the cookie from the request.
42
+
43
+ Args:
44
+ request (Request): FastAPI request object.
45
+
46
+ Returns:
47
+ str | None: Cookie value or None if not found.
48
+
49
+ Raises:
50
+ HTTPException: If the cookie is missing.
51
+ """
52
+ return request.cookies.get(self._cookie_name, None)
53
+
54
+ async def __call__(
55
+ self, request: Request, kratos_service: Annotated[KratosService, Depends(depends_kratos_service)]
56
+ ) -> KratosSessionObject | KratosSessionAuthenticationErrors:
57
+ """Extract the Kratos session from the request.
58
+
59
+ Args:
60
+ request (Request): FastAPI request object.
61
+ kratos_service (KratosService): Kratos service object.
62
+
63
+ Returns:
64
+ KratosSessionObject | KratosSessionAuthenticationErrors: Kratos session object or error.
65
+
66
+ Raises:
67
+ HTTPException: If the session is invalid and raise_exception is True.
68
+ """
69
+ cookie: str | None = self._extract_cookie(request)
70
+ if not cookie:
71
+ if self._raise_exception:
72
+ raise HTTPException(
73
+ status_code=401,
74
+ detail=KratosSessionAuthenticationErrors.MISSING_CREDENTIALS,
75
+ )
76
+ else:
77
+ return KratosSessionAuthenticationErrors.MISSING_CREDENTIALS
78
+
79
+ try:
80
+ session: KratosSessionObject = await kratos_service.whoami(cookie_value=cookie)
81
+ except KratosSessionInvalidError as e:
82
+ if self._raise_exception:
83
+ raise HTTPException(
84
+ status_code=401,
85
+ detail="Invalid Credentials",
86
+ ) from e
87
+ else:
88
+ return KratosSessionAuthenticationErrors.INVALID_CREDENTIALS
89
+ except KratosOperationError as e:
90
+ if self._raise_exception:
91
+ raise HTTPException(
92
+ status_code=500,
93
+ detail="Internal Server Error",
94
+ ) from e
95
+ else:
96
+ return KratosSessionAuthenticationErrors.INTERNAL_SERVER_ERROR
97
+
98
+ return session
@@ -1,78 +0,0 @@
1
- """Provide Kratos Session and Identity classes."""
2
-
3
- from typing import Annotated
4
-
5
- from fastapi import Depends, HTTPException, Request
6
-
7
- from fastapi_factory_utilities.core.services.kratos import (
8
- KratosOperationError,
9
- KratosService,
10
- KratosSessionInvalidError,
11
- KratosSessionObject,
12
- depends_kratos_service,
13
- )
14
-
15
-
16
- class KratosSessionAuthentication:
17
- """Kratos Session class."""
18
-
19
- DEFAULT_COOKIE_NAME: str = "ory_kratos_session"
20
-
21
- def __init__(self, cookie_name: str = DEFAULT_COOKIE_NAME) -> None:
22
- """Initialize the KratosSessionAuthentication class.
23
-
24
- Args:
25
- cookie_name (str): Name of the cookie to extract the session
26
- """
27
- self._cookie_name: str = cookie_name
28
-
29
- def _extract_cookie(self, request: Request) -> str:
30
- """Extract the cookie from the request.
31
-
32
- Args:
33
- request (Request): FastAPI request object.
34
-
35
- Returns:
36
- str | None: Cookie value or None if not found.
37
-
38
- Raises:
39
- HTTPException: If the cookie is missing.
40
- """
41
- cookie: str | None = request.cookies.get(self._cookie_name)
42
- if not cookie:
43
- raise HTTPException(
44
- status_code=401,
45
- detail="Missing Credentials",
46
- )
47
- return cookie
48
-
49
- async def __call__(
50
- self, request: Request, kratos_service: Annotated[KratosService, Depends(depends_kratos_service)]
51
- ) -> KratosSessionObject:
52
- """Extract the Kratos session from the request.
53
-
54
- Args:
55
- request (Request): FastAPI request object.
56
- kratos_service (KratosService): Kratos service object.
57
-
58
- Returns:
59
- KratosSessionObject: Kratos session object.
60
-
61
- Raises:
62
- HTTPException: If the session is invalid.
63
- """
64
- cookie: str = self._extract_cookie(request)
65
- try:
66
- session: KratosSessionObject = await kratos_service.whoami(cookie_value=cookie)
67
- except KratosSessionInvalidError as e:
68
- raise HTTPException(
69
- status_code=401,
70
- detail="Invalid Credentials",
71
- ) from e
72
- except KratosOperationError as e:
73
- raise HTTPException(
74
- status_code=500,
75
- detail="Internal Server Error",
76
- ) from e
77
-
78
- return session