|
|
import os |
|
|
from typing_extensions import Annotated |
|
|
from IPython import get_ipython |
|
|
|
|
|
default_path = "coding/" |
|
|
|
|
|
|
|
|
class IPythonUtils: |
|
|
|
|
|
def exec_python(cell: Annotated[str, "Valid Python cell to execute."]) -> str: |
|
|
""" |
|
|
run cell in ipython and return the execution result. |
|
|
""" |
|
|
ipython = get_ipython() |
|
|
result = ipython.run_cell(cell) |
|
|
log = str(result.result) |
|
|
if result.error_before_exec is not None: |
|
|
log += f"\n{result.error_before_exec}" |
|
|
if result.error_in_exec is not None: |
|
|
log += f"\n{result.error_in_exec}" |
|
|
return log |
|
|
|
|
|
def display_image( |
|
|
image_path: Annotated[str, "Path to image file to display."] |
|
|
) -> str: |
|
|
""" |
|
|
Display image in Jupyter Notebook. |
|
|
""" |
|
|
log = __class__.exec_python( |
|
|
f"from IPython.display import Image, display\n\ndisplay(Image(filename='{image_path}'))" |
|
|
) |
|
|
if not log: |
|
|
return "Image displayed successfully" |
|
|
else: |
|
|
return log |
|
|
|
|
|
|
|
|
class CodingUtils: |
|
|
|
|
|
def list_dir(directory: Annotated[str, "Directory to check."]) -> str: |
|
|
""" |
|
|
List files in choosen directory. |
|
|
""" |
|
|
files = os.listdir(default_path + directory) |
|
|
return str(files) |
|
|
|
|
|
def see_file(filename: Annotated[str, "Name and path of file to check."]) -> str: |
|
|
""" |
|
|
Check the contents of a chosen file. |
|
|
""" |
|
|
with open(default_path + filename, "r") as file: |
|
|
lines = file.readlines() |
|
|
formatted_lines = [f"{i+1}:{line}" for i, line in enumerate(lines)] |
|
|
file_contents = "".join(formatted_lines) |
|
|
|
|
|
return file_contents |
|
|
|
|
|
def modify_code( |
|
|
filename: Annotated[str, "Name and path of file to change."], |
|
|
start_line: Annotated[int, "Start line number to replace with new code."], |
|
|
end_line: Annotated[int, "End line number to replace with new code."], |
|
|
new_code: Annotated[ |
|
|
str, |
|
|
"New piece of code to replace old code with. Remember about providing indents.", |
|
|
], |
|
|
) -> str: |
|
|
""" |
|
|
Replace old piece of code with new one. Proper indentation is important. |
|
|
""" |
|
|
with open(default_path + filename, "r+") as file: |
|
|
file_contents = file.readlines() |
|
|
file_contents[start_line - 1 : end_line] = [new_code + "\n"] |
|
|
file.seek(0) |
|
|
file.truncate() |
|
|
file.write("".join(file_contents)) |
|
|
return "Code modified" |
|
|
|
|
|
def create_file_with_code( |
|
|
filename: Annotated[str, "Name and path of file to create."], |
|
|
code: Annotated[str, "Code to write in the file."], |
|
|
) -> str: |
|
|
""" |
|
|
Create a new file with provided code. |
|
|
""" |
|
|
directory = os.path.dirname(default_path + filename) |
|
|
os.makedirs(directory, exist_ok=True) |
|
|
with open(default_path + filename, "w") as file: |
|
|
file.write(code) |
|
|
return "File created successfully" |
|
|
|