orionis 0.316.0__tar.gz → 0.317.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 (457) hide show
  1. {orionis-0.316.0/orionis.egg-info → orionis-0.317.0}/PKG-INFO +1 -1
  2. {orionis-0.316.0 → orionis-0.317.0}/orionis/container/container.py +408 -53
  3. orionis-0.317.0/orionis/container/entities/binding.py +124 -0
  4. {orionis-0.316.0 → orionis-0.317.0}/orionis/metadata/framework.py +1 -1
  5. orionis-0.317.0/orionis/services/introspection/callables/reflection_callable.py +147 -0
  6. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/dependencies/reflect_dependencies.py +57 -6
  7. {orionis-0.316.0 → orionis-0.317.0/orionis.egg-info}/PKG-INFO +1 -1
  8. {orionis-0.316.0 → orionis-0.317.0}/orionis.egg-info/SOURCES.txt +4 -0
  9. {orionis-0.316.0 → orionis-0.317.0}/tests/services/inspection/dependencies/test_reflect_dependencies.py +34 -1
  10. orionis-0.317.0/tests/services/inspection/reflection/test_reflection_callable.py +157 -0
  11. orionis-0.317.0/tests/testing/__init__.py +0 -0
  12. {orionis-0.316.0 → orionis-0.317.0}/LICENCE +0 -0
  13. {orionis-0.316.0 → orionis-0.317.0}/MANIFEST.in +0 -0
  14. {orionis-0.316.0 → orionis-0.317.0}/README.md +0 -0
  15. {orionis-0.316.0 → orionis-0.317.0}/orionis/__init__.py +0 -0
  16. {orionis-0.316.0 → orionis-0.317.0}/orionis/_application.py +0 -0
  17. {orionis-0.316.0 → orionis-0.317.0}/orionis/_container/__init__.py +0 -0
  18. {orionis-0.316.0 → orionis-0.317.0}/orionis/_container/container.py +0 -0
  19. {orionis-0.316.0 → orionis-0.317.0}/orionis/_container/container_integrity.py +0 -0
  20. {orionis-0.316.0 → orionis-0.317.0}/orionis/_container/exception.py +0 -0
  21. {orionis-0.316.0 → orionis-0.317.0}/orionis/_container/lifetimes.py +0 -0
  22. {orionis-0.316.0 → orionis-0.317.0}/orionis/_container/resolve.py +0 -0
  23. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/__init__.py +0 -0
  24. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/application.py +0 -0
  25. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/config/__init__.py +0 -0
  26. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/config/config.py +0 -0
  27. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/console/__init__.py +0 -0
  28. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/console/base/__init__.py +0 -0
  29. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/console/base/command.py +0 -0
  30. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/console/command_filter.py +0 -0
  31. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/console/kernel.py +0 -0
  32. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/console/output/__init__.py +0 -0
  33. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/console/output/console.py +0 -0
  34. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/console/output/executor.py +0 -0
  35. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/console/output/progress_bar.py +0 -0
  36. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/console/parser.py +0 -0
  37. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/console/task_manager.py +0 -0
  38. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/container/container.py +0 -0
  39. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/container/container_integrity.py +0 -0
  40. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/__init__.py +0 -0
  41. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/commands/__init__.py +0 -0
  42. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/commands/commands_facade.py +0 -0
  43. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/commands/scheduler_facade.py +0 -0
  44. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/config/__init__.py +0 -0
  45. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/config/config_facade.py +0 -0
  46. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/environment/__init__.py +0 -0
  47. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/environment/environment_facade.py +0 -0
  48. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/facade.py +0 -0
  49. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/files/__init__.py +0 -0
  50. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/files/path_facade.py +0 -0
  51. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/log/__init__.py +0 -0
  52. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/log/log_facade.py +0 -0
  53. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/tests/__init__.py +0 -0
  54. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/facades/tests/tests_facade.py +0 -0
  55. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/foundation/__init__.py +0 -0
  56. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/foundation/bootstraper.py +0 -0
  57. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/foundation/config/__init__.py +0 -0
  58. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/foundation/config/config_bootstrapper.py +0 -0
  59. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/foundation/console/__init__.py +0 -0
  60. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/foundation/console/command_bootstrapper.py +0 -0
  61. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/foundation/environment/__init__.py +0 -0
  62. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/foundation/environment/environment_bootstrapper.py +0 -0
  63. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/foundation/providers/__init__.py +0 -0
  64. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/foundation/providers/service_providers_bootstrapper.py +0 -0
  65. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/providers/__init__.py +0 -0
  66. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/providers/service_provider.py +0 -0
  67. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/services/__init__.py +0 -0
  68. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/services/commands/__init__.py +0 -0
  69. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/services/commands/reactor_commands_service.py +0 -0
  70. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/services/commands/schedule_service.py +0 -0
  71. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/services/config/__init__.py +0 -0
  72. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/services/config/config_service.py +0 -0
  73. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/services/environment/__init__.py +0 -0
  74. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/services/environment/environment_service.py +0 -0
  75. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/services/files/__init__.py +0 -0
  76. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/services/files/path_resolver_service.py +0 -0
  77. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/services/log/__init__.py +0 -0
  78. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/services/log/log_service.py +0 -0
  79. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/support/exception_parse.py +0 -0
  80. {orionis-0.316.0 → orionis-0.317.0}/orionis/_contracts/support/reflection.py +0 -0
  81. {orionis-0.316.0 → orionis-0.317.0}/orionis/_facades/__init__.py +0 -0
  82. {orionis-0.316.0 → orionis-0.317.0}/orionis/_facades/app_facade.py +0 -0
  83. {orionis-0.316.0 → orionis-0.317.0}/orionis/_facades/commands/__init__.py +0 -0
  84. {orionis-0.316.0 → orionis-0.317.0}/orionis/_facades/commands/commands_facade.py +0 -0
  85. {orionis-0.316.0 → orionis-0.317.0}/orionis/_facades/commands/scheduler_facade.py +0 -0
  86. {orionis-0.316.0 → orionis-0.317.0}/orionis/_facades/config/__init__.py +0 -0
  87. {orionis-0.316.0 → orionis-0.317.0}/orionis/_facades/config/config_facade.py +0 -0
  88. {orionis-0.316.0 → orionis-0.317.0}/orionis/_facades/environment/__init__.py +0 -0
  89. {orionis-0.316.0 → orionis-0.317.0}/orionis/_facades/environment/environment_facade.py +0 -0
  90. {orionis-0.316.0 → orionis-0.317.0}/orionis/_facades/files/__init__.py +0 -0
  91. {orionis-0.316.0 → orionis-0.317.0}/orionis/_facades/files/path_facade.py +0 -0
  92. {orionis-0.316.0 → orionis-0.317.0}/orionis/_facades/log/__init__.py +0 -0
  93. {orionis-0.316.0 → orionis-0.317.0}/orionis/_facades/log/log_facade.py +0 -0
  94. {orionis-0.316.0 → orionis-0.317.0}/orionis/_foundation/__init__.py +0 -0
  95. {orionis-0.316.0 → orionis-0.317.0}/orionis/_foundation/console/__init__.py +0 -0
  96. {orionis-0.316.0 → orionis-0.317.0}/orionis/_foundation/console/command_bootstrapper.py +0 -0
  97. {orionis-0.316.0 → orionis-0.317.0}/orionis/_foundation/environment/__init__.py +0 -0
  98. {orionis-0.316.0 → orionis-0.317.0}/orionis/_foundation/environment/environment_bootstrapper.py +0 -0
  99. {orionis-0.316.0 → orionis-0.317.0}/orionis/_foundation/exceptions/__init__.py +0 -0
  100. {orionis-0.316.0 → orionis-0.317.0}/orionis/_foundation/exceptions/exception_bootstrapper.py +0 -0
  101. {orionis-0.316.0 → orionis-0.317.0}/orionis/_foundation/exceptions/exception_providers.py +0 -0
  102. {orionis-0.316.0 → orionis-0.317.0}/orionis/_foundation/foundation/config/__init__.py +0 -0
  103. {orionis-0.316.0 → orionis-0.317.0}/orionis/_foundation/foundation/config/config_bootstrapper.py +0 -0
  104. {orionis-0.316.0 → orionis-0.317.0}/orionis/_foundation/providers/__init__.py +0 -0
  105. {orionis-0.316.0 → orionis-0.317.0}/orionis/_foundation/providers/service_providers_bootstrapper.py +0 -0
  106. {orionis-0.316.0 → orionis-0.317.0}/orionis/_providers/__init__.py +0 -0
  107. {orionis-0.316.0 → orionis-0.317.0}/orionis/_providers/commands/__init__.py +0 -0
  108. {orionis-0.316.0 → orionis-0.317.0}/orionis/_providers/commands/reactor_commands_service_provider.py +0 -0
  109. {orionis-0.316.0 → orionis-0.317.0}/orionis/_providers/commands/scheduler_provider.py +0 -0
  110. {orionis-0.316.0 → orionis-0.317.0}/orionis/_providers/config/__init__.py +0 -0
  111. {orionis-0.316.0 → orionis-0.317.0}/orionis/_providers/config/config_service_provider.py +0 -0
  112. {orionis-0.316.0 → orionis-0.317.0}/orionis/_providers/environment/__init__.py +0 -0
  113. {orionis-0.316.0 → orionis-0.317.0}/orionis/_providers/environment/environment__service_provider.py +0 -0
  114. {orionis-0.316.0 → orionis-0.317.0}/orionis/_providers/files/__init__.py +0 -0
  115. {orionis-0.316.0 → orionis-0.317.0}/orionis/_providers/files/paths_provider.py +0 -0
  116. {orionis-0.316.0 → orionis-0.317.0}/orionis/_providers/log/__init__.py +0 -0
  117. {orionis-0.316.0 → orionis-0.317.0}/orionis/_providers/log/log_service_provider.py +0 -0
  118. {orionis-0.316.0 → orionis-0.317.0}/orionis/_providers/service_provider.py +0 -0
  119. {orionis-0.316.0 → orionis-0.317.0}/orionis/_services/__init__.py +0 -0
  120. {orionis-0.316.0 → orionis-0.317.0}/orionis/_services/commands/__init__.py +0 -0
  121. {orionis-0.316.0 → orionis-0.317.0}/orionis/_services/commands/reactor_commands_service.py +0 -0
  122. {orionis-0.316.0 → orionis-0.317.0}/orionis/_services/commands/scheduler_service.py +0 -0
  123. {orionis-0.316.0 → orionis-0.317.0}/orionis/_services/config/__init__.py +0 -0
  124. {orionis-0.316.0 → orionis-0.317.0}/orionis/_services/config/config_service.py +0 -0
  125. {orionis-0.316.0 → orionis-0.317.0}/orionis/_services/log/__init__.py +0 -0
  126. {orionis-0.316.0 → orionis-0.317.0}/orionis/_services/log/log_service.py +0 -0
  127. {orionis-0.316.0 → orionis-0.317.0}/orionis/application.py +0 -0
  128. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/__init__.py +0 -0
  129. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/base/__init__.py +0 -0
  130. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/base/command.py +0 -0
  131. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/command_filter.py +0 -0
  132. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/commands/__init__.py +0 -0
  133. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/commands/cache_clear.py +0 -0
  134. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/commands/help.py +0 -0
  135. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/commands/schedule_work.py +0 -0
  136. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/commands/version.py +0 -0
  137. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/dumper/__init__.py +0 -0
  138. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/dumper/dump_die.py +0 -0
  139. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/exceptions/__init__.py +0 -0
  140. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/exceptions/cli-orionis-value-error.py +0 -0
  141. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/exceptions/cli_exception.py +0 -0
  142. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/exceptions/cli_runtime_error.py +0 -0
  143. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/exceptions/cli_schedule_exception.py +0 -0
  144. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/kernel.py +0 -0
  145. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/output/__init__.py +0 -0
  146. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/output/console.py +0 -0
  147. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/output/executor.py +0 -0
  148. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/output/progress_bar.py +0 -0
  149. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/output/styles.py +0 -0
  150. {orionis-0.316.0 → orionis-0.317.0}/orionis/console/parser.py +0 -0
  151. {orionis-0.316.0 → orionis-0.317.0}/orionis/container/enums/lifetimes.py +0 -0
  152. {orionis-0.316.0 → orionis-0.317.0}/orionis/container/exceptions/container_exception.py +0 -0
  153. {orionis-0.316.0 → orionis-0.317.0}/orionis/container/exceptions/type_error_exception.py +0 -0
  154. {orionis-0.316.0 → orionis-0.317.0}/orionis/container/exceptions/value_exception.py +0 -0
  155. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/__init__.py +0 -0
  156. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/__init__.py +0 -0
  157. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/app/__init__.py +0 -0
  158. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/app/entities/__init__.py +0 -0
  159. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/app/entities/app.py +0 -0
  160. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/app/enums/__init__.py +0 -0
  161. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/app/enums/ciphers.py +0 -0
  162. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/app/enums/environments.py +0 -0
  163. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/auth/__init__.py +0 -0
  164. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/auth/entities/__init__.py +0 -0
  165. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/auth/entities/auth.py +0 -0
  166. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/cache/__init__.py +0 -0
  167. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/cache/entities/__init__.py +0 -0
  168. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/cache/entities/cache.py +0 -0
  169. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/cache/entities/file.py +0 -0
  170. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/cache/entities/stores.py +0 -0
  171. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/cache/enums/__init__.py +0 -0
  172. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/cache/enums/drivers.py +0 -0
  173. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/cors/__init__.py +0 -0
  174. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/cors/entities/__init__.py +0 -0
  175. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/cors/entities/cors.py +0 -0
  176. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/__init__.py +0 -0
  177. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/entities/__init__.py +0 -0
  178. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/entities/connections.py +0 -0
  179. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/entities/database.py +0 -0
  180. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/entities/mysql.py +0 -0
  181. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/entities/oracle.py +0 -0
  182. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/entities/pgsql.py +0 -0
  183. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/entities/sqlite.py +0 -0
  184. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/enums/__init__.py +0 -0
  185. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/enums/mysql_charsets.py +0 -0
  186. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/enums/mysql_collations.py +0 -0
  187. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/enums/mysql_engine.py +0 -0
  188. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/enums/oracle_encoding.py +0 -0
  189. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/enums/oracle_nencoding.py +0 -0
  190. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/enums/pgsql_charsets.py +0 -0
  191. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/enums/pgsql_collations.py +0 -0
  192. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/enums/pgsql_mode.py +0 -0
  193. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/enums/sqlite_foreign_key.py +0 -0
  194. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/enums/sqlite_journal.py +0 -0
  195. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/database/enums/sqlite_synchronous.py +0 -0
  196. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/filesystems/__init__.py +0 -0
  197. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/filesystems/entitites/__init__.py +0 -0
  198. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/filesystems/entitites/aws.py +0 -0
  199. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/filesystems/entitites/disks.py +0 -0
  200. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/filesystems/entitites/filesystems.py +0 -0
  201. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/filesystems/entitites/local.py +0 -0
  202. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/filesystems/entitites/public.py +0 -0
  203. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/logging/__init__.py +0 -0
  204. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/logging/entities/__init__.py +0 -0
  205. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/logging/entities/channels.py +0 -0
  206. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/logging/entities/chunked.py +0 -0
  207. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/logging/entities/daily.py +0 -0
  208. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/logging/entities/hourly.py +0 -0
  209. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/logging/entities/logging.py +0 -0
  210. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/logging/entities/monthly.py +0 -0
  211. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/logging/entities/stack.py +0 -0
  212. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/logging/entities/weekly.py +0 -0
  213. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/logging/enums/__init__.py +0 -0
  214. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/logging/enums/levels.py +0 -0
  215. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/mail/__init__.py +0 -0
  216. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/mail/entities/__init__.py +0 -0
  217. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/mail/entities/file.py +0 -0
  218. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/mail/entities/mail.py +0 -0
  219. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/mail/entities/mailers.py +0 -0
  220. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/mail/entities/smtp.py +0 -0
  221. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/queue/__init__.py +0 -0
  222. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/queue/entities/__init__.py +0 -0
  223. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/queue/entities/brokers.py +0 -0
  224. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/queue/entities/database.py +0 -0
  225. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/queue/entities/queue.py +0 -0
  226. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/queue/enums/strategy.py +0 -0
  227. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/roots/__init__.py +0 -0
  228. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/roots/paths.py +0 -0
  229. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/session/__init__.py +0 -0
  230. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/session/entities/__init__.py +0 -0
  231. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/session/entities/session.py +0 -0
  232. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/session/enums/__init__.py +0 -0
  233. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/session/enums/same_site_policy.py +0 -0
  234. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/session/helpers/secret_key.py +0 -0
  235. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/startup.py +0 -0
  236. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/testing/__init__.py +0 -0
  237. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/testing/entities/__init__.py +0 -0
  238. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/testing/entities/testing.py +0 -0
  239. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/testing/enums/__init__.py +0 -0
  240. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/config/testing/enums/test_mode.py +0 -0
  241. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/contracts/__init__.py +0 -0
  242. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/contracts/config.py +0 -0
  243. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/exceptions/__init__.py +0 -0
  244. {orionis-0.316.0 → orionis-0.317.0}/orionis/foundation/exceptions/integrity.py +0 -0
  245. {orionis-0.316.0 → orionis-0.317.0}/orionis/metadata/__init__.py +0 -0
  246. {orionis-0.316.0 → orionis-0.317.0}/orionis/metadata/package.py +0 -0
  247. {orionis-0.316.0 → orionis-0.317.0}/orionis/patterns/__init__.py +0 -0
  248. {orionis-0.316.0 → orionis-0.317.0}/orionis/patterns/singleton/__init__.py +0 -0
  249. {orionis-0.316.0 → orionis-0.317.0}/orionis/patterns/singleton/meta_class.py +0 -0
  250. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/__init__.py +0 -0
  251. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/asynchrony/__init__.py +0 -0
  252. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/asynchrony/contracts/__init__.py +0 -0
  253. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/asynchrony/contracts/coroutines.py +0 -0
  254. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/asynchrony/coroutines.py +0 -0
  255. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/asynchrony/exceptions/__init__.py +0 -0
  256. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/asynchrony/exceptions/coroutine_exception.py +0 -0
  257. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/environment/__init__.py +0 -0
  258. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/environment/contracts/__init__.py +0 -0
  259. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/environment/contracts/env.py +0 -0
  260. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/environment/contracts/types.py +0 -0
  261. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/environment/dot_env.py +0 -0
  262. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/environment/env.py +0 -0
  263. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/environment/exceptions/__init__.py +0 -0
  264. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/environment/exceptions/environment_value_error.py +0 -0
  265. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/environment/exceptions/environment_value_exception.py +0 -0
  266. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/environment/types.py +0 -0
  267. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/__init__.py +0 -0
  268. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/abstract/__init__.py +0 -0
  269. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/abstract/reflection_abstract.py +0 -0
  270. {orionis-0.316.0/orionis/services/introspection/concretes → orionis-0.317.0/orionis/services/introspection/callables}/__init__.py +0 -0
  271. {orionis-0.316.0/orionis/services/introspection/contracts → orionis-0.317.0/orionis/services/introspection/concretes}/__init__.py +0 -0
  272. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/concretes/reflection_concrete.py +0 -0
  273. {orionis-0.316.0/orionis/services/introspection/dependencies → orionis-0.317.0/orionis/services/introspection/contracts}/__init__.py +0 -0
  274. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/contracts/reflect_dependencies.py +0 -0
  275. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/contracts/reflection_abstract.py +0 -0
  276. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/contracts/reflection_concrete.py +0 -0
  277. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/contracts/reflection_instance.py +0 -0
  278. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/contracts/reflection_module.py +0 -0
  279. {orionis-0.316.0/orionis/services/introspection/dependencies/entities → orionis-0.317.0/orionis/services/introspection/dependencies}/__init__.py +0 -0
  280. {orionis-0.316.0/orionis/services/introspection/exceptions → orionis-0.317.0/orionis/services/introspection/dependencies/entities}/__init__.py +0 -0
  281. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/dependencies/entities/class_dependencies.py +0 -0
  282. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/dependencies/entities/method_dependencies.py +0 -0
  283. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/dependencies/entities/resolved_dependencies.py +0 -0
  284. {orionis-0.316.0/orionis/services/introspection/instances → orionis-0.317.0/orionis/services/introspection/exceptions}/__init__.py +0 -0
  285. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/exceptions/reflection_attribute_error.py +0 -0
  286. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/exceptions/reflection_type_error.py +0 -0
  287. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/exceptions/reflection_value_error.py +0 -0
  288. {orionis-0.316.0/orionis/services/introspection/modules → orionis-0.317.0/orionis/services/introspection/instances}/__init__.py +0 -0
  289. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/instances/reflection_instance.py +0 -0
  290. {orionis-0.316.0/orionis/services/parsers → orionis-0.317.0/orionis/services/introspection/modules}/__init__.py +0 -0
  291. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/modules/reflection_module.py +0 -0
  292. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/introspection/reflection.py +0 -0
  293. {orionis-0.316.0/orionis/services/parsers/contracts → orionis-0.317.0/orionis/services/parsers}/__init__.py +0 -0
  294. {orionis-0.316.0/orionis/services/parsers/exceptions → orionis-0.317.0/orionis/services/parsers/contracts}/__init__.py +0 -0
  295. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/parsers/contracts/exception_parser.py +0 -0
  296. {orionis-0.316.0/orionis/services/paths → orionis-0.317.0/orionis/services/parsers/exceptions}/__init__.py +0 -0
  297. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/parsers/exceptions/exception_parser.py +0 -0
  298. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/parsers/serializer.py +0 -0
  299. {orionis-0.316.0/orionis/services/paths/contracts → orionis-0.317.0/orionis/services/paths}/__init__.py +0 -0
  300. {orionis-0.316.0/orionis/services/paths/exceptions → orionis-0.317.0/orionis/services/paths/contracts}/__init__.py +0 -0
  301. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/paths/contracts/resolver.py +0 -0
  302. {orionis-0.316.0/orionis/services/system → orionis-0.317.0/orionis/services/paths/exceptions}/__init__.py +0 -0
  303. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/paths/exceptions/not_found_exceptions.py +0 -0
  304. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/paths/exceptions/path_value_exceptions.py +0 -0
  305. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/paths/resolver.py +0 -0
  306. {orionis-0.316.0/orionis/services/system/contracts → orionis-0.317.0/orionis/services/system}/__init__.py +0 -0
  307. {orionis-0.316.0/orionis/support → orionis-0.317.0/orionis/services/system/contracts}/__init__.py +0 -0
  308. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/system/contracts/imports.py +0 -0
  309. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/system/contracts/workers.py +0 -0
  310. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/system/imports.py +0 -0
  311. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/system/runtime_imports.py +0 -0
  312. {orionis-0.316.0 → orionis-0.317.0}/orionis/services/system/workers.py +0 -0
  313. {orionis-0.316.0/orionis/support/standard → orionis-0.317.0/orionis/support}/__init__.py +0 -0
  314. {orionis-0.316.0/orionis/support/standard/contracts → orionis-0.317.0/orionis/support/standard}/__init__.py +0 -0
  315. {orionis-0.316.0/orionis/support/standard/exceptions → orionis-0.317.0/orionis/support/standard/contracts}/__init__.py +0 -0
  316. {orionis-0.316.0 → orionis-0.317.0}/orionis/support/standard/contracts/std.py +0 -0
  317. {orionis-0.316.0/orionis/support/wrapper → orionis-0.317.0/orionis/support/standard/exceptions}/__init__.py +0 -0
  318. {orionis-0.316.0 → orionis-0.317.0}/orionis/support/standard/exceptions/std_value_exception.py +0 -0
  319. {orionis-0.316.0 → orionis-0.317.0}/orionis/support/standard/std.py +0 -0
  320. {orionis-0.316.0/orionis/support/wrapper/dicts → orionis-0.317.0/orionis/support/wrapper}/__init__.py +0 -0
  321. {orionis-0.316.0/orionis/test → orionis-0.317.0/orionis/support/wrapper/dicts}/__init__.py +0 -0
  322. {orionis-0.316.0 → orionis-0.317.0}/orionis/support/wrapper/dicts/dot_dict.py +0 -0
  323. {orionis-0.316.0/orionis/test/cases → orionis-0.317.0/orionis/test}/__init__.py +0 -0
  324. {orionis-0.316.0/orionis/test/contracts → orionis-0.317.0/orionis/test/cases}/__init__.py +0 -0
  325. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/cases/test_async.py +0 -0
  326. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/cases/test_case.py +0 -0
  327. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/cases/test_sync.py +0 -0
  328. {orionis-0.316.0/orionis/test/entities → orionis-0.317.0/orionis/test/contracts}/__init__.py +0 -0
  329. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/contracts/dumper.py +0 -0
  330. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/contracts/history.py +0 -0
  331. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/contracts/printer.py +0 -0
  332. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/contracts/test_unit.py +0 -0
  333. {orionis-0.316.0/orionis/test/enums → orionis-0.317.0/orionis/test/entities}/__init__.py +0 -0
  334. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/entities/test_result.py +0 -0
  335. {orionis-0.316.0/orionis/test/exceptions → orionis-0.317.0/orionis/test/enums}/__init__.py +0 -0
  336. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/enums/test_mode.py +0 -0
  337. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/enums/test_status.py +0 -0
  338. {orionis-0.316.0/orionis/test/logs → orionis-0.317.0/orionis/test/exceptions}/__init__.py +0 -0
  339. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/exceptions/test_config_exception.py +0 -0
  340. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/exceptions/test_failure_exception.py +0 -0
  341. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/exceptions/test_persistence_error.py +0 -0
  342. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/exceptions/test_runtime_error.py +0 -0
  343. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/exceptions/test_value_error.py +0 -0
  344. {orionis-0.316.0/orionis/test/output → orionis-0.317.0/orionis/test/logs}/__init__.py +0 -0
  345. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/logs/history.py +0 -0
  346. {orionis-0.316.0/orionis/test/suite → orionis-0.317.0/orionis/test/output}/__init__.py +0 -0
  347. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/output/dumper.py +0 -0
  348. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/output/printer.py +0 -0
  349. {orionis-0.316.0/orionis/test/view → orionis-0.317.0/orionis/test/suite}/__init__.py +0 -0
  350. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/suite/test_unit.py +0 -0
  351. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/test_suite.py +0 -0
  352. {orionis-0.316.0/tests → orionis-0.317.0/orionis/test/view}/__init__.py +0 -0
  353. {orionis-0.316.0 → orionis-0.317.0}/orionis/test/view/render.py +0 -0
  354. {orionis-0.316.0 → orionis-0.317.0}/orionis/unittesting.py +0 -0
  355. {orionis-0.316.0 → orionis-0.317.0}/orionis.egg-info/dependency_links.txt +0 -0
  356. {orionis-0.316.0 → orionis-0.317.0}/orionis.egg-info/requires.txt +0 -0
  357. {orionis-0.316.0 → orionis-0.317.0}/orionis.egg-info/top_level.txt +0 -0
  358. {orionis-0.316.0 → orionis-0.317.0}/orionis.egg-info/zip-safe +0 -0
  359. {orionis-0.316.0 → orionis-0.317.0}/setup.cfg +0 -0
  360. {orionis-0.316.0 → orionis-0.317.0}/setup.py +0 -0
  361. {orionis-0.316.0/tests/example → orionis-0.317.0/tests}/__init__.py +0 -0
  362. {orionis-0.316.0/tests/foundation → orionis-0.317.0/tests/example}/__init__.py +0 -0
  363. {orionis-0.316.0 → orionis-0.317.0}/tests/example/test_example.py +0 -0
  364. {orionis-0.316.0/tests/foundation/config → orionis-0.317.0/tests/foundation}/__init__.py +0 -0
  365. {orionis-0.316.0/tests/foundation/config/app → orionis-0.317.0/tests/foundation/config}/__init__.py +0 -0
  366. {orionis-0.316.0/tests/foundation/config/auth → orionis-0.317.0/tests/foundation/config/app}/__init__.py +0 -0
  367. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/app/test_foundation_config_app.py +0 -0
  368. {orionis-0.316.0/tests/foundation/config/cache → orionis-0.317.0/tests/foundation/config/auth}/__init__.py +0 -0
  369. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/auth/test_foundation_config_auth.py +0 -0
  370. {orionis-0.316.0/tests/foundation/config/cors → orionis-0.317.0/tests/foundation/config/cache}/__init__.py +0 -0
  371. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/cache/test_foundation_config_cache.py +0 -0
  372. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/cache/test_foundation_config_cache_file.py +0 -0
  373. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/cache/test_foundation_config_cache_stores.py +0 -0
  374. {orionis-0.316.0/tests/foundation/config/database → orionis-0.317.0/tests/foundation/config/cors}/__init__.py +0 -0
  375. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/cors/test_foundation_config_cors.py +0 -0
  376. {orionis-0.316.0/tests/foundation/config/filesystems → orionis-0.317.0/tests/foundation/config/database}/__init__.py +0 -0
  377. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/database/test_foundation_config_database.py +0 -0
  378. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/database/test_foundation_config_database_connections.py +0 -0
  379. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/database/test_foundation_config_database_mysql.py +0 -0
  380. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/database/test_foundation_config_database_oracle.py +0 -0
  381. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/database/test_foundation_config_database_pgsql.py +0 -0
  382. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/database/test_foundation_config_database_sqlite.py +0 -0
  383. {orionis-0.316.0/tests/foundation/config/logging → orionis-0.317.0/tests/foundation/config/filesystems}/__init__.py +0 -0
  384. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems.py +0 -0
  385. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems_aws.py +0 -0
  386. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems_disks.py +0 -0
  387. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems_local.py +0 -0
  388. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems_public.py +0 -0
  389. {orionis-0.316.0/tests/foundation/config/mail → orionis-0.317.0/tests/foundation/config/logging}/__init__.py +0 -0
  390. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/logging/test_foundation_config_logging.py +0 -0
  391. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/logging/test_foundation_config_logging_channels.py +0 -0
  392. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/logging/test_foundation_config_logging_chunked.py +0 -0
  393. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/logging/test_foundation_config_logging_daily.py +0 -0
  394. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/logging/test_foundation_config_logging_hourly.py +0 -0
  395. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/logging/test_foundation_config_logging_monthly.py +0 -0
  396. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/logging/test_foundation_config_logging_stack.py +0 -0
  397. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/logging/test_foundation_config_logging_weekly.py +0 -0
  398. {orionis-0.316.0/tests/foundation/config/queue → orionis-0.317.0/tests/foundation/config/mail}/__init__.py +0 -0
  399. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/mail/test_foundation_config_mail.py +0 -0
  400. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/mail/test_foundation_config_mail_file.py +0 -0
  401. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/mail/test_foundation_config_mail_mailers.py +0 -0
  402. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/mail/test_foundation_config_mail_smtp.py +0 -0
  403. {orionis-0.316.0/tests/foundation/config/root → orionis-0.317.0/tests/foundation/config/queue}/__init__.py +0 -0
  404. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/queue/test_foundation_config_queue.py +0 -0
  405. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/queue/test_foundation_config_queue_brokers.py +0 -0
  406. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/queue/test_foundation_config_queue_database.py +0 -0
  407. {orionis-0.316.0/tests/foundation/config/session → orionis-0.317.0/tests/foundation/config/root}/__init__.py +0 -0
  408. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/root/test_foundation_config_root_paths.py +0 -0
  409. {orionis-0.316.0/tests/foundation/config/startup → orionis-0.317.0/tests/foundation/config/session}/__init__.py +0 -0
  410. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/session/test_foundation_config_session.py +0 -0
  411. {orionis-0.316.0/tests/foundation/config/testing → orionis-0.317.0/tests/foundation/config/startup}/__init__.py +0 -0
  412. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/startup/test_foundation_config_startup.py +0 -0
  413. {orionis-0.316.0/tests/foundation/exceptions → orionis-0.317.0/tests/foundation/config/testing}/__init__.py +0 -0
  414. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/config/testing/test_foundation_config_testing.py +0 -0
  415. {orionis-0.316.0/tests/metadata → orionis-0.317.0/tests/foundation/exceptions}/__init__.py +0 -0
  416. {orionis-0.316.0 → orionis-0.317.0}/tests/foundation/exceptions/test_foundation_config_exceptions.py +0 -0
  417. {orionis-0.316.0/tests/patterns → orionis-0.317.0/tests/metadata}/__init__.py +0 -0
  418. {orionis-0.316.0 → orionis-0.317.0}/tests/metadata/test_metadata_framework.py +0 -0
  419. {orionis-0.316.0 → orionis-0.317.0}/tests/metadata/test_metadata_package.py +0 -0
  420. {orionis-0.316.0/tests/patterns/singleton → orionis-0.317.0/tests/patterns}/__init__.py +0 -0
  421. {orionis-0.316.0/tests/services → orionis-0.317.0/tests/patterns/singleton}/__init__.py +0 -0
  422. {orionis-0.316.0 → orionis-0.317.0}/tests/patterns/singleton/test_patterns_singleton.py +0 -0
  423. {orionis-0.316.0/tests/services/asynchrony → orionis-0.317.0/tests/services}/__init__.py +0 -0
  424. {orionis-0.316.0/tests/services/environment → orionis-0.317.0/tests/services/asynchrony}/__init__.py +0 -0
  425. {orionis-0.316.0 → orionis-0.317.0}/tests/services/asynchrony/test_services_asynchrony_coroutine.py +0 -0
  426. {orionis-0.316.0/tests/services/inspection → orionis-0.317.0/tests/services/environment}/__init__.py +0 -0
  427. {orionis-0.316.0 → orionis-0.317.0}/tests/services/environment/test_services_environment.py +0 -0
  428. {orionis-0.316.0/tests/services/inspection/dependencies → orionis-0.317.0/tests/services/inspection}/__init__.py +0 -0
  429. {orionis-0.316.0/tests/services/inspection/dependencies/mocks → orionis-0.317.0/tests/services/inspection/dependencies}/__init__.py +0 -0
  430. {orionis-0.316.0/tests/services/inspection/reflection → orionis-0.317.0/tests/services/inspection/dependencies/mocks}/__init__.py +0 -0
  431. {orionis-0.316.0 → orionis-0.317.0}/tests/services/inspection/dependencies/mocks/mock_user.py +0 -0
  432. {orionis-0.316.0 → orionis-0.317.0}/tests/services/inspection/dependencies/mocks/mock_user_controller.py +0 -0
  433. {orionis-0.316.0 → orionis-0.317.0}/tests/services/inspection/dependencies/mocks/mock_users_permissions.py +0 -0
  434. {orionis-0.316.0/tests/services/inspection/reflection/mock → orionis-0.317.0/tests/services/inspection/reflection}/__init__.py +0 -0
  435. {orionis-0.316.0/tests/services/parsers → orionis-0.317.0/tests/services/inspection/reflection/mock}/__init__.py +0 -0
  436. {orionis-0.316.0 → orionis-0.317.0}/tests/services/inspection/reflection/mock/fake_reflect_instance.py +0 -0
  437. {orionis-0.316.0 → orionis-0.317.0}/tests/services/inspection/reflection/test_reflection_abstract.py +0 -0
  438. {orionis-0.316.0 → orionis-0.317.0}/tests/services/inspection/reflection/test_reflection_concrete.py +0 -0
  439. {orionis-0.316.0 → orionis-0.317.0}/tests/services/inspection/reflection/test_reflection_instance.py +0 -0
  440. {orionis-0.316.0 → orionis-0.317.0}/tests/services/inspection/reflection/test_reflection_module.py +0 -0
  441. {orionis-0.316.0 → orionis-0.317.0}/tests/services/inspection/test_reflection.py +0 -0
  442. {orionis-0.316.0/tests/services/parsers/mocks → orionis-0.317.0/tests/services/parsers}/__init__.py +0 -0
  443. {orionis-0.316.0/tests/services/path → orionis-0.317.0/tests/services/parsers/mocks}/__init__.py +0 -0
  444. {orionis-0.316.0 → orionis-0.317.0}/tests/services/parsers/mocks/mock_custom_error.py +0 -0
  445. {orionis-0.316.0 → orionis-0.317.0}/tests/services/parsers/test_services_parser_exceptions.py +0 -0
  446. {orionis-0.316.0/tests/services/system → orionis-0.317.0/tests/services/path}/__init__.py +0 -0
  447. {orionis-0.316.0 → orionis-0.317.0}/tests/services/path/test_services_resolver.py +0 -0
  448. {orionis-0.316.0/tests/support → orionis-0.317.0/tests/services/system}/__init__.py +0 -0
  449. {orionis-0.316.0 → orionis-0.317.0}/tests/services/system/test_services_system_imports.py +0 -0
  450. {orionis-0.316.0 → orionis-0.317.0}/tests/services/system/test_services_system_workers.py +0 -0
  451. {orionis-0.316.0/tests/support/standard → orionis-0.317.0/tests/support}/__init__.py +0 -0
  452. {orionis-0.316.0/tests/support/wrapper → orionis-0.317.0/tests/support/standard}/__init__.py +0 -0
  453. {orionis-0.316.0 → orionis-0.317.0}/tests/support/standard/test_services_std.py +0 -0
  454. {orionis-0.316.0/tests/testing → orionis-0.317.0/tests/support/wrapper}/__init__.py +0 -0
  455. {orionis-0.316.0 → orionis-0.317.0}/tests/support/wrapper/test_services_wrapper_docdict.py +0 -0
  456. {orionis-0.316.0 → orionis-0.317.0}/tests/testing/test_testing_result.py +0 -0
  457. {orionis-0.316.0 → orionis-0.317.0}/tests/testing/test_testing_unit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orionis
