fastapi-factory-utilities 0.4.2__py3-none-any.whl → 0.6.0__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.

Potentially problematic release.


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

Files changed (40) hide show
  1. fastapi_factory_utilities/core/api/v1/sys/health.py +1 -1
  2. fastapi_factory_utilities/core/app/application.py +22 -26
  3. fastapi_factory_utilities/core/app/builder.py +8 -32
  4. fastapi_factory_utilities/core/app/fastapi_builder.py +3 -3
  5. fastapi_factory_utilities/core/exceptions.py +55 -28
  6. fastapi_factory_utilities/core/plugins/__init__.py +2 -31
  7. fastapi_factory_utilities/core/plugins/abstracts.py +40 -0
  8. fastapi_factory_utilities/core/plugins/aiopika/__init__.py +23 -0
  9. fastapi_factory_utilities/core/plugins/aiopika/abstract.py +48 -0
  10. fastapi_factory_utilities/core/plugins/aiopika/configs.py +85 -0
  11. fastapi_factory_utilities/core/plugins/aiopika/exceptions.py +29 -0
  12. fastapi_factory_utilities/core/plugins/aiopika/exchange.py +70 -0
  13. fastapi_factory_utilities/core/plugins/aiopika/listener/__init__.py +7 -0
  14. fastapi_factory_utilities/core/plugins/aiopika/listener/abstract.py +72 -0
  15. fastapi_factory_utilities/core/plugins/aiopika/message.py +86 -0
  16. fastapi_factory_utilities/core/plugins/aiopika/plugins.py +63 -0
  17. fastapi_factory_utilities/core/plugins/aiopika/publisher/__init__.py +7 -0
  18. fastapi_factory_utilities/core/plugins/aiopika/publisher/abstract.py +66 -0
  19. fastapi_factory_utilities/core/plugins/aiopika/queue.py +86 -0
  20. fastapi_factory_utilities/core/plugins/odm_plugin/__init__.py +11 -156
  21. fastapi_factory_utilities/core/plugins/odm_plugin/builder.py +1 -1
  22. fastapi_factory_utilities/core/plugins/odm_plugin/configs.py +1 -1
  23. fastapi_factory_utilities/core/plugins/odm_plugin/documents.py +1 -1
  24. fastapi_factory_utilities/core/plugins/odm_plugin/plugins.py +155 -0
  25. fastapi_factory_utilities/core/plugins/opentelemetry_plugin/__init__.py +8 -121
  26. fastapi_factory_utilities/core/plugins/opentelemetry_plugin/instruments/__init__.py +85 -0
  27. fastapi_factory_utilities/core/plugins/opentelemetry_plugin/plugins.py +137 -0
  28. fastapi_factory_utilities/core/protocols.py +1 -54
  29. fastapi_factory_utilities/core/security/jwt.py +3 -3
  30. fastapi_factory_utilities/example/app.py +13 -4
  31. {fastapi_factory_utilities-0.4.2.dist-info → fastapi_factory_utilities-0.6.0.dist-info}/METADATA +6 -3
  32. {fastapi_factory_utilities-0.4.2.dist-info → fastapi_factory_utilities-0.6.0.dist-info}/RECORD +35 -24
  33. {fastapi_factory_utilities-0.4.2.dist-info → fastapi_factory_utilities-0.6.0.dist-info}/WHEEL +1 -1
  34. fastapi_factory_utilities/core/app/plugin_manager/__init__.py +0 -15
  35. fastapi_factory_utilities/core/app/plugin_manager/exceptions.py +0 -33
  36. fastapi_factory_utilities/core/app/plugin_manager/plugin_manager.py +0 -189
  37. fastapi_factory_utilities/core/plugins/example/__init__.py +0 -31
  38. fastapi_factory_utilities/core/plugins/httpx_plugin/__init__.py +0 -31
  39. {fastapi_factory_utilities-0.4.2.dist-info → fastapi_factory_utilities-0.6.0.dist-info}/entry_points.txt +0 -0
  40. {fastapi_factory_utilities-0.4.2.dist-info → fastapi_factory_utilities-0.6.0.dist-info/licenses}/LICENSE +0 -0
@@ -3,37 +3,48 @@ fastapi_factory_utilities/core/__init__.py,sha256=tt5a-MgeFt_oACkc9K5xl2rynIbca9
3
3
  fastapi_factory_utilities/core/api/__init__.py,sha256=fAwgRcRry1nIyAL7CsCbpwR87n5tWnBWKEPH6QZCpp8,542
