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.
Files changed (175) hide show
  1. orionis/console/base/command.py +57 -50
  2. orionis/console/base/contracts/command.py +68 -0
  3. orionis/console/dynamic/contracts/progress_bar.py +3 -3
  4. orionis/console/dynamic/progress_bar.py +8 -8
  5. orionis/console/output/console.py +8 -2
  6. orionis/console/output/contracts/console.py +1 -1
  7. orionis/container/container.py +2 -2
  8. orionis/container/context/scope.py +4 -1
  9. orionis/container/contracts/service_provider.py +2 -2
  10. orionis/container/entities/binding.py +31 -44
  11. orionis/container/enums/lifetimes.py +22 -1
  12. orionis/container/facades/facade.py +1 -2
  13. orionis/container/providers/service_provider.py +2 -2
  14. orionis/foundation/application.py +542 -248
  15. orionis/foundation/config/app/entities/app.py +107 -90
  16. orionis/foundation/config/auth/entities/auth.py +4 -33
  17. orionis/foundation/config/cache/entities/cache.py +18 -41
  18. orionis/foundation/config/cache/entities/file.py +8 -35
  19. orionis/foundation/config/cache/entities/stores.py +17 -38
  20. orionis/foundation/config/cors/entities/cors.py +41 -54
  21. orionis/foundation/config/database/entities/connections.py +40 -56
  22. orionis/foundation/config/database/entities/database.py +11 -38
  23. orionis/foundation/config/database/entities/mysql.py +48 -76
  24. orionis/foundation/config/database/entities/oracle.py +30 -57
  25. orionis/foundation/config/database/entities/pgsql.py +45 -61
  26. orionis/foundation/config/database/entities/sqlite.py +26 -53
  27. orionis/foundation/config/filesystems/entitites/aws.py +28 -49
  28. orionis/foundation/config/filesystems/entitites/disks.py +27 -47
  29. orionis/foundation/config/filesystems/entitites/filesystems.py +15 -37
  30. orionis/foundation/config/filesystems/entitites/local.py +9 -35
  31. orionis/foundation/config/filesystems/entitites/public.py +14 -41
  32. orionis/foundation/config/logging/entities/channels.py +56 -86
  33. orionis/foundation/config/logging/entities/chunked.py +9 -9
  34. orionis/foundation/config/logging/entities/daily.py +8 -8
  35. orionis/foundation/config/logging/entities/hourly.py +6 -6
  36. orionis/foundation/config/logging/entities/logging.py +12 -18
  37. orionis/foundation/config/logging/entities/monthly.py +7 -7
  38. orionis/foundation/config/logging/entities/stack.py +5 -5
  39. orionis/foundation/config/logging/entities/weekly.py +6 -6
  40. orionis/foundation/config/mail/entities/file.py +9 -36
  41. orionis/foundation/config/mail/entities/mail.py +22 -40
  42. orionis/foundation/config/mail/entities/mailers.py +29 -44
  43. orionis/foundation/config/mail/entities/smtp.py +47 -48
  44. orionis/foundation/config/queue/entities/brokers.py +19 -41
  45. orionis/foundation/config/queue/entities/database.py +24 -46
  46. orionis/foundation/config/queue/entities/queue.py +28 -40
  47. orionis/foundation/config/roots/paths.py +272 -468
  48. orionis/foundation/config/session/entities/session.py +23 -53
  49. orionis/foundation/config/startup.py +165 -135
  50. orionis/foundation/config/testing/entities/testing.py +137 -122
  51. orionis/foundation/config/testing/enums/__init__.py +6 -2
  52. orionis/foundation/config/testing/enums/drivers.py +16 -0
  53. orionis/foundation/config/testing/enums/verbosity.py +18 -0
  54. orionis/foundation/contracts/application.py +152 -362
  55. orionis/foundation/providers/console_provider.py +24 -2
  56. orionis/foundation/providers/dumper_provider.py +24 -2
  57. orionis/foundation/providers/logger_provider.py +24 -2
  58. orionis/foundation/providers/path_resolver_provider.py +25 -2
  59. orionis/foundation/providers/progress_bar_provider.py +24 -2
  60. orionis/foundation/providers/testing_provider.py +39 -0
  61. orionis/foundation/providers/workers_provider.py +24 -2
  62. orionis/metadata/framework.py +1 -1
  63. orionis/services/asynchrony/contracts/coroutines.py +13 -5
  64. orionis/services/asynchrony/coroutines.py +33 -29
  65. orionis/services/asynchrony/exceptions/exception.py +9 -1
  66. orionis/services/environment/core/dot_env.py +46 -34
  67. orionis/services/environment/enums/__init__.py +0 -0
  68. orionis/services/environment/enums/cast_type.py +42 -0
  69. orionis/services/environment/helpers/functions.py +1 -2
  70. orionis/services/environment/key/__init__.py +0 -0
  71. orionis/services/environment/key/key_generator.py +37 -0
  72. orionis/services/environment/serializer/__init__.py +0 -0
  73. orionis/services/environment/serializer/values.py +21 -0
  74. orionis/services/environment/validators/__init__.py +0 -0
  75. orionis/services/environment/validators/key_name.py +46 -0
  76. orionis/services/environment/validators/types.py +45 -0
  77. orionis/services/system/contracts/imports.py +38 -18
  78. orionis/services/system/contracts/workers.py +29 -12
  79. orionis/services/system/imports.py +65 -25
  80. orionis/services/system/runtime/imports.py +18 -9
  81. orionis/services/system/workers.py +49 -16
  82. orionis/support/entities/__init__.py +0 -0
  83. orionis/support/entities/base.py +104 -0
  84. orionis/support/facades/testing.py +15 -0
  85. orionis/support/facades/workers.py +1 -1
  86. orionis/test/cases/asynchronous.py +0 -11
  87. orionis/test/cases/synchronous.py +0 -9
  88. orionis/test/contracts/dumper.py +11 -4
  89. orionis/test/contracts/kernel.py +5 -110
  90. orionis/test/contracts/logs.py +27 -65
  91. orionis/test/contracts/printer.py +16 -128
  92. orionis/test/contracts/test_result.py +100 -0
  93. orionis/test/contracts/unit_test.py +87 -150
  94. orionis/test/core/unit_test.py +608 -554
  95. orionis/test/entities/result.py +22 -2
  96. orionis/test/enums/__init__.py +0 -2
  97. orionis/test/enums/status.py +14 -9
  98. orionis/test/exceptions/config.py +9 -1
  99. orionis/test/exceptions/failure.py +34 -11
  100. orionis/test/exceptions/persistence.py +10 -2
  101. orionis/test/exceptions/runtime.py +9 -1
  102. orionis/test/exceptions/value.py +13 -1
  103. orionis/test/kernel.py +87 -289
  104. orionis/test/output/dumper.py +83 -18
  105. orionis/test/output/printer.py +399 -156
  106. orionis/test/records/logs.py +203 -82
  107. orionis/test/validators/__init__.py +33 -0
  108. orionis/test/validators/base_path.py +45 -0
  109. orionis/test/validators/execution_mode.py +45 -0
  110. orionis/test/validators/fail_fast.py +37 -0
  111. orionis/test/validators/folder_path.py +34 -0
  112. orionis/test/validators/module_name.py +31 -0
  113. orionis/test/validators/name_pattern.py +40 -0
  114. orionis/test/validators/pattern.py +36 -0
  115. orionis/test/validators/persistent.py +42 -0
  116. orionis/test/validators/persistent_driver.py +43 -0
  117. orionis/test/validators/print_result.py +37 -0
  118. orionis/test/validators/tags.py +37 -0
  119. orionis/test/validators/throw_exception.py +39 -0
  120. orionis/test/validators/verbosity.py +37 -0
  121. orionis/test/validators/web_report.py +35 -0
  122. orionis/test/validators/workers.py +31 -0
  123. orionis/test/view/render.py +48 -54
  124. {orionis-0.405.0.dist-info → orionis-0.407.0.dist-info}/METADATA +1 -1
  125. {orionis-0.405.0.dist-info → orionis-0.407.0.dist-info}/RECORD +170 -112
  126. tests/container/__init__.py +0 -0
  127. tests/container/context/__init__.py +0 -0
  128. tests/container/context/test_manager.py +27 -0
  129. tests/container/context/test_scope.py +23 -0
  130. tests/container/entities/__init__.py +0 -0
  131. tests/container/entities/test_binding.py +133 -0
  132. tests/container/enums/__init__.py +0 -0
  133. tests/container/enums/test_lifetimes.py +63 -0
  134. tests/container/facades/__init__.py +0 -0
  135. tests/container/facades/test_facade.py +61 -0
  136. tests/container/mocks/__init__.py +0 -0
  137. tests/container/mocks/mock_complex_classes.py +482 -0
  138. tests/container/mocks/mock_simple_classes.py +32 -0
  139. tests/container/providers/__init__.py +0 -0
  140. tests/container/providers/test_providers.py +48 -0
  141. tests/container/resolver/__init__.py +0 -0
  142. tests/container/resolver/test_resolver.py +55 -0
  143. tests/container/test_container.py +254 -0
  144. tests/container/test_singleton.py +98 -0
  145. tests/container/test_thread_safety.py +217 -0
  146. tests/container/validators/__init__.py +0 -0
  147. tests/container/validators/test_implements.py +140 -0
  148. tests/container/validators/test_is_abstract_class.py +99 -0
  149. tests/container/validators/test_is_callable.py +73 -0
  150. tests/container/validators/test_is_concrete_class.py +97 -0
  151. tests/container/validators/test_is_instance.py +105 -0
  152. tests/container/validators/test_is_not_subclass.py +117 -0
  153. tests/container/validators/test_is_subclass.py +115 -0
  154. tests/container/validators/test_is_valid_alias.py +113 -0
  155. tests/container/validators/test_lifetime.py +75 -0
  156. tests/example/test_example.py +2 -2
  157. tests/foundation/config/testing/test_foundation_config_testing.py +1 -1
  158. tests/metadata/test_metadata_framework.py +89 -24
  159. tests/metadata/test_metadata_package.py +55 -10
  160. tests/services/asynchrony/test_services_asynchrony_coroutine.py +52 -7
  161. tests/services/system/test_services_system_imports.py +119 -16
  162. tests/services/system/test_services_system_workers.py +71 -30
  163. tests/testing/test_testing_result.py +117 -117
  164. tests/testing/test_testing_unit.py +209 -209
  165. orionis/foundation/config/base.py +0 -112
  166. orionis/test/arguments/parser.py +0 -187
  167. orionis/test/contracts/parser.py +0 -43
  168. orionis/test/entities/arguments.py +0 -38
  169. orionis/test/enums/execution_mode.py +0 -16
  170. /orionis/{test/arguments → console/base/contracts}/__init__.py +0 -0
  171. /orionis/foundation/config/testing/enums/{test_mode.py → mode.py} +0 -0
  172. {orionis-0.405.0.dist-info → orionis-0.407.0.dist-info}/WHEEL +0 -0
  173. {orionis-0.405.0.dist-info → orionis-0.407.0.dist-info}/licenses/LICENCE +0 -0
  174. {orionis-0.405.0.dist-info → orionis-0.407.0.dist-info}/top_level.txt +0 -0
  175. {orionis-0.405.0.dist-info → orionis-0.407.0.dist-info}/zip-safe +0 -0
