storage.storage_system_from_paste_config() utility, w/ tests
This commit is contained in:
parent
cb8ea0fe3f
commit
ffa2293549
@ -15,11 +15,14 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import urlparse
|
import urlparse
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from werkzeug.utils import secure_filename
|
from werkzeug.utils import secure_filename
|
||||||
|
|
||||||
|
from mediagoblin import util
|
||||||
|
|
||||||
|
|
||||||
class Error(Exception): pass
|
class Error(Exception): pass
|
||||||
class InvalidFilepath(Error): pass
|
class InvalidFilepath(Error): pass
|
||||||
@ -193,3 +196,49 @@ class BasicFileStorage(StorageInterface):
|
|||||||
return urlparse.urljoin(
|
return urlparse.urljoin(
|
||||||
self.base_url,
|
self.base_url,
|
||||||
'/'.join(clean_listy_filepath(filepath)))
|
'/'.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)
|
||||||
|
@ -24,6 +24,10 @@ from werkzeug.utils import secure_filename
|
|||||||
from mediagoblin import storage
|
from mediagoblin import storage
|
||||||
|
|
||||||
|
|
||||||
|
################
|
||||||
|
# Test utilities
|
||||||
|
################
|
||||||
|
|
||||||
def test_clean_listy_filepath():
|
def test_clean_listy_filepath():
|
||||||
expected = [u'dir1', u'dir2', u'linooks.jpg']
|
expected = [u'dir1', u'dir2', u'linooks.jpg']
|
||||||
assert storage.clean_listy_filepath(
|
assert storage.clean_listy_filepath(
|
||||||
@ -43,6 +47,36 @@ def test_clean_listy_filepath():
|
|||||||
['../../', 'linooks.jpg'])
|
['../../', '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
|
# Basic file storage tests
|
||||||
##########################
|
##########################
|
||||||
|
Loading…
x
Reference in New Issue
Block a user