Merge branch 'i507_beaker_cache'
authorChristopher Allan Webber <cwebber@dustycloud.org>
Tue, 6 Sep 2011 04:28:41 +0000 (23:28 -0500)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Tue, 6 Sep 2011 04:28:41 +0000 (23:28 -0500)
mediagoblin/app.py
mediagoblin/config_spec.ini
mediagoblin/init/__init__.py
mediagoblin/mg_globals.py
mediagoblin/tests/test_cache.py [new file with mode: 0644]
mediagoblin/tests/test_mgoblin_app.ini

index 45b5e3ce9bbc4cff3089657b3446d90b26fbe358..dd5f0b892c7423b92958e10e50f79d126fdac16e 100644 (file)
@@ -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'):
index a0fbde099e7137f350d56298ba9708e748f3995c..6fefb581f7f89951c506aabb82fd7fe5def9dccc 100644 (file)
@@ -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()
index 81d3a4301011e5ae4f0e8ff289a716fc8c872787..b7f52595d515e89870cf3dcf228309c359b10e69 100644 (file)
 # 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
index 4aeefc3239ef7e8eb165c1264066102dd7d20ffa..2d304111c359ad83f20f3b49fc9c3340c5d0c113 100644 (file)
@@ -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 (file)
index 0000000..cbffeb8
--- /dev/null
@@ -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'
index 9d938b4f41d777dc9d452400fbab174452f66570..ab32cccc84f99b7710c87c10f783affe038cfbe8 100644 (file)
@@ -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