@@ -4,21 +4,10 @@ import psutil
4
4
  from orionis.services.system.contracts.workers import IWorkers
5
5
 
6
6
  class Workers(IWorkers):
7
- """
8
- Estimate the optimal number of worker processes based on system CPU and memory resources.
9
-
10
- This class calculates the recommended number of Uvicorn (or similar) workers by considering:
11
- the number of available CPU cores, total system memory (RAM), and the estimated memory usage per worker.
12
-
13
- Parameters
14
- ----------
15
- ram_per_worker : float, optional
16
- Estimated amount of RAM in gigabytes (GB) that each worker will consume. Default is 0.5.
17
- """
18
7
 
19
8
  def __init__(self, ram_per_worker: float = 0.5):
20
9
  """
21
- Initialize the worker system with resource constraints.
10
+ Initialize the Workers system with resource constraints.
22
11
 
23
12
  Parameters
24
13
  ----------
@@ -33,31 +22,75 @@ class Workers(IWorkers):
33
22
  Total system RAM in gigabytes.
34
23
  _ram_per_worker : float
35
24
  RAM allocated per worker in gigabytes.
25
+
26
+ Returns
27
+ -------
28
+ None
29
+ This constructor does not return a value.
36
30
  """
31
+
32
+ # Get the number of CPU cores available
37
33
  self._cpu_count = multiprocessing.cpu_count()
