summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2013-08-17 13:06:34 +0200
committerChris McDonough <chrism@plope.com>2013-08-17 13:06:34 +0200
commite5bf80f65c1ad3c634ee1fa29735842ec0916afc (patch)
tree5448e65142e6cef4648f21a8ea17def84d317560
parent45d8ef43ec723cacf79c1d6232e652ccee4d2dc9 (diff)
parente5c4da2f5e7e05614bd111bf4c272d7924d9f7eb (diff)
downloadpyramid-e5bf80f65c1ad3c634ee1fa29735842ec0916afc.tar.gz
pyramid-e5bf80f65c1ad3c634ee1fa29735842ec0916afc.tar.bz2
pyramid-e5bf80f65c1ad3c634ee1fa29735842ec0916afc.zip
Merge branch 'witsch-508-localizer-on-request'
-rw-r--r--CHANGES.txt3
-rw-r--r--TODO.txt3
-rw-r--r--pyramid/i18n.py17
-rw-r--r--pyramid/request.py8
-rw-r--r--pyramid/tests/test_i18n.py54
5 files changed, 52 insertions, 33 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 48efad6d4..b805a12a0 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -4,6 +4,9 @@ Next Release
Features
--------
+- Add ``localizer`` property (reified) to the request.
+ See https://github.com/Pylons/pyramid/issues/508.
+
- Add ``pdistreport`` script, which prints the Python version in use, the
Pyramid version in use, and the version number and location of all Python
distributions currently installed.
diff --git a/TODO.txt b/TODO.txt
index 7a3561494..46eb33b82 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -56,9 +56,6 @@ Nice-to-Have
app1" and "domain app1.localhost = app1"), ProxyPreserveHost and the nginx
equivalent, preserving HTTPS URLs.
-- Make "localizer" a property of request (instead of requiring
- "get_localizer(request)"?
-
- Alias the stupid long default session factory name.
- Debug option to print view matching decision (e.g. debug_viewlookup or so).
diff --git a/pyramid/i18n.py b/pyramid/i18n.py
index b4bc0eaa7..dc2c25f18 100644
--- a/pyramid/i18n.py
+++ b/pyramid/i18n.py
@@ -197,17 +197,15 @@ def make_localizer(current_locale_name, translation_directories):
def get_localizer(request):
""" Retrieve a :class:`pyramid.i18n.Localizer` object
corresponding to the current request's locale name. """
- localizer = getattr(request, 'localizer', None)
- if localizer is None:
- # no locale object cached on request
- try:
- registry = request.registry
- except AttributeError:
- registry = get_current_registry()
+ # no locale object cached on request
+ try:
+ registry = request.registry
+ except AttributeError:
+ registry = get_current_registry()
- current_locale_name = get_locale_name(request)
- localizer = registry.queryUtility(ILocalizer, name=current_locale_name)
+ current_locale_name = get_locale_name(request)
+ localizer = registry.queryUtility(ILocalizer, name=current_locale_name)
if localizer is None:
# no localizer utility registered yet
@@ -216,7 +214,6 @@ def get_localizer(request):
registry.registerUtility(localizer, ILocalizer,
name=current_locale_name)
- request.localizer = localizer
return localizer
diff --git a/pyramid/request.py b/pyramid/request.py
index 5bca5b1f0..5dedee4f1 100644
--- a/pyramid/request.py
+++ b/pyramid/request.py
@@ -24,6 +24,7 @@ from pyramid.compat import (
)
from pyramid.decorator import reify
+from pyramid.i18n import get_localizer
from pyramid.response import Response
from pyramid.url import URLMethodsMixin
from pyramid.util import InstancePropertyMixin
@@ -383,6 +384,13 @@ class Request(BaseRequest, DeprecatedRequestMethodsMixin, URLMethodsMixin,
def json_body(self):
return json.loads(text_(self.body, self.charset))
+ @reify
+ def localizer(self):
+ """ Convenience property to return a localizer by calling
+ :func:`pyramid.i18n.get_localizer`. """
+ return get_localizer(self)
+
+
def route_request_iface(name, bases=()):
# zope.interface treats the __name__ as the __doc__ and changes __name__
# to None for interfaces that contain spaces if you do not pass a
diff --git a/pyramid/tests/test_i18n.py b/pyramid/tests/test_i18n.py
index bd4998b10..336e51b6a 100644
--- a/pyramid/tests/test_i18n.py
+++ b/pyramid/tests/test_i18n.py
@@ -230,39 +230,36 @@ class Test_get_localizer(unittest.TestCase):
from pyramid.i18n import get_localizer
return get_localizer(request)
- def test_no_registry_on_request(self):
+ def test_default_localizer(self):
+ # `get_localizer` returns a default localizer for `en`
+ from pyramid.i18n import Localizer
request = DummyRequest()
- request.localizer = '123'
result = self._callFUT(request)
- self.assertEqual(result, '123')
+ self.assertEqual(result.__class__, Localizer)
+ self.assertEqual(result.locale_name, 'en')
- def test_with_registry_on_request(self):
+ def test_custom_localizer_for_default_locale(self):
from pyramid.threadlocal import get_current_registry
+ from pyramid.interfaces import ILocalizer
registry = get_current_registry()
+ dummy = object()
+ registry.registerUtility(dummy, ILocalizer, name='en')
request = DummyRequest()
- request.localizer = '123'
- request.registry = registry
- result = self._callFUT(request)
- self.assertEqual(result, '123')
-
- def test_locale_on_request(self):
- request = DummyRequest()
- request.localizer = 'abc'
result = self._callFUT(request)
- self.assertEqual(result, 'abc')
+ self.assertEqual(result, dummy)
- def test_locale_from_registry(self):
+ def test_custom_localizer_for_custom_locale(self):
from pyramid.threadlocal import get_current_registry
from pyramid.interfaces import ILocalizer
registry = get_current_registry()
- locale = 'abc'
- registry.registerUtility(locale, ILocalizer, name='en')
+ dummy = object()
+ registry.registerUtility(dummy, ILocalizer, name='ie')
request = DummyRequest()
- request.locale_name = 'en'
+ request.locale_name = 'ie'
result = self._callFUT(request)
- self.assertEqual(result, 'abc')
+ self.assertEqual(result, dummy)
- def test_locale_from_mo(self):
+ def test_localizer_from_mo(self):
from pyramid.threadlocal import get_current_registry
from pyramid.interfaces import ITranslationDirectories
from pyramid.i18n import Localizer
@@ -278,7 +275,7 @@ class Test_get_localizer(unittest.TestCase):
self.assertEqual(result.translate('Approve'), 'Approve')
self.assertTrue(hasattr(result, 'pluralize'))
- def test_locale_from_mo_bad_mo(self):
+ def test_localizer_from_mo_bad_mo(self):
from pyramid.threadlocal import get_current_registry
from pyramid.interfaces import ITranslationDirectories
from pyramid.i18n import Localizer
@@ -292,6 +289,23 @@ class Test_get_localizer(unittest.TestCase):
self.assertEqual(result.translate('Approve', 'deformsite'),
'Approve')
+ def test_request_has_localizer(self):
+ from pyramid.threadlocal import get_current_registry
+ from pyramid.interfaces import ILocalizer
+ from pyramid.request import Request
+ # register mock localizer
+ dummy = object()
+ registry = get_current_registry()
+ registry.registerUtility(dummy, ILocalizer, name='en')
+ request = Request(environ={})
+ self.assertEqual(request.localizer, dummy)
+ # `get_localizer` is only called once...
+ other = object()
+ registry.registerUtility(other, ILocalizer, name='en')
+ self.assertNotEqual(request.localizer, other)
+ self.assertEqual(request.localizer, dummy)
+
+
class Test_default_locale_negotiator(unittest.TestCase):
def setUp(self):
cleanUp()