3
- Version: 0.316.0
3
+ Version: 0.317.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
@@ -1,21 +1,147 @@
1
1
  from typing import Any, Callable
2
+ from orionis.container.entities.binding import Binding
2
3
  from orionis.container.enums.lifetimes import Lifetime
3
4
  from orionis.container.exceptions.container_exception import OrionisContainerException
4
5
  from orionis.container.exceptions.type_error_exception import OrionisContainerTypeError
5
6
  from orionis.services.introspection.abstract.reflection_abstract import ReflectionAbstract
7
+ from orionis.services.introspection.callables.reflection_callable import ReflectionCallable
6
8
  from orionis.services.introspection.concretes.reflection_concrete import ReflectionConcrete
7
9
  from orionis.services.introspection.instances.reflection_instance import ReflectionInstance
8
10
  from orionis.services.introspection.reflection import Reflection
11
+ import inspect
12
+ import threading
9
13
 
10
14
  class Container:
11
15
 
16
+ # Singleton instance of the container.
17
+ # This is a class variable that holds the single instance of the Container class.
18
+ _instance = None
19
+
20
+ # Lock for thread-safe singleton instantiation.
21
+ # This lock ensures that only one thread can create the instance at a time,
22
+ # preventing
23
+ _lock = threading.Lock()
24
+
25
+ # Class variable to track if the container has been initialized.
26
+ # This is used to ensure that the initialization logic runs only once,
27
+ # regardless of how many times the class is instantiated.
28
+ _initialized = False
29
+
30
+ def __new__(cls, *args, **kwargs):
31
+ """
32
+ Creates and returns a singleton instance of the class.
33
+
34
+ This method implements the singleton pattern, ensuring that only one instance
35
+ of the class exists. If an instance does not exist, it acquires a lock to
36
+ ensure thread safety and creates the instance. Subsequent calls return the
37
+ existing instance.
38
+ Parameters
39
+ ----------
40
+ *args : tuple
41
+ Variable length argument list.
42
+ **kwargs : dict
43
+ Arbitrary keyword arguments.
44
+ Returns
45
+ -------
46
+ Container
47
+ The singleton instance of the class.
48
+ """
49
+ if cls._instance is None:
50
+ with cls._lock:
51
+ if cls._instance is None:
52
+ cls._instance = super(Container, cls).__new__(cls)
53
+ return cls._instance
54
+
12
55
  def __init__(self):
