NeuronLauncher.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import logging
  2. import six
  3. import jinja2
  4. import sys
  5. from kalliope.core.Utils.Utils import Utils
  6. from kalliope.core.ConfigurationManager.SettingLoader import SettingLoader
  7. logging.basicConfig()
  8. logger = logging.getLogger("kalliope")
  9. class NeuronParameterNotAvailable(Exception):
  10. pass
  11. class NeuronLauncher:
  12. def __init__(self):
  13. pass
  14. @classmethod
  15. def launch_neuron(cls, neuron):
  16. """
  17. Start a neuron plugin
  18. :param neuron: neuron object
  19. :type neuron: Neuron
  20. :return:
  21. """
  22. logger.debug("Run neuron: \"%s\"" % (neuron.__str__()))
  23. sl = SettingLoader()
  24. settings = sl.settings
  25. neuron_folder = None
  26. if settings.resources:
  27. neuron_folder = settings.resources.neuron_folder
  28. return Utils.get_dynamic_class_instantiation(package_name="neurons",
  29. module_name=neuron.name,
  30. parameters=neuron.parameters,
  31. resources_dir=neuron_folder)
  32. @classmethod
  33. def start_neuron(cls, neuron, parameters_dict=None):
  34. """
  35. Execute each neuron from the received neuron_list.
  36. Replace parameter if exist in the received dict of parameters_dict
  37. :param neuron: Neuron object to run
  38. :param parameters_dict: dict of parameter to load in each neuron if expecting a parameter
  39. :return: List of the instantiated neurons (no errors detected)
  40. """
  41. if neuron.parameters is not None:
  42. try:
  43. neuron.parameters = cls._replace_brackets_by_loaded_parameter(neuron.parameters, parameters_dict)
  44. except NeuronParameterNotAvailable:
  45. Utils.print_danger("The neuron %s cannot be launched" % neuron.name)
  46. return None
  47. instantiated_neuron = NeuronLauncher.launch_neuron(neuron)
  48. return instantiated_neuron
  49. @classmethod
  50. def _replace_brackets_by_loaded_parameter(cls, neuron_parameters, loaded_parameters):
  51. """
  52. Receive a value (which can be a str or dict or list) and instantiate value in double brace bracket
  53. by the value specified in the loaded_parameters dict.
  54. This method will call itself until all values has been instantiated
  55. :param neuron_parameters: value to instantiate. Str or dict or list
  56. :param loaded_parameters: dict of parameters
  57. """
  58. logger.debug("[NeuronLauncher] replacing brackets from %s, using %s" % (neuron_parameters, loaded_parameters))
  59. if isinstance(neuron_parameters, str) or isinstance(neuron_parameters, six.text_type):
  60. # replace bracket parameter only if the str contains brackets
  61. if Utils.is_containing_bracket(neuron_parameters):
  62. # check that the parameter to replace is available in the loaded_parameters dict
  63. if cls._neuron_parameters_are_available_in_loaded_parameters(neuron_parameters, loaded_parameters):
  64. neuron_parameters = jinja2.Template(neuron_parameters).render(loaded_parameters)
  65. neuron_parameters = Utils.encode_text_utf8(neuron_parameters)
  66. return str(neuron_parameters)
  67. else:
  68. raise NeuronParameterNotAvailable
  69. return neuron_parameters
  70. if isinstance(neuron_parameters, dict):
  71. returned_dict = dict()
  72. for key, value in neuron_parameters.items():
  73. if key in "say_template" or key in "file_template": # those keys are reserved for the TTS.
  74. returned_dict[key] = value
  75. else:
  76. returned_dict[key] = cls._replace_brackets_by_loaded_parameter(value, loaded_parameters)
  77. return returned_dict
  78. if isinstance(neuron_parameters, list):
  79. returned_list = list()
  80. for el in neuron_parameters:
  81. templated_value = cls._replace_brackets_by_loaded_parameter(el, loaded_parameters)
  82. returned_list.append(templated_value)
  83. return returned_list
  84. # in all other case (boolean or int for example) we return the value as it
  85. return neuron_parameters
  86. @staticmethod
  87. def _neuron_parameters_are_available_in_loaded_parameters(string_parameters, loaded_parameters):
  88. """
  89. Check that all parameters in brackets are available in the loaded_parameters dict
  90. E.g:
  91. string_parameters = "this is a {{ parameter1 }}"
  92. Will return true if the loaded_parameters looks like the following
  93. loaded_parameters { "parameter1": "a value"}
  94. :param string_parameters: The string that contains one or more parameters in brace brackets
  95. :param loaded_parameters: Dict of parameter
  96. :return: True if all parameters in brackets have an existing key in loaded_parameters dict
  97. """
  98. list_parameters_with_brackets = Utils.find_all_matching_brackets(string_parameters)
  99. # remove brackets to keep only the parameter name
  100. for parameter_with_brackets in list_parameters_with_brackets:
  101. parameter = Utils.remove_spaces_in_brackets(parameter_with_brackets)
  102. parameter = parameter.replace("{{", "").replace("}}", "")
  103. if loaded_parameters is None or parameter not in loaded_parameters:
  104. Utils.print_danger("The parameter %s is not available in the order" % str(parameter))
  105. return False
  106. return True