34
+
35
+ # Get the total system RAM in gigabytes
38
36
  self._ram_total_gb = psutil.virtual_memory().total / (1024 ** 3)
37
+
38
+ # Set the RAM allocated per worker
39
39
  self._ram_per_worker = ram_per_worker
40
40
 
41
41
  def setRamPerWorker(self, ram_per_worker: float) -> None:
42
42
  """
43
- Set the amount of RAM allocated per worker.
43
+ Update the RAM allocation per worker.
44
44
 
45
45
  Parameters
46
46
  ----------
47
47
  ram_per_worker : float
48
- Amount of RAM (in GB) allocated per worker.
48
+ The new amount of RAM (in GB) to allocate for each worker.
49
+
50
+ Returns
51
+ -------
52
+ None
53
+ This method does not return a value. It updates the internal RAM allocation setting.
54
+
55
+ Notes
56
+ -----
57
+ Changing the RAM allocation per worker may affect the recommended number of workers
58
+ calculated by the system. This method only updates the internal configuration and does
59
+ not trigger any recalculation automatically.
49
60
  """
61
+
62
+ # Update the RAM allocated per worker
50
63
  self._ram_per_worker = ram_per_worker
51
64
 
52
65
  def calculate(self) -> int:
53
66
  """
54
- Compute the maximum number of workers supported by the current machine.
67
+ Compute the recommended maximum number of worker processes for the current machine,
68
+ considering both CPU and memory constraints.
69
+
70
+ Parameters
71
+ ----------
72
+ None
55
73
 
56
74
  Returns
57
75
  -------
58
76
  int
59
- The recommended number of worker processes based on CPU and memory constraints.
77
+ The maximum number of worker processes that can be safely run in parallel,
78
+ determined by the lesser of available CPU cores and memory capacity.
79
+
80
+ Notes
81
+ -----
82
+ The calculation is based on:
83
+ - The total number of CPU cores available.
84
+ - The total system RAM divided by the RAM allocated per worker.
85
+ The method ensures that neither CPU nor memory resources are overcommitted.
86
+
60
87
  """
