TestCodeFlowModule / CodeTestingAtomicFlow.py
Tachi67's picture
add more docs & comments
e81ee32 verified
import os
import time
import subprocess
from typing import Dict, Any
from flow_modules.aiflows.InterpreterFlowModule import InterpreterAtomicFlow
class CodeTestingAtomicFlow(InterpreterAtomicFlow):
"""This class inherits from InterpreterAtomicFlow and is used to test code.
*Input Interface*:
- `temp_code_file_location`: Location of the file containing the code to be tested.
*Output Interface*:
- `feedback`: Feedback from the test (i.e. test results).
*Configuration Parameters*:
- `input_interface`: the input interface of the atomic flow.
- `output_interface`: the output interface of the atomic flow.
"""
def _open_file_and_wait_for_file_update(self, file_location, check_interval=1):
"""Opens the file in VSCode and waits for the file to be updated.
:param file_location: The location of the file to be opened.
:type file_location: str
:param check_interval: The interval at which the file is checked for updates.
:type check_interval: int
"""
process = subprocess.Popen(["code", "--wait", file_location])
while True:
if process.poll() is not None:
break
time.sleep(check_interval)
def _prepare_code_and_lang(self, input_data: Dict[str, Any]):
"""Prepares the code and language to be passed to the interpreter.
:param input_data: The input data to the atomic flow.
:type input_data: Dict[str, Any]
"""
file_location = input_data["temp_code_file_location"]
input_data["language"] = "python"
with open(file_location, "r") as file:
code_str = file.read()
input_data["code"] = code_str
def _check_input(self, input_data: Dict[str, Any]):
"""Checks if the input data contains the required keys.
:param input_data: The input data to the atomic flow.
:type input_data: Dict[str, Any]
:raises AssertionError: If the input data does not contain the required keys.
"""
assert "temp_code_file_location" in input_data, "temp_code_file_location not passed to CodeTestingAtomicFlow"
def _delete_file(self, file_location):
"""Deletes the file at the given location.
:param file_location: The location of the file to be deleted.
:type file_location: str
"""
if os.path.exists(file_location):
os.remove(file_location)
def run(
self,
input_data: Dict[str, Any]):
"""Runs the atomic flow.
:param input_data: The input data to the atomic flow.
:type input_data: Dict[str, Any]
:return: The output data of the atomic flow.
:rtype: Dict[str, Any]
"""
self._check_input(input_data)
file_loc = input_data["temp_code_file_location"]
self._open_file_and_wait_for_file_update(file_loc)
self._prepare_code_and_lang(input_data)
self._process_input_data(input_data)
response = self._call()
self._delete_file(file_loc)
if response.strip() == '':
response = "test passed"
return {"feedback": response}