orionis 0.324.0__py3-none-any.whl → 0.326.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.
- orionis/container/exceptions/attribute_error.py +19 -0
- orionis/container/facades/facade.py +52 -20
- orionis/metadata/framework.py +1 -1
- {orionis-0.324.0.dist-info → orionis-0.326.0.dist-info}/METADATA +1 -1
- {orionis-0.324.0.dist-info → orionis-0.326.0.dist-info}/RECORD +9 -8
- {orionis-0.324.0.dist-info → orionis-0.326.0.dist-info}/WHEEL +0 -0
- {orionis-0.324.0.dist-info → orionis-0.326.0.dist-info}/licenses/LICENCE +0 -0
- {orionis-0.324.0.dist-info → orionis-0.326.0.dist-info}/top_level.txt +0 -0
- {orionis-0.324.0.dist-info → orionis-0.326.0.dist-info}/zip-safe +0 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
class OrionisContainerAttributeError(AttributeError):
|
2
|
+
|
3
|
+
def __init__(self, msg: str):
|
4
|
+
"""
|
5
|
+
Parameters
|
6
|
+
----------
|
7
|
+
msg : str
|
8
|
+
Descriptive error message explaining the cause of the exception.
|
9
|
+
"""
|
10
|
+
super().__init__(msg)
|
11
|
+
|
12
|
+
def __str__(self) -> str:
|
13
|
+
"""
|
14
|
+
Returns
|
15
|
+
-------
|
16
|
+
str
|
17
|
+
Formatted string describing the exception.
|
18
|
+
"""
|
19
|
+
return str(self.args[0])
|
@@ -1,48 +1,79 @@
|
|
1
1
|
from typing import Any
|
2
2
|
from orionis.container.container import Container
|
3
|
+
from orionis.container.exceptions.attribute_error import OrionisContainerAttributeError
|
4
|
+
from orionis.container.exceptions.container_exception import OrionisContainerException
|
3
5
|
|
4
6
|
class FacadeMeta(type):
|
5
7
|
|
6
8
|
def __getattr__(cls, name: str) -> Any:
|
7
9
|
"""
|
8
10
|
When an undefined attribute is accessed, this method resolves the service and delegates the call.
|
9
|
-
It's like having a genie in a bottle, but for services.
|
10
11
|
|
11
|
-
|
12
|
-
|
12
|
+
Parameters
|
13
|
+
----------
|
14
|
+
name : str
|
15
|
+
The name of the attribute to access
|
13
16
|
|
14
|
-
Returns
|
17
|
+
Returns
|
18
|
+
-------
|
19
|
+
Any
|
15
20
|
The requested attribute from the underlying service
|
21
|
+
|
22
|
+
Raises
|
23
|
+
------
|
24
|
+
OrionisContainerAttributeError
|
25
|
+
If the resolved service does not have the requested attribute
|
16
26
|
"""
|
17
27
|
service = cls.resolve()
|
18
28
|
if not hasattr(service, name):
|
19
|
-
raise
|
29
|
+
raise OrionisContainerAttributeError(f"'{cls.__name__}' facade's service has no attribute '{name}'")
|
20
30
|
return getattr(service, name)
|
21
31
|
|
22
|
-
|
23
32
|
class Facade(metaclass=FacadeMeta):
|
24
33
|
|
34
|
+
# Container instance to resolve services
|
25
35
|
_container = Container()
|
26
36
|
|
27
37
|
@classmethod
|
28
38
|
def getFacadeAccessor(cls) -> str:
|
29
39
|
"""
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
Returns
|
34
|
-
|
40
|
+
Get the name of the service to be resolved from the container.
|
41
|
+
This method must be overridden by subclasses to return the name of the service
|
42
|
+
to be resolved. If not overridden, it raises NotImplementedError.
|
43
|
+
Returns
|
44
|
+
-------
|
45
|
+
str
|
46
|
+
The service name to be resolved from the container.
|
47
|
+
Raises
|
48
|
+
------
|
49
|
+
NotImplementedError
|
50
|
+
If the method is not overridden by a subclass.
|
35
51
|
"""
|
36
52
|
raise NotImplementedError(f"Class {cls.__name__} must define the getFacadeAccessor method")
|
37
53
|
|
38
54
|
@classmethod
|
39
|
-
def resolve(cls) -> Any:
|
55
|
+
def resolve(cls, *args, **kwargs) -> Any:
|
40
56
|
"""
|
41
|
-
|
42
|
-
|
57
|
+
This method retrieves a service instance from the container using the facade accessor.
|
58
|
+
If the service is not bound in the container, a RuntimeError is raised.
|
59
|
+
Parameters
|
60
|
+
----------
|
61
|
+
*args
|
62
|
+
Positional arguments to pass to the service constructor.
|
63
|
+
**kwargs
|
64
|
+
Keyword arguments to pass to the service constructor.
|
65
|
+
|
66
|
+
Returns
|
67
|
+
-------
|
68
|
+
Any
|
69
|
+
The resolved service instance.
|
43
70
|
|
44
|
-
|
45
|
-
|
71
|
+
Raises
|
72
|
+
------
|
73
|
+
OrionisContainerException
|
74
|
+
If the service is not bound in the container.
|
75
|
+
Notes
|
76
|
+
-----
|
46
77
|
"""
|
47
78
|
|
48
79
|
# Get the service name from the facade accessor
|
@@ -50,11 +81,12 @@ class Facade(metaclass=FacadeMeta):
|
|
50
81
|
|
51
82
|
# Check if the service is bound in the container
|
52
83
|
if not cls._container.bound(service_name):
|
53
|
-
raise
|
54
|
-
f"
|
55
|
-
"
|
84
|
+
raise OrionisContainerException(
|
85
|
+
f"Service '{service_name}' not bound in the container. "
|
86
|
+
f"Please ensure '{service_name}' is registered in the container before using the {cls.__name__} facade. "
|
87
|
+
"You can register services in a service provider using the 'register' method."
|
56
88
|
)
|
57
89
|
|
58
90
|
# Resolve the service instance from the container
|
59
|
-
service_instance = cls._container.make(service_name)
|
91
|
+
service_instance = cls._container.make(service_name, *args, **kwargs)
|
60
92
|
return service_instance
|
orionis/metadata/framework.py
CHANGED
@@ -137,11 +137,12 @@ orionis/container/context/scope.py,sha256=CWFiLLTAC_IdmeFKWX-jrphdxB0_TMEVBlz6lQ
|
|
137
137
|
orionis/container/contracts/container.py,sha256=hOO3w2yqVhp2nPTeS1uJEYgXSTbM3xwezDCOSNMC_a0,7603
|
138
138
|
orionis/container/entities/binding.py,sha256=Qp6Lf4XUDp2NjqXDAC2lzvhOFQWiBDKiGFcKfwb4axw,4342
|
139
139
|
orionis/container/enums/lifetimes.py,sha256=RqQmugMIB1Ev_j_vFLcWorndm-to7xg4stQ7yKFDdDw,190
|
140
|
+
orionis/container/exceptions/attribute_error.py,sha256=ysYKvXfunH-bywK_e02inY94s8aZ3vUZA6jATbDcQmk,480
|
140
141
|
orionis/container/exceptions/container_exception.py,sha256=goTDEwC70xTMD2qppN8KV-xyR0Nps218OD4D1LZ2-3s,470
|
141
142
|
orionis/container/exceptions/type_error_exception.py,sha256=cYuvoXVOgRYj3tZPfK341aUERkf33-buOiI2eXxcrAw,470
|
142
143
|
orionis/container/exceptions/value_exception.py,sha256=hjY0YEusoL3DurME1ornxvIv1wyGaf6tBggLFlGHblo,472
|
143
144
|
orionis/container/facades/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
144
|
-
orionis/container/facades/facade.py,sha256=
|
145
|
+
orionis/container/facades/facade.py,sha256=vu71_uqXnSpCFyeswPgKIhTPmIBLEK3bsy5sk4vTOEk,3306
|
145
146
|
orionis/container/validators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
146
147
|
orionis/container/validators/implements.py,sha256=iSoDxxTalQKhyKjvsojFlkROhBFvAjvJxRvPJlmGrSg,2843
|
147
148
|
orionis/container/validators/is_abstract_class.py,sha256=Q-Lqyrrps6oj2XWI0KFRp-hDZf4_sgbZlEbfBXj5XT4,1169
|
@@ -243,7 +244,7 @@ orionis/foundation/contracts/config.py,sha256=Rpz6U6t8OXHO9JJKSTnCimytXE-tfCB-1i
|
|
243
244
|
orionis/foundation/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
244
245
|
orionis/foundation/exceptions/integrity.py,sha256=mc4pL1UMoYRHEmphnpW2oGk5URhu7DJRREyzHaV-cs8,472
|
245
246
|
orionis/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
246
|
-
orionis/metadata/framework.py,sha256=
|
247
|
+
orionis/metadata/framework.py,sha256=svbGGD2xkWp-acBSsN0mAnDdJP_467sDrJurMdbEcTw,4960
|
247
248
|
orionis/metadata/package.py,sha256=tqLfBRo-w1j_GN4xvzUNFyweWYFS-qhSgAEc-AmCH1M,5452
|
248
249
|
orionis/patterns/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
249
250
|
orionis/patterns/singleton/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -355,7 +356,7 @@ orionis/test/suite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
|
|
355
356
|
orionis/test/suite/test_unit.py,sha256=MWgW8dRCRyT1XZ5LsbXQ7-KVPReasoXwzEEL1EWWfE4,52190
|
356
357
|
orionis/test/view/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
357
358
|
orionis/test/view/render.py,sha256=jXZkbITBknbUwm_mD8bcTiwLDvsFkrO9qrf0ZgPwqxc,4903
|
358
|
-
orionis-0.
|
359
|
+
orionis-0.326.0.dist-info/licenses/LICENCE,sha256=-_4cF2EBKuYVS_SQpy1uapq0oJPUU1vl_RUWSy2jJTo,1111
|
359
360
|
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
360
361
|
tests/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
361
362
|
tests/example/test_example.py,sha256=kvWgiW3ADEZf718dGsMPtDh_rmOSx1ypEInKm7_6ZPQ,601
|
@@ -456,8 +457,8 @@ tests/support/wrapper/test_services_wrapper_docdict.py,sha256=yeVwl-VcwkWSQYyxZu
|
|
456
457
|
tests/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
457
458
|
tests/testing/test_testing_result.py,sha256=MrGK3ZimedL0b5Ydu69Dg8Iul017AzLTm7VPxpXlpfU,4315
|
458
459
|
tests/testing/test_testing_unit.py,sha256=DjLBtvVn8B1KlVJNNkstBT8_csA1yeaMqnGrbanN_J4,7438
|
459
|
-
orionis-0.
|
460
|
-
orionis-0.
|
461
|
-
orionis-0.
|
462
|
-
orionis-0.
|
463
|
-
orionis-0.
|
460
|
+
orionis-0.326.0.dist-info/METADATA,sha256=9cULji4Q0k6ra8WQx__ktSXu2OXXFZHm8RZ-rKpG9LY,4772
|
461
|
+
orionis-0.326.0.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
|
462
|
+
orionis-0.326.0.dist-info/top_level.txt,sha256=2bdoHgyGZhOtLAXS6Om8OCTmL24dUMC_L1quMe_ETbk,14
|
463
|
+
orionis-0.326.0.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
|
464
|
+
orionis-0.326.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|