RunCodeFlowModule / ExecuteCodeAtomicFlow.py
Tachi67's picture
Update ExecuteCodeAtomicFlow.py
efed64d
raw
history blame
2.57 kB
import os
import time
from typing import Dict, Any
import subprocess
from flow_modules.Tachi67.InterpreterFlowModule import InterpreterAtomicFlow
class ExecuteCodeAtomicFlow(InterpreterAtomicFlow):
"""This class inherits from InterpreterAtomicFlow and is used to execute code in a file.
It opens up the file in VSCode and waits for the user to save the file. Once the file is saved, it reads the code
from the file and executes it. It then returns the output of the execution.
*Input Interface*:
- temp_code_file_location: The location of the file containing the code to be executed.
- language: The language of the code to be executed.
*Output Interface*:
- interpreter_output: The output of the execution of the code.
- code_ran: The code that was executed.
"""
def _prepare_code(self, input_data: Dict[str, Any]):
file_location = input_data["temp_code_file_location"]
start_marker = "# Code:\n"
end_marker = "############"
code_started = False
code_str = ""
with open(file_location, 'r') as file:
for line in file:
if line.strip() == start_marker.strip():
code_started = True
continue
if line.strip() == end_marker.strip():
break
if code_started:
code_str += line
input_data["code"] = code_str
def _check_input(self, input_data: Dict[str, Any]):
assert "temp_code_file_location" in input_data, "temp_code_file_location not passed to ExecuteCodeAtomicFlow"
assert "language" in input_data, "language not passed to ExecuteCodeAtomicFlow"
def _delete_file(self, file_location):
if os.path.exists(file_location):
os.remove(file_location)
def _open_file_and_wait_for_upd(self, file_location):
process = subprocess.Popen(["code", "--wait", file_location])
while True:
if process.poll() is not None:
break
time.sleep(1)
def run(
self,
input_data: Dict[str, Any]):
self._check_input(input_data)
file_loc = input_data["temp_code_file_location"]
self._open_file_and_wait_for_upd(file_loc)
self._prepare_code(input_data)
self._process_input_data(input_data)
execution_output = self._call()
self._delete_file(file_loc)
response = {"interpreter_output": execution_output, "code_ran": input_data['code']}
return response