Browse Source

dict can be used in global variables

nico 7 years ago
parent
commit
7959a7ac59
4 changed files with 108 additions and 8 deletions
  1. 21 2
      Docs/settings.md
  2. 6 1
      Tests/test_neuron_launcher.py
  3. 55 0
      brain_examples/neurotimer.yml
  4. 26 5
      kalliope/core/NeuronLauncher.py

+ 21 - 2
Docs/settings.md

@@ -354,7 +354,7 @@ var_files:
   - variables.yml
   - variables.yml
   - variables2.yml
   - variables2.yml
 ```
 ```
-/!\ If a variable is defined in different files, the last file defines the value.
+> **Note:** If a variable is defined in different files, the last file defines the value.
 
 
 In the files the variables are defined by key/value:
 In the files the variables are defined by key/value:
 ```yml
 ```yml
@@ -364,7 +364,6 @@ password: "secret"
 ```
 ```
 
 
 And use variables in your neurons:
 And use variables in your neurons:
-/!\ Because YAML format does no allow double braces not surrounded by quotes: you must use the variable between double quotes. 
 ```yml
 ```yml
   - name: "run-simple-sleep"
   - name: "run-simple-sleep"
     signals:
     signals:
@@ -376,6 +375,26 @@ And use variables in your neurons:
           password: "{{password}}"
           password: "{{password}}"
 ```
 ```
 
 
+> **Note:** Because YAML format does no allow double braces not surrounded by quotes: you must use the variable between double quotes. 
+
+A global variable can be a dictionary. Example:
+```yml
+contacts:
+  nico: "1234"
+  tibo: "5678"
+```
+
+And a synapse that use this dict:
+```yml
+- name: "test-var"
+  signals:
+    - order: "give me the number of {{ contact_to_search }}"
+  neurons:
+    - say:
+        message:
+        - "the number is {{ contacts[contact_to_search] }}"
+```
+
 ## Raspberry LED and mute button
 ## Raspberry LED and mute button
 LEDs connected to GPIO port of your Raspberry can be used to know current status of Kalliope.
 LEDs connected to GPIO port of your Raspberry can be used to know current status of Kalliope.
 A button can also be added in order to pause the trigger process. Kalliope does not listen for the hotword anymore when pressed.
 A button can also be added in order to pause the trigger process. Kalliope does not listen for the hotword anymore when pressed.

+ 6 - 1
Tests/test_neuron_launcher.py

@@ -2,6 +2,7 @@
 
 
 import unittest
 import unittest
 import mock
 import mock
+from kalliope.core.Models import Singleton
 
 
 from kalliope.core.Models.Resources import Resources
 from kalliope.core.Models.Resources import Resources
 from kalliope.core.NeuronLauncher import NeuronLauncher, NeuronParameterNotAvailable
 from kalliope.core.NeuronLauncher import NeuronLauncher, NeuronParameterNotAvailable
@@ -16,7 +17,11 @@ class TestNeuronLauncher(unittest.TestCase):
     """
     """
 
 
     def setUp(self):
     def setUp(self):
-        pass
+        # clean settings
+        Singleton._instances = dict()
+
+    def tearDown(self):
+        Singleton._instances = dict()
 
 
     ####
     ####
     # Neurons Launcher
     # Neurons Launcher

+ 55 - 0
brain_examples/neurotimer.yml

