orionis 0.410.0__tar.gz → 0.411.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.410.0/orionis.egg-info → orionis-0.411.0}/PKG-INFO +1 -1
- {orionis-0.410.0 → orionis-0.411.0}/orionis/metadata/framework.py +1 -1
- orionis-0.411.0/orionis/support/patterns/singleton/meta.py +106 -0
- orionis-0.411.0/orionis/support/wrapper/dot_dict.py +235 -0
- {orionis-0.410.0 → orionis-0.411.0/orionis.egg-info}/PKG-INFO +1 -1
- {orionis-0.410.0 → orionis-0.411.0}/orionis.egg-info/SOURCES.txt +16 -16
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/dependencies/mocks/mock_user_controller.py +2 -2
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/dependencies/test_reflect_dependencies.py +7 -7
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/reflection/test_reflection_abstract.py +3 -3
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/reflection/test_reflection_concrete.py +5 -5
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/reflection/test_reflection_instance.py +4 -4
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/reflection/test_reflection_module.py +1 -1
- orionis-0.411.0/tests/support/patterns/singleton/test_patterns_singleton.py +40 -0
- orionis-0.411.0/tests/support/wrapper/test_services_wrapper_docdict.py +217 -0
- orionis-0.410.0/orionis/support/patterns/singleton/meta.py +0 -56
- orionis-0.410.0/orionis/support/wrapper/dot_dict.py +0 -156
- orionis-0.410.0/tests/support/patterns/singleton/test_patterns_singleton.py +0 -27
- orionis-0.410.0/tests/support/wrapper/test_services_wrapper_docdict.py +0 -141
- {orionis-0.410.0 → orionis-0.411.0}/LICENCE +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/MANIFEST.in +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/README.md +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/base/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/base/command.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/command_filter.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/commands/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/commands/cache_clear.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/commands/help.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/commands/schedule_work.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/commands/version.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/dumper/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/dumper/dump_die.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/exceptions/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/exceptions/cli-orionis-value-error.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/exceptions/cli_exception.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/exceptions/cli_runtime_error.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/exceptions/cli_schedule_exception.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/kernel.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/output/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/output/console.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/output/executor.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/output/progress_bar.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_console/parser.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/application.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/config/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/config/config.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/console/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/console/base/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/console/base/command.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/console/command_filter.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/console/kernel.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/console/output/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/console/output/console.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/console/output/executor.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/console/parser.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/console/task_manager.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/commands/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/commands/commands_facade.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/commands/scheduler_facade.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/config/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/config/config_facade.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/environment/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/environment/environment_facade.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/facade.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/files/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/files/path_facade.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/log/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/log/log_facade.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/tests/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/facades/tests/tests_facade.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/foundation/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/foundation/bootstraper.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/foundation/config/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/foundation/config/config_bootstrapper.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/foundation/console/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/foundation/console/command_bootstrapper.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/foundation/environment/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/foundation/environment/environment_bootstrapper.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/foundation/providers/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/foundation/providers/service_providers_bootstrapper.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/providers/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/providers/service_provider.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/services/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/services/commands/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/services/commands/reactor_commands_service.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/services/commands/schedule_service.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/services/config/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/services/config/config_service.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/services/environment/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/services/environment/environment_service.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/services/files/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/services/files/path_resolver_service.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/services/log/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/services/log/log_service.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/support/exception_parse.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_contracts/support/reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_foundation/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_foundation/console/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_foundation/console/command_bootstrapper.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_foundation/environment/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_foundation/environment/environment_bootstrapper.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_foundation/exceptions/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_foundation/exceptions/exception_bootstrapper.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_foundation/exceptions/exception_providers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_foundation/foundation/config/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_foundation/foundation/config/config_bootstrapper.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_foundation/providers/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_foundation/providers/service_providers_bootstrapper.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_services/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_services/commands/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_services/commands/reactor_commands_service.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_services/commands/scheduler_service.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_services/config/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/_services/config/config_service.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/base/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/base/command.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/base/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/base/contracts/command.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/dumper/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/dumper/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/dumper/contracts/dump.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/dumper/dump.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/dynamic/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/dynamic/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/dynamic/contracts/progress_bar.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/dynamic/progress_bar.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/output/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/output/console.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/output/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/output/contracts/console.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/output/enums/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/console/output/enums/styles.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/container.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/context/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/context/manager.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/context/scope.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/contracts/container.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/contracts/resolver.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/contracts/service_provider.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/entities/binding.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/enums/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/enums/lifetimes.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/exceptions/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/exceptions/attribute.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/exceptions/exception.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/exceptions/type.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/exceptions/value.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/facades/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/facades/facade.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/providers/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/providers/service_provider.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/resolver/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/resolver/resolver.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/validators/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/validators/implements.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/validators/is_abstract_class.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/validators/is_callable.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/validators/is_concrete_class.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/validators/is_instance.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/validators/is_not_subclass.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/validators/is_subclass.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/validators/is_valid_alias.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/container/validators/lifetime.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/application.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/app/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/app/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/app/entities/app.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/app/enums/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/app/enums/ciphers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/app/enums/environments.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/auth/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/auth/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/auth/entities/auth.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/cache/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/cache/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/cache/entities/cache.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/cache/entities/file.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/cache/entities/stores.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/cache/enums/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/cache/enums/drivers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/cors/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/cors/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/cors/entities/cors.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/entities/connections.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/entities/database.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/entities/mysql.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/entities/oracle.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/entities/pgsql.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/entities/sqlite.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/enums/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/enums/mysql_charsets.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/enums/mysql_collations.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/enums/mysql_engine.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/enums/oracle_encoding.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/enums/oracle_nencoding.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/enums/pgsql_charsets.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/enums/pgsql_collations.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/enums/pgsql_mode.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/enums/sqlite_foreign_key.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/enums/sqlite_journal.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/database/enums/sqlite_synchronous.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/filesystems/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/filesystems/entitites/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/filesystems/entitites/aws.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/filesystems/entitites/disks.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/filesystems/entitites/filesystems.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/filesystems/entitites/local.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/filesystems/entitites/public.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/entities/channels.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/entities/chunked.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/entities/daily.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/entities/hourly.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/entities/logging.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/entities/monthly.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/entities/stack.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/entities/weekly.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/enums/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/enums/levels.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/validators/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/validators/level.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/logging/validators/path.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/mail/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/mail/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/mail/entities/file.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/mail/entities/mail.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/mail/entities/mailers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/mail/entities/smtp.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/queue/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/queue/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/queue/entities/brokers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/queue/entities/database.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/queue/entities/queue.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/queue/enums/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/queue/enums/strategy.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/roots/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/roots/paths.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/session/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/session/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/session/entities/session.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/session/enums/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/session/enums/same_site_policy.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/session/helpers/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/session/helpers/secret_key.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/startup.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/testing/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/testing/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/testing/entities/testing.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/testing/enums/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/testing/enums/drivers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/testing/enums/mode.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/config/testing/enums/verbosity.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/contracts/application.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/contracts/config.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/exceptions/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/exceptions/integrity.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/exceptions/runtime.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/exceptions/type.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/exceptions/value.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/providers/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/providers/console_provider.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/providers/dumper_provider.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/providers/logger_provider.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/providers/path_resolver_provider.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/providers/progress_bar_provider.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/providers/testing_provider.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/foundation/providers/workers_provider.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/metadata/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/metadata/package.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/asynchrony/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/asynchrony/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/asynchrony/contracts/coroutines.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/asynchrony/coroutines.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/asynchrony/exceptions/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/asynchrony/exceptions/exception.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/contracts/env.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/contracts/types.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/core/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/core/dot_env.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/dynamic/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/dynamic/types.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/enums/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/enums/cast_type.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/env.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/exceptions/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/exceptions/exception.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/exceptions/value.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/helpers/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/helpers/functions.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/key/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/key/key_generator.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/serializer/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/serializer/values.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/validators/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/validators/key_name.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/environment/validators/types.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/abstract/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/abstract/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/abstract/contracts/reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/abstract/reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/callables/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/callables/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/callables/contracts/reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/callables/reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/concretes/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/concretes/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/concretes/contracts/concrete.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/concretes/reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/dependencies/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/dependencies/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/dependencies/contracts/reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/dependencies/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/dependencies/entities/callable_dependencies.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/dependencies/entities/class_dependencies.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/dependencies/entities/known_dependencies.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/dependencies/entities/method_dependencies.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/dependencies/reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/exceptions/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/exceptions/attribute.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/exceptions/type.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/exceptions/value.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/instances/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/instances/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/instances/contracts/reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/instances/reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/modules/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/modules/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/modules/contracts/reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/modules/reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/objects/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/objects/types.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/introspection/reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/log/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/log/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/log/contracts/log_service.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/log/exceptions/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/log/exceptions/runtime.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/log/handlers/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/log/handlers/filename.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/log/handlers/size_rotating.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/log/handlers/timed_rotating.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/log/log_service.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/paths/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/paths/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/paths/contracts/resolver.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/paths/exceptions/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/paths/exceptions/exception.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/paths/exceptions/file.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/paths/resolver.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/system/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/system/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/system/contracts/imports.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/system/contracts/workers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/system/imports.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/system/runtime/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/system/runtime/imports.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/services/system/workers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/entities/base.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/facades/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/facades/console.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/facades/dumper.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/facades/logger.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/facades/path_resolver.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/facades/progress_bar.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/facades/testing.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/facades/workers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/formatter/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/formatter/exceptions/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/formatter/exceptions/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/formatter/exceptions/contracts/parser.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/formatter/exceptions/parser.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/formatter/serializer.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/patterns/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/patterns/singleton/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/standard/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/standard/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/standard/contracts/std.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/standard/exceptions/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/standard/exceptions/value.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/standard/std.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/support/wrapper/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/cases/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/cases/asynchronous.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/cases/synchronous.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/contracts/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/contracts/dumper.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/contracts/kernel.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/contracts/logs.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/contracts/printer.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/contracts/render.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/contracts/test_result.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/contracts/unit_test.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/core/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/core/unit_test.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/entities/result.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/enums/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/enums/status.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/exceptions/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/exceptions/config.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/exceptions/failure.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/exceptions/persistence.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/exceptions/runtime.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/exceptions/value.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/kernel.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/output/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/output/dumper.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/output/printer.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/records/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/records/logs.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/base_path.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/execution_mode.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/fail_fast.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/folder_path.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/module_name.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/name_pattern.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/pattern.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/persistent.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/persistent_driver.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/print_result.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/tags.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/throw_exception.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/verbosity.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/web_report.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/validators/workers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/view/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis/test/view/render.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis.egg-info/dependency_links.txt +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis.egg-info/requires.txt +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis.egg-info/top_level.txt +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/orionis.egg-info/zip-safe +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/setup.cfg +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/setup.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/context/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/context/test_manager.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/context/test_scope.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/entities/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/entities/test_binding.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/enums/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/enums/test_lifetimes.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/facades/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/facades/test_facade.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/mocks/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/mocks/mock_complex_classes.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/mocks/mock_simple_classes.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/providers/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/providers/test_providers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/resolver/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/resolver/test_resolver.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/test_container.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/test_singleton.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/test_thread_safety.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/validators/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/validators/test_implements.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/validators/test_is_abstract_class.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/validators/test_is_callable.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/validators/test_is_concrete_class.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/validators/test_is_instance.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/validators/test_is_not_subclass.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/validators/test_is_subclass.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/validators/test_is_valid_alias.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/container/validators/test_lifetime.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/example/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/example/test_example.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/app/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/app/test_foundation_config_app.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/auth/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/auth/test_foundation_config_auth.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/cache/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/cache/test_foundation_config_cache.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/cache/test_foundation_config_cache_file.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/cache/test_foundation_config_cache_stores.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/cors/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/cors/test_foundation_config_cors.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/database/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/database/test_foundation_config_database.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/database/test_foundation_config_database_connections.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/database/test_foundation_config_database_mysql.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/database/test_foundation_config_database_oracle.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/database/test_foundation_config_database_pgsql.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/database/test_foundation_config_database_sqlite.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/filesystems/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems_aws.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems_disks.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems_local.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/filesystems/test_foundation_config_filesystems_public.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/logging/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/logging/test_foundation_config_logging.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/logging/test_foundation_config_logging_channels.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/logging/test_foundation_config_logging_chunked.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/logging/test_foundation_config_logging_daily.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/logging/test_foundation_config_logging_hourly.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/logging/test_foundation_config_logging_monthly.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/logging/test_foundation_config_logging_stack.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/logging/test_foundation_config_logging_weekly.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/mail/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/mail/test_foundation_config_mail.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/mail/test_foundation_config_mail_file.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/mail/test_foundation_config_mail_mailers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/mail/test_foundation_config_mail_smtp.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/queue/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/queue/test_foundation_config_queue.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/queue/test_foundation_config_queue_brokers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/queue/test_foundation_config_queue_database.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/root/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/root/test_foundation_config_root_paths.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/session/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/session/test_foundation_config_session.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/startup/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/startup/test_foundation_config_startup.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/testing/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/config/testing/test_foundation_config_testing.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/exceptions/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/foundation/exceptions/test_foundation_config_exceptions.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/metadata/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/metadata/test_metadata_framework.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/metadata/test_metadata_package.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/services/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/services/asynchrony/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/services/asynchrony/test_services_asynchrony_coroutine.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/services/environment/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/services/environment/test_services_environment.py +0 -0
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/__init__.py +0 -0
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/dependencies/__init__.py +0 -0
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/dependencies/mocks/__init__.py +0 -0
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/dependencies/mocks/mock_user.py +0 -0
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/dependencies/mocks/mock_users_permissions.py +0 -0
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/reflection/__init__.py +0 -0
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/reflection/mock/__init__.py +0 -0
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/reflection/mock/fake_reflect_instance.py +0 -0
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/reflection/test_reflection_callable.py +0 -0
- {orionis-0.410.0/tests/services/inspection → orionis-0.411.0/tests/services/introspection}/test_reflection.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/services/log/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/services/log/test_log.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/services/path/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/services/path/test_services_resolver.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/services/system/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/services/system/test_services_system_imports.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/services/system/test_services_system_workers.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/support/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/support/parsers/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/support/parsers/mocks/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/support/parsers/mocks/mock_custom_error.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/support/parsers/test_services_parser_exceptions.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/support/patterns/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/support/patterns/singleton/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/support/standard/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/support/standard/test_services_std.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/support/wrapper/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/testing/__init__.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/testing/test_testing_result.py +0 -0
- {orionis-0.410.0 → orionis-0.411.0}/tests/testing/test_testing_unit.py +0 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import threading
|
|
2
|
+
import asyncio
|
|
3
|
+
from typing import Dict, Type, Any, TypeVar
|
|
4
|
+
|
|
5
|
+
T = TypeVar('T')
|
|
6
|
+
|
|
7
|
+
class Singleton(type):
|
|
8
|
+
"""
|
|
9
|
+
Thread-safe and async-safe singleton metaclass.
|
|
10
|
+
|
|
11
|
+
Ensures that only one instance of a class exists, regardless of whether the code is running in a synchronous or asynchronous context. This metaclass provides both a synchronous (`__call__`) and asynchronous (`__acall__`) method for instance creation, using appropriate locking mechanisms to prevent race conditions in multi-threaded or async environments.
|
|
12
|
+
|
|
13
|
+
Attributes
|
|
14
|
+
----------
|
|
15
|
+
_instances : Dict[Type[T], T]
|
|
16
|
+
Stores singleton instances for each class using this metaclass.
|
|
17
|
+
_lock : threading.Lock
|
|
18
|
+
Thread lock for synchronizing instance creation in synchronous contexts.
|
|
19
|
+
_async_lock : asyncio.Lock
|
|
20
|
+
Async lock for synchronizing instance creation in asynchronous contexts.
|
|
21
|
+
|
|
22
|
+
Methods
|
|
23
|
+
-------
|
|
24
|
+
__call__(cls, *args, **kwargs)
|
|
25
|
+
Synchronously creates or retrieves the singleton instance.
|
|
26
|
+
__acall__(cls, *args, **kwargs)
|
|
27
|
+
Asynchronously creates or retrieves the singleton instance.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
_instances: Dict[Type[T], T] = {}
|
|
31
|
+
_lock = threading.Lock()
|
|
32
|
+
_async_lock = asyncio.Lock()
|
|
33
|
+
|
|
34
|
+
def __call__(cls: Type[T], *args: Any, **kwargs: Any) -> T:
|
|
35
|
+
"""
|
|
36
|
+
Synchronously creates or retrieves a singleton instance of the class.
|
|
37
|
+
|
|
38
|
+
This method ensures that only one instance of the class is created, even in multi-threaded environments.
|
|
39
|
+
If the instance does not exist, it acquires a thread lock to prevent race conditions, creates the instance,
|
|
40
|
+
and stores it in the class-level `_instances` dictionary. If the instance already exists, it simply returns
|
|
41
|
+
the existing instance.
|
|
42
|
+
|
|
43
|
+
Parameters
|
|
44
|
+
----------
|
|
45
|
+
*args : Any
|
|
46
|
+
Positional arguments to pass to the class constructor.
|
|
47
|
+
**kwargs : Any
|
|
48
|
+
Keyword arguments to pass to the class constructor.
|
|
49
|
+
|
|
50
|
+
Returns
|
|
51
|
+
-------
|
|
52
|
+
T
|
|
53
|
+
The singleton instance of the class.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
# Check if the instance already exists
|
|
57
|
+
if cls not in cls._instances:
|
|
58
|
+
|
|
59
|
+
# Acquire the thread lock to ensure thread safety
|
|
60
|
+
with cls._lock:
|
|
61
|
+
|
|
62
|
+
# Double-check if the instance was created while waiting for the lock
|
|
63
|
+
if cls not in cls._instances:
|
|
64
|
+
|
|
65
|
+
# Create and store the singleton instance
|
|
66
|
+
cls._instances[cls] = super().__call__(*args, **kwargs)
|
|
67
|
+
|
|
68
|
+
# Return the singleton instance
|
|
69
|
+
return cls._instances[cls]
|
|
70
|
+
|
|
71
|
+
async def __acall__(cls: Type[T], *args: Any, **kwargs: Any) -> T:
|
|
72
|
+
"""
|
|
73
|
+
Asynchronously creates or retrieves a singleton instance of the class.
|
|
74
|
+
|
|
75
|
+
This method ensures that only one instance of the class is created, even in asynchronous contexts.
|
|
76
|
+
If the instance does not exist, it acquires an asynchronous lock to prevent race conditions,
|
|
77
|
+
creates the instance, and stores it in the class-level `_instances` dictionary. If the instance
|
|
78
|
+
already exists, it simply returns the existing instance.
|
|
79
|
+
|
|
80
|
+
Parameters
|
|
81
|
+
----------
|
|
82
|
+
*args : Any
|
|
83
|
+
Positional arguments to pass to the class constructor.
|
|
84
|
+
**kwargs : Any
|
|
85
|
+
Keyword arguments to pass to the class constructor.
|
|
86
|
+
|
|
87
|
+
Returns
|
|
88
|
+
-------
|
|
89
|
+
T
|
|
90
|
+
The singleton instance of the class.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
# Check if the instance already exists
|
|
94
|
+
if cls not in cls._instances:
|
|
95
|
+
|
|
96
|
+
# Acquire the asynchronous lock to ensure async safety
|
|
97
|
+
async with cls._async_lock:
|
|
98
|
+
|
|
99
|
+
# Double-check if the instance was created while waiting for the lock
|
|
100
|
+
if cls not in cls._instances:
|
|
101
|
+
|
|
102
|
+
# Create and store the singleton instance
|
|
103
|
+
cls._instances[cls] = super().__call__(*args, **kwargs)
|
|
104
|
+
|
|
105
|
+
# Return the singleton instance
|
|
106
|
+
return cls._instances[cls]
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
from typing import Any, Optional, Dict
|
|
2
|
+
|
|
3
|
+
class DotDict(dict):
|
|
4
|
+
|
|
5
|
+
__slots__ = ()
|
|
6
|
+
|
|
7
|
+
def __getattr__(self, key: str) -> Optional[Any]:
|
|
8
|
+
"""
|
|
9
|
+
Retrieve the value associated with the given key as an attribute.
|
|
10
|
+
|
|
11
|
+
If the value is a dictionary (but not already a DotDict), it is converted
|
|
12
|
+
to a DotDict and updated in-place. If the key does not exist, returns None.
|
|
13
|
+
|
|
14
|
+
Parameters
|
|
15
|
+
----------
|
|
16
|
+
key : str
|
|
17
|
+
The attribute name to retrieve.
|
|
18
|
+
|
|
19
|
+
Returns
|
|
20
|
+
-------
|
|
21
|
+
Any or None
|
|
22
|
+
The value associated with the key. If the value is a dict, it is converted
|
|
23
|
+
to a DotDict before returning. Returns None if the key is not present.
|
|
24
|
+
|
|
25
|
+
Notes
|
|
26
|
+
-----
|
|
27
|
+
This method allows attribute-style access to dictionary keys. If the value
|
|
28
|
+
is a plain dictionary, it is automatically wrapped as a DotDict for consistency.
|
|
29
|
+
"""
|
|
30
|
+
try:
|
|
31
|
+
value = self[key] # Attempt to retrieve the value by key
|
|
32
|
+
# Convert plain dicts to DotDict for attribute access
|
|
33
|
+
if isinstance(value, dict) and not isinstance(value, DotDict):
|
|
34
|
+
value = DotDict(value)
|
|
35
|
+
self[key] = value # Update the value in-place
|
|
36
|
+
return value
|
|
37
|
+
except KeyError:
|
|
38
|
+
# Return None if the key does not exist
|
|
39
|
+
return None
|
|
40
|
+
|
|
41
|
+
def __setattr__(self, key: str, value: Any) -> None:
|
|
42
|
+
"""
|
|
43
|
+
Assign a value to an attribute of the DotDict instance.
|
|
44
|
+
|
|
45
|
+
This method enables attribute-style assignment for dictionary keys. If the
|
|
46
|
+
assigned value is a plain dictionary (not a DotDict), it is automatically
|
|
47
|
+
converted to a DotDict for consistency and recursive attribute access.
|
|
48
|
+
|
|
49
|
+
Parameters
|
|
50
|
+
----------
|
|
51
|
+
key : str
|
|
52
|
+
The attribute name to assign.
|
|
53
|
+
value : Any
|
|
54
|
+
The value to assign to the attribute. If it is a dict (but not a DotDict),
|
|
55
|
+
it will be converted to a DotDict before assignment.
|
|
56
|
+
|
|
57
|
+
Returns
|
|
58
|
+
-------
|
|
59
|
+
None
|
|
60
|
+
This method does not return a value.
|
|
61
|
+
|
|
62
|
+
Notes
|
|
63
|
+
-----
|
|
64
|
+
The attribute is stored as a key-value pair in the underlying dictionary.
|
|
65
|
+
This allows seamless attribute-style access and assignment for dictionary keys.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
# Convert plain dicts to DotDict for recursive attribute access
|
|
69
|
+
if isinstance(value, dict) and not isinstance(value, DotDict):
|
|
70
|
+
value = DotDict(value)
|
|
71
|
+
|
|
72
|
+
# Store the value in the underlying dictionary using the key
|
|
73
|
+
self[key] = value
|
|
74
|
+
|
|
75
|
+
def __delattr__(self, key: str) -> None:
|
|
76
|
+
"""
|
|
77
|
+
Remove an attribute from the DotDict instance.
|
|
78
|
+
|
|
79
|
+
This method deletes the key-value pair corresponding to the given attribute name
|
|
80
|
+
from the underlying dictionary. If the key does not exist, an AttributeError is raised.
|
|
81
|
+
|
|
82
|
+
Parameters
|
|
83
|
+
----------
|
|
84
|
+
key : str
|
|
85
|
+
The name of the attribute to remove.
|
|
86
|
+
|
|
87
|
+
Returns
|
|
88
|
+
-------
|
|
89
|
+
None
|
|
90
|
+
This method does not return a value.
|
|
91
|
+
|
|
92
|
+
Raises
|
|
93
|
+
------
|
|
94
|
+
AttributeError
|
|
95
|
+
If the specified attribute does not exist in the DotDict.
|
|
96
|
+
|
|
97
|
+
Notes
|
|
98
|
+
-----
|
|
99
|
+
This method enables attribute-style deletion for dictionary keys, allowing
|
|
100
|
+
seamless removal of items using dot notation.
|
|
101
|
+
"""
|
|
102
|
+
try:
|
|
103
|
+
# Attempt to delete the key from the dictionary
|
|
104
|
+
del self[key]
|
|
105
|
+
except KeyError as e:
|
|
106
|
+
# Raise AttributeError if the key is not present
|
|
107
|
+
raise AttributeError(f"'{self.__class__.__name__}' has no attribute '{key}'") from e
|
|
108
|
+
|
|
109
|
+
def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]:
|
|
110
|
+
"""
|
|
111
|
+
Retrieve the value associated with the given key, returning a default value if the key is not found.
|
|
112
|
+
|
|
113
|
+
If the retrieved value is a plain dictionary (not a DotDict), it is converted to a DotDict,
|
|
114
|
+
stored back in the dictionary, and then returned. This ensures consistent attribute-style access
|
|
115
|
+
for nested dictionaries.
|
|
116
|
+
|
|
117
|
+
Parameters
|
|
118
|
+
----------
|
|
119
|
+
key : str
|
|
120
|
+
The key to look up in the dictionary.
|
|
121
|
+
default : Any, optional
|
|
122
|
+
The value to return if the key is not found. Defaults to None.
|
|
123
|
+
|
|
124
|
+
Returns
|
|
125
|
+
-------
|
|
126
|
+
Any or None
|
|
127
|
+
The value associated with the key, converted to a DotDict if it is a dict.
|
|
128
|
+
If the key is not present, returns the specified default value.
|
|
129
|
+
|
|
130
|
+
Notes
|
|
131
|
+
-----
|
|
132
|
+
This method overrides the standard dict.get() to provide automatic conversion of nested
|
|
133
|
+
dictionaries to DotDict instances, enabling recursive attribute-style access.
|
|
134
|
+
"""
|
|
135
|
+
# Retrieve the value using the base dict's get method
|
|
136
|
+
value = super().get(key, default)
|
|
137
|
+
# If the value is a plain dict, convert it to DotDict for consistency
|
|
138
|
+
if isinstance(value, dict) and not isinstance(value, DotDict):
|
|
139
|
+
value = DotDict(value)
|
|
140
|
+
self[key] = value # Store the converted value back in the dictionary
|
|
141
|
+
return value
|
|
142
|
+
|
|
143
|
+
def export(self) -> Dict[str, Any]:
|
|
144
|
+
"""
|
|
145
|
+
Recursively export the contents of the DotDict as a standard Python dictionary.
|
|
146
|
+
|
|
147
|
+
This method traverses the DotDict and converts all nested DotDict instances
|
|
148
|
+
into regular dictionaries by recursively calling their `export` method.
|
|
149
|
+
Non-DotDict values are included as-is. This ensures that the returned object
|
|
150
|
+
is composed entirely of built-in Python types, making it suitable for serialization
|
|
151
|
+
or interoperability with code expecting standard dictionaries.
|
|
152
|
+
|
|
153
|
+
Parameters
|
|
154
|
+
----------
|
|
155
|
+
None
|
|
156
|
+
|
|
157
|
+
Returns
|
|
158
|
+
-------
|
|
159
|
+
result : dict
|
|
160
|
+
A dictionary representation of the DotDict, where all nested DotDict instances
|
|
161
|
+
are recursively converted to dictionaries. Non-DotDict values are returned unchanged.
|
|
162
|
+
|
|
163
|
+
Notes
|
|
164
|
+
-----
|
|
165
|
+
This method is useful for converting a DotDict (which supports attribute-style access)
|
|
166
|
+
into a plain dictionary for use with APIs, serialization, or other libraries that
|
|
167
|
+
require standard dict objects.
|
|
168
|
+
"""
|
|
169
|
+
result = {}
|
|
170
|
+
# Iterate through all key-value pairs in the DotDict
|
|
171
|
+
for k, v in self.items():
|
|
172
|
+
if isinstance(v, DotDict):
|
|
173
|
+
# Recursively export nested DotDicts
|
|
174
|
+
result[k] = v.export()
|
|
175
|
+
else:
|
|
176
|
+
# Include non-DotDict values as-is
|
|
177
|
+
result[k] = v
|
|
178
|
+
return result
|
|
179
|
+
|
|
180
|
+
def copy(self) -> 'DotDict':
|
|
181
|
+
"""
|
|
182
|
+
Create a deep copy of the DotDict instance, recursively copying all nested DotDict and dict objects.
|
|
183
|
+
|
|
184
|
+
This method traverses the DotDict and ensures that all nested DotDict and dict instances are
|
|
185
|
+
copied recursively, so that the returned DotDict is fully independent of the original. Non-dict
|
|
186
|
+
values are copied by reference.
|
|
187
|
+
|
|
188
|
+
Returns
|
|
189
|
+
-------
|
|
190
|
+
DotDict
|
|
191
|
+
A new DotDict instance containing a deep copy of the original contents. All nested DotDict
|
|
192
|
+
and dict objects are recursively copied, ensuring no shared references with the original.
|
|
193
|
+
|
|
194
|
+
Notes
|
|
195
|
+
-----
|
|
196
|
+
This method is useful when you need a completely independent copy of a DotDict, including all
|
|
197
|
+
nested structures, to avoid unintended side effects from shared references.
|
|
198
|
+
"""
|
|
199
|
+
copied = {}
|
|
200
|
+
# Iterate through all key-value pairs in the DotDict
|
|
201
|
+
for k, v in self.items():
|
|
202
|
+
if isinstance(v, DotDict):
|
|
203
|
+
# Recursively copy nested DotDict instances
|
|
204
|
+
copied[k] = v.copy()
|
|
205
|
+
elif isinstance(v, dict):
|
|
206
|
+
# Convert plain dicts to DotDict and recursively copy
|
|
207
|
+
copied[k] = DotDict(v).copy()
|
|
208
|
+
else:
|
|
209
|
+
# Copy non-dict values by reference
|
|
210
|
+
copied[k] = v
|
|
211
|
+
# Return a new DotDict containing the copied data
|
|
212
|
+
return DotDict(copied)
|
|
213
|
+
|
|
214
|
+
def __repr__(self) -> str:
|
|
215
|
+
"""
|
|
216
|
+
Return a string representation of the DotDict instance.
|
|
217
|
+
|
|
218
|
+
This method overrides the default `__repr__` implementation to provide a concise
|
|
219
|
+
and informative string that displays the class name (`DotDict`) and the contents
|
|
220
|
+
of the underlying dictionary. This is useful for debugging and logging, as it
|
|
221
|
+
clearly distinguishes DotDict objects from regular dictionaries.
|
|
222
|
+
|
|
223
|
+
Returns
|
|
224
|
+
-------
|
|
225
|
+
str
|
|
226
|
+
A string representation of the DotDict object, formatted as
|
|
227
|
+
'DotDict({...})', where {...} is the dictionary content.
|
|
228
|
+
|
|
229
|
+
Notes
|
|
230
|
+
-----
|
|
231
|
+
The returned string uses the base dictionary's representation, but is prefixed
|
|
232
|
+
with the DotDict class name for clarity.
|
|
233
|
+
"""
|
|
234
|
+
# Use the base dict's __repr__ for the contents, but keep DotDict class name
|
|
235
|
+
return super().__repr__()
|
|
@@ -532,22 +532,22 @@ tests/services/asynchrony/__init__.py
|
|
|
532
532
|
tests/services/asynchrony/test_services_asynchrony_coroutine.py
|
|
533
533
|
tests/services/environment/__init__.py
|
|
534
534
|
tests/services/environment/test_services_environment.py
|
|
535
|
-
tests/services/
|
|
536
|
-
tests/services/
|
|
537
|
-
tests/services/
|
|
538
|
-
tests/services/
|
|
539
|
-
tests/services/
|
|
540
|
-
tests/services/
|
|
541
|
-
tests/services/
|
|
542
|
-
tests/services/
|
|
543
|
-
tests/services/
|
|
544
|
-
tests/services/
|
|
545
|
-
tests/services/
|
|
546
|
-
tests/services/
|
|
547
|
-
tests/services/
|
|
548
|
-
tests/services/
|
|
549
|
-
tests/services/
|
|
550
|
-
tests/services/
|
|
535
|
+
tests/services/introspection/__init__.py
|
|
536
|
+
tests/services/introspection/test_reflection.py
|
|
537
|
+
tests/services/introspection/dependencies/__init__.py
|
|
538
|
+
tests/services/introspection/dependencies/test_reflect_dependencies.py
|
|
539
|
+
tests/services/introspection/dependencies/mocks/__init__.py
|
|
540
|
+
tests/services/introspection/dependencies/mocks/mock_user.py
|
|
541
|
+
tests/services/introspection/dependencies/mocks/mock_user_controller.py
|
|
542
|
+
tests/services/introspection/dependencies/mocks/mock_users_permissions.py
|
|
543
|
+
tests/services/introspection/reflection/__init__.py
|
|
544
|
+
tests/services/introspection/reflection/test_reflection_abstract.py
|
|
545
|
+
tests/services/introspection/reflection/test_reflection_callable.py
|
|
546
|
+
tests/services/introspection/reflection/test_reflection_concrete.py
|
|
547
|
+
tests/services/introspection/reflection/test_reflection_instance.py
|
|
548
|
+
tests/services/introspection/reflection/test_reflection_module.py
|
|
549
|
+
tests/services/introspection/reflection/mock/__init__.py
|
|
550
|
+
tests/services/introspection/reflection/mock/fake_reflect_instance.py
|
|
551
551
|
tests/services/log/__init__.py
|
|
552
552
|
tests/services/log/test_log.py
|
|
553
553
|
tests/services/path/__init__.py
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
from tests.services.
|
|
2
|
-
from tests.services.
|
|
1
|
+
from tests.services.introspection.dependencies.mocks.mock_user import FakeUser
|
|
2
|
+
from tests.services.introspection.dependencies.mocks.mock_users_permissions import FakeUserWithPermissions
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
class UserController:
|
|
@@ -7,9 +7,9 @@ from orionis.services.introspection.dependencies.reflection import (
|
|
|
7
7
|
KnownDependency
|
|
8
8
|
)
|
|
9
9
|
from orionis.test.cases.asynchronous import AsyncTestCase
|
|
10
|
-
from tests.services.
|
|
11
|
-
from tests.services.
|
|
12
|
-
from tests.services.
|
|
10
|
+
from tests.services.introspection.dependencies.mocks.mock_user import FakeUser
|
|
11
|
+
from tests.services.introspection.dependencies.mocks.mock_user_controller import UserController
|
|
12
|
+
from tests.services.introspection.dependencies.mocks.mock_users_permissions import FakeUserWithPermissions
|
|
13
13
|
|
|
14
14
|
class TestReflectDependencies(AsyncTestCase):
|
|
15
15
|
"""
|
|
@@ -48,9 +48,9 @@ class TestReflectDependencies(AsyncTestCase):
|
|
|
48
48
|
|
|
49
49
|
# Check resolved dependencies for 'user_repository'
|
|
50
50
|
dependencies:KnownDependency = dep_user_repository
|
|
51
|
-
self.assertEqual(dependencies.module_name, 'tests.services.
|
|
51
|
+
self.assertEqual(dependencies.module_name, 'tests.services.introspection.dependencies.mocks.mock_user')
|
|
52
52
|
self.assertEqual(dependencies.class_name, 'FakeUser')
|
|
53
|
-
self.assertEqual(dependencies.full_class_path, 'tests.services.
|
|
53
|
+
self.assertEqual(dependencies.full_class_path, 'tests.services.introspection.dependencies.mocks.mock_user.FakeUser')
|
|
54
54
|
self.assertEqual(dependencies.type, FakeUser)
|
|
55
55
|
|
|
56
56
|
async def testReflectionDependenciesGetMethodDependencies(self):
|
|
@@ -80,9 +80,9 @@ class TestReflectDependencies(AsyncTestCase):
|
|
|
80
80
|
self.assertIsInstance(dep_user_permissions, KnownDependency)
|
|
81
81
|
|
|
82
82
|
# Check resolved dependencies for 'user_permissions'
|
|
83
|
-
self.assertEqual(dep_user_permissions.module_name, 'tests.services.
|
|
83
|
+
self.assertEqual(dep_user_permissions.module_name, 'tests.services.introspection.dependencies.mocks.mock_users_permissions')
|
|
84
84
|
self.assertEqual(dep_user_permissions.class_name, 'FakeUserWithPermissions')
|
|
85
|
-
self.assertEqual(dep_user_permissions.full_class_path, 'tests.services.
|
|
85
|
+
self.assertEqual(dep_user_permissions.full_class_path, 'tests.services.introspection.dependencies.mocks.mock_users_permissions.FakeUserWithPermissions')
|
|
86
86
|
self.assertEqual(dep_user_permissions.type, FakeUserWithPermissions)
|
|
87
87
|
|
|
88
88
|
# Check Instance of KnownDependency for 'permissions'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from orionis.services.introspection.abstract.reflection import ReflectionAbstract
|
|
2
2
|
from orionis.services.introspection.dependencies.entities.class_dependencies import ClassDependency
|
|
3
|
-
from tests.services.
|
|
3
|
+
from tests.services.introspection.reflection.mock.fake_reflect_instance import AbstractFakeClass
|
|
4
4
|
from orionis.test.cases.asynchronous import AsyncTestCase
|
|
5
5
|
|
|
6
6
|
class TestServiceReflectionAbstract(AsyncTestCase):
|
|
@@ -27,7 +27,7 @@ class TestServiceReflectionAbstract(AsyncTestCase):
|
|
|
27
27
|
"""
|
|
28
28
|
reflect = ReflectionAbstract(AbstractFakeClass)
|
|
29
29
|
module_name = reflect.getModuleName()
|
|
30
|
-
self.assertEqual(module_name, 'tests.services.
|
|
30
|
+
self.assertEqual(module_name, 'tests.services.introspection.reflection.mock.fake_reflect_instance')
|
|
31
31
|
|
|
32
32
|
async def testGetModuleWithClassName(self):
|
|
33
33
|
"""
|
|
@@ -35,7 +35,7 @@ class TestServiceReflectionAbstract(AsyncTestCase):
|
|
|
35
35
|
"""
|
|
36
36
|
reflect = ReflectionAbstract(AbstractFakeClass)
|
|
37
37
|
module_with_class_name = reflect.getModuleWithClassName()
|
|
38
|
-
self.assertEqual(module_with_class_name, 'tests.services.
|
|
38
|
+
self.assertEqual(module_with_class_name, 'tests.services.introspection.reflection.mock.fake_reflect_instance.AbstractFakeClass')
|
|
39
39
|
|
|
40
40
|
async def testGetDocstring(self):
|
|
41
41
|
"""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from orionis.services.introspection.concretes.reflection import ReflectionConcrete
|
|
2
2
|
from orionis.services.introspection.dependencies.entities.class_dependencies import ClassDependency
|
|
3
|
-
from tests.services.
|
|
3
|
+
from tests.services.introspection.reflection.mock.fake_reflect_instance import FakeClass
|
|
4
4
|
from orionis.test.cases.asynchronous import AsyncTestCase
|
|
5
5
|
|
|
6
6
|
class TestServiceReflectionConcrete(AsyncTestCase):
|
|
@@ -44,11 +44,11 @@ class TestServiceReflectionConcrete(AsyncTestCase):
|
|
|
44
44
|
"""
|
|
45
45
|
Tests that the getModuleName method of the ReflectionConcrete class returns the correct module name
|
|
46
46
|
for the provided FakeClass. Asserts that the returned module name matches the expected string
|
|
47
|
-
'tests.services.
|
|
47
|
+
'tests.services.introspection.reflection.mock.fake_reflect_instance'.
|
|
48
48
|
"""
|
|
49
49
|
reflect = ReflectionConcrete(FakeClass)
|
|
50
50
|
module_name = reflect.getModuleName()
|
|
51
|
-
self.assertEqual(module_name, 'tests.services.
|
|
51
|
+
self.assertEqual(module_name, 'tests.services.introspection.reflection.mock.fake_reflect_instance')
|
|
52
52
|
|
|
53
53
|
async def testGetModuleWithClassName(self):
|
|
54
54
|
"""
|
|
@@ -57,11 +57,11 @@ class TestServiceReflectionConcrete(AsyncTestCase):
|
|
|
57
57
|
|
|
58
58
|
Asserts:
|
|
59
59
|
The returned string matches the expected module path and class name:
|
|
60
|
-
'tests.services.
|
|
60
|
+
'tests.services.introspection.reflection.mock.fake_reflect_instance.FakeClass'
|
|
61
61
|
"""
|
|
62
62
|
reflect = ReflectionConcrete(FakeClass)
|
|
63
63
|
module_with_class_name = reflect.getModuleWithClassName()
|
|
64
|
-
self.assertEqual(module_with_class_name, 'tests.services.
|
|
64
|
+
self.assertEqual(module_with_class_name, 'tests.services.introspection.reflection.mock.fake_reflect_instance.FakeClass')
|
|
65
65
|
|
|
66
66
|
async def testGetDocstring(self):
|
|
67
67
|
"""
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from orionis.services.introspection.dependencies.entities.class_dependencies import ClassDependency
|
|
2
|
-
from tests.services.
|
|
2
|
+
from tests.services.introspection.reflection.mock.fake_reflect_instance import FakeClass
|
|
3
3
|
from orionis.services.introspection.instances.reflection import ReflectionInstance
|
|
4
4
|
from orionis.test.cases.asynchronous import AsyncTestCase
|
|
5
5
|
|
|
@@ -43,11 +43,11 @@ class TestServiceReflectionInstance(AsyncTestCase):
|
|
|
43
43
|
|
|
44
44
|
Asserts:
|
|
45
45
|
The returned module name matches the expected string
|
|
46
|
-
'tests.services.
|
|
46
|
+
'tests.services.introspection.reflection.mock.fake_reflect_instance'.
|
|
47
47
|
"""
|
|
48
48
|
reflect = ReflectionInstance(FakeClass())
|
|
49
49
|
module_name = reflect.getModuleName()
|
|
50
|
-
self.assertEqual(module_name, 'tests.services.
|
|
50
|
+
self.assertEqual(module_name, 'tests.services.introspection.reflection.mock.fake_reflect_instance')
|
|
51
51
|
|
|
52
52
|
async def testGetModuleWithClassName(self):
|
|
53
53
|
"""
|
|
@@ -59,7 +59,7 @@ class TestServiceReflectionInstance(AsyncTestCase):
|
|
|
59
59
|
"""
|
|
60
60
|
reflect = ReflectionInstance(FakeClass())
|
|
61
61
|
module_with_class_name = reflect.getModuleWithClassName()
|
|
62
|
-
self.assertEqual(module_with_class_name, 'tests.services.
|
|
62
|
+
self.assertEqual(module_with_class_name, 'tests.services.introspection.reflection.mock.fake_reflect_instance.FakeClass')
|
|
63
63
|
|
|
64
64
|
async def testGetDocstring(self):
|
|
65
65
|
"""
|
|
@@ -4,7 +4,7 @@ from orionis.services.introspection.exceptions import ReflectionTypeError, Refle
|
|
|
4
4
|
|
|
5
5
|
class TestServiceReflectionModule(AsyncTestCase):
|
|
6
6
|
|
|
7
|
-
module_name = 'tests.services.
|
|
7
|
+
module_name = 'tests.services.introspection.reflection.mock.fake_reflect_instance'
|
|
8
8
|
|
|
9
9
|
async def testGetModule(self):
|
|
10
10
|
"""
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from orionis.support.patterns.singleton import Singleton
|
|
2
|
+
from orionis.test.cases.asynchronous import AsyncTestCase
|
|
3
|
+
|
|
4
|
+
class TestPatternsSingleton(AsyncTestCase):
|
|
5
|
+
|
|
6
|
+
async def testSingleton(self):
|
|
7
|
+
"""
|
|
8
|
+
Tests the behavior of the Singleton metaclass.
|
|
9
|
+
|
|
10
|
+
Validates that a class using the Singleton metaclass only ever creates a single instance,
|
|
11
|
+
regardless of how many times it is instantiated. Also checks that the initial state of the
|
|
12
|
+
singleton instance remains unchanged after subsequent instantiations.
|
|
13
|
+
|
|
14
|
+
Parameters
|
|
15
|
+
----------
|
|
16
|
+
self : TestPatternsSingleton
|
|
17
|
+
The test case instance.
|
|
18
|
+
|
|
19
|
+
Returns
|
|
20
|
+
-------
|
|
21
|
+
None
|
|
22
|
+
This method does not return any value. Assertions are used to verify singleton behavior.
|
|
23
|
+
|
|
24
|
+
"""
|
|
25
|
+
# Define a class using the Singleton metaclass
|
|
26
|
+
class SingletonClass(metaclass=Singleton):
|
|
27
|
+
def __init__(self, value):
|
|
28
|
+
self.value = value
|
|
29
|
+
|
|
30
|
+
# Create the first instance of SingletonClass
|
|
31
|
+
instance1 = SingletonClass(1)
|
|
32
|
+
|
|
33
|
+
# Attempt to create a second instance with a different value
|
|
34
|
+
instance2 = SingletonClass(2)
|
|
35
|
+
|
|
36
|
+
# Assert that both instances are actually the same object
|
|
37
|
+
self.assertIs(instance1, instance2)
|
|
38
|
+
|
|
39
|
+
# Assert that the value remains as set by the first instantiation
|
|
40
|
+
self.assertEqual(instance1.value, 1)
|