[Python-modules-commits] [django-memoize] 01/08: Import django-memoize_2.1.0+dfsg.orig.tar.gz

Christopher Stuart Hoskin mans0954 at moszumanska.debian.org
Wed Feb 22 20:14:21 UTC 2017


This is an automated email from the git hooks/post-receive script.

mans0954 pushed a commit to branch master
in repository django-memoize.

commit 499c514e738c5aea73c60c436e87fa9d46412d18
Author: Christopher Hoskin <mans0954 at debian.org>
Date:   Wed Feb 22 19:59:24 2017 +0000

    Import django-memoize_2.1.0+dfsg.orig.tar.gz
---
 CHANGES             |  6 +++++
 PKG-INFO            |  3 ++-
 memoize/__init__.py | 31 ++++++++++++++++++++-----
 setup.py            |  3 ++-
 tests/tests.py      | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 5 files changed, 98 insertions(+), 11 deletions(-)

diff --git a/CHANGES b/CHANGES
index 6ae56c2..881d126 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,11 @@
 Changelog
 
+Version 2.1.0
+`````````````
+
+- memoize now caches also `None` values
+- Py3 fixes
+
 Version 2.0.0
 `````````````
 
diff --git a/PKG-INFO b/PKG-INFO
index c5cf024..d061ecb 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: django-memoize
-Version: 2.0.0
+Version: 2.1.0
 Summary: An implementation of memoization technique for Django.
 Home-page: https://github.com/tvavrys/django-memoize
 Author: Thomas Vavrys
@@ -32,4 +32,5 @@ Classifier: Framework :: Django
 Classifier: Framework :: Django :: 1.7
 Classifier: Framework :: Django :: 1.8
 Classifier: Framework :: Django :: 1.9
+Classifier: Framework :: Django :: 1.10
 Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
diff --git a/memoize/__init__.py b/memoize/__init__.py
index ce2cd3a..5a1d03d 100644
--- a/memoize/__init__.py
+++ b/memoize/__init__.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-__version__ = '2.0.0'
+__version__ = '2.1.0'
 __versionfull__ = __version__
 
 import functools
@@ -16,11 +16,28 @@ from django.utils.encoding import force_bytes
 logger = logging.getLogger(__name__)
 
 
+class DefaultCacheObject(object):
+    pass
+
+
+DEFAULT_CACHE_OBJECT = DefaultCacheObject()
+
+
+def _get_argspec(f):
+    try:
+        argspec = inspect.getargspec(f)
+    except ValueError:
+        # this can happen in python 3.5 when
+        # function has keyword-only arguments or annotations
+        argspec = inspect.getfullargspec(f)
+    return argspec
+
+
 def function_namespace(f, args=None):
     """
     Attempts to returns unique namespace for function
     """
-    m_args = inspect.getargspec(f)[0]
+    m_args = _get_argspec(f).args
     instance_token = None
 
     instance_self = getattr(f, '__self__', None)
@@ -69,13 +86,15 @@ class Memoizer(object):
     """
     This class is used to control the memoizer objects.
     """
-    def __init__(self, cache=default_cache, cache_prefix='memoize'):
+    def __init__(self, cache=default_cache, cache_prefix='memoize',
+                 default_cache_value=DEFAULT_CACHE_OBJECT):
         self.cache = cache
         self.cache_prefix = cache_prefix
+        self.default_cache_value = default_cache_value
 
     def get(self, key):
         "Proxy function for internal cache object."
-        return self.cache.get(key=key)
+        return self.cache.get(key=key, default=self.default_cache_value)
 
     def set(self, key, value, timeout=DEFAULT_TIMEOUT):
         "Proxy function for internal cache object."
@@ -204,7 +223,7 @@ class Memoizer(object):
         #: 1, b=2 is equivilant to a=1, b=2, etc.
         new_args = []
         arg_num = 0
-        argspec = inspect.getargspec(f)
+        argspec = _get_argspec(f)
 
         args_len = len(argspec.args)
         for i in range(args_len):