13
- self.__transient = {}
14
- self.__singleton = {}
15
- self.__scoped = {}
16
- self.__instance = {}
56
+ """
57
+ Initializes a new instance of the container.
58
+
59
+ This constructor sets up the internal dictionaries for bindings and aliases,
60
+ ensuring that these are only initialized once per class. The initialization
61
+ is guarded by the `_initialized` class attribute to prevent redundant setup.
62
+
63
+ Notes
64
+ -----
65
+ - The `__bindings` dictionary is used to store service bindings.
66
+ - The `__aliasses` dictionary is used to store service aliases.
67
+ - Initialization occurs only once per class, regardless of the number of instances.
68
+ """
69
+ if not self.__class__._initialized:
70
+ self.__bindings = {}
71
+ self.__aliasses = {}
72
+ self.__class__._initialized = True
73
+
74
+ def __dropService(
75
+ self,
76
+ abstract: Callable[..., Any] = None,
77
+ alias: str = None
78
+ ) -> None:
79
+ """
80
+ Drops a service from the container.
81
+
82
+ Parameters
83
+ ----------
84
+ abstract : Callable[..., Any]
85
+ The abstract type or interface to be removed.
86
+ alias : str, optional
87
+ The alias of the service to be removed. If not provided, the service will be removed by its abstract type.
88
+
89
+ Raises
90
+ ------
91
+ OrionisContainerException
92
+ If the service does not exist in the container.
93
+ """
94
+
95
+ # If abstract is provided
96
+ if abstract:
97
+
98
+ # Remove the abstract service from the bindings if it exists
99
+ if abstract in self.__bindings:
100
+ del self.__bindings[abstract]
101
+
102
+ # Remove the default alias (module + class name) from aliases if it exists
103
+ abs_alias = ReflectionAbstract(abstract).getModuleWithClassName()
104
+ if abs_alias in self.__aliasses:
105
+ del self.__aliasses[abs_alias]
17
106
 
