import os import re from tools import const from tools.protocols.masterProtocol import MasterProtocol class LOCAL(MasterProtocol): NoDirectoryOrFile = type('NoDirectoryOrFile', (Exception,), {}) DirectoryOrFileExists = type('DirectoryOrFileExists', (Exception, ), {}) NotPermissions = type('NotPermissions', (Exception, ), {}) CONNECTION_REQUIRED = {'fileType': 'driver_type', 'source': 'source', 'subtype': 'type'} NAME = const.LOCAL_KEY def __init__(self, *args, **kwargs): pass @staticmethod def exists(layer): return os.path.exists(layer.get_source()) @staticmethod def list_files(directory, suffix=None): list_files = [] walk_gen = os.walk(directory) dir_path, _, filenames = walk_gen.__next__() if suffix: for file in filenames: if re.search('{}(f?)'.format(suffix), file): list_files.append(os.path.join(dir_path, file)) else: list_files = [os.path.join(dir_path, file) for file in filenames] return list_files def is_file(self, path): return not self.is_directory(path) @staticmethod def is_directory(path): return os.path.isdir(path) @staticmethod def gdal_layer(layer, _): # Local driver, does not need vsi never with_vsi = False driver_prefix = layer.driver.gdal_prefix source = layer['source'] vsi_string = "" if with_vsi: vsi_string = '{}/'.format(driver_prefix) return "{}{}".format(vsi_string, source) @staticmethod def gdal_url(source, *_, **__): return source @staticmethod def join(_, *args): return os.path.join(*args) def mkdir(self, directory, p=False): try: if not p: os.mkdir(directory) else: directories = directory.split('/')[1:] relative_path = '' for directory in directories: relative_path = os.path.join(relative_path, directory) if not self.exists(relative_path): os.mkdir(relative_path) except PermissionError: raise self.NotPermissions('Not permission for this action') except FileNotFoundError: raise self.NoDirectoryOrFile('{} not found'.format(directory)) def upload(self, *_): return None def upload_dir(self, *_): return None def download(self, *_): return None def format_parameters(self, _, parameters): # Format source parameters.update({'source': re.sub(' +', '_', parameters['source'])}) return parameters