From 4952499a17724426b60997f8c5985cb659e231e4 Mon Sep 17 00:00:00 2001 From: Chukwudi Nwachukwu Date: Fri, 15 Jun 2018 15:22:57 +0100 Subject: [PATCH 1/3] Update and Refactoring 1. Made a set refactoring 2. update flask.ext.cache to flask_cache --- flask_cache/jinja2ext.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flask_cache/jinja2ext.py b/flask_cache/jinja2ext.py index 73be6ac..5ed89dd 100644 --- a/flask_cache/jinja2ext.py +++ b/flask_cache/jinja2ext.py @@ -30,13 +30,13 @@ from jinja2 import nodes from jinja2.ext import Extension -from flask.ext.cache import make_template_fragment_key +from flask_cache import make_template_fragment_key JINJA_CACHE_ATTR_NAME = '_template_fragment_cache' class CacheExtension(Extension): - tags = set(['cache']) + tags = {'cache'} def parse(self, parser): lineno = next(parser.stream).lineno From 743f3992dad8b96652a213d89a1352f1f8e4edf7 Mon Sep 17 00:00:00 2001 From: Chukwudi Nwachukwu Date: Fri, 15 Jun 2018 15:31:34 +0100 Subject: [PATCH 2/3] made update at the test_cache.py --- test_cache.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_cache.py b/test_cache.py index 9811572..752ffa2 100644 --- a/test_cache.py +++ b/test_cache.py @@ -7,7 +7,7 @@ import string from flask import Flask, render_template, render_template_string -from flask.ext.cache import Cache, function_namespace, make_template_fragment_key +from flask_cache import Cache, function_namespace, make_template_fragment_key if sys.version_info < (2,7): import unittest2 as unittest From adc5edc762ad67d3e9c7e6400b429314130cd59f Mon Sep 17 00:00:00 2001 From: Chukwudi Nwachukwu Date: Sat, 16 Jun 2018 20:43:49 +0100 Subject: [PATCH 3/3] Refactorings done 1. Added proper formatting to some places in the file 2. Removed a deprecated library --- .idea/flask-cache.iml | 11 +++++ .../inspectionProfiles/profiles_settings.xml | 5 +++ .idea/misc.xml | 7 +++ .idea/modules.xml | 8 ++++ flask_cache/__init__.py | 45 ++++++++++--------- flask_cache/backends.py | 32 +++++++------ 6 files changed, 74 insertions(+), 34 deletions(-) create mode 100644 .idea/flask-cache.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml diff --git a/.idea/flask-cache.iml b/.idea/flask-cache.iml new file mode 100644 index 0000000..bc01ef9 --- /dev/null +++ b/.idea/flask-cache.iml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..0eefe32 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..79afee4 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..dcd0f91 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/flask_cache/__init__.py b/flask_cache/__init__.py index 85d90e3..5459574 100644 --- a/flask_cache/__init__.py +++ b/flask_cache/__init__.py @@ -36,23 +36,24 @@ if PY2: null_control = (None, delchars) else: - null_control = (dict((k,None) for k in delchars),) + null_control = (dict((k, None) for k in delchars),) + def function_namespace(f, args=None): """ Attempts to returns unique namespace for function """ - m_args = inspect.getargspec(f)[0] + m_args = inspect.getfullargspec(f)[0] instance_token = None instance_self = getattr(f, '__self__', None) if instance_self \ - and not inspect.isclass(instance_self): + and not inspect.isclass(instance_self): instance_token = repr(f.__self__) elif m_args \ - and m_args[0] == 'self' \ - and args: + and m_args[0] == 'self' \ + and args: instance_token = repr(args[0]) module = f.__module__ @@ -63,7 +64,7 @@ def function_namespace(f, args=None): klass = getattr(f, '__self__', None) if klass \ - and not inspect.isclass(klass): + and not inspect.isclass(klass): klass = klass.__class__ if not klass: @@ -92,6 +93,7 @@ def function_namespace(f, args=None): return ns, ins + def make_template_fragment_key(fragment_name, vary_on=[]): """ Make a cache key for a specific fragment name @@ -169,7 +171,7 @@ def _set_cache(self, app, config): cache_obj = getattr(backends, import_me) except AttributeError: raise ImportError("%s is not a valid FlaskCache backend" % ( - import_me)) + import_me)) else: cache_obj = import_string(import_me) @@ -184,7 +186,7 @@ def _set_cache(self, app, config): app.extensions.setdefault('cache', {}) app.extensions['cache'][self] = cache_obj( - app, config, cache_args, cache_options) + app, config, cache_args, cache_options) @property def cache(self): @@ -297,7 +299,7 @@ def decorated_function(*args, **kwargs): rv = f(*args, **kwargs) try: self.cache.set(cache_key, rv, - timeout=decorated_function.cache_timeout) + timeout=decorated_function.cache_timeout) except Exception: if current_app.debug: raise @@ -320,6 +322,7 @@ def make_cache_key(*args, **kwargs): decorated_function.make_cache_key = make_cache_key return decorated_function + return decorator def _memvname(self, funcname): @@ -375,6 +378,7 @@ def _memoize_make_cache_key(self, make_name=None, timeout=None): """ Function used to create the cache_key for memoized functions. """ + def make_cache_key(f, *args, **kwargs): _timeout = getattr(timeout, 'cache_timeout', timeout) fname, version_data = self._memoize_version(f, args=args, @@ -389,8 +393,8 @@ def make_cache_key(f, *args, **kwargs): if callable(f): keyargs, keykwargs = self._memoize_kwargs_to_args(f, - *args, - **kwargs) + *args, + **kwargs) else: keyargs, keykwargs = args, kwargs @@ -406,6 +410,7 @@ def make_cache_key(f, *args, **kwargs): cache_key += version_data return cache_key + return make_cache_key def _memoize_kwargs_to_args(self, f, *args, **kwargs): @@ -431,8 +436,8 @@ def _memoize_kwargs_to_args(self, f, *args, **kwargs): elif arg_num < len(args): arg = args[arg_num] arg_num += 1 - elif abs(i-args_len) <= len(argspec.defaults): - arg = argspec.defaults[i-args_len] + elif abs(i - args_len) <= len(argspec.defaults): + arg = argspec.defaults[i - args_len] arg_num += 1 else: arg = None @@ -527,7 +532,7 @@ def decorated_function(*args, **kwargs): try: cache_key = decorated_function.make_cache_key(f, *args, **kwargs) rv = self.cache.get(cache_key) - except Exception: + except (Exception,): if current_app.debug: raise logger.exception("Exception possibly due to cache backend.") @@ -537,8 +542,8 @@ def decorated_function(*args, **kwargs): rv = f(*args, **kwargs) try: self.cache.set(cache_key, rv, - timeout=decorated_function.cache_timeout) - except Exception: + timeout=decorated_function.cache_timeout) + except (Exception,): if current_app.debug: raise logger.exception("Exception possibly due to cache backend.") @@ -547,10 +552,11 @@ def decorated_function(*args, **kwargs): decorated_function.uncached = f decorated_function.cache_timeout = timeout decorated_function.make_cache_key = self._memoize_make_cache_key( - make_name, decorated_function) + make_name, decorated_function) decorated_function.delete_memoized = lambda: self.delete_memoized(f) return decorated_function + return memoize def delete_memoized(self, f, *args, **kwargs): @@ -656,8 +662,7 @@ def add(self, b): """ if not callable(f): raise DeprecationWarning("Deleting messages by relative name is no longer" - " reliable, please switch to a function reference") - + " reliable, please switch to a function reference") try: if not args and not kwargs: @@ -684,7 +689,7 @@ def delete_memoized_verhash(self, f, *args): """ if not callable(f): raise DeprecationWarning("Deleting messages by relative name is no longer" - " reliable, please use a function reference") + " reliable, please use a function reference") try: self._memoize_version(f, delete=True) diff --git a/flask_cache/backends.py b/flask_cache/backends.py index 7ce664d..64e8423 100644 --- a/flask_cache/backends.py +++ b/flask_cache/backends.py @@ -25,15 +25,18 @@ def __init__(self, servers=None, default_timeout=300, key_prefix=None, def null(app, config, args, kwargs): return NullCache() + def simple(app, config, args, kwargs): kwargs.update(dict(threshold=config['CACHE_THRESHOLD'])) return SimpleCache(*args, **kwargs) + def memcached(app, config, args, kwargs): args.append(config['CACHE_MEMCACHED_SERVERS']) kwargs.update(dict(key_prefix=config['CACHE_KEY_PREFIX'])) return MemcachedCache(*args, **kwargs) + def saslmemcached(app, config, args, kwargs): args.append(config['CACHE_MEMCACHED_SERVERS']) kwargs.update(dict(username=config['CACHE_MEMCACHED_USERNAME'], @@ -41,15 +44,18 @@ def saslmemcached(app, config, args, kwargs): key_prefix=config['CACHE_KEY_PREFIX'])) return SASLMemcachedCache(*args, **kwargs) + def gaememcached(app, config, args, kwargs): kwargs.update(dict(key_prefix=config['CACHE_KEY_PREFIX'])) return GAEMemcachedCache(*args, **kwargs) + def filesystem(app, config, args, kwargs): args.insert(0, config['CACHE_DIR']) kwargs.update(dict(threshold=config['CACHE_THRESHOLD'])) return FileSystemCache(*args, **kwargs) + # RedisCache is supported since Werkzeug 0.7. try: from werkzeug.contrib.cache import RedisCache @@ -77,9 +83,9 @@ def redis(app, config, args, kwargs): redis_url = config.get('CACHE_REDIS_URL') if redis_url: kwargs['host'] = redis_from_url( - redis_url, - db=kwargs.pop('db', None), - ) + redis_url, + db=kwargs.pop('db', None), + ) return RedisCache(*args, **kwargs) @@ -93,8 +99,7 @@ class SpreadSASLMemcachedCache(SASLMemcachedCache): impact the performances. """ - - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs): """ chunksize : (int) max size in bytes of chunk stored in memcached """ @@ -106,7 +111,6 @@ def delete(self, key): for skey in self._genkeys(key): super(SpreadSASLMemcachedCache, self).delete(skey) - def set(self, key, value, timeout=None, chunk=True): """set a value in cache, potentially spreding it across multiple key. @@ -130,9 +134,9 @@ def _set(self, key, value, timeout=None): len_ser = len(serialized) chks = range_type(0, len_ser, self.chunksize) if len(chks) > self.maxchunk: - raise ValueError('Cannot store value in less than %s keys'%(self.maxchunk)) + raise ValueError('Cannot store value in less than %s keys' % (self.maxchunk)) for i in chks: - values['%s.%s' % (key, i//self.chunksize)] = serialized[i : i+self.chunksize] + values['%s.%s' % (key, i // self.chunksize)] = serialized[i: i + self.chunksize] super(SpreadSASLMemcachedCache, self).set_many(values, timeout) def get(self, key, chunk=True): @@ -140,9 +144,9 @@ def get(self, key, chunk=True): chunk : (Bool) if set to false, get a value set with set(..., chunk=False) """ - if chunk : + if chunk: return self._get(key) - else : + else: return super(SpreadSASLMemcachedCache, self).get(key) def _genkeys(self, key): @@ -150,17 +154,17 @@ def _genkeys(self, key): def _get(self, key): to_get = ['%s.%s' % (key, i) for i in range_type(self.maxchunk)] - result = super(SpreadSASLMemcachedCache, self).get_many( *to_get) + result = super(SpreadSASLMemcachedCache, self).get_many(*to_get) serialized = ''.join([v for v in result if v is not None]) if not serialized: return None return pickle.loads(serialized) -def spreadsaslmemcachedcache(app, config, args, kwargs): +def spreadsaslmemcachedcache(app, config, args, kwargs): args.append(config['CACHE_MEMCACHED_SERVERS']) kwargs.update(dict(username=config.get('CACHE_MEMCACHED_USERNAME'), password=config.get('CACHE_MEMCACHED_PASSWORD'), - key_prefix=config.get('CACHE_KEY_PREFIX') - )) + key_prefix=config.get('CACHE_KEY_PREFIX') + )) return SpreadSASLMemcachedCache(*args, **kwargs)