88
+
89
+ # Calculate the maximum workers allowed by CPU core count
61
90
  max_workers_by_cpu = self._cpu_count
91
+
92
+ # Calculate the maximum workers allowed by available RAM
62
93
  max_workers_by_ram = math.floor(self._ram_total_gb / self._ram_per_worker)
94
+
95
+ # Return the minimum of the two to avoid overcommitting resources
63
96
  return min(max_workers_by_cpu, max_workers_by_ram)
File without changes
@@ -0,0 +1,104 @@
1
+ from dataclasses import asdict, fields, is_dataclass, MISSING
2
+ from enum import Enum
3
+
4
+ class BaseEntity:
5
+
6
+ def toDict(self) -> dict:
7
+ """
8
+ Converts the current instance into a dictionary representation.
9
+
10
+ Returns
11
+ -------
12
+ dict
13
+ Dictionary representation of the current instance.
14
+ """
15
+ return asdict(self)
16
+
17
+ def getFields(self):
18
+ """
19
+ Retrieves a list of field information for the current dataclass instance.
20
+
21
+ Returns
22
+ -------
23
+ list
24
+ A list of dictionaries, each containing details about a field:
25
+ - name (str): The name of the field.
26
+ - type (type): The type of the field.
27
+ - default: The default value of the field, if specified; otherwise, the value from metadata or None.
28
+ - metadata (mapping): The metadata associated with the field.
29
+ """
30
+ # Dictionary to hold field information
31
+ __fields = []
32
+
33
+ # Iterate over the fields of the dataclass and extract relevant information
34
+ for field in fields(self):
35
+
36
+ # Get the field name
37
+ __name = field.name
38
+
39
+ # Get the field type with better handling for complex types
40
+ __type = getattr(field.type, '__name__', None)
41
+
42
+ # If the type is None, handle it
43
+ if __type is None:
44
+
45
+ # Handle Union types or other complex types
46
+ type_lst = []
47
+ type_str = str(field.type).split('|')
48
+ for itype in type_str:
49
+ type_lst.append(itype.strip())
50
+ __type = type_lst
51
+
52
+ # Ensure __type is a list for consistency
53
+ __type = type_lst if isinstance(__type, list) else [__type]
54
+
55
+ # Extract metadata, default value, and type
56
+ metadata = dict(field.metadata) if field.metadata else {}
57
+
58
+ # If metadata contains a default value, normalize it
59
+ if 'default' in metadata:
60
+ metadata_default = metadata['default']
61
+ if callable(metadata_default):
62
+ metadata_default = metadata_default()
63
+ if is_dataclass(metadata_default):
64
+ metadata_default = asdict(metadata_default)
65
+ elif isinstance(metadata_default, Enum):
66
+ metadata_default = metadata_default.value
67
+ metadata['default'] = metadata_default
68
+
69
+ # Add the field information to the list
70
+ __metadata = metadata
71
+
72
+ # Extract the default value, if specified
73
+ __default = None
74
+
75
+ # Field has a direct default value
76
+ if field.default is not MISSING:
77
+ __default = field.default() if callable(field.default) else field.default
78
+ if is_dataclass(__default):
79
+ __default = asdict(__default)
80
+ elif isinstance(__default, Enum):
81
+ __default = __default.value
82
+
83
+ # Field has a default factory (like list, dict, etc.)
84
+ elif field.default_factory is not MISSING:
85
+ __default = field.default_factory() if callable(field.default_factory) else field.default_factory
86
+ if is_dataclass(__default):
87
+ __default = asdict(__default)
88
+ elif isinstance(__default, Enum):
89
+ __default = __default.value
90
+
91
+ # No default found, check metadata for custom default
92
+ else:
93
+ __default = __metadata.get('default', None)
94
+
95
+ # Append the field information to the list
96
+ __fields.append({
97
+ "name": __name,
98
+ "types": __type,
99
+ "default": __default,
100
+ "metadata": __metadata
101
+ })
102
+
103
+ # Return the list of field information
104
+ return __fields
@@ -0,0 +1,15 @@
1
+ from orionis.container.facades.facade import Facade
2
+
3
+ class Test(Facade):
4
+
5
+ @classmethod
6
+ def getFacadeAccessor(cls) -> str:
7
+ """
8
+ Get the service container binding key for the dumper component.
9
+
10
+ Returns
11
+ -------
12
+ str
13
+ The service container binding key.
14
+ """
15
+ return "core.orionis.testing"
@@ -1,6 +1,6 @@
1
1
  from orionis.container.facades.facade import Facade
