Commit 86cc01ae authored by Sean Bleier's avatar Sean Bleier Committed by GitHub

Merge pull request #119 from timgraham/trove

Drop support for Django < 1.8 and related cleanups
parents a073a3ee 88cd5824
language: python language: python
python: python:
- "2.7" - "2.7"
- "3.2"
- "3.3" - "3.3"
- "3.4" - "3.4"
- "3.5"
env: env:
- DJANGO_VERSION=1.5
- DJANGO_VERSION=1.6
- DJANGO_VERSION=1.7
- DJANGO_VERSION=1.8 - DJANGO_VERSION=1.8
# command to run tests # command to run tests
install: ./install_redis.sh install: ./install_redis.sh
......
...@@ -21,6 +21,11 @@ Docs can be found at http://django-redis-cache.readthedocs.org/en/latest/. ...@@ -21,6 +21,11 @@ Docs can be found at http://django-redis-cache.readthedocs.org/en/latest/.
Changelog Changelog
========= =========
1.7.0
-----
* Drops support for Django < 1.8 and Python 3.2.
1.5.0 1.5.0
----- -----
......
from django.core.cache.backends.base import BaseCache, InvalidCacheBackendError from django.core.cache.backends.base import (
BaseCache, DEFAULT_TIMEOUT, InvalidCacheBackendError,
)
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
try: try:
...@@ -10,7 +12,6 @@ except ImportError: ...@@ -10,7 +12,6 @@ except ImportError:
from redis.connection import DefaultParser from redis.connection import DefaultParser
from redis_cache.compat import DEFAULT_TIMEOUT
from redis_cache.connection import pool from redis_cache.connection import pool
from redis_cache.utils import ( from redis_cache.utils import (
CacheKey, get_servers, parse_connection_kwargs, import_class CacheKey, get_servers, parse_connection_kwargs, import_class
......
from collections import defaultdict from collections import defaultdict
from django.core.cache.backends.base import DEFAULT_TIMEOUT
from redis_cache.backends.base import BaseRedisCache from redis_cache.backends.base import BaseRedisCache
from redis_cache.compat import DEFAULT_TIMEOUT
from redis_cache.sharder import HashRing from redis_cache.sharder import HashRing
......
from redis_cache.compat import DEFAULT_TIMEOUT
try: try:
import cPickle as pickle import cPickle as pickle
except ImportError: except ImportError:
import pickle import pickle
import random import random
from django.core.cache.backends.base import DEFAULT_TIMEOUT
from redis_cache.backends.base import BaseRedisCache from redis_cache.backends.base import BaseRedisCache
......
import sys
import django
PY3 = (sys.version_info >= (3,))
try:
# Django 1.5+
from django.utils.encoding import smart_text, smart_bytes
except ImportError:
# older Django, thus definitely Python 2
from django.utils.encoding import smart_unicode, smart_str
smart_text = smart_unicode
smart_bytes = smart_str
if PY3:
bytes_type = bytes
from urllib.parse import parse_qs, urlparse
else:
bytes_type = str
from urlparse import parse_qs, urlparse
if django.VERSION[:2] >= (1, 6):
from django.core.cache.backends.base import DEFAULT_TIMEOUT as DJANGO_DEFAULT_TIMEOUT
DEFAULT_TIMEOUT = DJANGO_DEFAULT_TIMEOUT
else:
DEFAULT_TIMEOUT = None
def python_2_unicode_compatible(klass):
"""
A decorator that defines __unicode__ and __str__ methods under Python 2.
Under Python 3 it does nothing.
To support Python 2 and 3 with a single code base, define a __str__ method
returning text and apply this decorator to the class.
Backported from Django 1.5+.
"""
if not PY3:
klass.__unicode__ = klass.__str__
klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
return klass
...@@ -15,7 +15,7 @@ try: ...@@ -15,7 +15,7 @@ try:
except ImportError: except ImportError:
pass pass
from redis_cache.compat import smart_bytes, smart_text from django.utils.encoding import force_bytes, force_text
class BaseSerializer(object): class BaseSerializer(object):
...@@ -39,7 +39,7 @@ class PickleSerializer(object): ...@@ -39,7 +39,7 @@ class PickleSerializer(object):
return pickle.dumps(value, self.pickle_version) return pickle.dumps(value, self.pickle_version)
def deserialize(self, value): def deserialize(self, value):
return pickle.loads(smart_bytes(value)) return pickle.loads(force_bytes(value))
class JSONSerializer(BaseSerializer): class JSONSerializer(BaseSerializer):
...@@ -48,10 +48,10 @@ class JSONSerializer(BaseSerializer): ...@@ -48,10 +48,10 @@ class JSONSerializer(BaseSerializer):
super(JSONSerializer, self).__init__(**kwargs) super(JSONSerializer, self).__init__(**kwargs)
def serialize(self, value): def serialize(self, value):
return smart_bytes(json.dumps(value)) return force_bytes(json.dumps(value))
def deserialize(self, value): def deserialize(self, value):
return json.loads(smart_text(value)) return json.loads(force_text(value))
class MSGPackSerializer(BaseSerializer): class MSGPackSerializer(BaseSerializer):
......
from bisect import insort, bisect from bisect import insort, bisect
import hashlib import hashlib
from redis_cache.compat import smart_text from django.utils.encoding import force_text
DIGITS = 8 DIGITS = 8
...@@ -17,8 +17,8 @@ class Node(object): ...@@ -17,8 +17,8 @@ class Node(object):
self._node = node self._node = node
self._i = i self._i = i
key = "{0}:{1}".format( key = "{0}:{1}".format(
smart_text(i), force_text(i),
smart_text(self._node), force_text(self._node),
) )
self._position = get_slot(key) self._position = get_slot(key)
...@@ -52,5 +52,5 @@ class HashRing(object): ...@@ -52,5 +52,5 @@ class HashRing(object):
del self._nodes[n - i - 1] del self._nodes[n - i - 1]
def get_node(self, key): def get_node(self, key):
i = bisect(self._nodes, get_slot(smart_text(key))) - 1 i = bisect(self._nodes, get_slot(force_text(key))) - 1
return self._nodes[i]._node return self._nodes[i]._node
import importlib
import warnings import warnings
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from redis.connection import SSLConnection from django.utils import six
from django.utils.encoding import force_text, python_2_unicode_compatible
from redis_cache.compat import ( from django.utils.six.moves.urllib.parse import parse_qs, urlparse
smart_text, python_2_unicode_compatible, parse_qs, urlparse
)
try: from redis.connection import SSLConnection
import importlib
except ImportError:
from django.utils import importlib
try:
basestring
except NameError:
basestring = str
@python_2_unicode_compatible @python_2_unicode_compatible
...@@ -30,20 +21,20 @@ class CacheKey(object): ...@@ -30,20 +21,20 @@ class CacheKey(object):
def __eq__(self, other): def __eq__(self, other):
return self._versioned_key == other return self._versioned_key == other
def __unicode__(self): def __str__(self):
return smart_text(self._versioned_key) return force_text(self._versioned_key)
def __hash__(self): def __hash__(self):
return hash(self._versioned_key) return hash(self._versioned_key)
__repr__ = __str__ = __unicode__ __repr__ = __str__
def get_servers(location): def get_servers(location):
"""Returns a list of servers given the server argument passed in from """Returns a list of servers given the server argument passed in from
Django. Django.
""" """
if isinstance(location, basestring): if isinstance(location, six.string_types):
servers = location.split(',') servers = location.split(',')
elif hasattr(location, '__iter__'): elif hasattr(location, '__iter__'):
servers = location servers = location
......
hiredis==0.2.0 hiredis==0.2.0
django-nose==1.4 django-nose==1.4
nose==1.3.6 nose==1.3.6
unittest2==1.0.1
msgpack-python==0.4.6 msgpack-python==0.4.6
pyyaml==3.11 pyyaml==3.11
...@@ -11,15 +11,15 @@ setup( ...@@ -11,15 +11,15 @@ setup(
install_requires=['redis>=2.10.3'], install_requires=['redis>=2.10.3'],
classifiers=[ classifiers=[
"Programming Language :: Python", "Programming Language :: Python",
"Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7", "Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3.2",
"Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Operating System :: OS Independent", "Operating System :: OS Independent",
"Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries",
"Topic :: Utilities", "Topic :: Utilities",
"Environment :: Web Environment", "Environment :: Web Environment",
"Framework :: Django", "Framework :: Django",
"Framework :: Django :: 1.8",
], ],
) )
...@@ -4,14 +4,8 @@ from __future__ import unicode_literals ...@@ -4,14 +4,8 @@ from __future__ import unicode_literals
from hashlib import sha1 from hashlib import sha1
import os import os
import subprocess import subprocess
import sys
import time import time
if sys.version_info < (2, 7):
import unittest2 as unittest
else:
import unittest
try: try:
import cPickle as pickle import cPickle as pickle
...@@ -20,17 +14,13 @@ except ImportError: ...@@ -20,17 +14,13 @@ except ImportError:
from django.core.cache import get_cache from django.core.cache import get_cache
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.test import TestCase from django.test import TestCase, override_settings
try: from django.utils.encoding import force_bytes
from django.test import override_settings
except ImportError:
from django.test.utils import override_settings
import redis import redis
from tests.testapp.models import Poll, expensive_calculation from tests.testapp.models import Poll, expensive_calculation
from redis_cache.cache import RedisCache, pool from redis_cache.cache import RedisCache, pool
from redis_cache.compat import DEFAULT_TIMEOUT, smart_bytes
from redis_cache.utils import get_servers, parse_connection_kwargs from redis_cache.utils import get_servers, parse_connection_kwargs
...@@ -299,7 +289,6 @@ class BaseRedisTestCase(SetupMixin): ...@@ -299,7 +289,6 @@ class BaseRedisTestCase(SetupMixin):
self.assertEqual(self.cache.get("expire2"), "newvalue") self.assertEqual(self.cache.get("expire2"), "newvalue")
self.assertEqual("expire3" in self.cache, False) self.assertEqual("expire3" in self.cache, False)
@unittest.skipIf(DEFAULT_TIMEOUT is None, "Version of django doesn't support indefinite timeouts.")
def test_set_expiration_timeout_None(self): def test_set_expiration_timeout_None(self):
key, value = 'key', 'value' key, value = 'key', 'value'
self.cache.set(key, value, timeout=None) self.cache.set(key, value, timeout=None)
...@@ -479,7 +468,7 @@ class BaseRedisTestCase(SetupMixin): ...@@ -479,7 +468,7 @@ class BaseRedisTestCase(SetupMixin):
def test_reinsert_keys(self): def test_reinsert_keys(self):
self.cache._pickle_version = 0 self.cache._pickle_version = 0
for i in range(2000): for i in range(2000):
s = sha1(smart_bytes(i)).hexdigest() s = sha1(force_bytes(i)).hexdigest()
self.cache.set(s, self.cache) self.cache.set(s, self.cache)
self.cache._pickle_version = -1 self.cache._pickle_version = -1
self.cache.reinsert_keys() self.cache.reinsert_keys()
...@@ -563,7 +552,6 @@ class BaseRedisTestCase(SetupMixin): ...@@ -563,7 +552,6 @@ class BaseRedisTestCase(SetupMixin):
ttl = self.cache.ttl('a') ttl = self.cache.ttl('a')
self.assertAlmostEqual(ttl, 10) self.assertAlmostEqual(ttl, 10)
@unittest.skipIf(DEFAULT_TIMEOUT is None, "Version of django doesn't support indefinite timeouts.")
def test_ttl_no_expiry(self): def test_ttl_no_expiry(self):
self.cache.set('a', 'a', timeout=None) self.cache.set('a', 'a', timeout=None)
ttl = self.cache.ttl('a') ttl = self.cache.ttl('a')
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
try: from django.test import TestCase, override_settings
from django.test import override_settings
except ImportError:
from django.test.utils import override_settings
from django.test import TestCase
from tests.testapp.tests.base_tests import BaseRedisTestCase from tests.testapp.tests.base_tests import BaseRedisTestCase
......
import time import time
from django.test import TestCase from django.test import TestCase, override_settings
try:
from django.test import override_settings
except ImportError:
from django.test.utils import override_settings
from redis_cache.connection import pool from redis_cache.connection import pool
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.test import TestCase from django.test import TestCase, override_settings
try:
from django.test import override_settings
except ImportError:
from django.test.utils import override_settings
from tests.testapp.tests.base_tests import SetupMixin from tests.testapp.tests.base_tests import SetupMixin
...@@ -171,4 +167,3 @@ class MSGPackSerializerTestCase(BaseSerializerTestCase): ...@@ -171,4 +167,3 @@ class MSGPackSerializerTestCase(BaseSerializerTestCase):
class YAMLSerializerTestCase(BaseSerializerTestCase): class YAMLSerializerTestCase(BaseSerializerTestCase):
converts_tuple_to_list = False converts_tuple_to_list = False
serializes_objects = True serializes_objects = True
...@@ -3,11 +3,7 @@ from collections import Counter ...@@ -3,11 +3,7 @@ from collections import Counter
from tests.testapp.tests.base_tests import BaseRedisTestCase from tests.testapp.tests.base_tests import BaseRedisTestCase
from tests.testapp.tests.multi_server_tests import MultiServerTests from tests.testapp.tests.multi_server_tests import MultiServerTests
try: from django.test import TestCase, override_settings
from django.test import override_settings
except ImportError:
from django.test.utils import override_settings
from django.test import TestCase
LOCATION = "unix://:yadayada@/tmp/redis0.sock?db=15" LOCATION = "unix://:yadayada@/tmp/redis0.sock?db=15"
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
try: from django.test import TestCase, override_settings
from django.test import override_settings
except ImportError:
from django.test.utils import override_settings
from django.test import TestCase
from redis.exceptions import ConnectionError from redis.exceptions import ConnectionError
from tests.testapp.tests.base_tests import SetupMixin from tests.testapp.tests.base_tests import SetupMixin
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from tests.testapp.tests.base_tests import BaseRedisTestCase from tests.testapp.tests.base_tests import BaseRedisTestCase
from tests.testapp.tests.multi_server_tests import MultiServerTests from tests.testapp.tests.multi_server_tests import MultiServerTests
try: from django.test import TestCase, override_settings
from django.test import override_settings
except ImportError:
from django.test.utils import override_settings
from django.test import TestCase
from redis_cache.cache import ImproperlyConfigured from redis_cache.cache import ImproperlyConfigured
from redis.connection import UnixDomainSocketConnection from redis.connection import UnixDomainSocketConnection
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment