Hello community,

here is the log from the commit of package python-dogpile.cache for 
openSUSE:Factory checked in at 2019-12-21 12:34:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-dogpile.cache (Old)
 and      /work/SRC/openSUSE:Factory/.python-dogpile.cache.new.6675 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-dogpile.cache"

Sat Dec 21 12:34:26 2019 rev:23 rq:758615 version:0.9.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-dogpile.cache/python-dogpile.cache.changes    
    2019-10-05 16:22:07.165153777 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-dogpile.cache.new.6675/python-dogpile.cache.changes
      2019-12-21 12:34:51.443462415 +0100
@@ -1,0 +2,6 @@
+Fri Dec 20 18:20:21 UTC 2019 - Dirk Mueller <[email protected]>
+
+- update to 0.9.0
+  * Added logging facililities into :class:`.CacheRegion`
+
+-------------------------------------------------------------------

Old:
----
  dogpile.cache-0.8.0.tar.gz

New:
----
  dogpile.cache-0.9.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-dogpile.cache.spec ++++++
--- /var/tmp/diff_new_pack.iGOJ8R/_old  2019-12-21 12:34:51.963462663 +0100
+++ /var/tmp/diff_new_pack.iGOJ8R/_new  2019-12-21 12:34:51.963462663 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-dogpile.cache
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %define oldpython python
 Name:           python-dogpile.cache
-Version:        0.8.0
+Version:        0.9.0
 Release:        0
 Summary:        A caching front-end based on the Dogpile lock
 License:        BSD-3-Clause

++++++ dogpile.cache-0.8.0.tar.gz -> dogpile.cache-0.9.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/PKG-INFO 
new/dogpile.cache-0.9.0/PKG-INFO
--- old/dogpile.cache-0.8.0/PKG-INFO    2019-09-20 21:08:44.000000000 +0200
+++ new/dogpile.cache-0.9.0/PKG-INFO    2019-10-28 17:05:28.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: dogpile.cache
-Version: 0.8.0
+Version: 0.9.0
 Summary: A caching front-end based on the Dogpile lock.
 Home-page: https://github.com/sqlalchemy/dogpile.cache
 Author: Mike Bayer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/_sources/changelog.rst.txt 
new/dogpile.cache-0.9.0/docs/_sources/changelog.rst.txt
--- old/dogpile.cache-0.8.0/docs/_sources/changelog.rst.txt     2019-09-20 
21:08:43.000000000 +0200
+++ new/dogpile.cache-0.9.0/docs/_sources/changelog.rst.txt     2019-10-28 
17:05:28.000000000 +0100
@@ -3,6 +3,20 @@
 ==============
 
 .. changelog::
+    :version: 0.9.0
+    :released: Mon Oct 28 2019
+
+    .. change::
+        :tags: feature
+
+        Added logging facililities into :class:`.CacheRegion`, to indicate key
+        events such as cache keys missing or regeneration of values.  As these 
can
+        be very high volume log messages, ``logging.DEBUG`` is used as the log
+        level for the events.  Pull request courtesy Stéphane Brunner.
+
+
+
+.. changelog::
     :version: 0.8.0
     :released: Fri Sep 20 2019
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/_sources/usage.rst.txt 
new/dogpile.cache-0.9.0/docs/_sources/usage.rst.txt
--- old/dogpile.cache-0.8.0/docs/_sources/usage.rst.txt 2019-09-20 
21:08:43.000000000 +0200
+++ new/dogpile.cache-0.9.0/docs/_sources/usage.rst.txt 2019-10-28 
17:05:28.000000000 +0100
@@ -268,3 +268,26 @@
 
 .. versionadded:: 0.4.4  Added support for the :class:`.ProxyBackend` class.
 
