fastapi-factory-utilities 0.3.6__py3-none-any.whl → 0.9.1__py3-none-any.whl

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 (76) hide show
  1. fastapi_factory_utilities/core/api/__init__.py +1 -1
  2. fastapi_factory_utilities/core/api/v1/sys/health.py +1 -1
  3. fastapi_factory_utilities/core/app/__init__.py +4 -4
  4. fastapi_factory_utilities/core/app/application.py +22 -26
  5. fastapi_factory_utilities/core/app/builder.py +19 -35
  6. fastapi_factory_utilities/core/app/config.py +2 -0
  7. fastapi_factory_utilities/core/app/fastapi_builder.py +3 -2
  8. fastapi_factory_utilities/core/exceptions.py +64 -29
  9. fastapi_factory_utilities/core/plugins/__init__.py +2 -31
  10. fastapi_factory_utilities/core/plugins/abstracts.py +40 -0
  11. fastapi_factory_utilities/core/plugins/aiopika/__init__.py +25 -0
  12. fastapi_factory_utilities/core/plugins/aiopika/abstract.py +48 -0
  13. fastapi_factory_utilities/core/plugins/aiopika/configs.py +85 -0
  14. fastapi_factory_utilities/core/plugins/aiopika/depends.py +20 -0
  15. fastapi_factory_utilities/core/plugins/aiopika/exceptions.py +29 -0
  16. fastapi_factory_utilities/core/plugins/aiopika/exchange.py +69 -0
  17. fastapi_factory_utilities/core/plugins/aiopika/listener/__init__.py +7 -0
  18. fastapi_factory_utilities/core/plugins/aiopika/listener/abstract.py +72 -0
  19. fastapi_factory_utilities/core/plugins/aiopika/message.py +86 -0
  20. fastapi_factory_utilities/core/plugins/aiopika/plugins.py +84 -0
  21. fastapi_factory_utilities/core/plugins/aiopika/publisher/__init__.py +7 -0
  22. fastapi_factory_utilities/core/plugins/aiopika/publisher/abstract.py +66 -0
  23. fastapi_factory_utilities/core/plugins/aiopika/queue.py +88 -0
  24. fastapi_factory_utilities/core/plugins/odm_plugin/__init__.py +14 -157
  25. fastapi_factory_utilities/core/plugins/odm_plugin/builder.py +14 -29
  26. fastapi_factory_utilities/core/plugins/odm_plugin/configs.py +1 -1
  27. fastapi_factory_utilities/core/plugins/odm_plugin/depends.py +4 -3
  28. fastapi_factory_utilities/core/plugins/odm_plugin/documents.py +1 -1
  29. fastapi_factory_utilities/core/plugins/odm_plugin/helpers.py +16 -0
  30. fastapi_factory_utilities/core/plugins/odm_plugin/plugins.py +153 -0
  31. fastapi_factory_utilities/core/plugins/odm_plugin/repositories.py +17 -15
  32. fastapi_factory_utilities/core/plugins/opentelemetry_plugin/__init__.py +8 -115
  33. fastapi_factory_utilities/core/plugins/opentelemetry_plugin/instruments/__init__.py +85 -0
  34. fastapi_factory_utilities/core/plugins/opentelemetry_plugin/plugins.py +137 -0
  35. fastapi_factory_utilities/core/plugins/taskiq_plugins/__init__.py +31 -0
  36. fastapi_factory_utilities/core/plugins/taskiq_plugins/configs.py +12 -0
  37. fastapi_factory_utilities/core/plugins/taskiq_plugins/depends.py +51 -0
  38. fastapi_factory_utilities/core/plugins/taskiq_plugins/exceptions.py +13 -0
  39. fastapi_factory_utilities/core/plugins/taskiq_plugins/plugin.py +41 -0
  40. fastapi_factory_utilities/core/plugins/taskiq_plugins/schedulers.py +187 -0
  41. fastapi_factory_utilities/core/protocols.py +1 -54
  42. fastapi_factory_utilities/core/security/__init__.py +5 -0
  43. fastapi_factory_utilities/core/security/abstracts.py +42 -0
  44. fastapi_factory_utilities/core/security/jwt/__init__.py +43 -0
  45. fastapi_factory_utilities/core/security/jwt/configs.py +32 -0
  46. fastapi_factory_utilities/core/security/jwt/decoders.py +130 -0
  47. fastapi_factory_utilities/core/security/jwt/exceptions.py +23 -0
  48. fastapi_factory_utilities/core/security/jwt/objects.py +107 -0
  49. fastapi_factory_utilities/core/security/jwt/services.py +176 -0
  50. fastapi_factory_utilities/core/security/jwt/stores.py +43 -0
  51. fastapi_factory_utilities/core/security/jwt/types.py +9 -0
  52. fastapi_factory_utilities/core/security/jwt/verifiers.py +46 -0
  53. fastapi_factory_utilities/core/security/kratos.py +43 -43
  54. fastapi_factory_utilities/core/services/hydra/__init__.py +20 -0
  55. fastapi_factory_utilities/core/services/hydra/exceptions.py +15 -0
  56. fastapi_factory_utilities/core/services/hydra/objects.py +26 -0
  57. fastapi_factory_utilities/core/services/hydra/services.py +200 -0
  58. fastapi_factory_utilities/core/services/status/__init__.py +2 -2
  59. fastapi_factory_utilities/core/services/status/exceptions.py +1 -1
  60. fastapi_factory_utilities/core/utils/status.py +2 -1
  61. fastapi_factory_utilities/core/utils/yaml_reader.py +1 -1
  62. fastapi_factory_utilities/example/app.py +15 -5
  63. fastapi_factory_utilities/example/entities/books/__init__.py +1 -1
  64. fastapi_factory_utilities/example/models/books/__init__.py +1 -1
  65. {fastapi_factory_utilities-0.3.6.dist-info → fastapi_factory_utilities-0.9.1.dist-info}/METADATA +21 -15
  66. fastapi_factory_utilities-0.9.1.dist-info/RECORD +111 -0
  67. {fastapi_factory_utilities-0.3.6.dist-info → fastapi_factory_utilities-0.9.1.dist-info}/WHEEL +1 -1
  68. fastapi_factory_utilities/core/app/plugin_manager/__init__.py +0 -15
  69. fastapi_factory_utilities/core/app/plugin_manager/exceptions.py +0 -33
  70. fastapi_factory_utilities/core/app/plugin_manager/plugin_manager.py +0 -190
  71. fastapi_factory_utilities/core/plugins/example/__init__.py +0 -31
  72. fastapi_factory_utilities/core/plugins/httpx_plugin/__init__.py +0 -31
  73. fastapi_factory_utilities/core/security/jwt.py +0 -158
  74. fastapi_factory_utilities-0.3.6.dist-info/RECORD +0 -78
  75. {fastapi_factory_utilities-0.3.6.dist-info → fastapi_factory_utilities-0.9.1.dist-info}/entry_points.txt +0 -0
  76. {fastapi_factory_utilities-0.3.6.dist-info → fastapi_factory_utilities-0.9.1.dist-info/licenses}/LICENSE +0 -0