2
2
 
3
- class ProgressBar(Facade):
3
+ class Workers(Facade):
4
4
 
5
5
  @classmethod
6
6
  def getFacadeAccessor(cls):
@@ -30,17 +30,6 @@ class AsyncTestCase(unittest.IsolatedAsyncioTestCase, TestDumper):
30
30
  Hook method for subclass-specific async setup logic.
31
31
  onAsyncTeardown()
32
32
  Hook method for subclass-specific async teardown logic.
33
-
34
- Examples
35
- --------
36
- >>> class MyAsyncTest(AsyncTestCase):
37
- ... async def onAsyncSetup(self):
38
- ... self.client = AsyncHttpClient()
39
- ... await self.client.connect()
40
- ...
41
- ... async def testAsyncOperation(self):
42
- ... result = await self.client.get('/api/data')
43
- ... self.assertEqual(result.status, 200)
44
33
  """
45
34
 
46
35
  async def asyncSetUp(self):
@@ -27,15 +27,6 @@ class SyncTestCase(unittest.TestCase, TestDumper):
27
27
  Hook method for subclass-specific setup logic.
28
28
  onTeardown()
29
29
  Hook method for subclass-specific teardown logic.
30
-
31
- Examples
32
- --------
33
- >>> class MyTest(SyncTestCase):
34
- ... def onSetup(self):
35
- ... self.data = [1, 2, 3]
36
- ...
37
- ... def testExample(self):
38
- ... self.assertEqual(len(self.data), 3)
39
30
  """
