diff options
-rw-r--r-- | mediagoblin/app.py | 5 | ||||
-rw-r--r-- | mediagoblin/config_spec.ini | 6 | ||||
-rw-r--r-- | mediagoblin/init/__init__.py | 16 | ||||
-rw-r--r-- | mediagoblin/mg_globals.py | 3 | ||||
-rw-r--r-- | mediagoblin/tests/test_cache.py | 52 | ||||
-rw-r--r-- | mediagoblin/tests/test_mgoblin_app.ini | 4 |
6 files changed, 85 insertions, 1 deletions
diff --git a/mediagoblin/app.py b/mediagoblin/app.py index 45b5e3ce..dd5f0b89 100644 --- a/mediagoblin/app.py +++ b/mediagoblin/app.py @@ -25,7 +25,7 @@ from mediagoblin.mg_globals import setup_globals from mediagoblin.init.celery import setup_celery_from_config from mediagoblin.init import (get_jinja_loader, get_staticdirector, setup_global_and_app_config, setup_workbench, setup_database, - setup_storage) + setup_storage, setup_beaker_cache) class MediaGoblinApp(object): @@ -71,6 +71,9 @@ class MediaGoblinApp(object): # set up staticdirector tool self.staticdirector = get_staticdirector(app_config) + # set up caching + self.cache = setup_beaker_cache() + # Setup celery, if appropriate if setup_celery and not app_config.get('celery_setup_elsewhere'): if os.environ.get('CELERY_ALWAYS_EAGER'): diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini index a0fbde09..6fefb581 100644 --- a/mediagoblin/config_spec.ini +++ b/mediagoblin/config_spec.ini @@ -50,6 +50,12 @@ base_url = string(default="/mgoblin_media/") base_dir = string(default="%(here)s/user_dev/media/queue") +[beaker.cache] +type = string(default="file") +data_dir = string(default="%(here)s/user_dev/beaker/cache/data") +lock_dir = string(default="%(here)s/user_dev/beaker/cache/lock") + + [celery] # known booleans celery_result_persistent = boolean() diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py index 81d3a430..b7f52595 100644 --- a/mediagoblin/init/__init__.py +++ b/mediagoblin/init/__init__.py @@ -14,7 +14,10 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. +from beaker.cache import CacheManager +from beaker.util import parse_cache_config_options import jinja2 + from mediagoblin import staticdirect from mediagoblin.init.config import ( read_mediagoblin_config, generate_validation_report) @@ -135,3 +138,16 @@ def setup_workbench(): workbench_manager = WorkbenchManager(app_config['workbench_path']) setup_globals(workbench_manager = workbench_manager) + + +def setup_beaker_cache(): + """ + Setup the Beaker Cache manager. + """ + cache_config = mg_globals.global_config['beaker.cache'] + cache_config = dict( + [(u'cache.%s' % key, value) + for key, value in cache_config.iteritems()]) + cache = CacheManager(**parse_cache_config_options(cache_config)) + setup_globals(cache=cache) + return cache diff --git a/mediagoblin/mg_globals.py b/mediagoblin/mg_globals.py index 4aeefc32..2d304111 100644 --- a/mediagoblin/mg_globals.py +++ b/mediagoblin/mg_globals.py @@ -31,6 +31,9 @@ db_connection = None # mongokit.Connection database = None +# beaker's cache manager +cache = None + # should be the same as the public_store = None queue_store = None diff --git a/mediagoblin/tests/test_cache.py b/mediagoblin/tests/test_cache.py new file mode 100644 index 00000000..cbffeb84 --- /dev/null +++ b/mediagoblin/tests/test_cache.py @@ -0,0 +1,52 @@ +# GNU MediaGoblin -- federated, autonomous media hosting +# Copyright (C) 2011 Free Software Foundation, Inc +# +# 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 <http://www.gnu.org/licenses/>. + + +from mediagoblin.tests.tools import setup_fresh_app +from mediagoblin import mg_globals + + +DATA_TO_CACHE = { + 'herp': 'derp', + 'lol': 'cats'} + + +def _get_some_data(key): + """ + Stuid function that makes use of some caching. + """ + some_data_cache = mg_globals.cache.get_cache('sum_data') + if some_data_cache.has_key(key): + return some_data_cache.get(key) + + value = DATA_TO_CACHE.get(key) + some_data_cache.put(key, value) + return value + + +@setup_fresh_app +def test_cache_working(test_app): + some_data_cache = mg_globals.cache.get_cache('sum_data') + assert not some_data_cache.has_key('herp') + assert _get_some_data('herp') == 'derp' + assert some_data_cache.get('herp') == 'derp' + # should get the same value again + assert _get_some_data('herp') == 'derp' + + # now we force-change it, but the function should use the cached + # version + some_data_cache.put('herp', 'pred') + assert _get_some_data('herp') == 'pred' diff --git a/mediagoblin/tests/test_mgoblin_app.ini b/mediagoblin/tests/test_mgoblin_app.ini index 9d938b4f..ab32cccc 100644 --- a/mediagoblin/tests/test_mgoblin_app.ini +++ b/mediagoblin/tests/test_mgoblin_app.ini @@ -19,5 +19,9 @@ base_url = /mgoblin_media/ [storage:queuestore] base_dir = %(here)s/test_user_dev/media/queue +[beaker.cache] +data_dir = %(here)s/test_user_dev/beaker/cache/data +lock_dir = %(here)s/test_user_dev/beaker/cache/lock + [celery] celery_always_eager = true |