4
4
  fastapi_factory_utilities/core/api/tags.py,sha256=3hQcTeW0FS78sPTJ2PB44dMDTSkoW-xKj7rrfKX2Lk0,154
5
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
6
+ fastapi_factory_utilities/core/api/v1/sys/health.py,sha256=LILUwfyqeBDlf4GSpkU_3bxMjZPCLanOBkMGDKtQufY,2867
7
7
  fastapi_factory_utilities/core/api/v1/sys/readiness.py,sha256=xIY8pQLShU7KWRtlOUK5gTDyZ8aB1KBvLczC6boT-tg,1711
8
8
  fastapi_factory_utilities/core/app/__init__.py,sha256=6Ee_zK-KzJWoOElsAnGdBz8giRJlhAPMaEzs0I3gvrA,596
9
- fastapi_factory_utilities/core/app/application.py,sha256=WrDXh00r_jzQTtZGeFO43lIzvDraplitejTaSJj_uFE,5091
10
- fastapi_factory_utilities/core/app/builder.py,sha256=XKtJuRxvaqzNdhfNXGkyyxEH4MkZCgAUjkqYnOws8n0,4728
9
+ fastapi_factory_utilities/core/app/application.py,sha256=fJTKgfqBWD1xzE7Y9ToZEBDrd1PxHtnZ7SHLmkS1S1M,4737
10
+ fastapi_factory_utilities/core/app/builder.py,sha256=gkmhGVYFu2zbW5sxWyh6Pn5ysdCIvn1_WqNJMKls54s,3820
11
11
  fastapi_factory_utilities/core/app/config.py,sha256=MuV4G_M4QgZWYHoulusJLv_m4Qr2php-Cg9Jum4qkNA,7303
12
12
  fastapi_factory_utilities/core/app/enums.py,sha256=X1upnaehYU0eHExXTde5xsH-pI9q7HZDNsOEF5PApdg,226
13
13
  fastapi_factory_utilities/core/app/exceptions.py,sha256=tQDf0_4j5xgCbku7TL7JaZGs3_bjsWG2YLBCydQJpPw,664
