orionis 0.11.0__tar.gz → 0.13.0__tar.gz

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 (155) hide show
  1. {orionis-0.11.0/orionis.egg-info → orionis-0.13.0}/PKG-INFO +1 -1
  2. {orionis-0.11.0 → orionis-0.13.0}/orionis/framework.py +1 -1
  3. orionis-0.13.0/orionis/luminate/bootstrap/config/bootstrapper.py +111 -0
  4. {orionis-0.11.0/orionis/luminate/bootstrap → orionis-0.13.0/orionis/luminate/bootstrap/config}/parser.py +6 -2
  5. {orionis-0.11.0/orionis/luminate/bootstrap → orionis-0.13.0/orionis/luminate/bootstrap/config}/register.py +9 -18
  6. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/container/container.py +25 -0
  7. orionis-0.13.0/orionis/luminate/contracts/bootstrap/bootstrapper_interface.py +65 -0
  8. orionis-0.13.0/orionis/luminate/contracts/bootstrap/register_interface.py +47 -0
  9. orionis-0.13.0/orionis/luminate/tools/dot_dict.py +29 -0
  10. {orionis-0.11.0 → orionis-0.13.0/orionis.egg-info}/PKG-INFO +1 -1
  11. {orionis-0.11.0 → orionis-0.13.0}/orionis.egg-info/SOURCES.txt +7 -2
  12. orionis-0.13.0/tests/tools/__init__.py +0 -0
  13. {orionis-0.11.0 → orionis-0.13.0}/LICENCE +0 -0
  14. {orionis-0.11.0 → orionis-0.13.0}/MANIFEST.in +0 -0
  15. {orionis-0.11.0 → orionis-0.13.0}/README.md +0 -0
  16. {orionis-0.11.0 → orionis-0.13.0}/orionis/__init__.py +0 -0
  17. {orionis-0.11.0 → orionis-0.13.0}/orionis/cli_manager.py +0 -0
  18. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/__init__.py +0 -0
  19. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/app.py +0 -0
  20. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/bootstrap/__init__.py +0 -0
  21. {orionis-0.11.0/orionis/luminate/cache → orionis-0.13.0/orionis/luminate/bootstrap/config}/__init__.py +0 -0
  22. {orionis-0.11.0/orionis/luminate/cache/app → orionis-0.13.0/orionis/luminate/cache}/__init__.py +0 -0
  23. {orionis-0.11.0/orionis/luminate/cache/console → orionis-0.13.0/orionis/luminate/cache/app}/__init__.py +0 -0
  24. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/cache/app/config.py +0 -0
  25. {orionis-0.11.0/orionis/luminate/config → orionis-0.13.0/orionis/luminate/cache/console}/__init__.py +0 -0
  26. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/cache/console/commands.py +0 -0
  27. {orionis-0.11.0/orionis/luminate/config/dataclass → orionis-0.13.0/orionis/luminate/config}/__init__.py +0 -0
  28. {orionis-0.11.0/orionis/luminate/console → orionis-0.13.0/orionis/luminate/config/dataclass}/__init__.py +0 -0
  29. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/config/dataclass/app.py +0 -0
  30. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/config/dataclass/auth.py +0 -0
  31. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/config/dataclass/cache.py +0 -0
  32. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/config/dataclass/cors.py +0 -0
  33. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/config/dataclass/database.py +0 -0
  34. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/config/dataclass/filesystems.py +0 -0
  35. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/config/dataclass/logging.py +0 -0
  36. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/config/dataclass/mail.py +0 -0
  37. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/config/dataclass/queue.py +0 -0
  38. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/config/dataclass/session.py +0 -0
  39. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/config/environment.py +0 -0
  40. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/config/sections.py +0 -0
  41. {orionis-0.11.0/orionis/luminate/console/base → orionis-0.13.0/orionis/luminate/console}/__init__.py +0 -0
  42. {orionis-0.11.0/orionis/luminate/console/commands → orionis-0.13.0/orionis/luminate/console/base}/__init__.py +0 -0
  43. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/base/command.py +0 -0
  44. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/cache.py +0 -0
  45. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/command.py +0 -0
  46. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/command_filter.py +0 -0
  47. {orionis-0.11.0/orionis/luminate/console/exceptions → orionis-0.13.0/orionis/luminate/console/commands}/__init__.py +0 -0
  48. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/commands/cache_clear.py +0 -0
  49. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/commands/help.py +0 -0
  50. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/commands/schedule_work.py +0 -0
  51. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/commands/tests.py +0 -0
  52. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/commands/version.py +0 -0
  53. {orionis-0.11.0/orionis/luminate/console/output → orionis-0.13.0/orionis/luminate/console/exceptions}/__init__.py +0 -0
  54. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/exceptions/cli_exception.py +0 -0
  55. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/kernel.py +0 -0
  56. {orionis-0.11.0/orionis/luminate/console/scripts → orionis-0.13.0/orionis/luminate/console/output}/__init__.py +0 -0
  57. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/output/console.py +0 -0
  58. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/output/executor.py +0 -0
  59. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/output/progress_bar.py +0 -0
  60. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/output/styles.py +0 -0
  61. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/parser.py +0 -0
  62. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/register.py +0 -0
  63. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/runner.py +0 -0
  64. {orionis-0.11.0/orionis/luminate/console/tasks → orionis-0.13.0/orionis/luminate/console/scripts}/__init__.py +0 -0
  65. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/scripts/management.py +0 -0
  66. {orionis-0.11.0/orionis/luminate/contracts → orionis-0.13.0/orionis/luminate/console/tasks}/__init__.py +0 -0
  67. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/console/tasks/scheduler.py +0 -0
  68. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/container/exception.py +0 -0
  69. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/container/types.py +0 -0
  70. {orionis-0.11.0/orionis/luminate/contracts/cache → orionis-0.13.0/orionis/luminate/contracts}/__init__.py +0 -0
  71. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/bootstrap/parser_interface.py +0 -0
  72. {orionis-0.11.0/orionis/luminate/contracts/config → orionis-0.13.0/orionis/luminate/contracts/cache}/__init__.py +0 -0
  73. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/cache/cache_commands_interface.py +0 -0
  74. {orionis-0.11.0/orionis/luminate/contracts/console → orionis-0.13.0/orionis/luminate/contracts/config}/__init__.py +0 -0
  75. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/config/config_interface.py +0 -0
  76. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/config/environment_interface.py +0 -0
  77. {orionis-0.11.0/orionis/luminate/contracts/facades → orionis-0.13.0/orionis/luminate/contracts/console}/__init__.py +0 -0
  78. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/base_command_interface.py +0 -0
  79. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/cli_cache_interface.py +0 -0
  80. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/command_filter_interface.py +0 -0
  81. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/command_interface.py +0 -0
  82. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/console_interface.py +0 -0
  83. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/executor_interface.py +0 -0
  84. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/kernel_interface.py +0 -0
  85. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/management_interface.py +0 -0
  86. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/parser_interface.py +0 -0
  87. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/progress_bar_interface.py +0 -0
  88. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/register_interface.py +0 -0
  89. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/runner_interface.py +0 -0
  90. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/schedule_interface.py +0 -0
  91. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/console/task_manager_interface.py +0 -0
  92. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/container/container_interface.py +0 -0
  93. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/container/types_interface.py +0 -0
  94. {orionis-0.11.0/orionis/luminate/contracts/files → orionis-0.13.0/orionis/luminate/contracts/facades}/__init__.py +0 -0
  95. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/facades/env_interface.py +0 -0
  96. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/facades/log_interface.py +0 -0
  97. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/facades/paths_interface.py +0 -0
  98. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/facades/tests_interface.py +0 -0
  99. {orionis-0.11.0/orionis/luminate/contracts/installer → orionis-0.13.0/orionis/luminate/contracts/files}/__init__.py +0 -0
  100. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/files/paths_interface.py +0 -0
  101. {orionis-0.11.0/orionis/luminate/contracts/log → orionis-0.13.0/orionis/luminate/contracts/installer}/__init__.py +0 -0
  102. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/installer/output_interface.py +0 -0
  103. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/installer/setup_interface.py +0 -0
  104. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/installer/upgrade_interface.py +0 -0
  105. {orionis-0.11.0/orionis/luminate/contracts/publisher → orionis-0.13.0/orionis/luminate/contracts/log}/__init__.py +0 -0
  106. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/log/logger_interface.py +0 -0
  107. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/pipelines/cli_pipeline_interface.py +0 -0
  108. {orionis-0.11.0/orionis/luminate/contracts/test → orionis-0.13.0/orionis/luminate/contracts/publisher}/__init__.py +0 -0
  109. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/publisher/pypi_publisher_interface.py +0 -0
  110. {orionis-0.11.0/orionis/luminate/contracts/tools → orionis-0.13.0/orionis/luminate/contracts/test}/__init__.py +0 -0
  111. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/test/unit_test_interface.py +0 -0
  112. {orionis-0.11.0/orionis/luminate/facades → orionis-0.13.0/orionis/luminate/contracts/tools}/__init__.py +0 -0
  113. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/tools/reflection_interface.py +0 -0
  114. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/contracts/tools/std_interface.py +0 -0
  115. {orionis-0.11.0/orionis/luminate/files → orionis-0.13.0/orionis/luminate/facades}/__init__.py +0 -0
  116. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/facades/environment.py +0 -0
  117. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/facades/log.py +0 -0
  118. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/facades/paths.py +0 -0
  119. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/facades/tests.py +0 -0
  120. {orionis-0.11.0/orionis/luminate/installer → orionis-0.13.0/orionis/luminate/files}/__init__.py +0 -0
  121. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/files/paths.py +0 -0
  122. {orionis-0.11.0/orionis/luminate/log → orionis-0.13.0/orionis/luminate/installer}/__init__.py +0 -0
  123. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/installer/icon.ascii +0 -0
  124. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/installer/info.ascii +0 -0
  125. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/installer/output.py +0 -0
  126. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/installer/setup.py +0 -0
  127. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/installer/upgrade.py +0 -0
  128. {orionis-0.11.0/orionis/luminate/pipelines → orionis-0.13.0/orionis/luminate/log}/__init__.py +0 -0
  129. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/log/logger.py +0 -0
  130. {orionis-0.11.0/orionis/luminate/publisher → orionis-0.13.0/orionis/luminate/pipelines}/__init__.py +0 -0
  131. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/pipelines/cli_pipeline.py +0 -0
  132. {orionis-0.11.0/orionis/luminate/test → orionis-0.13.0/orionis/luminate/publisher}/__init__.py +0 -0
  133. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/publisher/pypi.py +0 -0
  134. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/static/bg/galaxy.jpg +0 -0
  135. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/static/favicon/OrionisFrameworkFavicon.png +0 -0
  136. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/static/logos/OrionisFramework.jpg +0 -0
  137. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/static/logos/OrionisFramework.png +0 -0
  138. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/static/logos/OrionisFramework.psd +0 -0
  139. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/static/logos/OrionisFramework2.png +0 -0
  140. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/static/logos/OrionisFramework3.png +0 -0
  141. {orionis-0.11.0/orionis/luminate/tools → orionis-0.13.0/orionis/luminate/test}/__init__.py +0 -0
  142. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/test/exception.py +0 -0
  143. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/test/unit_test.py +0 -0
  144. {orionis-0.11.0/tests → orionis-0.13.0/orionis/luminate/tools}/__init__.py +0 -0
  145. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/tools/reflection.py +0 -0
  146. {orionis-0.11.0 → orionis-0.13.0}/orionis/luminate/tools/std.py +0 -0
  147. {orionis-0.11.0 → orionis-0.13.0}/orionis.egg-info/dependency_links.txt +0 -0
  148. {orionis-0.11.0 → orionis-0.13.0}/orionis.egg-info/entry_points.txt +0 -0
  149. {orionis-0.11.0 → orionis-0.13.0}/orionis.egg-info/requires.txt +0 -0
  150. {orionis-0.11.0 → orionis-0.13.0}/orionis.egg-info/top_level.txt +0 -0
  151. {orionis-0.11.0 → orionis-0.13.0}/setup.cfg +0 -0
  152. {orionis-0.11.0 → orionis-0.13.0}/setup.py +0 -0
  153. {orionis-0.11.0/tests/tools → orionis-0.13.0/tests}/__init__.py +0 -0
  154. {orionis-0.11.0 → orionis-0.13.0}/tests/tools/class_example.py +0 -0
  155. {orionis-0.11.0 → orionis-0.13.0}/tests/tools/test_reflection.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: orionis