18
- def __ensureAliasType(self, value: Any) -> None:
107
+ # If a custom alias is provided
108
+ if alias:
109
+
110
+ # Remove it from the aliases dictionary if it exists
111
+ if alias in self.__aliasses:
112
+ del self.__aliasses[alias]
113
+
114
+ # Remove the binding associated with the alias
115
+ if alias in self.__bindings:
116
+ del self.__bindings[alias]
117
+
118
+ def __ensureIsCallable(
119
+ self,
120
+ value: Any
121
+ ) -> None:
122
+ """
123
+ Ensures that the provided value is callable.
124
+
125
+ Parameters
126
+ ----------
127
+ value : Any
128
+ The value to check.
129
+
130
+ Raises
131
+ ------
132
+ OrionisContainerTypeError
133
+ If the value is not callable.
134
+ """
135
+
136
+ if not callable(value):
137
+ raise OrionisContainerTypeError(
138
+ f"Expected a callable type, but got {type(value).__name__} instead."
139
+ )
140
+
141
+ def __ensureAliasType(
142
+ self,
143
+ value: Any
144
+ ) -> None:
19
145
  """
20
146
  Ensures that the provided value is a valid alias of type str and does not contain invalid characters.
21
147
 
@@ -49,7 +175,11 @@ class Container:
49
175
  "Aliases must not contain whitespace or special symbols."
50
176
  )
51
177
 
52
- def __ensureAbstractClass(self, abstract: Callable[..., Any], lifetime: str) -> None:
178
+ def __ensureAbstractClass(
179
+ self,
180
+ abstract: Callable[..., Any],
181
+ lifetime: str
182
+ ) -> None:
53
183
  """
