Browse Source

[Feature] #137 manage a resource path to load external resources like neurons

monf 8 years ago
parent
commit
d36e33ad31

+ 8 - 0
kalliope/brain.yml

@@ -16,3 +16,11 @@
       - say:
           message:
             - "Hello sir"
+
+  - name: "test"
+    signals:
+      - order: "test"
+    neurons:
+      - test:
+          message:
+            - "test"

+ 29 - 1
kalliope/core/ConfigurationManager/SettingLoader.py

@@ -1,7 +1,7 @@
 import logging
 
 from YAMLLoader import YAMLLoader
-from kalliope.core.Utils import Utils
+from kalliope.core.Utils.Utils import Utils
 from kalliope.core.Models import Singleton
 from kalliope.core.Models.RestAPI import RestAPI
 from kalliope.core.Models.Settings import Settings
@@ -106,6 +106,7 @@ class SettingLoader(object):
         rest_api = self._get_rest_api(settings)
         cache_path = self._get_cache_path(settings)
         default_synapse = self._get_default_synapse(settings)
+        resource_dir = self._get_resource_dir(settings)
 
         # Load the setting singleton with the parameters
         setting_object.default_tts_name = default_tts_name
@@ -119,6 +120,7 @@ class SettingLoader(object):
         setting_object.rest_api = rest_api
         setting_object.cache_path = cache_path
         setting_object.default_synapse = default_synapse
+        setting_object.resource_dir = resource_dir
 
         return setting_object
 
@@ -507,4 +509,30 @@ class SettingLoader(object):
 
         return default_synapse
 
+    @staticmethod
+    def _get_resource_dir(settings):
+        """
+        Return the name of the resource directory
+
+        :param settings: The YAML settings file
+        :type settings: dict
+        :return: the resource directory
+        :rtype: String
+
+        :Example:
+
+            resource_directory = cls._get_resource_dir(settings)
+
+        .. seealso::
+        .. raises:: SettingNotFound, NullSettingException, SettingInvalidException
+        .. warnings:: Class Method and Private
+        """
+        try:
+            resource_dir = settings["resource_directory"]
+            logger.debug("Resource directory synapse: %s" % resource_dir)
+        except KeyError:
+            resource_dir = None
+
+        return resource_dir
+
 

+ 2 - 0
kalliope/core/Models/Settings.py

@@ -19,6 +19,7 @@ class Settings(object):
                  rest_api=None,
                  cache_path=None,
                  default_synapse=None,
+                 resource_dir=None,
                  machine=None):
 
         self.default_tts_name = default_tts_name
@@ -32,6 +33,7 @@ class Settings(object):
         self.rest_api = rest_api
         self.cache_path = cache_path
         self.default_synapse = default_synapse
+        self.resource_dir = resource_dir
         self.machine = platform.machine()   # can be x86_64 or armv7l
 
     def __eq__(self, other):

+ 5 - 1
kalliope/core/NeuronLauncher.py

@@ -1,6 +1,7 @@
 import logging
 
 from kalliope.core.Utils.Utils import Utils
+from kalliope.core.ConfigurationManager.SettingLoader import SettingLoader
 
 logging.basicConfig()
 logger = logging.getLogger("kalliope")
@@ -20,6 +21,9 @@ class NeuronLauncher:
         :return:
         """
         logger.debug("Run plugin \"%s\" with parameters %s" % (neuron.name, neuron.parameters))
+        sl = SettingLoader()
+        settings = sl.settings
         return Utils.get_dynamic_class_instantiation("neurons",
                                                      neuron.name.capitalize(),
-                                                     neuron.parameters)
+                                                     neuron.parameters,
+                                                     settings.resource_dir)

+ 10 - 4
kalliope/core/Utils/Utils.py

@@ -1,6 +1,8 @@
 import logging
 import os
 import inspect
+import sys
+import imp
 
 logging.basicConfig()
 logger = logging.getLogger("kalliope")
@@ -84,8 +86,8 @@ class Utils(object):
     # Dynamic loading
     #
     #########
-    @staticmethod
-    def get_dynamic_class_instantiation(package_name, module_name, parameters=None):
+    @classmethod
+    def get_dynamic_class_instantiation(package_name, module_name, parameters=None, resource_path=None):
         """
         Load a python class dynamically
 
@@ -99,8 +101,12 @@ class Utils(object):
         :return:
         """
         logger.debug("Run plugin %s with parameter %s" % (module_name, parameters))
-        module_name_with_path = "kalliope." + package_name + "." + module_name.lower() + "." + module_name.lower()
-        mod = __import__(module_name_with_path, fromlist=[module_name])
+
+        if os.path.exists(resource_path):
+            mod = imp.load_source(module_name, resource_path+'/'+package_name+'/'+module_name.lower()+'/'+module_name.lower()+'.py')
+        else:
+            module_name_with_path = "kalliope." + package_name + "." + module_name.lower() + "." + module_name.lower()
+            mod = __import__(module_name_with_path, fromlist=[module_name])
         try:
             klass = getattr(mod, module_name)
         except AttributeError:

+ 5 - 0
kalliope/settings.yml

@@ -113,3 +113,8 @@ rest_api:
 # ---------------------------
 # Specify an optional default synapse response in case your order is not found.
 default_synapse: "Default-synapse"
+
+# ---------------------------
+# resource directory path
+# ---------------------------
+resource_directory: "/tmp/resources"