diff --git a/api/core/workflow/utils/variable_template_parser.py b/api/core/workflow/utils/variable_template_parser.py index 9c1dc6086a..925c31a6aa 100644 --- a/api/core/workflow/utils/variable_template_parser.py +++ b/api/core/workflow/utils/variable_template_parser.py @@ -7,11 +7,35 @@ REGEX = re.compile(r"\{\{(#[a-zA-Z0-9_]{1,50}(\.[a-zA-Z_][a-zA-Z0-9_]{0,29}){1,1 class VariableTemplateParser: """ + A class for parsing and manipulating template variables in a string. + Rules: 1. Template variables must be enclosed in `{{}}`. 2. The template variable Key can only be: #node_id.var1.var2#. 3. The template variable Key cannot contain new lines or spaces, and must comply with rule 2. + + Example usage: + + template = "Hello, {{#node_id.query.name#}}! Your age is {{#node_id.query.age#}}." + parser = VariableTemplateParser(template) + + # Extract template variable keys + variable_keys = parser.extract() + print(variable_keys) + # Output: ['#node_id.query.name#', '#node_id.query.age#'] + + # Extract variable selectors + variable_selectors = parser.extract_variable_selectors() + print(variable_selectors) + # Output: [VariableSelector(variable='#node_id.query.name#', value_selector=['node_id', 'query', 'name']), + # VariableSelector(variable='#node_id.query.age#', value_selector=['node_id', 'query', 'age'])] + + # Format the template string + inputs = {'#node_id.query.name#': 'John', '#node_id.query.age#': 25}} + formatted_string = parser.format(inputs) + print(formatted_string) + # Output: "Hello, John! Your age is 25." """ def __init__(self, template: str): @@ -19,6 +43,12 @@ class VariableTemplateParser: self.variable_keys = self.extract() def extract(self) -> list: + """ + Extracts all the template variable keys from the template string. + + Returns: + A list of template variable keys. + """ # Regular expression to match the template rules matches = re.findall(REGEX, self.template) @@ -27,6 +57,12 @@ class VariableTemplateParser: return list(set(first_group_matches)) def extract_variable_selectors(self) -> list[VariableSelector]: + """ + Extracts the variable selectors from the template variable keys. + + Returns: + A list of VariableSelector objects representing the variable selectors. + """ variable_selectors = [] for variable_key in self.variable_keys: remove_hash = variable_key.replace('#', '') @@ -42,6 +78,16 @@ class VariableTemplateParser: return variable_selectors def format(self, inputs: dict, remove_template_variables: bool = True) -> str: + """ + Formats the template string by replacing the template variables with their corresponding values. + + Args: + inputs: A dictionary containing the values for the template variables. + remove_template_variables: A boolean indicating whether to remove the template variables from the output. + + Returns: + The formatted string with template variables replaced by their values. + """ def replacer(match): key = match.group(1) value = inputs.get(key, match.group(0)) # return original matched string if key not found @@ -59,4 +105,13 @@ class VariableTemplateParser: @classmethod def remove_template_variables(cls, text: str): + """ + Removes the template variables from the given text. + + Args: + text: The text from which to remove the template variables. + + Returns: + The text with template variables removed. + """ return re.sub(REGEX, r'{\1}', text)