Browse Source

Docs improvements, small cleanings and thread store.

Rafał Pitoń 11 years ago
parent
commit
9b46e3be1e

+ 1 - 1
docs/cache_buster.rst

@@ -2,4 +2,4 @@
 Cache Buster
 Cache Buster
 ============
 ============
 
 
-Cache buster is small feature that allows certain cache-intensive systems learn when data they were dependant on has been invalidated and must be replaced by new one.
+Cache buster is small feature that allows certain cache-based systems find out when data they were dependant on has been invalidated and must be replaced by new one.

+ 1 - 0
docs/index.rst

@@ -69,3 +69,4 @@ Following references cover everything you want to know about writing your own ap
    shortcuts
    shortcuts
    views_errors
    views_errors
    cache_buster
    cache_buster
+   thread_store

+ 44 - 0
docs/thread_store.rst

@@ -0,0 +1,44 @@
+===================
+Misago Thread Store
+===================
+
+Thread store is simple memory-based cache some Misago features use to maintain state for request duration.
+
+.. warning::
+   :py:mod:`misago.core.threadstore` is considered part of internals and generally should be avoided unless
+
+It offers subset of standard cache API:
+
+
+get
+---
+
+.. function:: get(key[, default=None])
+
+Get value for key from thread store or default value if key is undefined.
+
+    >>> from misago.core import threadstore
+	>>> get('peach')
+	None
+
+	>>> get('peach', 'no peach!')
+	'no peach!'
+
+
+get() never raises an exception for non-existant value which is why you should avoid storing "None" values and use custom default values to spot non-existant keys.
+
+
+set
+---
+
+.. function:: set(key, value)
+
+Set value for a key on thread store. This value will then be stored until you overwrite it with new value, thread is killed, :py:mod:`misago.core.middleware.ThreadStoreMiddleware` process_response method is called, or you explictly call clear() funciton, clearing thread store.
+
+
+clear
+-----
+
+.. function:: clear()
+
+Delete all values from thread store. This function is automatically called by ThreadStoreMiddleware to make sure contents of thread store won't have effect on next request.

+ 2 - 1
misago/conf/defaults.py

@@ -51,7 +51,8 @@ MIDDLEWARE_CLASSES = (
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
-    'misago.views.middleware.MisagoExceptionHandlerMiddleware',
+    'misago.core.middleware.ThreadStoreMiddleware',
+    'misago.views.middleware.ExceptionHandlerMiddleware',
 )
 )
 
 
 # Register Misago directories
 # Register Misago directories

+ 6 - 0
misago/core/middleware.py

@@ -0,0 +1,6 @@
+from misago.core import threadstore
+
+
+class ThreadStoreMiddleware(object):
+    def process_response(self, request, response):
+        threadstore.clear()

+ 16 - 0
misago/core/threadstore.py

@@ -0,0 +1,16 @@
+from threading import local
+
+
+_thread_local = local()
+
+
+def get(key, default=None):
+    return _thread_local.__dict__.get(key, default)
+
+
+def set(key, value):
+    return _thread_local.__dict__[key] = value
+
+
+def clear():
+    _thread_local.__dict__ = {}

+ 1 - 1
misago/views/middleware.py

@@ -2,7 +2,7 @@ from misago.views import exceptionhandler
 from misago.views.utils import is_request_to_misago
 from misago.views.utils import is_request_to_misago
 
 
 
 
-class MisagoExceptionHandlerMiddleware(object):
+class ExceptionHandlerMiddleware(object):
     def process_exception(self, request, exception):
     def process_exception(self, request, exception):
         request_is_to_misago = is_request_to_misago(request)
         request_is_to_misago = is_request_to_misago(request)
         misago_can_handle_exception = exceptionhandler.is_misago_exception(
         misago_can_handle_exception = exceptionhandler.is_misago_exception(

+ 4 - 4
misago/views/tests/test_middleware.py

@@ -2,23 +2,23 @@ from django.core.urlresolvers import reverse
 from django.http import Http404
 from django.http import Http404
 from django.test import TestCase
 from django.test import TestCase
 from django.test.client import RequestFactory
 from django.test.client import RequestFactory
-from misago.views.middleware import MisagoExceptionHandlerMiddleware
+from misago.views.middleware import ExceptionHandlerMiddleware
 
 
 
 
-class MisagoExceptionHandlerMiddlewareTests(TestCase):
+class ExceptionHandlerMiddlewareTests(TestCase):
     def setUp(self):
     def setUp(self):
         self.request = RequestFactory().get(reverse('forum_index'))
         self.request = RequestFactory().get(reverse('forum_index'))
 
 
     def test_middleware_returns_response_for_supported_exception(self):
     def test_middleware_returns_response_for_supported_exception(self):
         "Middleware returns HttpResponse for supported exception"
         "Middleware returns HttpResponse for supported exception"
         exception = Http404()
         exception = Http404()
-        middleware = MisagoExceptionHandlerMiddleware()
+        middleware = ExceptionHandlerMiddleware()
 
 
         self.assertTrue(middleware.process_exception(self.request, exception))
         self.assertTrue(middleware.process_exception(self.request, exception))
 
 
     def test_middleware_returns_none_for_non_supported_exception(self):
     def test_middleware_returns_none_for_non_supported_exception(self):
         """Middleware returns None for non-supported exception"""
         """Middleware returns None for non-supported exception"""
         exception = TypeError()
         exception = TypeError()
-        middleware = MisagoExceptionHandlerMiddleware()
+        middleware = ExceptionHandlerMiddleware()
 
 
         self.assertFalse(middleware.process_exception(self.request, exception))
         self.assertFalse(middleware.process_exception(self.request, exception))