File size: 3,635 Bytes
f23eecb 65962f6 f23eecb 5ec00c4 250e1cc e7a6ac4 5ec00c4 f5842a5 5ec00c4 f23eecb 5ec00c4 f23eecb 5ec00c4 f23eecb 9c220ad 3a0244e f23eecb 3a0244e f23eecb 5ec00c4 f23eecb 66b867a f23eecb 5ec00c4 66b867a 5ec00c4 3a0244e 5ec00c4 f23eecb |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
import subprocess
import webbrowser
from typing import Dict, Any
from aiflows.base_flows.atomic import AtomicFlow
import os
class CodeFileEditAtomicFlow(AtomicFlow):
"""This class is used to write code to a temp code file, with commented instructions to give information
to the user.
*Input Interface*:
- `code`: str
- `language_of_code`: str
- `memory_files`: Dict[str, str]
*Output Interface*:
- `code_editor_output`: str
- `temp_code_file_location`: str
"""
def _generate_content(self, code_lib_location, code_str) -> str:
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"
"# When you are done editing code and providing feedback, save file and close the current VSCode session to continue. \n"
"###########\n"
"# Code:\n" +
code_str +
"\n############\n"
"# Thoughts:"
)
return content
def _generate_temp_file_location(self, code_lib_location):
directory = os.path.dirname(code_lib_location)
ret = os.path.join(directory, 'temp.py')
return ret
def _write_code_content_to_file(self, file_location, content: str):
try:
with open(file_location, "w") as file:
file.write(content)
return True, f"Code written to {file_location}", file_location
except Exception as e:
return False, str(e), file_location
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"
language_of_code = input_data["language_of_code"]
assert language_of_code.lower() == 'python', "sorry!! only writing python code is supported."
def _generate_input_to_writer(self, input_data: Dict[str, Any]):
code_str = input_data['code']
code_lib_location = input_data["memory_files"]["code_library"]
content_to_write = self._generate_content(code_lib_location, code_str)
file_location_to_write = self._generate_temp_file_location(code_lib_location)
return content_to_write, file_location_to_write
def run(
self,
input_data: Dict[str, Any]
):
self._check_input(input_data)
# ~~~ Getting input data to the file editor ~~~
content_to_write, file_location_to_write = self._generate_input_to_writer(input_data)
# ~~~ Calling the writer function ~~~
result, code_editor_output, temp_file_location = self._write_code_content_to_file(
file_location_to_write, content_to_write)
# ~~~ Generating return variables ~~~
response = {}
response["code_editor_output"] = code_editor_output
response["temp_code_file_location"] = temp_file_location
return response
|