in experimental/piranha_playground/rule_inference/piranha_agent.py [0:0]
def validate_rule(self, completion) -> Tuple[str, str, str]:
"""
Tests if the inferred rule can transform the source code into the target code.
:param completion: Inferred rule from the model
:type completion: str
:return: A tuple containing the file name, TOML block, and the explanation
:rtype: Tuple[str, str, str]
"""
pattern = r"```toml(?!md)(.*?)```"
logger.debug(f"Completion\n: {completion}")
# Extract all toml block contents
toml_blocks = re.findall(pattern, completion, re.DOTALL)
if not toml_blocks:
raise PiranhaAgentError(
"No TOML block provided in the expected output format. "
"Please provide a TOML block with the rule. ```toml ... ```"
)
pattern = r"```md(.*?)```"
explanation = re.findall(pattern, completion, re.DOTALL)
if not explanation:
raise PiranhaAgentError(
"No explanation provided in the expected output format. "
"Please provide an explanation as a markdown block. ```md ... ```"
)
try:
toml_block = (
toml_blocks[0].replace("parenthesized_expression", "condition").strip()
)
logger.debug(f"Generated rule: {toml_block}")
toml_dict = toml.loads(toml_block)
except Exception as e:
raise PiranhaAgentError(
f"Could not create Piranha rule. The TOML block is not valid: {e}. "
)
refactored_code = self.run_piranha(toml_dict)
if not refactored_code:
raise PiranhaAgentError(
"Piranha did not generate any refactored code. Either the query or the filters are incorrect. "
)
if NodeUtils.normalize_code(refactored_code) != NodeUtils.normalize_code(
self.target_code
):
raise PiranhaAgentError(
f"The rule produced wrong code!!! "
f"Expected:\n{self.target_code}\n\n but got:\n{refactored_code}\n\n"
)
pattern = r"<file_name_start>(.*?)<file_name_end>"
file_names = re.findall(pattern, completion, re.DOTALL)
file_name = file_names[0] if file_names else "rule.toml"
return file_name, toml_block, explanation[0]