3
- Version: 0.11.0
3
+ Version: 0.13.0
4
4
  Summary: Orionis Framework – Elegant, Fast, and Powerful.
5
5
  Home-page: https://github.com/orionis-framework/framework
6
6
  Author: Raul Mauricio Uñate Castro
@@ -5,7 +5,7 @@
5
5
  NAME = "orionis"
6
6
 
7
7
  # Current version of the framework
8
- VERSION = "0.11.0"
8
+ VERSION = "0.13.0"
9
9
 
10
10
  # Full name of the author or maintainer of the project
11
11
  AUTHOR = "Raul Mauricio Uñate Castro"
@@ -0,0 +1,111 @@
1
+ import ast
2
+ import importlib
3
+ import os
4
+ from orionis.luminate.bootstrap.config.register import Register
5
+ from orionis.luminate.contracts.bootstrap.bootstrapper_interface import IBootstrapper
6
+ from typing import List
7
+
8
+ class Bootstrapper(IBootstrapper):
9
+ """
10
+ Manages the automatic loading and registration of configuration classes
11
+ from Python files located in a specified directory.
12
+
13
+ The `Bootstrapper` class scans directories for Python files and dynamically
14
+ imports them to find configuration classes. Once found, the classes are
15
+ registered using the provided `Register` instance.
16
+
17
+ Attributes
18
+ ----------
19
+ register : Register
20
+ An instance of the `Register` class used to register configuration classes.
21
+
22
+ Methods
23
+ -------
24
+ __init__(register: Register) -> None
25
+ Initializes the `Bootstrapper` with a `Register` instance.
26
+
27
+ findClasses(file_path: str) -> List[str]
28
+ Parses a Python file to extract and return all defined class names.
29
+
30
+ autoload(directory: str) -> None
31
+ Scans a directory for Python files, imports them, finds configuration classes,
32
+ and registers them using the `Register` instance.
33
+ """
34
+
35
+ def __init__(self, register: Register) -> None:
36
+ """
37
+ Initializes the `Bootstrapper` with a `Register` instance.
38
+
39
+ Parameters
40
+ ----------
41
+ register : Register
42
+ An instance of the `Register` class used to register configuration classes.
43
+ """
44
+ self.register = register
45
+
46
+ def findClasses(self, file_path: str) -> List[str]:
47
+ """
48
+ Parses a Python file to extract and return all defined class names.
49
+
50
+ This method opens the file at the given path, parses it using the Abstract
51
+ Syntax Tree (AST) module to extract class definitions, and returns a
52
+ list of class names found within the file.
53
+
54
+ Parameters
55
+ ----------
56
+ file_path : str
57
+ The path to the Python file to parse.
58
+
59
+ Returns
60
+ -------
61
+ List[str]
62
+ A list of class names defined in the provided Python file.
63
+ """
64
+ classes = []
65
+ with open(file_path, "r", encoding="utf-8") as file:
66
+ tree = ast.parse(file.read())
67
+
68
+ for node in ast.walk(tree):
69
+ if isinstance(node, ast.ClassDef):
70
+ classes.append(node.name)
71
+
72
+ return classes
73
+
74
+ def autoload(self, directory: str) -> None:
75
+ """
76
+ Automatically registers configuration classes found in a given directory.
77
+
78
+ This method walks through the specified directory, imports all Python files,
79
+ and scans for class definitions. If a class is found, it is registered using
80
+ the `Register` instance. Only classes defined in Python files (excluding
81
+ `__init__.py`) are considered.
82
+
83
+ Parameters
84
+ ----------
85
+ directory : str
86
+ The directory to scan for Python configuration files.
87
+
88
+ Raises
89
+ ------
90
+ FileNotFoundError
91
+ If the provided directory does not exist.
92
+ """
93
+ if not os.path.isdir(directory):
94
+ raise FileNotFoundError(f"Directory '{directory}' not found.")
95
+
96
+ for root, _, files in os.walk(directory):
97
+ for file in files:
98
+ if file.endswith(".py") and file != "__init__.py":
99
+ file_path = os.path.join(root, file)
100
+ # Get the class names defined in the file
101
+ classes = self.findClasses(file_path)
102
+
103
+ if classes:
104
+ for class_name in classes:
105
+ # Construct the module path and import the module
106
+ module_path = root.replace(os.getcwd(), "").replace(os.sep, ".")[1:] + "." + file[:-3]
107
+ module = importlib.import_module(module_path)
108
+ class_obj = getattr(module, class_name)
109
+
110
+ # Register the class in the container using the Register instance
111
+ self.register.config(class_obj)
@@ -41,8 +41,12 @@ class Parser(IParser):
41
41
  If the `config` attribute cannot be converted to a dictionary.
