orionis 0.472.0__tar.gz → 0.473.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.472.0/orionis.egg-info → orionis-0.473.0}/PKG-INFO +1 -1
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/core/reactor.py +1 -1
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/container.py +249 -35
- {orionis-0.472.0 → orionis-0.473.0}/orionis/metadata/framework.py +1 -1
- {orionis-0.472.0 → orionis-0.473.0/orionis.egg-info}/PKG-INFO +1 -1
- {orionis-0.472.0 → orionis-0.473.0}/orionis.egg-info/SOURCES.txt +4 -0
- orionis-0.473.0/tests/container/core/test_advanced_async.py +234 -0
- orionis-0.473.0/tests/container/core/test_async_optimizations.py +268 -0
- orionis-0.473.0/tests/container/mocks/mock_advanced_async.py +332 -0
- orionis-0.473.0/tests/container/mocks/mock_async_optimizations.py +407 -0
- {orionis-0.472.0 → orionis-0.473.0}/LICENCE +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/MANIFEST.in +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/README.md +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/app.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/args/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/args/argument.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/args/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/args/enums/actions.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/base/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/base/command.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/base/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/base/contracts/command.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/commands/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/commands/cache.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/commands/help.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/commands/publisher.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/commands/test.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/commands/version.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/commands/workflow.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/contracts/kernel.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/contracts/reactor.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/contracts/schedule.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/core/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/dumper/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/dumper/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/dumper/contracts/dump.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/dumper/dump.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/dynamic/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/dynamic/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/dynamic/contracts/progress_bar.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/dynamic/progress_bar.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/exceptions/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/exceptions/cli_exception.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/exceptions/cli_orionis_value_error.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/exceptions/cli_runtime_error.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/exceptions/cli_schedule_exception.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/kernel.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/output/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/output/console.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/output/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/output/contracts/console.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/output/contracts/executor.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/output/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/output/enums/styles.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/output/executor.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/tasks/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/console/tasks/schedule.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/context/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/context/manager.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/context/scope.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/contracts/container.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/contracts/service_provider.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/entities/binding.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/enums/lifetimes.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/exceptions/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/exceptions/attribute.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/exceptions/exception.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/exceptions/type.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/exceptions/value.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/facades/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/facades/facade.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/providers/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/providers/service_provider.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/validators/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/validators/implements.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/validators/is_abstract_class.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/validators/is_callable.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/validators/is_concrete_class.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/validators/is_instance.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/validators/is_not_subclass.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/validators/is_subclass.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/validators/is_valid_alias.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/container/validators/lifetime.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/application.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/app/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/app/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/app/entities/app.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/app/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/app/enums/ciphers.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/app/enums/environments.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/auth/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/auth/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/auth/entities/auth.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/cache/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/cache/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/cache/entities/cache.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/cache/entities/file.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/cache/entities/stores.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/cache/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/cache/enums/drivers.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/cors/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/cors/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/cors/entities/cors.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/entities/connections.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/entities/database.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/entities/mysql.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/entities/oracle.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/entities/pgsql.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/entities/sqlite.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/enums/mysql_charsets.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/enums/mysql_collations.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/enums/mysql_engine.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/enums/oracle_encoding.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/enums/oracle_nencoding.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/enums/pgsql_charsets.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/enums/pgsql_collations.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/enums/pgsql_mode.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/enums/sqlite_foreign_key.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/enums/sqlite_journal.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/database/enums/sqlite_synchronous.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/filesystems/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/filesystems/entitites/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/filesystems/entitites/aws.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/filesystems/entitites/disks.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/filesystems/entitites/filesystems.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/filesystems/entitites/local.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/filesystems/entitites/public.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/entities/channels.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/entities/chunked.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/entities/daily.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/entities/hourly.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/entities/logging.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/entities/monthly.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/entities/stack.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/entities/weekly.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/enums/levels.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/validators/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/validators/level.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/logging/validators/path.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/mail/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/mail/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/mail/entities/file.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/mail/entities/mail.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/mail/entities/mailers.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/mail/entities/smtp.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/queue/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/queue/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/queue/entities/brokers.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/queue/entities/database.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/queue/entities/queue.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/queue/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/queue/enums/strategy.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/roots/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/roots/paths.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/session/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/session/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/session/entities/session.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/session/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/session/enums/same_site_policy.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/session/helpers/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/session/helpers/secret_key.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/startup.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/testing/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/testing/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/testing/entities/testing.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/testing/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/testing/enums/drivers.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/testing/enums/mode.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/config/testing/enums/verbosity.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/contracts/application.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/contracts/config.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/exceptions/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/exceptions/integrity.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/exceptions/runtime.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/exceptions/type.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/exceptions/value.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/providers/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/providers/console_provider.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/providers/dumper_provider.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/providers/executor_provider.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/providers/inspirational_provider.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/providers/logger_provider.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/providers/progress_bar_provider.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/providers/reactor_provider.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/providers/testing_provider.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/foundation/providers/workers_provider.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/metadata/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/metadata/package.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/asynchrony/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/asynchrony/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/asynchrony/contracts/coroutines.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/asynchrony/coroutines.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/asynchrony/exceptions/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/asynchrony/exceptions/exception.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/contracts/caster.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/contracts/env.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/core/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/core/dot_env.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/dynamic/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/dynamic/caster.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/enums/value_type.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/env.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/exceptions/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/exceptions/exception.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/exceptions/value.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/helpers/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/helpers/functions.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/key/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/key/key_generator.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/validators/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/validators/key_name.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/environment/validators/types.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/inspirational/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/inspirational/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/inspirational/contracts/inspire.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/inspirational/inspire.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/inspirational/quotes.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/abstract/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/abstract/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/abstract/contracts/reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/abstract/reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/callables/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/callables/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/callables/contracts/reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/callables/reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/concretes/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/concretes/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/concretes/contracts/reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/concretes/reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/dependencies/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/dependencies/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/dependencies/contracts/reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/dependencies/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/dependencies/entities/argument.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/dependencies/entities/resolve_argument.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/dependencies/reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/exceptions/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/exceptions/attribute.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/exceptions/type.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/exceptions/value.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/instances/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/instances/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/instances/contracts/reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/instances/reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/modules/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/modules/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/modules/contracts/reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/modules/reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/objects/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/objects/types.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/introspection/reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/log/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/log/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/log/contracts/log_service.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/log/exceptions/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/log/exceptions/runtime.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/log/handlers/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/log/handlers/filename.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/log/handlers/size_rotating.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/log/handlers/timed_rotating.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/log/log_service.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/system/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/system/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/system/contracts/imports.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/system/contracts/workers.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/system/imports.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/system/runtime/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/system/runtime/imports.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/services/system/workers.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/entities/base.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/facades/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/facades/console.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/facades/dumper.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/facades/executor.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/facades/inspire.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/facades/logger.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/facades/progress_bar.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/facades/reactor.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/facades/testing.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/facades/workers.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/formatter/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/formatter/exceptions/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/formatter/exceptions/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/formatter/exceptions/contracts/parser.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/formatter/exceptions/parser.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/formatter/serializer.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/patterns/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/patterns/singleton/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/patterns/singleton/meta.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/standard/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/standard/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/standard/contracts/std.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/standard/exceptions/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/standard/exceptions/value.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/standard/std.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/wrapper/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/support/wrapper/dot_dict.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/cases/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/cases/asynchronous.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/cases/synchronous.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/contracts/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/contracts/dumper.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/contracts/kernel.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/contracts/logs.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/contracts/printer.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/contracts/render.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/contracts/test_result.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/contracts/unit_test.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/core/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/core/unit_test.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/entities/result.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/enums/status.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/exceptions/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/exceptions/config.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/exceptions/failure.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/exceptions/persistence.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/exceptions/runtime.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/exceptions/value.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/kernel.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/output/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/output/dumper.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/output/printer.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/records/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/records/logs.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/base_path.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/execution_mode.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/fail_fast.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/folder_path.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/module_name.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/name_pattern.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/pattern.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/persistent.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/persistent_driver.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/print_result.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/tags.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/throw_exception.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/verbosity.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/web_report.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/validators/workers.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/view/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis/test/view/render.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis.egg-info/dependency_links.txt +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis.egg-info/requires.txt +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis.egg-info/top_level.txt +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/orionis.egg-info/zip-safe +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/setup.cfg +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/setup.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/context/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/context/test_manager.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/context/test_scope.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/core/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/core/test_container.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/core/test_singleton.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/core/test_thread_safety.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/entities/test_binding.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/enums/test_lifetimes.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/facades/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/facades/test_facade.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/mocks/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/mocks/mock_auto_resolution.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/mocks/mock_complex_classes.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/mocks/mock_simple_classes.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/providers/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/providers/test_providers.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/validators/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/validators/test_implements.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/validators/test_is_abstract_class.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/validators/test_is_callable.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/validators/test_is_concrete_class.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/validators/test_is_instance.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/validators/test_is_not_subclass.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/validators/test_is_subclass.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/validators/test_is_valid_alias.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/container/validators/test_lifetime.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/example/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/example/test_example.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/app/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/app/test_foundation_config_app.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/auth/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/auth/test_foundation_config_auth.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/cache/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/cache/test_foundation_config_cache.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/cache/test_foundation_config_cache_file.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/cache/test_foundation_config_cache_stores.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/cors/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/cors/test_foundation_config_cors.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/database/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/database/test_foundation_config_database.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/database/test_foundation_config_database_connections.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/database/test_foundation_config_database_mysql.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/database/test_foundation_config_database_oracle.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/database/test_foundation_config_database_pgsql.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/database/test_foundation_config_database_sqlite.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/filesystems/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems_aws.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems_disks.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems_local.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems_public.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/logging/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/logging/test_foundation_config_logging.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/logging/test_foundation_config_logging_channels.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/logging/test_foundation_config_logging_chunked.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/logging/test_foundation_config_logging_daily.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/logging/test_foundation_config_logging_hourly.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/logging/test_foundation_config_logging_monthly.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/logging/test_foundation_config_logging_stack.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/logging/test_foundation_config_logging_weekly.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/mail/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/mail/test_foundation_config_mail.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/mail/test_foundation_config_mail_file.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/mail/test_foundation_config_mail_mailers.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/mail/test_foundation_config_mail_smtp.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/queue/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/queue/test_foundation_config_queue.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/queue/test_foundation_config_queue_brokers.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/queue/test_foundation_config_queue_database.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/root/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/root/test_foundation_config_root_paths.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/session/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/session/test_foundation_config_session.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/startup/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/startup/test_foundation_config_startup.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/testing/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/foundation/config/testing/test_foundation_config_testing.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/metadata/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/metadata/test_metadata_framework.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/metadata/test_metadata_package.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/asynchrony/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/asynchrony/test_services_asynchrony_coroutine.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/environment/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/environment/test_services_environment.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/dependencies/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/dependencies/mocks/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/dependencies/mocks/mock_user.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/dependencies/mocks/mock_user_controller.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/dependencies/mocks/mock_users_permissions.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/dependencies/test_reflect_dependencies.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/reflection/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/reflection/mock/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/reflection/mock/fake_reflect_instance.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/reflection/test_reflection_abstract.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/reflection/test_reflection_callable.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/reflection/test_reflection_concrete.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/reflection/test_reflection_instance.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/reflection/test_reflection_module.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/introspection/test_reflection.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/log/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/log/test_log.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/system/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/system/test_services_system_imports.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/services/system/test_services_system_workers.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/support/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/support/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/support/entities/mock_dataclass.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/support/entities/test_base.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/support/patterns/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/support/patterns/singleton/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/support/patterns/singleton/test_patterns_singleton.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/support/standard/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/support/standard/test_services_std.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/support/wrapper/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/support/wrapper/test_services_wrapper_docdict.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/cases/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/cases/test_testing_asynchronous.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/cases/test_testing_synchronous.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/entities/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/entities/test_testing_result.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/enums/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/enums/test_testing_status.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/output/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/output/test_testing_dumper.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/output/test_testing_printer.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/records/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/records/test_testing_records.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/test_testing_unit.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/validators/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/validators/test_testing_validators.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/view/__init__.py +0 -0
- {orionis-0.472.0 → orionis-0.473.0}/tests/testing/view/test_render.py +0 -0
|
@@ -520,7 +520,7 @@ class Reactor(IReactor):
|
|
|
520
520
|
command_instance._args = {}
|
|
521
521
|
|
|
522
522
|
# Call the handle method of the command instance
|
|
523
|
-
output =
|
|
523
|
+
output = self.__app.call(command_instance, 'handle')
|
|
524
524
|
|
|
525
525
|
# Log the command execution completion with DONE state
|
|
526
526
|
elapsed_time = round(time.perf_counter() - start_time, 2)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import abc
|
|
2
|
+
import asyncio
|
|
2
3
|
import inspect
|
|
3
4
|
import threading
|
|
4
5
|
import typing
|
|
@@ -106,6 +107,122 @@ class Container(IContainer):
|
|
|
106
107
|
# Mark this instance as initialized
|
|
107
108
|
self.__initialized = True
|
|
108
109
|
|
|
110
|
+
def __handleSyncAsyncResult(
|
|
111
|
+
self,
|
|
112
|
+
result: Any
|
|
113
|
+
) -> Any:
|
|
114
|
+
"""
|
|
115
|
+
Universal helper to handle both synchronous and asynchronous results.
|
|
116
|
+
|
|
117
|
+
This method automatically detects if a result is a coroutine and handles
|
|
118
|
+
it appropriately based on the current execution context.
|
|
119
|
+
|
|
120
|
+
Parameters
|
|
121
|
+
----------
|
|
122
|
+
result : Any
|
|
123
|
+
The result to handle, which may be a coroutine or regular value.
|
|
124
|
+
|
|
125
|
+
Returns
|
|
126
|
+
-------
|
|
127
|
+
Any
|
|
128
|
+
The resolved result. If the result was a coroutine, it will be awaited
|
|
129
|
+
if possible, or scheduled appropriately.
|
|
130
|
+
"""
|
|
131
|
+
|
|
132
|
+
# If the result is not a coroutine, return it directly
|
|
133
|
+
if not asyncio.iscoroutine(result):
|
|
134
|
+
return result
|
|
135
|
+
|
|
136
|
+
try:
|
|
137
|
+
|
|
138
|
+
# Check if we're currently in an event loop
|
|
139
|
+
loop = asyncio.get_running_loop()
|
|
140
|
+
|
|
141
|
+
# If we're in an async context, we need to let the caller handle the coroutine
|
|
142
|
+
# Since we can't await here, we'll create a task and get the result synchronously
|
|
143
|
+
# This is a compromise for mixed sync/async environments
|
|
144
|
+
if loop.is_running():
|
|
145
|
+
|
|
146
|
+
# For running loops, we create a new thread to run the coroutine
|
|
147
|
+
import concurrent.futures
|
|
148
|
+
|
|
149
|
+
# Define a function to run the coroutine in a new event loop
|
|
150
|
+
def run_coroutine():
|
|
151
|
+
|
|
152
|
+
# Create a new event loop for this thread
|
|
153
|
+
new_loop = asyncio.new_event_loop()
|
|
154
|
+
asyncio.set_event_loop(new_loop)
|
|
155
|
+
|
|
156
|
+
# Run the coroutine until completion
|
|
157
|
+
try:
|
|
158
|
+
return new_loop.run_until_complete(result)
|
|
159
|
+
|
|
160
|
+
# Finally, ensure the loop is closed to free resources
|
|
161
|
+
finally:
|
|
162
|
+
new_loop.close()
|
|
163
|
+
|
|
164
|
+
# Use ThreadPoolExecutor to run the coroutine in a separate thread
|
|
165
|
+
with concurrent.futures.ThreadPoolExecutor() as executor:
|
|
166
|
+
future = executor.submit(run_coroutine)
|
|
167
|
+
return future.result()
|
|
168
|
+
|
|
169
|
+
else:
|
|
170
|
+
# If loop exists but not running, we can run the coroutine
|
|
171
|
+
return loop.run_until_complete(result)
|
|
172
|
+
|
|
173
|
+
except RuntimeError:
|
|
174
|
+
|
|
175
|
+
# No event loop running, we can run the coroutine directly
|
|
176
|
+
return asyncio.run(result)
|
|
177
|
+
|
|
178
|
+
def __invokeCallableUniversal(
|
|
179
|
+
self,
|
|
180
|
+
fn: Callable[..., Any],
|
|
181
|
+
*args,
|
|
182
|
+
**kwargs
|
|
183
|
+
) -> Any:
|
|
184
|
+
"""
|
|
185
|
+
Universal callable invoker that handles both sync and async callables.
|
|
186
|
+
|
|
187
|
+
Parameters
|
|
188
|
+
----------
|
|
189
|
+
fn : Callable[..., Any]
|
|
190
|
+
The callable to invoke.
|
|
191
|
+
*args : tuple
|
|
192
|
+
Positional arguments to pass to the callable.
|
|
193
|
+
**kwargs : dict
|
|
194
|
+
Keyword arguments to pass to the callable.
|
|
195
|
+
|
|
196
|
+
Returns
|
|
197
|
+
-------
|
|
198
|
+
Any
|
|
199
|
+
The result of the callable invocation.
|
|
200
|
+
|
|
201
|
+
Raises
|
|
202
|
+
------
|
|
203
|
+
OrionisContainerException
|
|
204
|
+
If the callable invocation fails.
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
try:
|
|
208
|
+
|
|
209
|
+
# Check if the callable is a coroutine function
|
|
210
|
+
result = fn(*args, **kwargs)
|
|
211
|
+
return self.__handleSyncAsyncResult(result)
|
|
212
|
+
|
|
213
|
+
except TypeError as e:
|
|
214
|
+
|
|
215
|
+
# If invocation fails, use ReflectionCallable for better error messaging
|
|
216
|
+
rf_callable = ReflectionCallable(fn)
|
|
217
|
+
function_name = rf_callable.getName()
|
|
218
|
+
signature = rf_callable.getSignature()
|
|
219
|
+
|
|
220
|
+
# Raise a more informative exception with the function name and signature
|
|
221
|
+
raise OrionisContainerException(
|
|
222
|
+
f"Failed to invoke function [{function_name}] with the provided arguments: {e}\n"
|
|
223
|
+
f"Expected function signature: [{signature}]"
|
|
224
|
+
) from e
|
|
225
|
+
|
|
109
226
|
def transient(
|
|
110
227
|
self,
|
|
111
228
|
abstract: Callable[..., Any],
|
|
@@ -1284,6 +1401,7 @@ class Container(IContainer):
|
|
|
1284
1401
|
) -> Any:
|
|
1285
1402
|
"""
|
|
1286
1403
|
Invokes a callable with the provided arguments.
|
|
1404
|
+
Supports both synchronous and asynchronous callables automatically.
|
|
1287
1405
|
|
|
1288
1406
|
Parameters
|
|
1289
1407
|
----------
|
|
@@ -1297,27 +1415,10 @@ class Container(IContainer):
|
|
|
1297
1415
|
Returns
|
|
1298
1416
|
-------
|
|
1299
1417
|
Any
|
|
1300
|
-
The result of the callable.
|
|
1418
|
+
The result of the callable. If the callable is async,
|
|
1419
|
+
the coroutine will be handled automatically.
|
|
1301
1420
|
"""
|
|
1302
|
-
|
|
1303
|
-
# Try to invoke the callable with the provided arguments
|
|
1304
|
-
try:
|
|
1305
|
-
|
|
1306
|
-
# If the callable is a function, invoke it directly
|
|
1307
|
-
return fn(*args, **kwargs)
|
|
1308
|
-
|
|
1309
|
-
except TypeError as e:
|
|
1310
|
-
|
|
1311
|
-
# If invocation fails, use ReflectionCallable to get function name and signature
|
|
1312
|
-
rf_callable = ReflectionCallable(fn)
|
|
1313
|
-
function_name = rf_callable.getName()
|
|
1314
|
-
signature = rf_callable.getSignature()
|
|
1315
|
-
|
|
1316
|
-
# Raise an exception with detailed information about the failure
|
|
1317
|
-
raise OrionisContainerException(
|
|
1318
|
-
f"Failed to invoke function [{function_name}] with the provided arguments: {e}\n"
|
|
1319
|
-
f"Expected function signature: [{signature}]"
|
|
1320
|
-
) from e
|
|
1421
|
+
return self.__invokeCallableUniversal(fn, *args, **kwargs)
|
|
1321
1422
|
|
|
1322
1423
|
def __instantiateConcreteReflective(
|
|
1323
1424
|
self,
|
|
@@ -1359,13 +1460,13 @@ class Container(IContainer):
|
|
|
1359
1460
|
|
|
1360
1461
|
# Try simple call first for functions without parameters
|
|
1361
1462
|
try:
|
|
1362
|
-
|
|
1363
1463
|
# Use ReflectionCallable to get dependencies
|
|
1364
1464
|
dependencies = ReflectionCallable(fn).getDependencies()
|
|
1365
1465
|
|
|
1366
1466
|
# If there are no required parameters, call directly
|
|
1367
1467
|
if not dependencies or (not dependencies.resolved and not dependencies.unresolved):
|
|
1368
|
-
|
|
1468
|
+
result = fn()
|
|
1469
|
+
return self.__handleSyncAsyncResult(result)
|
|
1369
1470
|
|
|
1370
1471
|
# If there are unresolved dependencies, raise an exception
|
|
1371
1472
|
if dependencies.unresolved:
|
|
@@ -1379,13 +1480,19 @@ class Container(IContainer):
|
|
|
1379
1480
|
getattr(fn, '__name__', str(fn)),
|
|
1380
1481
|
dependencies
|
|
1381
1482
|
)
|
|
1382
|
-
|
|
1483
|
+
|
|
1484
|
+
# Invoke the callable with resolved parameters
|
|
1485
|
+
result = fn(**resolved_params)
|
|
1486
|
+
|
|
1487
|
+
# Handle the result, which may be a coroutine
|
|
1488
|
+
return self.__handleSyncAsyncResult(result)
|
|
1383
1489
|
|
|
1384
1490
|
except Exception as inspect_error:
|
|
1385
1491
|
|
|
1386
1492
|
# If inspection fails, try direct call as last resort
|
|
1387
1493
|
try:
|
|
1388
|
-
|
|
1494
|
+
result = fn()
|
|
1495
|
+
return self.__handleSyncAsyncResult(result)
|
|
1389
1496
|
|
|
1390
1497
|
# If direct call fails, raise inspection error
|
|
1391
1498
|
except TypeError:
|
|
@@ -1533,6 +1640,7 @@ class Container(IContainer):
|
|
|
1533
1640
|
return params
|
|
1534
1641
|
|
|
1535
1642
|
except Exception as e:
|
|
1643
|
+
|
|
1536
1644
|
# If the exception is already an OrionisContainerException, re-raise it
|
|
1537
1645
|
if isinstance(e, OrionisContainerException):
|
|
1538
1646
|
raise e from None
|
|
@@ -1621,6 +1729,7 @@ class Container(IContainer):
|
|
|
1621
1729
|
) -> Any:
|
|
1622
1730
|
"""
|
|
1623
1731
|
Helper method to instantiate a target with reflection-based dependency resolution.
|
|
1732
|
+
Supports both synchronous and asynchronous callables automatically.
|
|
1624
1733
|
|
|
1625
1734
|
Parameters
|
|
1626
1735
|
----------
|
|
@@ -1632,13 +1741,20 @@ class Container(IContainer):
|
|
|
1632
1741
|
Returns
|
|
1633
1742
|
-------
|
|
1634
1743
|
Any
|
|
1635
|
-
The instantiated object or callable result.
|
|
1744
|
+
The instantiated object or callable result. If the callable is async,
|
|
1745
|
+
the coroutine will be handled automatically.
|
|
1636
1746
|
"""
|
|
1637
1747
|
|
|
1748
|
+
# Reflect the target to get its dependencies
|
|
1638
1749
|
resolved_params = self.__resolveDependencies(
|
|
1639
1750
|
*self.__reflectTarget(target, is_class=is_class)
|
|
1640
1751
|
)
|
|
1641
|
-
|
|
1752
|
+
|
|
1753
|
+
# If the target is a class, instantiate it with resolved parameters
|
|
1754
|
+
result = target(**resolved_params)
|
|
1755
|
+
|
|
1756
|
+
# Handle the result, which may be a coroutine
|
|
1757
|
+
return self.__handleSyncAsyncResult(result)
|
|
1642
1758
|
|
|
1643
1759
|
def resolveWithoutContainer(
|
|
1644
1760
|
self,
|
|
@@ -2118,6 +2234,7 @@ class Container(IContainer):
|
|
|
2118
2234
|
) -> Any:
|
|
2119
2235
|
"""
|
|
2120
2236
|
Call a method on an instance with automatic dependency injection.
|
|
2237
|
+
Supports both synchronous and asynchronous methods automatically.
|
|
2121
2238
|
|
|
2122
2239
|
Parameters
|
|
2123
2240
|
----------
|
|
@@ -2133,13 +2250,84 @@ class Container(IContainer):
|
|
|
2133
2250
|
Returns
|
|
2134
2251
|
-------
|
|
2135
2252
|
Any
|
|
2136
|
-
The result of the method call.
|
|
2253
|
+
The result of the method call. If the method is async,
|
|
2254
|
+
the coroutine will be handled automatically.
|
|
2255
|
+
"""
|
|
2256
|
+
|
|
2257
|
+
# Validate inputs
|
|
2258
|
+
self.__validateCallInputs(instance, method_name)
|
|
2259
|
+
|
|
2260
|
+
# Get the method
|
|
2261
|
+
method = getattr(instance, method_name)
|
|
2262
|
+
|
|
2263
|
+
# Execute the method with appropriate handling
|
|
2264
|
+
return self.__executeMethod(method, *args, **kwargs)
|
|
2265
|
+
|
|
2266
|
+
async def callAsync(
|
|
2267
|
+
self,
|
|
2268
|
+
instance: Any,
|
|
2269
|
+
method_name: str,
|
|
2270
|
+
*args,
|
|
2271
|
+
**kwargs
|
|
2272
|
+
) -> Any:
|
|
2273
|
+
"""
|
|
2274
|
+
Async version of call for when you're in an async context and need to await the result.
|
|
2275
|
+
|
|
2276
|
+
Parameters
|
|
2277
|
+
----------
|
|
2278
|
+
instance : Any
|
|
2279
|
+
The instance on which to call the method.
|
|
2280
|
+
method_name : str
|
|
2281
|
+
The name of the method to call.
|
|
2282
|
+
*args : tuple
|
|
2283
|
+
Positional arguments to pass to the method.
|
|
2284
|
+
**kwargs : dict
|
|
2285
|
+
Keyword arguments to pass to the method.
|
|
2286
|
+
|
|
2287
|
+
Returns
|
|
2288
|
+
-------
|
|
2289
|
+
Any
|
|
2290
|
+
The result of the method call, properly awaited if async.
|
|
2291
|
+
"""
|
|
2292
|
+
|
|
2293
|
+
# Validate inputs
|
|
2294
|
+
self.__validateCallInputs(instance, method_name)
|
|
2295
|
+
|
|
2296
|
+
# Get the method
|
|
2297
|
+
method = getattr(instance, method_name)
|
|
2298
|
+
|
|
2299
|
+
# Execute the method with async handling
|
|
2300
|
+
result = self.__executeMethod(method, *args, **kwargs)
|
|
2301
|
+
|
|
2302
|
+
# If the result is a coroutine, await it
|
|
2303
|
+
if asyncio.iscoroutine(result):
|
|
2304
|
+
return await result
|
|
2305
|
+
|
|
2306
|
+
# Otherwise, return the result directly
|
|
2307
|
+
return result
|
|
2308
|
+
|
|
2309
|
+
def __validateCallInputs(self, instance: Any, method_name: str) -> None:
|
|
2310
|
+
"""
|
|
2311
|
+
Validates the inputs for the call methods.
|
|
2312
|
+
|
|
2313
|
+
Parameters
|
|
2314
|
+
----------
|
|
2315
|
+
instance : Any
|
|
2316
|
+
The instance to validate.
|
|
2317
|
+
method_name : str
|
|
2318
|
+
The method name to validate.
|
|
2319
|
+
|
|
2320
|
+
Raises
|
|
2321
|
+
------
|
|
2322
|
+
OrionisContainerException
|
|
2323
|
+
If validation fails.
|
|
2137
2324
|
"""
|
|
2138
2325
|
|
|
2139
2326
|
# Ensure the instance is a valid object (allow __main__ for development)
|
|
2140
2327
|
if instance is None:
|
|
2141
2328
|
raise OrionisContainerException("Instance cannot be None")
|
|
2142
2329
|
|
|
2330
|
+
# Ensure the instance is a valid object with a class
|
|
2143
2331
|
if not hasattr(instance, '__class__'):
|
|
2144
2332
|
raise OrionisContainerException("Instance must be a valid object with a class")
|
|
2145
2333
|
|
|
@@ -2161,12 +2349,35 @@ class Container(IContainer):
|
|
|
2161
2349
|
f"Method '{method_name}' not found or not callable on instance '{type(instance).__name__}'."
|
|
2162
2350
|
)
|
|
2163
2351
|
|
|
2352
|
+
def __executeMethod(
|
|
2353
|
+
self,
|
|
2354
|
+
method: Callable,
|
|
2355
|
+
*args,
|
|
2356
|
+
**kwargs
|
|
2357
|
+
) -> Any:
|
|
2358
|
+
"""
|
|
2359
|
+
Executes a method with automatic dependency injection and sync/async handling.
|
|
2360
|
+
|
|
2361
|
+
Parameters
|
|
2362
|
+
----------
|
|
2363
|
+
method : Callable
|
|
2364
|
+
The method to execute.
|
|
2365
|
+
*args : tuple
|
|
2366
|
+
Positional arguments to pass to the method.
|
|
2367
|
+
**kwargs : dict
|
|
2368
|
+
Keyword arguments to pass to the method.
|
|
2369
|
+
|
|
2370
|
+
Returns
|
|
2371
|
+
-------
|
|
2372
|
+
Any
|
|
2373
|
+
The result of the method execution.
|
|
2374
|
+
"""
|
|
2375
|
+
|
|
2164
2376
|
# If args or kwargs are provided, use them directly
|
|
2165
2377
|
if args or kwargs:
|
|
2166
|
-
return self.
|
|
2378
|
+
return self.__invokeCallableUniversal(method, *args, **kwargs)
|
|
2167
2379
|
|
|
2168
2380
|
# For methods without provided arguments, try simple call first
|
|
2169
|
-
# This avoids reflection issues for simple methods
|
|
2170
2381
|
try:
|
|
2171
2382
|
|
|
2172
2383
|
# Get method signature to check if it needs parameters
|
|
@@ -2178,19 +2389,22 @@ class Container(IContainer):
|
|
|
2178
2389
|
|
|
2179
2390
|
# If no required parameters, call directly
|
|
2180
2391
|
if not params:
|
|
2181
|
-
|
|
2392
|
+
result = method()
|
|
2393
|
+
return self.__handleSyncAsyncResult(result)
|
|
2182
2394
|
|
|
2183
2395
|
# If has required parameters, try dependency injection
|
|
2184
|
-
|
|
2396
|
+
result = self.__instantiateWithReflection(method, is_class=False)
|
|
2397
|
+
return result
|
|
2185
2398
|
|
|
2186
2399
|
except Exception as reflection_error:
|
|
2187
2400
|
|
|
2188
2401
|
# If reflection fails, try simple call as fallback
|
|
2189
2402
|
try:
|
|
2190
|
-
|
|
2403
|
+
result = method()
|
|
2404
|
+
return self.__handleSyncAsyncResult(result)
|
|
2191
2405
|
|
|
2192
|
-
# If simple call
|
|
2406
|
+
# If both reflection and simple call fail, raise an exception
|
|
2193
2407
|
except TypeError:
|
|
2194
2408
|
raise OrionisContainerException(
|
|
2195
|
-
f"Failed to call method '{
|
|
2196
|
-
) from reflection_error
|
|
2409
|
+
f"Failed to call method '{method.__name__}': {reflection_error}"
|
|
2410
|
+
) from reflection_error
|
|
@@ -372,6 +372,8 @@ tests/container/context/__init__.py
|
|
|
372
372
|
tests/container/context/test_manager.py
|
|
373
373
|
tests/container/context/test_scope.py
|
|
374
374
|
tests/container/core/__init__.py
|
|
375
|
+
tests/container/core/test_advanced_async.py
|
|
376
|
+
tests/container/core/test_async_optimizations.py
|
|
375
377
|
tests/container/core/test_container.py
|
|
376
378
|
tests/container/core/test_singleton.py
|
|
377
379
|
tests/container/core/test_thread_safety.py
|
|
@@ -382,6 +384,8 @@ tests/container/enums/test_lifetimes.py
|
|
|
382
384
|
tests/container/facades/__init__.py
|
|
383
385
|
tests/container/facades/test_facade.py
|
|
384
386
|
tests/container/mocks/__init__.py
|
|
387
|
+
tests/container/mocks/mock_advanced_async.py
|
|
388
|
+
tests/container/mocks/mock_async_optimizations.py
|
|
385
389
|
tests/container/mocks/mock_auto_resolution.py
|
|
386
390
|
tests/container/mocks/mock_complex_classes.py
|
|
387
391
|
tests/container/mocks/mock_simple_classes.py
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from orionis.container.container import Container
|
|
3
|
+
from orionis.test.cases.asynchronous import AsyncTestCase
|
|
4
|
+
from tests.container.mocks.mock_advanced_async import ErrorService, IPerformanceService, MixedConsumer, PerformanceService, simple_async, sync_returns_coroutine
|
|
5
|
+
|
|
6
|
+
class TestContainer(AsyncTestCase):
|
|
7
|
+
|
|
8
|
+
async def testPerformanceComparison(self):
|
|
9
|
+
"""
|
|
10
|
+
Measures and verifies the performance of synchronous service calls within the container.
|
|
11
|
+
|
|
12
|
+
This test performs the following steps:
|
|
13
|
+
- Instantiates a container and registers `PerformanceService` as a singleton for the `IPerformanceService` interface.
|
|
14
|
+
- Resolves the registered service from the container.
|
|
15
|
+
- Executes the synchronous operation multiple times using the container's `call` method, measuring the total elapsed time.
|
|
16
|
+
- Asserts that the synchronous operation returns the expected result.
|
|
17
|
+
- Asserts that the measured execution time is greater than zero, confirming that the operation duration is measurable.
|
|
18
|
+
|
|
19
|
+
Returns
|
|
20
|
+
-------
|
|
21
|
+
None
|
|
22
|
+
This method does not return a value. Assertions are used to validate expected behavior.
|
|
23
|
+
"""
|
|
24
|
+
# Create a container instance
|
|
25
|
+
container = Container()
|
|
26
|
+
|
|
27
|
+
# Register the PerformanceService as a singleton for the IPerformanceService interface
|
|
28
|
+
container.singleton(IPerformanceService, PerformanceService)
|
|
29
|
+
|
|
30
|
+
# Resolve the service instance from the container
|
|
31
|
+
service = container.make(IPerformanceService)
|
|
32
|
+
|
|
33
|
+
# Start timing the synchronous calls
|
|
34
|
+
start_time = time.time()
|
|
35
|
+
|
|
36
|
+
# Call the sync operation multiple times to measure performance
|
|
37
|
+
for i in range(3):
|
|
38
|
+
result = container.call(service, 'sync_operation')
|
|
39
|
+
|
|
40
|
+
# Calculate the total elapsed time for synchronous calls
|
|
41
|
+
sync_time = time.time() - start_time
|
|
42
|
+
|
|
43
|
+
# Assert that the sync operation returns the expected result
|
|
44
|
+
self.assertEqual(result, "Sync operation completed")
|
|
45
|
+
|
|
46
|
+
# Assert that the measured time is greater than zero
|
|
47
|
+
self.assertGreater(sync_time, 0, "Sync operation should take some time")
|
|
48
|
+
|
|
49
|
+
async def testAsyncPerformance(self):
|
|
50
|
+
"""
|
|
51
|
+
Measures and verifies the performance of asynchronous service calls within the container.
|
|
52
|
+
|
|
53
|
+
This test performs the following steps:
|
|
54
|
+
- Instantiates a container and registers `PerformanceService` as a singleton for the `IPerformanceService` interface.
|
|
55
|
+
- Resolves the registered service from the container.
|
|
56
|
+
- Executes the asynchronous operation multiple times using both `call` and `callAsync` methods, measuring the total elapsed time.
|
|
57
|
+
- Asserts that the asynchronous operation returns the expected result.
|
|
58
|
+
- Asserts that the measured execution time is greater than zero, confirming that the operation duration is measurable.
|
|
59
|
+
|
|
60
|
+
Returns
|
|
61
|
+
-------
|
|
62
|
+
None
|
|
63
|
+
This method does not return a value. Assertions are used to validate expected behavior.
|
|
64
|
+
|
|
65
|
+
Raises
|
|
66
|
+
------
|
|
67
|
+
AssertionError
|
|
68
|
+
If the asynchronous operation does not return the expected result or if the measured time is not greater than zero.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
# Create a container instance
|
|
72
|
+
container = Container()
|
|
73
|
+
|
|
74
|
+
# Register the PerformanceService as a singleton for the IPerformanceService interface
|
|
75
|
+
container.singleton(IPerformanceService, PerformanceService)
|
|
76
|
+
|
|
77
|
+
# Resolve the service instance from the container
|
|
78
|
+
service = container.make(IPerformanceService)
|
|
79
|
+
|
|
80
|
+
# Start timing the asynchronous calls
|
|
81
|
+
start_time = time.time()
|
|
82
|
+
|
|
83
|
+
# Call the async operation multiple times using the container's call method
|
|
84
|
+
for i in range(3):
|
|
85
|
+
|
|
86
|
+
# Await the result of the async operation
|
|
87
|
+
result = container.call(service, 'async_operation')
|
|
88
|
+
|
|
89
|
+
# Calculate the total elapsed time for asynchronous calls
|
|
90
|
+
async_time = time.time() - start_time
|
|
91
|
+
|
|
92
|
+
# Assert that the async operation returns the expected result
|
|
93
|
+
self.assertEqual(result, "Async operation completed")
|
|
94
|
+
|
|
95
|
+
# Call the async operation multiple times using the container's callAsync method
|
|
96
|
+
for i in range(3):
|
|
97
|
+
result = await container.callAsync(service, 'async_operation')
|
|
98
|
+
|
|
99
|
+
# Assert that the async operation returns the expected result
|
|
100
|
+
self.assertEqual(result, "Async operation completed")
|
|
101
|
+
|
|
102
|
+
# Assert that the measured time is greater than zero
|
|
103
|
+
self.assertGreater(async_time, 0, "Async operation should take some time")
|
|
104
|
+
|
|
105
|
+
async def testErrorHandling(self):
|
|
106
|
+
"""
|
|
107
|
+
Tests the error handling capabilities of the container for both synchronous and asynchronous service methods.
|
|
108
|
+
|
|
109
|
+
This method performs the following steps:
|
|
110
|
+
- Instantiates a container and resolves the `ErrorService`.
|
|
111
|
+
- Invokes a synchronous method that is expected to raise an exception and asserts that the exception is raised.
|
|
112
|
+
- (Asynchronous error handling is tested elsewhere.)
|
|
113
|
+
|
|
114
|
+
Returns
|
|
115
|
+
-------
|
|
116
|
+
None
|
|
117
|
+
This method does not return a value. Assertions are used to validate that exceptions are properly raised.
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
# Create a container instance
|
|
121
|
+
container = Container()
|
|
122
|
+
|
|
123
|
+
# Resolve the ErrorService instance from the container
|
|
124
|
+
service = container.make(ErrorService)
|
|
125
|
+
|
|
126
|
+
# Test synchronous error handling: expect an exception to be raised
|
|
127
|
+
with self.assertRaises(Exception) as context:
|
|
128
|
+
container.call(service, 'sync_error_method')
|
|
129
|
+
|
|
130
|
+
async def testAsyncErrors(self):
|
|
131
|
+
|
|
132
|
+
# Create a container instance
|
|
133
|
+
container = Container()
|
|
134
|
+
|
|
135
|
+
# Resolve the ErrorService instance from the container
|
|
136
|
+
service = container.make(ErrorService)
|
|
137
|
+
|
|
138
|
+
# Call the async error method and await its result
|
|
139
|
+
with self.assertRaises(Exception) as context:
|
|
140
|
+
await container.callAsync(service, 'async_error_method')
|
|
141
|
+
|
|
142
|
+
async def testMixedDependencyInjection(self):
|
|
143
|
+
"""
|
|
144
|
+
Tests the container's ability to perform mixed synchronous and asynchronous dependency injection.
|
|
145
|
+
|
|
146
|
+
This test performs the following steps:
|
|
147
|
+
- Instantiates a container and uses it to auto-resolve dependencies for the `MixedConsumer` class.
|
|
148
|
+
- Invokes a synchronous method with dependency injection and verifies its return value.
|
|
149
|
+
- (Asynchronous methods are tested elsewhere.)
|
|
150
|
+
|
|
151
|
+
The test asserts that:
|
|
152
|
+
- The synchronous method returns a string starting with "Sync:".
|
|
153
|
+
|
|
154
|
+
Returns
|
|
155
|
+
-------
|
|
156
|
+
None
|
|
157
|
+
This method does not return a value. Assertions are used to validate expected behavior.
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
# Create an instance of the container
|
|
161
|
+
container = Container()
|
|
162
|
+
|
|
163
|
+
# Auto-resolve dependencies for MixedConsumer
|
|
164
|
+
consumer = container.make(MixedConsumer)
|
|
165
|
+
|
|
166
|
+
# Test synchronous method with dependency injection
|
|
167
|
+
sync_result: str = container.call(consumer, 'sync_method')
|
|
168
|
+
|
|
169
|
+
# Assert that the result starts with "Sync:"
|
|
170
|
+
self.assertTrue(sync_result.startswith("Sync:"))
|
|
171
|
+
|
|
172
|
+
async def testAsyncWithDI(self):
|
|
173
|
+
"""
|
|
174
|
+
Tests the container's capability to perform asynchronous dependency injection.
|
|
175
|
+
|
|
176
|
+
This test performs the following steps:
|
|
177
|
+
- Instantiates a container and uses it to auto-resolve dependencies for the `MixedConsumer` class.
|
|
178
|
+
- Invokes an asynchronous method with dependency injection and verifies its return value.
|
|
179
|
+
|
|
180
|
+
The test asserts that:
|
|
181
|
+
- The asynchronous method returns a string starting with "Mixed: ".
|
|
182
|
+
|
|
183
|
+
Returns
|
|
184
|
+
-------
|
|
185
|
+
None
|
|
186
|
+
This method does not return a value. Assertions are used to validate expected behavior.
|
|
187
|
+
"""
|
|
188
|
+
|
|
189
|
+
# Create an instance of the container
|
|
190
|
+
container = Container()
|
|
191
|
+
|
|
192
|
+
# Auto-resolve dependencies for MixedConsumer
|
|
193
|
+
consumer = container.make(MixedConsumer)
|
|
194
|
+
|
|
195
|
+
# Call the asynchronous method with dependency injection
|
|
196
|
+
async_result: str = await container.callAsync(consumer, 'async_method')
|
|
197
|
+
|
|
198
|
+
# Assert that the result starts with "Mixed: "
|
|
199
|
+
self.assertTrue(async_result.startswith("Mixed: "))
|
|
200
|
+
|
|
201
|
+
async def testCallableAsyncSync(self):
|
|
202
|
+
"""
|
|
203
|
+
Tests the container's ability to register and resolve both synchronous and asynchronous callable functions,
|
|
204
|
+
ensuring that both types return coroutine objects when resolved.
|
|
205
|
+
|
|
206
|
+
This method performs the following steps:
|
|
207
|
+
- Instantiates a container and registers two callable functions:
|
|
208
|
+
- A synchronous function that returns a coroutine.
|
|
209
|
+
- An asynchronous function.
|
|
210
|
+
- Resolves each callable from the container.
|
|
211
|
+
- Asserts that the resolved objects are coroutine objects by checking for the '__await__' attribute.
|
|
212
|
+
|
|
213
|
+
Returns
|
|
214
|
+
-------
|
|
215
|
+
None
|
|
216
|
+
This method does not return a value. Assertions are used to validate that the resolved callables are coroutine objects.
|
|
217
|
+
"""
|
|
218
|
+
|
|
219
|
+
# Create a container instance
|
|
220
|
+
container = Container()
|
|
221
|
+
|
|
222
|
+
# Register a synchronous function that returns a coroutine
|
|
223
|
+
container.callable("sync_returns_coro", sync_returns_coroutine)
|
|
224
|
+
|
|
225
|
+
# Register an asynchronous function
|
|
226
|
+
container.callable("simple_async", simple_async)
|
|
227
|
+
|
|
228
|
+
# Resolve the synchronous function and check if it returns a coroutine object
|
|
229
|
+
result1 = container.make("sync_returns_coro")
|
|
230
|
+
self.assertTrue(result1 == "Sync function returning coroutine")
|
|
231
|
+
|
|
232
|
+
# Resolve the asynchronous function and check if it returns a coroutine object
|
|
233
|
+
result2 = container.make("simple_async")
|
|
234
|
+
self.assertTrue(result2 == "Simple async callable")
|