From 560d5a3fe494571d4b5a650efe72e26f794c14a2 Mon Sep 17 00:00:00 2001 From: Corvo <60719165+brothercorvo@users.noreply.github.com> Date: Tue, 10 Jun 2025 17:54:00 -0300 Subject: [PATCH] Add app configuration initialization methods --- digitalpy/core/main/impl/default_factory.py | 6 ++++- examples/filmology_app/main.py | 20 +++++++++++++++++ .../application_configuration.ini | 3 +++ .../configuration/object_configuration.ini | 3 +++ examples/minimal_dp_app/main.py | 22 +++++++++++++++++++ .../configuration/object_configuration.ini | 3 +++ examples/reticulum_app/main.py | 20 +++++++++++++++++ 7 files changed, 76 insertions(+), 1 deletion(-) diff --git a/digitalpy/core/main/impl/default_factory.py b/digitalpy/core/main/impl/default_factory.py index e9b83a67..ea765be5 100644 --- a/digitalpy/core/main/impl/default_factory.py +++ b/digitalpy/core/main/impl/default_factory.py @@ -179,7 +179,11 @@ def create_instance(self, name, configuration, instance_key): if getattr(instance, setter_name, None) != None: getattr(instance, setter_name)(value) else: - setattr(instance, key, value) + try: + setattr(instance, key, value) + except AttributeError: + # attribute might be a read-only property + pass else: # TODO: figure out the cases for a mapping being called and how to implement interface = self.get_interface(name) diff --git a/examples/filmology_app/main.py b/examples/filmology_app/main.py index c27b3703..5a630578 100644 --- a/examples/filmology_app/main.py +++ b/examples/filmology_app/main.py @@ -6,6 +6,9 @@ """ from digitalpy.core.main.DigitalPy import DigitalPy +from digitalpy.core.main.singleton_configuration_factory import ( + SingletonConfigurationFactory, +) class FilmologyApp(DigitalPy): @@ -26,6 +29,23 @@ def __init__(self): super().__init__() self._initialize_app_configuration() + def _initialize_app_configuration(self): + """Load the application specific configuration.""" + super()._initialize_app_configuration() + + self.configuration.set_value( + "blueprint_import_base", + "filmology_app.blueprints", + "digitalpy.core_api", + ) + + component_management_conf = ( + SingletonConfigurationFactory.get_configuration_object( + "ComponentManagementConfiguration" + ) + ) + component_management_conf.component_import_root = "filmology_app.components" + if __name__ == "__main__": # Entry point for the DigitalPy application. # diff --git a/examples/minimal_dp_app/configuration/application_configuration.ini b/examples/minimal_dp_app/configuration/application_configuration.ini index 973c5058..42c87d22 100644 --- a/examples/minimal_dp_app/configuration/application_configuration.ini +++ b/examples/minimal_dp_app/configuration/application_configuration.ini @@ -16,3 +16,6 @@ ; [ServiceManagementConfiguration] ; __class = digitalpy.core.service_management.domain.model.service_management_configuration.ServiceManagementConfiguration ; services = [dp_helloworld.simple_tcp] + +[ComponentManagementConfiguration] +component_import_root = minimal_dp_app.components diff --git a/examples/minimal_dp_app/configuration/object_configuration.ini b/examples/minimal_dp_app/configuration/object_configuration.ini index d2c4d2ee..c18858bc 100644 --- a/examples/minimal_dp_app/configuration/object_configuration.ini +++ b/examples/minimal_dp_app/configuration/object_configuration.ini @@ -13,3 +13,6 @@ ;[digitalpy.core_api] ;blueprint_path = NewPath/To/My/blueprints/ ;blueprint_import_base = MyDifferentRoute.blueprints + +[digitalpy.core_api] +blueprint_import_base = minimal_dp_app.blueprints diff --git a/examples/minimal_dp_app/main.py b/examples/minimal_dp_app/main.py index 8fea326f..1128b9cc 100644 --- a/examples/minimal_dp_app/main.py +++ b/examples/minimal_dp_app/main.py @@ -6,6 +6,9 @@ """ from digitalpy.core.main.DigitalPy import DigitalPy +from digitalpy.core.main.singleton_configuration_factory import ( + SingletonConfigurationFactory, +) class DigitalPyApp(DigitalPy): @@ -26,6 +29,25 @@ def __init__(self): super().__init__() self._initialize_app_configuration() + def _initialize_app_configuration(self): + """Load the application specific configuration.""" + super()._initialize_app_configuration() + + # ensure the core API imports blueprints from this app + self.configuration.set_value( + "blueprint_import_base", + "minimal_dp_app.blueprints", + "digitalpy.core_api", + ) + + # set the component import root so components can be loaded + component_management_conf = ( + SingletonConfigurationFactory.get_configuration_object( + "ComponentManagementConfiguration" + ) + ) + component_management_conf.component_import_root = "minimal_dp_app.components" + if __name__ == "__main__": # Entry point for the DigitalPy application. # diff --git a/examples/reticulum_app/configuration/object_configuration.ini b/examples/reticulum_app/configuration/object_configuration.ini index aef5b323..f08404d4 100644 --- a/examples/reticulum_app/configuration/object_configuration.ini +++ b/examples/reticulum_app/configuration/object_configuration.ini @@ -14,6 +14,9 @@ ;blueprint_path = NewPath/To/My/blueprints/ ;blueprint_import_base = MyDifferentRoute.blueprints +[digitalpy.core_api] +blueprint_import_base = reticulum_app.blueprints + [reticulum_app.reticulum] __class = reticulum_app.services.reticulum_service.ReticulumService identity_path = .identity diff --git a/examples/reticulum_app/main.py b/examples/reticulum_app/main.py index 8fea326f..8342beb1 100644 --- a/examples/reticulum_app/main.py +++ b/examples/reticulum_app/main.py @@ -6,6 +6,9 @@ """ from digitalpy.core.main.DigitalPy import DigitalPy +from digitalpy.core.main.singleton_configuration_factory import ( + SingletonConfigurationFactory, +) class DigitalPyApp(DigitalPy): @@ -26,6 +29,23 @@ def __init__(self): super().__init__() self._initialize_app_configuration() + def _initialize_app_configuration(self): + """Load the application specific configuration.""" + super()._initialize_app_configuration() + + self.configuration.set_value( + "blueprint_import_base", + "reticulum_app.blueprints", + "digitalpy.core_api", + ) + + component_management_conf = ( + SingletonConfigurationFactory.get_configuration_object( + "ComponentManagementConfiguration" + ) + ) + component_management_conf.component_import_root = "reticulum_app.components" + if __name__ == "__main__": # Entry point for the DigitalPy application. #