storage.storage_system_from_paste_config() utility, w/ tests

This commit is contained in:
Christopher Allan Webber 2011-04-17 10:24:36 -05:00
parent cb8ea0fe3f
commit ffa2293549
2 changed files with 83 additions and 0 deletions

View File

@ -15,11 +15,14 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
import re
import urlparse
import uuid
from werkzeug.utils import secure_filename
from mediagoblin import util
class Error(Exception): pass
class InvalidFilepath(Error): pass
@ -193,3 +196,49 @@ class BasicFileStorage(StorageInterface):
return urlparse.urljoin(
self.base_url,
'/'.join(clean_listy_filepath(filepath)))
def storage_system_from_paste_config(paste_config, storage_prefix):
"""
Utility for setting up a storage system from the paste app config.
Note that a special argument may be passed in to the paste_config
which is "${storage_prefix}_storage_class" which will provide an
import path to a storage system. This defaults to
"mediagoblin.storage:BasicFileStorage" if otherwise undefined.
Arguments:
- paste_config: dictionary of config parameters
- storage_prefix: the storage system we're setting up / will be
getting keys/arguments from. For example 'publicstore' will
grab all arguments that are like 'publicstore_FOO'.
Returns:
An instantiated storage system.
Example:
storage_system_from_paste_config(
{'publicstore_base_url': '/media/',
'publicstore_base_dir': '/var/whatever/media/'},
'publicstore')
Will return:
BasicFileStorage(
base_url='/media/',
base_dir='/var/whatever/media')
"""
prefix_re = re.compile('^%s_(.+)$' % re.escape(storage_prefix))
config_params = dict(
[(prefix_re.match(key).groups()[0], value)
for key, value in paste_config.iteritems()
if prefix_re.match(key)])
if config_params.has_key('storage_class'):
storage_class = config_params['storage_class']
config_params.pop('storage_class')
else:
storage_class = "mediagoblin.storage:BasicFileStorage"
storage_class = util.import_component(storage_class)
return storage_class(**config_params)

View File

@ -24,6 +24,10 @@ from werkzeug.utils import secure_filename
from mediagoblin import storage
################
# Test utilities
################
def test_clean_listy_filepath():
expected = [u'dir1', u'dir2', u'linooks.jpg']
assert storage.clean_listy_filepath(
@ -43,6 +47,36 @@ def test_clean_listy_filepath():
['../../', 'linooks.jpg'])
class FakeStorageSystem():
def __init__(self, foobie, blech, **kwargs):
self.foobie = foobie
self.blech = blech
def test_storage_system_from_paste_config():
this_storage = storage.storage_system_from_paste_config(
{'somestorage_base_url': 'http://example.org/moodia/',
'somestorage_base_dir': '/tmp/',
'somestorage_garbage_arg': 'garbage_arg',
'garbage_arg': 'trash'},
'somestorage')
assert this_storage.base_url == 'http://example.org/moodia/'
assert this_storage.base_dir == '/tmp/'
assert this_storage.__class__ is storage.BasicFileStorage
this_storage = storage.storage_system_from_paste_config(
{'somestorage_foobie': 'eiboof',
'somestorage_blech': 'hcelb',
'somestorage_garbage_arg': 'garbage_arg',
'garbage_arg': 'trash',
'somestorage_storage_class':
'mediagoblin.tests.test_storage:FakeStorageSystem'},
'somestorage')
assert this_storage.foobie == 'eiboof'
assert this_storage.blech == 'hcelb'
assert this_storage.__class__ is FakeStorageSystem
##########################
# Basic file storage tests
##########################