diff --git a/awx/main/tests/unit/utils/test_common.py b/awx/main/tests/unit/utils/test_common.py index d000815cbe..b8255faa5d 100644 --- a/awx/main/tests/unit/utils/test_common.py +++ b/awx/main/tests/unit/utils/test_common.py @@ -154,12 +154,11 @@ def test_memoize_delete(memoized_function, mock_cache): def test_memoize_parameter_error(): - @common.memoize(cache_key='foo', track_function=True) - def fn(): - return with pytest.raises(common.IllegalArgumentError): - fn() + @common.memoize(cache_key='foo', track_function=True) + def fn(): + return def test_extract_ansible_vars(): diff --git a/awx/main/utils/common.py b/awx/main/utils/common.py index a1373894d8..69864ba7ae 100644 --- a/awx/main/utils/common.py +++ b/awx/main/utils/common.py @@ -18,14 +18,11 @@ import contextlib import tempfile import six import psutil -from functools import reduce +from functools import reduce, wraps from StringIO import StringIO from decimal import Decimal -# Decorator -from decorator import decorator - # Django from django.core.exceptions import ObjectDoesNotExist from django.db import DatabaseError @@ -136,31 +133,35 @@ def memoize(ttl=60, cache_key=None, track_function=False): ''' Decorator to wrap a function and cache its result. ''' + if cache_key and track_function: + raise IllegalArgumentError("Can not specify cache_key when track_function is True") cache = get_memoize_cache() - def _memoizer(f, *args, **kwargs): - if cache_key and track_function: - raise IllegalArgumentError("Can not specify cache_key when track_function is True") - - if track_function: - cache_dict_key = slugify('%r %r' % (args, kwargs)) - key = slugify("%s" % f.__name__) - cache_dict = cache.get(key) or dict() - if cache_dict_key not in cache_dict: - value = f(*args, **kwargs) - cache_dict[cache_dict_key] = value - cache.set(key, cache_dict, ttl) + def memoize_decorator(f): + @wraps(f) + def _memoizer(*args, **kwargs): + if track_function: + cache_dict_key = slugify('%r %r' % (args, kwargs)) + key = slugify("%s" % f.__name__) + cache_dict = cache.get(key) or dict() + if cache_dict_key not in cache_dict: + value = f(*args, **kwargs) + cache_dict[cache_dict_key] = value + cache.set(key, cache_dict, ttl) + else: + value = cache_dict[cache_dict_key] else: - value = cache_dict[cache_dict_key] - else: - key = cache_key or slugify('%s %r %r' % (f.__name__, args, kwargs)) - value = cache.get(key) - if value is None: - value = f(*args, **kwargs) - cache.set(key, value, ttl) + key = cache_key or slugify('%s %r %r' % (f.__name__, args, kwargs)) + value = cache.get(key) + if value is None: + value = f(*args, **kwargs) + cache.set(key, value, ttl) - return value - return decorator(_memoizer) + return value + + return _memoizer + + return memoize_decorator def memoize_delete(function_name): diff --git a/requirements/requirements.in b/requirements/requirements.in index 8c2a27a31c..fd1f5fdda6 100644 --- a/requirements/requirements.in +++ b/requirements/requirements.in @@ -5,7 +5,6 @@ boto==2.47.0 channels==1.1.8 celery==4.2.1 daphne==1.3.0 # Last before backwards-incompatible channels 2 upgrade -decorator==4.2.1 Django==1.11.16 django-auth-ldap==1.2.8 django-crum==0.7.2 diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 0f5c419604..3fd2778b9c 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -23,7 +23,6 @@ channels==1.1.8 constantly==15.1.0 # via twisted cryptography==2.3.1 # via requests daphne==1.3.0 -decorator==4.2.1 defusedxml==0.4.1 # via python-saml django-auth-ldap==1.2.8 django-crum==0.7.2