40
31
 
41
32
  def setUp(self):
@@ -17,15 +17,22 @@ class ITestDumper(ABC):
17
17
  @abstractmethod
18
18
  def dd(self, *args) -> None:
19
19
  """
20
- Dumps debugging information using the Debug class.
20
+ Outputs debugging information using the Debug class.
21
21
 
22
- This method captures the caller's file and line number,
23
- and uses the Debug class to output debugging information.
22
+ This method captures the caller's file and line number, then
23
+ utilizes the Debug class to display or log the provided arguments
24
+ for debugging purposes.
24
25
 
25
26
  Parameters
26
27
  ----------
27
28
  *args : tuple
28
- Variable length argument list to be dumped.
29
+ Variable length argument list containing the data to be dumped.
30
+
31
+ Returns
32
+ -------
33
+ None
34
+ This method does not return any value. Its purpose is to output
35
+ or log the debugging information.
29
36
  """
30
37
  pass
31
38
 
@@ -1,7 +1,5 @@
1
1
  from abc import ABC, abstractmethod
2
- from typing import Any
3
- from orionis.foundation.config.testing.entities.testing import Testing as Configuration
4
- from orionis.test.core.unit_test import UnitTest
2
+ from orionis.test.contracts.unit_test import IUnitTest
5
3
 
6
4
  class ITestKernel(ABC):
7
5
  """
@@ -19,116 +17,13 @@ class ITestKernel(ABC):
19
17
  """
20
18
 
21
19
  @abstractmethod