14
- fastapi_factory_utilities/core/app/fastapi_builder.py,sha256=KoywPbWu9wY5s1KpBAwxgqH07PYT3Y6Mtlq-PP4__5I,2852
15
- fastapi_factory_utilities/core/app/plugin_manager/__init__.py,sha256=hHk_fet3d41I-MzohGlvbNjqWQtAbxWaaEfbt41Zweo,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=b6wDStsjAdCKExFFNCFEmeMERNsVCeIp1qseKfn5TO4,6681
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=EyjshkhEseri659k7YISJEVH0-cpSlAWaKvhnCPNNbY,5797
23
- fastapi_factory_utilities/core/plugins/odm_plugin/builder.py,sha256=D6UUDOJYv6IWugilodi6x9fwj_kZkqzPfKT_pL9UW7c,8753
24
- fastapi_factory_utilities/core/plugins/odm_plugin/configs.py,sha256=zQoJC1wLNyq2pZyFhl0bKeNsTl4y_4_82BHCCaOEjCQ,331
14
+ fastapi_factory_utilities/core/app/fastapi_builder.py,sha256=7egWkS98nTiVBe2Bw5dQzDBryQCkz4w7gnY9HA24NFg,2855
15
+ fastapi_factory_utilities/core/exceptions.py,sha256=9s-i_RHPCsOswQPRvK8tyy-smE1118pytxWDJMNEl0M,2670
16
+ fastapi_factory_utilities/core/plugins/__init__.py,sha256=7ctIv2Jx2uOUpgm8ITFRuZxHi6OXvlVS0VcbszVzvis,114
17
+ fastapi_factory_utilities/core/plugins/abstracts.py,sha256=p5iXmeOVD737G73I2keKV0Y-jLGQf2vYbTSR1LgrA14,1165
18
+ fastapi_factory_utilities/core/plugins/aiopika/__init__.py,sha256=U_9UEE76kA9WgMZBMT5mbet8kFzvorhcQEPuaW1yYk4,609
19
+ fastapi_factory_utilities/core/plugins/aiopika/abstract.py,sha256=TcvDwdaLV0UqFHQy6Sn3Y5Fp-1463dhL7VNB9LTKL5I,1682
20
+ fastapi_factory_utilities/core/plugins/aiopika/configs.py,sha256=BEPE8Ss7q_yCyuii4nywmIgh67iNLdhKxUm8tC0PdCY,3706
21
+ fastapi_factory_utilities/core/plugins/aiopika/exceptions.py,sha256=AkBKT8HVPpJDAntLNlOLp6lpQpKI-k8gxNzU24FsOF0,985
22
+ fastapi_factory_utilities/core/plugins/aiopika/exchange.py,sha256=tQfrv7-mX4lrHY1OTXB_aTkbg_brYniIuFisfFDSTT8,2509
23
+ fastapi_factory_utilities/core/plugins/aiopika/listener/__init__.py,sha256=LsTyu6kGoUm7c5OvSQTDJL7d8CG9TeARBHHVe_HGsHY,148
24
+ fastapi_factory_utilities/core/plugins/aiopika/listener/abstract.py,sha256=8po9iEWmNTFEc6K_ile5H-BHIeH9dxSaqVKp67xb6hk,2577
25
+ fastapi_factory_utilities/core/plugins/aiopika/message.py,sha256=Tn9pLZlkx238GA6SEav15Npq3TWu_dQ0NtzFWvPcPTM,2861
26
+ fastapi_factory_utilities/core/plugins/aiopika/plugins.py,sha256=0Oj9842Se3pGEUiHpIR4l7YTcKnfwkiH8Xjp7ykRddI,2214
27
+ fastapi_factory_utilities/core/plugins/aiopika/publisher/__init__.py,sha256=MGGdygH72xHZ4QAwvbUZKQt-_mPzLmMxHyAACSNnZ_c,151
28
+ fastapi_factory_utilities/core/plugins/aiopika/publisher/abstract.py,sha256=PmIG5zlx-tFUAneHtbknR0Ik5flz8pMTzxcreY2hZ7s,2494
29
+ fastapi_factory_utilities/core/plugins/aiopika/queue.py,sha256=u7iOOnv8EHO7q2qM6jDlYimajrjlQN8R3ftL61XgQIE,2794
30
+ fastapi_factory_utilities/core/plugins/odm_plugin/__init__.py,sha256=JsVz4GBiZRmm4qpUD1-Wsg2tRXTn-VO5fU-W1whZo4E,683
31
+ fastapi_factory_utilities/core/plugins/odm_plugin/builder.py,sha256=MdO1D0C9LQpoqtNFqgPwSYedLzXR6PArhkoJw6wzykg,8761
32
+ fastapi_factory_utilities/core/plugins/odm_plugin/configs.py,sha256=5bVbtsLwJhuIvt8FCzOvk002G8qFmZumWkN75bPKatc,331
25
33
  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
34
+ fastapi_factory_utilities/core/plugins/odm_plugin/documents.py,sha256=4aQNrD26d0S542_LYmxxm07Q8SWzbGe3PCpho6iWY5Q,1102
27
35
  fastapi_factory_utilities/core/plugins/odm_plugin/exceptions.py,sha256=acnKJB0lGAzDs-7-LjBap8shjP3iV1a7dw7ouPVF27o,551
28
36
  fastapi_factory_utilities/core/plugins/odm_plugin/helpers.py,sha256=s9iEujDZbTmTb9FByJAVUzLkjQpsciQT9dytkeosKuE,463
37
+ fastapi_factory_utilities/core/plugins/odm_plugin/plugins.py,sha256=0jsLtw4NxZB6bDcBLBvWHqB-RELoewsSXTJdAOGunSY,6443
29
38
  fastapi_factory_utilities/core/plugins/odm_plugin/repositories.py,sha256=GJ3ovlxzTpiJ2_XlgARtwn6j0SbQxxAray_r8QWvGok,11313
30
- fastapi_factory_utilities/core/plugins/opentelemetry_plugin/__init__.py,sha256=gXM-apuR1xdjVxfOzurF-db3SauKyeWjK_7SFWkVWxw,4689
39
+ fastapi_factory_utilities/core/plugins/opentelemetry_plugin/__init__.py,sha256=xXHn5dUxhgdDDQMpTHf3voolzS0E3zE2RFbtFHJzb38,641
31
40
  fastapi_factory_utilities/core/plugins/opentelemetry_plugin/builder.py,sha256=9npQImifYAbEg0lFG7KwZ8V78SNrPoaINgd8vKitdMw,12509
