diff options
| author | Chris McDonough <chrism@plope.com> | 2013-08-17 12:53:10 +0200 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2013-08-17 12:53:10 +0200 |
| commit | e5c4da2f5e7e05614bd111bf4c272d7924d9f7eb (patch) | |
| tree | 5448e65142e6cef4648f21a8ea17def84d317560 | |
| parent | 45d8ef43ec723cacf79c1d6232e652ccee4d2dc9 (diff) | |
| parent | c70dcb392b07859c7c75ce20ddedc16b961692ea (diff) | |
| download | pyramid-e5c4da2f5e7e05614bd111bf4c272d7924d9f7eb.tar.gz pyramid-e5c4da2f5e7e05614bd111bf4c272d7924d9f7eb.tar.bz2 pyramid-e5c4da2f5e7e05614bd111bf4c272d7924d9f7eb.zip | |
Merge branch '508-localizer-on-request' of github.com:witsch/pyramid into witsch-508-localizer-on-request
| -rw-r--r-- | CHANGES.txt | 3 | ||||
| -rw-r--r-- | TODO.txt | 3 | ||||
| -rw-r--r-- | pyramid/i18n.py | 17 | ||||
| -rw-r--r-- | pyramid/request.py | 8 | ||||
| -rw-r--r-- | pyramid/tests/test_i18n.py | 54 |
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. @@ -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() |
