import os import logging from config_app.config_util.config.baseprovider import export_yaml, CannotWriteConfigException from config_app.config_util.config.basefileprovider import BaseFileProvider logger = logging.getLogger(__name__) def _ensure_parent_dir(filepath): """ Ensures that the parent directory of the given file path exists. """ try: parentpath = os.path.abspath(os.path.join(filepath, os.pardir)) if not os.path.isdir(parentpath): os.makedirs(parentpath) except IOError as ioe: raise CannotWriteConfigException(str(ioe)) class FileConfigProvider(BaseFileProvider): """ Implementation of the config provider that reads and writes the data from/to the file system. """ def __init__(self, config_volume, yaml_filename, py_filename): super(FileConfigProvider, self).__init__(config_volume, yaml_filename, py_filename) @property def provider_id(self): return 'file' def save_config(self, config_obj): export_yaml(config_obj, self.yaml_path) def write_volume_file(self, filename, contents): filepath = os.path.join(self.config_volume, filename) _ensure_parent_dir(filepath) try: with open(filepath, mode='w') as f: f.write(contents) except IOError as ioe: raise CannotWriteConfigException(str(ioe)) return filepath def remove_volume_file(self, filename): filepath = os.path.join(self.config_volume, filename) os.remove(filepath) def save_volume_file(self, filename, flask_file): filepath = os.path.join(self.config_volume, filename) _ensure_parent_dir(filepath) # Write the file. try: flask_file.save(filepath) except IOError as ioe: raise CannotWriteConfigException(str(ioe)) return filepath