32
41
  fastapi_factory_utilities/core/plugins/opentelemetry_plugin/configs.py,sha256=pMG9leMB7rtdkdGFLIxXflV7bf9epGrrYPt2N97KZcM,3750
33
42
  fastapi_factory_utilities/core/plugins/opentelemetry_plugin/exceptions.py,sha256=CpsHayfQpP0zghN8y5PP6TBy-cXhHoNxBR--I86gAdE,327
34
43
  fastapi_factory_utilities/core/plugins/opentelemetry_plugin/helpers.py,sha256=qpTIzX67orJz7vy6SBIwRs24omMBoToJkhpurZRjPuk,1533
35
- fastapi_factory_utilities/core/protocols.py,sha256=TzZKr_KfmTphk2LL-TD2XzxNlLbihbGM2DxWMhc5lEQ,2428
36
- fastapi_factory_utilities/core/security/jwt.py,sha256=jO3FNOiqVvCCbvShUmCyfii8oLXNbYk_Sfsb_O29dng,5630
44
+ fastapi_factory_utilities/core/plugins/opentelemetry_plugin/instruments/__init__.py,sha256=lMtdd1DSDrFcXggf0qMpB1RJC7aBqWMpOBXxC8-bqPY,3307
45
+ fastapi_factory_utilities/core/plugins/opentelemetry_plugin/plugins.py,sha256=v9W4bqEljcRgeSL8pf-4yZ7SGXOFmxVoljthvcLdy6Q,5356
46
+ fastapi_factory_utilities/core/protocols.py,sha256=w5FQqMAZ_OulG5hQWkoOapNSnxsjBPq4EjvWNXXdI_c,859
47
+ fastapi_factory_utilities/core/security/jwt.py,sha256=BrP9EmtuOxjafHKluYzRtGdZYankv72iQgG49t9TgJw,5640
37
48
  fastapi_factory_utilities/core/security/kratos.py,sha256=yP9-TkELeXRPRYE9aQRlOPlwvaUJ7VQpyAea8ucWUfg,3364
38
49
  fastapi_factory_utilities/core/services/hydra/__init__.py,sha256=AKBYNc3zW5OsCLLeFSXqmDbWbQefHUJxstLpsXLQEUQ,369
39
50
  fastapi_factory_utilities/core/services/hydra/exceptions.py,sha256=ePMrfZturU2IVcxOebR0CbVKKqprce_fK-4UXbPPgNI,450
@@ -63,7 +74,7 @@ fastapi_factory_utilities/example/api/__init__.py,sha256=qI82eeSwVjR6jSkX1pxm8AL
63
74
  fastapi_factory_utilities/example/api/books/__init__.py,sha256=zXARBnjywJwg1XsLbcixYWcHH4uC9mF-kbbX4P8cVgA,160
64
75
  fastapi_factory_utilities/example/api/books/responses.py,sha256=21WeD6bdg0MCD_0vRHwmsL4W79iDcG9NnDLemXysc84,540
65
76
  fastapi_factory_utilities/example/api/books/routes.py,sha256=bwg8Bhvoj9vx2SdwunzFS-Z3cHECtjl_yGdo8MfiGEM,1529
66
- fastapi_factory_utilities/example/app.py,sha256=SkQwK2Z29I0Kz36wiWyoh2V_CvBexQ5LJ3Ka-npCQUI,1579
77
+ fastapi_factory_utilities/example/app.py,sha256=MInt71wnDEC9yqVJeT3hChj7DRmg7sI3Ta0KkfubdyU,2076
67
78
  fastapi_factory_utilities/example/application.yaml,sha256=5xRyFSuMxmgZ5Mikai94UqKYJ7PxJp8omlXobTjv14M,485
68
79
  fastapi_factory_utilities/example/entities/books/__init__.py,sha256=cpTMhLpenb359lOT9HHUv6DzKX8fKl4WCzcsB3ddk6Q,185
69
80
  fastapi_factory_utilities/example/entities/books/entities.py,sha256=rLE01lE7U6WizrD5ZHMRwkynd8_dWF6DltBFH61f-Do,405
