orionis 0.207.0__tar.gz → 0.208.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.207.0/orionis.egg-info → orionis-0.208.0}/PKG-INFO +1 -1
- {orionis-0.207.0 → orionis-0.208.0}/orionis/framework.py +1 -1
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/inspection/reflexion_abstract.py +42 -2
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/inspection/reflexion_instance.py +31 -1
- orionis-0.208.0/orionis/luminate/support/inspection/reflexion_instance_with_abstract.py +230 -0
- {orionis-0.207.0 → orionis-0.208.0/orionis.egg-info}/PKG-INFO +1 -1
- {orionis-0.207.0 → orionis-0.208.0}/orionis.egg-info/SOURCES.txt +3 -1
- orionis-0.208.0/tests/support/inspection/fakes/fake_reflection_instance_with_abstract.py +45 -0
- {orionis-0.207.0 → orionis-0.208.0}/tests/support/inspection/test_reflection_abstract.py +10 -1
- {orionis-0.207.0 → orionis-0.208.0}/tests/support/inspection/test_reflection_instance.py +5 -0
- orionis-0.208.0/tests/support/inspection/test_reflection_instance_with_abstract.py +80 -0
- orionis-0.207.0/orionis/luminate/support/inspection/reflexion_instance_with_abstract.py +0 -309
- {orionis-0.207.0 → orionis-0.208.0}/LICENCE +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/MANIFEST.in +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/README.md +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/console.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/installer/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/installer/contracts/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/installer/contracts/manager.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/installer/contracts/output.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/installer/contracts/setup.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/installer/manager.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/installer/output.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/installer/setup.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/application.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/config/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/config/app.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/config/auth.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/config/cache.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/config/cors.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/config/database.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/config/filesystems.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/config/logging.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/config/mail.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/config/queue.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/config/session.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/base/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/base/command.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/command_filter.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/commands/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/commands/cache_clear.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/commands/help.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/commands/schedule_work.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/commands/version.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/exceptions/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/exceptions/cli-orionis-value-error.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/exceptions/cli_exception.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/exceptions/cli_runtime_error.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/exceptions/cli_schedule_exception.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/kernel.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/output/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/output/console.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/output/executor.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/output/progress_bar.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/output/styles.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/console/parser.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/container/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/container/container.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/container/container_integrity.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/container/exception.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/container/lifetimes.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/container/resolve.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/application.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/config/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/config/config.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/console/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/console/base/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/console/base/command.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/console/command_filter.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/console/kernel.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/console/output/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/console/output/console.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/console/output/executor.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/console/output/progress_bar.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/console/parser.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/console/task_manager.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/container/container.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/container/container_integrity.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/commands/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/commands/commands_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/commands/scheduler_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/config/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/config/config_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/environment/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/environment/environment_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/files/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/files/path_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/log/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/log/log_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/tests/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/facades/tests/tests_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/foundation/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/foundation/bootstraper.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/foundation/config/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/foundation/config/config_bootstrapper.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/foundation/console/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/foundation/console/command_bootstrapper.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/foundation/environment/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/foundation/environment/environment_bootstrapper.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/foundation/providers/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/foundation/providers/service_providers_bootstrapper.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/providers/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/providers/service_provider.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/services/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/services/commands/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/services/commands/reactor_commands_service.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/services/commands/schedule_service.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/services/config/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/services/config/config_service.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/services/environment/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/services/environment/environment_service.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/services/files/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/services/files/path_resolver_service.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/services/log/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/services/log/log_service.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/support/exception_parse.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/support/reflection.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/contracts/support/std.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/app_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/commands/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/commands/commands_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/commands/scheduler_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/config/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/config/config_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/environment/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/environment/environment_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/files/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/files/path_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/log/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/log/log_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/tests/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/facades/tests/tests_facade.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/foundation/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/foundation/config/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/foundation/config/config_bootstrapper.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/foundation/console/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/foundation/console/command_bootstrapper.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/foundation/environment/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/foundation/environment/environment_bootstrapper.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/foundation/exceptions/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/foundation/exceptions/exception_bootstrapper.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/foundation/exceptions/exception_providers.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/foundation/providers/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/foundation/providers/service_providers_bootstrapper.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/patterns/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/patterns/singleton.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/providers/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/providers/commands/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/providers/commands/reactor_commands_service_provider.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/providers/commands/scheduler_provider.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/providers/config/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/providers/config/config_service_provider.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/providers/environment/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/providers/environment/environment__service_provider.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/providers/files/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/providers/files/paths_provider.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/providers/log/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/providers/log/log_service_provider.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/providers/service_provider.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/services/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/services/commands/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/services/commands/reactor_commands_service.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/services/commands/scheduler_service.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/services/config/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/services/config/config_service.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/services/environment/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/services/environment/environment_service.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/services/files/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/services/files/path_resolver_service.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/services/log/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/services/log/log_service.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/asyn_run.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/dot_dict.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/exception_parse.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/inspection/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/inspection/container_integrity.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/inspection/functions.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/inspection/reflection.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/inspection/reflexion_concrete.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/inspection/reflexion_concrete_with_abstract.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/inspection/reflexion_module.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/inspection/reflexion_module_with_classname.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/reflection.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/std.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/test/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/test/test_exception.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/test/test_output.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/test/test_result.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/test/test_status.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/test/tests.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/test/unit_test.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/static/ascii/icon.ascii +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/static/ascii/info.ascii +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/static/bg/galaxy.jpg +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/static/favicon/OrionisFrameworkFavicon.png +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/static/logos/OrionisFramework.jpg +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/static/logos/OrionisFramework.png +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/static/logos/OrionisFramework.psd +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/static/logos/OrionisFramework2.png +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis/static/logos/OrionisFramework3.png +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis.egg-info/dependency_links.txt +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis.egg-info/entry_points.txt +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis.egg-info/requires.txt +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/orionis.egg-info/top_level.txt +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/setup.cfg +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/setup.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/tests/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/tests/example/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/tests/example/test_example.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/tests/support/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/tests/support/inspection/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/tests/support/inspection/fakes/__init__.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/tests/support/inspection/fakes/fake_reflection_abstract.py +0 -0
- {orionis-0.207.0 → orionis-0.208.0}/tests/support/inspection/fakes/fake_reflection_instance.py +0 -0
{orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/inspection/reflexion_abstract.py
RENAMED
@@ -54,9 +54,25 @@ class ReflexionAbstract:
|
|
54
54
|
"""
|
55
55
|
methods = []
|
56
56
|
for method in self._abstract.__abstractmethods__:
|
57
|
-
|
57
|
+
if not isinstance(getattr(self._abstract, method), property):
|
58
|
+
methods.append(method)
|
58
59
|
return set(methods)
|
59
60
|
|
61
|
+
def getAbstractProperties(self) -> Set[str]:
|
62
|
+
"""Get all abstract property names required by the class.
|
63
|
+
|
64
|
+
Returns
|
65
|
+
-------
|
66
|
+
Set[str]
|
67
|
+
Set of abstract property names
|
68
|
+
"""
|
69
|
+
properties = []
|
70
|
+
for name in getattr(self._abstract, '__abstractmethods__', set()):
|
71
|
+
attr = getattr(self._abstract, name, None)
|
72
|
+
if isinstance(attr, property):
|
73
|
+
properties.append(name)
|
74
|
+
return set(properties)
|
75
|
+
|
60
76
|
def getConcreteMethods(self) -> Dict[str, Callable]:
|
61
77
|
"""Get all concrete methods implemented in the abstract class.
|
62
78
|
|
@@ -154,7 +170,31 @@ class ReflexionAbstract:
|
|
154
170
|
If the method doesn't exist
|
155
171
|
"""
|
156
172
|
method = getattr(self._abstract, methodName)
|
157
|
-
|
173
|
+
if callable(method):
|
174
|
+
return inspect.signature(method)
|
175
|
+
|
176
|
+
def getPropertySignature(self, propertyName: str) -> inspect.Signature:
|
177
|
+
"""Get the signature of an abstract property's getter.
|
178
|
+
|
179
|
+
Parameters
|
180
|
+
----------
|
181
|
+
propertyName : str
|
182
|
+
Name of the abstract property
|
183
|
+
|
184
|
+
Returns
|
185
|
+
-------
|
186
|
+
inspect.Signature
|
187
|
+
The getter signature of the abstract property
|
188
|
+
|
189
|
+
Raises
|
190
|
+
------
|
191
|
+
AttributeError
|
192
|
+
If the property doesn't exist or is not an abstract property
|
193
|
+
"""
|
194
|
+
attr = getattr(self._abstract, propertyName, None)
|
195
|
+
if isinstance(attr, property) and attr.fget is not None:
|
196
|
+
return inspect.signature(attr.fget)
|
197
|
+
raise AttributeError(f"{propertyName} is not an abstract property or doesn't have a getter.")
|
158
198
|
|
159
199
|
def getDocstring(self) -> Optional[str]:
|
160
200
|
"""Get the docstring of the abstract class.
|
{orionis-0.207.0 → orionis-0.208.0}/orionis/luminate/support/inspection/reflexion_instance.py
RENAMED
@@ -198,7 +198,37 @@ class ReflexionInstance:
|
|
198
198
|
'(x, y)'
|
199
199
|
"""
|
200
200
|
method = getattr(self._instance, methodName)
|
201
|
-
|
201
|
+
if callable(method):
|
202
|
+
return inspect.signature(method)
|
203
|
+
|
204
|
+
def getPropertySignature(self, propertyName: str) -> inspect.Signature:
|
205
|
+
"""Get the signature of a property getter.
|
206
|
+
|
207
|
+
Parameters
|
208
|
+
----------
|
209
|
+
propertyName : str
|
210
|
+
Name of the property
|
211
|
+
|
212
|
+
Returns
|
213
|
+
-------
|
214
|
+
inspect.Signature
|
215
|
+
The property's getter method signature
|
216
|
+
|
217
|
+
Raises
|
218
|
+
------
|
219
|
+
AttributeError
|
220
|
+
If the property doesn't exist or is not a property
|
221
|
+
|
222
|
+
Examples
|
223
|
+
--------
|
224
|
+
>>> sig = reflex.getPropertySignature('config')
|
225
|
+
>>> str(sig)
|
226
|
+
'(self)'
|
227
|
+
"""
|
228
|
+
attr = getattr(type(self._instance), propertyName, None)
|
229
|
+
if isinstance(attr, property) and attr.fget is not None:
|
230
|
+
return inspect.signature(attr.fget)
|
231
|
+
raise AttributeError(f"{propertyName} is not a property or doesn't have a getter.")
|
202
232
|
|
203
233
|
def getDocstring(self) -> Optional[str]:
|
204
234
|
"""Get the docstring of the instance's class.
|
@@ -0,0 +1,230 @@
|
|
1
|
+
import abc
|
2
|
+
import inspect
|
3
|
+
from typing import Any, Dict, List, Tuple, Type, TypeVar, Union
|
4
|
+
from orionis.luminate.support.inspection.reflexion_abstract import ReflexionAbstract
|
5
|
+
from orionis.luminate.support.inspection.reflexion_instance import ReflexionInstance
|
6
|
+
|
7
|
+
T = TypeVar('T')
|
8
|
+
ABC = TypeVar('ABC', bound=abc.ABC)
|
9
|
+
|
10
|
+
class ReflexionInstanceWithAbstract:
|
11
|
+
"""Advanced reflection tool for analyzing concrete implementations against abstract bases.
|
12
|
+
|
13
|
+
Combines inspection of both concrete instances and their abstract parent classes,
|
14
|
+
providing detailed comparison and compatibility analysis.
|
15
|
+
|
16
|
+
Parameters
|
17
|
+
----------
|
18
|
+
instance : Any
|
19
|
+
The concrete instance to inspect
|
20
|
+
abstract : Type[ABC]
|
21
|
+
The abstract base class/interface being implemented
|
22
|
+
|
23
|
+
Attributes
|
24
|
+
----------
|
25
|
+
_instance : Any
|
26
|
+
The concrete instance being analyzed
|
27
|
+
_abstract : Type[ABC]
|
28
|
+
The abstract base class/interface
|
29
|
+
_concrete_reflexion : ReflexionInstance
|
30
|
+
Reflection helper for the concrete instance
|
31
|
+
_abstract_reflexion : ReflexionAbstract
|
32
|
+
Reflection helper for the abstract class
|
33
|
+
"""
|
34
|
+
|
35
|
+
def __init__(self, instance: Any, abstract: Type[ABC]) -> None:
|
36
|
+
self._instance = instance
|
37
|
+
self._abstract = abstract
|
38
|
+
self._concrete_reflexion = ReflexionInstance(instance)
|
39
|
+
self._abstract_reflexion = ReflexionAbstract(abstract)
|
40
|
+
|
41
|
+
@property
|
42
|
+
def concrete(self) -> ReflexionInstance:
|
43
|
+
"""Access the concrete instance reflection helper."""
|
44
|
+
return self._concrete_reflexion
|
45
|
+
|
46
|
+
@property
|
47
|
+
def abstract(self) -> ReflexionAbstract:
|
48
|
+
"""Access the abstract class reflection helper."""
|
49
|
+
return self._abstract_reflexion
|
50
|
+
|
51
|
+
def getImplementationAnalysis(self) -> Dict[str, Dict[str, Union[bool, str, inspect.Signature]]]:
|
52
|
+
"""Comprehensive analysis of implementation compliance.
|
53
|
+
|
54
|
+
Returns
|
55
|
+
-------
|
56
|
+
Dict[str, Dict[str, Union[bool, str, inspect.Signature]]]
|
57
|
+
Detailed analysis including:
|
58
|
+
- 'implemented': Whether method is implemented
|
59
|
+
- 'signature_match': Whether signatures match
|
60
|
+
- 'abstract_signature': Signature from abstract class
|
61
|
+
- 'concrete_signature': Signature from concrete class
|
62
|
+
"""
|
63
|
+
analysis = {}
|
64
|
+
abstract_methods = self._abstract_reflexion.getAbstractMethods()
|
65
|
+
for method in abstract_methods:
|
66
|
+
entry = {
|
67
|
+
'implemented': False,
|
68
|
+
'abstract_signature': None,
|
69
|
+
'concrete_signature': None,
|
70
|
+
'signature_match': False,
|
71
|
+
'type' : 'method'
|
72
|
+
}
|
73
|
+
|
74
|
+
if hasattr(self._instance, method):
|
75
|
+
entry['implemented'] = True
|
76
|
+
abstract_sig = self._abstract_reflexion.getMethodSignature(method)
|
77
|
+
concrete_sig = self._concrete_reflexion.getMethodSignature(method)
|
78
|
+
|
79
|
+
entry.update({
|
80
|
+
'abstract_signature': abstract_sig,
|
81
|
+
'concrete_signature': concrete_sig,
|
82
|
+
'signature_match': (
|
83
|
+
abstract_sig.parameters == concrete_sig.parameters and
|
84
|
+
abstract_sig.return_annotation == concrete_sig.return_annotation
|
85
|
+
)
|
86
|
+
})
|
87
|
+
|
88
|
+
analysis[method] = entry
|
89
|
+
|
90
|
+
abstract_properties = self._abstract_reflexion.getAbstractProperties()
|
91
|
+
for prop in abstract_properties:
|
92
|
+
entry = {
|
93
|
+
'implemented': False,
|
94
|
+
'abstract_signature': None,
|
95
|
+
'concrete_signature': None,
|
96
|
+
'signature_match': False,
|
97
|
+
'type' : 'property'
|
98
|
+
}
|
99
|
+
|
100
|
+
if hasattr(self._instance, prop):
|
101
|
+
entry['implemented'] = True
|
102
|
+
abstract_sig = self._abstract_reflexion.getPropertySignature(prop)
|
103
|
+
concrete_sig = self._concrete_reflexion.getPropertySignature(prop)
|
104
|
+
|
105
|
+
entry.update({
|
106
|
+
'abstract_signature': abstract_sig,
|
107
|
+
'concrete_signature': concrete_sig,
|
108
|
+
'signature_match': (
|
109
|
+
abstract_sig.parameters == concrete_sig.parameters and
|
110
|
+
abstract_sig.return_annotation == concrete_sig.return_annotation
|
111
|
+
)
|
112
|
+
})
|
113
|
+
|
114
|
+
analysis[prop] = entry
|
115
|
+
|
116
|
+
return analysis
|
117
|
+
|
118
|
+
def getNonInheritedImplementation(self) -> Dict[str, Any]:
|
119
|
+
"""Get implementation details for methods, properties, and attributes not inherited from other parents.
|
120
|
+
|
121
|
+
Returns
|
122
|
+
-------
|
123
|
+
Dict[str, Any]
|
124
|
+
Dictionary containing:
|
125
|
+
- 'methods': List of non-inherited method names
|
126
|
+
- 'properties': List of non-inherited property names
|
127
|
+
- 'attributes': Dict of non-inherited attributes
|
128
|
+
"""
|
129
|
+
# Get all members from concrete class (non-inherited methods, properties, and attributes)
|
130
|
+
concrete_members = set(dir(self._instance.__class__))
|
131
|
+
|
132
|
+
# Get members from the abstract class (base class)
|
133
|
+
base_members = set(dir(self._abstract))
|
134
|
+
|
135
|
+
# Filter out inherited members (methods, properties, and attributes)
|
136
|
+
non_inherited_methods = [
|
137
|
+
name for name in concrete_members
|
138
|
+
if callable(getattr(self._instance.__class__, name)) and name not in base_members
|
139
|
+
]
|
140
|
+
|
141
|
+
non_inherited_properties = [
|
142
|
+
name for name in concrete_members
|
143
|
+
if isinstance(getattr(self._instance.__class__, name, None), property) and name not in base_members
|
144
|
+
]
|
145
|
+
|
146
|
+
non_inherited_attributes = {
|
147
|
+
name: getattr(self._instance.__class__, name)
|
148
|
+
for name in concrete_members
|
149
|
+
if not callable(getattr(self._instance.__class__, name)) and not isinstance(getattr(self._instance.__class__, name, None), property) and name not in base_members
|
150
|
+
}
|
151
|
+
|
152
|
+
return {
|
153
|
+
'methods': non_inherited_methods,
|
154
|
+
'properties': non_inherited_properties,
|
155
|
+
'attributes': non_inherited_attributes
|
156
|
+
}
|
157
|
+
|
158
|
+
def validateImplementation(self) -> Tuple[bool, Dict[str, List[str]]]:
|
159
|
+
"""Validate the implementation against the abstract base.
|
160
|
+
|
161
|
+
Returns
|
162
|
+
-------
|
163
|
+
Tuple[bool, Dict[str, List[str]]]
|
164
|
+
- First element: True if fully valid implementation
|
165
|
+
- Second element: Dictionary of issues by category:
|
166
|
+
* 'missing': Missing required methods
|
167
|
+
* 'signature_mismatch': Methods with signature mismatches
|
168
|
+
* 'type_mismatch': Methods with return type mismatches
|
169
|
+
"""
|
170
|
+
issues = {
|
171
|
+
'missing': [],
|
172
|
+
'signature_mismatch': [],
|
173
|
+
'type_mismatch': []
|
174
|
+
}
|
175
|
+
|
176
|
+
analysis = self.getImplementationAnalysis()
|
177
|
+
for method, data in analysis.items():
|
178
|
+
if not data['implemented']:
|
179
|
+
issues['missing'].append(method)
|
180
|
+
elif not data['signature_match']:
|
181
|
+
issues['signature_mismatch'].append(method)
|
182
|
+
# Check specifically for return type mismatch
|
183
|
+
abstract_return = data['abstract_signature'].return_annotation
|
184
|
+
concrete_return = data['concrete_signature'].return_annotation
|
185
|
+
if abstract_return != concrete_return and abstract_return is not inspect.Parameter.empty:
|
186
|
+
issues['type_mismatch'].append(method)
|
187
|
+
|
188
|
+
is_valid = not any(issues.values())
|
189
|
+
return (is_valid, issues)
|
190
|
+
|
191
|
+
def getHierarchyAnalysis(self) -> Dict[str, List[str]]:
|
192
|
+
"""Analyze the class hierarchy relationships.
|
193
|
+
|
194
|
+
Returns
|
195
|
+
-------
|
196
|
+
Dict[str, List[str]]
|
197
|
+
Dictionary containing:
|
198
|
+
- 'concrete_hierarchy': List of class names in concrete hierarchy
|
199
|
+
- 'abstract_hierarchy': List of class names in abstract hierarchy
|
200
|
+
- 'common_ancestors': List of common ancestor class names
|
201
|
+
"""
|
202
|
+
concrete_hierarchy = [cls.__name__ for cls in inspect.getmro(self._instance.__class__)]
|
203
|
+
abstract_hierarchy = [cls.__name__ for cls in inspect.getmro(self._abstract)]
|
204
|
+
|
205
|
+
concrete_bases = set(inspect.getmro(self._instance.__class__))
|
206
|
+
abstract_bases = set(inspect.getmro(self._abstract))
|
207
|
+
common = concrete_bases & abstract_bases - {self._abstract, object}
|
208
|
+
|
209
|
+
return {
|
210
|
+
'concrete_hierarchy': concrete_hierarchy,
|
211
|
+
'abstract_hierarchy': abstract_hierarchy,
|
212
|
+
'common_ancestors': [cls.__name__ for cls in common]
|
213
|
+
}
|
214
|
+
|
215
|
+
def getImplementationCoverage(self) -> float:
|
216
|
+
"""Calculate the percentage of abstract methods implemented.
|
217
|
+
|
218
|
+
Returns
|
219
|
+
-------
|
220
|
+
float
|
221
|
+
Implementation coverage percentage (0.0 to 1.0)
|
222
|
+
"""
|
223
|
+
attr = self.getImplementationAnalysis()
|
224
|
+
attr_len = len(attr) * 2
|
225
|
+
attr_implemented = 0
|
226
|
+
for method in attr.values():
|
227
|
+
if method.get('implemented'):
|
228
|
+
attr_implemented += 2 if method.get('signature_match') else 1
|
229
|
+
|
230
|
+
return attr_implemented / attr_len if attr_len > 0 else 0.0
|
@@ -211,6 +211,8 @@ tests/support/__init__.py
|
|
211
211
|
tests/support/inspection/__init__.py
|
212
212
|
tests/support/inspection/test_reflection_abstract.py
|
213
213
|
tests/support/inspection/test_reflection_instance.py
|
214
|
+
tests/support/inspection/test_reflection_instance_with_abstract.py
|
214
215
|
tests/support/inspection/fakes/__init__.py
|
215
216
|
tests/support/inspection/fakes/fake_reflection_abstract.py
|
216
|
-
tests/support/inspection/fakes/fake_reflection_instance.py
|
217
|
+
tests/support/inspection/fakes/fake_reflection_instance.py
|
218
|
+
tests/support/inspection/fakes/fake_reflection_instance_with_abstract.py
|
@@ -0,0 +1,45 @@
|
|
1
|
+
from abc import ABC, abstractmethod
|
2
|
+
from typing import List, Dict
|
3
|
+
|
4
|
+
class IDataProcessor(ABC):
|
5
|
+
"""Interfaz para procesamiento de datos."""
|
6
|
+
|
7
|
+
@property
|
8
|
+
@abstractmethod
|
9
|
+
def config(self) -> Dict[str, str]:
|
10
|
+
"""Configuración del procesador."""
|
11
|
+
pass
|
12
|
+
|
13
|
+
@abstractmethod
|
14
|
+
def process(self, data: List[float]) -> Dict[str, float]:
|
15
|
+
"""Procesa una lista de números y devuelve métricas."""
|
16
|
+
pass
|
17
|
+
|
18
|
+
@abstractmethod
|
19
|
+
def validate_input(self, raw_data: str) -> bool:
|
20
|
+
"""Valida si los datos en crudo pueden ser procesados."""
|
21
|
+
pass
|
22
|
+
|
23
|
+
class FakeDataProcessor:
|
24
|
+
"""Implementación concreta fake de IDataProcessor."""
|
25
|
+
|
26
|
+
def __init__(self):
|
27
|
+
self._config = {"mode": "standard"}
|
28
|
+
self._version = "1.0"
|
29
|
+
|
30
|
+
@property
|
31
|
+
def config(self) -> Dict[str, str]:
|
32
|
+
"""Implementación correcta de la propiedad."""
|
33
|
+
return self._config
|
34
|
+
|
35
|
+
def process(self, values: List[float]) -> Dict[str, float]:
|
36
|
+
"""Implementación con tipo de retorno incorrecto (float vs Dict)."""
|
37
|
+
return sum(values) / len(values) if values else 0.0
|
38
|
+
|
39
|
+
def validate_input(self, source: str) -> bool:
|
40
|
+
"""Implementación con parámetro renombrado (source vs raw_data)."""
|
41
|
+
return bool(source)
|
42
|
+
|
43
|
+
def extra_method(self) -> str:
|
44
|
+
"""Método adicional no definido en la interfaz."""
|
45
|
+
return f"Processing with version {self._version}"
|
@@ -226,4 +226,13 @@ class TestReflexionAbstract(unittest.TestCase, PrinterInTest):
|
|
226
226
|
Verifies that:
|
227
227
|
- Returns empty set for non-Protocol classes
|
228
228
|
"""
|
229
|
-
self.assertEqual(Reflection.abstract(FakeAbstractClass).getRequiredAttributes(), set())
|
229
|
+
self.assertEqual(Reflection.abstract(FakeAbstractClass).getRequiredAttributes(), set())
|
230
|
+
|
231
|
+
def testReflectionAbstractGetAbstractProperties(self):
|
232
|
+
"""Test getRequiredMethods() method."""
|
233
|
+
self.assertEqual(Reflection.abstract(FakeAbstractClass).getAbstractProperties(), set())
|
234
|
+
|
235
|
+
def testReflectionAbstractGetPropertySignature(self):
|
236
|
+
"""Test getPropertySignature() method."""
|
237
|
+
signature = Reflection.abstract(FakeAbstractClass).getPropertySignature('computed_property')
|
238
|
+
self.assertEqual(str(signature), '(self) -> float')
|
@@ -139,3 +139,8 @@ class TestReflection(unittest.TestCase, PrinterInTest):
|
|
139
139
|
|
140
140
|
result = reflex.callMethod("myMacro", reflex._instance, 3)
|
141
141
|
self.assertEqual(result, 25)
|
142
|
+
|
143
|
+
def testReflectionInstanceGetPropertySignature(self):
|
144
|
+
"""Ensure getPropertySignature returns the correct property signature."""
|
145
|
+
signature = Reflection.instance(FakeClass()).getPropertySignature('computed_property')
|
146
|
+
self.assertEqual(str(signature), '(self) -> str')
|
@@ -0,0 +1,80 @@
|
|
1
|
+
import unittest
|
2
|
+
from orionis.luminate.support.inspection.reflexion_instance_with_abstract import ReflexionInstanceWithAbstract
|
3
|
+
from orionis.luminate.test.test_output import PrinterInTest
|
4
|
+
from tests.support.inspection.fakes.fake_reflection_instance_with_abstract import FakeDataProcessor, IDataProcessor
|
5
|
+
|
6
|
+
class TestReflexionWithFakes(unittest.TestCase, PrinterInTest):
|
7
|
+
|
8
|
+
def testReflexionInstanceWithAbstractGetImplementationAnalysis(self):
|
9
|
+
"""Test reflexion con IDataProcessor y FakeDataProcessor."""
|
10
|
+
processor = FakeDataProcessor()
|
11
|
+
inspector = ReflexionInstanceWithAbstract(processor, IDataProcessor)
|
12
|
+
|
13
|
+
# Get Implementation analysis
|
14
|
+
analysis = inspector.getImplementationAnalysis()
|
15
|
+
|
16
|
+
# Verifying implemented methods
|
17
|
+
self.assertTrue(analysis['validate_input']['implemented'])
|
18
|
+
self.assertEqual(str(analysis['validate_input']['abstract_signature']), "(self, raw_data: str) -> bool")
|
19
|
+
self.assertEqual(str(analysis['validate_input']['concrete_signature']), "(source: str) -> bool")
|
20
|
+
self.assertFalse(analysis['validate_input']['signature_match'])
|
21
|
+
self.assertEqual(analysis['validate_input']['type'], 'method')
|
22
|
+
|
23
|
+
self.assertTrue(analysis['process']['implemented'])
|
24
|
+
self.assertEqual(str(analysis['process']['abstract_signature']), "(self, data: List[float]) -> Dict[str, float]")
|
25
|
+
self.assertEqual(str(analysis['process']['concrete_signature']), "(values: List[float]) -> Dict[str, float]")
|
26
|
+
self.assertFalse(analysis['process']['signature_match'])
|
27
|
+
self.assertEqual(analysis['process']['type'], 'method')
|
28
|
+
|
29
|
+
self.assertTrue(analysis['config']['implemented'])
|
30
|
+
self.assertEqual(str(analysis['config']['abstract_signature']), "(self) -> Dict[str, str]")
|
31
|
+
self.assertEqual(str(analysis['config']['concrete_signature']), "(self) -> Dict[str, str]")
|
32
|
+
self.assertTrue(analysis['config']['signature_match'])
|
33
|
+
self.assertEqual(analysis['config']['type'], 'property')
|
34
|
+
|
35
|
+
def testReflexionInstanceWithAbstractGetNonInheritedImplementation(self):
|
36
|
+
"""Test reflexion con IDataProcessor y FakeDataProcessor."""
|
37
|
+
processor = FakeDataProcessor()
|
38
|
+
inspector = ReflexionInstanceWithAbstract(processor, IDataProcessor)
|
39
|
+
|
40
|
+
# Get Non-Inherited implementation analysis
|
41
|
+
analysis = inspector.getNonInheritedImplementation()
|
42
|
+
|
43
|
+
# Verifying implemented methods
|
44
|
+
self.assertIn('extra_method', analysis['methods'])
|
45
|
+
|
46
|
+
def testReflexionInstanceWithAbstractValidateImplementation(self):
|
47
|
+
"""Test reflexion con IDataProcessor y FakeDataProcessor."""
|
48
|
+
processor = FakeDataProcessor()
|
49
|
+
inspector = ReflexionInstanceWithAbstract(processor, IDataProcessor)
|
50
|
+
|
51
|
+
# Get Implementation analysis
|
52
|
+
is_valid, issues = inspector.validateImplementation()
|
53
|
+
|
54
|
+
# Verifying implemented methods
|
55
|
+
self.assertFalse(is_valid)
|
56
|
+
self.assertIn('process', issues['signature_mismatch'])
|
57
|
+
|
58
|
+
def testReflexionInstanceWithAbstractGetHierarchyAnalysis(self):
|
59
|
+
"""Test reflexion con IDataProcessor y FakeDataProcessor."""
|
60
|
+
processor = FakeDataProcessor()
|
61
|
+
inspector = ReflexionInstanceWithAbstract(processor, IDataProcessor)
|
62
|
+
|
63
|
+
# Get Hierarchy analysis
|
64
|
+
analysis = inspector.getHierarchyAnalysis()
|
65
|
+
|
66
|
+
# Verifying implemented methods
|
67
|
+
self.assertEqual(analysis['common_ancestors'], [])
|
68
|
+
self.assertIn('IDataProcessor', analysis['abstract_hierarchy'])
|
69
|
+
self.assertIn('FakeDataProcessor', analysis['concrete_hierarchy'])
|
70
|
+
|
71
|
+
def testReflexionInstanceWithAbstractGetImplementationCoverage(self):
|
72
|
+
"""Test reflexion con IDataProcessor y FakeDataProcessor."""
|
73
|
+
processor = FakeDataProcessor()
|
74
|
+
inspector = ReflexionInstanceWithAbstract(processor, IDataProcessor)
|
75
|
+
|
76
|
+
# Get Implementation coverage
|
77
|
+
coverage = inspector.getImplementationCoverage()
|
78
|
+
|
79
|
+
# Verifying implemented methods
|
80
|
+
self.assertTrue(coverage >= 0.66)
|