aboutsummaryrefslogtreecommitdiff
path: root/autogpts/autogpt/autogpt/file_workspace/local.py
diff options
context:
space:
mode:
Diffstat (limited to 'autogpts/autogpt/autogpt/file_workspace/local.py')
-rw-r--r--autogpts/autogpt/autogpt/file_workspace/local.py71
1 files changed, 71 insertions, 0 deletions
diff --git a/autogpts/autogpt/autogpt/file_workspace/local.py b/autogpts/autogpt/autogpt/file_workspace/local.py
new file mode 100644
index 000000000..8c2aa6521
--- /dev/null
+++ b/autogpts/autogpt/autogpt/file_workspace/local.py
@@ -0,0 +1,71 @@
+"""
+The LocalFileWorkspace class implements a FileWorkspace that works with local files.
+"""
+from __future__ import annotations
+
+import inspect
+import logging
+from pathlib import Path
+from typing import IO
+
+from .base import FileWorkspace, FileWorkspaceConfiguration
+
+logger = logging.getLogger(__name__)
+
+
+class LocalFileWorkspace(FileWorkspace):
+ """A class that represents a file workspace."""
+
+ def __init__(self, config: FileWorkspaceConfiguration):
+ self._root = self._sanitize_path(config.root)
+ self._restrict_to_root = config.restrict_to_root
+ super().__init__()
+
+ @property
+ def root(self) -> Path:
+ """The root directory of the file workspace."""
+ return self._root
+
+ @property
+ def restrict_to_root(self) -> bool:
+ """Whether to restrict generated paths to the root."""
+ return self._restrict_to_root
+
+ def initialize(self) -> None:
+ self.root.mkdir(exist_ok=True, parents=True)
+
+ def open_file(self, path: str | Path, binary: bool = False) -> IO:
+ """Open a file in the workspace."""
+ return self._open_file(path, "rb" if binary else "r")
+
+ def _open_file(self, path: str | Path, mode: str = "r") -> IO:
+ full_path = self.get_path(path)
+ return open(full_path, mode) # type: ignore
+
+ def read_file(self, path: str | Path, binary: bool = False) -> str | bytes:
+ """Read a file in the workspace."""
+ with self._open_file(path, "rb" if binary else "r") as file:
+ return file.read()
+
+ async def write_file(self, path: str | Path, content: str | bytes) -> None:
+ """Write to a file in the workspace."""
+ with self._open_file(path, "wb" if type(content) is bytes else "w") as file:
+ file.write(content)
+
+ if self.on_write_file:
+ path = Path(path)
+ if path.is_absolute():
+ path = path.relative_to(self.root)
+ res = self.on_write_file(path)
+ if inspect.isawaitable(res):
+ await res
+
+ def list(self, path: str | Path = ".") -> list[Path]:
+ """List all files (recursively) in a directory in the workspace."""
+ path = self.get_path(path)
+ return [file.relative_to(path) for file in path.rglob("*") if file.is_file()]
+
+ def delete_file(self, path: str | Path) -> None:
+ """Delete a file in the workspace."""
+ full_path = self.get_path(path)
+ full_path.unlink()