Эх сурвалжийг харах

[Feature] #137 neuron resource_dir path loading and instantiate external neurons
TODO: doc + clean up code + tests

monf 8 жил өмнө
parent
commit
a77548ab72

+ 6 - 4
kalliope/core/ConfigurationManager/ConfigurationChecker.py

@@ -1,6 +1,7 @@
 import re
 import sys
 import os
+import imp
 
 from kalliope.core.Utils.Utils import ModuleNotFoundError
 from kalliope.core.ConfigurationManager.SettingLoader import SettingLoader
@@ -143,13 +144,14 @@ class ConfigurationChecker:
             """
             sl = SettingLoader()
             settings = sl.settings
-            neuron_resource_path = settings.resource_dir + '/' + "neurons" + '/' + neuron_module_name.lower()+"/"+ neuron_module_name.lower()+".py"
+            neuron_resource_path = settings.resource_dir + '/' + "neurons" + '/' + neuron_module_name.lower()+"/" + neuron_module_name.lower()+".py"
             print neuron_resource_path
 
             if os.path.exists(neuron_resource_path):
-                sys.path.append(neuron_resource_path)
-                print sys.path
-                package_name = neuron_module_name.lower()
+                # sys.path.append(neuron_resource_path)
+                # print sys.path
+                imp.load_source(neuron_module_name.capitalize(), neuron_resource_path)
+                package_name = neuron_module_name.capitalize()
             else:
                 package_name = "kalliope.neurons"+ "." + neuron_module_name.lower() + "." + neuron_module_name.lower()
             mod = __import__(package_name, fromlist=[neuron_module_name.capitalize()])

+ 4 - 4
kalliope/core/NeuronLauncher.py

@@ -23,7 +23,7 @@ class NeuronLauncher:
         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,
-                                                     settings.resource_dir)
+        return Utils.get_dynamic_class_instantiation(package_name="neurons",
+                                                     module_name=neuron.name.capitalize(),
+                                                     parameters=neuron.parameters,
+                                                     resources_dir= settings.resource_dir)

+ 3 - 2
kalliope/core/NeuronModule.py

@@ -129,8 +129,9 @@ class NeuronModule(object):
             logger.debug("NeuroneModule: TTS args: %s" % tts_object)
 
             # get the instance of the TTS module
-            tts_module_instance = Utils.get_dynamic_class_instantiation("tts", tts_object.name.capitalize(),
-                                                                        tts_object.parameters)
+            tts_module_instance = Utils.get_dynamic_class_instantiation(package_name="tts",
+                                                                        module_name=tts_object.name.capitalize(),
+                                                                        parameters=tts_object.parameters)
             # generate the audio file and play it
             tts_module_instance.say(tts_message)
 

+ 2 - 2
kalliope/core/OrderListener.py

@@ -55,8 +55,8 @@ class OrderListener(Thread):
         for stt_object in self.settings.stts:
             if stt_object.name == self.stt_module_name:
                 stt_object.parameters["callback"] = self.callback
-                Utils.get_dynamic_class_instantiation('stt',
-                                                      stt_object.name.capitalize(),
+                Utils.get_dynamic_class_instantiation(package_name='stt',
+                                                      module_name=stt_object.name.capitalize(),
                                                       parameters=stt_object.parameters)
 
     @staticmethod

+ 3 - 1
kalliope/core/TTS/TTSLauncher.py

@@ -22,4 +22,6 @@ class TTSLauncher(object):
         .. warnings:: Class Method and Public
         """
         logger.debug("get TTS module \"%s\" with parameters %s" % (tts.name, tts.parameters))
-        return Utils.get_dynamic_class_instantiation("tts", tts.name.capitalize(), tts.parameters)
+        return Utils.get_dynamic_class_instantiation(package_name="tts",
+                                                     module_name=tts.name.capitalize(),
+                                                     parameters=tts.parameters)

+ 3 - 3
kalliope/core/TriggerLauncher.py

@@ -23,6 +23,6 @@ class TriggerLauncher(object):
         # add the callback method to parameters
         trigger.parameters["callback"] = callback
         logger.debug("TriggerLauncher: Start trigger %s with parameters: %s" % (trigger.name, trigger.parameters))
-        return Utils.get_dynamic_class_instantiation("trigger",
-                                                     trigger.name.capitalize(),
-                                                     trigger.parameters)
+        return Utils.get_dynamic_class_instantiation(package_name="trigger",
+                                                     module_name=trigger.name.capitalize(),
+                                                     parameters=trigger.parameters)

+ 12 - 7
kalliope/core/Utils/Utils.py

@@ -1,7 +1,6 @@
 import logging
 import os
 import inspect
-import sys
 import imp
 
 logging.basicConfig()
@@ -87,7 +86,7 @@ class Utils(object):
     #
     #########
     @classmethod
-    def get_dynamic_class_instantiation(package_name, module_name, parameters=None, resource_path=None):
+    def get_dynamic_class_instantiation(cls, package_name, module_name, parameters=None, resources_dir=None):
         """
         Load a python class dynamically
 
@@ -98,15 +97,21 @@ class Utils(object):
         :param package_name: name of the package where we will find the module to load (neurons, tts, stt, trigger)
         :param module_name: name of the module from the package_name to load. This one is capitalized. Eg: Snowboy
         :param parameters:  dict parameters to send as argument to the module
+        :param resources_dir: the resource directory to check for external resources
         :return:
         """
         logger.debug("Run plugin %s with parameter %s" % (module_name, parameters))
+        package_path = "kalliope." + package_name + "." + module_name.lower() + "." + module_name.lower()
+        if resources_dir is not None:
+            neuron_resource_path = resources_dir + '/' + package_name + '/' + module_name.lower() + "/" + module_name.lower() + ".py"
+            if os.path.exists(neuron_resource_path):
+                imp.load_source(module_name.capitalize(), neuron_resource_path)
+                package_path = module_name.capitalize()
+                logger.debug("[Utils]-> get_dynamic_class_instantiation : loading path : %s, as package %s" % (
+                                                                                neuron_resource_path, package_path))
+
+        mod = __import__(package_path, fromlist=[module_name.capitalize()])
 
-        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:

+ 1 - 1
kalliope/settings.yml

@@ -117,4 +117,4 @@ default_synapse: "Default-synapse"
 # ---------------------------
 # resource directory path
 # ---------------------------
-resource_directory: "/tmp/resources"
+resource_directory: "/var/tmp/resources"