docs: def configure(self, config):
          """ Configure all the blocks from an (horible) configuration dictionary
          this data are coming from a json client request and has to be parsed.
          It takes the default value if missing (for component selection and 
          options).
  
          :param config: dictionary that give the component to use for each step
                 and the associated options 
          :type config: dict
  
          `config` format ::
  
              {
                  block_name: [{
                      'name': name_of_the_comp_to_use,
                      'options': {
                              name: value,
                              name: va...
                          }
                      },
                      {...}
                  ]
             }
             
          .. warning:: values of options in this dictionnary are strings
  
          """
          ##TODO use block configuration
          self._logger.info("\n\n\t\t\t ** ============= configure engine ============= ** \n")
          # normalise input format
          for block_name in config.keys():
              if isinstance(config[block_name], dict):
                  config[block_name] = [config[block_name]]
          # check errors
          for block_name, request_comps in config.items():
              if block_name not in self:
                  raise ValueError("Block '%s' doesn't exist !" % block_name)
              block = self[block_name]
              if block.hidden and len(request_comps):
                  raise ValueError("Component '%s' is hidden you can't change it's configuration from here" % block.name)
              if block.required and len(request_comps) == 0:
                  raise ValueError("Component '%s' is required but None given" % block.name)
              # comp is given
              if not block.multiple and isinstance(request_comps, list) and len(request_comps) > 1:
                  raise ValueError("Block '%s' allows only one component to be selected" % block.name)
              # check input dict
              for req_comp in request_comps:
                  if 'name' not in req_comp:
                      raise ValueError("Config error in '%s' " % block.name)
                  if req_comp['name'] not in block:
                      raise ValueError("Invalid component (%s) for block '%s' "
                          % (req_comp['name'], block.name))
  
          # clear the current selection and option
          for block in self:
              # remove selection and reset to default options
              block.clear_selections()
          # configure the blocks
          for block_name, request_comps in config.items():
              block = self[block_name]
              # select and set options
              for req_comp in request_comps:
                  block.select(req_comp['name'], req_comp.get("options", {}))