22
- def handle(
23
- self,
24
- config: Configuration = None,
25
- **kwargs: Any
26
- ) -> UnitTest:
20
+ def handle(self) -> IUnitTest:
27
21
  """
28
- Execute the complete test discovery and execution pipeline.
29
-
30
- This is the main entry point for running tests. Implementations must:
31
- 1. Validate the provided configuration
32
- 2. Discover test files based on configuration
33
- 3. Configure and execute the test suite
34
- 4. Return the test results
35
-
36
- Parameters
37
- ----------
38
- config : Configuration, optional
39
- A pre-configured Testing configuration instance. If None,
40
- implementations should create one from kwargs.
41
- **kwargs : Any
42
- Keyword arguments to create a Configuration instance if config is None.
43
- Common parameters include:
44
- - base_path : str, base directory for test discovery
45
- - folder_path : str or list, specific folders to search
46
- - pattern : str, file pattern for test discovery
47
- - verbosity : int, output verbosity level
48
- - execution_mode : str, test execution mode
49
- - max_workers : int, maximum number of worker threads
50
- - fail_fast : bool, stop on first failure
51
-
52
- Returns
53
- -------
54
- UnitTest
55
- The configured and executed test suite instance containing all results.
56
-
57
- Raises
58
- ------
59
- OrionisTestConfigException
60
- If the configuration validation fails.
61
- """
62
- pass
63
-
64
- @abstractmethod
65
- def handleCLI(
66
- self,
67
- sys_argv: list[str]
68
- ) -> UnitTest:
69
- """
70
- Process command line arguments for test execution.
71
-
72
- This method configures and runs tests based on command line arguments. It parses
73
- the provided sys_argv list into a TestArguments object, extracts configuration
74
- values, executes the tests, and handles output generation.
75
-
76
- Parameters
77
- ----------
78
- sys_argv : list[str]
79
- Command line arguments list including script name. The script name
80
- (first element) will be automatically removed before parsing.
22
+ Configure and execute the unit tests based on the current configuration.
81
23
 
82
24
  Returns
83
25
  -------
84
- UnitTest
85
- The test suite instance containing all test results.
86
-
87
- Raises
88
- ------
89
- OrionisTestConfigException
90
- If the provided sys_argv is not a valid list or if argument parsing fails.
91
-
92
- Notes
93
- -----
94
- The method supports various test execution options including parallel/sequential
95
- execution mode, fail fast behavior, result output configuration, and web reporting.
26
+ IUnitTest
27
+ The configured and executed unit test instance.
96
28
  """
97
29
  pass
98
-
99
- @abstractmethod
100
- def exit(
101
- self,
102
- code: int = 0
103
- ) -> None:
104
- """
105
- Terminate the test execution process and free associated resources.
106
-
107
- This method performs a clean shutdown of the test kernel by explicitly
108
- triggering garbage collection to release memory resources and then
109
- terminating the process with the provided exit code. It ensures that any
110
- remaining file handles, threads, or other resources are properly released.
111
-
112
- Parameters
113
- ----------
114
- code : int
115
- The exit code to return to the operating system. Should be 0 for
116
- successful execution or a non-zero value to indicate an error.
117
-
118
- Returns
119
- -------
120
- None
121
- This method does not return as it terminates the process.
122
-
123
- Raises
124
- ------
125
- ValueError
126
- If the provided code is not a valid integer or outside the allowed range.
127
-
128
- Notes
129
- -----
130
- Using os._exit() bypasses normal Python cleanup mechanisms and
131
- immediately terminates the process. This can be necessary when
132
- normal sys.exit() would be caught by exception handlers.
133
- """
134
- pass
@@ -3,79 +3,56 @@ from typing import Dict, List, Optional, Tuple
3
3
 
4
4
  class ITestLogs(ABC):
5
5
  """
6
- Abstract base class for test logging and report persistence.
7
-
8
- This interface defines the contract for managing test reports in a persistent
9
- storage system. Implementations should provide functionality to create, retrieve,
10
- and reset test report data while maintaining proper data validation and error
11
- handling.
12
-
13
- The interface supports chronological retrieval of reports and provides methods
14
- for database management operations.
15
-
16
- Methods
17
- -------
18
- create(report)
19
- Create and store a new test report in the persistence layer.
20
- reset()
21
- Reset the storage by clearing all existing test reports.
22
- get(first, last)
23
- Retrieve test reports with optional chronological filtering.
6
+ Interface for test logs persistence using a relational database.
24
7
  """
25
8
 
26
9
  @abstractmethod
27
10
  def create(self, report: Dict) -> bool:
