|
import os |
|
|
|
from parso import file_io |
|
|
|
|
|
class AbstractFolderIO: |
|
def __init__(self, path): |
|
self.path = path |
|
|
|
def get_base_name(self): |
|
raise NotImplementedError |
|
|
|
def list(self): |
|
raise NotImplementedError |
|
|
|
def get_file_io(self, name): |
|
raise NotImplementedError |
|
|
|
def get_parent_folder(self): |
|
raise NotImplementedError |
|
|
|
def __repr__(self): |
|
return '<%s: %s>' % (self.__class__.__name__, self.path) |
|
|
|
|
|
class FolderIO(AbstractFolderIO): |
|
def get_base_name(self): |
|
return os.path.basename(self.path) |
|
|
|
def list(self): |
|
return os.listdir(self.path) |
|
|
|
def get_file_io(self, name): |
|
return FileIO(os.path.join(self.path, name)) |
|
|
|
def get_parent_folder(self): |
|
return FolderIO(os.path.dirname(self.path)) |
|
|
|
def walk(self): |
|
for root, dirs, files in os.walk(self.path): |
|
root_folder_io = FolderIO(root) |
|
original_folder_ios = [FolderIO(os.path.join(root, d)) for d in dirs] |
|
modified_folder_ios = list(original_folder_ios) |
|
yield ( |
|
root_folder_io, |
|
modified_folder_ios, |
|
[FileIO(os.path.join(root, f)) for f in files], |
|
) |
|
modified_iterator = iter(reversed(modified_folder_ios)) |
|
current = next(modified_iterator, None) |
|
i = len(original_folder_ios) |
|
for folder_io in reversed(original_folder_ios): |
|
i -= 1 |
|
if current is folder_io: |
|
current = next(modified_iterator, None) |
|
else: |
|
del dirs[i] |
|
|
|
|
|
class FileIOFolderMixin: |
|
def get_parent_folder(self): |
|
return FolderIO(os.path.dirname(self.path)) |
|
|
|
|
|
class ZipFileIO(file_io.KnownContentFileIO, FileIOFolderMixin): |
|
"""For .zip and .egg archives""" |
|
def __init__(self, path, code, zip_path): |
|
super().__init__(path, code) |
|
self._zip_path = zip_path |
|
|
|
def get_last_modified(self): |
|
try: |
|
return os.path.getmtime(self._zip_path) |
|
except (FileNotFoundError, PermissionError, NotADirectoryError): |
|
return None |
|
|
|
|
|
class FileIO(file_io.FileIO, FileIOFolderMixin): |
|
pass |
|
|
|
|
|
class KnownContentFileIO(file_io.KnownContentFileIO, FileIOFolderMixin): |
|
pass |
|
|