54
184
  Ensures that the provided abstract is an abstract class.
55
185
 
@@ -72,7 +202,11 @@ class Container:
72
202
  f"Unexpected error registering {lifetime} service: {e}"
73
203
  ) from e
74
204
 
75
- def __ensureConcreteClass(self, concrete: Callable[..., Any], lifetime: str) -> None:
205
+ def __ensureConcreteClass(
206
+ self,
207
+ concrete: Callable[..., Any],
208
+ lifetime: str
209
+ ) -> None:
76
210
  """
77
211
  Ensures that the provided concrete is a concrete (non-abstract) class.
78
212
 
@@ -95,7 +229,11 @@ class Container:
95
229
  f"Unexpected error registering {lifetime} service: {e}"
96
230
  ) from e
97
231
 
98
- def __ensureIsSubclass(self, abstract: Callable[..., Any], concrete: Callable[..., Any]) -> None:
232
+ def __ensureIsSubclass(
233
+ self,
234
+ abstract: Callable[..., Any],
235
+ concrete: Callable[..., Any]
236
+ ) -> None:
99
237
  """
100
238
  Validates that the concrete class is a subclass of the provided abstract class.
101
239
 
@@ -122,7 +260,11 @@ class Container:
122
260
  "Please ensure that the concrete class is a subclass of the specified abstract class."
