AIDockerCompose/Python/Drivers/FilesDriver.py
2026-05-06 18:58:50 +02:00

100 lines
2.8 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from typing import Self, Any, Optional, Sequence
from os.path import exists as path_exists, isfile as is_file, isdir as is_directory, dirname as directory_name, abspath as absolute_path
from io import FileIO
from json import loads as json_decode
from Interfaces.Application.AIChatInterface import AIChatInterface
from Utils.Patterns import RE
class FilesDriver:
ROOT:str = directory_name(absolute_path(__file__))
SLASH:str = "/" if "/" in ROOT else "\\\\"
def __init__(self:Self, aichat:AIChatInterface) -> None:
self.aichat:AIChatInterface = aichat
self.__root_paths:list[str] = ["", self.ROOT]
for _ in range(2):
self.__root_paths.append(RE.PARENT_DIRECTORY.sub(r'\1', self.__root_paths[-1]))
@classmethod
def fix_path(cls:type[Self], path:str) -> str:
return RE.SLASHES.sub(cls.SLASH, path)
def get_absolute_path(self:Self, path:str) -> str|None:
root:str
for root in self.__root_paths:
absolute:str = self.fix_path((root + self.slash if root else "") + path)
if path_exists(absolute):
return absolute
return None
def exists(self:Self, path:str) -> bool:
return self.get_absolute_path(path) is not None
def is_file(self:Self, path:str) -> bool:
absolute:str = self.get_absolute_path(path)
return is_file(absolute) if absolute else False
def is_directory(self:Self, path:str) -> bool:
absolute:str = self.get_absolute_path(path)
return is_directory(absolute) if absolute else False
def load(self:Self, path:str, mode:str = "r") -> str|bytes|None:
absolute:str = self.get_absolute_path(path)
if absolute and is_file(absolute):
file:FileIO
try:
with open(absolute, mode) as file:
return file.read()
except Exception as exception:
pass
return None
def load_json(self:Self, path:str) -> str|bytes|None:
json:Sequence[Any]|dict[str, Any|None]|None
try:
json = json_decode(path)
if json != None:
return json
except Exception as exception:
pass
data:str|None = self.load(path)
if data:
try:
return json_decode(data)
except Exception as exception:
pass
return None
def save(self:Self, path:str, content:str|bytes, mode:str = "w") -> bool:
try:
file:FileIO
with open(self.fix_path(path), mode) as file:
file.write(content)
return True
except Exception as exception:
pass
return False