[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