123
261
  )
124
262
 
125
- def __ensureIsNotSubclass(self, abstract: Callable[..., Any], concrete: Callable[..., Any]) -> None:
263
+ def __ensureIsNotSubclass(
264
+ self,
265
+ abstract: Callable[..., Any],
266
+ concrete: Callable[..., Any]
267
+ ) -> None:
126
268
  """
127
269
  Validates that the concrete class is NOT a subclass of the provided abstract class.
128
270
 
@@ -148,7 +290,10 @@ class Container:
148
290
  "Please ensure that the concrete class is not a subclass of the specified abstract class."
149
291
  )
150
292
 
151
- def __ensureInstance(self, instance: Any) -> None:
293
+ def __ensureInstance(
294
+ self,
295
+ instance: Any
296
+ ) -> None:
152
297
  """
153
298
  Ensures that the provided object is a valid instance.
154
299
 
@@ -175,7 +320,13 @@ class Container:
175
320
  f"Error registering instance: {e}"
176
321
  ) from e
177
322
 
178
- def __ensureImplementation(self, *, abstract: Callable[..., Any] = None, concrete: Callable[..., Any] = None, instance: Any = None) -> None:
323
+ def __ensureImplementation(
324
+ self,
325
+ *,
326
+ abstract: Callable[..., Any] = None,
327
+ concrete: Callable[..., Any] = None,
328
+ instance: Any = None
329
+ ) -> None:
179
330
  """
180
331
  Ensures that a concrete class or instance implements all abstract methods defined in an abstract class.
181
332
 
@@ -229,7 +380,14 @@ class Container:
229
380
  "Please ensure that all abstract methods are implemented."
230
381
  )
231
382
 
232
- def transient(self, abstract: Callable[..., Any], concrete: Callable[..., Any], alias: str = None, enforce_decoupling: bool = False) -> bool:
383
+ def transient(
384
+ self,
385
+ abstract: Callable[..., Any],
386
+ concrete: Callable[..., Any],
387
+ *,
388
+ alias: str = None,
389
+ enforce_decoupling: bool = False
390
+ ) -> bool:
233
391
  """