@@ -1,158 +0,0 @@
1
- """Provides security-related functions for the API."""
2
-
3
- from asyncio import Task, TaskGroup
4
- from http import HTTPStatus
5
- from typing import Any, ClassVar, NewType, cast
6
-
7
- import jwt
8
- import pydantic
9
- from fastapi import Request
10
- from fastapi.exceptions import HTTPException
11
- from pydantic import BaseModel
12
-
13
- Scope = NewType("Scope", str)
14
-
15
-
16
- class JWTBearerDecoded(BaseModel):
17
- """JWT bearer token decoded."""
18
-
19
- model_config: ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(
20
- arbitrary_types_allowed=True,
21
- extra="forbid",
22
- frozen=True,
23
- )
24
-
25
- scopes: list[str] | None = None
26
-
27
-
28
- class JWTBearerAuthentication:
29
- """JWT Bearer Authentication.
30
-
31
- This class is used to authenticate users using JWT tokens.
32
- It extracts the token from the request, decodes it, and verifies its validity.
33
- """
34
-
35
- def __init__(self, scopes: list[Scope] | None = None, jwt_raw: str | None = None) -> None:
36
- """Initialize the OAuth2 class.
37
-
38
- Args:
39
- scopes (SecurityScopes): Security scopes for the OAuth2.
40
- jwt_raw (str): JWT token to be used for authentication.
41
- """
42
- self.jwt_raw: str | None = jwt_raw
43
- self.scopes: list[Scope] | None = scopes
44
-
45
- def _extract_raw_token(self, request: Request) -> str:
46
- """Extract the raw token from the request.
47
-
48
- Args:
49
- request (Request): FastAPI request object.
50
-
51
- Returns:
52
- str: Raw token.
53
-
54
- Raises:
55
- HTTPException: If the token is missing or invalid.
56
- """
57
- try:
58
- authorization_header: str | None = request.headers.get("Authorization")
59
- except (AttributeError, KeyError) as e:
60
- raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail="Missing Credentials") from e
61
-
62
- if not authorization_header:
63
- raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail="Missing Credentials")
64
-
65
- if not authorization_header.startswith("Bearer "):
66
- raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail="Invalid Credentials")
67
-
68
- return authorization_header.split(sep=" ")[1]
69
-
70
- async def _decode_jwt(self, jwt_raw: str) -> JWTBearerDecoded:
71
- """Decode the JWT token.
72
-
73
- Args:
74
- jwt_raw (str): Raw JWT token.
75
-
76
- Returns:
77
- JWTBearerDecoded: Decoded JWT token.
78
-
79
- Raises:
80
- HTTPException: If the token is invalid or expired.
81
- """
82
- try:
83
- jwt_decoded: dict[str, Any] = cast(
84
- dict[str, Any],
85
- jwt.decode(
86
- jwt=jwt_raw,
87
- algorithms=["HS256", "RS256"],
88
- options={"verify_signature": True},
89
- ),
90
- )
91
- return JWTBearerDecoded(**jwt_decoded)
92
- except jwt.ExpiredSignatureError as e:
93
- raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail="Token expired") from e
94
- except jwt.InvalidTokenError as e:
95
- raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail="Invalid token") from e
96
- except pydantic.ValidationError as e:
97
- raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail=f"Invalid token: {e.json()}") from e
98
-
99
- async def _verify(self, jwt_raw: str) -> None:
100
- """Verify the JWT token.
101
-
102
- Args:
103
- jwt_raw (str): Raw JWT token.
104
- """
105
- pass
106
-
107
- def _has_scope(self, jwt_decoded: JWTBearerDecoded) -> None:
108
- """Check if the JWT token has the required scope.
109
-
110
- Args:
111
- jwt_decoded (JWTBearerDecoded): Decoded JWT token.
112
-
113
- """
114
- # Just Authentication (no scopes, no authorization)
115
- if not self.scopes:
116
- return
117
- # JWT without scopes (no authorization)
118
- if not jwt_decoded.scopes:
119
- raise HTTPException(status_code=HTTPStatus.FORBIDDEN, detail="Unauthorized")
120
- # Check if all required scopes are present
121
- if not all(scope in jwt_decoded.scopes for scope in (self.scopes or [])):
122
- raise HTTPException(status_code=HTTPStatus.FORBIDDEN, detail="Unauthorized")
123
-
124
- # All scopes are valid (authorization)
125
- return
126
-
127
- async def __call__(self, request: Request | None = None) -> JWTBearerDecoded:
128
- """Call the JWT bearer authentication.
129
-
130
- Args:
131
- request (Request): FastAPI request object.
132
-
133
- Returns:
134
- JWTBearerDecoded: Decoded JWT token.
135
-
136
- Raises:
137
- HTTPException: If the token is missing or invalid.
138
- """
139
- # Ensure that the jwt will be provided
140
- # by the request or by the jwt parameter
141
- if self.jwt_raw is None and request is None:
142
- raise HTTPException(status_code=HTTPStatus.UNAUTHORIZED, detail="Missing Credentials")
143
- jwt_raw: str = (
144
- self.jwt_raw
145
- if self.jwt_raw is not None
146
- else self._extract_raw_token(request=request) # type: ignore[arg-type]
147
- )
148
- # Execute the io bound and cpu bound tasks in parallel
149
- async with TaskGroup() as tg:
150
- # TODO: Can be disabled by configuration (for operation purposes)
151
- # Ensure that the jwt is not revoked or expired
152
- tg.create_task(self._verify(jwt_raw=jwt_raw), name="verify_jwt")
153
- # Ensure that the jwt is not altered or expired
154
- task_decode: Task[Any] = tg.create_task(self._decode_jwt(jwt_raw=jwt_raw), name="decode_jwt")
155
- # Scope Validation
156
- jwt_decoded: JWTBearerDecoded = task_decode.result()
157
- self._has_scope(jwt_decoded=jwt_decoded)
158
- return jwt_decoded
@@ -1,78 +0,0 @@
1
- fastapi_factory_utilities/__main__.py,sha256=w8o9KpyHcxGyLHmTK8ixbIqJIsB3NbIGuAMY7OfnxrA,147
2
- fastapi_factory_utilities/core/__init__.py,sha256=tt5a-MgeFt_oACkc9K5xl2rynIbca9DGqsKBDEqGzto,34
3
- fastapi_factory_utilities/core/api/__init__.py,sha256=eehUFVDPk07MUPIorGdC8WqDRB8NjdSy7Za55CdLrps,542
4
- fastapi_factory_utilities/core/api/tags.py,sha256=3hQcTeW0FS78sPTJ2PB44dMDTSkoW-xKj7rrfKX2Lk0,154
5
- fastapi_factory_utilities/core/api/v1/sys/__init__.py,sha256=mTXhpn3_KgQ1snt0-0PFmGvFr4n5srQRRADEdRSGFJM,345
6
- fastapi_factory_utilities/core/api/v1/sys/health.py,sha256=IF51Z1seOFn91m3FC57U8uWfAA7c_EhhBpjbu_ly9WQ,2807
7
- fastapi_factory_utilities/core/api/v1/sys/readiness.py,sha256=xIY8pQLShU7KWRtlOUK5gTDyZ8aB1KBvLczC6boT-tg,1711
8
- fastapi_factory_utilities/core/app/__init__.py,sha256=IHHkcu3t-fX8vxQk12A36cE-yTjGn_PInDpL_OlRSE8,596
9
- fastapi_factory_utilities/core/app/application.py,sha256=WrDXh00r_jzQTtZGeFO43lIzvDraplitejTaSJj_uFE,5091
10
- fastapi_factory_utilities/core/app/builder.py,sha256=VbThqoI1qWnADwPQ61D774oNZ5d6OMxW0tyXr_Yz5E4,4503
11
- fastapi_factory_utilities/core/app/config.py,sha256=81KYoxB14TX05jMWujPNjLI1BXkvMnUyw2VgF7nJIE0,7063
12
- fastapi_factory_utilities/core/app/enums.py,sha256=X1upnaehYU0eHExXTde5xsH-pI9q7HZDNsOEF5PApdg,226
13
- fastapi_factory_utilities/core/app/exceptions.py,sha256=tQDf0_4j5xgCbku7TL7JaZGs3_bjsWG2YLBCydQJpPw,664
14
- fastapi_factory_utilities/core/app/fastapi_builder.py,sha256=DgIqiCnJK6cqsG-sg4H7Pi0lkhaxOhSLQt_ksHjpjW0,2835
15
- fastapi_factory_utilities/core/app/plugin_manager/__init__.py,sha256=eMfxCsk41Caw_juAawmDZHhytNI_ubXmqfRDug2AzvQ,319
16
- fastapi_factory_utilities/core/app/plugin_manager/exceptions.py,sha256=CFrZvROT7mLzNpXWwDra1j08lA_7ZrSrOHN94sEEfnQ,1026
17
- fastapi_factory_utilities/core/app/plugin_manager/plugin_manager.py,sha256=5E_Qp535xNJHNujZ_QRiMfIkDUy9F_3Rbjlclny5P08,6682
18
- fastapi_factory_utilities/core/exceptions.py,sha256=HAd0RDJNBVc1NOcwfHQo_Xya8SCYuD9edynx3VKMYVs,1784
19
- fastapi_factory_utilities/core/plugins/__init__.py,sha256=W-BCkqP0xG980980z3mc8T6Vrp1Akv4szA0PRzkUbiU,756
20
- fastapi_factory_utilities/core/plugins/example/__init__.py,sha256=GF69IygLXxzrCh7VryekEWun663kKBhWtRS3w-1tzBc,1030
21
- fastapi_factory_utilities/core/plugins/httpx_plugin/__init__.py,sha256=P5FUyv7mQr8RZWQ8ifkoK8GXvqSI71q2b2dm-ag2JhQ,1028
22
- fastapi_factory_utilities/core/plugins/odm_plugin/__init__.py,sha256=L6iZW7beZLpvXbcXoTjP6iALEwWWymworb6Mok72s2w,5741
23
- fastapi_factory_utilities/core/plugins/odm_plugin/builder.py,sha256=Wf9Geo2ayCX9no8ENJcsfLRo-zrAuZFfUJkvnb01PRk,8759
24
- fastapi_factory_utilities/core/plugins/odm_plugin/configs.py,sha256=zQoJC1wLNyq2pZyFhl0bKeNsTl4y_4_82BHCCaOEjCQ,331
25
- fastapi_factory_utilities/core/plugins/odm_plugin/depends.py,sha256=OcLsfTLzMBk_xFV6qsMy_-qFkiphEbbEuaHUooagxg8,730
26
- fastapi_factory_utilities/core/plugins/odm_plugin/documents.py,sha256=BFQYHxHBmTacJRfhZi2OffvT_RAFvAAiDVQAa_d6Y7w,1141
27
- fastapi_factory_utilities/core/plugins/odm_plugin/exceptions.py,sha256=acnKJB0lGAzDs-7-LjBap8shjP3iV1a7dw7ouPVF27o,551
28
- fastapi_factory_utilities/core/plugins/odm_plugin/repositories.py,sha256=pOOADEe8mz6FuZkNzV46H8RNvi77FojJqb3bz9RQapo,11279
29
- fastapi_factory_utilities/core/plugins/opentelemetry_plugin/__init__.py,sha256=UsXPjiAASn5GIHW8vrF32mklxGNq8ajILV-ty4K1Tbs,4371
30
- fastapi_factory_utilities/core/plugins/opentelemetry_plugin/builder.py,sha256=9npQImifYAbEg0lFG7KwZ8V78SNrPoaINgd8vKitdMw,12509
31
- fastapi_factory_utilities/core/plugins/opentelemetry_plugin/configs.py,sha256=pMG9leMB7rtdkdGFLIxXflV7bf9epGrrYPt2N97KZcM,3750
32
- fastapi_factory_utilities/core/plugins/opentelemetry_plugin/exceptions.py,sha256=CpsHayfQpP0zghN8y5PP6TBy-cXhHoNxBR--I86gAdE,327
33
- fastapi_factory_utilities/core/plugins/opentelemetry_plugin/helpers.py,sha256=qpTIzX67orJz7vy6SBIwRs24omMBoToJkhpurZRjPuk,1533
34
- fastapi_factory_utilities/core/protocols.py,sha256=TzZKr_KfmTphk2LL-TD2XzxNlLbihbGM2DxWMhc5lEQ,2428
35
- fastapi_factory_utilities/core/security/jwt.py,sha256=LuNVmTlONrmoKl7ghNv5JHV4qzMNOwuxJQlWgGSvBoo,5631
36
- fastapi_factory_utilities/core/security/kratos.py,sha256=yP9-TkELeXRPRYE9aQRlOPlwvaUJ7VQpyAea8ucWUfg,3364
37
- fastapi_factory_utilities/core/services/kratos/__init__.py,sha256=DaC29-Ol0WR5vX56IHLGDXP9UrhISq0Juhg_sJTasw4,368
38
- fastapi_factory_utilities/core/services/kratos/enums.py,sha256=ULJppowlZbOjdnUIXQyI4_nHmHZoNnv7-M1CYQBYXFY,220
39
- fastapi_factory_utilities/core/services/kratos/exceptions.py,sha256=xAX01-lQvPpADgcwhB5YWSy1UqAxG38s2rlU9AJBJd8,472
40
- fastapi_factory_utilities/core/services/kratos/objects.py,sha256=a0npt4Q6d9UbF0w3e6EvyKLwMWO2l639_dFjruA8_2c,980
41
- fastapi_factory_utilities/core/services/kratos/services.py,sha256=RFKrME6M6omWiHORMBCSyvIG0BsimQaCfnmtsOdFfsg,3158
42
- fastapi_factory_utilities/core/services/status/__init__.py,sha256=N5H0cCN9ZFu_0YZar4RLdCDEjKMICrIhNtfKgB0LI78,370
43
- fastapi_factory_utilities/core/services/status/enums.py,sha256=IUxWAd0Ecknri4BqzaqoDRRhT_8LdcgtQcNqgNVDXGE,599
44
- fastapi_factory_utilities/core/services/status/exceptions.py,sha256=_fQFGqHKnG54Hs-ZtC4gs0xwzSH246_WwQOonraoGKw,856
45
- fastapi_factory_utilities/core/services/status/health_calculator_strategies.py,sha256=p2KKJo-dq1j9iWHT0mvlBKtldH9m8l31aytLkUsb9nQ,1634
46
- fastapi_factory_utilities/core/services/status/readiness_calculator_strategies.py,sha256=hA1LX2pSxva-7bVaQ0dw8NpTbl1ZWDtXd9xzqQUGUsI,1354
47
- fastapi_factory_utilities/core/services/status/services.py,sha256=qtgYdnxNQMbb6q6G9uGasRO3lZcpiWNmw1padPkh6jA,8490
48
- fastapi_factory_utilities/core/services/status/types.py,sha256=GJOGRra6NtpUS4q1cr4cdWR0BbIUtEwP7vQX-sXX5jQ,3297
49
- fastapi_factory_utilities/core/utils/configs.py,sha256=qM0pCrsK8ZyfCoyova_VrhR4eUX3LSPCbWunGMWcSVg,2581
50
- fastapi_factory_utilities/core/utils/importlib.py,sha256=DYcPo7K0s95WV5xxtucpufWsTj8Pxv25sWunDmmNUYI,797
51
- fastapi_factory_utilities/core/utils/log.py,sha256=6V9CL3bQio4e47YxcSXM2JQRGhVxuBfmcEbcF4RtCfQ,6393
52
- fastapi_factory_utilities/core/utils/status.py,sha256=1zxur98Wfum3JzpuzoAPoRIwQmXhFsTS2oxgbn5uFfg,1933
53
- fastapi_factory_utilities/core/utils/uvicorn.py,sha256=XThylG-nOPVL00w6MIWGODnweoM7VxmpSFcyoPcmqns,2609
54
- fastapi_factory_utilities/core/utils/yaml_reader.py,sha256=KNlwHvpraAp04JjeXSSk72BLuILH3lhEKrmRaUUgo2k,6103
55
- fastapi_factory_utilities/example/__init__.py,sha256=LEKnPTBcgDyfHeOjlVxjK5lFdFqS-7-mHDuVuM2Jh_Y,206
56
- fastapi_factory_utilities/example/__main__.py,sha256=Iwp_6rK7Lcv2F-XAKn6xjxQHOWjx2OjgwKAr91tfUfk,135
57
- fastapi_factory_utilities/example/api/__init__.py,sha256=qI82eeSwVjR6jSkX1pxm8ALv9WPQ_iHurFY4G2K7VzE,554
58
- fastapi_factory_utilities/example/api/books/__init__.py,sha256=zXARBnjywJwg1XsLbcixYWcHH4uC9mF-kbbX4P8cVgA,160
59
- fastapi_factory_utilities/example/api/books/responses.py,sha256=21WeD6bdg0MCD_0vRHwmsL4W79iDcG9NnDLemXysc84,540
60
- fastapi_factory_utilities/example/api/books/routes.py,sha256=bwg8Bhvoj9vx2SdwunzFS-Z3cHECtjl_yGdo8MfiGEM,1529
61
- fastapi_factory_utilities/example/app.py,sha256=mcXQOg0A74mc8xFT0XuRHne3YjXXI7dTMV48G_Ypng8,1555
62
- fastapi_factory_utilities/example/application.yaml,sha256=5xRyFSuMxmgZ5Mikai94UqKYJ7PxJp8omlXobTjv14M,485
63
- fastapi_factory_utilities/example/entities/books/__init__.py,sha256=q2UTwLyCs3te38n7RgwT0go3Hp0bE9-NvoX7P-DR-3o,185
64
- fastapi_factory_utilities/example/entities/books/entities.py,sha256=rLE01lE7U6WizrD5ZHMRwkynd8_dWF6DltBFH61f-Do,405
65
- fastapi_factory_utilities/example/entities/books/enums.py,sha256=lXYUvhIkT1pi0teflMpnqeafeiBZMokyWxoFLgzV6a8,330
66
- fastapi_factory_utilities/example/entities/books/types.py,sha256=7LYGPu-CcI3noIORJyIZlVF-CBugWPXEqgDzWrO3XmQ,1558
67
- fastapi_factory_utilities/example/models/__init__.py,sha256=RJmp3R9bhbQv7n0WOlsHP65LqbEs_DjF9hzYKwYTRGo,22
68
- fastapi_factory_utilities/example/models/books/__init__.py,sha256=1GJFCYMGZugQRxlFl-q7fPBFvNsl2ykeW8lV7rpURHU,181
69
- fastapi_factory_utilities/example/models/books/document.py,sha256=lYJfMGr5GqEEsn7L--PFs75hC2q-jQx77wl7EhTrp5U,568
70
- fastapi_factory_utilities/example/models/books/repository.py,sha256=7K63uAsSEGZ2EXqufU4Tc8KpymgXK8JX8WjAE2Sw8ok,387
71
- fastapi_factory_utilities/example/services/books/__init__.py,sha256=Z06yNRoA7Zg3TGN-Q9rrvJg6Bbx-qJw661MVwukV6vQ,148
72
- fastapi_factory_utilities/example/services/books/services.py,sha256=-x7d4hotUWLzWo5uImMjFmtNcSTHwWv2bfttIbYYKbA,5380
73
- fastapi_factory_utilities/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
- fastapi_factory_utilities-0.3.6.dist-info/LICENSE,sha256=iO1nLzMMst6vEiqgSUrfrbetM7b0bvdzXhbed5tqG8o,1074
75
- fastapi_factory_utilities-0.3.6.dist-info/METADATA,sha256=FWIQG-J-8SgXiUl9EnG-cJJoXHUwJGtjgr6jewvbjiA,3477
76
- fastapi_factory_utilities-0.3.6.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
77
- fastapi_factory_utilities-0.3.6.dist-info/entry_points.txt,sha256=IK0VcBexXo4uXQmTrbfhhnnfq4GmXPRn0GBB8hzlsq4,101
78
- fastapi_factory_utilities-0.3.6.dist-info/RECORD,,