orionis 0.253.0__py3-none-any.whl → 0.266.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. orionis/application.py +6 -0
  2. orionis/framework.py +1 -1
  3. orionis/luminate/{application.py → _application.py} +21 -19
  4. orionis/luminate/{container → _container}/container.py +4 -4
  5. orionis/luminate/{container → _container}/container_integrity.py +2 -2
  6. orionis/luminate/{container → _container}/resolve.py +2 -2
  7. orionis/luminate/{contracts → _contracts}/application.py +2 -2
  8. orionis/luminate/{contracts → _contracts}/console/task_manager.py +1 -1
  9. orionis/luminate/{contracts → _contracts}/facades/commands/scheduler_facade.py +1 -1
  10. orionis/luminate/{contracts → _contracts}/facades/facade.py +4 -3
  11. orionis/luminate/{contracts → _contracts}/foundation/providers/service_providers_bootstrapper.py +2 -2
  12. orionis/luminate/{contracts → _contracts}/providers/service_provider.py +1 -1
  13. orionis/luminate/{facades → _facades}/app_facade.py +2 -2
  14. orionis/luminate/{facades → _facades}/commands/commands_facade.py +3 -3
  15. orionis/luminate/{facades → _facades}/commands/scheduler_facade.py +3 -3
  16. orionis/luminate/{facades → _facades}/config/config_facade.py +3 -3
  17. orionis/luminate/{facades → _facades}/environment/environment_facade.py +3 -3
  18. orionis/luminate/{facades → _facades}/files/path_facade.py +4 -4
  19. orionis/luminate/{facades → _facades}/log/log_facade.py +2 -2
  20. orionis/luminate/{foundation → _foundation}/console/command_bootstrapper.py +2 -2
  21. orionis/luminate/{foundation → _foundation}/environment/environment_bootstrapper.py +3 -3
  22. orionis/luminate/{foundation → _foundation/foundation}/config/config_bootstrapper.py +3 -3
  23. orionis/luminate/{foundation → _foundation}/providers/service_providers_bootstrapper.py +4 -4
  24. orionis/luminate/{providers → _providers}/commands/reactor_commands_service_provider.py +7 -7
  25. orionis/luminate/{providers → _providers}/commands/scheduler_provider.py +3 -3
  26. orionis/luminate/{providers → _providers}/config/config_service_provider.py +3 -3
  27. orionis/luminate/{providers → _providers}/environment/environment__service_provider.py +4 -4
  28. orionis/luminate/_providers/files/paths_provider.py +21 -0
  29. orionis/luminate/{providers → _providers}/log/log_service_provider.py +5 -5
  30. orionis/luminate/{providers → _providers}/service_provider.py +2 -2
  31. orionis/luminate/{services_ → _services}/commands/reactor_commands_service.py +3 -3
  32. orionis/luminate/{services_ → _services}/commands/scheduler_service.py +1 -1
  33. orionis/luminate/{services_ → _services}/config/config_service.py +1 -1
  34. orionis/luminate/{services_ → _services}/log/log_service.py +1 -1
  35. orionis/luminate/app.py +19 -0
  36. orionis/luminate/console/base/command.py +1 -1
  37. orionis/luminate/console/command_filter.py +1 -1
  38. orionis/luminate/console/commands/help.py +1 -1
  39. orionis/luminate/console/commands/schedule_work.py +2 -2
  40. orionis/luminate/console/dumper/dump_die.py +1 -1
  41. orionis/luminate/console/kernel.py +1 -1
  42. orionis/luminate/console/output/console.py +3 -3
  43. orionis/luminate/console/output/executor.py +1 -1
  44. orionis/luminate/console/output/progress_bar.py +1 -1
  45. orionis/luminate/console/parser.py +1 -1
  46. orionis/luminate/{config → foundation/config}/app/entities/app.py +44 -43
  47. orionis/luminate/{config → foundation/config}/auth/entities/auth.py +9 -1
  48. orionis/luminate/foundation/config/cache/entities/cache.py +74 -0
  49. orionis/luminate/foundation/config/cache/entities/file.py +46 -0
  50. orionis/luminate/foundation/config/cache/entities/stores.py +46 -0
  51. orionis/luminate/{contracts/config → foundation/config/contracts}/config.py +8 -12
  52. orionis/luminate/foundation/config/cors/entities/cors.py +129 -0
  53. orionis/luminate/foundation/config/database/entities/connections.py +89 -0
  54. orionis/luminate/foundation/config/database/entities/database.py +62 -0
  55. orionis/luminate/foundation/config/database/entities/mysql.py +270 -0
  56. orionis/luminate/foundation/config/database/entities/oracle.py +227 -0
  57. orionis/luminate/foundation/config/database/entities/pgsql.py +189 -0
  58. orionis/luminate/foundation/config/database/entities/sqlite.py +178 -0
  59. orionis/luminate/foundation/config/database/enums/mysql_charsets.py +92 -0
  60. orionis/luminate/foundation/config/database/enums/mysql_collations.py +53 -0
  61. orionis/luminate/foundation/config/database/enums/mysql_engine.py +18 -0
  62. orionis/luminate/foundation/config/database/enums/oracle_encoding.py +44 -0
  63. orionis/luminate/foundation/config/database/enums/oracle_nencoding.py +31 -0
  64. orionis/luminate/foundation/config/database/enums/pgsql_charsets.py +90 -0
  65. orionis/luminate/foundation/config/database/enums/pgsql_collations.py +26 -0
  66. orionis/luminate/foundation/config/database/enums/pgsql_mode.py +24 -0
  67. orionis/luminate/foundation/config/database/enums/sqlite_foreign_key.py +12 -0
  68. orionis/luminate/foundation/config/database/enums/sqlite_journal.py +22 -0
  69. orionis/luminate/foundation/config/database/enums/sqlite_synchronous.py +16 -0
  70. orionis/luminate/foundation/config/filesystems/entitites/aws.py +134 -0
  71. orionis/luminate/foundation/config/filesystems/entitites/disks.py +68 -0
  72. orionis/luminate/foundation/config/filesystems/entitites/filesystems.py +53 -0
  73. orionis/luminate/foundation/config/filesystems/entitites/local.py +39 -0
  74. orionis/luminate/foundation/config/filesystems/entitites/public.py +52 -0
  75. orionis/luminate/foundation/config/logging/entities/channels.py +115 -0
  76. orionis/luminate/foundation/config/logging/entities/chunked.py +128 -0
  77. orionis/luminate/foundation/config/logging/entities/daily.py +113 -0
  78. orionis/luminate/foundation/config/logging/entities/hourly.py +100 -0
  79. orionis/luminate/foundation/config/logging/entities/logging.py +51 -0
  80. orionis/luminate/foundation/config/logging/entities/monthly.py +100 -0
  81. orionis/luminate/foundation/config/logging/entities/stack.py +74 -0
  82. orionis/luminate/foundation/config/logging/entities/weekly.py +102 -0
  83. orionis/luminate/foundation/config/logging/enums/levels.py +21 -0
  84. orionis/luminate/foundation/config/mail/entities/file.py +41 -0
  85. orionis/luminate/foundation/config/mail/entities/mail.py +56 -0
  86. orionis/luminate/foundation/config/mail/entities/mailers.py +54 -0
  87. orionis/luminate/foundation/config/mail/entities/smtp.py +104 -0
  88. orionis/luminate/foundation/config/queue/entities/brokers.py +55 -0
  89. orionis/luminate/foundation/config/queue/entities/database.py +107 -0
  90. orionis/luminate/foundation/config/queue/entities/queue.py +47 -0
  91. orionis/luminate/foundation/config/queue/enums/strategy.py +15 -0
  92. orionis/luminate/foundation/config/roots/paths.py +446 -0
  93. orionis/luminate/foundation/config/session/entities/session.py +147 -0
  94. orionis/luminate/foundation/config/session/enums/same_site_policy.py +14 -0
  95. orionis/luminate/foundation/config/session/helpers/secret_key.py +16 -0
  96. orionis/luminate/foundation/config/startup.py +203 -0
  97. orionis/luminate/foundation/config/testing/entities/__init__.py +0 -0
  98. orionis/luminate/{config → foundation/config/testing}/entities/testing.py +36 -20
  99. orionis/luminate/foundation/config/testing/enums/__init__.py +0 -0
  100. orionis/luminate/foundation/config/testing/enums/test_mode.py +12 -0
  101. orionis/luminate/patterns/__init__.py +0 -4
  102. orionis/luminate/patterns/singleton/__init__.py +0 -10
  103. orionis/luminate/services/asynchrony/__init__.py +0 -0
  104. orionis/luminate/services/asynchrony/async_io.py +31 -0
  105. orionis/luminate/services/environment/__init__.py +0 -10
  106. orionis/luminate/services/environment/contracts/__init__.py +0 -5
  107. orionis/luminate/services/environment/contracts/env.py +0 -11
  108. orionis/luminate/services/environment/dot_env.py +87 -163
  109. orionis/luminate/services/environment/env.py +0 -11
  110. orionis/luminate/services/introspection/__init__.py +0 -0
  111. orionis/luminate/services/introspection/abstracts/__init__.py +0 -0
  112. orionis/luminate/services/introspection/abstracts/entities/__init__.py +0 -0
  113. orionis/luminate/services/introspection/abstracts/entities/abstract_class_attributes.py +37 -0
  114. orionis/luminate/{support → services}/introspection/abstracts/reflect_abstract.py +1 -1
  115. orionis/luminate/services/introspection/dependencies/__init__.py +0 -0
  116. orionis/luminate/services/introspection/dependencies/contracts/__init__.py +0 -0
  117. orionis/luminate/{support → services}/introspection/dependencies/contracts/reflect_dependencies.py +2 -2
  118. orionis/luminate/services/introspection/dependencies/entities/__init__.py +0 -0
  119. orionis/luminate/services/introspection/dependencies/entities/class_dependencies.py +41 -0
  120. orionis/luminate/services/introspection/dependencies/entities/method_dependencies.py +42 -0
  121. orionis/luminate/services/introspection/dependencies/entities/resolved_dependencies.py +49 -0
  122. orionis/luminate/{support → services}/introspection/dependencies/reflect_dependencies.py +4 -4
  123. orionis/luminate/services/parsers/__init__.py +0 -0
  124. orionis/luminate/services/parsers/contracts/__init__.py +0 -0
  125. orionis/luminate/{support/parsers/exception_parser.py → services/parsers/exception.py} +1 -1
  126. orionis/luminate/services/parsers/serializer.py +15 -0
  127. orionis/luminate/services/paths/__init__.py +0 -9
  128. orionis/luminate/services/paths/resolver.py +1 -1
  129. orionis/luminate/services/standard/__init__.py +0 -0
  130. orionis/luminate/services/standard/contracts/__init__.py +0 -0
  131. orionis/luminate/{support → services}/standard/std.py +1 -1
  132. orionis/luminate/services/system/__init__.py +0 -0
  133. orionis/luminate/services/system/contracts/__init__.py +0 -0
  134. orionis/luminate/services/system/contracts/imports.py +31 -0
  135. orionis/luminate/services/system/contracts/workers.py +18 -0
  136. orionis/luminate/services/system/imports.py +124 -0
  137. orionis/luminate/services/system/runtime_imports.py +70 -0
  138. orionis/luminate/services/{workers/maximum_workers.py → system/workers.py} +2 -1
  139. orionis/luminate/services/wrapper/__init__.py +0 -0
  140. orionis/luminate/services/wrapper/dicts/__init__.py +0 -0
  141. orionis/luminate/services/wrapper/dicts/dot_dict.py +115 -0
  142. orionis/luminate/support/introspection/__init__.py +0 -5
  143. orionis/luminate/support/introspection/container_integrity.py +2 -2
  144. orionis/luminate/support/introspection/instances/__init__.py +0 -5
  145. orionis/luminate/support/introspection/reflection.py +1 -1
  146. orionis/luminate/test/__init__.py +0 -23
  147. orionis/luminate/test/cases/test_async.py +41 -9
  148. orionis/luminate/test/cases/test_case.py +27 -13
  149. orionis/luminate/test/cases/test_sync.py +28 -6
  150. orionis/luminate/test/output/contracts/{test_std_out.py → dumper.py} +2 -1
  151. orionis/luminate/test/output/{test_std_out.py → dumper.py} +7 -4
  152. orionis/luminate/test/suites/__init__.py +0 -0
  153. orionis/luminate/test/suites/contracts/__init__.py +0 -0
  154. orionis/luminate/test/suites/contracts/test_suite.py +23 -0
  155. orionis/luminate/test/suites/test_suite.py +101 -0
  156. orionis/luminate/test/{core → suites}/test_unit.py +16 -8
  157. orionis/unittesting.py +43 -0
  158. {orionis-0.253.0.dist-info → orionis-0.266.0.dist-info}/METADATA +19 -3
  159. orionis-0.266.0.dist-info/RECORD +440 -0
  160. {orionis-0.253.0.dist-info → orionis-0.266.0.dist-info}/WHEEL +1 -1
  161. orionis-0.266.0.dist-info/entry_points.txt +2 -0
  162. orionis-0.266.0.dist-info/zip-safe +1 -0
  163. tests/example/test_example.py +1 -1
  164. tests/foundation/__init__.py +0 -0
  165. tests/foundation/config/__init__.py +0 -0
  166. tests/foundation/config/app/__init__.py +0 -0
  167. tests/foundation/config/app/test_app.py +140 -0
  168. tests/foundation/config/auth/__init__.py +0 -0
  169. tests/{config → foundation/config/auth}/test_auth.py +6 -3
  170. tests/foundation/config/cache/__init__.py +0 -0
  171. tests/foundation/config/cache/test_cache.py +98 -0
  172. tests/foundation/config/cache/test_cache_file.py +78 -0
  173. tests/foundation/config/cache/test_cache_stores.py +88 -0
  174. tests/foundation/config/cors/__init__.py +0 -0
  175. tests/foundation/config/cors/test_cors.py +121 -0
  176. tests/foundation/config/database/__init__.py +0 -0
  177. tests/foundation/config/database/test_database.py +108 -0
  178. tests/foundation/config/database/test_database_connections.py +129 -0
  179. tests/foundation/config/database/test_database_mysql.py +231 -0
  180. tests/foundation/config/database/test_database_oracle.py +204 -0
  181. tests/foundation/config/database/test_database_pgsql.py +187 -0
  182. tests/foundation/config/database/test_database_sqlite.py +153 -0
  183. tests/foundation/config/exceptions/__init__.py +0 -0
  184. tests/foundation/config/exceptions/test_exceptions_integrity.py +83 -0
  185. tests/foundation/config/filesystems/__init__.py +0 -0
  186. tests/foundation/config/filesystems/test_filesystems.py +110 -0
  187. tests/foundation/config/filesystems/test_filesystems_aws.py +133 -0
  188. tests/foundation/config/filesystems/test_filesystems_disks.py +114 -0
  189. tests/foundation/config/filesystems/test_filesystems_local.py +95 -0
  190. tests/foundation/config/filesystems/test_filesystems_public.py +120 -0
  191. tests/foundation/config/logging/__init__.py +0 -0
  192. tests/foundation/config/logging/test_logging.py +48 -0
  193. tests/foundation/config/logging/test_logging_channels.py +157 -0
  194. tests/foundation/config/logging/test_logging_chunked.py +166 -0
  195. tests/foundation/config/logging/test_logging_daily.py +153 -0
  196. tests/foundation/config/logging/test_logging_hourly.py +131 -0
  197. tests/foundation/config/logging/test_logging_monthly.py +133 -0
  198. tests/foundation/config/logging/test_logging_stack.py +124 -0
  199. tests/foundation/config/logging/test_logging_weekly.py +133 -0
  200. tests/foundation/config/mail/__init__.py +0 -0
  201. tests/foundation/config/mail/test_mail.py +73 -0
  202. tests/foundation/config/mail/test_mail_file.py +61 -0
  203. tests/foundation/config/mail/test_mail_mailers.py +58 -0
  204. tests/foundation/config/mail/test_mail_smtp.py +102 -0
  205. tests/foundation/config/queue/__init__.py +0 -0
  206. tests/foundation/config/queue/test_queue.py +58 -0
  207. tests/foundation/config/queue/test_queue_brokers.py +67 -0
  208. tests/foundation/config/queue/test_queue_database.py +95 -0
  209. tests/foundation/config/root/__init__.py +0 -0
  210. tests/foundation/config/root/test_root_paths.py +134 -0
  211. tests/foundation/config/session/__init__.py +0 -0
  212. tests/foundation/config/session/test_session.py +138 -0
  213. tests/foundation/config/startup/__init__.py +0 -0
  214. tests/foundation/config/startup/test_config_startup.py +134 -0
  215. tests/foundation/config/testing/__init__.py +0 -0
  216. tests/foundation/config/testing/test_testing.py +167 -0
  217. tests/patterns/singleton/test_singleton.py +2 -2
  218. tests/services/asynchrony/__init__.py +0 -0
  219. tests/{support/async_io/test_async_coroutine.py → services/asynchrony/test_async_io.py} +6 -5
  220. tests/services/environment/test_env.py +155 -33
  221. tests/services/inspection/__init__.py +0 -0
  222. tests/services/inspection/dependencies/__init__.py +0 -0
  223. tests/services/inspection/dependencies/mocks/__init__.py +0 -0
  224. tests/services/inspection/dependencies/mocks/mock_user.py +30 -0
  225. tests/services/inspection/dependencies/mocks/mock_user_controller.py +27 -0
  226. tests/services/inspection/dependencies/mocks/mock_users_permissions.py +41 -0
  227. tests/services/inspection/dependencies/test_reflect_dependencies.py +94 -0
  228. tests/services/parsers/__init__.py +0 -0
  229. tests/services/parsers/mocks/__init__.py +0 -0
  230. tests/services/parsers/mocks/mock_custom_error.py +15 -0
  231. tests/{support → services}/parsers/test_exception_parser.py +8 -8
  232. tests/services/path/__init__.py +0 -0
  233. tests/services/path/test_resolver.py +73 -0
  234. tests/services/standard/__init__.py +0 -0
  235. tests/services/standard/test_std.py +127 -0
  236. tests/services/wrapper/__init__.py +0 -0
  237. tests/services/wrapper/test_wrapper_doc_dict.py +129 -0
  238. tests/testing/__init__.py +0 -0
  239. tests/testing/test_testing_result.py +92 -0
  240. tests/testing/test_testing_unit.py +138 -0
  241. orionis/luminate/config/app/__init__.py +0 -10
  242. orionis/luminate/config/auth/__init__.py +0 -7
  243. orionis/luminate/config/cache/__init__.py +0 -9
  244. orionis/luminate/config/cache/entities/cache.py +0 -58
  245. orionis/luminate/config/cache/entities/file.py +0 -29
  246. orionis/luminate/config/cache/entities/stores.py +0 -35
  247. orionis/luminate/config/entities/cors.py +0 -58
  248. orionis/luminate/config/entities/database.py +0 -204
  249. orionis/luminate/config/entities/filesystems.py +0 -98
  250. orionis/luminate/config/entities/logging.py +0 -157
  251. orionis/luminate/config/entities/mail.py +0 -76
  252. orionis/luminate/config/entities/queue.py +0 -62
  253. orionis/luminate/config/entities/session.py +0 -58
  254. orionis/luminate/providers/files/paths_provider.py +0 -20
  255. orionis/luminate/services/workers/__init__.py +0 -10
  256. orionis/luminate/support/adapters/dot_dict.py +0 -29
  257. orionis/luminate/support/asynchrony/async_io.py +0 -40
  258. orionis/luminate/support/asynchrony/contracts/async_coroutine.py +0 -26
  259. orionis/luminate/support/introspection/abstracts/entities/abstract_class_attributes.py +0 -11
  260. orionis/luminate/support/introspection/dependencies/__init__.py +0 -5
  261. orionis/luminate/support/introspection/dependencies/entities/class_dependencies.py +0 -11
  262. orionis/luminate/support/introspection/dependencies/entities/method_dependencies.py +0 -11
  263. orionis/luminate/support/introspection/dependencies/entities/resolved_dependencies.py +0 -12
  264. orionis/luminate/support/paths/contracts/resolver.py +0 -67
  265. orionis/luminate/support/paths/resolver.py +0 -83
  266. orionis/luminate/test/core/contracts/test_suite.py +0 -30
  267. orionis/luminate/test/core/test_suite.py +0 -93
  268. orionis-0.253.0.dist-info/RECORD +0 -318
  269. orionis-0.253.0.dist-info/entry_points.txt +0 -2
  270. tests/config/test_app.py +0 -122
  271. tests/config/test_cache.py +0 -20
  272. tests/support/adapters/fakes/fake_dict.py +0 -15
  273. tests/support/adapters/test_doct_dict.py +0 -21
  274. tests/support/inspection/fakes/fake_reflect_dependencies.py +0 -25
  275. tests/support/inspection/test_reflect_dependencies.py +0 -67
  276. tests/support/parsers/fakes/fake_custom_error.py +0 -27
  277. tests/support/path/test_resolver.py +0 -33
  278. tests/support/standard/test_std.py +0 -62
  279. /orionis/{console.py → clinstall.py} +0 -0
  280. /orionis/luminate/{config → _container}/__init__.py +0 -0
  281. /orionis/luminate/{container → _container}/exception.py +0 -0
  282. /orionis/luminate/{container → _container}/lifetimes.py +0 -0
  283. /orionis/luminate/{config/app/entities → _contracts}/__init__.py +0 -0
  284. /orionis/luminate/{config/app/enums → _contracts/config}/__init__.py +0 -0
  285. /orionis/luminate/{config/contracts → _contracts/config}/config.py +0 -0
  286. /orionis/luminate/{config/auth/entities → _contracts/console}/__init__.py +0 -0
  287. /orionis/luminate/{config/cache/entities → _contracts/console/base}/__init__.py +0 -0
  288. /orionis/luminate/{contracts → _contracts}/console/base/command.py +0 -0
  289. /orionis/luminate/{contracts → _contracts}/console/command_filter.py +0 -0
  290. /orionis/luminate/{contracts → _contracts}/console/kernel.py +0 -0
  291. /orionis/luminate/{config/cache/enums → _contracts/console/output}/__init__.py +0 -0
  292. /orionis/luminate/{contracts → _contracts}/console/output/console.py +0 -0
  293. /orionis/luminate/{contracts → _contracts}/console/output/executor.py +0 -0
  294. /orionis/luminate/{contracts → _contracts}/console/output/progress_bar.py +0 -0
  295. /orionis/luminate/{contracts → _contracts}/console/parser.py +0 -0
  296. /orionis/luminate/{contracts → _contracts}/container/container.py +0 -0
  297. /orionis/luminate/{contracts → _contracts}/container/container_integrity.py +0 -0
  298. /orionis/luminate/{config/contracts → _contracts/facades}/__init__.py +0 -0
  299. /orionis/luminate/{config/exceptions → _contracts/facades/commands}/__init__.py +0 -0
  300. /orionis/luminate/{contracts → _contracts}/facades/commands/commands_facade.py +0 -0
  301. /orionis/luminate/{container → _contracts/facades/config}/__init__.py +0 -0
  302. /orionis/luminate/{contracts → _contracts}/facades/config/config_facade.py +0 -0
  303. /orionis/luminate/{contracts → _contracts/facades/environment}/__init__.py +0 -0
  304. /orionis/luminate/{contracts → _contracts}/facades/environment/environment_facade.py +0 -0
  305. /orionis/luminate/{contracts/config → _contracts/facades/files}/__init__.py +0 -0
  306. /orionis/luminate/{contracts → _contracts}/facades/files/path_facade.py +0 -0
  307. /orionis/luminate/{contracts/console → _contracts/facades/log}/__init__.py +0 -0
  308. /orionis/luminate/{contracts → _contracts}/facades/log/log_facade.py +0 -0
  309. /orionis/luminate/{contracts/console/base → _contracts/facades/tests}/__init__.py +0 -0
  310. /orionis/luminate/{contracts → _contracts}/facades/tests/tests_facade.py +0 -0
  311. /orionis/luminate/{contracts/console/output → _contracts/foundation}/__init__.py +0 -0
  312. /orionis/luminate/{contracts → _contracts}/foundation/bootstraper.py +0 -0
  313. /orionis/luminate/{contracts/facades → _contracts/foundation/config}/__init__.py +0 -0
  314. /orionis/luminate/{contracts → _contracts}/foundation/config/config_bootstrapper.py +0 -0
  315. /orionis/luminate/{contracts/facades/commands → _contracts/foundation/console}/__init__.py +0 -0
  316. /orionis/luminate/{contracts → _contracts}/foundation/console/command_bootstrapper.py +0 -0
  317. /orionis/luminate/{contracts/facades/config → _contracts/foundation/environment}/__init__.py +0 -0
  318. /orionis/luminate/{contracts → _contracts}/foundation/environment/environment_bootstrapper.py +0 -0
  319. /orionis/luminate/{contracts/facades/environment → _contracts/foundation/providers}/__init__.py +0 -0
  320. /orionis/luminate/{contracts/facades/files → _contracts/providers}/__init__.py +0 -0
  321. /orionis/luminate/{contracts/facades/log → _contracts/services}/__init__.py +0 -0
  322. /orionis/luminate/{contracts/facades/tests → _contracts/services/commands}/__init__.py +0 -0
  323. /orionis/luminate/{contracts → _contracts}/services/commands/reactor_commands_service.py +0 -0
  324. /orionis/luminate/{contracts → _contracts}/services/commands/schedule_service.py +0 -0
  325. /orionis/luminate/{contracts/foundation → _contracts/services/config}/__init__.py +0 -0
  326. /orionis/luminate/{contracts → _contracts}/services/config/config_service.py +0 -0
  327. /orionis/luminate/{contracts/foundation/config → _contracts/services/environment}/__init__.py +0 -0
  328. /orionis/luminate/{contracts → _contracts}/services/environment/environment_service.py +0 -0
  329. /orionis/luminate/{contracts/foundation/console → _contracts/services/files}/__init__.py +0 -0
  330. /orionis/luminate/{contracts → _contracts}/services/files/path_resolver_service.py +0 -0
  331. /orionis/luminate/{contracts/foundation/environment → _contracts/services/log}/__init__.py +0 -0
  332. /orionis/luminate/{contracts → _contracts}/services/log/log_service.py +0 -0
  333. /orionis/luminate/{contracts → _contracts}/support/exception_parse.py +0 -0
  334. /orionis/luminate/{contracts → _contracts}/support/reflection.py +0 -0
  335. /orionis/luminate/{contracts/foundation/providers → _facades}/__init__.py +0 -0
  336. /orionis/luminate/{contracts/providers → _facades/commands}/__init__.py +0 -0
  337. /orionis/luminate/{contracts/services → _facades/config}/__init__.py +0 -0
  338. /orionis/luminate/{contracts/services/commands → _facades/environment}/__init__.py +0 -0
  339. /orionis/luminate/{contracts/services/config → _facades/files}/__init__.py +0 -0
  340. /orionis/luminate/{contracts/services/environment → _facades/log}/__init__.py +0 -0
  341. /orionis/luminate/{contracts/services/files → _foundation}/__init__.py +0 -0
  342. /orionis/luminate/{contracts/services/log → _foundation/console}/__init__.py +0 -0
  343. /orionis/luminate/{facades → _foundation/environment}/__init__.py +0 -0
  344. /orionis/luminate/{facades/commands → _foundation/exceptions}/__init__.py +0 -0
  345. /orionis/luminate/{foundation → _foundation}/exceptions/exception_bootstrapper.py +0 -0
  346. /orionis/luminate/{foundation → _foundation}/exceptions/exception_providers.py +0 -0
  347. /orionis/luminate/{facades → _foundation/foundation}/config/__init__.py +0 -0
  348. /orionis/luminate/{facades/environment → _foundation/providers}/__init__.py +0 -0
  349. /orionis/luminate/{facades/files → _providers}/__init__.py +0 -0
  350. /orionis/luminate/{facades/log → _providers/commands}/__init__.py +0 -0
  351. /orionis/luminate/{foundation/console → _providers/config}/__init__.py +0 -0
  352. /orionis/luminate/{foundation → _providers}/environment/__init__.py +0 -0
  353. /orionis/luminate/{foundation/exceptions → _providers/files}/__init__.py +0 -0
  354. /orionis/luminate/{foundation/providers → _providers/log}/__init__.py +0 -0
  355. /orionis/luminate/{providers → _services}/__init__.py +0 -0
  356. /orionis/luminate/{providers → _services}/commands/__init__.py +0 -0
  357. /orionis/luminate/{providers → _services}/config/__init__.py +0 -0
  358. /orionis/luminate/{providers/environment → _services/log}/__init__.py +0 -0
  359. /orionis/luminate/{providers/files → foundation/config/app}/__init__.py +0 -0
  360. /orionis/luminate/{providers/log → foundation/config/app/entities}/__init__.py +0 -0
  361. /orionis/luminate/{services_ → foundation/config/app/enums}/__init__.py +0 -0
  362. /orionis/luminate/{config → foundation/config}/app/enums/ciphers.py +0 -0
  363. /orionis/luminate/{config → foundation/config}/app/enums/environments.py +0 -0
  364. /orionis/luminate/{services_/commands → foundation/config/auth}/__init__.py +0 -0
  365. /orionis/luminate/{services_/config → foundation/config/auth/entities}/__init__.py +0 -0
  366. /orionis/luminate/{services_/log → foundation/config/cache}/__init__.py +0 -0
  367. /orionis/luminate/{support/adapters → foundation/config/cache/entities}/__init__.py +0 -0
  368. /orionis/luminate/{support/asynchrony → foundation/config/cache/enums}/__init__.py +0 -0
  369. /orionis/luminate/{config → foundation/config}/cache/enums/drivers.py +0 -0
  370. /orionis/luminate/{support/asynchrony → foundation/config}/contracts/__init__.py +0 -0
  371. /orionis/luminate/{support/introspection/abstracts → foundation/config/cors}/__init__.py +0 -0
  372. /orionis/luminate/{support/introspection/abstracts → foundation/config/cors}/entities/__init__.py +0 -0
  373. /orionis/luminate/{support/introspection/dependencies/contracts → foundation/config/database}/__init__.py +0 -0
  374. /orionis/luminate/{support/introspection/dependencies → foundation/config/database}/entities/__init__.py +0 -0
  375. /orionis/luminate/{support/parsers → foundation/config/database/enums}/__init__.py +0 -0
  376. /orionis/luminate/{support/parsers/contracts → foundation/config/exceptions}/__init__.py +0 -0
  377. /orionis/luminate/{config/exceptions/integrity_exception.py → foundation/config/exceptions/integrity.py} +0 -0
  378. /orionis/luminate/{support/paths → foundation/config/filesystems}/__init__.py +0 -0
  379. /orionis/luminate/{support/paths/contracts → foundation/config/filesystems/entitites}/__init__.py +0 -0
  380. /orionis/luminate/{support/standard → foundation/config/logging}/__init__.py +0 -0
  381. /orionis/luminate/{support/standard/contracts → foundation/config/logging/entities}/__init__.py +0 -0
  382. /orionis/luminate/{test/core → foundation/config/logging/enums}/__init__.py +0 -0
  383. /orionis/luminate/{test/core/contracts → foundation/config/mail}/__init__.py +0 -0
  384. {tests/config → orionis/luminate/foundation/config/mail/entities}/__init__.py +0 -0
  385. {tests/support/adapters → orionis/luminate/foundation/config/queue}/__init__.py +0 -0
  386. {tests/support/adapters/fakes → orionis/luminate/foundation/config/queue/entities}/__init__.py +0 -0
  387. {tests/support/async_io → orionis/luminate/foundation/config/roots}/__init__.py +0 -0
  388. {tests/support/parsers → orionis/luminate/foundation/config/session}/__init__.py +0 -0
  389. {tests/support/parsers/fakes → orionis/luminate/foundation/config/session/entities}/__init__.py +0 -0
  390. {tests/support/path → orionis/luminate/foundation/config/session/enums}/__init__.py +0 -0
  391. {tests/support/standard → orionis/luminate/foundation/config/testing}/__init__.py +0 -0
  392. /orionis/luminate/{support → services}/parsers/contracts/exception_parser.py +0 -0
  393. /orionis/luminate/{support → services}/standard/contracts/std.py +0 -0
  394. /orionis/luminate/test/exceptions/{test_exception.py → test_failure_exception.py} +0 -0
  395. /orionis/luminate/test/{core → suites}/contracts/test_unit.py +0 -0
  396. {orionis-0.253.0.dist-info → orionis-0.266.0.dist-info/licenses}/LICENCE +0 -0
  397. {orionis-0.253.0.dist-info → orionis-0.266.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,62 @@
1
+ from dataclasses import asdict, dataclass, field, fields
2
+ from orionis.luminate.foundation.config.database.entities.connections import Connections
3
+ from orionis.luminate.services.environment.env import Env
4
+ from orionis.luminate.foundation.config.exceptions.integrity import OrionisIntegrityException
5
+
6
+ @dataclass(unsafe_hash=True, kw_only=True)
7
+ class Database:
8
+ """
9
+ Data class to represent the general database configuration.
10
+
11
+ Attributes
12
+ ----------
13
+ default : str
14
+ The name of the default database connection to use.
15
+ connections : Connections
16
+ The different database connections available to the application.
17
+ """
18
+ default: str = field(
19
+ default_factory=lambda: Env.get("DB_CONNECTION", "sqlite"),
20
+ metadata={
21
+ "description": "Default database connection name",
22
+ "default": "sqlite"
23
+ }
24
+ )
25
+
26
+ connections: Connections = field(
27
+ default_factory=Connections,
28
+ metadata={
29
+ "description": "Database connections",
30
+ "default": "Connections()"
31
+ }
32
+ )
33
+
34
+ def __post_init__(self):
35
+ """
36
+ Post-initialization method for validating and normalizing the 'default' and 'connections' attributes.
37
+ Validates that the 'default' attribute is either a valid string corresponding to a member of DatabaseConnections
38
+ or an instance of DatabaseConnections. If 'default' is a valid string, it is converted to its corresponding value.
39
+ If 'default' is not valid, raises an OrionisIntegrityException.
40
+ Also ensures that the 'connections' attribute is an instance of Connections and is not empty.
41
+ Raises an OrionisIntegrityException if the validation fails.
42
+ """
43
+
44
+ # Validate default attribute
45
+ options = [field.name for field in fields(Connections)]
46
+ if isinstance(self.default, str):
47
+ if self.default not in options:
48
+ raise OrionisIntegrityException(f"The 'default' attribute must be one of {str(options)}.")
49
+ else:
50
+ raise OrionisIntegrityException(f"The 'default' attribute cannot be empty. Options are: {str(options)}")
51
+
52
+ # Validate connections attribute
53
+ if not self.connections or not isinstance(self.connections, Connections):
54
+ raise OrionisIntegrityException("The 'connections' attribute must be of type Connections.")
55
+
56
+ def toDict(self) -> dict:
57
+ """
58
+ Convert the object to a dictionary representation.
59
+ Returns:
60
+ dict: A dictionary representation of the Dataclass object.
61
+ """
62
+ return asdict(self)
@@ -0,0 +1,270 @@
1
+ from dataclasses import asdict, dataclass, field
2
+ from typing import Optional
3
+ from orionis.luminate.foundation.config.database.enums.mysql_charsets import MySQLCharset
4
+ from orionis.luminate.foundation.config.database.enums.mysql_collations import MySQLCollation
5
+ from orionis.luminate.foundation.config.database.enums.mysql_engine import MySQLEngine
6
+ from orionis.luminate.foundation.config.exceptions.integrity import OrionisIntegrityException
7
+ from orionis.luminate.services.environment.env import Env
8
+
9
+ @dataclass(unsafe_hash=True, kw_only=True)
10
+ class MySQL:
11
+ """
12
+ Data class to represent the MySQL database configuration.
13
+
14
+ Attributes
15
+ ----------
16
+ driver : str
17
+ The database driver being used, e.g., 'mysql'.
18
+ host : str
19
+ The host address for the MySQL server.
20
+ port : str
21
+ The port for connecting to the MySQL server.
22
+ database : str
23
+ The name of the MySQL database.
24
+ username : str
25
+ The username for connecting to the MySQL database.
26
+ password : str
27
+ The password for the MySQL database.
28
+ unix_socket : str
29
+ The path to the Unix socket for MySQL connections (optional).
30
+ charset : str
31
+ The charset used for the connection.
32
+ collation : str
33
+ The collation for the database.
34
+ prefix : str
35
+ Prefix for table names.
36
+ prefix_indexes : bool
37
+ Whether to prefix index names.
38
+ strict : bool
39
+ Whether to enforce strict SQL mode.
40
+ engine : Optional[str]
41
+ The storage engine for the MySQL database (optional).
42
+ """
43
+
44
+ driver: str = field(
45
+ default="mysql",
46
+ metadata={
47
+ "description": "The database driver being used.",
48
+ "default": "mysql",
49
+ }
50
+ )
51
+
52
+ host: str = field(
53
+ default_factory=lambda: Env.get("DB_HOST", "127.0.0.1"),
54
+ metadata={
55
+ "description": "The host address for the MySQL server.",
56
+ "default": "127.0.0.1",
57
+ }
58
+ )
59
+
60
+ port: int = field(
61
+ default_factory=lambda: Env.get("DB_PORT", 3306),
62
+ metadata={
63
+ "description": "The port for connecting to the MySQL server.",
64
+ "default": 3306,
65
+ }
66
+ )
67
+
68
+ database: str = field(
69
+ default_factory=lambda: Env.get("DB_DATABASE", "orionis"),
70
+ metadata={
71
+ "description": "The name of the MySQL database.",
72
+ "default": "orionis",
73
+ }
74
+ )
75
+
76
+ username: str = field(
77
+ default_factory=lambda: Env.get("DB_USERNAME", "root"),
78
+ metadata={
79
+ "description": "The username for connecting to the MySQL database.",
80
+ "default": "root",
81
+ }
82
+ )
83
+
84
+ password: str = field(
85
+ default_factory=lambda: Env.get("DB_PASSWORD", ""),
86
+ metadata={
87
+ "description": "The password for the MySQL database.",
88
+ "default": "secret",
89
+ }
90
+ )
91
+
92
+ unix_socket: str = field(
93
+ default_factory=lambda: Env.get("DB_SOCKET", ""),
94
+ metadata={
95
+ "description": "The path to the Unix socket for MySQL connections (optional).",
96
+ "default": "",
97
+ }
98
+ )
99
+
100
+ charset: str | MySQLCharset = field(
101
+ default=MySQLCharset.UTF8MB4,
102
+ metadata={
103
+ "description": "The charset used for the connection.",
104
+ "default": "utf8mb4",
105
+ }
106
+ )
107
+
108
+ collation: str | MySQLCollation = field(
109
+ default=MySQLCollation.UTF8MB4_UNICODE_CI,
110
+ metadata={
111
+ "description": "The collation for the database.",
112
+ "default": "utf8mb4_unicode_ci",
113
+ }
114
+ )
115
+
116
+ prefix: str = field(
117
+ default="",
118
+ metadata={
119
+ "description": "Prefix for table names.",
120
+ "default": "",
121
+ }
122
+ )
123
+
124
+ prefix_indexes: bool = field(
125
+ default=True,
126
+ metadata={
127
+ "description": "Whether to prefix index names.",
128
+ "default": True,
129
+ }
130
+ )
131
+
132
+ strict: bool = field(
133
+ default=True,
134
+ metadata={
135
+ "description": "Whether to enforce strict SQL mode.",
136
+ "default": True,
137
+ }
138
+ )
139
+
140
+ engine: Optional[str | MySQLEngine] = field(
141
+ default=MySQLEngine.INNODB,
142
+ metadata={
143
+ "description": "The storage engine for the MySQL database (optional).",
144
+ "default": MySQLEngine.INNODB,
145
+ "type": str,
146
+ }
147
+ )
148
+
149
+ def __post_init__(self):
150
+ """
151
+ Post-initialization validation for MySQL database entity configuration.
152
+ This method performs comprehensive validation on the instance attributes to ensure
153
+ that all required fields are present and correctly typed. It raises an
154
+ OrionisIntegrityException with a descriptive message if any validation fails.
155
+ Validations performed:
156
+ - Host: Must be a non-empty string.
157
+ - Port: Must be an integer between 1 and 65535.
158
+ - Database name: Must be a non-empty string.
159
+ - Username: Must be a non-empty string.
160
+ - Password: Must be a string (can be empty).
161
+ - Unix socket: If provided, must be a string.
162
+ - Charset: Must be a non-empty string.
163
+ - Collation: Must be a non-empty string.
164
+ - Prefix: If provided, must be a string.
165
+ - Prefix indexes: Must be a boolean.
166
+ - Strict: Must be a boolean.
167
+ - Engine: If provided, must be a string.
168
+ Raises:
169
+ OrionisIntegrityException: If any attribute fails validation.
170
+ """
171
+
172
+ # Validate driver
173
+ if self.driver != 'mysql':
174
+ raise OrionisIntegrityException("Invalid driver: expected 'mysql'. Please ensure the 'driver' attribute is set to 'mysql'.")
175
+
176
+ # Validate host
177
+ if not self.host or not isinstance(self.host, str):
178
+ raise OrionisIntegrityException("Database host must be a non-empty string.")
179
+
180
+ # Validate port type
181
+ if not isinstance(self.port, (int)):
182
+ raise OrionisIntegrityException("Database port must be an integer.")
183
+
184
+ # Validate port range
185
+ if self.port > 65535 or self.port < 1:
186
+ raise OrionisIntegrityException("Database port must be between 1 and 65535.")
187
+
188
+ # Validate database name
189
+ if not self.database or not isinstance(self.database, str):
190
+ raise OrionisIntegrityException("Database name must be a non-empty string.")
191
+
192
+ # Validate username
193
+ if not self.username or not isinstance(self.username, str):
194
+ raise OrionisIntegrityException("Database username must be a non-empty string.")
195
+
196
+ # Validate password
197
+ if self.password is None or not isinstance(self.password, str):
198
+ raise OrionisIntegrityException("Database password must be a string (can be empty for some setups).")
199
+
200
+ # Validate unix_socket
201
+ if self.unix_socket is not None and not isinstance(self.unix_socket, str):
202
+ raise OrionisIntegrityException("Unix socket path must be a string.")
203
+
204
+ # Validate charset
205
+ if not self.charset or not isinstance(self.charset, (str, MySQLCharset)):
206
+ raise OrionisIntegrityException("Charset must be a non-empty string or MySQLCharset enum.")
207
+
208
+ # Convert charset to MySQLCharset enum if it's a string
209
+ if isinstance(self.charset, str):
210
+ _value = str(self.charset).upper().strip()
211
+ options_charsets = MySQLCharset._member_names_
212
+ if _value not in options_charsets:
213
+ raise OrionisIntegrityException(f"Charset must be a valid MySQLCharset ({str(options_charsets)}) or string.")
214
+ else:
215
+ self.charset = MySQLCharset[_value].value
216
+ else:
217
+ self.charset = self.charset.value
218
+
219
+ # Validate collation
220
+ if not self.collation or not isinstance(self.collation, (str, MySQLCollation)):
221
+ raise OrionisIntegrityException("Collation must be a non-empty string or MySQLCollation enum.")
222
+
223
+ # Convert collation to MySQLCollation enum if it's a string
224
+ if isinstance(self.collation, str):
225
+ _value = str(self.collation).upper().strip()
226
+ options_collations = MySQLCollation._member_names_
227
+ if _value not in options_collations:
228
+ raise OrionisIntegrityException(f"Collation must be a valid MySQLCollation ({str(options_collations)}) or string.")
229
+ else:
230
+ self.collation = MySQLCollation[_value].value
231
+ else:
232
+ self.collation = self.collation.value
233
+
234
+ # Validate prefix
235
+ if self.prefix is not None and not isinstance(self.prefix, str):
236
+ raise OrionisIntegrityException("Prefix must be a string.")
237
+
238
+ # Validate prefix_indexes
239
+ if not isinstance(self.prefix_indexes, bool):
240
+ raise OrionisIntegrityException("prefix_indexes must be a boolean value.")
241
+
242
+ # Validate strict
243
+ if not isinstance(self.strict, bool):
244
+ raise OrionisIntegrityException("strict must be a boolean value.")
245
+
246
+ # Validate engine
247
+ if self.engine is not None:
248
+
249
+ # Check if engine is a string or MySQLEngine enum
250
+ if not isinstance(self.engine, (str, MySQLEngine)):
251
+ raise OrionisIntegrityException(f"Engine must be a string or MySQLEngine enum.")
252
+
253
+ # Convert engine to MySQLEngine enum if it's a string
254
+ options_engines = MySQLEngine._member_names_
255
+ if isinstance(self.engine, str):
256
+ _value = str(self.engine).upper().strip()
257
+ if _value not in options_engines:
258
+ raise OrionisIntegrityException(f"Engine must be a valid MySQLEngine ({str(options_engines)}) or string.")
259
+ else:
260
+ self.engine = MySQLEngine[_value].value
261
+ elif isinstance(self.engine, MySQLEngine):
262
+ self.engine = self.engine.value
263
+
264
+ def toDict(self) -> dict:
265
+ """
266
+ Convert the object to a dictionary representation.
267
+ Returns:
268
+ dict: A dictionary representation of the Dataclass object.
269
+ """
270
+ return asdict(self)
@@ -0,0 +1,227 @@
1
+ from dataclasses import asdict, dataclass, field
2
+ from typing import Optional
3
+ from orionis.luminate.foundation.config.database.enums.oracle_encoding import OracleEncoding
4
+ from orionis.luminate.foundation.config.database.enums.oracle_nencoding import OracleNencoding
5
+ from orionis.luminate.foundation.config.exceptions.integrity import OrionisIntegrityException
6
+ from orionis.luminate.services.environment.env import Env
7
+
8
+ @dataclass(unsafe_hash=True, kw_only=True)
9
+ class Oracle:
10
+ """
11
+ Data class to represent Oracle database configuration using oracledb.
12
+
13
+ Attributes
14
+ ----------
15
+ driver : str
16
+ The database driver being used, typically 'oracle'.
17
+ username : str
18
+ Username for the database connection.
19
+ password : str
20
+ Password for the database connection.
21
+ host : str
22
+ Hostname or IP address of the Oracle server.
23
+ port : int
24
+ Port number for the Oracle listener (default 1521).
25
+ service_name : Optional[str]
26
+ Service name for connection using the SERVICE_NAME method.
27
+ sid : Optional[str]
28
+ SID for connection using the SID method.
29
+ dsn : Optional[str]
30
+ Full DSN string, used if service_name/sid are not specified.
31
+ tns_name : Optional[str]
32
+ TNS alias name defined in tnsnames.ora.
33
+ encoding : str
34
+ Character encoding for the connection.
35
+ """
36
+
37
+ driver: str = field(
38
+ default="oracle",
39
+ metadata={
40
+ "description": "The database driver being used, typically 'oracle'.",
41
+ "default": "oracle"
42
+ }
43
+ )
44
+
45
+ username: str = field(
46
+ default_factory=lambda: Env.get("DB_USERNAME", "sys"),
47
+ metadata={
48
+ "description": "Oracle DB username.",
49
+ "default": "sys"
50
+ }
51
+ )
52
+
53
+ password: str = field(
54
+ default_factory=lambda: Env.get("DB_PASSWORD", ""),
55
+ metadata={
56
+ "description": "Oracle DB password.",
57
+ "default": ""
58
+ }
59
+ )
60
+
61
+ host: str = field(
62
+ default_factory=lambda: Env.get("DB_HOST", "localhost"),
63
+ metadata={
64
+ "description": "Oracle DB host address.",
65
+ "default": "localhost"
66
+ }
67
+ )
68
+
69
+ port: int = field(
70
+ default_factory=lambda: Env.get("DB_PORT", 1521),
71
+ metadata={
72
+ "description": "Oracle DB listener port.",
73
+ "default": 1521
74
+ }
75
+ )
76
+
77
+ service_name: Optional[str] = field(
78
+ default_factory=lambda: Env.get("DB_SERVICE_NAME", "ORCL"),
79
+ metadata={
80
+ "description": "Service name for Oracle DB.",
81
+ "default": "ORCL"
82
+ }
83
+ )
84
+
85
+ sid: Optional[str] = field(
86
+ default_factory=lambda: Env.get("DB_SID", None),
87
+ metadata={
88
+ "description": "SID for Oracle DB.",
89
+ "default": None
90
+ }
91
+ )
92
+
93
+ dsn: Optional[str] = field(
94
+ default_factory=lambda: Env.get("DB_DSN", None),
95
+ metadata={
96
+ "description": "DSN string (overrides host/port/service/sid).",
97
+ "default": None
98
+ }
99
+ )
100
+
101
+ tns_name: Optional[str] = field(
102
+ default_factory=lambda: Env.get("DB_TNS", None),
103
+ metadata={
104
+ "description": "TNS alias defined in tnsnames.ora file.",
105
+ "default": None
106
+ }
107
+ )
108
+
109
+ encoding: str | OracleEncoding = field(
110
+ default_factory=lambda: Env.get("DB_ENCODING", OracleEncoding.AL32UTF8),
111
+ metadata={
112
+ "description": "Database charset (CHAR/VARCHAR2)",
113
+ "default": "AL32UTF8"
114
+ }
115
+ )
116
+
117
+ nencoding: str | OracleNencoding = field(
118
+ default_factory=lambda: Env.get("DB_NENCODING", OracleNencoding.AL32UTF8),
119
+ metadata={
120
+ "description": "Database charset (NCHAR/NVARCHAR2)",
121
+ "default": "AL32UTF8"
122
+ }
123
+ )
124
+
125
+ def __post_init__(self):
126
+ """
127
+ Post-initialization validation for Oracle database connection entity.
128
+ This method performs strict validation on the configuration fields required to establish
129
+ an Oracle database connection. It ensures that all necessary parameters are present and
130
+ correctly formatted, raising an `OrionisIntegrityException` if any validation fails.
131
+ Validation rules:
132
+ - `driver` must be the string 'oracle'.
133
+ - `username` and `password` must be non-empty strings.
134
+ - `dsn` and `tns_name`, if provided, must be non-empty strings or None.
135
+ - If neither `dsn` nor `tns_name` is provided:
136
+ - `host` must be a non-empty string.
137
+ - `port` must be an integer between 1 and 65535.
138
+ - At least one of `service_name` or `sid` must be provided as a non-empty string.
139
+ - If provided, `service_name` and `sid` must be non-empty strings or None.
140
+ - `encoding` must be a non-empty string or an instance of `OracleEncoding`.
141
+ - `nencoding` must be a non-empty string.
142
+ Raises:
143
+ OrionisIntegrityException: If any configuration parameter is invalid.
144
+ """
145
+
146
+ # Validate driver
147
+ if not isinstance(self.driver, str) or self.driver.strip().lower() != "oracle":
148
+ raise OrionisIntegrityException("Invalid 'driver': must be the string 'oracle'.")
149
+
150
+ # Validate username
151
+ if not isinstance(self.username, str) or not self.username.strip():
152
+ raise OrionisIntegrityException("Invalid 'username': must be a non-empty string.")
153
+
154
+ # Validate password
155
+ if not isinstance(self.password, str):
156
+ raise OrionisIntegrityException("Invalid 'password': must be a string.")
157
+
158
+ # Validate dsn
159
+ if self.dsn is not None and (not isinstance(self.dsn, str) or not self.dsn.strip()):
160
+ raise OrionisIntegrityException("Invalid 'dsn': must be a non-empty string or None.")
161
+
162
+ # Validate tns_name
163
+ if self.tns_name is not None and (not isinstance(self.tns_name, str) or not self.tns_name.strip()):
164
+ raise OrionisIntegrityException("Invalid 'tns_name': must be a non-empty string or None.")
165
+
166
+ # If not using DSN or TNS, validate host/port/service_name/sid
167
+ if not self.dsn and not self.tns_name:
168
+
169
+ # Validate host
170
+ if not isinstance(self.host, str) or not self.host.strip():
171
+ raise OrionisIntegrityException("Invalid 'host': must be a non-empty string.")
172
+
173
+ # Validate port
174
+ if not isinstance(self.port, int) or self.port <= 0 or self.port > 65535:
175
+ raise OrionisIntegrityException("Invalid 'port': must be an integer between 1 and 65535.")
176
+
177
+ # Validate service_name and sid
178
+ if (self.service_name is None or not str(self.service_name).strip()) and (self.sid is None or not str(self.sid).strip()):
179
+ raise OrionisIntegrityException(
180
+ "You must provide at least one of: 'service_name', 'sid', 'dsn', or 'tns_name'."
181
+ )
182
+
183
+ # Validate service_name and sid
184
+ if self.service_name is not None and (not isinstance(self.service_name, str) or not self.service_name.strip()):
185
+ raise OrionisIntegrityException("Invalid 'service_name': must be a non-empty string or None.")
186
+
187
+ # Validate sid
188
+ if self.sid is not None and (not isinstance(self.sid, str) or not self.sid.strip()):
189
+ raise OrionisIntegrityException("Invalid 'sid': must be a non-empty string or None.")
190
+
191
+ # Validate encoding
192
+ options_encoding = OracleEncoding._member_names_
193
+ if isinstance(self.encoding, str):
194
+ _value = self.encoding.upper().strip()
195
+ if _value not in options_encoding:
196
+ raise OrionisIntegrityException(
197
+ f"The 'encoding' attribute must be a valid option {str(OracleEncoding._member_names_)}"
198
+ )
199
+ else:
200
+ self.encoding = OracleEncoding[_value].value
201
+ elif isinstance(self.encoding, OracleEncoding):
202
+ self.encoding = self.encoding.value
203
+ else:
204
+ raise OrionisIntegrityException("Invalid 'encoding': must be a string or OracleEncoding.")
205
+
206
+ # Validate nencoding
207
+ options_nencoding = OracleNencoding._member_names_
208
+ if isinstance(self.nencoding, str):
209
+ _value = self.nencoding.upper().strip()
210
+ if _value not in options_nencoding:
211
+ raise OrionisIntegrityException(
212
+ f"The 'nencoding' attribute must be a valid option {str(OracleNencoding._member_names_)}"
213
+ )
214
+ else:
215
+ self.nencoding = OracleNencoding[_value].value
216
+ elif isinstance(self.nencoding, OracleNencoding):
217
+ self.nencoding = self.nencoding.value
218
+ else:
219
+ raise OrionisIntegrityException("Invalid 'nencoding': must be a string or OracleNencoding.")
220
+
221
+ def toDict(self) -> dict:
222
+ """
223
+ Convert the object to a dictionary representation.
224
+ Returns:
225
+ dict: A dictionary representation of the Dataclass object.
226
+ """
227
+ return asdict(self)