[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