def test_parse_content_with_variables(self): content = "${var}" variables_binds = {"var": "abc"} result = utils.parse_content_with_variables(content, variables_binds) self.assertEqual(result, "abc") content = "123${var}456" variables_binds = {"var": "abc"} result = utils.parse_content_with_variables(content, variables_binds) self.assertEqual(result, "123abc456") content = "${var1}" variables_binds = {"var2": "abc"} with self.assertRaises(exception.ParamsError): utils.parse_content_with_variables(content, variables_binds)
def get_eval_value(self, data): """ evaluate data recursively, each variable in data will be evaluated. variables marker: ${variable}. """ if isinstance(data, str): return utils.parse_content_with_variables(data, self.variables) if isinstance(data, list): return [self.get_eval_value(item) for item in data] if isinstance(data, dict): if "func" in data: # this is a function, e.g. {"func": "gen_random_string", "args": [5]} # function marker: "func" key in dict # the function will be called, and its return value will be binded to the variable. func_name = data['func'] args = self.get_eval_value(data.get('args', [])) kargs = self.get_eval_value(data.get('kargs', {})) return self.functions[func_name](*args, **kargs) else: evaluated_data = {} for key, value in data.items(): evaluated_data[key] = self.get_eval_value(value) return evaluated_data return data
def substitute(content): """ substitute content recursively, each variable will be replaced with bind value. variables marker: ${variable}. """ if isinstance(content, str): return utils.parse_content_with_variables(content, variables_binds) if isinstance(content, list): return [substitute(item) for item in content] if isinstance(content, dict): parsed_content = {} for key, value in content.items(): parsed_content[key] = substitute(value) return parsed_content return content