+
+Configuring Logging
+====================
+
+.. versionadded:: 0.9.0
+
+:class:`.CacheRegion` includes logging facilities that will emit debug log
+messages when key cache events occur, including when keys are regenerated as
+well as when hard invalidations occur.   Using the `Python logging
+<https://docs.python.org/3/library/logging.html>`_ module, set the log level to
+``dogpile.cache`` to ``logging.DEBUG``::
+
+    logging.basicConfig()
+    logging.getLogger("dogpile.cache").setLevel(logging.DEBUG)
+
+Debug logging will indicate time spent regenerating keys as well as when
+keys are missing::
+
+    DEBUG:dogpile.cache.region:No value present for key: 
'__main__:load_user_info|2'
+    DEBUG:dogpile.cache.region:No value present for key: 
'__main__:load_user_info|1'
+    DEBUG:dogpile.cache.region:Cache value generated in 0.501 seconds for 
keys: ['__main__:load_user_info|2', '__main__:load_user_info|3', 
'__main__:load_user_info|4', '__main__:load_user_info|5']
+    DEBUG:dogpile.cache.region:Hard invalidation detected for key: 
'__main__:load_user_info|3'
+    DEBUG:dogpile.cache.region:Hard invalidation detected for key: 
'__main__:load_user_info|2'
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/dogpile.cache-0.8.0/docs/_static/documentation_options.js 
new/dogpile.cache-0.9.0/docs/_static/documentation_options.js
--- old/dogpile.cache-0.8.0/docs/_static/documentation_options.js       
2019-09-20 21:08:43.000000000 +0200
+++ new/dogpile.cache-0.9.0/docs/_static/documentation_options.js       
2019-10-28 17:05:28.000000000 +0100
@@ -1,6 +1,6 @@
 var DOCUMENTATION_OPTIONS = {
     URL_ROOT: 
document.getElementById("documentation_options").getAttribute('data-url_root'),
-    VERSION: '0.8.0',
+    VERSION: '0.9.0',
     LANGUAGE: 'None',
     COLLAPSE_INDEX: false,
     FILE_SUFFIX: '.html',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/api.html 
new/dogpile.cache-0.9.0/docs/api.html
--- old/dogpile.cache-0.8.0/docs/api.html       2019-09-20 21:08:43.000000000 
+0200
+++ new/dogpile.cache-0.9.0/docs/api.html       2019-10-28 17:05:28.000000000 
+0100
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml";>
   <head>
     <meta charset="utf-8" />
-    <title>API &#8212; dogpile.cache 0.8.0 documentation</title>
+    <title>API &#8212; dogpile.cache 0.9.0 documentation</title>
     <link rel="stylesheet" href="_static/nature_override.css" type="text/css" 
/>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" type="text/css" href="_static/changelog.css" />
@@ -34,7 +34,7 @@
         <li class="right" >
           <a href="core_usage.html" title="dogpile Core"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>  
 
@@ -3070,12 +3070,12 @@
         <li class="right" >
           <a href="core_usage.html" title="dogpile Core"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2011-2019 Mike Bayer.
-      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.0.
+      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.1.
     </div>
   </body>
 </html>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/build/changelog.rst 
new/dogpile.cache-0.9.0/docs/build/changelog.rst
--- old/dogpile.cache-0.8.0/docs/build/changelog.rst    2019-09-20 
21:08:39.000000000 +0200
+++ new/dogpile.cache-0.9.0/docs/build/changelog.rst    2019-10-28 
17:05:23.000000000 +0100
@@ -3,6 +3,20 @@
 ==============
 
 .. changelog::
+    :version: 0.9.0
+    :released: Mon Oct 28 2019
+
+    .. change::
+        :tags: feature
+
+        Added logging facililities into :class:`.CacheRegion`, to indicate key
+        events such as cache keys missing or regeneration of values.  As these 
can
+        be very high volume log messages, ``logging.DEBUG`` is used as the log
+        level for the events.  Pull request courtesy Stéphane Brunner.
+
+
+
+.. changelog::
     :version: 0.8.0
     :released: Fri Sep 20 2019
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/build/conf.py 
new/dogpile.cache-0.9.0/docs/build/conf.py
--- old/dogpile.cache-0.8.0/docs/build/conf.py  2019-09-20 21:08:39.000000000 
+0200
+++ new/dogpile.cache-0.9.0/docs/build/conf.py  2019-10-28 17:05:23.000000000 
+0100
@@ -74,7 +74,7 @@
 # The short X.Y version.
 version = dogpile.__version__
 # The full version, including alpha/beta/rc tags.
-release = "0.8.0"
+release = "0.9.0"
 
 
 # The language for content autogenerated by Sphinx. Refer to documentation
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/build/usage.rst 
new/dogpile.cache-0.9.0/docs/build/usage.rst
--- old/dogpile.cache-0.8.0/docs/build/usage.rst        2019-09-20 
21:08:25.000000000 +0200
+++ new/dogpile.cache-0.9.0/docs/build/usage.rst        2019-10-28 
17:05:11.000000000 +0100
@@ -268,3 +268,26 @@
 
 .. versionadded:: 0.4.4  Added support for the :class:`.ProxyBackend` class.
 
+
+Configuring Logging
+====================
+
+.. versionadded:: 0.9.0
+
+:class:`.CacheRegion` includes logging facilities that will emit debug log
+messages when key cache events occur, including when keys are regenerated as
+well as when hard invalidations occur.   Using the `Python logging
+<https://docs.python.org/3/library/logging.html>`_ module, set the log level to
+``dogpile.cache`` to ``logging.DEBUG``::
+
+    logging.basicConfig()
+    logging.getLogger("dogpile.cache").setLevel(logging.DEBUG)
+
+Debug logging will indicate time spent regenerating keys as well as when
+keys are missing::
+
+    DEBUG:dogpile.cache.region:No value present for key: 
'__main__:load_user_info|2'
+    DEBUG:dogpile.cache.region:No value present for key: 
'__main__:load_user_info|1'
+    DEBUG:dogpile.cache.region:Cache value generated in 0.501 seconds for 
keys: ['__main__:load_user_info|2', '__main__:load_user_info|3', 
'__main__:load_user_info|4', '__main__:load_user_info|5']
+    DEBUG:dogpile.cache.region:Hard invalidation detected for key: 
'__main__:load_user_info|3'
+    DEBUG:dogpile.cache.region:Hard invalidation detected for key: 
'__main__:load_user_info|2'
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/changelog.html 
new/dogpile.cache-0.9.0/docs/changelog.html
--- old/dogpile.cache-0.8.0/docs/changelog.html 2019-09-20 21:08:43.000000000 
+0200
+++ new/dogpile.cache-0.9.0/docs/changelog.html 2019-10-28 17:05:28.000000000 
+0100
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml";>
   <head>
     <meta charset="utf-8" />
-    <title>Changelog &#8212; dogpile.cache 0.8.0 documentation</title>
+    <title>Changelog &#8212; dogpile.cache 0.9.0 documentation</title>
     <link rel="stylesheet" href="_static/nature_override.css" type="text/css" 
/>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" type="text/css" href="_static/changelog.css" />
@@ -30,7 +30,7 @@
         <li class="right" >
           <a href="api.html" title="API"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>  
 
@@ -41,6 +41,21 @@
             
   <div class="section" id="changelog">
 <h1>Changelog<a class="headerlink" href="#changelog" title="Permalink to this 
headline">¶</a></h1>
+<div class="section" id="change-0.9.0">
+<h2 class="release-version">0.9.0<a class="headerlink" href="#change-0.9.0" 
title="Permalink to this headline">¶</a></h2>
+Released: Mon Oct 28 2019<div class="section" id="change-0.9.0-feature">
+<h3>feature<a class="headerlink" href="#change-0.9.0-feature" title="Permalink 
to this headline">¶</a></h3>
+<ul class="simple">
+<li><p id="change-0.9.0-0"><span class="target" 
id="change-f5650a16da629346979bff688ee53078"><strong>[feature]</strong> 
</span><p>Added logging facililities into <a class="reference internal" 
href="api.html#dogpile.cache.region.CacheRegion" 
title="dogpile.cache.region.CacheRegion"><code class="xref py py-class docutils 
literal notranslate"><span class="pre">CacheRegion</span></code></a>, to 
indicate key
+events such as cache keys missing or regeneration of values.  As these can
+be very high volume log messages, <code class="docutils literal 
notranslate"><span class="pre">logging.DEBUG</span></code> is used as the log
+level for the events.  Pull request courtesy Stéphane Brunner.</p>
+<a class="changelog-reference headerlink reference internal" 
href="#change-f5650a16da629346979bff688ee53078">¶</a><p></p>
+</p>
+</li>
+</ul>
+</div>
+</div>
 <div class="section" id="change-0.8.0">
 <h2 class="release-version">0.8.0<a class="headerlink" href="#change-0.8.0" 
title="Permalink to this headline">¶</a></h2>
 Released: Fri Sep 20 2019<div class="section" id="change-0.8.0-bug">
@@ -998,6 +1013,10 @@
   <h3><a href="index.html">Table of Contents</a></h3>
   <ul>
 <li><a class="reference internal" href="#">Changelog</a><ul>
+<li><a class="reference internal" href="#change-0.9.0">0.9.0</a><ul>
+<li><a class="reference internal" href="#change-0.9.0-feature">feature</a></li>
+</ul>
+</li>
 <li><a class="reference internal" href="#change-0.8.0">0.8.0</a><ul>
 <li><a class="reference internal" href="#change-0.8.0-bug">bug</a></li>
 </ul>
@@ -1153,12 +1172,12 @@
         <li class="right" >
           <a href="api.html" title="API"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2011-2019 Mike Bayer.
-      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.0.
+      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.1.
     </div>
   </body>
 </html>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/core_usage.html 
new/dogpile.cache-0.9.0/docs/core_usage.html
--- old/dogpile.cache-0.8.0/docs/core_usage.html        2019-09-20 
21:08:43.000000000 +0200
+++ new/dogpile.cache-0.9.0/docs/core_usage.html        2019-10-28 
17:05:28.000000000 +0100
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml";>
   <head>
     <meta charset="utf-8" />
-    <title>dogpile Core &#8212; dogpile.cache 0.8.0 documentation</title>
+    <title>dogpile Core &#8212; dogpile.cache 0.9.0 documentation</title>
     <link rel="stylesheet" href="_static/nature_override.css" type="text/css" 
/>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" type="text/css" href="_static/changelog.css" />
@@ -34,7 +34,7 @@
         <li class="right" >
           <a href="recipes.html" title="Recipes"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>  
 
@@ -324,12 +324,12 @@
         <li class="right" >
           <a href="recipes.html" title="Recipes"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2011-2019 Mike Bayer.
-      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.0.
+      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.1.
     </div>
   </body>
 </html>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/front.html 
new/dogpile.cache-0.9.0/docs/front.html
--- old/dogpile.cache-0.8.0/docs/front.html     2019-09-20 21:08:43.000000000 
+0200
+++ new/dogpile.cache-0.9.0/docs/front.html     2019-10-28 17:05:28.000000000 
+0100
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml";>
   <head>
     <meta charset="utf-8" />
-    <title>Front Matter &#8212; dogpile.cache 0.8.0 documentation</title>
+    <title>Front Matter &#8212; dogpile.cache 0.9.0 documentation</title>
     <link rel="stylesheet" href="_static/nature_override.css" type="text/css" 
/>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" type="text/css" href="_static/changelog.css" />
@@ -34,7 +34,7 @@
         <li class="right" >
           <a href="index.html" title="Welcome to dogpile.cache’s 
documentation!"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>  
 
@@ -117,12 +117,12 @@
         <li class="right" >
           <a href="index.html" title="Welcome to dogpile.cache’s 
documentation!"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2011-2019 Mike Bayer.
-      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.0.
+      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.1.
     </div>
   </body>
 </html>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/genindex.html 
new/dogpile.cache-0.9.0/docs/genindex.html
--- old/dogpile.cache-0.8.0/docs/genindex.html  2019-09-20 21:08:43.000000000 
+0200
+++ new/dogpile.cache-0.9.0/docs/genindex.html  2019-10-28 17:05:28.000000000 
+0100
@@ -5,7 +5,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml";>
   <head>
     <meta charset="utf-8" />
-    <title>Index &#8212; dogpile.cache 0.8.0 documentation</title>
+    <title>Index &#8212; dogpile.cache 0.9.0 documentation</title>
     <link rel="stylesheet" href="_static/nature_override.css" type="text/css" 
/>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" type="text/css" href="_static/changelog.css" />
@@ -27,7 +27,7 @@
         <li class="right" >
           <a href="py-modindex.html" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>  
 
@@ -775,12 +775,12 @@
         <li class="right" >
           <a href="py-modindex.html" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2011-2019 Mike Bayer.
-      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.0.
+      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.1.
     </div>
   </body>
 </html>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/index.html 
new/dogpile.cache-0.9.0/docs/index.html
--- old/dogpile.cache-0.8.0/docs/index.html     2019-09-20 21:08:43.000000000 
+0200
+++ new/dogpile.cache-0.9.0/docs/index.html     2019-10-28 17:05:28.000000000 
+0100
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml";>
   <head>
     <meta charset="utf-8" />
-    <title>Welcome to dogpile.cache’s documentation! &#8212; dogpile.cache 
0.8.0 documentation</title>
+    <title>Welcome to dogpile.cache’s documentation! &#8212; dogpile.cache 
0.9.0 documentation</title>
     <link rel="stylesheet" href="_static/nature_override.css" type="text/css" 
/>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" type="text/css" href="_static/changelog.css" />
@@ -30,7 +30,7 @@
         <li class="right" >
           <a href="front.html" title="Front Matter"
              accesskey="N">next</a> |</li>
-        <li class="nav-item nav-item-0"><a href="#">dogpile.cache 0.8.0 
documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="#">dogpile.cache 0.9.0 
documentation</a> &#187;</li> 
       </ul>
     </div>  
 
@@ -68,6 +68,7 @@
 <li class="toctree-l2"><a class="reference internal" 
href="usage.html#using-a-region">Using a Region</a></li>
 <li class="toctree-l2"><a class="reference internal" 
href="usage.html#creating-backends">Creating Backends</a></li>
 <li class="toctree-l2"><a class="reference internal" 
href="usage.html#changing-backend-behavior">Changing Backend Behavior</a></li>
+<li class="toctree-l2"><a class="reference internal" 
href="usage.html#configuring-logging">Configuring Logging</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" 
href="recipes.html">Recipes</a><ul>
@@ -95,6 +96,7 @@
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" 
href="changelog.html">Changelog</a><ul>
+<li class="toctree-l2"><a class="reference internal" 
href="changelog.html#change-0.9.0">0.9.0</a></li>
 <li class="toctree-l2"><a class="reference internal" 
href="changelog.html#change-0.8.0">0.8.0</a></li>
 <li class="toctree-l2"><a class="reference internal" 
href="changelog.html#change-0.7.1">0.7.1</a></li>
 <li class="toctree-l2"><a class="reference internal" 
href="changelog.html#change-0.7.0">0.7.0</a></li>
@@ -185,12 +187,12 @@
         <li class="right" >
           <a href="front.html" title="Front Matter"
              >next</a> |</li>
-        <li class="nav-item nav-item-0"><a href="#">dogpile.cache 0.8.0 
documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="#">dogpile.cache 0.9.0 
documentation</a> &#187;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2011-2019 Mike Bayer.
-      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.0.
+      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.1.
     </div>
   </body>
 </html>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/py-modindex.html 
new/dogpile.cache-0.9.0/docs/py-modindex.html
--- old/dogpile.cache-0.8.0/docs/py-modindex.html       2019-09-20 
21:08:43.000000000 +0200
+++ new/dogpile.cache-0.9.0/docs/py-modindex.html       2019-10-28 
17:05:28.000000000 +0100
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml";>
   <head>
     <meta charset="utf-8" />
-    <title>Python Module Index &#8212; dogpile.cache 0.8.0 
documentation</title>
+    <title>Python Module Index &#8212; dogpile.cache 0.9.0 
documentation</title>
     <link rel="stylesheet" href="_static/nature_override.css" type="text/css" 
/>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" type="text/css" href="_static/changelog.css" />
@@ -29,7 +29,7 @@
         <li class="right" >
           <a href="#" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>  
 
@@ -136,12 +136,12 @@
         <li class="right" >
           <a href="#" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2011-2019 Mike Bayer.
-      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.0.
+      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.1.
     </div>
   </body>
 </html>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/recipes.html 
new/dogpile.cache-0.9.0/docs/recipes.html
--- old/dogpile.cache-0.8.0/docs/recipes.html   2019-09-20 21:08:43.000000000 
+0200
+++ new/dogpile.cache-0.9.0/docs/recipes.html   2019-10-28 17:05:28.000000000 
+0100
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml";>
   <head>
     <meta charset="utf-8" />
-    <title>Recipes &#8212; dogpile.cache 0.8.0 documentation</title>
+    <title>Recipes &#8212; dogpile.cache 0.9.0 documentation</title>
     <link rel="stylesheet" href="_static/nature_override.css" type="text/css" 
/>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" type="text/css" href="_static/changelog.css" />
@@ -34,7 +34,7 @@
         <li class="right" >
           <a href="usage.html" title="Usage Guide"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>  
 
@@ -338,12 +338,12 @@
         <li class="right" >
           <a href="usage.html" title="Usage Guide"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2011-2019 Mike Bayer.
-      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.0.
+      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.1.
     </div>
   </body>
 </html>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/search.html 
new/dogpile.cache-0.9.0/docs/search.html
--- old/dogpile.cache-0.8.0/docs/search.html    2019-09-20 21:08:43.000000000 
+0200
+++ new/dogpile.cache-0.9.0/docs/search.html    2019-10-28 17:05:28.000000000 
+0100
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml";>
   <head>
     <meta charset="utf-8" />
-    <title>Search &#8212; dogpile.cache 0.8.0 documentation</title>
+    <title>Search &#8212; dogpile.cache 0.9.0 documentation</title>
     <link rel="stylesheet" href="_static/nature_override.css" type="text/css" 
/>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" type="text/css" href="_static/changelog.css" />
@@ -31,7 +31,7 @@
         <li class="right" >
           <a href="py-modindex.html" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>  
 
@@ -82,12 +82,12 @@
         <li class="right" >
           <a href="py-modindex.html" title="Python Module Index"
              >modules</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2011-2019 Mike Bayer.
-      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.0.
+      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.1.
     </div>
   </body>
 </html>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/searchindex.js 
new/dogpile.cache-0.9.0/docs/searchindex.js
--- old/dogpile.cache-0.8.0/docs/searchindex.js 2019-09-20 21:08:43.000000000 
+0200
+++ new/dogpile.cache-0.9.0/docs/searchindex.js 2019-10-28 17:05:28.000000000 
+0100
@@ -1 +1 @@
-Search.setIndex({docnames:["api","changelog","core_usage","front","index","recipes","usage"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["api.rst","changelog.rst","core_usage.rst","front.rst","index.rst","recipes.rst","usage.rst"],objects:{"dogpile.Lock.params":{async_creator:[0,1,1,""],creator:[0,1,1,""],expiretime:[0,1,1,""],mutex:[0,1,1,""],value_and_created_fn:[0,1,1,""]},"dogpile.cache":{api:[0,2,0,"-"],exception:[0,2,0,"-"],proxy:[0,2,0,"-"],region:[0,2,0,"-"]},"dogpile.cache.api":{CacheBackend:[0,0,1,""],CachedValue:[0,0,1,""],NO_VALUE:[0,5,1,""],NoValue:[0,0,1,""]},"dogpile.cache.api.CacheBackend":{"delete":[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_mutex:[0,3,1,""],key_mangler:[0,4,1,""],set:[0,3,1,""],set_multi:[0,3,1,""]},"dogpile.cache.api.CachedValue":{metadata:[0,3,1,""],payload:[0,3,1,""]},"dogpile.cache.backends":{"null":[0,2,0,"-"],file:[0,2,0,"-"],memcached:[0,2,0,"-"],memory:[0,2,0,"-"],redis:[0,2,0,"-"]},"dogpile.cache.backends.file":{AbstractFileLock:[0,0,1,""],DBMBackend:[0,0,1,""],FileLock:[0,0,1,""]},"dogpile.cache.backends.file.AbstractFileLock":{acquire:[0,3,1,""],acquire_read_lock:[0,3,1,""],acquire_write_lock:[0,3,1,""],is_open:[0,3,1,""],read:[0,3,1,""],release:[0,3,1,""],release_read_lock:[0,3,1,""],release_write_lock:[0,3,1,""],write:[0,3,1,""]},"dogpile.cache.backends.file.DBMBackend":{"delete":[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_mutex:[0,3,1,""],set:[0,3,1,""],set_multi:[0,3,1,""]},"dogpile.cache.backends.file.DBMBackend.params":{dogpile_lockfile:[0,1,1,""],filename:[0,1,1,""],lock_factory:[0,1,1,""],rw_lockfile:[0,1,1,""]},"dogpile.cache.backends.file.FileLock":{acquire_read_lock:[0,3,1,""],acquire_write_lock:[0,3,1,""],is_open:[0,3,1,""],release_read_lock:[0,3,1,""],release_write_lock:[0,3,1,""]},"dogpile.cache.backends.memcached":{BMemcachedBackend:[0,0,1,""],GenericMemcachedBackend:[0,0,1,""],MemcachedBackend:[0,0,1,""],MemcachedLock:[0,0,1,""],PylibmcBackend:[0,0,1,""]},"dogpile.cache.backends.memcached.BMemcachedBackend":{delete_multi:[0,3,1,""]},"dogpile.cache.backends.memcached.BMemcachedBackend.params":{password:[0,1,1,""],username:[0,1,1,""]},"dogpile.cache.backends.memcached.GenericMemcachedBackend":{"delete":[0,3,1,""],client:[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_mutex:[0,3,1,""],set:[0,3,1,""],set_arguments:[0,4,1,""],set_multi:[0,3,1,""]},"dogpile.cache.backends.memcached.GenericMemcachedBackend.params":{distributed_lock:[0,1,1,""],lock_timeout:[0,1,1,""],memcached_expire_time:[0,1,1,""],url:[0,1,1,""]},"dogpile.cache.backends.memcached.PylibmcBackend.params":{behaviors:[0,1,1,""],binary:[0,1,1,""],min_compress_len:[0,1,1,""]},"dogpile.cache.backends.memory":{MemoryBackend:[0,0,1,""],MemoryPickleBackend:[0,0,1,""]},"dogpile.cache.backends.memory.MemoryBackend":{"delete":[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],set:[0,3,1,""],set_multi:[0,3,1,""]},"dogpile.cache.backends.null":{NullBackend:[0,0,1,""]},"dogpile.cache.backends.null.NullBackend":{"delete":[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_mutex:[0,3,1,""],set:[0,3,1,""],set_multi:[0,3,1,""]},"dogpile.cache.backends.redis":{RedisBackend:[0,0,1,""]},"dogpile.cache.backends.redis.RedisBackend":{"delete":[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_mutex:[0,3,1,""],set:[0,3,1,""],set_multi:[0,3,1,""]},"dogpile.cache.backends.redis.RedisBackend.params":{connection_pool:[0,1,1,""],db:[0,1,1,""],distributed_lock:[0,1,1,""],host:[0,1,1,""],lock_sleep:[0,1,1,""],lock_timeout:[0,1,1,""],password:[0,1,1,""],port:[0,1,1,""],redis_expiration_time:[0,1,1,""],socket_timeout:[0,1,1,""],url:[0,1,1,""]},"dogpile.cache.exception":{DogpileCacheException:[0,6,1,""],PluginNotFound:[0,6,1,""],RegionAlreadyConfigured:[0,6,1,""],RegionNotConfigured:[0,6,1,""],ValidationError:[0,6,1,""]},"dogpile.cache.plugins":{mako_cache:[0,2,0,"-"]},"dogpile.cache.plugins.mako_cache":{MakoPlugin:[0,0,1,""]},"dogpile.cache.plugins.mako_cache.MakoPlugin":{get:[0,3,1,""],get_or_create:[0,3,1,""],invalidate:[0,3,1,""]},"dogpile.cache.plugins.mako_cache.MakoPlugin.get.params":{"**kw":[0,1,1,""],key:[0,1,1,""]},"dogpile.cache.plugins.mako_cache.MakoPlugin.get_or_create.params":{"**kw":[0,1,1,""],creation_function:[0,1,1,""],key:[0,1,1,""]},"dogpile.cache.plugins.mako_cache.MakoPlugin.invalidate.params":{"**kw":[0,1,1,""],key:[0,1,1,""]},"dogpile.cache.proxy":{ProxyBackend:[0,0,1,""]},"dogpile.cache.proxy.ProxyBackend":{"delete":[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_mutex:[0,3,1,""],set:[0,3,1,""],set_multi:[0,3,1,""],wrap:[0,3,1,""]},"dogpile.cache.region":{CacheRegion:[0,0,1,""],DefaultInvalidationStrategy:[0,0,1,""],RegionInvalidationStrategy:[0,0,1,""],make_region:[0,7,1,""],value_version:[0,5,1,""]},"dogpile.cache.region.CacheRegion":{"delete":[0,3,1,""],actual_backend:[0,3,1,""],cache_multi_on_arguments:[0,3,1,""],cache_on_arguments:[0,3,1,""],configure:[0,3,1,""],configure_from_config:[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_or_create:[0,3,1,""],get_or_create_multi:[0,3,1,""],invalidate:[0,3,1,""],is_configured:[0,3,1,""],set:[0,3,1,""],set_multi:[0,3,1,""],wrap:[0,3,1,""]},"dogpile.cache.region.CacheRegion.cache_multi_on_arguments.params":{asdict:[0,1,1,""],expiration_time:[0,1,1,""],function_multi_key_generator:[0,1,1,""],namespace:[0,1,1,""],should_cache_fn:[0,1,1,""],to_str:[0,1,1,""]},"dogpile.cache.region.CacheRegion.cache_on_arguments.params":{expiration_time:[6,1,1,""],function_key_generator:[6,1,1,""],namespace:[6,1,1,""],should_cache_fn:[6,1,1,""],to_str:[6,1,1,""]},"dogpile.cache.region.CacheRegion.configure.params":{arguments:[6,1,1,""],backend:[6,1,1,""],expiration_time:[6,1,1,""],region_invalidator:[6,1,1,""],replace_existing_backend:[6,1,1,""],wrap:[6,1,1,""]},"dogpile.cache.region.CacheRegion.get.params":{expiration_time:[6,1,1,""],ignore_expiration:[6,1,1,""],key:[6,1,1,""]},"dogpile.cache.region.CacheRegion.get_or_create.params":{creator:[6,1,1,""],creator_args:[6,1,1,""],expiration_time:[6,1,1,""],key:[6,1,1,""],should_cache_fn:[6,1,1,""]},"dogpile.cache.region.CacheRegion.get_or_create_multi.params":{creator:[0,1,1,""],expiration_time:[0,1,1,""],keys:[0,1,1,""],should_cache_fn:[0,1,1,""]},"dogpile.cache.region.CacheRegion.invalidate.params":{hard:[0,1,1,""]},"dogpile.cache.region.CacheRegion.params":{async_creation_runner:[6,1,1,""],function_key_generator:[6,1,1,""],function_multi_key_generator:[6,1,1,""],key_mangler:[6,1,1,""],name:[6,1,1,""]},"dogpile.cache.region.DefaultInvalidationStrategy":{invalidate:[0,3,1,""],is_hard_invalidated:[0,3,1,""],is_invalidated:[0,3,1,""],is_soft_invalidated:[0,3,1,""],was_hard_invalidated:[0,3,1,""],was_soft_invalidated:[0,3,1,""]},"dogpile.cache.region.RegionInvalidationStrategy":{invalidate:[0,3,1,""],is_hard_invalidated:[0,3,1,""],is_invalidated:[0,3,1,""],is_soft_invalidated:[0,3,1,""],was_hard_invalidated:[0,3,1,""],was_soft_invalidated:[0,3,1,""]},"dogpile.cache.util":{function_key_generator:[0,7,1,""],kwarg_function_key_generator:[0,7,1,""],length_conditional_mangler:[0,7,1,""],sha1_mangle_key:[0,7,1,""]},"dogpile.util":{NameRegistry:[0,0,1,""],ReadWriteMutex:[0,0,1,""]},"dogpile.util.NameRegistry":{get:[0,3,1,""]},"dogpile.util.NameRegistry.get.params":{"**kw":[0,1,1,""],identifier:[0,1,1,""]},"dogpile.util.NameRegistry.params":{creator:[0,1,1,""]},"dogpile.util.ReadWriteMutex":{acquire_read_lock:[0,3,1,""],acquire_write_lock:[0,3,1,""],release_read_lock:[0,3,1,""],release_write_lock:[0,3,1,""]},dogpile:{Lock:[0,0,1,""],NeedRegenerationException:[0,0,1,""]}},objnames:{"0":["py","class","Python
 class"],"1":["py","parameter","Python parameter"],"2":["py","module","Python 
module"],"3":["py","method","Python method"],"4":["py","attribute","Python 
attribute"],"5":["py","data","Python data"],"6":["py","exception","Python 
exception"],"7":["py","function","Python 
function"]},objtypes:{"0":"py:class","1":"py:parameter","2":"py:module","3":"py:method","4":"py:attribute","5":"py:data","6":"py:exception","7":"py:function"},terms:{"2to3":1,"53def077a4264bd3183d4eb21b1f56f883e1b572":2,"\u0142ukasz":1,"abstract":1,"boolean":[0,1],"byte":1,"case":[0,1,2,5,6],"class":[0,1,2,5,6],"default":[0,1,5,6],"final":[0,6],"float":[0,1],"function":[0,1,2,5,6],"import":[0,1,2,5,6],"int":1,"long":[0,1,6],"menkevi\u010diu":1,"new":[0,1,2,4,5,6],"null":1,"return":[0,1,2,5,6],"short":2,"super":6,"true":[0,1,5,6],"try":[0,5,6],"while":[0,1,4,5,6],Added:[0,1,6],For:[0,2,6],NFS:2,One:[0,6],Such:[0,6],The:[0,1,2,3,5,6],Then:6,There:[0,2],These:6,Use:[0,1],Used:[0,6],Using:[1,4,5],With:[0,6],__future__:1,__init__:[0,6],__name__:[0,5,6],__repr__:1,_config_argument_dict:[0,6],_config_prefix:[0,6],_encodedproxi:5,_hard_invalid:0,_soft_invalid:0,abil:0,about:3,abov:[0,2,5,6],abstractfilelock:[0,1],accept:[0,1,6],access:[0,1,2,6],accessor:[0,1],accomplish:2,account:[0,1],acheiv:5,acquir:[0,1,6],acquire_read_lock:0,acquire_write_lock:0,across:[0,1,2],act:2,actual:[0,1,2,5,6],actual_backend:[0,1],adapt:[0,4],add:[1,5],add_new_data:5,added:[0,1,6],addit:[0,1,2,6],addition:[1,4],address:2,adjust:[1,4],advantag:0,adventag:6,affect:[0,6],after:[0,1,5,6],after_commit:5,again:[0,2,6],against:[0,1,2,6],ahead:2,akkerman:1,alert:2,alexand:1,all:[0,1,2,4,6],allow:[0,1,2,4,6],along:[2,5],alpha:1,alphabet:0,alreadi:[0,1,6],also:[0,1,2,5,6],alter:[0,6],altern:[0,6],although:1,alwai:[0,6],amix:0,among:6,analogu:0,anderson:1,anentrop:1,ani:[0,1,2,4,6],ankitpatel96:1,anoth:[0,1,2,4,6],answer:2,anticip:2,antoin:1,anydbm:0,anyth:6,api:[1,4,5,6],app:1,appar:1,appear:0,append:[0,5],appli:[0,1,5,6],applic:[0,2,4,6],approach:[0,1,2,5,6],appropri:[0,6],approxim:2,apr:1,araujo:1,arbitrari:0,aren:0,arg:[0,5,6],argnam:0,argspec:0,argument:[0,1,2,5,6],argvalu:0,around:[0,2],ascii:[0,6],asdict:[0,1],ask:0,assembl:0,assert:5,associ:[0,5,6],assum:[0,1],async:1,async_cr:[0,6],async_creation_runn:[0,1,5,6],asynchron:[0,1,4,6],attach:0,attempt:[0,6],attribut:[0,6],aug:1,augment:[0,1,6],authent:0,automat:0,avail:[0,1,3,4,5,6],avoid:[1,5],awar:[0,5,6],azoff:1,back:[0,1],backend:[1,2,4,5],background:[0,5,6],backward:0,base:[0,1,2,5,6],basi:[0,1,6],basic:[0,6],baton:2,beaker:[0,2],bean:1,becom:[0,6],been:[0,1,2,5,6],befor:[0,1,2,6],behalf:6,behav:0,behavior:[0,1,4,5],behind:6,being:[0,1,5,6],beitei:1,below:[0,5,6],ben:1,bertin:1,besid:5,best:0,between:[0,6],beyond:1,binari:0,bit:6,block:[0,2,4,5,6],blog:0,bmemcach:[0,1],bmemcachedbackend:0,bookkeep:5,bool:0,both:[0,1],bother:6,brian:1,brown:1,bsddb:[0,6],bug:4,build:[0,1,2,4,5],built:[0,6],builtin:[0,6],bypass:[0,1,6],bytestr:[0,1,6],cach:[0,1,3,5,6],cache_arg:0,cache_dict:0,cache_impl:0,cache_multi_on_argu:[0,1,6],cache_on_argu:[0,1,5,6],cache_refresh:5,cache_region:0,cache_timeout:1,cachebackend:[0,6],cachedvalu:[0,5,6],cachefil:0,cacheimpl:0,cacheregion:[0,1,5,6],calcul:1,call:[0,1,2,5,6],callabl:[0,1,5,6],caller:0,can:[0,1,2,5,6],cannot:[0,1,6],categori:2,caus:1,caveat:[0,6],celeri:[0,6],certain:[0,6],chain:[0,6],chang:[0,1,2,4,5],changelog:4,check:[0,1,2,6],choos:0,christian:1,circumst:6,client:[0,1,2,5,6],client_fn:0,cls:[0,6],code:[0,2,5],coerc:[0,1,6],coerce_string_conf:1,coercion:1,collect:0,collis:5,com:[1,3],combin:[0,6],command:1,commit:5,common:[0,1,2,6],commun:1,compar:[0,6],compat:[0,1],compatbl:1,complement:1,complet:[0,2],compon:6,comput:[0,6],concept:[0,2,4],concern:5,concret:0,concurr:[0,2,6],condit:[0,1],condition:[0,6],conf:1,config:[0,1,6],config_dict:[0,6],configur:[0,1,4,5],configure_from_config:[0,1,6],conjunct:[0,1,6],connect:[0,1],connection_pool:[0,1],connectionpool:[0,1],consid:[0,1,6],consist:[4,6],constant:1,construct:[0,1,6],constructor:[0,6],consult:[0,6],contain:[0,5,6],content:0,context:[0,2],continu:[0,1,2],contribut:1,control:4,conveni:[0,6],convert:[0,6],coordin:[0,2,6],copi:[0,1],core:[1,4,6],correct:[0,6],correctli:1,correspond:0,could:[0,1,5],count:5,counter:5,courtesi:1,cover:1,cpickl:0,creat:[0,1,2,4],create_some_resourc:2,create_valu:[0,6],createdtim:2,creation:[0,1,2,4,6],creation_funct:0,creation_tim:0,creationtim:2,creator:[0,1,4,6],creator_arg:[0,1,6],critic:1,cross:2,current:[0,1,2,6],custom:[0,1,5,6],custominvalidationstrategi:0,customiz:1,cutom:0,d_arg1_arg2_arg3:5,daemon:5,dai:[0,6],dairiki:1,daniel:1,data:[0,4,6],databas:5,date:[0,1,6],datetim:[0,1,6],david:1,dbclass:5,dbm:[0,1,6],dbmbackend:[0,1],dbmfile:[0,6],deadlock:1,deal:0,debug:6,dec:1,declar:[0,6],decod:4,decor:[0,1,2,5,6],def:[0,2,5,6],defaultinvalidationstrategi:0,defer:[0,2,6],defin:[5,6],delai:5,deleg:0,delet:[0,1,5,6],delete_multi:[0,1],deliv:1,depend:[0,1,6],deprec:1,deriv:[0,6],describ:[0,2,6],descriptor:0,deseri:0,design:[2,6],desir:0,destruct:1,detail:[0,6],detect:0,determin:[0,1,6],dev:1,develop:1,dict:[0,5],dictionari:[0,1,6],dictionarybackend:6,did:[1,6],didn:1,differ:[0,1,2,5,6],digest:2,direct:[0,1,5],directli:[0,1,4,6],directori:[0,1],disabl:[0,1,6],disambigu:[0,6],disappear:2,discard:0,distinguish:[0,6],distribut:[0,1,4],distributed_lock:[0,1,6],do_refresh:5,do_someth:2,doc:1,document:[0,1,3],doe:[0,1,5,6],doesn:[0,2],dogpil:[1,3,5,6],dogpile_lockfil:0,dogpilecach:3,dogpilecacheexcept:0,doing:0,don:[0,1],done:5,dont_cache_non:[0,6],down:[0,6],drop:[0,1],due:1,dump:1,dure:[0,1,2],dynam:[0,1,6],each:[0,1,2,5,6],easi:4,easier:6,easili:[5,6],edg:6,ef206ed4473fec3b639:1,effect:0,effici:2,effort:1,either:[0,1,5,6],elect:0,elimin:6,els:[0,2],emit:1,emploi:1,empti:1,enabl:1,encapsul:2,encod:4,encourag:4,end:[0,1,2,6],enhanc:[1,3],enough:0,ensur:[1,2],enter:5,entir:[0,1,6],entri:1,entry_point:6,entrypoint:[0,1,6],environ:[0,4],equival:[0,1,6],eric:1,errant:1,erron:1,error:[0,1],establish:[0,1,6],etc:[0,1],evalu:[0,6],even:[0,1],event:[4,6],everi:[1,2],everyth:5,exact:1,exampl:[0,1,4,5,6],excel:6,except:[1,4,5,6],exception:5,excess:1,execut:4,exist:[0,1,2,6],existing_valu:0,expand:1,expect:2,expedi:5,expens:[0,2,6],expir:[0,1,2,6],expiration_tim:[0,1,2,5,6],expiretim:0,expiri:0,explicitli:0,expos:1,extend:[0,5,6],extra:[0,6],face:1,fact:[0,6],fail:[0,1],failur:1,fainberg:1,fall:2,fallback:1,fals:[0,1,5,6],far:2,faster:6,favor:1,fcntl:0,featur:[0,3,6],feb:1,fedorov:1,fidosz:1,field:1,file:[1,4,6],filelock:[0,1,2],filenam:[0,2,6],filesystem:[0,2],filter:5,finish:[0,2,6],first:[0,1,2,6],fix:[0,1,6],flag:[0,1,6],flock:[0,1,2],flufl:2,fly:5,fname:[0,5,6],fname_:5,focus:6,follow:[0,2,6],foo1:0,foo:[0,6],forc:[0,1],foremost:6,form:[0,1,6],format:[0,1,4],former:0,found:[0,6],frequent:1,fri:1,frit:1,from:[0,1,2,3,5,6],from_url:[0,1],front:[0,2,4,6],full:1,fulli:1,function_key_gener:[0,1,5,6],function_multi_key_gener:[0,1,6],futur:[0,1,6],garbag:0,gdbm:1,gen:[0,6],gen_cach:2,gener:[0,1,2,4,5,6],generate_kei:[0,5,6],generate_my_expensive_valu:2,generate_someth:[0,6],genericmemachedbackend:0,genericmemcachedbackend:[0,1],get:[0,1,2,5,6],get_multi:[0,1,5,6],get_mutex:0,get_or_cr:[0,1,6],get_or_create_multi:[0,1,5,6],get_some_data:5,get_valu:2,getargspec:1,getfullargspec:1,getlogg:6,getter:[0,1],git:1,github:[1,3],given:[0,1,2,5,6],glitch:1,global:[0,2],goe:[0,2],good:[2,5],great:1,greater:0,group:4,guard:1,guid:4,had:1,hanchrow:1,hand:[0,6],handl:0,hanu:1,happen:5,hard:[0,1,5],has:[0,1,2,5,6],has_valu:0,hash:[0,6],hashlib:2,have:[0,1,2,5,6],hayden:1,hbccbh:1,head:1,held:0,help:[0,5,6],helper:6,henc:6,here:[0,2,6],hex:2,hexdigest:2,high:[4,6],highest_protocol:[0,1],hit:[0,5],hoc:[2,6],homepag:4,hongbin:1,honor:[0,1],hood:5,hook:[4,5],hope:5,host:[0,1,3],hour:0,how:[0,2,6],howev:[0,1,2,5,6],http:[0,1,3,5],idea:[2,5],idempot:[0,6],identifi:[0,6],ignor:[0,1,6],ignore_expir:[0,1,6],illustr:[0,2,6],immedi:[0,6],impact:0,implement:[0,1,5,6],impli:[0,2],implicitli:1,improv:[0,1,5],includ:[0,1,6],incom:[0,1,6],incompat:[0,1],incur:0,index:[3,4],indic:[0,6],indirectli:2,individu:0,info:1,inform:[0,3,6],inher:0,inherit:[0,5],ini:1,initi:[0,1,2,6],inject:0,insid:[0,6],inspect:1,instal:[1,4,6],instanc:[0,1,2,5,6],instant:6,instanti:[0,5,6],instead:[1,2,5],instruct:6,integ:[0,1,5,6],integr:4,intend:1,intent:0,interfac:[0,2,4,6],intern:[0,1,2,6],interpret:[0,1,6],invalid:[0,1,4,6],invalidate_user_id:5,invoc:[0,2],invok:[0,2,6],involv:0,is_configur:[0,1],is_hard_invalid:0,is_invalid:0,is_open:0,is_soft_invalid:0,is_unittest:1,isinst:5,isn:[0,1,6],issu:[1,2,3,6],item:0,iteritem:5,itertool:5,its:[0,1,2,4,6],itself:[0,1,2,6],jack:1,jami:1,jan:1,jeff:1,jimmei:1,job:0,john:1,join:[0,2,5,6],jon:1,jonathan:1,json:5,jul:1,juli:1,jun:1,just:[0,2,5,6],justin:1,keep:[0,2],kei:[0,1,2,4,6],ketama:0,key1:0,key2:0,key3:0,key_mangl:[0,1,5,6],key_templ:5,keyerror:1,keyreentrantmutex:1,keyword:[0,1,6],kind:[0,6],klinger:1,know:5,kolak:1,krau:1,kwarg:[0,5,6],kwarg_function_key_gener:[0,1,6],lambda:5,larger:0,last:[0,6],lastli:[0,6],later:[0,6],latter:0,lead:[1,5],learn:4,least:[0,2,5],leav:5,left:0,length:[0,1,6],length_conditional_mangl:0,lennox:1,less:1,level:[0,2,6],lib:0,librari:[0,1,6],life:6,like:[0,1,2,5,6],link:[0,5],list:[0,1,6],listens_for:5,load:[0,1,6],load_user_info:6,local:[0,2,5,6],local_region:[0,6],localhost:[0,2],locat:[1,6],lock:[0,1,4,6],lock_factori:[0,1],lock_path:2,lock_sleep:[0,1],lock_timeout:[0,1],lockfil:[0,2],log:6,loggingproxi:6,logic:0,longer:1,look:6,lookup:[0,2],lookup_user_by_id:6,lose:1,lot:4,lutz:1,mabei:1,made:[0,1,2],magnitud:1,mai:[0,1,2,5,6],main:5,maintain:1,makarov:1,make:[0,1,2,6],make_region:[0,5,6],mako:1,mako_cach:[0,1],mako_lookup:0,makoplugin:0,manag:[0,2,5,6],mangl:[0,1,5,6],mangler:[0,1,5,6],mani:[1,6],map:[0,1,5],mapping_set:5,mar:1,marco:1,markedli:6,masayuko:1,match:[0,1],matter:4,mc_pool:2,mean:[0,1,5,6],mechan:[0,1,4,6],memcach:[1,2,6],memcached_expire_tim:[0,1],memcached_region:[0,6],memcachedbackend:0,memcachedlock:0,memoized_properti:1,memori:[1,5],memory_pickl:0,memorybackend:[0,1],memorypickl:1,memorypicklebackend:[0,1],metadata:[0,5,6],method:[0,1,5,6],might:[0,6],min_compress_len:[0,1],mind:6,minim:5,minimum:[0,1],minu:2,miss:[0,1],moc:[0,6],mode:[0,6],model:6,modern:0,modifi:0,modul:[0,1,4,6],modulu:0,moment:5,mon:1,more:[0,1,2,6],morgan:1,most:[0,2,3],move:1,msgpack:5,msgpackproxi:5,much:5,multipl:[0,1,2,6],multithread:[0,6],multivalu:1,must:[0,1],mutex:[0,2,6],mutexlock:0,my_data:[0,6],my_dictionari:0,my_foo:0,my_funct:[0,6],my_key_gener:[0,5,6],my_multi_key_gener:[0,6],my_region:[0,6],myapp:[0,5,6],mybackend:6,myclass:[0,6],myconfig:[0,6],myfirstproxi:0,myfoo:0,myinvalid:0,myotherclass:[0,6],mypackag:6,myregion:6,mysecondproxi:0,mysect:0,name:[0,1,6],nameregistri:[0,1],namespac:[0,1,5,6],nativ:6,necessari:5,necessarili:[0,1,6],need:[0,1,4,5,6],needregenerationexcept:[0,2],neg:1,negat:5,nest:5,never:0,new_valu:0,newli:[0,1,2,6],newvalu:[0,6],next:[0,2,5],no_valu:[0,1,5,6],non:[0,1,2,6],none:[0,1,2,6],noqa:0,nor:1,normal:[0,2,6],note:[0,2,6],notimplementederror:[0,5],nov:1,novalu:0,now:[0,1,2,5,6],nullbackend:[0,1],nulllock:1,number:[0,2,6],object:[0,1,2,4,6],object_hook:5,observ:1,occur:[0,1,6],oct:1,off:2,offer:6,offload:5,often:2,old:[0,1,5],older:[0,2,6],olli:1,omit:0,onc:[0,1,2],one:[0,1,2,4,5,6],ones:[0,5],onli:[0,1,2,5,6],oper:[0,1,2,5,6],optimist:5,option:[0,1,6],order:[0,1,2,5,6],ordinari:0,org:[3,5],organ:1,orient:0,origin:[0,1,6],orm:4,other:[0,1,2,4,5,6],otherwis:[0,1,5,6],our:[2,5,6],out:[1,5],output:[1,2],outsid:[0,2,6],over:0,overid:[0,6],overrid:[0,5,6],overridden:6,overview:4,own:[0,2,4,5],packag:[0,1,2,3],packb:5,page:4,pair:2,param:0,paramet:[0,1,6],paramt:0,parent:[0,6],pars:1,part:[0,1,6],parti:0,particular:[0,1,2,5,6],particularli:6,pass:[0,1,2,5,6],passthrough:0,password:[0,1],past:0,patch:1,path:[0,2,6],pattern:6,paul:1,payload:[0,5,6],per:[0,1,2,6],perform:[0,1,2,5,6],period:[0,2,6],persist:[0,5,6],pickl:[0,1,5,6],pickleabl:0,pileup:1,pin:1,pip:3,place:[0,1,5,6],plain:[0,1],plan:1,platform:[0,1],plu:1,pluck:[0,6],pluggabl:1,plugin:[1,4,6],pluginload:1,pluginnotfound:[0,1],point:[0,1,5,6],pool:0,pop:[1,6],popul:[0,6],popular:6,port:0,portalock:0,portion:6,posit:1,possibl:[0,5,6],post:0,potenti:[1,5,6],pre:5,prefix:[0,4,6],present:[0,1,5,6],preserv:[1,5],prevent:[0,1,6],previou:[0,1,2,4,6],previous:[1,2],primari:2,print:5,prior:0,probabl:5,problem:1,problemat:0,proce:[0,1,2,4],process:[0,1,2,5,6],produc:[0,1,6],product:[1,6],project:[1,4],promptli:[0,6],propag:[0,1],properli:6,properti:0,protect:0,protocol:1,provid:[0,1,2,4,6],proxi:[5,6],proxybackend:[0,1,5,6],publish:3,pull:[0,1,5,6],pullreq:1,pure:0,purpos:[1,2,5],push:[0,5],put:[2,6],py2:1,py3k:1,pylibmc:[0,1,2,5],pylibmcbackend:0,pypa:1,pypi:3,pytest:1,python3:1,python:[0,1,2,3,5,6],queri:[0,5,6],queue:[0,6],rais:[0,1,2,5,6],ralph:1,rather:[0,2,6],raw:5,reach:[0,2,6],read:0,reader:[0,1],readi:[0,6],readwrite_lock:[0,1],readwritemutex:[0,1],real:6,receiv:[0,1,6],recent:3,recip:[1,2,4],recod:5,recogn:[0,1,6],recommend:[0,6],record:5,recreat:[0,6],redi:[1,4,6],redis_expiration_tim:0,redisbackend:[0,1],redundantli:6,reentrant:1,refer:[0,1,2,4],referenc:0,reflect:0,refresh:[0,1,5,6],regardless:[0,6],regen:0,regener:[0,1,2,6],region:[1,4,5],region_invalid:[0,6],regionalreadyconfigur:0,regioninvalidationstrategi:[0,1,6],regionnotconfigur:0,regist:[0,1,6],register_backend:6,registri:[0,5],regress:1,regular:0,rel:[0,6],relat:4,releas:[0,1,3,6],release_read_lock:0,release_write_lock:0,relev:[0,6],reli:[1,2],relianc:1,remain:[0,1],rememb:[0,6],remot:0,remov:[0,1,2,6],repair:1,replac:[0,1,5,6],replace_existing_backend:[0,1,6],report:[0,3,6],repositori:1,repres:[0,6],request:[0,1,6],requir:[0,1,2,4,6],reserv:2,resolv:[0,6],resourc:[2,4],respect:1,respons:[0,6],restor:1,result:[0,1,5,6],ret:0,retir:1,retri:6,retriev:[0,1,2,6],retrieve_resourc:2,retry_count:6,retry_proxi:6,retrydeleteproxi:6,revert:1,rewritten:1,roll:1,rosebaugh:1,rougher:6,round:2,routin:1,rudimentari:4,run:[0,1,6],runner:[0,1,6],runtim:6,rutherfurd:1,rw_lockfil:0,ryan:1,safe:[0,2,6],same:[0,1,2,6],sasl:0,sat:1,sauerwein:1,sauliu:1,scenario:1,scene:6,scheme:[1,2,5],scope:0,scoped_sess:5,scott:0,script:1,search:4,second:[0,1,2,6],section:[0,2,6],see:[0,1,2,6],select:[0,4],self:[0,5,6],semant:1,semaphor:0,send:1,sent:5,sep:1,separ:[0,1,2,6],sequenc:[0,5],seri:[1,5],serial:[0,1,5,6],serializ:6,serv:1,server:[0,2,6],servic:2,session:5,sessionmak:5,set:[0,1,5,6],set_argu:0,set_multi:[0,1,5],setup:[0,1,2,6],setuptool:[1,6],sever:[0,1],sha1:[0,2,6],sha1_mangle_kei:[0,1,6],share:[1,2,6],sheldon:1,should:[0,3,6],should_cache_fn:[0,1,6],sign:1,signatur:[0,1],similar:[0,1,3,6],simpl:[0,1,2,5,6],simpli:5,simultan:[0,6],sinc:[0,5,6],singl:[0,1,2,4,6],singleton:0,situat:1,size:[0,5],skip:[0,6],sleep:0,slow_databas:2,slower:1,small:[1,6],smaller:5,sobrinho:1,socket:0,socket_timeout:[0,1],soft:[0,1],some:[0,1,2,4,5,6],some_creation_funct:2,some_databas:6,some_kei:2,somedatabas:[0,6],somekei:[0,6],somemethod:[0,6],someregion:[0,6],something_new:5,somevalu:6,somewher:0,sourc:[0,1,2,6],space:6,special:1,specif:[0,1,4,6],specifi:[0,1,5,6],sqlalchemi:[1,3,5],stack:0,stale:[0,2,6],standard:0,start:[0,5,6],state:[0,1],statu:3,stegmann:1,step:[0,6],still:[0,1,2,5,6],storag:[1,5,6],store:[0,1,2,5,6],str:[0,1,5,6],straight:1,strategi:[0,1,2,6],strictredi:[0,1],string:[0,1,6],strongli:0,structur:[0,4,6],stuff:2,subclass:[0,1,6],submit:0,subsequ:[0,1,6],subset:0,subsitut:1,substitut:[0,6],subsystem:4,success:1,successfulli:2,suffix:0,suit:[0,1],suitabl:[0,6],sun:1,supersed:[0,6],suppli:[0,6],support:[0,1,6],suppos:[1,5],sure:[0,6],symbol:[1,2],symlink:2,synchron:[0,2],syncreaderdogpil:1,syntax:1,sys:6,system:[0,1,2,5,6],tag:0,take:[0,1,6],talk:[0,6],target:[0,5,6],task:[0,6],tcp_nodelai:0,techniqu:5,templat:[0,1,5],templatelookup:0,term:[0,6],test:[0,1,6],than:[0,2,5,6],thank:1,the_resourc:2,thei:[0,2,6],them:[0,1,5],therebi:1,therefor:[0,6],thi:[0,1,2,3,4,5,6],thing:[1,6],third:[0,5],those:[0,1,4,5,6],though:[0,1,6],thread:[0,1,2,4,5,6],threadmappedpool:2,threadsaf:[0,2],three:[0,5],threshold:0,throttl:0,through:[2,5],thrown:[0,1],thu:[0,1,2,6],tiger:0,tim:1,time:[0,1,2,6],timedelta:[0,1,6],timeout:[0,1],timestamp:[0,1,6],tmp:2,to_list:1,to_str:[0,1,6],tobia:1,togeth:[0,6],token:[0,6],tool:[0,3,6],top:4,total:0,total_second:1,toward:[0,1],tox:1,track:[0,2,5],tracker:3,transform:5,translat:5,trip:2,tue:1,tup:2,tupl:[0,2,6],turn:6,tweak:4,twice:2,two:[0,2,4,5,6],type:[0,6],typeerror:1,typic:[0,5,6],ultim:[0,1,2,6],unaffect:1,uncondition:[0,6],unconfigur:1,under:[0,1,5,6],underli:[0,6],underneath:[0,6],understood:0,undesir:0,unencod:5,unicod:[0,1,6],uninstanti:6,uniqu:[0,2,5],unit:1,unix:[0,1,2],unless:[0,2,6],unlik:[0,2],unlimit:0,unnecessari:[0,1],unnecessarili:1,unpackb:5,unsupport:1,until:[0,1,2,4,5,6],updat:[1,4],upon:[0,1,2,6],upstream:0,url:[0,1,5,6],usabl:6,usag:[0,1,4],use:[0,1,2,4,5,6],use_bin_typ:5,used:[0,1,2,5,6],user:[1,2,4,5,6],user_fn_on:5,user_fn_one_:5,user_fn_thre:5,user_fn_three_:5,user_fn_two:5,user_fn_two_:5,user_id:[5,6],user_kei:5,usernam:0,uses:[0,1,2,5,6],using:[0,1,2,5,6],usual:[1,2,6],utf:5,util:[1,4],valid:0,validationerror:0,valu:[0,1,2,5,6],value1:0,value2:0,value3:0,value_and_created_fn:0,value_decod:5,value_encod:5,value_plus_tim:2,value_vers:0,vanasco:1,variabl:1,variant:[0,1,5],varieti:4,variou:[0,2],vendor:1,verbos:6,veri:4,version:[0,1,2,3,4,6],versu:[0,6],via:[0,1,2,5,6],volum:4,wai:[0,1,5,6],wait:[0,1,6],want:[0,2,5,6],warn:1,was_hard_invalid:0,was_soft_invalid:0,wasn:1,wed:1,week:[0,6],well:[0,1,2,5,6],were:[0,1,6],what:[0,1,2],whatev:[0,6],when:[0,1,2,5,6],whenev:[0,6],where:[0,1,2,6],wherebi:1,whether:[0,1,6],which:[0,1,2,4,5,6],whole:1,whose:0,wichert:1,wide:1,window:[0,1],wish:0,with_stat:1,within:[0,1,5,6],without:[0,2,6],won:[0,2,6],work:[0,1,2,5],worker:6,would:[0,1,5,6],wrap:[0,1,5,6],write:[0,1,6],writer:[0,5,6],written:6,wrong:1,yank:1,yet:[0,1,6],you:[0,2,5,6],your:[0,2,5],zero:1,zip:0,zoomorph:1},titles:["API","Changelog","dogpile
 Core","Front Matter","Welcome to dogpile.cache\u2019s 
documentation!","Recipes","Usage 
Guide"],titleterms:{"null":0,Using:[2,6],all:5,anoth:5,api:[0,2],asynchron:5,backend:[0,6],behavior:6,bug:[1,3],cach:[2,4],chang:6,changelog:1,configur:6,core:[0,2],creat:6,data:5,decod:5,directli:2,distribut:2,document:4,dogpil:[0,2,4],encod:5,event:5,exampl:2,except:0,featur:1,file:[0,2],format:5,front:3,group:5,guid:6,homepag:3,indic:4,instal:3,integr:0,invalid:5,kei:5,learn:2,lock:2,mako:0,matter:3,memcach:0,memori:0,misc:1,need:2,note:5,orm:5,overview:6,plugin:0,prefix:5,project:3,proxi:0,pylibmc:6,recip:5,redi:[0,5],region:[0,6],relat:5,rudimentari:[2,6],tabl:4,updat:5,usag:[2,6],util:0,welcom:4}})
\ No newline at end of file
+Search.setIndex({docnames:["api","changelog","core_usage","front","index","recipes","usage"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["api.rst","changelog.rst","core_usage.rst","front.rst","index.rst","recipes.rst","usage.rst"],objects:{"dogpile.Lock.params":{async_creator:[0,1,1,""],creator:[0,1,1,""],expiretime:[0,1,1,""],mutex:[0,1,1,""],value_and_created_fn:[0,1,1,""]},"dogpile.cache":{api:[0,2,0,"-"],exception:[0,2,0,"-"],proxy:[0,2,0,"-"],region:[0,2,0,"-"]},"dogpile.cache.api":{CacheBackend:[0,0,1,""],CachedValue:[0,0,1,""],NO_VALUE:[0,5,1,""],NoValue:[0,0,1,""]},"dogpile.cache.api.CacheBackend":{"delete":[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_mutex:[0,3,1,""],key_mangler:[0,4,1,""],set:[0,3,1,""],set_multi:[0,3,1,""]},"dogpile.cache.api.CachedValue":{metadata:[0,3,1,""],payload:[0,3,1,""]},"dogpile.cache.backends":{"null":[0,2,0,"-"],file:[0,2,0,"-"],memcached:[0,2,0,"-"],memory:[0,2,0,"-"],redis:[0,2,0,"-"]},"dogpile.cache.backends.file":{AbstractFileLock:[0,0,1,""],DBMBackend:[0,0,1,""],FileLock:[0,0,1,""]},"dogpile.cache.backends.file.AbstractFileLock":{acquire:[0,3,1,""],acquire_read_lock:[0,3,1,""],acquire_write_lock:[0,3,1,""],is_open:[0,3,1,""],read:[0,3,1,""],release:[0,3,1,""],release_read_lock:[0,3,1,""],release_write_lock:[0,3,1,""],write:[0,3,1,""]},"dogpile.cache.backends.file.DBMBackend":{"delete":[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_mutex:[0,3,1,""],set:[0,3,1,""],set_multi:[0,3,1,""]},"dogpile.cache.backends.file.DBMBackend.params":{dogpile_lockfile:[0,1,1,""],filename:[0,1,1,""],lock_factory:[0,1,1,""],rw_lockfile:[0,1,1,""]},"dogpile.cache.backends.file.FileLock":{acquire_read_lock:[0,3,1,""],acquire_write_lock:[0,3,1,""],is_open:[0,3,1,""],release_read_lock:[0,3,1,""],release_write_lock:[0,3,1,""]},"dogpile.cache.backends.memcached":{BMemcachedBackend:[0,0,1,""],GenericMemcachedBackend:[0,0,1,""],MemcachedBackend:[0,0,1,""],MemcachedLock:[0,0,1,""],PylibmcBackend:[0,0,1,""]},"dogpile.cache.backends.memcached.BMemcachedBackend":{delete_multi:[0,3,1,""]},"dogpile.cache.backends.memcached.BMemcachedBackend.params":{password:[0,1,1,""],username:[0,1,1,""]},"dogpile.cache.backends.memcached.GenericMemcachedBackend":{"delete":[0,3,1,""],client:[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_mutex:[0,3,1,""],set:[0,3,1,""],set_arguments:[0,4,1,""],set_multi:[0,3,1,""]},"dogpile.cache.backends.memcached.GenericMemcachedBackend.params":{distributed_lock:[0,1,1,""],lock_timeout:[0,1,1,""],memcached_expire_time:[0,1,1,""],url:[0,1,1,""]},"dogpile.cache.backends.memcached.PylibmcBackend.params":{behaviors:[0,1,1,""],binary:[0,1,1,""],min_compress_len:[0,1,1,""]},"dogpile.cache.backends.memory":{MemoryBackend:[0,0,1,""],MemoryPickleBackend:[0,0,1,""]},"dogpile.cache.backends.memory.MemoryBackend":{"delete":[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],set:[0,3,1,""],set_multi:[0,3,1,""]},"dogpile.cache.backends.null":{NullBackend:[0,0,1,""]},"dogpile.cache.backends.null.NullBackend":{"delete":[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_mutex:[0,3,1,""],set:[0,3,1,""],set_multi:[0,3,1,""]},"dogpile.cache.backends.redis":{RedisBackend:[0,0,1,""]},"dogpile.cache.backends.redis.RedisBackend":{"delete":[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_mutex:[0,3,1,""],set:[0,3,1,""],set_multi:[0,3,1,""]},"dogpile.cache.backends.redis.RedisBackend.params":{connection_pool:[0,1,1,""],db:[0,1,1,""],distributed_lock:[0,1,1,""],host:[0,1,1,""],lock_sleep:[0,1,1,""],lock_timeout:[0,1,1,""],password:[0,1,1,""],port:[0,1,1,""],redis_expiration_time:[0,1,1,""],socket_timeout:[0,1,1,""],url:[0,1,1,""]},"dogpile.cache.exception":{DogpileCacheException:[0,6,1,""],PluginNotFound:[0,6,1,""],RegionAlreadyConfigured:[0,6,1,""],RegionNotConfigured:[0,6,1,""],ValidationError:[0,6,1,""]},"dogpile.cache.plugins":{mako_cache:[0,2,0,"-"]},"dogpile.cache.plugins.mako_cache":{MakoPlugin:[0,0,1,""]},"dogpile.cache.plugins.mako_cache.MakoPlugin":{get:[0,3,1,""],get_or_create:[0,3,1,""],invalidate:[0,3,1,""]},"dogpile.cache.plugins.mako_cache.MakoPlugin.get.params":{"**kw":[0,1,1,""],key:[0,1,1,""]},"dogpile.cache.plugins.mako_cache.MakoPlugin.get_or_create.params":{"**kw":[0,1,1,""],creation_function:[0,1,1,""],key:[0,1,1,""]},"dogpile.cache.plugins.mako_cache.MakoPlugin.invalidate.params":{"**kw":[0,1,1,""],key:[0,1,1,""]},"dogpile.cache.proxy":{ProxyBackend:[0,0,1,""]},"dogpile.cache.proxy.ProxyBackend":{"delete":[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_mutex:[0,3,1,""],set:[0,3,1,""],set_multi:[0,3,1,""],wrap:[0,3,1,""]},"dogpile.cache.region":{CacheRegion:[0,0,1,""],DefaultInvalidationStrategy:[0,0,1,""],RegionInvalidationStrategy:[0,0,1,""],make_region:[0,7,1,""],value_version:[0,5,1,""]},"dogpile.cache.region.CacheRegion":{"delete":[0,3,1,""],actual_backend:[0,3,1,""],cache_multi_on_arguments:[0,3,1,""],cache_on_arguments:[0,3,1,""],configure:[0,3,1,""],configure_from_config:[0,3,1,""],delete_multi:[0,3,1,""],get:[0,3,1,""],get_multi:[0,3,1,""],get_or_create:[0,3,1,""],get_or_create_multi:[0,3,1,""],invalidate:[0,3,1,""],is_configured:[0,3,1,""],set:[0,3,1,""],set_multi:[0,3,1,""],wrap:[0,3,1,""]},"dogpile.cache.region.CacheRegion.cache_multi_on_arguments.params":{asdict:[0,1,1,""],expiration_time:[0,1,1,""],function_multi_key_generator:[0,1,1,""],namespace:[0,1,1,""],should_cache_fn:[0,1,1,""],to_str:[0,1,1,""]},"dogpile.cache.region.CacheRegion.cache_on_arguments.params":{expiration_time:[6,1,1,""],function_key_generator:[6,1,1,""],namespace:[6,1,1,""],should_cache_fn:[6,1,1,""],to_str:[6,1,1,""]},"dogpile.cache.region.CacheRegion.configure.params":{arguments:[6,1,1,""],backend:[6,1,1,""],expiration_time:[6,1,1,""],region_invalidator:[6,1,1,""],replace_existing_backend:[6,1,1,""],wrap:[6,1,1,""]},"dogpile.cache.region.CacheRegion.get.params":{expiration_time:[6,1,1,""],ignore_expiration:[6,1,1,""],key:[6,1,1,""]},"dogpile.cache.region.CacheRegion.get_or_create.params":{creator:[6,1,1,""],creator_args:[6,1,1,""],expiration_time:[6,1,1,""],key:[6,1,1,""],should_cache_fn:[6,1,1,""]},"dogpile.cache.region.CacheRegion.get_or_create_multi.params":{creator:[0,1,1,""],expiration_time:[0,1,1,""],keys:[0,1,1,""],should_cache_fn:[0,1,1,""]},"dogpile.cache.region.CacheRegion.invalidate.params":{hard:[0,1,1,""]},"dogpile.cache.region.CacheRegion.params":{async_creation_runner:[6,1,1,""],function_key_generator:[6,1,1,""],function_multi_key_generator:[6,1,1,""],key_mangler:[6,1,1,""],name:[6,1,1,""]},"dogpile.cache.region.DefaultInvalidationStrategy":{invalidate:[0,3,1,""],is_hard_invalidated:[0,3,1,""],is_invalidated:[0,3,1,""],is_soft_invalidated:[0,3,1,""],was_hard_invalidated:[0,3,1,""],was_soft_invalidated:[0,3,1,""]},"dogpile.cache.region.RegionInvalidationStrategy":{invalidate:[0,3,1,""],is_hard_invalidated:[0,3,1,""],is_invalidated:[0,3,1,""],is_soft_invalidated:[0,3,1,""],was_hard_invalidated:[0,3,1,""],was_soft_invalidated:[0,3,1,""]},"dogpile.cache.util":{function_key_generator:[0,7,1,""],kwarg_function_key_generator:[0,7,1,""],length_conditional_mangler:[0,7,1,""],sha1_mangle_key:[0,7,1,""]},"dogpile.util":{NameRegistry:[0,0,1,""],ReadWriteMutex:[0,0,1,""]},"dogpile.util.NameRegistry":{get:[0,3,1,""]},"dogpile.util.NameRegistry.get.params":{"**kw":[0,1,1,""],identifier:[0,1,1,""]},"dogpile.util.NameRegistry.params":{creator:[0,1,1,""]},"dogpile.util.ReadWriteMutex":{acquire_read_lock:[0,3,1,""],acquire_write_lock:[0,3,1,""],release_read_lock:[0,3,1,""],release_write_lock:[0,3,1,""]},dogpile:{Lock:[0,0,1,""],NeedRegenerationException:[0,0,1,""]}},objnames:{"0":["py","class","Python
 class"],"1":["py","parameter","Python parameter"],"2":["py","module","Python 
module"],"3":["py","method","Python method"],"4":["py","attribute","Python 
attribute"],"5":["py","data","Python data"],"6":["py","exception","Python 
exception"],"7":["py","function","Python 
function"]},objtypes:{"0":"py:class","1":"py:parameter","2":"py:module","3":"py:method","4":"py:attribute","5":"py:data","6":"py:exception","7":"py:function"},terms:{"2to3":1,"53def077a4264bd3183d4eb21b1f56f883e1b572":2,"\u0142ukasz":1,"abstract":1,"boolean":[0,1],"byte":1,"case":[0,1,2,5,6],"class":[0,1,2,5,6],"default":[0,1,5,6],"final":[0,6],"float":[0,1],"function":[0,1,2,5,6],"import":[0,1,2,5,6],"int":1,"long":[0,1,6],"menkevi\u010diu":1,"new":[0,1,2,4,5,6],"null":1,"return":[0,1,2,5,6],"short":2,"st\u00e9phane":1,"super":6,"true":[0,1,5,6],"try":[0,5,6],"while":[0,1,4,5,6],Added:[0,1,6],For:[0,2,6],NFS:2,One:[0,6],Such:[0,6],The:[0,1,2,3,5,6],Then:6,There:[0,2],These:6,Use:[0,1],Used:[0,6],Using:[1,4,5],With:[0,6],__future__:1,__init__:[0,6],__main__:6,__name__:[0,5,6],__repr__:1,_config_argument_dict:[0,6],_config_prefix:[0,6],_encodedproxi:5,_hard_invalid:0,_soft_invalid:0,abil:0,about:3,abov:[0,2,5,6],abstractfilelock:[0,1],accept:[0,1,6],access:[0,1,2,6],accessor:[0,1],accomplish:2,account:[0,1],acheiv:5,acquir:[0,1,6],acquire_read_lock:0,acquire_write_lock:0,across:[0,1,2],act:2,actual:[0,1,2,5,6],actual_backend:[0,1],adapt:[0,4],add:[1,5],add_new_data:5,added:[0,1,6],addit:[0,1,2,6],addition:[1,4],address:2,adjust:[1,4],advantag:0,adventag:6,affect:[0,6],after:[0,1,5,6],after_commit:5,again:[0,2,6],against:[0,1,2,6],ahead:2,akkerman:1,alert:2,alexand:1,all:[0,1,2,4,6],allow:[0,1,2,4,6],along:[2,5],alpha:1,alphabet:0,alreadi:[0,1,6],also:[0,1,2,5,6],alter:[0,6],altern:[0,6],although:1,alwai:[0,6],amix:0,among:6,analogu:0,anderson:1,anentrop:1,ani:[0,1,2,4,6],ankitpatel96:1,anoth:[0,1,2,4,6],answer:2,anticip:2,antoin:1,anydbm:0,anyth:6,api:[1,4,5,6],app:1,appar:1,appear:0,append:[0,5],appli:[0,1,5,6],applic:[0,2,4,6],approach:[0,1,2,5,6],appropri:[0,6],approxim:2,apr:1,araujo:1,arbitrari:0,aren:0,arg:[0,5,6],argnam:0,argspec:0,argument:[0,1,2,5,6],argvalu:0,around:[0,2],ascii:[0,6],asdict:[0,1],ask:0,assembl:0,assert:5,associ:[0,5,6],assum:[0,1],async:1,async_cr:[0,6],async_creation_runn:[0,1,5,6],asynchron:[0,1,4,6],attach:0,attempt:[0,6],attribut:[0,6],aug:1,augment:[0,1,6],authent:0,automat:0,avail:[0,1,3,4,5,6],avoid:[1,5],awar:[0,5,6],azoff:1,back:[0,1],backend:[1,2,4,5],background:[0,5,6],backward:0,base:[0,1,2,5,6],basi:[0,1,6],basic:[0,6],basicconfig:6,baton:2,beaker:[0,2],bean:1,becom:[0,6],been:[0,1,2,5,6],befor:[0,1,2,6],behalf:6,behav:0,behavior:[0,1,4,5],behind:6,being:[0,1,5,6],beitei:1,below:[0,5,6],ben:1,bertin:1,besid:5,best:0,between:[0,6],beyond:1,binari:0,bit:6,block:[0,2,4,5,6],blog:0,bmemcach:[0,1],bmemcachedbackend:0,bookkeep:5,bool:0,both:[0,1],bother:6,brian:1,brown:1,brunner:1,bsddb:[0,6],bug:4,build:[0,1,2,4,5],built:[0,6],builtin:[0,6],bypass:[0,1,6],bytestr:[0,1,6],cach:[0,1,3,5,6],cache_arg:0,cache_dict:0,cache_impl:0,cache_multi_on_argu:[0,1,6],cache_on_argu:[0,1,5,6],cache_refresh:5,cache_region:0,cache_timeout:1,cachebackend:[0,6],cachedvalu:[0,5,6],cachefil:0,cacheimpl:0,cacheregion:[0,1,5,6],calcul:1,call:[0,1,2,5,6],callabl:[0,1,5,6],caller:0,can:[0,1,2,5,6],cannot:[0,1,6],categori:2,caus:1,caveat:[0,6],celeri:[0,6],certain:[0,6],chain:[0,6],chang:[0,1,2,4,5],changelog:4,check:[0,1,2,6],choos:0,christian:1,circumst:6,client:[0,1,2,5,6],client_fn:0,cls:[0,6],code:[0,2,5],coerc:[0,1,6],coerce_string_conf:1,coercion:1,collect:0,collis:5,com:[1,3],combin:[0,6],command:1,commit:5,common:[0,1,2,6],commun:1,compar:[0,6],compat:[0,1],compatbl:1,complement:1,complet:[0,2],compon:6,comput:[0,6],concept:[0,2,4],concern:5,concret:0,concurr:[0,2,6],condit:[0,1],condition:[0,6],conf:1,config:[0,1,6],config_dict:[0,6],configur:[0,1,4,5],configure_from_config:[0,1,6],conjunct:[0,1,6],connect:[0,1],connection_pool:[0,1],connectionpool:[0,1],consid:[0,1,6],consist:[4,6],constant:1,construct:[0,1,6],constructor:[0,6],consult:[0,6],contain:[0,5,6],content:0,context:[0,2],continu:[0,1,2],contribut:1,control:4,conveni:[0,6],convert:[0,6],coordin:[0,2,6],copi:[0,1],core:[1,4,6],correct:[0,6],correctli:1,correspond:0,could:[0,1,5],count:5,counter:5,courtesi:1,cover:1,cpickl:0,creat:[0,1,2,4],create_some_resourc:2,create_valu:[0,6],createdtim:2,creation:[0,1,2,4,6],creation_funct:0,creation_tim:0,creationtim:2,creator:[0,1,4,6],creator_arg:[0,1,6],critic:1,cross:2,current:[0,1,2,6],custom:[0,1,5,6],custominvalidationstrategi:0,customiz:1,cutom:0,d_arg1_arg2_arg3:5,daemon:5,dai:[0,6],dairiki:1,daniel:1,data:[0,4,6],databas:5,date:[0,1,6],datetim:[0,1,6],david:1,dbclass:5,dbm:[0,1,6],dbmbackend:[0,1],dbmfile:[0,6],deadlock:1,deal:0,debug:[1,6],dec:1,declar:[0,6],decod:4,decor:[0,1,2,5,6],def:[0,2,5,6],defaultinvalidationstrategi:0,defer:[0,2,6],defin:[5,6],delai:5,deleg:0,delet:[0,1,5,6],delete_multi:[0,1],deliv:1,depend:[0,1,6],deprec:1,deriv:[0,6],describ:[0,2,6],descriptor:0,deseri:0,design:[2,6],desir:0,destruct:1,detail:[0,6],detect:[0,6],determin:[0,1,6],dev:1,develop:1,dict:[0,5],dictionari:[0,1,6],dictionarybackend:6,did:[1,6],didn:1,differ:[0,1,2,5,6],digest:2,direct:[0,1,5],directli:[0,1,4,6],directori:[0,1],disabl:[0,1,6],disambigu:[0,6],disappear:2,discard:0,distinguish:[0,6],distribut:[0,1,4],distributed_lock:[0,1,6],do_refresh:5,do_someth:2,doc:1,document:[0,1,3],doe:[0,1,5,6],doesn:[0,2],dogpil:[1,3,5,6],dogpile_lockfil:0,dogpilecach:3,dogpilecacheexcept:0,doing:0,don:[0,1],done:5,dont_cache_non:[0,6],down:[0,6],drop:[0,1],due:1,dump:1,dure:[0,1,2],dynam:[0,1,6],each:[0,1,2,5,6],easi:4,easier:6,easili:[5,6],edg:6,ef206ed4473fec3b639:1,effect:0,effici:2,effort:1,either:[0,1,5,6],elect:0,elimin:6,els:[0,2],emit:[1,6],emploi:1,empti:1,enabl:1,encapsul:2,encod:4,encourag:4,end:[0,1,2,6],enhanc:[1,3],enough:0,ensur:[1,2],enter:5,entir:[0,1,6],entri:1,entry_point:6,entrypoint:[0,1,6],environ:[0,4],equival:[0,1,6],eric:1,errant:1,erron:1,error:[0,1],establish:[0,1,6],etc:[0,1],evalu:[0,6],even:[0,1],event:[1,4,6],everi:[1,2],everyth:5,exact:1,exampl:[0,1,4,5,6],excel:6,except:[1,4,5,6],exception:5,excess:1,execut:4,exist:[0,1,2,6],existing_valu:0,expand:1,expect:2,expedi:5,expens:[0,2,6],expir:[0,1,2,6],expiration_tim:[0,1,2,5,6],expiretim:0,expiri:0,explicitli:0,expos:1,extend:[0,5,6],extra:[0,6],face:1,facil:6,facilil:1,fact:[0,6],fail:[0,1],failur:1,fainberg:1,fall:2,fallback:1,fals:[0,1,5,6],far:2,faster:6,favor:1,fcntl:0,featur:[0,3,6],feb:1,fedorov:1,fidosz:1,field:1,file:[1,4,6],filelock:[0,1,2],filenam:[0,2,6],filesystem:[0,2],filter:5,finish:[0,2,6],first:[0,1,2,6],fix:[0,1,6],flag:[0,1,6],flock:[0,1,2],flufl:2,fly:5,fname:[0,5,6],fname_:5,focus:6,follow:[0,2,6],foo1:0,foo:[0,6],forc:[0,1],foremost:6,form:[0,1,6],format:[0,1,4],former:0,found:[0,6],frequent:1,fri:1,frit:1,from:[0,1,2,3,5,6],from_url:[0,1],front:[0,2,4,6],full:1,fulli:1,function_key_gener:[0,1,5,6],function_multi_key_gener:[0,1,6],futur:[0,1,6],garbag:0,gdbm:1,gen:[0,6],gen_cach:2,gener:[0,1,2,4,5,6],generate_kei:[0,5,6],generate_my_expensive_valu:2,generate_someth:[0,6],genericmemachedbackend:0,genericmemcachedbackend:[0,1],get:[0,1,2,5,6],get_multi:[0,1,5,6],get_mutex:0,get_or_cr:[0,1,6],get_or_create_multi:[0,1,5,6],get_some_data:5,get_valu:2,getargspec:1,getfullargspec:1,getlogg:6,getter:[0,1],git:1,github:[1,3],given:[0,1,2,5,6],glitch:1,global:[0,2],goe:[0,2],good:[2,5],great:1,greater:0,group:4,guard:1,guid:4,had:1,hanchrow:1,hand:[0,6],handl:0,hanu:1,happen:5,hard:[0,1,5,6],has:[0,1,2,5,6],has_valu:0,hash:[0,6],hashlib:2,have:[0,1,2,5,6],hayden:1,hbccbh:1,head:1,held:0,help:[0,5,6],helper:6,henc:6,here:[0,2,6],hex:2,hexdigest:2,high:[1,4,6],highest_protocol:[0,1],hit:[0,5],hoc:[2,6],homepag:4,hongbin:1,honor:[0,1],hood:5,hook:[4,5],hope:5,host:[0,1,3],hour:0,how:[0,2,6],howev:[0,1,2,5,6],http:[0,1,3,5],idea:[2,5],idempot:[0,6],identifi:[0,6],ignor:[0,1,6],ignore_expir:[0,1,6],illustr:[0,2,6],immedi:[0,6],impact:0,implement:[0,1,5,6],impli:[0,2],implicitli:1,improv:[0,1,5],includ:[0,1,6],incom:[0,1,6],incompat:[0,1],incur:0,index:[3,4],indic:[0,1,6],indirectli:2,individu:0,info:1,inform:[0,3,6],inher:0,inherit:[0,5],ini:1,initi:[0,1,2,6],inject:0,insid:[0,6],inspect:1,instal:[1,4,6],instanc:[0,1,2,5,6],instant:6,instanti:[0,5,6],instead:[1,2,5],instruct:6,integ:[0,1,5,6],integr:4,intend:1,intent:0,interfac:[0,2,4,6],intern:[0,1,2,6],interpret:[0,1,6],invalid:[0,1,4,6],invalidate_user_id:5,invoc:[0,2],invok:[0,2,6],involv:0,is_configur:[0,1],is_hard_invalid:0,is_invalid:0,is_open:0,is_soft_invalid:0,is_unittest:1,isinst:5,isn:[0,1,6],issu:[1,2,3,6],item:0,iteritem:5,itertool:5,its:[0,1,2,4,6],itself:[0,1,2,6],jack:1,jami:1,jan:1,jeff:1,jimmei:1,job:0,john:1,join:[0,2,5,6],jon:1,jonathan:1,json:5,jul:1,juli:1,jun:1,just:[0,2,5,6],justin:1,keep:[0,2],kei:[0,1,2,4,6],ketama:0,key1:0,key2:0,key3:0,key_mangl:[0,1,5,6],key_templ:5,keyerror:1,keyreentrantmutex:1,keyword:[0,1,6],kind:[0,6],klinger:1,know:5,kolak:1,krau:1,kwarg:[0,5,6],kwarg_function_key_gener:[0,1,6],lambda:5,larger:0,last:[0,6],lastli:[0,6],later:[0,6],latter:0,lead:[1,5],learn:4,least:[0,2,5],leav:5,left:0,length:[0,1,6],length_conditional_mangl:0,lennox:1,less:1,level:[0,1,2,6],lib:0,librari:[0,1,6],life:6,like:[0,1,2,5,6],link:[0,5],list:[0,1,6],listens_for:5,load:[0,1,6],load_user_info:6,local:[0,2,5,6],local_region:[0,6],localhost:[0,2],locat:[1,6],lock:[0,1,4,6],lock_factori:[0,1],lock_path:2,lock_sleep:[0,1],lock_timeout:[0,1],lockfil:[0,2],log:[1,4],loggingproxi:6,logic:0,longer:1,look:6,lookup:[0,2],lookup_user_by_id:6,lose:1,lot:4,lutz:1,mabei:1,made:[0,1,2],magnitud:1,mai:[0,1,2,5,6],main:5,maintain:1,makarov:1,make:[0,1,2,6],make_region:[0,5,6],mako:1,mako_cach:[0,1],mako_lookup:0,makoplugin:0,manag:[0,2,5,6],mangl:[0,1,5,6],mangler:[0,1,5,6],mani:[1,6],map:[0,1,5],mapping_set:5,mar:1,marco:1,markedli:6,masayuko:1,match:[0,1],matter:4,mc_pool:2,mean:[0,1,5,6],mechan:[0,1,4,6],memcach:[1,2,6],memcached_expire_tim:[0,1],memcached_region:[0,6],memcachedbackend:0,memcachedlock:0,memoized_properti:1,memori:[1,5],memory_pickl:0,memorybackend:[0,1],memorypickl:1,memorypicklebackend:[0,1],messag:[1,6],metadata:[0,5,6],method:[0,1,5,6],might:[0,6],min_compress_len:[0,1],mind:6,minim:5,minimum:[0,1],minu:2,miss:[0,1,6],moc:[0,6],mode:[0,6],model:6,modern:0,modifi:0,modul:[0,1,4,6],modulu:0,moment:5,mon:1,more:[0,1,2,6],morgan:1,most:[0,2,3],move:1,msgpack:5,msgpackproxi:5,much:5,multipl:[0,1,2,6],multithread:[0,6],multivalu:1,must:[0,1],mutex:[0,2,6],mutexlock:0,my_data:[0,6],my_dictionari:0,my_foo:0,my_funct:[0,6],my_key_gener:[0,5,6],my_multi_key_gener:[0,6],my_region:[0,6],myapp:[0,5,6],mybackend:6,myclass:[0,6],myconfig:[0,6],myfirstproxi:0,myfoo:0,myinvalid:0,myotherclass:[0,6],mypackag:6,myregion:6,mysecondproxi:0,mysect:0,name:[0,1,6],nameregistri:[0,1],namespac:[0,1,5,6],nativ:6,necessari:5,necessarili:[0,1,6],need:[0,1,4,5,6],needregenerationexcept:[0,2],neg:1,negat:5,nest:5,never:0,new_valu:0,newli:[0,1,2,6],newvalu:[0,6],next:[0,2,5],no_valu:[0,1,5,6],non:[0,1,2,6],none:[0,1,2,6],noqa:0,nor:1,normal:[0,2,6],note:[0,2,6],notimplementederror:[0,5],nov:1,novalu:0,now:[0,1,2,5,6],nullbackend:[0,1],nulllock:1,number:[0,2,6],object:[0,1,2,4,6],object_hook:5,observ:1,occur:[0,1,6],oct:1,off:2,offer:6,offload:5,often:2,old:[0,1,5],older:[0,2,6],olli:1,omit:0,onc:[0,1,2],one:[0,1,2,4,5,6],ones:[0,5],onli:[0,1,2,5,6],oper:[0,1,2,5,6],optimist:5,option:[0,1,6],order:[0,1,2,5,6],ordinari:0,org:[3,5],organ:1,orient:0,origin:[0,1,6],orm:4,other:[0,1,2,4,5,6],otherwis:[0,1,5,6],our:[2,5,6],out:[1,5],output:[1,2],outsid:[0,2,6],over:0,overid:[0,6],overrid:[0,5,6],overridden:6,overview:4,own:[0,2,4,5],packag:[0,1,2,3],packb:5,page:4,pair:2,param:0,paramet:[0,1,6],paramt:0,parent:[0,6],pars:1,part:[0,1,6],parti:0,particular:[0,1,2,5,6],particularli:6,pass:[0,1,2,5,6],passthrough:0,password:[0,1],past:0,patch:1,path:[0,2,6],pattern:6,paul:1,payload:[0,5,6],per:[0,1,2,6],perform:[0,1,2,5,6],period:[0,2,6],persist:[0,5,6],pickl:[0,1,5,6],pickleabl:0,pileup:1,pin:1,pip:3,place:[0,1,5,6],plain:[0,1],plan:1,platform:[0,1],plu:1,pluck:[0,6],pluggabl:1,plugin:[1,4,6],pluginload:1,pluginnotfound:[0,1],point:[0,1,5,6],pool:0,pop:[1,6],popul:[0,6],popular:6,port:0,portalock:0,portion:6,posit:1,possibl:[0,5,6],post:0,potenti:[1,5,6],pre:5,prefix:[0,4,6],present:[0,1,5,6],preserv:[1,5],prevent:[0,1,6],previou:[0,1,2,4,6],previous:[1,2],primari:2,print:5,prior:0,probabl:5,problem:1,problemat:0,proce:[0,1,2,4],process:[0,1,2,5,6],produc:[0,1,6],product:[1,6],project:[1,4],promptli:[0,6],propag:[0,1],properli:6,properti:0,protect:0,protocol:1,provid:[0,1,2,4,6],proxi:[5,6],proxybackend:[0,1,5,6],publish:3,pull:[0,1,5,6],pullreq:1,pure:0,purpos:[1,2,5],push:[0,5],put:[2,6],py2:1,py3k:1,pylibmc:[0,1,2,5],pylibmcbackend:0,pypa:1,pypi:3,pytest:1,python3:1,python:[0,1,2,3,5,6],queri:[0,5,6],queue:[0,6],rais:[0,1,2,5,6],ralph:1,rather:[0,2,6],raw:5,reach:[0,2,6],read:0,reader:[0,1],readi:[0,6],readwrite_lock:[0,1],readwritemutex:[0,1],real:6,receiv:[0,1,6],recent:3,recip:[1,2,4],recod:5,recogn:[0,1,6],recommend:[0,6],record:5,recreat:[0,6],redi:[1,4,6],redis_expiration_tim:0,redisbackend:[0,1],redundantli:6,reentrant:1,refer:[0,1,2,4],referenc:0,reflect:0,refresh:[0,1,5,6],regardless:[0,6],regen:0,regener:[0,1,2,6],region:[1,4,5],region_invalid:[0,6],regionalreadyconfigur:0,regioninvalidationstrategi:[0,1,6],regionnotconfigur:0,regist:[0,1,6],register_backend:6,registri:[0,5],regress:1,regular:0,rel:[0,6],relat:4,releas:[0,1,3,6],release_read_lock:0,release_write_lock:0,relev:[0,6],reli:[1,2],relianc:1,remain:[0,1],rememb:[0,6],remot:0,remov:[0,1,2,6],repair:1,replac:[0,1,5,6],replace_existing_backend:[0,1,6],report:[0,3,6],repositori:1,repres:[0,6],request:[0,1,6],requir:[0,1,2,4,6],reserv:2,resolv:[0,6],resourc:[2,4],respect:1,respons:[0,6],restor:1,result:[0,1,5,6],ret:0,retir:1,retri:6,retriev:[0,1,2,6],retrieve_resourc:2,retry_count:6,retry_proxi:6,retrydeleteproxi:6,revert:1,rewritten:1,roll:1,rosebaugh:1,rougher:6,round:2,routin:1,rudimentari:4,run:[0,1,6],runner:[0,1,6],runtim:6,rutherfurd:1,rw_lockfil:0,ryan:1,safe:[0,2,6],same:[0,1,2,6],sasl:0,sat:1,sauerwein:1,sauliu:1,scenario:1,scene:6,scheme:[1,2,5],scope:0,scoped_sess:5,scott:0,script:1,search:4,second:[0,1,2,6],section:[0,2,6],see:[0,1,2,6],select:[0,4],self:[0,5,6],semant:1,semaphor:0,send:1,sent:5,sep:1,separ:[0,1,2,6],sequenc:[0,5],seri:[1,5],serial:[0,1,5,6],serializ:6,serv:1,server:[0,2,6],servic:2,session:5,sessionmak:5,set:[0,1,5,6],set_argu:0,set_multi:[0,1,5],setlevel:6,setup:[0,1,2,6],setuptool:[1,6],sever:[0,1],sha1:[0,2,6],sha1_mangle_kei:[0,1,6],share:[1,2,6],sheldon:1,should:[0,3,6],should_cache_fn:[0,1,6],sign:1,signatur:[0,1],similar:[0,1,3,6],simpl:[0,1,2,5,6],simpli:5,simultan:[0,6],sinc:[0,5,6],singl:[0,1,2,4,6],singleton:0,situat:1,size:[0,5],skip:[0,6],sleep:0,slow_databas:2,slower:1,small:[1,6],smaller:5,sobrinho:1,socket:0,socket_timeout:[0,1],soft:[0,1],some:[0,1,2,4,5,6],some_creation_funct:2,some_databas:6,some_kei:2,somedatabas:[0,6],somekei:[0,6],somemethod:[0,6],someregion:[0,6],something_new:5,somevalu:6,somewher:0,sourc:[0,1,2,6],space:6,special:1,specif:[0,1,4,6],specifi:[0,1,5,6],spent:6,sqlalchemi:[1,3,5],stack:0,stale:[0,2,6],standard:0,start:[0,5,6],state:[0,1],statu:3,stegmann:1,step:[0,6],still:[0,1,2,5,6],storag:[1,5,6],store:[0,1,2,5,6],str:[0,1,5,6],straight:1,strategi:[0,1,2,6],strictredi:[0,1],string:[0,1,6],strongli:0,structur:[0,4,6],stuff:2,subclass:[0,1,6],submit:0,subsequ:[0,1,6],subset:0,subsitut:1,substitut:[0,6],subsystem:4,success:1,successfulli:2,suffix:0,suit:[0,1],suitabl:[0,6],sun:1,supersed:[0,6],suppli:[0,6],support:[0,1,6],suppos:[1,5],sure:[0,6],symbol:[1,2],symlink:2,synchron:[0,2],syncreaderdogpil:1,syntax:1,sys:6,system:[0,1,2,5,6],tag:0,take:[0,1,6],talk:[0,6],target:[0,5,6],task:[0,6],tcp_nodelai:0,techniqu:5,templat:[0,1,5],templatelookup:0,term:[0,6],test:[0,1,6],than:[0,2,5,6],thank:1,the_resourc:2,thei:[0,2,6],them:[0,1,5],therebi:1,therefor:[0,6],thi:[0,1,2,3,4,5,6],thing:[1,6],third:[0,5],those:[0,1,4,5,6],though:[0,1,6],thread:[0,1,2,4,5,6],threadmappedpool:2,threadsaf:[0,2],three:[0,5],threshold:0,throttl:0,through:[2,5],thrown:[0,1],thu:[0,1,2,6],tiger:0,tim:1,time:[0,1,2,6],timedelta:[0,1,6],timeout:[0,1],timestamp:[0,1,6],tmp:2,to_list:1,to_str:[0,1,6],tobia:1,togeth:[0,6],token:[0,6],tool:[0,3,6],top:4,total:0,total_second:1,toward:[0,1],tox:1,track:[0,2,5],tracker:3,transform:5,translat:5,trip:2,tue:1,tup:2,tupl:[0,2,6],turn:6,tweak:4,twice:2,two:[0,2,4,5,6],type:[0,6],typeerror:1,typic:[0,5,6],ultim:[0,1,2,6],unaffect:1,uncondition:[0,6],unconfigur:1,under:[0,1,5,6],underli:[0,6],underneath:[0,6],understood:0,undesir:0,unencod:5,unicod:[0,1,6],uninstanti:6,uniqu:[0,2,5],unit:1,unix:[0,1,2],unless:[0,2,6],unlik:[0,2],unlimit:0,unnecessari:[0,1],unnecessarili:1,unpackb:5,unsupport:1,until:[0,1,2,4,5,6],updat:[1,4],upon:[0,1,2,6],upstream:0,url:[0,1,5,6],usabl:6,usag:[0,1,4],use:[0,1,2,4,5,6],use_bin_typ:5,used:[0,1,2,5,6],user:[1,2,4,5,6],user_fn_on:5,user_fn_one_:5,user_fn_thre:5,user_fn_three_:5,user_fn_two:5,user_fn_two_:5,user_id:[5,6],user_kei:5,usernam:0,uses:[0,1,2,5,6],using:[0,1,2,5,6],usual:[1,2,6],utf:5,util:[1,4],valid:0,validationerror:0,valu:[0,1,2,5,6],value1:0,value2:0,value3:0,value_and_created_fn:0,value_decod:5,value_encod:5,value_plus_tim:2,value_vers:0,vanasco:1,variabl:1,variant:[0,1,5],varieti:4,variou:[0,2],vendor:1,verbos:6,veri:[1,4],version:[0,1,2,3,4,6],versu:[0,6],via:[0,1,2,5,6],volum:[1,4],wai:[0,1,5,6],wait:[0,1,6],want:[0,2,5,6],warn:1,was_hard_invalid:0,was_soft_invalid:0,wasn:1,wed:1,week:[0,6],well:[0,1,2,5,6],were:[0,1,6],what:[0,1,2],whatev:[0,6],when:[0,1,2,5,6],whenev:[0,6],where:[0,1,2,6],wherebi:1,whether:[0,1,6],which:[0,1,2,4,5,6],whole:1,whose:0,wichert:1,wide:1,window:[0,1],wish:0,with_stat:1,within:[0,1,5,6],without:[0,2,6],won:[0,2,6],work:[0,1,2,5],worker:6,would:[0,1,5,6],wrap:[0,1,5,6],write:[0,1,6],writer:[0,5,6],written:6,wrong:1,yank:1,yet:[0,1,6],you:[0,2,5,6],your:[0,2,5],zero:1,zip:0,zoomorph:1},titles:["API","Changelog","dogpile
 Core","Front Matter","Welcome to dogpile.cache\u2019s 
documentation!","Recipes","Usage 
Guide"],titleterms:{"null":0,Using:[2,6],all:5,anoth:5,api:[0,2],asynchron:5,backend:[0,6],behavior:6,bug:[1,3],cach:[2,4],chang:6,changelog:1,configur:6,core:[0,2],creat:6,data:5,decod:5,directli:2,distribut:2,document:4,dogpil:[0,2,4],encod:5,event:5,exampl:2,except:0,featur:1,file:[0,2],format:5,front:3,group:5,guid:6,homepag:3,indic:4,instal:3,integr:0,invalid:5,kei:5,learn:2,lock:2,log:6,mako:0,matter:3,memcach:0,memori:0,misc:1,need:2,note:5,orm:5,overview:6,plugin:0,prefix:5,project:3,proxi:0,pylibmc:6,recip:5,redi:[0,5],region:[0,6],relat:5,rudimentari:[2,6],tabl:4,updat:5,usag:[2,6],util:0,welcom:4}})
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/docs/usage.html 
new/dogpile.cache-0.9.0/docs/usage.html
--- old/dogpile.cache-0.8.0/docs/usage.html     2019-09-20 21:08:43.000000000 
+0200
+++ new/dogpile.cache-0.9.0/docs/usage.html     2019-10-28 17:05:28.000000000 
+0100
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml";>
   <head>
     <meta charset="utf-8" />
-    <title>Usage Guide &#8212; dogpile.cache 0.8.0 documentation</title>
+    <title>Usage Guide &#8212; dogpile.cache 0.9.0 documentation</title>
     <link rel="stylesheet" href="_static/nature_override.css" type="text/css" 
/>
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     <link rel="stylesheet" type="text/css" href="_static/changelog.css" />
@@ -34,7 +34,7 @@
         <li class="right" >
           <a href="front.html" title="Front Matter"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>  
 
@@ -853,6 +853,29 @@
 <p><span class="versionmodified added">New in version 0.4.4: </span>Added 
support for the <a class="reference internal" 
href="api.html#dogpile.cache.proxy.ProxyBackend" 
title="dogpile.cache.proxy.ProxyBackend"><code class="xref py py-class docutils 
literal notranslate"><span class="pre">ProxyBackend</span></code></a> class.</p>
 </div>
 </div>
+<div class="section" id="configuring-logging">
+<h2>Configuring Logging<a class="headerlink" href="#configuring-logging" 
title="Permalink to this headline">¶</a></h2>
+<div class="versionadded">
+<p><span class="versionmodified added">New in version 0.9.0.</span></p>
+</div>
+<p><a class="reference internal" 
href="api.html#dogpile.cache.region.CacheRegion" 
title="dogpile.cache.region.CacheRegion"><code class="xref py py-class docutils 
literal notranslate"><span class="pre">CacheRegion</span></code></a> includes 
logging facilities that will emit debug log
+messages when key cache events occur, including when keys are regenerated as
+well as when hard invalidations occur.   Using the <a class="reference 
external" href="https://docs.python.org/3/library/logging.html";>Python 
logging</a> module, set the log level to
+<code class="docutils literal notranslate"><span 
class="pre">dogpile.cache</span></code> to <code class="docutils literal 
notranslate"><span class="pre">logging.DEBUG</span></code>:</p>
+<div class="highlight-default notranslate"><div 
class="highlight"><pre><span></span><span class="n">logging</span><span 
class="o">.</span><span class="n">basicConfig</span><span class="p">()</span>
+<span class="n">logging</span><span class="o">.</span><span 
class="n">getLogger</span><span class="p">(</span><span 
class="s2">&quot;dogpile.cache&quot;</span><span class="p">)</span><span 
class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span 
class="n">logging</span><span class="o">.</span><span 
class="n">DEBUG</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>Debug logging will indicate time spent regenerating keys as well as when
+keys are missing:</p>
+<div class="highlight-default notranslate"><div 
class="highlight"><pre><span></span><span class="n">DEBUG</span><span 
class="p">:</span><span class="n">dogpile</span><span class="o">.</span><span 
class="n">cache</span><span class="o">.</span><span 
class="n">region</span><span class="p">:</span><span class="n">No</span> <span 
class="n">value</span> <span class="n">present</span> <span 
class="k">for</span> <span class="n">key</span><span class="p">:</span> <span 
class="s1">&#39;__main__:load_user_info|2&#39;</span>
+<span class="n">DEBUG</span><span class="p">:</span><span 
class="n">dogpile</span><span class="o">.</span><span 
class="n">cache</span><span class="o">.</span><span 
class="n">region</span><span class="p">:</span><span class="n">No</span> <span 
class="n">value</span> <span class="n">present</span> <span 
class="k">for</span> <span class="n">key</span><span class="p">:</span> <span 
class="s1">&#39;__main__:load_user_info|1&#39;</span>
+<span class="n">DEBUG</span><span class="p">:</span><span 
class="n">dogpile</span><span class="o">.</span><span 
class="n">cache</span><span class="o">.</span><span 
class="n">region</span><span class="p">:</span><span class="n">Cache</span> 
<span class="n">value</span> <span class="n">generated</span> <span 
class="ow">in</span> <span class="mf">0.501</span> <span 
class="n">seconds</span> <span class="k">for</span> <span 
class="n">keys</span><span class="p">:</span> <span class="p">[</span><span 
class="s1">&#39;__main__:load_user_info|2&#39;</span><span class="p">,</span> 
<span class="s1">&#39;__main__:load_user_info|3&#39;</span><span 
class="p">,</span> <span 
class="s1">&#39;__main__:load_user_info|4&#39;</span><span class="p">,</span> 
<span class="s1">&#39;__main__:load_user_info|5&#39;</span><span 
class="p">]</span>
+<span class="n">DEBUG</span><span class="p">:</span><span 
class="n">dogpile</span><span class="o">.</span><span 
class="n">cache</span><span class="o">.</span><span 
class="n">region</span><span class="p">:</span><span class="n">Hard</span> 
<span class="n">invalidation</span> <span class="n">detected</span> <span 
class="k">for</span> <span class="n">key</span><span class="p">:</span> <span 
class="s1">&#39;__main__:load_user_info|3&#39;</span>
+<span class="n">DEBUG</span><span class="p">:</span><span 
class="n">dogpile</span><span class="o">.</span><span 
class="n">cache</span><span class="o">.</span><span 
class="n">region</span><span class="p">:</span><span class="n">Hard</span> 
<span class="n">invalidation</span> <span class="n">detected</span> <span 
class="k">for</span> <span class="n">key</span><span class="p">:</span> <span 
class="s1">&#39;__main__:load_user_info|2&#39;</span>
+</pre></div>
+</div>
+</div>
 </div>
 
 
@@ -870,6 +893,7 @@
 <li><a class="reference internal" href="#using-a-region">Using a 
Region</a></li>
 <li><a class="reference internal" href="#creating-backends">Creating 
Backends</a></li>
 <li><a class="reference internal" href="#changing-backend-behavior">Changing 
Backend Behavior</a></li>
+<li><a class="reference internal" href="#configuring-logging">Configuring 
Logging</a></li>
 </ul>
 </li>
 </ul>
@@ -909,12 +933,12 @@
         <li class="right" >
           <a href="front.html" title="Front Matter"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.8.0 documentation</a> &#187;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">dogpile.cache 
0.9.0 documentation</a> &#187;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
         &#169; Copyright 2011-2019 Mike Bayer.
-      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.0.
+      Created using <a href="http://sphinx-doc.org/";>Sphinx</a> 2.2.1.
     </div>
   </body>
 </html>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/dogpile/__init__.py 
new/dogpile.cache-0.9.0/dogpile/__init__.py
--- old/dogpile.cache-0.8.0/dogpile/__init__.py 2019-09-20 21:08:25.000000000 
+0200
+++ new/dogpile.cache-0.9.0/dogpile/__init__.py 2019-10-28 17:05:11.000000000 
+0100
@@ -1,4 +1,4 @@
-__version__ = "0.8.0"
+__version__ = "0.9.0"
 
 from .lock import Lock  # noqa
 from .lock import NeedRegenerationException  # noqa
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/dogpile/cache/region.py 
new/dogpile.cache-0.9.0/dogpile/cache/region.py
--- old/dogpile.cache-0.8.0/dogpile/cache/region.py     2019-09-20 
21:08:25.000000000 +0200
+++ new/dogpile.cache-0.9.0/dogpile/cache/region.py     2019-10-28 
17:05:11.000000000 +0100
@@ -1,8 +1,10 @@
 from __future__ import with_statement
 
+import contextlib
 import datetime
 from functools import partial
 from functools import wraps
+import logging
 from numbers import Number
 import threading
 import time
@@ -17,6 +19,7 @@
 from .proxy import ProxyBackend
 from .util import function_key_generator
 from .util import function_multi_key_generator
+from .util import repr_obj
 from .. import Lock
 from .. import NeedRegenerationException
 from ..util import coerce_string_conf
@@ -32,6 +35,8 @@
 
 """
 
+log = logging.getLogger(__name__)
+
 
 class RegionInvalidationStrategy(object):
     """Region invalidation strategy interface
@@ -777,6 +782,29 @@
             )
         ]
 
+    @contextlib.contextmanager
+    def _log_time(self, keys):
+        start_time = time.time()
+        yield
+        seconds = time.time() - start_time
+        log.debug(
+            "Cache value generated in %(seconds).3f seconds for key(s): "
+            "%(keys)r",
+            {"seconds": seconds, "keys": repr_obj(keys)},
+        )
+
+    def _is_cache_miss(self, value, orig_key):
+        if value is NO_VALUE:
+            log.debug("No value present for key: %r", orig_key)
+        elif value.metadata["v"] != value_version:
+            log.debug("Dogpile version update for key: %r", orig_key)
+        elif self.region_invalidator.is_hard_invalidated(value.metadata["ct"]):
+            log.debug("Hard invalidation detected for key: %r", orig_key)
+        else:
+            return False
+
+        return True
+
     def get_or_create(
         self,
         key,
@@ -872,14 +900,9 @@
 
         def get_value():
             value = self.backend.get(key)
-            if (
-                value is NO_VALUE
-                or value.metadata["v"] != value_version
-                or self.region_invalidator.is_hard_invalidated(
-                    value.metadata["ct"]
-                )
-            ):
+            if self._is_cache_miss(value, orig_key):
                 raise NeedRegenerationException()
+
             ct = value.metadata["ct"]
             if self.region_invalidator.is_soft_invalidated(ct):
                 ct = time.time() - expiration_time - 0.0001
@@ -887,10 +910,13 @@
             return value.payload, ct
 
         def gen_value():
-            if creator_args:
-                created_value = creator(*creator_args[0], **creator_args[1])
-            else:
-                created_value = creator()
+            with self._log_time(orig_key):
+                if creator_args:
+                    created_value = creator(
+                        *creator_args[0], **creator_args[1]
+                    )
+                else:
+                    created_value = creator()
             value = self._value(created_value)
 
             if not should_cache_fn or should_cache_fn(created_value):
@@ -988,13 +1014,7 @@
         def get_value(key):
             value = values.get(key, NO_VALUE)
 
-            if (
-                value is NO_VALUE
-                or value.metadata["v"] != value_version
-                or self.region_invalidator.is_hard_invalidated(
-                    value.metadata["ct"]
-                )
-            ):
+            if self._is_cache_miss(value, orig_key):
                 # dogpile.core understands a 0 here as
                 # "the value is not available", e.g.
                 # _has_value() will return False.
@@ -1053,7 +1073,9 @@
                 # sort the keys, the idea is to prevent deadlocks.
                 # though haven't been able to simulate one anyway.
                 keys_to_get = sorted(mutexes)
-                new_values = creator(*keys_to_get)
+
+                with self._log_time(keys_to_get):
+                    new_values = creator(*keys_to_get)
 
                 values_w_created = dict(
                     (orig_to_mangled[k], self._value(v))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/dogpile/cache/util.py 
new/dogpile.cache-0.9.0/dogpile/cache/util.py
--- old/dogpile.cache-0.8.0/dogpile/cache/util.py       2019-09-20 
21:08:25.000000000 +0200
+++ new/dogpile.cache-0.9.0/dogpile/cache/util.py       2019-10-28 
17:05:11.000000000 +0100
@@ -160,3 +160,30 @@
 memoized_property = langhelpers.memoized_property
 PluginLoader = langhelpers.PluginLoader
 to_list = langhelpers.to_list
+
+
+class repr_obj(object):
+
+    __slots__ = ("value", "max_chars")
+
+    def __init__(self, value, max_chars=300):
+        self.value = value
+        self.max_chars = max_chars
+
+    def __eq__(self, other):
+        return other.value == self.value
+
+    def __repr__(self):
+        rep = repr(self.value)
+        lenrep = len(rep)
+        if lenrep > self.max_chars:
+            segment_length = self.max_chars // 2
+            rep = (
+                rep[0:segment_length]
+                + (
+                    " ... (%d characters truncated) ... "
+                    % (lenrep - self.max_chars)
+                )
+                + rep[-segment_length:]
+            )
+        return rep
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/dogpile/lock.py 
new/dogpile.cache-0.9.0/dogpile/lock.py
--- old/dogpile.cache-0.8.0/dogpile/lock.py     2019-09-20 21:08:25.000000000 
+0200
+++ new/dogpile.cache-0.9.0/dogpile/lock.py     2019-10-28 17:05:11.000000000 
+0100
@@ -125,7 +125,7 @@
             has_value = True
             if not self.mutex.acquire(False):
                 log.debug(
-                    "creation function in progress " "elsewhere, returning"
+                    "creation function in progress elsewhere, returning"
                 )
                 return NOT_REGENERATED
         else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/dogpile.cache.egg-info/PKG-INFO 
new/dogpile.cache-0.9.0/dogpile.cache.egg-info/PKG-INFO
--- old/dogpile.cache-0.8.0/dogpile.cache.egg-info/PKG-INFO     2019-09-20 
21:08:44.000000000 +0200
+++ new/dogpile.cache-0.9.0/dogpile.cache.egg-info/PKG-INFO     2019-10-28 
17:05:28.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: dogpile.cache
-Version: 0.8.0
+Version: 0.9.0
 Summary: A caching front-end based on the Dogpile lock.
 Home-page: https://github.com/sqlalchemy/dogpile.cache
 Author: Mike Bayer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/setup.py 
new/dogpile.cache-0.9.0/setup.py
--- old/dogpile.cache-0.8.0/setup.py    2019-09-20 21:08:25.000000000 +0200
+++ new/dogpile.cache-0.9.0/setup.py    2019-10-28 17:05:11.000000000 +0100
@@ -23,7 +23,11 @@
 
 
 v = open(os.path.join(os.path.dirname(__file__), "dogpile", "__init__.py"))
-VERSION = re.compile(r'.*__version__ = "(.*?)"', re.S).match(v.read()).group(1)
+VERSION = (
+    re.compile(r""".*__version__ = ["'](.*?)["']""", re.S)
+    .match(v.read())
+    .group(1)
+)
 v.close()
 
 readme = os.path.join(os.path.dirname(__file__), "README.rst")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dogpile.cache-0.8.0/tests/cache/test_region.py 
new/dogpile.cache-0.9.0/tests/cache/test_region.py
--- old/dogpile.cache-0.8.0/tests/cache/test_region.py  2019-09-20 
21:08:25.000000000 +0200
+++ new/dogpile.cache-0.9.0/tests/cache/test_region.py  2019-10-28 
17:05:11.000000000 +0100
@@ -9,12 +9,14 @@
 from dogpile.cache import CacheRegion
 from dogpile.cache import exception
 from dogpile.cache import make_region
+from dogpile.cache import util
 from dogpile.cache.api import CacheBackend
 from dogpile.cache.api import CachedValue
 from dogpile.cache.api import NO_VALUE
 from dogpile.cache.proxy import ProxyBackend
 from dogpile.cache.region import _backend_loader
 from dogpile.cache.region import RegionInvalidationStrategy
+from dogpile.cache.region import value_version
 from dogpile.util import compat
 from . import assert_raises_message
 from . import configparser
@@ -839,3 +841,109 @@
         reg = self._region()
         assert isinstance(reg.backend, CacheBackend)
         assert isinstance(reg.actual_backend, CacheBackend)
+
+
+class LoggingTest(TestCase):
+    def _region(self, init_args={}, config_args={}, backend="mock"):
+        reg = CacheRegion(**init_args)
+        reg.configure(backend, **config_args)
+        return reg
+
+    def test_log_time(self):
+        reg = self._region()
+
+        times = [50, 55, 60]
+
+        def mock_time():
+            return times.pop(0)
+
+        with mock.patch("dogpile.cache.region.log") as mock_log, mock.patch(
+            "dogpile.cache.region.time", mock.Mock(time=mock_time)
+        ):
+            with reg._log_time(["foo", "bar", "bat"]):
+                pass
+
+        eq_(
+            mock_log.mock_calls,
+            [
+                mock.call.debug(
+                    "Cache value generated in %(seconds).3f "
+                    "seconds for key(s): %(keys)r",
+                    {
+                        "seconds": 5,
+                        "keys": util.repr_obj(["foo", "bar", "bat"]),
+                    },
+                )
+            ],
+        )
+
+    def test_repr_obj_truncated(self):
+
+        eq_(
+            repr(util.repr_obj(["some_big_long_name" for i in range(200)])),
+            "['some_big_long_name', 'some_big_long_name', "
+            "'some_big_long_name', 'some_big_long_name', 'some_big_long_name',"
+            " 'some_big_long_name', 'some_big_long_na ... "
+            "(4100 characters truncated) ... me_big_long_name', "
+            "'some_big_long_name', 'some_big_long_name', 'some_big_long_"
+            "name', 'some_big_long_name', 'some_big_long_name', "
+            "'some_big_long_name']",
+        )
+
+    def test_log_is_cache_miss(self):
+        reg = self._region()
+
+        with mock.patch("dogpile.cache.region.log") as mock_log:
+            is_(reg._is_cache_miss(NO_VALUE, "some key"), True)
+        eq_(
+            mock_log.mock_calls,
+            [mock.call.debug("No value present for key: %r", "some key")],
+        )
+
+    def test_log_is_value_version_miss(self):
+
+        reg = self._region()
+        inv = mock.Mock(is_hard_invalidated=lambda val: True)
+        with mock.patch(
+            "dogpile.cache.region.log"
+        ) as mock_log, mock.patch.object(reg, "region_invalidator", inv):
+            is_(
+                reg._is_cache_miss(
+                    CachedValue(
+                        "some value", {"v": value_version - 5, "ct": 500}
+                    ),
+                    "some key",
+                ),
+                True,
+            )
+        eq_(
+            mock_log.mock_calls,
+            [
+                mock.call.debug(
+                    "Dogpile version update for key: %r", "some key"
+                )
+            ],
+        )
+
+    def test_log_is_hard_invalidated(self):
+
+        reg = self._region()
+        inv = mock.Mock(is_hard_invalidated=lambda val: True)
+        with mock.patch(
+            "dogpile.cache.region.log"
+        ) as mock_log, mock.patch.object(reg, "region_invalidator", inv):
+            is_(
+                reg._is_cache_miss(
+                    CachedValue("some value", {"v": value_version, "ct": 500}),
+                    "some key",
+                ),
+                True,
+            )
+        eq_(
+            mock_log.mock_calls,
+            [
+                mock.call.debug(
+                    "Hard invalidation detected for key: %r", "some key"
+                )
+            ],
+        )


Reply via email to