import logging import yaml import io from config_app.config_util.config.baseprovider import BaseProvider logger = logging.getLogger(__name__) CONFIG_FILENAME = 'config.yaml' class InMemoryProvider(BaseProvider): def __init__(self): self.files = {} self.config = {} self.was_loaded = False @property def provider_id(self): return 'memory' def update_app_config(self, app_config): self.config = app_config def get_config(self): return self.config def save_config(self, config_object): self.config = config_object self.was_loaded = True def config_exists(self): return self.was_loaded def volume_exists(self): return True def volume_file_exists(self, filename): return any([ name.startswith(filename) for name in self.files ]) def get_volume_file(self, filename, mode='r'): return self.files[filename] def write_volume_file(self, filename, contents): raise Exception('Not implemented yet') def remove_volume_file(self, filename): raise Exception('Not implemented yet') def list_volume_directory(self, path): return [ name for name in self.files if name.startswith(path) ] def save_volume_file(self, filename, flask_file): self.files[filename] = flask_file.read() def requires_restart(self, app_config): raise Exception('Not implemented yet') def get_volume_path(self, directory, filename): # Here we can just access the filename since we're storing the tarball files with their full path if directory.endswith('/'): return directory + filename else: return directory + '/' + filename def load_from_tarball(self, tarfile): for tarinfo in tarfile.getmembers(): if tarinfo.isfile(): if tarinfo.name == CONFIG_FILENAME: self.config = yaml.load(tarfile.extractfile(tarinfo.name).read()) else: self.files[tarinfo.name] = tarfile.extractfile(tarinfo.name).read() self.was_loaded = True