42
42
  """
43
43
  try:
44
- # Convert dataclass using asdict()
45
- return asdict(instance.config)
44
+ # Check if instance is a dictionary
45
+ if isinstance(instance.config, dict):
46
+ return instance
47
+ # Check if instance is a dataclass
48
+ elif hasattr(instance.config, '__dataclass_fields__'):
49
+ return asdict(instance.config)
46
50
  except AttributeError as e:
47
51
  raise AttributeError("The provided instance does not have a 'config' attribute.") from e
48
52
  except TypeError as e:
@@ -1,10 +1,11 @@
1
- from orionis.luminate.bootstrap.parser import Parser
1
+ from orionis.luminate.bootstrap.config.parser import Parser
2
2
  from orionis.luminate.config.sections import SECTIONS
3
- from orionis.luminate.tools.reflection import Reflection
4
- from orionis.luminate.cache.app.config import CacheConfig
3
+ from orionis.luminate.container.container import Container
4
+ from orionis.luminate.contracts.bootstrap.register_interface import IRegister
5
5
  from orionis.luminate.contracts.config.config_interface import IConfig
6
+ from orionis.luminate.tools.reflection import Reflection
6
7
 
7
- class Register:
8
+ class Register(IRegister):
8
9
  """
9
10
  Handles the registration of configuration classes within the application.
