|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import os |
|
|
import os.path as osp |
|
|
from abc import ABCMeta, abstractmethod |
|
|
|
|
|
|
|
|
def mkdir_or_exist(dir_name, mode=0o777): |
|
|
if dir_name == "": |
|
|
return |
|
|
dir_name = osp.expanduser(dir_name) |
|
|
os.makedirs(dir_name, mode=mode, exist_ok=True) |
|
|
|
|
|
|
|
|
def has_method(obj, method): |
|
|
return hasattr(obj, method) and callable(getattr(obj, method)) |
|
|
|
|
|
|
|
|
class BaseStorageBackend(metaclass=ABCMeta): |
|
|
"""Abstract class of storage backends. |
|
|
|
|
|
All backends need to implement two apis: :meth:`get()` and |
|
|
:meth:`get_text()`. |
|
|
|
|
|
- :meth:`get()` reads the file as a byte stream. |
|
|
- :meth:`get_text()` reads the file as texts. |
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
_allow_symlink = False |
|
|
|
|
|
@property |
|
|
def allow_symlink(self): |
|
|
return self._allow_symlink |
|
|
|
|
|
@property |
|
|
def name(self): |
|
|
return self.__class__.__name__ |
|
|
|
|
|
@abstractmethod |
|
|
def get(self, filepath): |
|
|
pass |
|
|
|
|
|
@abstractmethod |
|
|
def get_text(self, filepath): |
|
|
pass |
|
|
|