| import subprocess | |
| import webbrowser | |
| from typing import Dict, Any | |
| from flows.base_flows.atomic import AtomicFlow | |
| import os | |
| class CodeFileEditorAtomicFlow(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) | |
| return True, f"Code written to {temp_file_location}", temp_file_location | |
| except Exception as e: | |
| return False, str(e), temp_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" | |
| 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 = 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 | |
| return response | |