orionis 0.405.0__py3-none-any.whl → 0.407.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/console/base/command.py +57 -50
- orionis/console/base/contracts/command.py +68 -0
- orionis/console/dynamic/contracts/progress_bar.py +3 -3
- orionis/console/dynamic/progress_bar.py +8 -8
- orionis/console/output/console.py +8 -2
- orionis/console/output/contracts/console.py +1 -1
- orionis/container/container.py +2 -2
- orionis/container/context/scope.py +4 -1
- orionis/container/contracts/service_provider.py +2 -2
- orionis/container/entities/binding.py +31 -44
- orionis/container/enums/lifetimes.py +22 -1
- orionis/container/facades/facade.py +1 -2
- orionis/container/providers/service_provider.py +2 -2
- orionis/foundation/application.py +542 -248
- orionis/foundation/config/app/entities/app.py +107 -90
- orionis/foundation/config/auth/entities/auth.py +4 -33
- orionis/foundation/config/cache/entities/cache.py +18 -41
- orionis/foundation/config/cache/entities/file.py +8 -35
- orionis/foundation/config/cache/entities/stores.py +17 -38
- orionis/foundation/config/cors/entities/cors.py +41 -54
- orionis/foundation/config/database/entities/connections.py +40 -56
- orionis/foundation/config/database/entities/database.py +11 -38
- orionis/foundation/config/database/entities/mysql.py +48 -76
- orionis/foundation/config/database/entities/oracle.py +30 -57
- orionis/foundation/config/database/entities/pgsql.py +45 -61
- orionis/foundation/config/database/entities/sqlite.py +26 -53
- orionis/foundation/config/filesystems/entitites/aws.py +28 -49
- orionis/foundation/config/filesystems/entitites/disks.py +27 -47
- orionis/foundation/config/filesystems/entitites/filesystems.py +15 -37
- orionis/foundation/config/filesystems/entitites/local.py +9 -35
- orionis/foundation/config/filesystems/entitites/public.py +14 -41
- orionis/foundation/config/logging/entities/channels.py +56 -86
- orionis/foundation/config/logging/entities/chunked.py +9 -9
- orionis/foundation/config/logging/entities/daily.py +8 -8
- orionis/foundation/config/logging/entities/hourly.py +6 -6
- orionis/foundation/config/logging/entities/logging.py +12 -18
- orionis/foundation/config/logging/entities/monthly.py +7 -7
- orionis/foundation/config/logging/entities/stack.py +5 -5
- orionis/foundation/config/logging/entities/weekly.py +6 -6
- orionis/foundation/config/mail/entities/file.py +9 -36
- orionis/foundation/config/mail/entities/mail.py +22 -40
- orionis/foundation/config/mail/entities/mailers.py +29 -44
- orionis/foundation/config/mail/entities/smtp.py +47 -48
- orionis/foundation/config/queue/entities/brokers.py +19 -41
- orionis/foundation/config/queue/entities/database.py +24 -46
- orionis/foundation/config/queue/entities/queue.py +28 -40
- orionis/foundation/config/roots/paths.py +272 -468
- orionis/foundation/config/session/entities/session.py +23 -53
- orionis/foundation/config/startup.py +165 -135
- orionis/foundation/config/testing/entities/testing.py +137 -122
- orionis/foundation/config/testing/enums/__init__.py +6 -2
- orionis/foundation/config/testing/enums/drivers.py +16 -0
- orionis/foundation/config/testing/enums/verbosity.py +18 -0
- orionis/foundation/contracts/application.py +152 -362
- orionis/foundation/providers/console_provider.py +24 -2
- orionis/foundation/providers/dumper_provider.py +24 -2
- orionis/foundation/providers/logger_provider.py +24 -2
- orionis/foundation/providers/path_resolver_provider.py +25 -2
- orionis/foundation/providers/progress_bar_provider.py +24 -2
- orionis/foundation/providers/testing_provider.py +39 -0
- orionis/foundation/providers/workers_provider.py +24 -2
- orionis/metadata/framework.py +1 -1
- orionis/services/asynchrony/contracts/coroutines.py +13 -5
- orionis/services/asynchrony/coroutines.py +33 -29
- orionis/services/asynchrony/exceptions/exception.py +9 -1
- orionis/services/environment/core/dot_env.py +46 -34
- orionis/services/environment/enums/__init__.py +0 -0
- orionis/services/environment/enums/cast_type.py +42 -0
- orionis/services/environment/helpers/functions.py +1 -2
- orionis/services/environment/key/__init__.py +0 -0
- orionis/services/environment/key/key_generator.py +37 -0
- orionis/services/environment/serializer/__init__.py +0 -0
- orionis/services/environment/serializer/values.py +21 -0
- orionis/services/environment/validators/__init__.py +0 -0
- orionis/services/environment/validators/key_name.py +46 -0
- orionis/services/environment/validators/types.py +45 -0
- orionis/services/system/contracts/imports.py +38 -18
- orionis/services/system/contracts/workers.py +29 -12
- orionis/services/system/imports.py +65 -25
- orionis/services/system/runtime/imports.py +18 -9
- orionis/services/system/workers.py +49 -16
- orionis/support/entities/__init__.py +0 -0
- orionis/support/entities/base.py +104 -0
- orionis/support/facades/testing.py +15 -0
- orionis/support/facades/workers.py +1 -1
- orionis/test/cases/asynchronous.py +0 -11
- orionis/test/cases/synchronous.py +0 -9
- orionis/test/contracts/dumper.py +11 -4
- orionis/test/contracts/kernel.py +5 -110
- orionis/test/contracts/logs.py +27 -65
- orionis/test/contracts/printer.py +16 -128
- orionis/test/contracts/test_result.py +100 -0
- orionis/test/contracts/unit_test.py +87 -150
- orionis/test/core/unit_test.py +608 -554
- orionis/test/entities/result.py +22 -2
- orionis/test/enums/__init__.py +0 -2
- orionis/test/enums/status.py +14 -9
- orionis/test/exceptions/config.py +9 -1
- orionis/test/exceptions/failure.py +34 -11
- orionis/test/exceptions/persistence.py +10 -2
- orionis/test/exceptions/runtime.py +9 -1
- orionis/test/exceptions/value.py +13 -1
- orionis/test/kernel.py +87 -289
- orionis/test/output/dumper.py +83 -18
- orionis/test/output/printer.py +399 -156
- orionis/test/records/logs.py +203 -82
- orionis/test/validators/__init__.py +33 -0
- orionis/test/validators/base_path.py +45 -0
- orionis/test/validators/execution_mode.py +45 -0
- orionis/test/validators/fail_fast.py +37 -0
- orionis/test/validators/folder_path.py +34 -0
- orionis/test/validators/module_name.py +31 -0
- orionis/test/validators/name_pattern.py +40 -0
- orionis/test/validators/pattern.py +36 -0
- orionis/test/validators/persistent.py +42 -0
- orionis/test/validators/persistent_driver.py +43 -0
- orionis/test/validators/print_result.py +37 -0
- orionis/test/validators/tags.py +37 -0
- orionis/test/validators/throw_exception.py +39 -0
- orionis/test/validators/verbosity.py +37 -0
- orionis/test/validators/web_report.py +35 -0
- orionis/test/validators/workers.py +31 -0
- orionis/test/view/render.py +48 -54
- {orionis-0.405.0.dist-info → orionis-0.407.0.dist-info}/METADATA +1 -1
- {orionis-0.405.0.dist-info → orionis-0.407.0.dist-info}/RECORD +170 -112
- tests/container/__init__.py +0 -0
- tests/container/context/__init__.py +0 -0
- tests/container/context/test_manager.py +27 -0
- tests/container/context/test_scope.py +23 -0
- tests/container/entities/__init__.py +0 -0
- tests/container/entities/test_binding.py +133 -0
- tests/container/enums/__init__.py +0 -0
- tests/container/enums/test_lifetimes.py +63 -0
- tests/container/facades/__init__.py +0 -0
- tests/container/facades/test_facade.py +61 -0
- tests/container/mocks/__init__.py +0 -0
- tests/container/mocks/mock_complex_classes.py +482 -0
- tests/container/mocks/mock_simple_classes.py +32 -0
- tests/container/providers/__init__.py +0 -0
- tests/container/providers/test_providers.py +48 -0
- tests/container/resolver/__init__.py +0 -0
- tests/container/resolver/test_resolver.py +55 -0
- tests/container/test_container.py +254 -0
- tests/container/test_singleton.py +98 -0
- tests/container/test_thread_safety.py +217 -0
- tests/container/validators/__init__.py +0 -0
- tests/container/validators/test_implements.py +140 -0
- tests/container/validators/test_is_abstract_class.py +99 -0
- tests/container/validators/test_is_callable.py +73 -0
- tests/container/validators/test_is_concrete_class.py +97 -0
- tests/container/validators/test_is_instance.py +105 -0
- tests/container/validators/test_is_not_subclass.py +117 -0
- tests/container/validators/test_is_subclass.py +115 -0
- tests/container/validators/test_is_valid_alias.py +113 -0
- tests/container/validators/test_lifetime.py +75 -0
- tests/example/test_example.py +2 -2
- tests/foundation/config/testing/test_foundation_config_testing.py +1 -1
- tests/metadata/test_metadata_framework.py +89 -24
- tests/metadata/test_metadata_package.py +55 -10
- tests/services/asynchrony/test_services_asynchrony_coroutine.py +52 -7
- tests/services/system/test_services_system_imports.py +119 -16
- tests/services/system/test_services_system_workers.py +71 -30
- tests/testing/test_testing_result.py +117 -117
- tests/testing/test_testing_unit.py +209 -209
- orionis/foundation/config/base.py +0 -112
- orionis/test/arguments/parser.py +0 -187
- orionis/test/contracts/parser.py +0 -43
- orionis/test/entities/arguments.py +0 -38
- orionis/test/enums/execution_mode.py +0 -16
- /orionis/{test/arguments → console/base/contracts}/__init__.py +0 -0
- /orionis/foundation/config/testing/enums/{test_mode.py → mode.py} +0 -0
- {orionis-0.405.0.dist-info → orionis-0.407.0.dist-info}/WHEEL +0 -0
- {orionis-0.405.0.dist-info → orionis-0.407.0.dist-info}/licenses/LICENCE +0 -0
- {orionis-0.405.0.dist-info → orionis-0.407.0.dist-info}/top_level.txt +0 -0
- {orionis-0.405.0.dist-info → orionis-0.407.0.dist-info}/zip-safe +0 -0
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
import asyncio
|
|
3
|
+
|
|
4
|
+
from tests.container.mocks.mock_simple_classes import ICar
|
|
5
|
+
|
|
6
|
+
def ejemplo(x:int = 3, y:int = 2):
|
|
7
|
+
return x + y
|
|
8
|
+
|
|
9
|
+
class AbstractFakeClass(ABC):
|
|
10
|
+
|
|
11
|
+
"""
|
|
12
|
+
AbstractFakeClass es una clase abstracta basada en FakeClass, diseñada para simular atributos y métodos de diferentes niveles de visibilidad.
|
|
13
|
+
Define métodos y propiedades abstractas para ser implementadas por subclases concretas.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
# Atributos de clase
|
|
17
|
+
public_attr: int = 42
|
|
18
|
+
dynamic_attr = None
|
|
19
|
+
_protected_attr: str = "protected"
|
|
20
|
+
__private_attr: str = "private"
|
|
21
|
+
__dd__: str = "dunder_value"
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def computed_public_property(self) -> str:
|
|
26
|
+
"""
|
|
27
|
+
Computes and returns the value of a public property.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
str: The computed value of the public property.
|
|
31
|
+
"""
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def _computed_property_protected(self) -> str:
|
|
37
|
+
"""
|
|
38
|
+
A protected method intended to compute and return a string property.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
str: The computed property as a string.
|
|
42
|
+
"""
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
def __init__(self) -> None:
|
|
46
|
+
self.public_attr = 42
|
|
47
|
+
self.dynamic_attr = None
|
|
48
|
+
self._protected_attr = "protected"
|
|
49
|
+
self.__private_attr = "private"
|
|
50
|
+
self.__dd__ = "dunder_value"
|
|
51
|
+
|
|
52
|
+
# Métodos de instancia
|
|
53
|
+
@abstractmethod
|
|
54
|
+
def instanceSyncMethod(self, x: int, y: int) -> int:
|
|
55
|
+
pass
|
|
56
|
+
|
|
57
|
+
@abstractmethod
|
|
58
|
+
async def instanceAsyncMethod(self, x: int, y: int) -> int:
|
|
59
|
+
pass
|
|
60
|
+
|
|
61
|
+
@abstractmethod
|
|
62
|
+
def _protectedsyncMethod(self, x: int, y: int) -> int:
|
|
63
|
+
pass
|
|
64
|
+
|
|
65
|
+
@abstractmethod
|
|
66
|
+
async def _protectedAsyncMethod(self, x: int, y: int) -> int:
|
|
67
|
+
pass
|
|
68
|
+
|
|
69
|
+
# Métodos de clase
|
|
70
|
+
@classmethod
|
|
71
|
+
@abstractmethod
|
|
72
|
+
def classSyncMethod(cls, x: int, y: int) -> int:
|
|
73
|
+
pass
|
|
74
|
+
|
|
75
|
+
@classmethod
|
|
76
|
+
@abstractmethod
|
|
77
|
+
async def classAsyncMethod(cls, x: int, y: int) -> int:
|
|
78
|
+
pass
|
|
79
|
+
|
|
80
|
+
@classmethod
|
|
81
|
+
@abstractmethod
|
|
82
|
+
def _classMethodProtected(cls, x: int, y: int) -> int:
|
|
83
|
+
pass
|
|
84
|
+
|
|
85
|
+
@classmethod
|
|
86
|
+
@abstractmethod
|
|
87
|
+
async def _classAsyncMethodProtected(cls, x: int, y: int) -> int:
|
|
88
|
+
pass
|
|
89
|
+
|
|
90
|
+
# Métodos estáticos
|
|
91
|
+
@staticmethod
|
|
92
|
+
@abstractmethod
|
|
93
|
+
def staticMethod(text: str) -> str:
|
|
94
|
+
pass
|
|
95
|
+
|
|
96
|
+
@staticmethod
|
|
97
|
+
@abstractmethod
|
|
98
|
+
async def staticAsyncMethod(text: str) -> str:
|
|
99
|
+
pass
|
|
100
|
+
|
|
101
|
+
@staticmethod
|
|
102
|
+
@abstractmethod
|
|
103
|
+
def _staticMethodProtected(text: str) -> str:
|
|
104
|
+
pass
|
|
105
|
+
|
|
106
|
+
@staticmethod
|
|
107
|
+
@abstractmethod
|
|
108
|
+
async def _staticAsyncMethodProtected(text: str) -> str:
|
|
109
|
+
pass
|
|
110
|
+
|
|
111
|
+
class FakeClass(AbstractFakeClass):
|
|
112
|
+
"""
|
|
113
|
+
FakeClass is a test double class designed to simulate a variety of attribute and method visibilities for inspection and testing purposes.
|
|
114
|
+
This class provides:
|
|
115
|
+
- Public, protected, and private class-level and instance-level attributes.
|
|
116
|
+
- Public, protected, and private properties.
|
|
117
|
+
- Synchronous and asynchronous instance methods with varying visibilities.
|
|
118
|
+
- Synchronous and asynchronous class methods with varying visibilities.
|
|
119
|
+
- Synchronous and asynchronous static methods with varying visibilities.
|
|
120
|
+
public_attr (int): A public class and instance attribute set to 42.
|
|
121
|
+
dynamic_attr: A public attribute initialized to None, can be set dynamically.
|
|
122
|
+
_protected_attr (str): A protected class and instance attribute set to "protected".
|
|
123
|
+
__private_attr (str): A private class and instance attribute set to "private".
|
|
124
|
+
Properties:
|
|
125
|
+
computed_public_property (str): Returns "public property".
|
|
126
|
+
_computed_property_protected (str): Returns "protected property".
|
|
127
|
+
__computed_property_private (str): Returns "private property".
|
|
128
|
+
Methods:
|
|
129
|
+
instanceSyncMethod(x: int, y: int) -> int:
|
|
130
|
+
instanceAsyncMethod(x: int, y: int) -> int:
|
|
131
|
+
_protectedsyncMethod(x: int, y: int) -> int:
|
|
132
|
+
Protected synchronous addition method.
|
|
133
|
+
_protectedAsyncMethod(x: int, y: int) -> int:
|
|
134
|
+
Protected asynchronous addition method.
|
|
135
|
+
__privateSyncMethod(x: int, y: int) -> int:
|
|
136
|
+
Private synchronous addition method.
|
|
137
|
+
__privateAsyncMethod(x: int, y: int) -> int:
|
|
138
|
+
Private asynchronous addition method.
|
|
139
|
+
Class Methods:
|
|
140
|
+
classSyncMethod(x: int, y: int) -> int:
|
|
141
|
+
classAsyncMethod(x: int, y: int) -> int:
|
|
142
|
+
_classMethodProtected(x: int, y: int) -> int:
|
|
143
|
+
Protected synchronous class addition method.
|
|
144
|
+
_classAsyncMethodProtected(x: int, y: int) -> int:
|
|
145
|
+
Protected asynchronous class addition method.
|
|
146
|
+
__classMethodPrivate(x: int, y: int) -> int:
|
|
147
|
+
Private synchronous class addition method.
|
|
148
|
+
__classAsyncMethodPrivate(x: int, y: int) -> int:
|
|
149
|
+
Private asynchronous class addition method.
|
|
150
|
+
Static Methods:
|
|
151
|
+
staticMethod(text: str) -> str:
|
|
152
|
+
Synchronously converts the input text to uppercase.
|
|
153
|
+
staticAsyncMethod(text: str) -> str:
|
|
154
|
+
Asynchronously converts the input text to uppercase.
|
|
155
|
+
_staticMethodProtected(text: str) -> str:
|
|
156
|
+
Protected synchronous static method to uppercase text.
|
|
157
|
+
_staticAsyncMethodProtected(text: str) -> str:
|
|
158
|
+
Protected asynchronous static method to uppercase text.
|
|
159
|
+
__staticMethodPrivate(text: str) -> str:
|
|
160
|
+
Private synchronous static method to uppercase text.
|
|
161
|
+
__staticAsyncMethodPrivate(text: str) -> str:
|
|
162
|
+
Private asynchronous static method to uppercase text.
|
|
163
|
+
Note:
|
|
164
|
+
This class is intended for testing and inspection of attribute and method visibility, including Python's name mangling for private members.
|
|
165
|
+
"""
|
|
166
|
+
|
|
167
|
+
# Class-level attribute (Public)
|
|
168
|
+
public_attr: int = 42
|
|
169
|
+
dynamic_attr = None
|
|
170
|
+
|
|
171
|
+
# Class-level attribute (Protected)
|
|
172
|
+
_protected_attr: str = "protected"
|
|
173
|
+
|
|
174
|
+
# Class-level attribute (Private)
|
|
175
|
+
__private_attr: str = "private"
|
|
176
|
+
__dd__: str = "dunder_value"
|
|
177
|
+
|
|
178
|
+
@property
|
|
179
|
+
def computed_public_property(self) -> str:
|
|
180
|
+
"""
|
|
181
|
+
Returns the string "public" as a computed property.
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
str: The string "public".
|
|
185
|
+
"""
|
|
186
|
+
return f"public property"
|
|
187
|
+
|
|
188
|
+
@property
|
|
189
|
+
def _computed_property_protected(self) -> str:
|
|
190
|
+
"""
|
|
191
|
+
Returns a string indicating that this is a protected computed property.
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
str: The string "protected".
|
|
195
|
+
"""
|
|
196
|
+
"""A computed property."""
|
|
197
|
+
return f"protected property"
|
|
198
|
+
|
|
199
|
+
@property
|
|
200
|
+
def __computed_property_private(self) -> str:
|
|
201
|
+
"""
|
|
202
|
+
Returns the string "private".
|
|
203
|
+
|
|
204
|
+
This is a private computed property method, typically used for internal logic or testing purposes.
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
str: The string "private".
|
|
208
|
+
"""
|
|
209
|
+
return f"private property"
|
|
210
|
+
|
|
211
|
+
def __init__(self, carro:ICar, *, edad:int=10, callback:ejemplo) -> None:
|
|
212
|
+
"""
|
|
213
|
+
Initializes the instance with various attributes for testing attribute visibility.
|
|
214
|
+
|
|
215
|
+
Attributes:
|
|
216
|
+
public_attr (int): A public attribute set to 42.
|
|
217
|
+
_protected_attr (str): A protected attribute set to "protected".
|
|
218
|
+
__private_attr (str): A private attribute set to "private".
|
|
219
|
+
dynamic_attr: An attribute initialized to None, can be set dynamically.
|
|
220
|
+
__dd__ (str): A dunder (double underscore) attribute set to "dunder_value".
|
|
221
|
+
"""
|
|
222
|
+
|
|
223
|
+
# Initialize attributes (Publics)
|
|
224
|
+
self.public_attr = 42
|
|
225
|
+
self.dynamic_attr = None
|
|
226
|
+
|
|
227
|
+
# Initialize attributes (Protected)
|
|
228
|
+
self._protected_attr = "protected"
|
|
229
|
+
|
|
230
|
+
# Initialize attributes (Private)
|
|
231
|
+
self.__private_attr = "private"
|
|
232
|
+
self.__dd__ = "dunder_value"
|
|
233
|
+
|
|
234
|
+
def instanceSyncMethod(self, x: int, y: int) -> int:
|
|
235
|
+
"""
|
|
236
|
+
Synchronously adds two integers and returns the result.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
x (int): The first integer to add.
|
|
240
|
+
y (int): The second integer to add.
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
int: The sum of x and y.
|
|
244
|
+
"""
|
|
245
|
+
return x + y
|
|
246
|
+
|
|
247
|
+
async def instanceAsyncMethod(self, x: int, y: int) -> int:
|
|
248
|
+
"""
|
|
249
|
+
Asynchronously adds two integers and returns the result.
|
|
250
|
+
|
|
251
|
+
Args:
|
|
252
|
+
x (int): The first integer to add.
|
|
253
|
+
y (int): The second integer to add.
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
int: The sum of x and y.
|
|
257
|
+
"""
|
|
258
|
+
await asyncio.sleep(0.1)
|
|
259
|
+
return x + y
|
|
260
|
+
|
|
261
|
+
def _protectedsyncMethod(self, x: int, y: int) -> int:
|
|
262
|
+
"""
|
|
263
|
+
Synchronously adds two integers and returns the result (protected method).
|
|
264
|
+
|
|
265
|
+
Args:
|
|
266
|
+
x (int): The first integer to add.
|
|
267
|
+
y (int): The second integer to add.
|
|
268
|
+
|
|
269
|
+
Returns:
|
|
270
|
+
int: The sum of x and y.
|
|
271
|
+
"""
|
|
272
|
+
return x + y
|
|
273
|
+
|
|
274
|
+
async def _protectedAsyncMethod(self, x: int, y: int) -> int:
|
|
275
|
+
"""
|
|
276
|
+
Asynchronously adds two integers and returns the result (protected method).
|
|
277
|
+
|
|
278
|
+
Args:
|
|
279
|
+
x (int): The first integer to add.
|
|
280
|
+
y (int): The second integer to add.
|
|
281
|
+
|
|
282
|
+
Returns:
|
|
283
|
+
int: The sum of x and y.
|
|
284
|
+
"""
|
|
285
|
+
await asyncio.sleep(0.1)
|
|
286
|
+
return x + y
|
|
287
|
+
|
|
288
|
+
def __privateSyncMethod(self, x: int, y: int) -> int:
|
|
289
|
+
"""
|
|
290
|
+
Synchronously adds two integers and returns the result (private method).
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
x (int): The first integer to add.
|
|
294
|
+
y (int): The second integer to add.
|
|
295
|
+
|
|
296
|
+
Returns:
|
|
297
|
+
int: The sum of x and y.
|
|
298
|
+
"""
|
|
299
|
+
return x + y
|
|
300
|
+
|
|
301
|
+
async def __privateAsyncMethod(self, x: int, y: int) -> int:
|
|
302
|
+
"""
|
|
303
|
+
Asynchronously adds two integers and returns the result (private method).
|
|
304
|
+
|
|
305
|
+
Args:
|
|
306
|
+
x (int): The first integer to add.
|
|
307
|
+
y (int): The second integer to add.
|
|
308
|
+
|
|
309
|
+
Returns:
|
|
310
|
+
int: The sum of x and y.
|
|
311
|
+
"""
|
|
312
|
+
await asyncio.sleep(0.1)
|
|
313
|
+
return x + y
|
|
314
|
+
|
|
315
|
+
@classmethod
|
|
316
|
+
def classSyncMethod(cls, x: int, y: int) -> int:
|
|
317
|
+
"""
|
|
318
|
+
Synchronously adds two integers and returns the result (class method).
|
|
319
|
+
|
|
320
|
+
Args:
|
|
321
|
+
x (int): The first integer to add.
|
|
322
|
+
y (int): The second integer to add.
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
int: The sum of x and y.
|
|
326
|
+
"""
|
|
327
|
+
return x + y
|
|
328
|
+
|
|
329
|
+
@classmethod
|
|
330
|
+
async def classAsyncMethod(cls, x: int, y: int) -> int:
|
|
331
|
+
"""
|
|
332
|
+
Asynchronously adds two integers and returns the result (class method).
|
|
333
|
+
|
|
334
|
+
Args:
|
|
335
|
+
x (int): The first integer to add.
|
|
336
|
+
y (int): The second integer to add.
|
|
337
|
+
|
|
338
|
+
Returns:
|
|
339
|
+
int: The sum of x and y.
|
|
340
|
+
"""
|
|
341
|
+
await asyncio.sleep(0.1)
|
|
342
|
+
return x + y
|
|
343
|
+
|
|
344
|
+
@classmethod
|
|
345
|
+
def _classMethodProtected(cls, x: int, y: int) -> int:
|
|
346
|
+
"""
|
|
347
|
+
Synchronously adds two integers and returns the result (protected class method).
|
|
348
|
+
|
|
349
|
+
Args:
|
|
350
|
+
x (int): The first integer to add.
|
|
351
|
+
y (int): The second integer to add.
|
|
352
|
+
|
|
353
|
+
Returns:
|
|
354
|
+
int: The sum of x and y.
|
|
355
|
+
"""
|
|
356
|
+
return x + y
|
|
357
|
+
|
|
358
|
+
@classmethod
|
|
359
|
+
async def _classAsyncMethodProtected(cls, x: int, y: int) -> int:
|
|
360
|
+
"""
|
|
361
|
+
Asynchronously adds two integers and returns the result (protected class method).
|
|
362
|
+
|
|
363
|
+
Args:
|
|
364
|
+
x (int): The first integer to add.
|
|
365
|
+
y (int): The second integer to add.
|
|
366
|
+
|
|
367
|
+
Returns:
|
|
368
|
+
int: The sum of x and y.
|
|
369
|
+
"""
|
|
370
|
+
await asyncio.sleep(0.1)
|
|
371
|
+
return x + y
|
|
372
|
+
|
|
373
|
+
@classmethod
|
|
374
|
+
def __classMethodPrivate(cls, x: int, y: int) -> int:
|
|
375
|
+
"""
|
|
376
|
+
Synchronously adds two integers and returns the result (private class method).
|
|
377
|
+
|
|
378
|
+
Args:
|
|
379
|
+
x (int): The first integer to add.
|
|
380
|
+
y (int): The second integer to add.
|
|
381
|
+
|
|
382
|
+
Returns:
|
|
383
|
+
int: The sum of x and y.
|
|
384
|
+
"""
|
|
385
|
+
return x + y
|
|
386
|
+
|
|
387
|
+
@classmethod
|
|
388
|
+
async def __classAsyncMethodPrivate(cls, x: int, y: int) -> int:
|
|
389
|
+
"""
|
|
390
|
+
Asynchronously adds two integers and returns the result (private class method).
|
|
391
|
+
|
|
392
|
+
Args:
|
|
393
|
+
x (int): The first integer to add.
|
|
394
|
+
y (int): The second integer to add.
|
|
395
|
+
|
|
396
|
+
Returns:
|
|
397
|
+
int: The sum of x and y.
|
|
398
|
+
"""
|
|
399
|
+
await asyncio.sleep(0.1)
|
|
400
|
+
return x + y
|
|
401
|
+
|
|
402
|
+
@staticmethod
|
|
403
|
+
def staticMethod(text: str) -> str:
|
|
404
|
+
"""
|
|
405
|
+
Synchronously converts the input text to uppercase (static method).
|
|
406
|
+
|
|
407
|
+
Args:
|
|
408
|
+
text (str): The input string.
|
|
409
|
+
|
|
410
|
+
Returns:
|
|
411
|
+
str: The uppercase version of the input string.
|
|
412
|
+
"""
|
|
413
|
+
return text.upper()
|
|
414
|
+
|
|
415
|
+
@staticmethod
|
|
416
|
+
async def staticAsyncMethod(text: str) -> str:
|
|
417
|
+
"""
|
|
418
|
+
Asynchronously converts the input text to uppercase (static method).
|
|
419
|
+
|
|
420
|
+
Args:
|
|
421
|
+
text (str): The input string.
|
|
422
|
+
|
|
423
|
+
Returns:
|
|
424
|
+
str: The uppercase version of the input string.
|
|
425
|
+
"""
|
|
426
|
+
await asyncio.sleep(0.1)
|
|
427
|
+
return text.upper()
|
|
428
|
+
|
|
429
|
+
@staticmethod
|
|
430
|
+
def _staticMethodProtected(text: str) -> str:
|
|
431
|
+
"""
|
|
432
|
+
Synchronously converts the input text to uppercase (protected static method).
|
|
433
|
+
|
|
434
|
+
Args:
|
|
435
|
+
text (str): The input string.
|
|
436
|
+
|
|
437
|
+
Returns:
|
|
438
|
+
str: The uppercase version of the input string.
|
|
439
|
+
"""
|
|
440
|
+
return text.upper()
|
|
441
|
+
|
|
442
|
+
@staticmethod
|
|
443
|
+
async def _staticAsyncMethodProtected(text: str) -> str:
|
|
444
|
+
"""
|
|
445
|
+
Asynchronously converts the input text to uppercase (protected static method).
|
|
446
|
+
|
|
447
|
+
Args:
|
|
448
|
+
text (str): The input string.
|
|
449
|
+
|
|
450
|
+
Returns:
|
|
451
|
+
str: The uppercase version of the input string.
|
|
452
|
+
"""
|
|
453
|
+
await asyncio.sleep(0.1)
|
|
454
|
+
return text.upper()
|
|
455
|
+
|
|
456
|
+
@staticmethod
|
|
457
|
+
def __staticMethodPrivate(text: str) -> str:
|
|
458
|
+
"""
|
|
459
|
+
Synchronously converts the input text to uppercase (private static method).
|
|
460
|
+
|
|
461
|
+
Args:
|
|
462
|
+
text (str): The input string.
|
|
463
|
+
|
|
464
|
+
Returns:
|
|
465
|
+
str: The uppercase version of the input string.
|
|
466
|
+
"""
|
|
467
|
+
return text.upper()
|
|
468
|
+
|
|
469
|
+
@staticmethod
|
|
470
|
+
async def __staticAsyncMethodPrivate(text: str) -> str:
|
|
471
|
+
"""
|
|
472
|
+
Asynchronously converts the input text to uppercase (private static method).
|
|
473
|
+
|
|
474
|
+
Args:
|
|
475
|
+
text (str): The input string.
|
|
476
|
+
|
|
477
|
+
Returns:
|
|
478
|
+
str: The uppercase version of the input string.
|
|
479
|
+
"""
|
|
480
|
+
await asyncio.sleep(0.1)
|
|
481
|
+
return text.upper()
|
|
482
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
|
|
3
|
+
class ICar(ABC):
|
|
4
|
+
"""
|
|
5
|
+
ICar is an interface that defines the structure for car objects.
|
|
6
|
+
It includes methods for starting and stopping the car.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
@abstractmethod
|
|
10
|
+
def start(self) -> str:
|
|
11
|
+
"""
|
|
12
|
+
Starts the car and returns a message indicating the car has started.
|
|
13
|
+
"""
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
@abstractmethod
|
|
17
|
+
def stop(self) -> str:
|
|
18
|
+
"""
|
|
19
|
+
Stops the car and returns a message indicating the car has stopped.
|
|
20
|
+
"""
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
class Car(ICar):
|
|
24
|
+
def __init__(self, brand: str = 'a', model: str = 'b'):
|
|
25
|
+
self.brand = brand
|
|
26
|
+
self.model = model
|
|
27
|
+
|
|
28
|
+
def start(self):
|
|
29
|
+
return f"{self.brand} {self.model} is starting."
|
|
30
|
+
|
|
31
|
+
def stop(self):
|
|
32
|
+
return f"{self.brand} {self.model} is stopping."
|
|
File without changes
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import inspect
|
|
2
|
+
from orionis.container.contracts.service_provider import IServiceProvider
|
|
3
|
+
from orionis.container.providers.service_provider import ServiceProvider
|
|
4
|
+
from orionis.test.cases.asynchronous import AsyncTestCase
|
|
5
|
+
|
|
6
|
+
class TestServiceProviderMethods(AsyncTestCase):
|
|
7
|
+
|
|
8
|
+
async def testMethodsExist(self):
|
|
9
|
+
"""
|
|
10
|
+
Checks that the ServiceProvider class implements the required methods and constructor.
|
|
11
|
+
|
|
12
|
+
This test verifies the following:
|
|
13
|
+
- The existence of the '__init__', 'register', and 'boot' methods in ServiceProvider.
|
|
14
|
+
- That 'register' and 'boot' are asynchronous methods.
|
|
15
|
+
- That ServiceProvider inherits from IServiceProvider.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
None. The method uses assertions to validate class structure and method types.
|
|
19
|
+
"""
|
|
20
|
+
# List of required methods and their associated class
|
|
21
|
+
expected_methods = [
|
|
22
|
+
("__init__", ServiceProvider),
|
|
23
|
+
("register", ServiceProvider),
|
|
24
|
+
("boot", ServiceProvider),
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
# Check that each required method exists in ServiceProvider
|
|
28
|
+
for method_name, cls in expected_methods:
|
|
29
|
+
self.assertTrue(
|
|
30
|
+
hasattr(cls, method_name),
|
|
31
|
+
f"Method '{method_name}' does not exist in {cls.__name__}."
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# Ensure 'register' and 'boot' are asynchronous methods
|
|
35
|
+
self.assertTrue(
|
|
36
|
+
inspect.iscoroutinefunction(ServiceProvider.register),
|
|
37
|
+
"register must be async"
|
|
38
|
+
)
|
|
39
|
+
self.assertTrue(
|
|
40
|
+
inspect.iscoroutinefunction(ServiceProvider.boot),
|
|
41
|
+
"boot must be async"
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# Ensure ServiceProvider inherits from IServiceProvider
|
|
45
|
+
self.assertTrue(
|
|
46
|
+
issubclass(ServiceProvider, IServiceProvider),
|
|
47
|
+
"ServiceProvider must inherit from IServiceProvider"
|
|
48
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import inspect
|
|
2
|
+
from orionis.container.contracts.resolver import IResolver
|
|
3
|
+
from orionis.container.resolver.resolver import Resolver
|
|
4
|
+
from orionis.test.cases.asynchronous import AsyncTestCase
|
|
5
|
+
|
|
6
|
+
class TestResolverMethods(AsyncTestCase):
|
|
7
|
+
|
|
8
|
+
async def testMethodsExist(self):
|
|
9
|
+
"""
|
|
10
|
+
Checks that the `Resolver` class implements all required methods and inherits from `IResolver`.
|
|
11
|
+
|
|
12
|
+
This test verifies the presence of specific methods in the `Resolver` class, ensures that
|
|
13
|
+
`Resolver` is a subclass of `IResolver`, and confirms that the main public methods are not asynchronous.
|
|
14
|
+
|
|
15
|
+
Returns
|
|
16
|
+
-------
|
|
17
|
+
None
|
|
18
|
+
This method does not return a value. Assertions are used to validate class structure.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
# List of required method names that must be implemented by Resolver
|
|
22
|
+
required_methods = [
|
|
23
|
+
"__init__",
|
|
24
|
+
"resolve",
|
|
25
|
+
"resolveType",
|
|
26
|
+
"resolveSignature",
|
|
27
|
+
"_Resolver__resolveTransient",
|
|
28
|
+
"_Resolver__resolveSingleton",
|
|
29
|
+
"_Resolver__resolveScoped",
|
|
30
|
+
"_Resolver__instantiateConcreteWithArgs",
|
|
31
|
+
"_Resolver__instantiateCallableWithArgs",
|
|
32
|
+
"_Resolver__instantiateConcreteReflective",
|
|
33
|
+
"_Resolver__instantiateCallableReflective",
|
|
34
|
+
"_Resolver__resolveDependencies",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
# Assert that each required method exists in Resolver
|
|
38
|
+
for method in required_methods:
|
|
39
|
+
self.assertTrue(
|
|
40
|
+
hasattr(Resolver, method),
|
|
41
|
+
f"Resolver must implement the method '{method}'"
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# Assert that Resolver inherits from IResolver
|
|
45
|
+
self.assertTrue(
|
|
46
|
+
issubclass(Resolver, IResolver),
|
|
47
|
+
"Resolver must inherit from IResolver"
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
# Assert that main public methods are not asynchronous
|
|
51
|
+
for method in ["resolve", "resolveType", "resolveSignature"]:
|
|
52
|
+
self.assertFalse(
|
|
53
|
+
inspect.iscoroutinefunction(getattr(Resolver, method)),
|
|
54
|
+
f"The method '{method}' must not be async"
|
|
55
|
+
)
|