10
11
 
@@ -22,7 +23,7 @@ class Register:
22
23
  Registers a configuration class and ensures it meets the necessary criteria.
23
24
  """
24
25
 
25
- def __init__(self, cache: CacheConfig = None):
26
+ def __init__(self, container: Container) -> None:
26
27
  """
27
28
  Initializes the Register instance with a cache configuration.
28
29
 
@@ -31,7 +32,7 @@ class Register:
31
32
  cache : CacheConfig, optional
32
33
  The cache configuration instance to be used (default is a new instance of `CacheConfig`).
33
34
  """
34
- self.cache_config = cache or CacheConfig()
35
+ self.container = container
35
36
 
36
37
  def config(self, config_class: type) -> type:
37
38
  """
@@ -78,18 +79,8 @@ class Register:
78
79
  if not issubclass(config_class, IConfig):
79
80
  raise TypeError(f"Class {config_class.__name__} must inherit from 'IConfig'.")
80
81
 
81
- # Check if section is already registered
82
- if section in self.cache_config.config:
83
- raise ValueError(f"Configuration section '{section}' is already registered.")
84
-
85
82
  # Register configuration
86
- self.cache_config.register(
83
+ self.container.config(
87
84
  section=section,
88
85
  data=Parser.toDict(config_class)
89
- )
90
-
91
- # Return the original class
92
- return config_class
93
-
94
- # Create a global Register instance
95
- register = Register()
86
+ )
@@ -1,6 +1,7 @@
1
1
  import inspect
