# Copyright (C) 2018 Lars Wirzenius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import os import yaml class FileStore: def __init__(self, dirname): self._dirname = dirname def _typedir(self, resource_type): return os.path.join(self._dirname, resource_type) def _filename(self, resource_type, resource_id): dirname = self._typedir(resource_type) return os.path.join(dirname, resource_id) def list(self, resource_type): dirname = self._typedir(resource_type) if not os.path.isdir(dirname): return [] return [ x for x in sorted(os.listdir(self._typedir(resource_type))) ] def get(self, resource_type, resource_id): filename = self._filename(resource_type, resource_id) if os.path.exists(filename): with open(filename) as f: return yaml.safe_load(f) raise ResourceDoesNotExist(resource_type, resource_id) def create(self, resource_type, resource_id, resource): dirname = self._typedir(resource_type) if not os.path.exists(dirname): os.mkdir(dirname) filename = self._filename(resource_type, resource_id) with open(filename, 'w') as f: yaml.safe_dump(resource, stream=f) def delete(self, resource_type, resource_id): filename = self._filename(resource_type, resource_id) if os.path.exists(filename): os.remove(filename) class ResourceStoreError(Exception): pass class ResourceDoesNotExist(ResourceStoreError): def __init__(self, resource_type, resource_id): super().__init__( 'Resource does not exist: {}:{}'.format( resource_type, resource_id))