orionis 0.139.0__tar.gz → 0.151.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.
- {orionis-0.139.0/orionis.egg-info → orionis-0.151.0}/PKG-INFO +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/framework.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/base/command.py +6 -3
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/command_filter.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/commands/cache_clear.py +4 -3
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/commands/schedule_work.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/kernel.py +1 -2
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/output/console.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/output/executor.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/output/progress_bar.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/parser.py +1 -1
- orionis-0.151.0/orionis/luminate/container/container.py +567 -0
- orionis-0.151.0/orionis/luminate/container/container_integrity.py +235 -0
- orionis-0.151.0/orionis/luminate/container/lifetimes.py +13 -0
- orionis-0.139.0/orionis/luminate/contracts/console/i_parser.py → orionis-0.151.0/orionis/luminate/contracts/console/parser.py +0 -1
- orionis-0.151.0/orionis/luminate/contracts/container/container.py +346 -0
- orionis-0.151.0/orionis/luminate/contracts/container/container_integrity.py +168 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/commands/commands_facade.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/commands/scheduler_facade.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/config/config_facade.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/environment/environment_facade.py +1 -2
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/files/path_facade.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/log/log_facade.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/tests/tests_facade.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/foundation/config/config_bootstrapper.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/foundation/console/command_bootstrapper.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/foundation/environment/environment_bootstrapper.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/foundation/providers/service_providers_bootstrapper.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/providers/commands/reactor_commands_service_provider.py +2 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/providers/commands/scheduler_provider.py +2 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/providers/config/config_service_provider.py +2 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/providers/environment/environment__service_provider.py +2 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/providers/files/paths_provider.py +2 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/providers/log/log_service_provider.py +2 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/providers/service_provider.py +1 -2
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/services/commands/reactor_commands_service.py +1 -2
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/services/commands/scheduler_service.py +1 -2
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/services/config/config_service.py +1 -2
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/services/environment/environment_service.py +1 -2
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/services/files/path_resolver_service.py +1 -2
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/services/log/log_service.py +1 -2
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/support/exception_to_dict.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/support/reflection.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/support/std.py +1 -1
- {orionis-0.139.0 → orionis-0.151.0/orionis.egg-info}/PKG-INFO +1 -1
- {orionis-0.139.0 → orionis-0.151.0}/orionis.egg-info/SOURCES.txt +33 -32
- orionis-0.139.0/orionis/luminate/container/container.py +0 -458
- orionis-0.139.0/orionis/luminate/container/types.py +0 -51
- orionis-0.139.0/orionis/luminate/contracts/container/i_container.py +0 -239
- orionis-0.139.0/orionis/luminate/contracts/container/i_types.py +0 -16
- {orionis-0.139.0 → orionis-0.151.0}/LICENCE +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/MANIFEST.in +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/README.md +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/cli_manager.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/installer/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/installer/contracts/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/installer/contracts/i_installer_manager.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/installer/contracts/i_installer_output.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/installer/contracts/i_installer_setup.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/installer/manager.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/installer/output/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/installer/output/output.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/installer/setup/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/installer/setup/setup.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/application.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/config/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/config/app.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/config/auth.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/config/cache.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/config/cors.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/config/database.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/config/filesystems.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/config/logging.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/config/mail.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/config/queue.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/config/session.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/base/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/commands/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/commands/help.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/commands/tests.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/commands/version.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/exceptions/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/exceptions/cli_exception.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/output/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/console/output/styles.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/container/exception.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/config/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/config/i_config.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/console/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/console/base/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/console/base/i_command.py → /orionis-0.151.0/orionis/luminate/contracts/console/base/command.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/console/i_command_filter.py → /orionis-0.151.0/orionis/luminate/contracts/console/command_filter.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/console/i_kernel.py → /orionis-0.151.0/orionis/luminate/contracts/console/kernel.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/console/output/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/console/output/i_console.py → /orionis-0.151.0/orionis/luminate/contracts/console/output/console.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/console/output/i_executor.py → /orionis-0.151.0/orionis/luminate/contracts/console/output/executor.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/console/output/i_progress_bar.py → /orionis-0.151.0/orionis/luminate/contracts/console/output/progress_bar.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/console/i_task_manager.py → /orionis-0.151.0/orionis/luminate/contracts/console/task_manager.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/facades/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/facades/commands/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/facades/commands/i_commands_facade.py → /orionis-0.151.0/orionis/luminate/contracts/facades/commands/commands_facade.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/facades/commands/i_scheduler_facade.py → /orionis-0.151.0/orionis/luminate/contracts/facades/commands/scheduler_facade.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/facades/config/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/facades/config/i_config_facade.py → /orionis-0.151.0/orionis/luminate/contracts/facades/config/config_facade.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/facades/environment/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/facades/environment/i_environment_facade.py → /orionis-0.151.0/orionis/luminate/contracts/facades/environment/environment_facade.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/facades/files/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/facades/files/i_path_facade.py → /orionis-0.151.0/orionis/luminate/contracts/facades/files/path_facade.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/facades/log/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/facades/log/i_log_facade.py → /orionis-0.151.0/orionis/luminate/contracts/facades/log/log_facade.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/facades/tests/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/facades/tests/i_tests_facade.py → /orionis-0.151.0/orionis/luminate/contracts/facades/tests/tests_facade.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/foundation/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/foundation/config/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/foundation/config/i_config_bootstrapper.py → /orionis-0.151.0/orionis/luminate/contracts/foundation/config/config_bootstrapper.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/foundation/console/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/foundation/console/i_command_bootstrapper.py → /orionis-0.151.0/orionis/luminate/contracts/foundation/console/command_bootstrapper.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/foundation/environment/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/foundation/environment/i_environment_bootstrapper.py → /orionis-0.151.0/orionis/luminate/contracts/foundation/environment/environment_bootstrapper.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/foundation/i_bootstraper.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/foundation/providers/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/foundation/providers/i_service_providers_bootstrapper.py → /orionis-0.151.0/orionis/luminate/contracts/foundation/providers/service_providers_bootstrapper.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/providers/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/providers/i_service_provider.py → /orionis-0.151.0/orionis/luminate/contracts/providers/service_provider.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/services/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/services/commands/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/services/commands/i_reactor_commands_service.py → /orionis-0.151.0/orionis/luminate/contracts/services/commands/reactor_commands_service.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/services/commands/i_schedule_service.py → /orionis-0.151.0/orionis/luminate/contracts/services/commands/schedule_service.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/services/config/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/services/config/i_config_service.py → /orionis-0.151.0/orionis/luminate/contracts/services/config/config_service.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/services/environment/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/services/environment/i_environment_service.py → /orionis-0.151.0/orionis/luminate/contracts/services/environment/environment_service.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/services/files/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/services/files/i_path_resolver_service.py → /orionis-0.151.0/orionis/luminate/contracts/services/files/path_resolver_service.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/contracts/services/log/__init__.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/services/log/i_log_service.py → /orionis-0.151.0/orionis/luminate/contracts/services/log/log_service.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/support/i_exception_to_dict.py → /orionis-0.151.0/orionis/luminate/contracts/support/exception_to_dict.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/support/i_reflection.py → /orionis-0.151.0/orionis/luminate/contracts/support/reflection.py +0 -0
- /orionis-0.139.0/orionis/luminate/contracts/support/i_std.py → /orionis-0.151.0/orionis/luminate/contracts/support/std.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/app_facade.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/commands/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/config/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/environment/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/files/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/log/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/facades/tests/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/foundation/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/foundation/config/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/foundation/console/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/foundation/environment/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/foundation/exceptions/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/foundation/exceptions/exception_bootstrapper.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/foundation/providers/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/patterns/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/patterns/singleton.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/providers/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/providers/commands/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/providers/config/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/providers/environment/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/providers/files/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/providers/log/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/services/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/services/commands/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/services/config/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/services/environment/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/services/files/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/services/log/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/support/dot_dict.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/test/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/test/exception.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/luminate/test/unit_test.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/static/ascii/icon.ascii +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/static/ascii/info.ascii +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/static/bg/galaxy.jpg +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/static/favicon/OrionisFrameworkFavicon.png +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/static/logos/OrionisFramework.jpg +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/static/logos/OrionisFramework.png +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/static/logos/OrionisFramework.psd +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/static/logos/OrionisFramework2.png +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis/static/logos/OrionisFramework3.png +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis.egg-info/dependency_links.txt +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis.egg-info/entry_points.txt +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis.egg-info/requires.txt +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/orionis.egg-info/top_level.txt +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/setup.cfg +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/setup.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/tests/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/tests/tools/__init__.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/tests/tools/class_example.py +0 -0
- {orionis-0.139.0 → orionis-0.151.0}/tests/tools/test_reflection.py +0 -0
@@ -1,4 +1,4 @@
|
|
1
|
-
from orionis.luminate.contracts.console.base.
|
1
|
+
from orionis.luminate.contracts.console.base.command import IBaseCommand
|
2
2
|
from orionis.luminate.console.output.console import Console
|
3
3
|
from orionis.luminate.console.output.progress_bar import ProgressBar
|
4
4
|
|
@@ -8,9 +8,12 @@ class BaseCommand(IBaseCommand):
|
|
8
8
|
various types (success, info, warning, etc.) in different styles (e.g., text, bold, colored).
|
9
9
|
|
10
10
|
This class acts as a foundation for command classes, offering utility methods to interact with the console.
|
11
|
-
"""
|
12
11
|
|
13
|
-
|
12
|
+
Parameters
|
13
|
+
----------
|
14
|
+
args : dict, optional
|
15
|
+
A dictionary containing the command arguments (default is an empty dictionary).
|
16
|
+
"""
|
14
17
|
args = {}
|
15
18
|
|
16
19
|
def success(self, message: str = '', timestamp: bool = True):
|
@@ -44,9 +44,10 @@ class CacheClearCommand(BaseCommand):
|
|
44
44
|
# Recursively traverse directories starting from the base path
|
45
45
|
for root, dirs, files in os.walk(base_path, topdown=True):
|
46
46
|
|
47
|
-
# Skip
|
48
|
-
|
49
|
-
dirs
|
47
|
+
# Skip common environment directories (e.g., venv, env, vendor, node_modules)
|
48
|
+
for env_dir in ['venv', 'env', 'virtualenv', 'venv3', 'env3', 'venv2', 'env2', 'vendor', 'node_modules', 'environment']:
|
49
|
+
if env_dir in dirs:
|
50
|
+
dirs.remove(env_dir)
|
50
51
|
|
51
52
|
# Check for __pycache__ directories
|
52
53
|
if '__pycache__' in dirs:
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import importlib
|
2
2
|
from orionis.luminate.console.base.command import BaseCommand
|
3
3
|
from orionis.luminate.console.exceptions.cli_exception import CLIOrionisRuntimeError
|
4
|
-
from orionis.luminate.contracts.console.
|
4
|
+
from orionis.luminate.contracts.console.task_manager import ITaskManager
|
5
5
|
from orionis.luminate.facades.commands.scheduler_facade import Schedule
|
6
6
|
|
7
7
|
|
@@ -2,7 +2,7 @@ import os
|
|
2
2
|
import sys
|
3
3
|
import getpass
|
4
4
|
import datetime
|
5
|
-
from orionis.luminate.contracts.console.output.
|
5
|
+
from orionis.luminate.contracts.console.output.console import IConsole
|
6
6
|
from orionis.luminate.console.output.styles import ANSIColors
|
7
7
|
from orionis.luminate.support.exception_to_dict import ExceptionsToDict
|
8
8
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
from datetime import datetime
|
2
|
-
from orionis.luminate.contracts.console.output.
|
2
|
+
from orionis.luminate.contracts.console.output.executor import IExecutor
|
3
3
|
from orionis.luminate.console.output.styles import ANSIColors
|
4
4
|
|
5
5
|
class Executor(IExecutor):
|
@@ -0,0 +1,567 @@
|
|
1
|
+
import inspect
|
2
|
+
from threading import Lock
|
3
|
+
from typing import Callable, Any, Dict, Deque, Optional, Type, get_origin, get_args
|
4
|
+
from collections import deque
|
5
|
+
from orionis.luminate.container.container_integrity import ContainerIntegrity
|
6
|
+
from orionis.luminate.container.lifetimes import Lifetime
|
7
|
+
from orionis.luminate.container.exception import OrionisContainerException, OrionisContainerValueError, OrionisContainerTypeError
|
8
|
+
from orionis.luminate.contracts.container.container import IContainer
|
9
|
+
|
10
|
+
class Container(IContainer):
|
11
|
+
"""
|
12
|
+
Service container and dependency injection manager.
|
13
|
+
|
14
|
+
This class follows the singleton pattern to manage service bindings, instances,
|
15
|
+
and different lifecycle types such as transient, singleton, and scoped.
|
16
|
+
"""
|
17
|
+
|
18
|
+
_instance = None
|
19
|
+
_lock = Lock()
|
20
|
+
|
21
|
+
@classmethod
|
22
|
+
def destroy(cls):
|
23
|
+
"""
|
24
|
+
Destroys the current instance of the container.
|
25
|
+
|
26
|
+
This method resets the singleton instance, effectively clearing all registered
|
27
|
+
services and instances.
|
28
|
+
|
29
|
+
Examples
|
30
|
+
--------
|
31
|
+
>>> Container.destroy()
|
32
|
+
"""
|
33
|
+
cls._instance = None
|
34
|
+
|
35
|
+
@classmethod
|
36
|
+
def reset(cls):
|
37
|
+
"""
|
38
|
+
Resets the container to its initial state.
|
39
|
+
|
40
|
+
This method destroys the current instance and immediately creates a new one.
|
41
|
+
|
42
|
+
Examples
|
43
|
+
--------
|
44
|
+
>>> Container.reset()
|
45
|
+
"""
|
46
|
+
cls._instance = None
|
47
|
+
super().__new__(cls)
|
48
|
+
|
49
|
+
def __new__(cls):
|
50
|
+
"""
|
51
|
+
Create a new instance of the container.
|
52
|
+
"""
|
53
|
+
if cls._instance is None:
|
54
|
+
with cls._lock:
|
55
|
+
if cls._instance is None:
|
56
|
+
cls._instance = super().__new__(cls)
|
57
|
+
cls._instance._scoped_instances = {}
|
58
|
+
cls._instance._singleton_instances = {}
|
59
|
+
cls._instance._instances_services = {}
|
60
|
+
cls._instance._transient_services = {}
|
61
|
+
cls._instance._scoped_services = {}
|
62
|
+
cls._instance._singleton_services = {}
|
63
|
+
cls._instance._aliases_services = {}
|
64
|
+
return cls._instance
|
65
|
+
|
66
|
+
def bind(self, abstract: Callable[..., Any], concrete: Callable[..., Any], lifetime: str = Lifetime.TRANSIENT.value) -> None:
|
67
|
+
"""
|
68
|
+
Binds an abstract type to a concrete implementation with a specified lifetime.
|
69
|
+
|
70
|
+
Parameters
|
71
|
+
----------
|
72
|
+
abstract : Callable[..., Any]
|
73
|
+
The abstract base type or alias to be bound.
|
74
|
+
concrete : Callable[..., Any]
|
75
|
+
The concrete implementation to associate with the abstract type.
|
76
|
+
lifetime : str
|
77
|
+
The lifecycle of the binding. Must be one of 'transient', 'scoped', or 'singleton'.
|
78
|
+
|
79
|
+
Raises
|
80
|
+
------
|
81
|
+
OrionisContainerValueError
|
82
|
+
If an invalid lifetime is provided or the concrete implementation is None.
|
83
|
+
|
84
|
+
Examples
|
85
|
+
--------
|
86
|
+
>>> container.bind(MyService, MyServiceImplementation, "singleton")
|
87
|
+
"""
|
88
|
+
|
89
|
+
if lifetime not in [member.value for member in Lifetime]:
|
90
|
+
raise OrionisContainerValueError(f"Invalid lifetime type '{lifetime}'.")
|
91
|
+
|
92
|
+
if concrete is None:
|
93
|
+
raise OrionisContainerValueError("Concrete implementation cannot be None when binding a service.")
|
94
|
+
|
95
|
+
abstract = abstract or concrete
|
96
|
+
ContainerIntegrity.ensureIsCallable(concrete)
|
97
|
+
ContainerIntegrity.ensureNotMain(concrete)
|
98
|
+
|
99
|
+
service_entry = {
|
100
|
+
"concrete": concrete,
|
101
|
+
"async": inspect.iscoroutinefunction(concrete)
|
102
|
+
}
|
103
|
+
|
104
|
+
service_registry = {
|
105
|
+
Lifetime.TRANSIENT.value: self._transient_services,
|
106
|
+
Lifetime.SCOPED.value: self._scoped_services,
|
107
|
+
Lifetime.SINGLETON.value: self._singleton_services
|
108
|
+
}
|
109
|
+
|
110
|
+
if ContainerIntegrity.isAbstract(abstract):
|
111
|
+
ContainerIntegrity.ensureImplementation(abstract, concrete)
|
112
|
+
service_registry[lifetime][abstract] = service_entry
|
113
|
+
return
|
114
|
+
|
115
|
+
if ContainerIntegrity.isAlias(abstract):
|
116
|
+
service_registry[lifetime][abstract] = service_entry
|
117
|
+
return
|
118
|
+
|
119
|
+
raise OrionisContainerValueError(f"Invalid abstract type '{abstract}'. It must be a valid alias or an abstract class.")
|
120
|
+
|
121
|
+
def transient(self, abstract: Callable[..., Any], concrete: Callable[..., Any]) -> None:
|
122
|
+
"""
|
123
|
+
Registers a service with a transient lifetime.
|
124
|
+
|
125
|
+
Parameters
|
126
|
+
----------
|
127
|
+
abstract : Callable[..., Any]
|
128
|
+
The abstract base type or alias to be bound.
|
129
|
+
concrete : Callable[..., Any]
|
130
|
+
The concrete implementation to associate with the abstract type.
|
131
|
+
|
132
|
+
Examples
|
133
|
+
--------
|
134
|
+
>>> container.transient(MyService, MyServiceImplementation)
|
135
|
+
"""
|
136
|
+
|
137
|
+
self.bind(abstract, concrete, Lifetime.TRANSIENT.value)
|
138
|
+
|
139
|
+
def scoped(self, abstract: Callable[..., Any], concrete: Callable[..., Any]) -> None:
|
140
|
+
"""
|
141
|
+
Registers a service with a scoped lifetime.
|
142
|
+
|
143
|
+
Parameters
|
144
|
+
----------
|
145
|
+
abstract : Callable[..., Any]
|
146
|
+
The abstract base type or alias to be bound.
|
147
|
+
concrete : Callable[..., Any]
|
148
|
+
The concrete implementation to associate with the abstract type.
|
149
|
+
|
150
|
+
Examples
|
151
|
+
--------
|
152
|
+
>>> container.scoped(MyService, MyServiceImplementation)
|
153
|
+
"""
|
154
|
+
|
155
|
+
self.bind(abstract, concrete, Lifetime.SCOPED.value)
|
156
|
+
|
157
|
+
def singleton(self, abstract: Callable[..., Any], concrete: Callable[..., Any]) -> None:
|
158
|
+
"""
|
159
|
+
Registers a service with a singleton lifetime.
|
160
|
+
|
161
|
+
Parameters
|
162
|
+
----------
|
163
|
+
abstract : Callable[..., Any]
|
164
|
+
The abstract base type or alias to be bound.
|
165
|
+
concrete : Callable[..., Any]
|
166
|
+
The concrete implementation to associate with the abstract type.
|
167
|
+
|
168
|
+
Examples
|
169
|
+
--------
|
170
|
+
>>> container.singleton(MyService, MyServiceImplementation)
|
171
|
+
"""
|
172
|
+
|
173
|
+
self.bind(abstract, concrete, Lifetime.SINGLETON.value)
|
174
|
+
|
175
|
+
def instance(self, abstract: Callable[..., Any], instance: Any) -> None:
|
176
|
+
"""
|
177
|
+
Registers an already instantiated object in the container.
|
178
|
+
|
179
|
+
Parameters
|
180
|
+
----------
|
181
|
+
abstract : Callable[..., Any]
|
182
|
+
The abstract base type or alias to be bound.
|
183
|
+
instance : Any
|
184
|
+
The instance to be stored.
|
185
|
+
|
186
|
+
Raises
|
187
|
+
------
|
188
|
+
OrionisContainerValueError
|
189
|
+
If the instance is None.
|
190
|
+
|
191
|
+
Examples
|
192
|
+
--------
|
193
|
+
>>> container.instance(MyService, my_service_instance)
|
194
|
+
"""
|
195
|
+
|
196
|
+
if instance is None:
|
197
|
+
raise OrionisContainerValueError("The provided instance cannot be None.")
|
198
|
+
|
199
|
+
ContainerIntegrity.ensureIsInstance(instance)
|
200
|
+
|
201
|
+
if ContainerIntegrity.isAbstract(abstract):
|
202
|
+
ContainerIntegrity.ensureImplementation(abstract, instance.__class__)
|
203
|
+
self._instances_services[abstract] = instance
|
204
|
+
return
|
205
|
+
|
206
|
+
if ContainerIntegrity.isAlias(abstract):
|
207
|
+
self._instances_services[abstract] = instance
|
208
|
+
return
|
209
|
+
|
210
|
+
raise OrionisContainerValueError(f"Invalid abstract type '{abstract}'. It must be a valid alias or an abstract class.")
|
211
|
+
|
212
|
+
def bound(self, abstract_or_alias: Callable[..., Any]) -> bool:
|
213
|
+
"""
|
214
|
+
Checks if a service or alias is bound in the container.
|
215
|
+
|
216
|
+
Parameters
|
217
|
+
----------
|
218
|
+
abstract_or_alias : Callable[..., Any]
|
219
|
+
The abstract type or alias to check.
|
220
|
+
|
221
|
+
Returns
|
222
|
+
-------
|
223
|
+
bool
|
224
|
+
True if the service is bound, False otherwise.
|
225
|
+
|
226
|
+
Examples
|
227
|
+
--------
|
228
|
+
>>> container.bound(MyService)
|
229
|
+
True
|
230
|
+
"""
|
231
|
+
|
232
|
+
service_dicts = [
|
233
|
+
self._instances_services,
|
234
|
+
self._transient_services,
|
235
|
+
self._scoped_services,
|
236
|
+
self._singleton_services,
|
237
|
+
self._aliases_services
|
238
|
+
]
|
239
|
+
return any(abstract_or_alias in service_dict for service_dict in service_dicts)
|
240
|
+
|
241
|
+
def has(self, abstract_or_alias: Callable[..., Any]) -> bool:
|
242
|
+
"""
|
243
|
+
Alias for `bound()` method.
|
244
|
+
|
245
|
+
Parameters
|
246
|
+
----------
|
247
|
+
abstract_or_alias : Callable[..., Any]
|
248
|
+
The abstract type or alias to check.
|
249
|
+
|
250
|
+
Returns
|
251
|
+
-------
|
252
|
+
bool
|
253
|
+
True if the service is bound, False otherwise.
|
254
|
+
|
255
|
+
Examples
|
256
|
+
--------
|
257
|
+
>>> container.has(MyService)
|
258
|
+
True
|
259
|
+
"""
|
260
|
+
|
261
|
+
return self.bound(abstract_or_alias)
|
262
|
+
|
263
|
+
def alias(self, alias: Callable[..., Any], abstract: Callable[..., Any]) -> None:
|
264
|
+
"""
|
265
|
+
Creates an alias for an existing abstract binding.
|
266
|
+
|
267
|
+
Parameters
|
268
|
+
----------
|
269
|
+
alias : Callable[..., Any]
|
270
|
+
The alias name.
|
271
|
+
abstract : Callable[..., Any]
|
272
|
+
The existing abstract type to alias.
|
273
|
+
|
274
|
+
Raises
|
275
|
+
------
|
276
|
+
OrionisContainerValueError
|
277
|
+
If the abstract type is not registered or the alias is already in use.
|
278
|
+
|
279
|
+
Examples
|
280
|
+
--------
|
281
|
+
>>> container.alias("DatabaseService", MyDatabaseService)
|
282
|
+
"""
|
283
|
+
|
284
|
+
if not self.has(abstract):
|
285
|
+
raise OrionisContainerValueError(f"Abstract '{abstract}' is not registered in the container.")
|
286
|
+
|
287
|
+
if alias in self._aliases_services:
|
288
|
+
raise OrionisContainerValueError(f"Alias '{alias}' is already in use.")
|
289
|
+
|
290
|
+
if not ContainerIntegrity.isAlias(abstract):
|
291
|
+
raise OrionisContainerValueError(f"Invalid target abstract type: {abstract}. It must be an alias.")
|
292
|
+
|
293
|
+
self._aliases_services[alias] = abstract
|
294
|
+
|
295
|
+
def isAlias(self, name: str) -> bool:
|
296
|
+
"""
|
297
|
+
Checks if a given name is an alias.
|
298
|
+
|
299
|
+
Parameters
|
300
|
+
----------
|
301
|
+
name : str
|
302
|
+
The name to check.
|
303
|
+
|
304
|
+
Returns
|
305
|
+
-------
|
306
|
+
bool
|
307
|
+
True if the name is an alias, False otherwise.
|
308
|
+
|
309
|
+
Raises
|
310
|
+
------
|
311
|
+
OrionisContainerTypeError
|
312
|
+
If the name is not a string.
|
313
|
+
|
314
|
+
Examples
|
315
|
+
--------
|
316
|
+
>>> container.isAlias("DatabaseService")
|
317
|
+
True
|
318
|
+
"""
|
319
|
+
|
320
|
+
if not isinstance(name, str):
|
321
|
+
raise OrionisContainerTypeError("The name must be a valid string.")
|
322
|
+
return name in self._aliases_services
|
323
|
+
|
324
|
+
def getBindings(self) -> Dict[str, Any]:
|
325
|
+
"""
|
326
|
+
Retrieves all registered service bindings.
|
327
|
+
|
328
|
+
Returns
|
329
|
+
-------
|
330
|
+
dict
|
331
|
+
A dictionary containing all instances, transient, scoped, singleton, and alias services.
|
332
|
+
|
333
|
+
Examples
|
334
|
+
--------
|
335
|
+
>>> container.getBindings()
|
336
|
+
"""
|
337
|
+
|
338
|
+
return {
|
339
|
+
"instances": self._instances_services,
|
340
|
+
"transient": self._transient_services,
|
341
|
+
"scoped": self._scoped_services,
|
342
|
+
"singleton": self._singleton_services,
|
343
|
+
"aliases": self._aliases_services
|
344
|
+
}
|
345
|
+
|
346
|
+
def getAlias(self, name: str) -> Callable[..., Any]:
|
347
|
+
"""
|
348
|
+
Retrieves the abstract type associated with an alias.
|
349
|
+
|
350
|
+
Parameters
|
351
|
+
----------
|
352
|
+
name : str
|
353
|
+
The alias name.
|
354
|
+
|
355
|
+
Returns
|
356
|
+
-------
|
357
|
+
Callable[..., Any]
|
358
|
+
The abstract type associated with the alias.
|
359
|
+
|
360
|
+
Raises
|
361
|
+
------
|
362
|
+
OrionisContainerValueError
|
363
|
+
If the alias is not registered.
|
364
|
+
|
365
|
+
Examples
|
366
|
+
--------
|
367
|
+
>>> container.getAlias("DatabaseService")
|
368
|
+
<class 'MyDatabaseService'>
|
369
|
+
"""
|
370
|
+
|
371
|
+
if not isinstance(name, str):
|
372
|
+
raise OrionisContainerValueError("The name must be a valid string.")
|
373
|
+
|
374
|
+
if name not in self._aliases_services:
|
375
|
+
raise OrionisContainerValueError(f"Alias '{name}' is not registered in the container.")
|
376
|
+
|
377
|
+
return self._aliases_services[name]
|
378
|
+
|
379
|
+
def forgetScopedInstances(self) -> None:
|
380
|
+
"""
|
381
|
+
Clears all scoped instances.
|
382
|
+
|
383
|
+
Examples
|
384
|
+
--------
|
385
|
+
>>> container.forgetScopedInstances()
|
386
|
+
"""
|
387
|
+
|
388
|
+
self._scoped_instances = {}
|
389
|
+
|
390
|
+
def newRequest(self) -> None:
|
391
|
+
"""
|
392
|
+
Resets scoped instances to handle a new request.
|
393
|
+
|
394
|
+
Examples
|
395
|
+
--------
|
396
|
+
>>> container.newRequest()
|
397
|
+
"""
|
398
|
+
|
399
|
+
self.forgetScopedInstances()
|
400
|
+
|
401
|
+
async def make(self, abstract_or_alias: Callable[..., Any]) -> Any:
|
402
|
+
"""
|
403
|
+
Resolves and instantiates a service from the container.
|
404
|
+
|
405
|
+
Parameters
|
406
|
+
----------
|
407
|
+
abstract_or_alias : Callable[..., Any]
|
408
|
+
The abstract type or alias to resolve.
|
409
|
+
|
410
|
+
Returns
|
411
|
+
-------
|
412
|
+
Any
|
413
|
+
The instantiated service.
|
414
|
+
|
415
|
+
Raises
|
416
|
+
------
|
417
|
+
OrionisContainerException
|
418
|
+
If the service is not found.
|
419
|
+
|
420
|
+
Examples
|
421
|
+
--------
|
422
|
+
>>> service = await container.make(MyService)
|
423
|
+
"""
|
424
|
+
|
425
|
+
if abstract_or_alias in self._aliases_services:
|
426
|
+
abstract_or_alias = self._aliases_services[abstract_or_alias]
|
427
|
+
|
428
|
+
if abstract_or_alias in self._instances_services:
|
429
|
+
return self._instances_services[abstract_or_alias]
|
430
|
+
|
431
|
+
if abstract_or_alias in self._singleton_services:
|
432
|
+
if abstract_or_alias not in self._singleton_instances:
|
433
|
+
service = self._singleton_services[abstract_or_alias]
|
434
|
+
self._singleton_instances[abstract_or_alias] = await service['concrete']() if service['async'] else service['concrete']()
|
435
|
+
return self._singleton_instances[abstract_or_alias]
|
436
|
+
|
437
|
+
if abstract_or_alias in self._scoped_services:
|
438
|
+
if abstract_or_alias not in self._scoped_instances:
|
439
|
+
service = self._scoped_services[abstract_or_alias]
|
440
|
+
self._scoped_instances[abstract_or_alias] = await service['concrete']() if service['async'] else service['concrete']()
|
441
|
+
return self._scoped_instances[abstract_or_alias]
|
442
|
+
|
443
|
+
if abstract_or_alias in self._transient_services:
|
444
|
+
service = self._transient_services[abstract_or_alias]
|
445
|
+
return await service['concrete']() if service['async'] else service['concrete']()
|
446
|
+
|
447
|
+
raise OrionisContainerException(f"No binding found for '{abstract_or_alias}' in the container.")
|
448
|
+
|
449
|
+
def _resolve(self, concrete: Callable[..., Any], resolving: Optional[Deque[Type]] = None) -> Any:
|
450
|
+
"""
|
451
|
+
Resolves dependencies recursively and instantiates a class.
|
452
|
+
|
453
|
+
Parameters
|
454
|
+
----------
|
455
|
+
concrete : Callable[..., Any]
|
456
|
+
The concrete implementation to instantiate.
|
457
|
+
resolving : Optional[Deque[Type]], optional
|
458
|
+
A queue to track resolving dependencies and prevent circular dependencies.
|
459
|
+
|
460
|
+
Returns
|
461
|
+
-------
|
462
|
+
Any
|
463
|
+
The instantiated object.
|
464
|
+
|
465
|
+
Raises
|
466
|
+
------
|
467
|
+
OrionisContainerException
|
468
|
+
If circular dependencies are detected or instantiation fails.
|
469
|
+
|
470
|
+
Examples
|
471
|
+
--------
|
472
|
+
>>> instance = container._resolve(MyClass)
|
473
|
+
"""
|
474
|
+
|
475
|
+
if resolving is None:
|
476
|
+
resolving = deque()
|
477
|
+
|
478
|
+
if concrete in resolving:
|
479
|
+
raise OrionisContainerException(f"Circular dependency detected for {concrete}.")
|
480
|
+
|
481
|
+
resolving.append(concrete)
|
482
|
+
|
483
|
+
try:
|
484
|
+
signature = inspect.signature(concrete)
|
485
|
+
except ValueError as e:
|
486
|
+
raise OrionisContainerException(f"Unable to inspect signature of {concrete}: {str(e)}")
|
487
|
+
|
488
|
+
resolved_dependencies: Dict[str, Any] = {}
|
489
|
+
unresolved_dependencies = deque()
|
490
|
+
|
491
|
+
for param_name, param in signature.parameters.items():
|
492
|
+
if param_name == 'self':
|
493
|
+
continue
|
494
|
+
|
495
|
+
if param.kind in (param.VAR_POSITIONAL, param.VAR_KEYWORD):
|
496
|
+
continue
|
497
|
+
|
498
|
+
if param.annotation is param.empty and param.default is param.empty:
|
499
|
+
unresolved_dependencies.append(param_name)
|
500
|
+
continue
|
501
|
+
|
502
|
+
if param.default is not param.empty:
|
503
|
+
resolved_dependencies[param_name] = param.default
|
504
|
+
continue
|
505
|
+
|
506
|
+
if param.annotation is not param.empty:
|
507
|
+
param_type = param.annotation
|
508
|
+
|
509
|
+
if get_origin(param_type) is not None:
|
510
|
+
param_type = get_args(param_type)[0]
|
511
|
+
|
512
|
+
if isinstance(param_type, type) and not issubclass(param_type, (int, str, bool, float)):
|
513
|
+
if self.has(param_type):
|
514
|
+
resolved_dependencies[param_name] = self.make(f"{param_type.__module__}.{param_type.__name__}")
|
515
|
+
else:
|
516
|
+
resolved_dependencies[param_name] = self._resolve_dependency(param_type, resolving)
|
517
|
+
else:
|
518
|
+
resolved_dependencies[param_name] = param_type
|
519
|
+
|
520
|
+
while unresolved_dependencies:
|
521
|
+
dep_name = unresolved_dependencies.popleft()
|
522
|
+
if dep_name not in resolved_dependencies:
|
523
|
+
resolved_dependencies[dep_name] = self._resolve_dependency(dep_name, resolving)
|
524
|
+
|
525
|
+
try:
|
526
|
+
instance = concrete(**resolved_dependencies)
|
527
|
+
resolving.pop()
|
528
|
+
return instance
|
529
|
+
except Exception as e:
|
530
|
+
raise OrionisContainerException(f"Failed to instantiate {concrete}: {str(e)}")
|
531
|
+
|
532
|
+
def _resolve_dependency(self, dep_type: Any, resolving: Optional[Deque[Type]] = None) -> Any:
|
533
|
+
"""
|
534
|
+
Resolves a dependency by instantiating or retrieving it from the container.
|
535
|
+
|
536
|
+
Parameters
|
537
|
+
----------
|
538
|
+
dep_type : Any
|
539
|
+
The dependency type to resolve.
|
540
|
+
resolving : Optional[Deque[Type]], optional
|
541
|
+
A queue to track resolving dependencies.
|
542
|
+
|
543
|
+
Returns
|
544
|
+
-------
|
545
|
+
Any
|
546
|
+
The resolved dependency.
|
547
|
+
|
548
|
+
Raises
|
549
|
+
------
|
550
|
+
OrionisContainerException
|
551
|
+
If the dependency cannot be resolved.
|
552
|
+
|
553
|
+
Examples
|
554
|
+
--------
|
555
|
+
>>> dependency = container._resolve_dependency(MyDependency)
|
556
|
+
"""
|
557
|
+
|
558
|
+
if resolving is None:
|
559
|
+
resolving = deque()
|
560
|
+
|
561
|
+
if isinstance(dep_type, type):
|
562
|
+
if self.has(dep_type):
|
563
|
+
return self.make(f"{dep_type.__module__}.{dep_type.__name__}")
|
564
|
+
else:
|
565
|
+
return self._resolve(dep_type, resolving)
|
566
|
+
|
567
|
+
raise OrionisContainerException(f"Cannot resolve dependency of type {dep_type}")
|