2
2
  from typing import Any, Callable
3
3
  from orionis.luminate.container.types import Types
4
+ from orionis.luminate.tools.dot_dict import DotDict
4
5
  from orionis.luminate.contracts.container.container_interface import IContainer
5
6
  from orionis.luminate.container.exception import OrionisContainerException, OrionisContainerValueError
6
7
 
@@ -12,6 +13,8 @@ class Container(IContainer):
12
13
  def __new__(cls):
13
14
  if cls._instance is None:
14
15
  cls._instance = super().__new__(cls)
16
+ cls._config = {}
17
+
15
18
  cls._instance._bindings = {}
16
19
  cls._instance._transients = {}
17
20
  cls._instance._singletons = {}
@@ -24,6 +27,28 @@ class Container(IContainer):
24
27
  cls._instance._primitive_types_validator = Types()
25
28
  return cls._instance
26
29
 
30
+ def config(self, section: str, data: dict):
31
+ """
32
+ Registers a configuration section in the container.
33
+
34
+ Args:
35
+ section (str): _description_
36
+ data (dict): _description_
37
+ """
38
+
39
+ # Validate that data is a dictionary
40
+ if not isinstance(data, dict):
41
+ raise OrionisContainerValueError("The 'data' parameter must be a dictionary.")
42
+
43
+ # Validate that the section is a string
44
+ if not isinstance(section, str):
45
+ raise OrionisContainerValueError("The 'section' parameter must be a string.")
46
+
47
+ if section not in self._config:
48
+ self._config[section] = data
49
+ else:
50
+ self._config[section].update(data)
51
+
27
52
  def bind(self, abstract: str, concrete: Callable[..., Any]) -> None:
