[Checkins] SVN: z3c.language.negotiator/trunk/ - added language choice caching, is by default turned off
Adam Groszer
agroszer at gmail.com
Wed Jul 21 08:06:15 EDT 2010
Log message for revision 114887:
- added language choice caching, is by default turned off
- test coverage is now 100%
Changed:
_U z3c.language.negotiator/trunk/
U z3c.language.negotiator/trunk/CHANGES.txt
U z3c.language.negotiator/trunk/buildout.cfg
U z3c.language.negotiator/trunk/src/z3c/language/negotiator/app.py
U z3c.language.negotiator/trunk/src/z3c/language/negotiator/interfaces.py
U z3c.language.negotiator/trunk/src/z3c/language/negotiator/testing.py
U z3c.language.negotiator/trunk/src/z3c/language/negotiator/tests.py
-=-
Property changes on: z3c.language.negotiator/trunk
___________________________________________________________________
Modified: svn:ignore
- bin
.installed.cfg
develop-eggs
parts
+ bin
.installed.cfg
develop-eggs
parts
coverage
Modified: z3c.language.negotiator/trunk/CHANGES.txt
===================================================================
--- z3c.language.negotiator/trunk/CHANGES.txt 2010-07-21 10:29:22 UTC (rev 114886)
+++ z3c.language.negotiator/trunk/CHANGES.txt 2010-07-21 12:06:15 UTC (rev 114887)
@@ -5,9 +5,11 @@
1.1.1 (unreleased)
------------------
-- ...
+- added language choice caching, is by default turned off
+- test coverage is now 100%
+
1.1.0 (2009-11-29)
------------------
Modified: z3c.language.negotiator/trunk/buildout.cfg
===================================================================
--- z3c.language.negotiator/trunk/buildout.cfg 2010-07-21 10:29:22 UTC (rev 114886)
+++ z3c.language.negotiator/trunk/buildout.cfg 2010-07-21 12:06:15 UTC (rev 114887)
@@ -1,16 +1,21 @@
[buildout]
develop = .
-parts = test checker coverage
+parts = test coverage-test checker coverage
find-links = http://pypi.python.org/simple/z3c.language.session
[test]
recipe = zc.recipe.testrunner
eggs = z3c.language.negotiator [test]
+[coverage-test]
+recipe = zc.recipe.testrunner
+eggs = ${test:eggs}
+defaults = ['--coverage', '../../coverage']
+
[checker]
recipe = lovely.recipe:importchecker
path = src/z3c/language/negotiator
[coverage]
recipe = zc.recipe.egg
-eggs = z3c.coverage
+eggs = z3c.coverage
\ No newline at end of file
Modified: z3c.language.negotiator/trunk/src/z3c/language/negotiator/app.py
===================================================================
--- z3c.language.negotiator/trunk/src/z3c/language/negotiator/app.py 2010-07-21 10:29:22 UTC (rev 114886)
+++ z3c.language.negotiator/trunk/src/z3c/language/negotiator/app.py 2010-07-21 12:06:15 UTC (rev 114887)
@@ -29,6 +29,7 @@
from z3c.language.negotiator.interfaces import INegotiatorManager
from z3c.language.negotiator.interfaces import language_policies
+from z3c.language.negotiator.interfaces import LANGUAGE_CACHE_KEY
@@ -36,7 +37,7 @@
"""Loacal negotiator implementation.
The negotiator let you change the policy, which is a alias
- for the lookup mechanism.
+ for the lookup mechanism.
'server' -- The server defines the language
@@ -60,6 +61,7 @@
serverLanguage = FieldProperty(INegotiatorManager['serverLanguage'])
offeredLanguages = FieldProperty(INegotiatorManager['offeredLanguages'])
+ cacheEnabled = FieldProperty(INegotiatorManager['cacheEnabled'])
def __init__(self):
self._policy = 'session --> browser --> server'
@@ -69,7 +71,7 @@
def get(self):
"""Returns the language policy."""
return self._policy
-
+
def set(self, policy):
"""Set the language policy."""
if policy not in language_policies:
@@ -78,18 +80,18 @@
self._policy = policy
return property(get, set)
- def getLanguage(self, languages, request):
+ def _getLanguage(self, languages, request):
"""Returns the language dependent on the policy."""
policyList = self._policy.split(' --> ')
for policy in policyList:
-
+
# the server is handling the language
if policy == 'server':
if self.serverLanguage:
return self.serverLanguage
- # the language is handled by a session
+ # the language is handled by a session
elif policy == 'session':
session = ILanguageSession(request)
lang = session.getLanguage()
@@ -103,3 +105,20 @@
return lang
return None
+
+ def getLanguage(self, languages, request):
+ if self.cacheEnabled:
+ try:
+ return request.annotations[LANGUAGE_CACHE_KEY]
+ except KeyError:
+ lang = self._getLanguage(languages, request)
+ request.annotations[LANGUAGE_CACHE_KEY] = lang
+ return lang
+ else:
+ return self._getLanguage(languages, request)
+
+ def clearCache(self, request):
+ try:
+ del request.annotations[LANGUAGE_CACHE_KEY]
+ except KeyError:
+ pass
\ No newline at end of file
Modified: z3c.language.negotiator/trunk/src/z3c/language/negotiator/interfaces.py
===================================================================
--- z3c.language.negotiator/trunk/src/z3c/language/negotiator/interfaces.py 2010-07-21 10:29:22 UTC (rev 114886)
+++ z3c.language.negotiator/trunk/src/z3c/language/negotiator/interfaces.py 2010-07-21 12:06:15 UTC (rev 114887)
@@ -25,10 +25,11 @@
_ = zope.i18nmessageid.MessageFactory('z3c')
-language_policies = ['server', 'session', 'browser',
- 'browser --> session --> server', 'browser --> server',
+language_policies = ['server', 'session', 'browser',
+ 'browser --> session --> server', 'browser --> server',
'session --> browser --> server', 'session --> server']
+LANGUAGE_CACHE_KEY = 'z3c.language.negotiator.cache'
class INegotiatorManager(zope.interface.Interface):
"""Local negotiator utility manager interface."""
@@ -58,7 +59,16 @@
required=False,
)
+ cacheEnabled = zope.schema.Bool(
+ title=_(u"Language caching enabled"),
+ description=_(u"Language caching enabled (per request)"),
+ default=False,
+ )
+ def clearCache(request):
+ """Clear the cached language value"""
+
+
class IOfferedLanguages(zope.interface.Interface):
def getOfferedLanguages():
@@ -74,7 +84,7 @@
class IAvailableTranslationDomainLanguagesVocabulary(IVocabularyTokenized):
"""Available translation domain languages.
-
+
If you use this, take care on that you use the right translation domain.
So you probably have to implement your own vocabulary for your ``correct``
translation domain.
Modified: z3c.language.negotiator/trunk/src/z3c/language/negotiator/testing.py
===================================================================
--- z3c.language.negotiator/trunk/src/z3c/language/negotiator/testing.py 2010-07-21 10:29:22 UTC (rev 114886)
+++ z3c.language.negotiator/trunk/src/z3c/language/negotiator/testing.py 2010-07-21 12:06:15 UTC (rev 114887)
@@ -21,6 +21,7 @@
import zope.component
from zope.i18n.interfaces import IUserPreferredLanguages
from zope.i18n.interfaces import INegotiator
+from zope.publisher.base import TestRequest
import z3c.testing
from z3c.language.session.interfaces import ILanguageSession
@@ -33,7 +34,7 @@
###############################################################################
class LanguageSessionStub(object):
-
+
zope.interface.implements(ILanguageSession)
zope.component.adapts(IUserPreferredLanguages)
@@ -44,11 +45,12 @@
return 'fr'
-class EnvStub(object):
+class EnvStub(TestRequest):
zope.interface.implements(IUserPreferredLanguages)
def __init__(self, langs=()):
self.langs = langs
+ TestRequest.__init__(self, '/')
def getPreferredLanguages(self):
return self.langs
Modified: z3c.language.negotiator/trunk/src/z3c/language/negotiator/tests.py
===================================================================
--- z3c.language.negotiator/trunk/src/z3c/language/negotiator/tests.py 2010-07-21 10:29:22 UTC (rev 114886)
+++ z3c.language.negotiator/trunk/src/z3c/language/negotiator/tests.py 2010-07-21 12:06:15 UTC (rev 114887)
@@ -23,7 +23,6 @@
from zope.testing import doctest
from zope.testing.doctestunit import DocFileSuite
-from z3c.language.negotiator import testing
from z3c.language.negotiator import app
from z3c.language.negotiator import testing
@@ -34,7 +33,7 @@
return app.Negotiator
-class NegotiatorTest(zope.component.testing.PlacelessSetup,
+class NegotiatorTest(zope.component.testing.PlacelessSetup,
unittest.TestCase):
def setUp(self):
@@ -58,7 +57,7 @@
self.negotiator.offeredLanguages = [u'de', u'en']
self.assertEqual(self.negotiator.offeredLanguages, [u'de', u'en'])
- def test_getLanguages(self):
+ def test_getLanguagesBrowser(self):
# first set the default policy to 'browser'
self.negotiator.policy = 'browser'
self.assertEqual(self.negotiator.policy, 'browser')
@@ -76,7 +75,74 @@
self.assertEqual(self.negotiator.getLanguage(obj_langs, env),
expected)
+ def test_getLanguagesServer(self):
+ self.negotiator.policy = 'server'
+ self.assertEqual(self.negotiator.policy, 'server')
+ self.negotiator.serverLanguage = u'de'
+ self.assertEqual(self.negotiator.serverLanguage, u'de')
+
+ _cases = (
+ (('en','de'), ('en','de','fr'), 'de'),
+ (('en'), ('it','de','fr'), 'de'),
+ (('pt-br','de'), ('pt_BR','de','fr'), 'de'),
+ (('pt-br','en'), ('pt', 'en', 'fr'), 'de'),
+ (('pt-br','en-us', 'de'), ('de', 'en', 'fr'), 'de'),
+ )
+
+ for user_pref_langs, obj_langs, expected in _cases:
+ env = testing.EnvStub(user_pref_langs)
+ self.assertEqual(self.negotiator.getLanguage(obj_langs, env),
+ expected)
+
+ def test_getLanguagesSession(self):
+ self.negotiator.policy = 'session'
+ self.assertEqual(self.negotiator.policy, 'session')
+
+ _cases = (
+ (('en','de'), ('en','de','fr'), 'fr'),
+ (('en'), ('it','de','fr'), 'fr'),
+ (('pt-br','de'), ('pt_BR','de','fr'), 'fr'),
+ (('pt-br','en'), ('pt', 'en', 'fr'), 'fr'),
+ (('pt-br','en-us', 'de'), ('de', 'en', 'fr'), 'fr'),
+ )
+
+ for user_pref_langs, obj_langs, expected in _cases:
+ env = testing.EnvStub(user_pref_langs)
+ self.assertEqual(self.negotiator.getLanguage(obj_langs, env),
+ expected)
+
+ def test_getLanguagesCached(self):
+ self.negotiator.cacheEnabled = True
+
+ self.negotiator.policy = 'server'
+ self.assertEqual(self.negotiator.policy, 'server')
+
+ self.negotiator.serverLanguage = u'de'
+
+ env = testing.EnvStub(('pt-br','en'))
+ self.assertEqual(self.negotiator.getLanguage(('en', 'de'), env), 'de')
+
+ self.negotiator.serverLanguage = u'en'
+
+ self.assertEqual(self.negotiator.getLanguage(('en', 'de'), env), 'de')
+
+ env = testing.EnvStub(('pt-br','en'))
+
+ self.assertEqual(self.negotiator.getLanguage(('en', 'de'), env), 'en')
+
+ self.negotiator.serverLanguage = u'de'
+
+ self.assertEqual(self.negotiator.getLanguage(('en', 'de'), env), 'en')
+
+ self.negotiator.clearCache(env)
+
+ self.assertEqual(self.negotiator.getLanguage(('en', 'de'), env), 'de')
+
+ self.negotiator.clearCache(env)
+ self.negotiator.clearCache(env)
+
+
def test_suite():
return unittest.TestSuite((
unittest.makeSuite(NegotiatorBaseTest),
More information about the checkins
mailing list