@@ -331,7 +350,7 @@ class Memoizer(object):
                     )
                     return f(*args, **kwargs)
 
-                if rv is None:
+                if rv == self.default_cache_value:
                     rv = f(*args, **kwargs)
                     try:
                         self.set(
diff --git a/setup.py b/setup.py
index 55afcd2..23641de 100644
--- a/setup.py
+++ b/setup.py
@@ -13,7 +13,7 @@ from setuptools import setup
 
 setup(
     name='django-memoize',
-    version='2.0.0',
+    version='2.1.0',
     packages=['memoize'],
     include_package_data=True,
     license='BSD License',
@@ -42,6 +42,7 @@ setup(
         'Framework :: Django :: 1.7',
         'Framework :: Django :: 1.8',
         'Framework :: Django :: 1.9',
+        'Framework :: Django :: 1.10',
         'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
     ],
 )
diff --git a/tests/tests.py b/tests/tests.py
index 31d2ace..8b8f8d2 100644
--- a/tests/tests.py
+++ b/tests/tests.py
@@ -32,7 +32,7 @@ class MemoizeTestCase(SimpleTestCase):
 
         self.memoizer.delete('hi')
 
-        assert self.memoizer.get('hi') is None
+        assert self.memoizer.get('hi') is self.memoizer.default_cache_value
 
     def test_06_memoize(self):
         @self.memoizer.memoize(5)
@@ -106,12 +106,17 @@ class MemoizeTestCase(SimpleTestCase):
 
         _fname, _fname_instance = function_namespace(big_foo)
         version_key = self.memoizer._memvname(_fname)
-        assert self.memoizer.get(version_key) is None
+        assert (
+            self.memoizer.get(version_key) is self.memoizer.default_cache_value
+        )
 
         assert big_foo(5, 2) != result
         assert big_foo(5, 3) != result2
 
-        assert self.memoizer.get(version_key) is not None
+        assert (
+            self.memoizer.get(version_key) is not
+            self.memoizer.default_cache_value
+        )
 
     def test_08_delete_memoize(self):
         @self.memoizer.memoize()
@@ -461,3 +466,58 @@ class MemoizeTestCase(SimpleTestCase):
         args, kwargs = self.memoizer._memoize_kwargs_to_args(
             big_foo, 1, 2, d='bar', c='foo')
         assert (args == expected)
+
+    def test_17_memoize_none_value(self):
+        self.memoizer = Memoizer()
+
+        @self.memoizer.memoize()
+        def foo():
+            return None
+
+        cache_key = foo.make_cache_key(foo.uncached)
+        assert (
+            self.memoizer.get(cache_key) is self.memoizer.default_cache_value)
+        result = foo()
+        assert result is None
+        assert self.memoizer.get(cache_key) is None
+
+        self.memoizer.delete_memoized(foo)
+        cache_key = foo.make_cache_key(foo.uncached)
+        assert (
+            self.memoizer.get(cache_key) is self.memoizer.default_cache_value)
+
+    def test_17_delete_memoized_instancemethod_with_mutable_param(self):
+        class Foo(object):
+            def __init__(self, id):
+                self.id = id
+
+            @self.memoizer.memoize(5)
+            def foo(self, bar_obj):
+                return random.randrange(0, 100000) + bar_obj.id
+
+            def __repr__(self):
+                return ('{}({})'.format(self.__class__.__name__, self.id))
+
+        class Bar(object):
+            def __init__(self, id):
+                self.id = id
+
+            def __repr__(self):
+                return ('{}({})'.format(self.__class__.__name__, self.id))
+
+        a = Foo(1)
+        b = Bar(1)
+        c = Bar(2)
+
+        result1 = a.foo(b)
+        result2 = a.foo(c)
+
+        time.sleep(1)
+
+        assert(a.foo(b) == result1)
+        assert(a.foo(c) == result2)
+
+        self.memoizer.delete_memoized(a.foo, a, b)
+
+        assert(a.foo(b) != result1)
+        assert(a.foo(c) == result2)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/django-memoize.git



More information about the Python-modules-commits mailing list