import termcolor from tools.colException import ColException class MasterProtocol(object): CONNECTION_REQUIRED = {} NAME = '' parameter_not_found = type('ParameterNotFound', (ColException, ), {}) weird_position_index = type('WeirdPositionIndex', (ColException,), {}) @classmethod def _find_on_dict(cls, key, dict_where_seek): if hasattr(dict_where_seek, 'items'): children_dicts = [] # Ordering parameters, this method work with the position of # the parameters in dict_where_seek # SO MUST BE ORDERED ALWAYS IN THE SAME WAY sorted_items = sorted(dict_where_seek.items(), key=lambda x: x[0]) for k, v in sorted_items: if k == key: yield v if isinstance(v, dict): children_dicts.append(v) for children in children_dicts: for result in cls._find_on_dict(key, children): yield result @classmethod def parse_parameters(cls, parameters, **required_values): required_data = cls.CONNECTION_REQUIRED.copy() required_data.update(required_values) parsed_parameters = {} for key_data in required_data: data = key_data if len(key_data.split(':')) == 1: index_data = -1 elif len(key_data.split(':')) == 2: index_data = int(key_data.split(':')[-1]) data = data.split(':')[0] else: raise cls.weird_position_index('ERROR: {} parameter has ' 'too indexes.'.format(key_data)) data_found = list(cls._find_on_dict(data, parameters)) if not data_found: print(termcolor.colored('WARNING: {} parameter not found. ' 'Setting to default value (False)'. format(data), 'yellow')) data_found = [False] elif len(data_found) > 1: print(termcolor.colored('WARNING: Exists more than one result ' 'for key "{}". Selecting index {} ({})'. format(data, index_data, data_found[index_data]), 'yellow')) data_found = data_found[index_data] parsed_parameters[required_data[key_data]] = data_found # Add protocol key parsed_parameters['protocol'] = cls.NAME return parsed_parameters