From 121d46f55291a458a5e9f12a1206c993c8b2beac Mon Sep 17 00:00:00 2001 From: Luke Pomfrey Date: Sun, 15 Sep 2013 14:55:35 +0100 Subject: [PATCH 1/8] Fix pickle import in backend.py pickle disappears from django.contrib.sessions.backends.base in Django 1.5. --- redisession/backend.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/redisession/backend.py b/redisession/backend.py index e2c69fd..daa6bd0 100644 --- a/redisession/backend.py +++ b/redisession/backend.py @@ -5,7 +5,13 @@ import struct import time from django.conf import settings -from django.contrib.sessions.backends.base import pickle, CreateError, SessionBase +from django.contrib.sessions.backends.base import CreateError, SessionBase + +try: + from django.utils.six.moves import cPickle as pickle +except ImportError: + import pickle + conf = { 'SERVER': {}, From bfae62fe173ba47346b64c109d9ff96674174a4e Mon Sep 17 00:00:00 2001 From: Luke Pomfrey Date: Sat, 19 Oct 2013 16:26:42 +0100 Subject: [PATCH 2/8] Allow serializer specification Django 1.5 allows the serializer used in session serialization to be specified using the SESSION_SERIALIZER setting. This allows redisession to use the same mechanism, whilst maintaining backwards compatibility. --- redisession/backend.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/redisession/backend.py b/redisession/backend.py index daa6bd0..7808f95 100644 --- a/redisession/backend.py +++ b/redisession/backend.py @@ -7,11 +7,6 @@ from django.conf import settings from django.contrib.sessions.backends.base import CreateError, SessionBase -try: - from django.utils.six.moves import cPickle as pickle -except ImportError: - import pickle - conf = { 'SERVER': {}, @@ -57,6 +52,12 @@ class SessionStore(SessionBase): def __init__(self, session_key=None): self._redis = get_redis(conf['SERVER']) super(SessionStore, self).__init__(session_key) + if not hasattr(self, 'serializer'): + try: + from django.utils.six.moves import cPickle as pickle + except ImportError: + import pickle + self.serializer = pickle # XXX Try to partially comply w/ session API of newer Django (>= 1.4) for Django 1.3 # Instead of checking Django version, test the existence directly. @@ -69,7 +70,7 @@ def _get_or_create_session_key(self): return self._session_key def encode(self, session_dict): - data = pickle.dumps(session_dict, pickle.HIGHEST_PROTOCOL) + data = self.serializer.dumps(session_dict) flag = 0 if conf['COMPRESS_LIB'] and len(data) >= conf['COMPRESS_MIN_LENGTH']: compressed = compress_lib.compress(data) @@ -82,9 +83,9 @@ def decode(self, session_data): flag, data = ord(session_data[:1]), session_data[1:] if flag & FLAG_COMPRESSED: if conf['COMPRESS_LIB']: - return pickle.loads(compress_lib.decompress(data)) + return self.serializer.loads(compress_lib.decompress(data)) raise ValueError('redisession: found compressed data without COMPRESS_LIB specified.') - return pickle.loads(data) + return self.serializer.loads(data) def create(self): for i in xrange(10000): From 5c3c13203351903a1510aa55f1feb70ada9238c4 Mon Sep 17 00:00:00 2001 From: Luke Pomfrey Date: Sat, 19 Oct 2013 16:40:44 +0100 Subject: [PATCH 3/8] Flake8 :) --- redisession/__init__.py | 1 + redisession/backend.py | 44 +++++++++++++------- redisession/helper.py | 5 ++- redisession/management/commands/cleanuprs.py | 5 +++ redisession/tests.py | 6 +++ setup.py | 14 ++++++- 6 files changed, 57 insertions(+), 18 deletions(-) diff --git a/redisession/__init__.py b/redisession/__init__.py index 2e20de5..95e1eac 100644 --- a/redisession/__init__.py +++ b/redisession/__init__.py @@ -1 +1,2 @@ +# -*- coding: utf-8 -*- version = '0.3.1' diff --git a/redisession/backend.py b/redisession/backend.py index 7808f95..1aacfff 100644 --- a/redisession/backend.py +++ b/redisession/backend.py @@ -1,9 +1,11 @@ +# -*- coding: utf-8 -*- """ A redis backend for django session, support string and hash mode. """ import struct import time + from django.conf import settings from django.contrib.sessions.backends.base import CreateError, SessionBase @@ -13,8 +15,9 @@ 'USE_HASH': True, 'KEY_GENERATOR': lambda x: x.decode('hex'), 'HASH_KEY_GENERATOR': lambda x: x[:4].decode('hex'), - 'HASH_KEYS_CHECK_FOR_EXPIRY': lambda r: (reduce(lambda p,y :p.randomkey(), - xrange(100), r.pipeline()).execute()), + 'HASH_KEYS_CHECK_FOR_EXPIRY': + lambda r: (reduce( + lambda p, y: p.randomkey(), xrange(100), r.pipeline()).execute()), 'COMPRESS_LIB': 'snappy', 'COMPRESS_MIN_LENGTH': 400, 'LOG_KEY_ERROR': False @@ -48,6 +51,7 @@ def __call__(self, conf): # TODO: flag for security verification? FLAG_COMPRESSED = 1 + class SessionStore(SessionBase): def __init__(self, session_key=None): self._redis = get_redis(conf['SERVER']) @@ -59,7 +63,8 @@ def __init__(self, session_key=None): import pickle self.serializer = pickle - # XXX Try to partially comply w/ session API of newer Django (>= 1.4) for Django 1.3 + # XXX Try to partially comply w/ session API of newer Django (>= 1.4) + # for Django 1.3 # Instead of checking Django version, test the existence directly. if not hasattr(SessionBase, '_get_or_create_session_key'): session_key = property(SessionBase._get_session_key) @@ -84,7 +89,8 @@ def decode(self, session_data): if flag & FLAG_COMPRESSED: if conf['COMPRESS_LIB']: return self.serializer.loads(compress_lib.decompress(data)) - raise ValueError('redisession: found compressed data without COMPRESS_LIB specified.') + raise ValueError('redisession: found compressed data without ' + 'COMPRESS_LIB specified.') return self.serializer.loads(data) def create(self): @@ -101,10 +107,12 @@ def create(self): if conf['USE_HASH']: def _make_key(self, session_key): try: - return (conf['HASH_KEY_GENERATOR'](session_key), conf['KEY_GENERATOR'](session_key)) + return (conf['HASH_KEY_GENERATOR'](session_key), + conf['KEY_GENERATOR'](session_key)) except: if conf['LOG_KEY_ERROR']: - logger.warning('misconfigured key-generator or bad key "%s"' % session_key) + logger.warning('misconfigured key-generator or bad key ' + '"%s"' % session_key) def save(self, must_create=False): if must_create: @@ -112,11 +120,12 @@ def save(self, must_create=False): else: func = self._redis.hset session_data = self.encode(self._get_session(no_load=must_create)) - expire_date = struct.pack('>I', int(time.time()+self.get_expiry_age())) + expire_date = struct.pack( + '>I', int(time.time() + self.get_expiry_age())) key = self._make_key(self._get_or_create_session_key()) if key is None: - # XXX must_create = True w/ bad key or misconfigured KEY_GENERATOR, - # which has already been logged in _make_key. + # XXX must_create = True w/ bad key or misconfigured + # KEY_GENERATOR, which has already been logged in _make_key. raise CreateError result = func(*key, value=expire_date+session_data) if must_create and not result: @@ -148,13 +157,14 @@ def delete(self, session_key=None): if key is not None: self._redis.hdel(*key) - else: # not conf['USE_HASH'] + else: # not conf['USE_HASH'] def _make_key(self, session_key): try: return conf['KEY_GENERATOR'](session_key) except: if conf['LOG_KEY_ERROR']: - logger.warning('misconfigured key-generator or bad key "%s"' % session_key) + logger.warning('misconfigured key-generator or bad key ' + '"%s"' % session_key) def save(self, must_create=False): pipe = self._redis.pipeline() @@ -165,11 +175,15 @@ def save(self, must_create=False): session_data = self.encode(self._get_session(no_load=must_create)) key = self._make_key(self._get_or_create_session_key()) if key is None: - # XXX must_create = True w/ bad key or misconfigured KEY_GENERATOR, - # which has already been logged in _make_key. + # XXX must_create = True w/ bad key or misconfigured + # KEY_GENERATOR, which has already been logged in _make_key. raise CreateError - result = pipe(key, session_data).expire(key, self.get_expiry_age()).execute() - if must_create and not (result[0] and result[1]): # for Python 2.4 (Django 1.3) + result = pipe(key, session_data).expire( + key, self.get_expiry_age() + ).execute() + + # for Python 2.4 (Django 1.3) + if must_create and not (result[0] and result[1]): raise CreateError def load(self): diff --git a/redisession/helper.py b/redisession/helper.py index 7dd3115..adb5f58 100644 --- a/redisession/helper.py +++ b/redisession/helper.py @@ -1,7 +1,10 @@ -from django.conf import settings +# -*- coding: utf-8 -*- import redis +from django.conf import settings _connections = {} + + def get_redis(conf_name='default'): """simple helper for getting global Redis connection instances""" if conf_name not in _connections: diff --git a/redisession/management/commands/cleanuprs.py b/redisession/management/commands/cleanuprs.py index 97f4598..1bae9a5 100644 --- a/redisession/management/commands/cleanuprs.py +++ b/redisession/management/commands/cleanuprs.py @@ -1,9 +1,14 @@ +# -*- coding: utf-8 -*- import struct import time + from django.core.management.base import NoArgsCommand + class Command(NoArgsCommand): + help = """Clean out expired sessions from redisession data.""" + def handle_noargs(self, **options): from redisession.backend import conf, get_redis # don't bother to check if hash mode is disabled diff --git a/redisession/tests.py b/redisession/tests.py index a1a7146..9f8b6c1 100644 --- a/redisession/tests.py +++ b/redisession/tests.py @@ -1,13 +1,18 @@ +# -*- coding: utf-8 -*- from django.conf import settings from django.contrib.sessions.tests import SessionTestsMixin from django.utils import unittest + conf = getattr(settings, 'REDIS_SESSION_CONFIG', {}) + class RedisSessionTests(SessionTestsMixin, unittest.TestCase): + override_config = { 'USE_HASH': False } + def setUp(self): test_conf = conf.copy() test_conf.update(self.override_config) @@ -32,6 +37,7 @@ def set_session_key(session): class RedisHashSessionTests(RedisSessionTests): + override_config = { 'USE_HASH': True } diff --git a/setup.py b/setup.py index fcfae7c..7f752a6 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from distutils.core import setup setup( @@ -6,11 +7,20 @@ license='MIT', author='Li Meng', author_email='liokmkoil@gmail.com', - packages=['redisession', 'redisession.management', 'redisession.management.commands'], - description='A Redis-based Django session engine for django.contrib.sessions.', + packages=[ + 'redisession', + 'redisession.management', + 'redisession.management.commands' + ], + description= + 'A Redis-based Django session engine for django.contrib.sessions.', long_description=open('README.rst').read(), url='https://github.com/liokm/django-redisession', download_url='https://github.com/liokm/django-redisession', + install_requires=[ + 'django', + 'redis', + ], classifiers=[ 'Development Status :: 4 - Beta', 'Environment :: Web Environment', From 0c4e82c98db117cd64e9cc269ed9c621f59eacdf Mon Sep 17 00:00:00 2001 From: Luke Pomfrey Date: Sat, 19 Oct 2013 16:49:41 +0100 Subject: [PATCH 4/8] Fix calls to serializer --- redisession/backend.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/redisession/backend.py b/redisession/backend.py index 1aacfff..eaf1052 100644 --- a/redisession/backend.py +++ b/redisession/backend.py @@ -75,7 +75,7 @@ def _get_or_create_session_key(self): return self._session_key def encode(self, session_dict): - data = self.serializer.dumps(session_dict) + data = self.serializer().dumps(session_dict) flag = 0 if conf['COMPRESS_LIB'] and len(data) >= conf['COMPRESS_MIN_LENGTH']: compressed = compress_lib.compress(data) @@ -88,10 +88,10 @@ def decode(self, session_data): flag, data = ord(session_data[:1]), session_data[1:] if flag & FLAG_COMPRESSED: if conf['COMPRESS_LIB']: - return self.serializer.loads(compress_lib.decompress(data)) + return self.serializer().loads(compress_lib.decompress(data)) raise ValueError('redisession: found compressed data without ' 'COMPRESS_LIB specified.') - return self.serializer.loads(data) + return self.serializer().loads(data) def create(self): for i in xrange(10000): From f212ecde592dce60d2242d201dce2330e5e60e77 Mon Sep 17 00:00:00 2001 From: Luke Pomfrey Date: Sat, 19 Oct 2013 19:18:18 +0100 Subject: [PATCH 5/8] Fix serialization pre Django 1.5 --- redisession/backend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redisession/backend.py b/redisession/backend.py index eaf1052..6adff8c 100644 --- a/redisession/backend.py +++ b/redisession/backend.py @@ -61,7 +61,7 @@ def __init__(self, session_key=None): from django.utils.six.moves import cPickle as pickle except ImportError: import pickle - self.serializer = pickle + self.serializer = lambda: pickle # XXX Try to partially comply w/ session API of newer Django (>= 1.4) # for Django 1.3 From 20564e88eb870595d4de0cf72966c123ff51c12b Mon Sep 17 00:00:00 2001 From: Luke Pomfrey Date: Tue, 12 Jan 2016 11:34:39 +0000 Subject: [PATCH 6/8] Some cleanup --- redisession/__init__.py | 9 ++- redisession/backend.py | 79 +++++++++----------- redisession/helper.py | 7 +- redisession/management/commands/cleanuprs.py | 4 +- redisession/tests.py | 3 - setup.cfg | 12 +++ setup.py | 74 +++++++++++++----- 7 files changed, 121 insertions(+), 67 deletions(-) create mode 100644 setup.cfg diff --git a/redisession/__init__.py b/redisession/__init__.py index 95e1eac..1d8a015 100644 --- a/redisession/__init__.py +++ b/redisession/__init__.py @@ -1,2 +1,7 @@ -# -*- coding: utf-8 -*- -version = '0.3.1' +from __future__ import unicode_literals + +from distutils import version + + +__version__ = '0.5.0' +version_info = version.StrictVersion(__version__).version diff --git a/redisession/backend.py b/redisession/backend.py index 6adff8c..2be38a5 100644 --- a/redisession/backend.py +++ b/redisession/backend.py @@ -1,14 +1,23 @@ # -*- coding: utf-8 -*- -""" -A redis backend for django session, support string and hash mode. -""" +from __future__ import unicode_literals +import logging import struct import time +from importlib import import_module +import redis from django.conf import settings from django.contrib.sessions.backends.base import CreateError, SessionBase +try: + from django.utils.six.moves import cPickle as pickle +except ImportError: + import pickle + + +logger = logging.getLogger('redisession') + conf = { 'SERVER': {}, @@ -22,58 +31,40 @@ 'COMPRESS_MIN_LENGTH': 400, 'LOG_KEY_ERROR': False } -# For session key contains '0-9a-z' in incoming Django 1.5 -# conf['KEY_GENERATOR'] = lambda x: x.decode('base64') -# conf['HASH_KEY_GENERATOR'] = lambda x: x.decode('base64')[:2] conf.update(getattr(settings, 'REDIS_SESSION_CONFIG', {})) -if conf['LOG_KEY_ERROR']: - import logging - logger = logging.getLogger('redisession') - logger.addHandler(logging.StreamHandler()) - logger.setLevel(logging.WARNING) if isinstance(conf['SERVER'], dict): + class GetRedis(object): + def __call__(self, conf): if not hasattr(self, '_redis'): - import redis self._redis = redis.Redis(**conf) return self._redis + get_redis = GetRedis() + else: from redisession.helper import get_redis + if conf['COMPRESS_LIB']: - from django.utils.importlib import import_module compress_lib = import_module(conf['COMPRESS_LIB']) -# TODO: flag for security verification? + FLAG_COMPRESSED = 1 class SessionStore(SessionBase): + def __init__(self, session_key=None): self._redis = get_redis(conf['SERVER']) super(SessionStore, self).__init__(session_key) + if not hasattr(self, 'serializer'): - try: - from django.utils.six.moves import cPickle as pickle - except ImportError: - import pickle self.serializer = lambda: pickle - # XXX Try to partially comply w/ session API of newer Django (>= 1.4) - # for Django 1.3 - # Instead of checking Django version, test the existence directly. - if not hasattr(SessionBase, '_get_or_create_session_key'): - session_key = property(SessionBase._get_session_key) - - def _get_or_create_session_key(self): - if self._session_key is None: - self._session_key = self._get_new_session_key() - return self._session_key - def encode(self, session_dict): data = self.serializer().dumps(session_dict) flag = 0 @@ -107,12 +98,17 @@ def create(self): if conf['USE_HASH']: def _make_key(self, session_key): try: - return (conf['HASH_KEY_GENERATOR'](session_key), - conf['KEY_GENERATOR'](session_key)) - except: + return ( + conf['HASH_KEY_GENERATOR'](session_key), + conf['KEY_GENERATOR'](session_key) + ) + except Exception: if conf['LOG_KEY_ERROR']: - logger.warning('misconfigured key-generator or bad key ' - '"%s"' % session_key) + logger.warning( + 'misconfigured key-generator or bad key "{}"'.format( + session_key + ) + ) def save(self, must_create=False): if must_create: @@ -124,10 +120,8 @@ def save(self, must_create=False): '>I', int(time.time() + self.get_expiry_age())) key = self._make_key(self._get_or_create_session_key()) if key is None: - # XXX must_create = True w/ bad key or misconfigured - # KEY_GENERATOR, which has already been logged in _make_key. raise CreateError - result = func(*key, value=expire_date+session_data) + result = func(*key, value=expire_date + session_data) if must_create and not result: raise CreateError @@ -161,10 +155,13 @@ def delete(self, session_key=None): def _make_key(self, session_key): try: return conf['KEY_GENERATOR'](session_key) - except: + except Exception: if conf['LOG_KEY_ERROR']: - logger.warning('misconfigured key-generator or bad key ' - '"%s"' % session_key) + logger.warning( + 'misconfigured key-generator or bad key "{}"'.format( + session_key + ) + ) def save(self, must_create=False): pipe = self._redis.pipeline() @@ -175,8 +172,6 @@ def save(self, must_create=False): session_data = self.encode(self._get_session(no_load=must_create)) key = self._make_key(self._get_or_create_session_key()) if key is None: - # XXX must_create = True w/ bad key or misconfigured - # KEY_GENERATOR, which has already been logged in _make_key. raise CreateError result = pipe(key, session_data).expire( key, self.get_expiry_age() diff --git a/redisession/helper.py b/redisession/helper.py index adb5f58..c36d087 100644 --- a/redisession/helper.py +++ b/redisession/helper.py @@ -1,14 +1,17 @@ # -*- coding: utf-8 -*- +from __future__ import unicode_literals + import redis from django.conf import settings + _connections = {} def get_redis(conf_name='default'): """simple helper for getting global Redis connection instances""" if conf_name not in _connections: - # refs redis.Redis for **v _connections[conf_name] = redis.Redis(**getattr( - settings, 'REDIS_CONFIG', {'default': {}})[conf_name]) + settings, 'REDIS_CONFIG', {'default': {}} + )[conf_name]) return _connections[conf_name] diff --git a/redisession/management/commands/cleanuprs.py b/redisession/management/commands/cleanuprs.py index 1bae9a5..24ccd2e 100644 --- a/redisession/management/commands/cleanuprs.py +++ b/redisession/management/commands/cleanuprs.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +from __future__ import unicode_literals + import struct import time @@ -7,7 +9,7 @@ class Command(NoArgsCommand): - help = """Clean out expired sessions from redisession data.""" + help = '''Clean out expired sessions from redisession data.''' def handle_noargs(self, **options): from redisession.backend import conf, get_redis diff --git a/redisession/tests.py b/redisession/tests.py index 9f8b6c1..2a1d1fd 100644 --- a/redisession/tests.py +++ b/redisession/tests.py @@ -21,9 +21,6 @@ def setUp(self): self.backend = SessionStore self.session = self.backend() - def test_decode_django12(self): - "We don't support Django 1.2 ever." - def test_delete(self): self.session.save() self.session.delete(self.session.session_key) diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..3d6d5f4 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,12 @@ +[coverage:run] +omit = + *tests.py + debreach/models.py +include = debreach/* + +[coverage:report] +exclude_lines = + pragma: no cover + def __repr__ + raise NotImplementedError + if __name__ == .__main__.: diff --git a/setup.py b/setup.py index 7f752a6..2e51bc1 100644 --- a/setup.py +++ b/setup.py @@ -1,34 +1,74 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- -from distutils.core import setup + +import os +import re +import sys +from setuptools import setup, find_packages + + +def get_version(package): + ''' + Return package version as listed in `__version__` in `init.py`. + ''' + init_py = open(os.path.join(package, '__init__.py')).read() + return re.search( + '^__version__ = [\'"]([^\'"]+)[\'"]', init_py, re.MULTILINE + ).group(1) + + +version = get_version('debreach') + + +if sys.argv[-1] == 'publish': + os.system('python setup.py sdist upload') + os.system('python setup.py bdist_wheel upload') + args = {'version': version} + print('You probably want to also tag the version now:') + print(' git tag -a {version} -m \'version {version}\''.format( + **args)) + print(' git push --tags') + sys.exit() + setup( - name='django-redisession', - version='0.3.1', + name='django-redisession-ng', + version=version, license='MIT', author='Li Meng', author_email='liokmkoil@gmail.com', - packages=[ - 'redisession', - 'redisession.management', - 'redisession.management.commands' - ], - description= - 'A Redis-based Django session engine for django.contrib.sessions.', + maintainer='Luke Pomfrey', + maintainer_email='lpomfrey@gmail.com', + packages=find_packages(exclude=('test_project', 'docs')), + description=( + 'A Redis-based Django session engine for django.contrib.sessions.' + ), long_description=open('README.rst').read(), - url='https://github.com/liokm/django-redisession', - download_url='https://github.com/liokm/django-redisession', + url='https://github.com/lpomfrey/django-redisession', + download_url='https://github.com/lpomfrey/django-redisession', install_requires=[ - 'django', 'redis', ], + tests_require=[ + 'django', + ], classifiers=[ - 'Development Status :: 4 - Beta', 'Environment :: Web Environment', - 'Framework :: Django', 'Intended Audience :: Developers', - 'License :: OSI Approved :: MIT License', + 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', + 'Framework :: Django', + 'Framework :: Django :: 1.8', + 'Framework :: Django :: 1.9', 'Programming Language :: Python', - 'Topic :: Software Development :: Libraries :: Python Modules', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: Implementation :: CPython', + 'Programming Language :: Python :: Implementation :: PyPy', + 'Topic :: Internet :: WWW/HTTP' ] ) From c183e285221ca369fce910efc00f0010a487864a Mon Sep 17 00:00:00 2001 From: Luke Pomfrey Date: Thu, 14 Jan 2016 18:24:23 +0000 Subject: [PATCH 7/8] Add unmaintained badge --- README.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.rst b/README.rst index 8f878d0..edb3d17 100644 --- a/README.rst +++ b/README.rst @@ -1,3 +1,7 @@ +.. image:: http://unmaintained.tech/badge.svg + :target: http://unmaintained.tech/ + :alt: No Maintenance Intended + ================== Django Redisession ================== From d48bf610660a48ccad4a43cfa9397d6df07eebb7 Mon Sep 17 00:00:00 2001 From: Luke Pomfrey Date: Tue, 24 May 2016 10:55:13 +0100 Subject: [PATCH 8/8] Fix setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 2e51bc1..cc77a16 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ def get_version(package): ).group(1) -version = get_version('debreach') +version = get_version('redisession') if sys.argv[-1] == 'publish':