@@ -76,8 +87,8 @@ fastapi_factory_utilities/example/models/books/repository.py,sha256=7K63uAsSEGZ2
76
87
  fastapi_factory_utilities/example/services/books/__init__.py,sha256=Z06yNRoA7Zg3TGN-Q9rrvJg6Bbx-qJw661MVwukV6vQ,148
77
88
  fastapi_factory_utilities/example/services/books/services.py,sha256=-x7d4hotUWLzWo5uImMjFmtNcSTHwWv2bfttIbYYKbA,5380
78
89
  fastapi_factory_utilities/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
- fastapi_factory_utilities-0.4.2.dist-info/LICENSE,sha256=iO1nLzMMst6vEiqgSUrfrbetM7b0bvdzXhbed5tqG8o,1074
80
- fastapi_factory_utilities-0.4.2.dist-info/METADATA,sha256=TQga1orWq9y3GXz54xm-7WkZRX-8gAl-iWJ3g7XE3lM,3478
81
- fastapi_factory_utilities-0.4.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
82
- fastapi_factory_utilities-0.4.2.dist-info/entry_points.txt,sha256=IK0VcBexXo4uXQmTrbfhhnnfq4GmXPRn0GBB8hzlsq4,101
83
- fastapi_factory_utilities-0.4.2.dist-info/RECORD,,
90
+ fastapi_factory_utilities-0.6.0.dist-info/METADATA,sha256=T6w0jeZL3srYmEK2geExdfhqrucPUilLBNDCBY-PWrs,3605
91
+ fastapi_factory_utilities-0.6.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
92
+ fastapi_factory_utilities-0.6.0.dist-info/entry_points.txt,sha256=IK0VcBexXo4uXQmTrbfhhnnfq4GmXPRn0GBB8hzlsq4,101
93
+ fastapi_factory_utilities-0.6.0.dist-info/licenses/LICENSE,sha256=iO1nLzMMst6vEiqgSUrfrbetM7b0bvdzXhbed5tqG8o,1074
94
+ fastapi_factory_utilities-0.6.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.3
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,15 +0,0 @@
1
- """Provide PluginManager."""
2
-
3
- from .exceptions import (
4
- InvalidPluginError,
5
- PluginManagerError,
6
- PluginPreConditionNotMetError,
7
- )
8
- from .plugin_manager import PluginManager
9
-
10
- __all__: list[str] = [
11
- "InvalidPluginError",
12
- "PluginManager",
13
- "PluginManagerError",
14
- "PluginPreConditionNotMetError",
15
- ]
@@ -1,33 +0,0 @@
1
- """Provide the exceptions for the plugin manager."""
2
-
3
- from fastapi_factory_utilities.core.exceptions import FastAPIFactoryUtilitiesError
4
-
5
-
6
- class PluginManagerError(FastAPIFactoryUtilitiesError):
7
- """Generic plugin manager error."""
8
-
9
-
10
- class InvalidPluginError(PluginManagerError):
11
- """The plugin is invalid."""
12
-
13
- def __init__(self, plugin_name: str, message: str) -> None:
14
- """Instantiate the exception.
15
-
16
- Args:
17
- plugin_name (str): The plugin name.
18
- message (str): The message
19
- """
20
- super().__init__(message=f"Invalid plugin: {plugin_name}, {message}")
21
-
22
-
23
- class PluginPreConditionNotMetError(PluginManagerError):
24
- """The plugin pre-condition is not met."""
25
-
26
- def __init__(self, plugin_name: str, message: str) -> None:
27
- """Instantiate the exception.
28
-
29
- Args:
30
- plugin_name (str): The plugin name.
31
- message (str): The message
32
- """
33
- super().__init__(message=f"Plugin pre-condition not met: {plugin_name}, {message}")
@@ -1,189 +0,0 @@
1
- """Plugin manager.
2
-
3
- This module provides the plugin manager for the application.
4
-
5
- Objective:
6
- - Provide a way to manage plugins for the application.
7
- - The plugins are activated based on the configuration.
8
- - The plugins are checked for pre-conditions.
9
- - The plugins are loaded on application load.
10
- - The plugins are started on application startup.
11
- - The plugins are stopped on application shutdown.
12
- """
13
-
14
- from importlib import import_module
15
- from types import ModuleType
16
- from typing import Self
17
-
18
- from fastapi_factory_utilities.core.plugins import PluginsEnum, PluginState
19
- from fastapi_factory_utilities.core.protocols import (
20
- ApplicationAbstractProtocol,
21
- PluginProtocol,
22
- )
23
-
24
- from .exceptions import InvalidPluginError, PluginPreConditionNotMetError
25
-
26
-
27
- class PluginManager:
28
- """Plugin manager for the application."""
29
-
30
- DEFAULT_PLUGIN_PACKAGE: str = "fastapi_factory_utilities.core.plugins"
31
-
32
- @classmethod
33
- def _import_module(cls, name: str, package: str) -> ModuleType:
34
- """Import the module. This is a wrapper around the import_module function to be able to mock it in the tests.
35
-
36
- Args:
37
- name (str): The name of the module.
38
- package (str): The package of the module.
39
-
40
- Returns:
41
- ModuleType: The module.
42
-
43
- Raises:
44
- ImportError: If the module cannot be imported.
45
- ModuleNotFoundError: If the module is not found.
46
- """
47
- return import_module(name=f"{package}.{name}")
48
-
49
- @classmethod
50
- def _check_pre_conditions(
51
- cls, plugin_package: str, want_to_activate_plugins: list[PluginsEnum], application: ApplicationAbstractProtocol
52
- ) -> list[PluginProtocol]:
53
- """Check the pre-conditions for the plugins.
54
-
55
- Args:
56
- plugin_package (str): The package for the plugins.
57
- want_to_activate_plugins (list[PluginsEnum]): The plugins to activate.
58
- application (BaseApplicationProtocol): The application.
59
-
60
- Returns:
61
- list[PluginProtocol]: The activated plugins.
62
-
63
- Raises:
64
- InvalidPluginError: If the plugin is invalid.
65
- PluginPreConditionNotMetError: If the pre-conditions are not met.
66
- """
67
- plugins: list[PluginProtocol] = []
68
-
69
- for plugin_enum in want_to_activate_plugins:
70
- try:
71
- # Using a custom import function to be able to mock it in the tests.
72
- plugin_module: ModuleType = cls._import_module(name=plugin_enum.value, package=plugin_package)
73
- except (ImportError, ModuleNotFoundError) as import_error:
74
- # TODO: Later, if we introduce extra mecanism to manage dependencies,
75
- # we must handle a part of the error here. To be able to provide a better error message.
76
- # For now, we just raise the error.
77
- raise InvalidPluginError(
78
- plugin_name=plugin_enum.value, message="Error importing the plugin "
79
- ) from import_error
80
-
81
- if not isinstance(plugin_module, PluginProtocol):
82
- raise InvalidPluginError(
83
- plugin_name=plugin_enum.value, message="The plugin does not implement the PluginProtocol"
84
- )
85
-
86
- if not plugin_module.pre_conditions_check(application=application):
87
- raise PluginPreConditionNotMetError(
88
- plugin_name=plugin_enum.value, message="The pre-conditions are not met"
89
- )
90
-
91
- plugins.append(plugin_module)
92
-
93
- return plugins
94
-
95
- def __init__(self, activated: list[PluginsEnum] | None = None, plugin_package: str | None = None) -> None:
96
- """Instanciate the plugin manager."""
97
- self._plugin_package: str = plugin_package or self.DEFAULT_PLUGIN_PACKAGE
98
- self._plugins_wanted_to_be_activated: list[PluginsEnum] = activated or []
99
- self._activated_plugins: list[PluginProtocol] = []
100
- self._states: list[PluginState] = []
101
-
102
- def activate(self, plugin: PluginsEnum) -> Self:
103
- """Activate a plugin.
104
-
105
- Args:
106
- plugin (PluginsEnum): The plugin to activate.
107
-
108
- Returns:
109
- Self: The plugin manager.
110
- """
111
- self._plugins_wanted_to_be_activated.append(plugin)
112
-
113
- return self
114
-
115
- @property
116
- def states(self) -> list[PluginState]:
117
- """Get the states."""
118
- return self._states
119
-
120
- def add_application_context(self, application: ApplicationAbstractProtocol) -> Self:
121
- """Add the application context to the plugins.
122
-
123
- Args:
124
- application (BaseApplicationProtocol): The application.
125
-
126
- Returns:
127
- Self: The plugin manager.
128
- """
129
- self._application: ApplicationAbstractProtocol = application
130
-
131
- return self
132
-
133
- def add_states(self, states: list[PluginState]) -> Self:
134
- """Add the states to the plugin manager.
135
-
136
- Args:
137
- states (list[PluginState]): The states.
138
-
139
- Returns:
140
- Self: The plugin manager.
141
- """
142
- for state in states:
143
- self._states.append(state)
144
- return self
145
-
146
- def clear_states(self) -> Self:
147
- """Clear the states."""
148
- self._states = []
149
- return self
150
-
151
- def load(self) -> Self:
152
- """Load the plugins.
153
-
154
- Returns:
155
- Self: The plugin manager.
156
-
157
- Raises:
158
- InvalidPluginError: If the plugin is invalid.
159
- PluginPreConditionNotMetError: If the pre-conditions are not met.
160
-
161
- """
162
- # Remove duplicates.
163
- self._plugins_wanted_to_be_activated = list(set(self._plugins_wanted_to_be_activated))
164
- # Check the pre-conditions for the plugins.
165
- self._activated_plugins = self._check_pre_conditions(
166
- plugin_package=self._plugin_package,
167
- want_to_activate_plugins=self._plugins_wanted_to_be_activated,
168
- application=self._application,
169
- )
170
- # Load from the previous check.
171
- for plugin in self._activated_plugins:
172
- self.add_states(states=plugin.on_load(application=self._application) or [])
173
-
174
- return self
175
-
176
- async def trigger_startup(self) -> Self:
177
- """Trigger the startup of the plugins."""
178
- for plugin in self._activated_plugins:
179
- states: list[PluginState] | None = await plugin.on_startup(application=self._application)
180
- self.add_states(states=states or [])
181
-
182
- return self
183
-
184
- async def trigger_shutdown(self) -> Self:
185
- """Trigger the shutdown of the plugins."""
186
- for plugin in self._activated_plugins:
187
- await plugin.on_shutdown(application=self._application)
188
-
189
- return self
@@ -1,31 +0,0 @@
1
- """Example Plugin Module."""
2
-
3
- from typing import TYPE_CHECKING
4
-
5
- if TYPE_CHECKING:
6
- from fastapi_factory_utilities.core.plugins import PluginState
7
- from fastapi_factory_utilities.core.protocols import ApplicationAbstractProtocol
8
-
9
-
10
- def pre_conditions_check(application: "ApplicationAbstractProtocol") -> bool: # pylint: disable=unused-argument
11
- """Check the pre-conditions for the example plugin."""
12
- return True
13
-
14
-
15
- def on_load(
16
- application: "ApplicationAbstractProtocol", # pylint: disable=unused-argument
17
- ) -> list["PluginState"] | None:
18
- """Actions to perform on load for the example plugin."""
19
- return
20
-
21
-
22
- async def on_startup(
23
- application: "ApplicationAbstractProtocol", # pylint: disable=unused-argument
24
- ) -> list["PluginState"] | None:
25
- """Actions to perform on startup for the example plugin."""
26
- return
27
-
28
-
29
- async def on_shutdown(application: "ApplicationAbstractProtocol") -> None: # pylint: disable=unused-argument
30
- """Actions to perform on shutdown for the example plugin."""
31
- return
@@ -1,31 +0,0 @@
1
- """Httpx Plugin Module."""
2
-
3
- from typing import TYPE_CHECKING
4
-
5
- if TYPE_CHECKING:
6
- from fastapi_factory_utilities.core.plugins import PluginState
7
- from fastapi_factory_utilities.core.protocols import ApplicationAbstractProtocol
8
-
9
-
10
- def pre_conditions_check(application: "ApplicationAbstractProtocol") -> bool: # pylint: disable=unused-argument
11
- """Check the pre-conditions for the example plugin."""
12
- return True
13
-
14
-
15
- def on_load(
16
- application: "ApplicationAbstractProtocol", # pylint: disable=unused-argument
17
- ) -> list["PluginState"] | None:
18
- """Actions to perform on load for the example plugin."""
19
- return
20
-
21
-
22
- async def on_startup(
23
- application: "ApplicationAbstractProtocol", # pylint: disable=unused-argument
24
- ) -> list["PluginState"] | None:
25
- """Actions to perform on startup for the example plugin."""
26
- return
27
-
28
-
29
- async def on_shutdown(application: "ApplicationAbstractProtocol") -> None: # pylint: disable=unused-argument
30
- """Actions to perform on shutdown for the example plugin."""
31
- return