@@ -0,0 +1,55 @@
+  - name: "timer"
+    signals:
+      - order: "je lance un thé"
+      - order: "je lance un T"
+    neurons:
+      - neurotimer:
+          seconds: 10
+          synapse: "time-over"
+      - say:
+          message:
+            - "je vous préviens dans 5 secondes"
+
+  - name: "time-over"
+    signals:
+      - order: "time-is-over"
+    neurons:
+      - say:
+          message:
+            - "c'est terminé"
+
+  - name: "timer2"
+    signals:
+      - order: "préviens moi dans {{ time }} secondes"
+      - order: "préviens-moi dans {{ time }} secondes"
+    neurons:
+      - neurotimer:
+          seconds: "{{ time }}"
+          synapse: "time-over"
+      - say:
+          message:
+            - "je vous préviens dans {{ time }} secondes"
+
+  - name: "remember-synapse"
+    signals:
+      - order: "rappel-moi de {{ remember }} dans {{ time }} secondes"
+      - order: "rappel moi de {{ remember }} dans {{ time }} secondes"
+      - order: "rappelle-moi de {{ remember }} dans {{ time }} secondes"
+    neurons:
+      - neurotimer:
+          seconds: "{{ time }}"
+          synapse: "remember-todo"
+          forwarded_parameters:
+            remember: "{{ remember }}"
+            time: "{{ time }}"
+      - say:
+          message:
+            - "je vous le rappel dans {{ time }} secondes"
+
+  - name: "remember-todo"
+    signals:
+      - order: "no-order-for-this-synapse"
+    neurons:
+      - say:
+          message:
+            - "Vous m'avez demandé de vous rappler de {{ remember }} il y a {{ time }} secondes"

+ 26 - 5
kalliope/core/NeuronLauncher.py

@@ -1,10 +1,10 @@
 import logging
 import logging
-import six
+
 import jinja2
 import jinja2
-import sys
+import six
 
 
-from kalliope.core.Utils.Utils import Utils
 from kalliope.core.ConfigurationManager.SettingLoader import SettingLoader
 from kalliope.core.ConfigurationManager.SettingLoader import SettingLoader
+from kalliope.core.Utils.Utils import Utils
 
 
 logging.basicConfig()
 logging.basicConfig()
 logger = logging.getLogger("kalliope")
 logger = logging.getLogger("kalliope")
@@ -28,8 +28,7 @@ class NeuronLauncher:
         :return:
         :return:
         """
         """
         logger.debug("Run neuron: \"%s\"" % (neuron.__str__()))
         logger.debug("Run neuron: \"%s\"" % (neuron.__str__()))
-        sl = SettingLoader()
+        settings = cls.load_settings()
-        settings = sl.settings
         neuron_folder = None
         neuron_folder = None
         if settings.resources:
         if settings.resources:
             neuron_folder = settings.resources.neuron_folder
             neuron_folder = settings.resources.neuron_folder
@@ -72,6 +71,8 @@ class NeuronLauncher:
             if Utils.is_containing_bracket(neuron_parameters):
             if Utils.is_containing_bracket(neuron_parameters):
                 # check that the parameter to replace is available in the loaded_parameters dict
                 # check that the parameter to replace is available in the loaded_parameters dict
                 if cls._neuron_parameters_are_available_in_loaded_parameters(neuron_parameters, loaded_parameters):
                 if cls._neuron_parameters_are_available_in_loaded_parameters(neuron_parameters, loaded_parameters):
+                    # add parameters from global variable into the final loaded parameter dict
+                    loaded_parameters = cls.merge_with_global_variable_from_settings(loaded_parameters)
                     neuron_parameters = jinja2.Template(neuron_parameters).render(loaded_parameters)
                     neuron_parameters = jinja2.Template(neuron_parameters).render(loaded_parameters)
                     neuron_parameters = Utils.encode_text_utf8(neuron_parameters)
                     neuron_parameters = Utils.encode_text_utf8(neuron_parameters)
                     return str(neuron_parameters)
                     return str(neuron_parameters)
@@ -121,3 +122,23 @@ class NeuronLauncher:
                 Utils.print_danger("The parameter %s is not available in the order" % str(parameter))
                 Utils.print_danger("The parameter %s is not available in the order" % str(parameter))
                 return False
                 return False
         return True
         return True
+
+    @classmethod
+    def merge_with_global_variable_from_settings(cls, loaded_parameters):
+        """
+        merge the received dict "loaded_parameters" with the dict of global variables from settings
+        """
+        settings = cls.load_settings()
+        z = loaded_parameters.copy()
+        z.update(settings.variables)
+        logger.debug("[NeuronLauncher] final dict of parameters: %s" % z)
+        return z
+
+    @classmethod
+    def load_settings(cls):
+        """
+        Return loaded kalliope settings
+        :return: setting object
+        """
+        sl = SettingLoader()
+        return sl.settings