[Checkins] SVN: z3c.language.negotiator/trunk/ fix problems with the cache

Adam Groszer agroszer at gmail.com
Thu Aug 5 04:11:20 EDT 2010


Log message for revision 115473:
  fix problems with the cache

Changed:
  U   z3c.language.negotiator/trunk/CHANGES.txt
  U   z3c.language.negotiator/trunk/src/z3c/language/negotiator/app.py
  U   z3c.language.negotiator/trunk/src/z3c/language/negotiator/tests.py

-=-
Modified: z3c.language.negotiator/trunk/CHANGES.txt
===================================================================
--- z3c.language.negotiator/trunk/CHANGES.txt	2010-08-05 08:06:06 UTC (rev 115472)
+++ z3c.language.negotiator/trunk/CHANGES.txt	2010-08-05 08:11:19 UTC (rev 115473)
@@ -5,7 +5,12 @@
 1.1.2 (unreleased)
 ------------------
 
-- Nothing changed yet.
+- Fixed an issue with the cache:
+  The cache just ignored the ``languages`` parameter.
+  The first request saved a specific language (e.g. ``de-de``) to the cache,
+  but the second did not have that available in ``languages``, still the cached
+  value was returned.
+  Worst case the uncached method is called.
 
 
 1.1.1 (2010-07-21)

Modified: z3c.language.negotiator/trunk/src/z3c/language/negotiator/app.py
===================================================================
--- z3c.language.negotiator/trunk/src/z3c/language/negotiator/app.py	2010-08-05 08:06:06 UTC (rev 115472)
+++ z3c.language.negotiator/trunk/src/z3c/language/negotiator/app.py	2010-08-05 08:11:19 UTC (rev 115473)
@@ -109,14 +109,27 @@
     def getLanguage(self, languages, request):
         if self.cacheEnabled:
             try:
-                return request.annotations[LANGUAGE_CACHE_KEY]
+                cached = request.annotations[LANGUAGE_CACHE_KEY]
+                if cached in languages:
+                    return cached
+
+                # If the user asked for a specific variation, but we don't
+                # have it available we may serve the most generic one,
+                # according to the spec (eg: user asks for ('en-us',
+                # 'de'), but we don't have 'en-us', then 'en' is preferred
+                # to 'de').
+                parts = cached.split('-')
+                if len(parts) > 1 and parts[0] in languages:
+                    return parts[0]
+
+                #if there's still no match, we have to run through _getLanguage
             except KeyError:
                 lang = self._getLanguage(languages, request)
                 request.annotations[LANGUAGE_CACHE_KEY] = lang
                 return lang
-        else:
-            return self._getLanguage(languages, request)
 
+        return self._getLanguage(languages, request)
+
     def clearCache(self, request):
         try:
             del request.annotations[LANGUAGE_CACHE_KEY]

Modified: z3c.language.negotiator/trunk/src/z3c/language/negotiator/tests.py
===================================================================
--- z3c.language.negotiator/trunk/src/z3c/language/negotiator/tests.py	2010-08-05 08:06:06 UTC (rev 115472)
+++ z3c.language.negotiator/trunk/src/z3c/language/negotiator/tests.py	2010-08-05 08:11:19 UTC (rev 115473)
@@ -142,7 +142,17 @@
         self.negotiator.clearCache(env)
         self.negotiator.clearCache(env)
 
+        #edge case, cache has a more specific language than available
+        self.negotiator.policy = 'browser'
+        env = testing.EnvStub(('de-de','de'))
 
+        self.assertEqual(self.negotiator.getLanguage(('de-de', 'de'), env), 'de-de')
+
+        self.assertEqual(self.negotiator.getLanguage(('de', 'en'), env), 'de')
+
+        self.negotiator.clearCache(env)
+
+
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(NegotiatorBaseTest),



More information about the checkins mailing list