28
53
  """Registers a service with a specific implementation.
29
54
 
@@ -0,0 +1,65 @@
1
+ from abc import ABC, abstractmethod
2
+ from ast import List
3
+
4
+ class IBootstrapper(ABC):
5
+ """
6
+ Interface for managing the automatic loading and registration of configuration
7
+ classes from Python files located in a specified directory.
8
+
9
+ The `IBootstrapper` interface defines methods for scanning directories for
10
+ Python files and dynamically importing them to find configuration classes.
11
+ Implementations of this interface should provide the logic for registering
12
+ the found classes using a `Register` instance.
13
+
14
+ Methods
15
+ -------
16
+ findClasses(file_path: str) -> List[str]
17
+ Parses a Python file to extract and return all defined class names.
18
+
19
+ autoload(directory: str) -> None
20
+ Scans a directory for Python files, imports them, finds configuration classes,
21
+ and registers them using the `Register` instance.
22
+ """
23
+
24
+ @abstractmethod
25
+ def findClasses(self, file_path: str) -> List[str]:
26
+ """
27
+ Parses a Python file to extract and return all defined class names.
28
+
29
+ This method opens the file at the given path, parses it using the Abstract
30
+ Syntax Tree (AST) module to extract class definitions, and returns a
31
+ list of class names found within the file.
32
+
33
+ Parameters
34
+ ----------
35
+ file_path : str
36
+ The path to the Python file to parse.
37
+
38
+ Returns
39
+ -------
40
+ List[str]
41
+ A list of class names defined in the provided Python file.
42
+ """
43
+ pass
44
+
45
+ @abstractmethod
46
+ def autoload(self, directory: str) -> None:
47
+ """
48
+ Automatically registers configuration classes found in a given directory.
49
+
50
+ This method walks through the specified directory, imports all Python files,
51
+ and scans for class definitions. If a class is found, it is registered using
52
+ the `Register` instance. Only classes defined in Python files (excluding
53
+ `__init__.py`) are considered.
54
+
55
+ Parameters
56
+ ----------
57
+ directory : str
58
+ The directory to scan for Python configuration files.
59
+
60
+ Raises
61
+ ------
62
+ FileNotFoundError
63
+ If the provided directory does not exist.
64
+ """
65
+ pass
@@ -0,0 +1,47 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ class IRegister(ABC):
4
+ """
5
+ Handles the registration of configuration classes within the application.
6
+
7
+ This class ensures that only valid configuration classes are registered
8
+ while enforcing structure and type safety.
9
+
10
+ Attributes
11
+ ----------
12
+ cache_config : CacheConfig
13
+ An instance of `CacheConfig` used to store registered configurations.
14
+
15
+ Methods
16
+ -------
17
+ config(config_class: type) -> type
18
+ Registers a configuration class and ensures it meets the necessary criteria.
19
+ """
20
+
21
+ @abstractmethod
22
+ def config(self, config_class: type) -> type:
23
+ """
24
+ Registers a configuration class and ensures it meets the required structure.
25
+
26
+ This method performs multiple validation steps, including checking if the input
27
+ is a class, verifying the existence of a `config` attribute, and confirming
28
+ inheritance from `IConfig`.
29
+
30
+ Parameters
31
+ ----------
32
+ config_class : type
33
+ The class to be registered as a configuration.
34
+
35
+ Returns
36
+ -------
37
+ type
38
+ The same class passed as an argument, if registration is successful.
39
+
40
+ Raises
41
+ ------
42
+ TypeError
43
+ If `config_class` is not a class or does not inherit from `IConfig`.
44
+ ValueError
45
+ If `config_class` does not have a `config` attribute or is already registered.
46
+ """
47
+ pass
@@ -0,0 +1,29 @@
1
+ class DotDict(dict):
2
+
3
+ """
4
+ A dictionary subclass that allows access to dictionary values using dot notation, with handling for missing keys.
5
+ This class extends the built-in `dict` class to provide attribute-style access to dictionary keys. If a key is not found,
6
+ it returns `None` instead of raising a `KeyError`. Additionally, nested dictionaries are automatically converted to `DotDict`
7
+ instances.
8
+ Methods
9
+ -------
10
+ __getattr__(item)
11
+ Retrieves the value associated with the given key using dot notation. If the key does not exist, returns `None`.
12
+ If the value is a dictionary, it is converted to a `DotDict` instance.
13
+ """
14
+
15
+ def __getattr__(self, item):
16
+ """
17
+ Retrieves the value associated with the given key using dot notation. If the key does not exist, returns `None`.
18
+ If the value is a dictionary, it is converted to a `DotDict` instance.
19
+ """
20
+
21
+ # Retrieve the value associated with the key
22
+ value = self.get(item, None)
23
+
24
+ # If the value is a dictionary, convert it to a DotDict instance
25
+ if isinstance(value, dict):
26
+ return DotDict(value)
27
+
28
+ # Otherwise, return the value
29
+ return value
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: orionis
3
- Version: 0.11.0
3
+ Version: 0.13.0
4
4
  Summary: Orionis Framework – Elegant, Fast, and Powerful.
5
5
  Home-page: https://github.com/orionis-framework/framework
6
6
  Author: Raul Mauricio Uñate Castro
@@ -14,8 +14,10 @@ orionis.egg-info/top_level.txt
14
14
  orionis/luminate/__init__.py
15
15
  orionis/luminate/app.py
16
16
  orionis/luminate/bootstrap/__init__.py
17
- orionis/luminate/bootstrap/parser.py
18
- orionis/luminate/bootstrap/register.py
17
+ orionis/luminate/bootstrap/config/__init__.py
18
+ orionis/luminate/bootstrap/config/bootstrapper.py
19
+ orionis/luminate/bootstrap/config/parser.py
20
+ orionis/luminate/bootstrap/config/register.py
19
21
  orionis/luminate/cache/__init__.py
20
22
  orionis/luminate/cache/app/__init__.py
21
23
  orionis/luminate/cache/app/config.py
@@ -66,7 +68,9 @@ orionis/luminate/container/container.py
66
68
  orionis/luminate/container/exception.py
67
69
  orionis/luminate/container/types.py
68
70
  orionis/luminate/contracts/__init__.py
71
+ orionis/luminate/contracts/bootstrap/bootstrapper_interface.py
69
72
  orionis/luminate/contracts/bootstrap/parser_interface.py
73
+ orionis/luminate/contracts/bootstrap/register_interface.py
70
74
  orionis/luminate/contracts/cache/__init__.py
71
75
  orionis/luminate/contracts/cache/cache_commands_interface.py
72
76
  orionis/luminate/contracts/config/__init__.py
@@ -140,6 +144,7 @@ orionis/luminate/test/__init__.py
140
144
  orionis/luminate/test/exception.py
141
145
  orionis/luminate/test/unit_test.py
142
146
  orionis/luminate/tools/__init__.py
147
+ orionis/luminate/tools/dot_dict.py
143
148
  orionis/luminate/tools/reflection.py
144
149
  orionis/luminate/tools/std.py
145
150
  tests/__init__.py
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes