Breaking stuff by introducting decorator & abstract base class stuff.

This commit is contained in:
Sybren A. Stüvel 2016-11-08 18:35:08 +01:00 committed by Francesco Siddi
parent b3b9c68486
commit c06533db5b

View File

@ -1,5 +1,6 @@
"""Utility for managing storage backends and files.""" """Utility for managing storage backends and files."""
import abc
import logging import logging
import os import os
import shutil import shutil
@ -8,6 +9,18 @@ from flask import current_app
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
# Mapping from backend name to backend class
backends = {}
def register_backend(backend_name):
def wrapper(cls):
assert backend_name not in backends
backends[backend_name] = cls
return cls
return wrapper
class StorageBackend(object): class StorageBackend(object):
"""Can be a GCS bucket or simply a project folder in Pillar """Can be a GCS bucket or simply a project folder in Pillar
@ -17,9 +30,16 @@ class StorageBackend(object):
""" """
__metaclass__ = abc.ABCMeta
def __init__(self, backend): def __init__(self, backend):
self.backend = backend self.backend = backend
@abc.abstractmethod
def upload_file(self, param1, param2, param3):
"""docstuff"""
pass
class FileInStorage(object): class FileInStorage(object):
"""A wrapper for file or blob objects. """A wrapper for file or blob objects.
@ -35,6 +55,7 @@ class FileInStorage(object):
self.size = None self.size = None
@register_backend('local')
class PillarStorage(StorageBackend): class PillarStorage(StorageBackend):
def __init__(self, project_id): def __init__(self, project_id):
super(PillarStorage, self).__init__(backend='local') super(PillarStorage, self).__init__(backend='local')
@ -58,3 +79,10 @@ class PillarStorageFile(FileInStorage):
shutil.copyfileobj(uploaded_file, outfile) shutil.copyfileobj(uploaded_file, outfile)
self.size = file_size self.size = file_size
def default_storage_backend():
from flask import current_app
backend_cls = backends[current_app.config['STORAGE_BACKEND']]
return backend_cls()