234
392
  Registers a service with a transient lifetime.
235
393
 
@@ -267,11 +425,12 @@ class Container:
267
425
  # Ensure that concrete is a concrete class
268
426
  self.__ensureConcreteClass(concrete, Lifetime.TRANSIENT)
269
427
 
428
+ # Ensure that concrete is NOT a subclass of abstract
270
429
  if enforce_decoupling:
271
- # Ensure that concrete is NOT a subclass of abstract
272
430
  self.__ensureIsNotSubclass(abstract, concrete)
431
+
432
+ # Validate that concrete is a subclass of abstract
273
433
  else:
274
- # Validate that concrete is a subclass of abstract
275
434
  self.__ensureIsSubclass(abstract, concrete)
276
435
 
277
436
  # Ensure implementation
@@ -284,20 +443,37 @@ class Container:
284
443
  if alias:
285
444
  self.__ensureAliasType(alias)
286
445
 
446
+ # Extract the module and class name for the alias
447
+ else:
448
+ rf_asbtract = ReflectionAbstract(abstract)
449
+ alias = rf_asbtract.getModuleWithClassName()
450
+
451
+ # If the service is already registered, drop it
452
+ self.__dropService(abstract, alias)
453
+
287
454
  # Register the service with transient lifetime
288
- self.__transient[abstract] = concrete
455
+ self.__bindings[abstract] = Binding(
456
+ contract = abstract,
457
+ concrete = concrete,
458
+ lifetime = Lifetime.TRANSIENT,
459
+ enforce_decoupling = enforce_decoupling,
460
+ alias = alias
461
+ )
289
462
 
290
- # If an alias is provided, register it as well
291
- if alias:
292
- self.__transient[alias] = concrete
293
- elif hasattr(abstract, '__name__'):
294
- alias = abstract.__name__
295
- self.__transient[alias] = concrete
463
+ # Register the alias
464
+ self.__aliasses[alias] = self.__bindings[abstract]
296
465
 
297
466
  # Return True to indicate successful registration
298
467
  return True
299
468
 
300
- def singleton(self, abstract: Callable[..., Any], concrete: Callable[..., Any], alias: str = None, enforce_decoupling: bool = False) -> bool:
469
+ def singleton(
470
+ self,
471
+ abstract: Callable[..., Any],
472
+ concrete: Callable[..., Any],
473
+ *,
474
+ alias: str = None,
475
+ enforce_decoupling: bool = False
476
+ ) -> bool:
301
477
  """
302
478
  Registers a service with a singleton lifetime.
303
479
 
@@ -334,11 +510,12 @@ class Container:
334
510
  # Ensure that concrete is a concrete class
335
511
  self.__ensureConcreteClass(concrete, Lifetime.SINGLETON)
336
512
 
513
+ # Ensure that concrete is NOT a subclass of abstract
337
514
  if enforce_decoupling:
338
- # Ensure that concrete is NOT a subclass of abstract
339
515
  self.__ensureIsNotSubclass(abstract, concrete)
516
+
517
+ # Validate that concrete is a subclass of abstract
340
518
  else:
341
- # Validate that concrete is a subclass of abstract
342
519
  self.__ensureIsSubclass(abstract, concrete)
343
520
 
344
521
  # Ensure implementation
@@ -350,21 +527,36 @@ class Container:
350
527
  # Ensure that the alias is a valid string if provided
351
528
  if alias:
352
529
  self.__ensureAliasType(alias)
530
+ else:
531
+ rf_asbtract = ReflectionAbstract(abstract)
532
+ alias = rf_asbtract.getModuleWithClassName()
533
+
534
+ # If the service is already registered, drop it
535
+ self.__dropService(abstract, alias)
353
536
 
354
537
  # Register the service with singleton lifetime
355
- self.__singleton[abstract] = concrete
538
+ self.__bindings[abstract] = Binding(
539
+ contract = abstract,
540
+ concrete = concrete,
541
+ lifetime = Lifetime.SINGLETON,
542
+ enforce_decoupling = enforce_decoupling,
543
+ alias = alias
544
+ )
356
545
 
357
- # If an alias is provided, register it as well
358
- if alias:
359
- self.__singleton[alias] = concrete
360
- elif hasattr(abstract, '__name__'):
361
- alias = abstract.__name__
362
- self.__singleton[alias] = concrete
546
+ # Register the alias
547
+ self.__aliasses[alias] = self.__bindings[abstract]
363
548
 
364
549
  # Return True to indicate successful registration
365
550
  return True
366
551
 
367
- def scoped(self, abstract: Callable[..., Any], concrete: Callable[..., Any], alias: str = None, enforce_decoupling: bool = False) -> bool:
552
+ def scoped(
553
+ self,
554
+ abstract: Callable[..., Any],
555
+ concrete: Callable[..., Any],
556
+ *,
557
+ alias: str = None,
558
+ enforce_decoupling: bool = False
559
+ ) -> bool:
368
560
  """
369
561
  Registers a service with a scoped lifetime.
370
562
 
@@ -401,11 +593,12 @@ class Container:
401
593
  # Ensure that concrete is a concrete class
402
594
  self.__ensureConcreteClass(concrete, Lifetime.SCOPED)
403
595
 
596
+ # Ensure that concrete is NOT a subclass of abstract
404
597
  if enforce_decoupling:
405
- # Ensure that concrete is NOT a subclass of abstract
406
598
  self.__ensureIsNotSubclass(abstract, concrete)
599
+
600
+ # Validate that concrete is a subclass of abstract
407
601
  else:
408
- # Validate that concrete is a subclass of abstract
409
602
  self.__ensureIsSubclass(abstract, concrete)
410
603
 
411
604
  # Ensure implementation
@@ -417,21 +610,36 @@ class Container:
417
610
  # Ensure that the alias is a valid string if provided
418
611
  if alias:
419
612
  self.__ensureAliasType(alias)
613
+ else:
614
+ rf_asbtract = ReflectionAbstract(abstract)
615
+ alias = rf_asbtract.getModuleWithClassName()
616
+
617
+ # If the service is already registered, drop it
618
+ self.__dropService(abstract, alias)
420
619
 
421
620
  # Register the service with scoped lifetime
422
- self.__scoped[abstract] = concrete
621
+ self.__bindings[abstract] = Binding(
622
+ contract = abstract,
623
+ concrete = concrete,
624
+ lifetime = Lifetime.SCOPED,
625
+ enforce_decoupling = enforce_decoupling,
626
+ alias = alias
627
+ )
423
628
 
