CodeFileEditFlowModule / CodeFileEditAtomicFlow.py
Tachi67's picture
Update CodeFileEditAtomicFlow.py
250e1cc
raw
history blame
3.05 kB
import subprocess
import webbrowser
from typing import Dict, Any
from flows.base_flows.atomic import AtomicFlow
import os
class CodeFileEditAtomicFlow(AtomicFlow):
def _write_code_to_temp_file(self, code_str, language_of_code, code_lib_location):
directory = os.path.dirname(code_lib_location)
if language_of_code.lower() == 'python':
temp_file_location = os.path.join(directory, 'temp.py')
else:
raise NotImplemented
try:
content = (
"# The below code will be appended to " +
code_lib_location + "\n"
"# Edit the code directly or provide your thoughts down below if you have any suggestions.\n"
"# If you prefer not to give any thoughts, just leave it blank, the code will be added to the library as it is "
"in this file.\n"
"###########\n"
"# Code:\n" +
code_str +
"\n############\n"
"# Thoughts:"
)
with open(temp_file_location, "w") as file:
file.write(content)
file_written_timestamp = os.path.getmtime(temp_file_location)
return True, f"Code written to {temp_file_location}", temp_file_location, file_written_timestamp
except Exception as e:
return False, str(e), temp_file_location, 0
def _check_input(self, input_data: Dict[str, Any]):
assert "code" in input_data, "code is not passed to CodeFileEditAtomicFlow"
assert "language_of_code" in input_data, "language_of_code is not passed to CodeFileEditAtomicFlow"
assert "memory_files" in input_data, "memory_files is not passed to CodeFileEditAtomicFlow"
assert "code_library" in input_data["memory_files"], "code_library not in memory files"
code_lib_loc = input_data["memory_files"]["code_library"]
assert os.path.exists(code_lib_loc), f"{code_lib_loc} does not exist"
assert os.path.isfile(code_lib_loc), f"{code_lib_loc} is not a file"
def run(
self,
input_data: Dict[str, Any]
):
self._check_input(input_data)
code_str = input_data['code']
language_of_code = input_data["language_of_code"]
code_lib_location = input_data["memory_files"]["code_library"]
result, code_editor_output, temp_file_location, file_written_timestamp = self._write_code_to_temp_file(code_str, language_of_code, code_lib_location)
if result:
try:
subprocess.run(["code", temp_file_location], timeout=10)
except (subprocess.CalledProcessError, subprocess.TimeoutExpired):
webbrowser.open(temp_file_location)
response = {}
response["code_editor_output"] = code_editor_output
response["temp_code_file_location"] = temp_file_location
response["temp_code_file_written_timestamp"] = file_written_timestamp
return response