|
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 |
|
|
|
*Configuration Parameters*: |
|
- `input_interface`: The input interface of the atomic flow. |
|
- `output_interface`: The output interface of the atomic flow. |
|
|
|
""" |
|
def _generate_content(self, code_lib_location, code_str) -> str: |
|
"""This function generates the content to be written to the temp file. |
|
:param code_lib_location (str): The location of the code library file. |
|
:param code_str (str): The code to be written to the temp file. |
|
:return: (str) The content to be written to the temp file. |
|
""" |
|
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): |
|
"""This function generates the location of the temp file. |
|
:param code_lib_location (str): The location of the code library file. |
|
:return: (str) The location of the temp file. |
|
""" |
|
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): |
|
"""This function writes the content to the temp file. |
|
:param file_location (str): The location of the temp file. |
|
:param content (str): The content to be written to the temp file. |
|
:return: (bool, str, str) The first value is a boolean indicating if the write was successful. |
|
The second value is a string containing the output of the write operation. |
|
The third value is a string containing the location of the temp file. |
|
""" |
|
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]): |
|
"""This function checks if the input data is valid. |
|
:param input_data (Dict[str, Any]): The input data. |
|
:return: None |
|
""" |
|
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]): |
|
"""This function generates the input to the writer function. |
|
:param input_data (Dict[str, Any]): The input data. |
|
:return: (str, str) The first value is a string containing the content to be written to the temp file. |
|
The second value is a string containing the location of the temp file. |
|
""" |
|
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] |
|
): |
|
"""This function runs the atomic flow. |
|
|
|
:param input_data: The input data. |
|
:type input_data: Dict[str, Any] |
|
:return: The output data containing code editor output and temporary file location. |
|
:rtype: Dict[str, Any] |
|
""" |
|
self._check_input(input_data) |
|
|
|
|
|
content_to_write, file_location_to_write = self._generate_input_to_writer(input_data) |
|
|
|
|
|
result, code_editor_output, temp_file_location = self._write_code_content_to_file( |
|
file_location_to_write, content_to_write) |
|
|
|
|
|
response = {} |
|
response["code_editor_output"] = code_editor_output |
|
response["temp_code_file_location"] = temp_file_location |
|
return response |
|
|