def get_folder(self, path) -> Folder: def resolve_folder() -> Folder: return self.current if folder is None else folder folder: Optional[Folder] = None if len(path) == 0: log.debug(f'_get_folder: path = {path}, returning self.root') return self.root if path.startswith('/'): folder = self.root path = path[1:] log.debug(f'_get_folder: path = {path}, resolved = {resolve_folder().path()}') for node in [i for i in path.split('/') if i != '']: try: if node == '..': folder = asserttype(Folder, resolve_folder().parent) elif node in resolve_folder().nodes: folder = asserttype(Folder, resolve_folder().nodes[node]) else: raise IOError(f"{path} Not found") except AssertionError: raise IOError(f"Is File") return notnone(folder)
def move(self, src: str, dest: str) -> None: log.debug(f'move_directory: src = {src} => dest = {dest}') _src, _dest = self._get_node(src), self.get_folder(dest) asserttype(Folder, _src.parent).nodes.pop(_src.name) _src.parent = _dest _dest.nodes[_src.name] = _src self.save()
def delete(self, path: str) -> None: node = self._get_node(path) try: if isinstance(node, File) or (isinstance(node, Folder) and len(node.nodes) == 0): asserttype(Folder, node.parent).nodes.pop(node.name) else: raise IOError('Not empty') except KeyError: raise IOError('Not found') self.save()
def open_file(self, name: str, mode: str = 'r') -> File: with self.conn() as soc: send_request( soc, encode_parameter('fs', 'open_file', self.path(), name, mode)) return RemoteFile(self.conn, asserttype(File, pickle.loads(get_request(soc))))
def open_file(self, name: str, mode: str = 'r') -> File: try: if mode == 'r': if name in self.nodes: return Readable(asserttype(File, self.nodes[name])) raise IOError("No such file") if name not in self.nodes: self.create_file(name) if mode == 'w': return Writeable(asserttype(File, self.nodes[name])) elif mode == 'a': return Appendable(Writeable(asserttype(File, self.nodes[name]))) elif mode == 'rw': return Hybrid(asserttype(File, self.nodes[name])) elif mode == 'ra': return Appendable(Hybrid(asserttype(File, self.nodes[name]))) except AssertionError: raise IOError("Is directory")
def __init__(self, conn: Callable[[], Connection], folder: Folder) -> None: super().__init__( folder.name, asserttype(Folder, folder.parent) if folder.parent is not None else None, folder.nodes) self.conn = conn
def current(self): with self.__create_connection() as soc: send_request(soc, encode_parameter('fs', 'current')) return RemoteFolder( self.__create_connection, asserttype(Folder, pickle.loads(get_request(soc))))
def memory_map(self) -> Memory: with self.__create_connection() as soc: send_request(soc, encode_parameter('fs', 'memory_map')) return asserttype(Memory, pickle.loads(get_request(soc)))
def change_directory(self, path: str) -> Folder: with self.__create_connection() as soc: send_request(soc, encode_parameter('fs', 'change_directory', path)) return RemoteFolder( self.__create_connection, asserttype(Folder, pickle.loads(get_request(soc))))
def close(self, node: Node) -> None: self.__loaded.remove(asserttype(Node, node))
def open(self, node: Node) -> None: self.__loaded.add(asserttype(Node, node))