28
11
  """
29
- Create a new test report in the history database.
30
-
31
- This method persists a test report containing execution results and
32
- metadata to the underlying storage system. The report should include
33
- all necessary fields for proper tracking and analysis.
12
+ Store a new test report in the database.
34
13
 
35
14
  Parameters
36
15
  ----------
37
16
  report : Dict
38
- A dictionary containing the test report data. Must include fields
39
- such as total_tests, passed, failed, errors, skipped, total_time,
40
- success_rate, and timestamp.
17
+ Must include the following keys:
18
+ - json (str): JSON-serialized report.
19
+ - total_tests (int)
20
+ - passed (int)
21
+ - failed (int)
22
+ - errors (int)
23
+ - skipped (int)
24
+ - total_time (float)
25
+ - success_rate (float)
26
+ - timestamp (str)
41
27
 
42
28
  Returns
43
29
  -------
44
30
  bool
45
- True if the report was successfully created and stored, False otherwise.
31
+ True if the report was stored successfully.
46
32
 
47
33
  Raises
48
34
  ------
49
35
  OrionisTestValueError
50
- If the report structure is invalid or missing required fields.
36
+ If required fields are missing or invalid.
51
37
  OrionisTestPersistenceError
52
- If there is an error during the storage operation.
38
+ If a database error occurs.
53
39
  """
54
40
  pass
55
41
 
56
42
  @abstractmethod
57
43
  def reset(self) -> bool:
58
44
  """
59
- Reset the history database by dropping the existing table.
60
-
61
- This method clears all stored test reports and resets the storage
62
- system to its initial state. Use with caution as this operation
63
- is irreversible and will result in permanent data loss.
45
+ Drop the reports table, removing all test history.
64
46
 
65
47
  Returns
66
48
  -------
67
49
  bool
68
- True if the database was successfully reset, False otherwise.
50
+ True if the table was dropped or did not exist.
69
51
 
70
52
  Raises
71
53
  ------
72
54
  OrionisTestPersistenceError
73
- If there is an error during the reset operation.
74
-
75
- Notes
76
- -----
77
- This operation is destructive and cannot be undone. Ensure that
78
- any important historical data is backed up before calling this method.
55
+ If a database error occurs.
79
56
  """
80
57
  pass
81
58
 
@@ -86,40 +63,25 @@ class ITestLogs(ABC):
86
63
  last: Optional[int] = None
87
64
  ) -> List[Tuple]:
88
65
  """
89
- Retrieve test reports from the history database.
90
-
91
- This method allows for chronological retrieval of test reports with
92
- optional filtering. You can retrieve either the earliest or most recent
93
- reports, but not both in a single call.
66
+ Retrieve test reports from the database.
94
67
 
95
68
  Parameters
96
69
  ----------
97
- first : Optional[int], default=None
98
- The number of earliest reports to retrieve, ordered ascending by ID.
99
- Must be a positive integer if specified.
100
- last : Optional[int], default=None
101
- The number of latest reports to retrieve, ordered descending by ID.
102
- Must be a positive integer if specified.
70
+ first : Optional[int]
71
+ Number of earliest reports (ascending by id).
72
+ last : Optional[int]
73
+ Number of latest reports (descending by id).
103
74
 
104
75
  Returns
105
76
  -------
106
77
  List[Tuple]
107
- A list of tuples representing the retrieved reports. Each tuple
108
- contains the report data in the order: (id, json, total_tests,
109
- passed, failed, errors, skipped, total_time, success_rate, timestamp).
78
+ Each tuple: (id, json, total_tests, passed, failed, errors, skipped, total_time, success_rate, timestamp)
110
79
 
111
80
  Raises
112
81
  ------
113
82
  OrionisTestValueError
114
- If both 'first' and 'last' are specified, or if either parameter
115
- is not a positive integer when provided.
83
+ If both 'first' and 'last' are specified, or if either is not a positive integer.
116
84
  OrionisTestPersistenceError
117
- If there is an error retrieving reports from the storage system.
118
-
119
- Notes
120
- -----
121
- Only one of 'first' or 'last' parameters can be specified in a single
122
- call. The returned results are ordered chronologically based on the
123
- selected parameter.
85
+ If a database error occurs.
124
86
  """
125
- pass
87
+ pass