file_io.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import os
  2. from parso import file_io
  3. class AbstractFolderIO:
  4. def __init__(self, path):
  5. self.path = path
  6. def get_base_name(self):
  7. raise NotImplementedError
  8. def list(self):
  9. raise NotImplementedError
  10. def get_file_io(self, name):
  11. raise NotImplementedError
  12. def get_parent_folder(self):
  13. raise NotImplementedError
  14. def __repr__(self):
  15. return '<%s: %s>' % (self.__class__.__name__, self.path)
  16. class FolderIO(AbstractFolderIO):
  17. def get_base_name(self):
  18. return os.path.basename(self.path)
  19. def list(self):
  20. return os.listdir(self.path)
  21. def get_file_io(self, name):
  22. return FileIO(os.path.join(self.path, name))
  23. def get_parent_folder(self):
  24. return FolderIO(os.path.dirname(self.path))
  25. def walk(self):
  26. for root, dirs, files in os.walk(self.path):
  27. root_folder_io = FolderIO(root)
  28. original_folder_ios = [FolderIO(os.path.join(root, d)) for d in dirs]
  29. modified_folder_ios = list(original_folder_ios)
  30. yield (
  31. root_folder_io,
  32. modified_folder_ios,
  33. [FileIO(os.path.join(root, f)) for f in files],
  34. )
  35. modified_iterator = iter(reversed(modified_folder_ios))
  36. current = next(modified_iterator, None)
  37. i = len(original_folder_ios)
  38. for folder_io in reversed(original_folder_ios):
  39. i -= 1 # Basically enumerate but reversed
  40. if current is folder_io:
  41. current = next(modified_iterator, None)
  42. else:
  43. del dirs[i]
  44. class FileIOFolderMixin:
  45. def get_parent_folder(self):
  46. return FolderIO(os.path.dirname(self.path))
  47. class ZipFileIO(file_io.KnownContentFileIO, FileIOFolderMixin):
  48. """For .zip and .egg archives"""
  49. def __init__(self, path, code, zip_path):
  50. super().__init__(path, code)
  51. self._zip_path = zip_path
  52. def get_last_modified(self):
  53. try:
  54. return os.path.getmtime(self._zip_path)
  55. except (FileNotFoundError, PermissionError, NotADirectoryError):
  56. return None
  57. class FileIO(file_io.FileIO, FileIOFolderMixin):
  58. pass
  59. class KnownContentFileIO(file_io.KnownContentFileIO, FileIOFolderMixin):
  60. pass