424
- # If an alias is provided, register it as well
425
- if alias:
426
- self.__scoped[alias] = concrete
427
- elif hasattr(abstract, '__name__'):
428
- alias = abstract.__name__
429
- self.__scoped[alias] = concrete
629
+ # Register the alias
630
+ self.__aliasses[alias] = self.__bindings[abstract]
430
631
 
431
632
  # Return True to indicate successful registration
432
633
  return True
433
634
 
434
- def instance(self, abstract: Callable[..., Any], instance: Any, alias: str = None, enforce_decoupling: bool = False) -> bool:
635
+ def instance(
636
+ self,
637
+ abstract: Callable[..., Any],
638
+ instance: Any,
639
+ *,
640
+ alias: str = None,
641
+ enforce_decoupling: bool = False
642
+ ) -> bool:
435
643
  """
436
644
  Registers an instance of a class or interface in the container.
437
645
  Parameters
@@ -466,11 +674,12 @@ class Container:
466
674
  # Ensure that the instance is a valid instance
467
675
  self.__ensureInstance(instance)
468
676
 
677
+ # Ensure that instance is NOT a subclass of abstract
469
678
  if enforce_decoupling:
470
- # Ensure that instance is NOT a subclass of abstract
471
679
  self.__ensureIsNotSubclass(abstract, instance.__class__)
680
+
681
+ # Validate that instance is a subclass of abstract
472
682
  else:
473
- # Validate that instance is a subclass of abstract
474
683
  self.__ensureIsSubclass(abstract, instance.__class__)
475
684
 
476
685
  # Ensure implementation
@@ -482,19 +691,165 @@ class Container:
482
691
  # Ensure that the alias is a valid string if provided
483
692
  if alias:
484
693
  self.__ensureAliasType(alias)
694
+ else:
695
+ rf_asbtract = ReflectionAbstract(abstract)
696
+ alias = rf_asbtract.getModuleWithClassName()
697
+
698
+ # If the service is already registered, drop it
699
+ self.__dropService(abstract, alias)
485
700
 
486
701
  # Register the instance with the abstract type
487
- self.__instance[abstract] = instance
702
+ self.__bindings[abstract] = Binding(
703
+ contract = abstract,
704
+ instance = instance,
705
+ lifetime = Lifetime.SINGLETON,
706
+ enforce_decoupling = enforce_decoupling,
707
+ alias = alias
708
+ )
488
709
 
489
- # If an alias is provided, register it as well
490
- if alias:
491
- self.__instance[alias] = instance
492
- elif hasattr(abstract, '__name__'):
493
- alias = abstract.__name__
494
- self.__instance[alias] = instance
710
+ # Register the alias
711
+ self.__aliasses[alias] = self.__bindings[abstract]
495
712
 
496
713
  # Return True to indicate successful registration
497
714
  return True
498
715
 
499
- def bind(self, concrete_instance_or_function, lifetime: str = Lifetime.TRANSIENT, alias: str = None) -> None:
500
- pass
716
+ def function(
717
+ self,
718
+ alias: str,
719
+ function: Callable[..., Any],
720
+ *,
721
+ lifetime: Lifetime = Lifetime.TRANSIENT
722
+ ) -> bool:
723
+ """
724
+ Registers a function or factory under a given alias.
725
+
726
+ Parameters
727
+ ----------
728
+ alias : str
729
+ The alias to register the function under.
730
+ function : Callable[..., Any]
731
+ The function or factory to register.
732
+ lifetime : Lifetime, optional
733
+ The lifetime of the function registration (default is TRANSIENT).
734
+
735
+ Returns
736
+ -------
737
+ bool
738
+ True if the function was registered successfully.
739
+
740
+ Raises
741
+ ------
742
+ OrionisContainerTypeError
743
+ If the alias is invalid or the function is not callable.
744
+ OrionisContainerException
745
+ If the lifetime is not allowed for the function signature.
746
+ """
747
+ # Normalize and validate the lifetime parameter
748
+ if not isinstance(lifetime, Lifetime):
749
+ if isinstance(lifetime, str):
750
+ lifetime_key = lifetime.strip().upper()
751
+ if lifetime_key in Lifetime.__members__:
752
+ lifetime = Lifetime[lifetime_key]
753
+ else:
754
+ valid = ', '.join(Lifetime.__members__.keys())
755
+ raise OrionisContainerTypeError(
756
+ f"Invalid lifetime '{lifetime}'. Valid options are: {valid}."
757
+ )
758
+ else:
759
+ raise OrionisContainerTypeError(
760
+ f"Lifetime must be of type str or Lifetime enum, got {type(lifetime).__name__}."
761
+ )
762
+
763
+ # Ensure that the alias is a valid string
764
+ self.__ensureAliasType(alias)
765
+
766
+ # Validate that the function is callable
767
+ self.__ensureIsCallable(function)
768
+
769
+ # Inspect the function signature
770
+ params = ReflectionCallable(function).getDependencies()
771
+
772
+ # If the function requires arguments, only allow TRANSIENT
773
+ if (len(params.resolved) + len(params.unresolved)) > 0 and lifetime != Lifetime.TRANSIENT:
774
+ raise OrionisContainerException(
775
+ "Functions that require arguments can only be registered with a TRANSIENT lifetime."
776
+ )
777
+
778
+ # If the service is already registered, drop it
779
+ self.__dropService(None, alias)
780
+
781
+ # Register the function with the specified alias and lifetime
782
+ self.__bindings[alias] = Binding(
783
+ function=function,
784
+ lifetime=lifetime,
785
+ alias=alias
786
+ )
787
+
788
+ # Register the function as a binding
789
+ self.__aliasses[alias] = self.__bindings[alias]
790
+
791
+ return True
792
+
793
+ def bound(
794
+ self,
795
+ abstract_or_alias: Any,
796
+ ) -> bool:
797
+ """
798
+ Checks if a service (by abstract type or alias) is registered in the container.
799
+
800
+ Parameters
801
+ ----------
802
+ abstract_or_alias : Any
803
+ The abstract class, interface, or alias (str) to check for registration.
804
+
805
+ Returns
806
+ -------
807
+ bool
808
+ True if the service is registered (either as an abstract type or alias), False otherwise.
809
+
810
+ Notes
811
+ -----
812
+ This method allows you to verify whether a service has been registered in the container,
813
+ either by its abstract type or by its alias. It supports both class-based and string-based lookups.
814
+ """
815
+ return (
816
+ abstract_or_alias in self.__bindings
817
+ or abstract_or_alias in self.__aliasses
818
+ )
819
+
820
+ def make(
821
+ self,
822
+ abstract_or_alias: Any,
823
+ *args,
824
+ **kwargs
825
+ ) -> Any:
826
+ """
827
+ Resolves and returns an instance of the requested service.
828
+
829
+ Parameters
830
+ ----------
831
+ abstract_or_alias : Any
832
+ The abstract class, interface, or alias (str) to resolve.
833
+ *args : tuple
834
+ Positional arguments to pass to the constructor of the resolved service.
835
+ **kwargs : dict
836
+ Keyword arguments to pass to the constructor of the resolved service.
837
+
838
+ Returns
839
+ -------
840
+ Any
841
+ An instance of the requested service.
842
+
843
+ Raises
844
+ ------
845
+ OrionisContainerException
846
+ If the requested service is not registered in the container.
847
+ """
848
+ if not self.bound(abstract_or_alias):
849
+ raise OrionisContainerException(
850
+ f"The requested service '{abstract_or_alias}' is not registered in the container."
851
+ )
852
+
853
+ binding = self.__bindings.get(abstract_or_alias) or self.__aliasses.get(abstract_or_alias)
854
+
855
+ print(binding)