Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,6 @@ dump.rdb
/.emacs.desktop
/redisco/.ropeproject/config.py
.ropeproject
venv
venv2
.idea
6 changes: 5 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@ language: python
python:
- "2.6"
- "2.7"
- "3.4"
- "3.5"
- "3.6"
services:
- redis-server
# command to install redisco with dependencies
install:
- pip install . --use-mirrors
- pip install .
- pip install -r requirements.txt
# command to run tests
script: nosetests --with-doctest
1 change: 1 addition & 0 deletions benchmarks/common.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from __future__ import absolute_import
from redisco import models


Expand Down
10 changes: 7 additions & 3 deletions benchmarks/create.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
from redisco import get_client
from __future__ import absolute_import
from __future__ import print_function

import timeit
from common import Event

from redisco import get_client
from .common import Event


def create_events():
Expand All @@ -16,7 +20,7 @@ def find_events():


def display_results(results, name):
print "%s: 5000 Loops, best of 3: %.02f sec" % (name, min(results))
print("%s: 5000 Loops, best of 3: %.02f sec" % (name, min(results)))

def profile():
import cProfile
Expand Down
3 changes: 2 additions & 1 deletion redisco/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
default_connection_settings = {
'host': 'localhost',
'port': 6379,
'db': 0
'db': 0,
'decode_responses': True,
}


Expand Down
72 changes: 37 additions & 35 deletions redisco/containers.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
# -*- coding: utf-8 -*-
# doctest: +ELLIPSIS

from __future__ import absolute_import
import collections
from functools import partial
from . import default_expire_time
import six
from six.moves import range


def _parse_values(values):
Expand Down Expand Up @@ -35,7 +37,7 @@ def clear(self):
1
>>> s.clear()
>>> s.members
set([])
set()


"""
Expand Down Expand Up @@ -102,8 +104,8 @@ def sadd(self, *values):
3
>>> s.add(["4"])
1
>>> print s
<Set 'test' set(['1', '3', '2', '4'])>
>>> s.members == {'4', '2', '1', '3'}
True
>>> s.clear()

"""
Expand Down Expand Up @@ -138,7 +140,7 @@ def spop(self):
>>> s.spop()
'1'
>>> s.members
set([])
set()

"""
return self.db.spop(self.key)
Expand Down Expand Up @@ -256,17 +258,17 @@ def union(self, key, *other_sets):
2
>>> s3 = s1.union('key3', s2)
>>> s3.key
u'key3'
>>> s3.members
set(['a', 'c', 'b', 'e', 'd'])
'key3'
>>> s3.members == {'e', 'd', 'b', 'a', 'c'}
True
>>> s1.clear()
>>> s2.clear()
>>> s3.clear()

"""
if not isinstance(key, str) and not isinstance(key, unicode):
if not isinstance(key, str) and not isinstance(key, six.text_type):
raise ValueError("Expect a (unicode) string as key")
key = unicode(key)
key = six.text_type(key)

self.db.sunionstore(key, [self.key] + [o.key for o in other_sets])
return Set(key)
Expand All @@ -287,18 +289,18 @@ def intersection(self, key, *other_sets):
2
>>> s3 = s1.intersection('key3', s2)
>>> s3.key
u'key3'
'key3'
>>> s3.members
set(['c'])
{'c'}
>>> s1.clear()
>>> s2.clear()
>>> s3.clear()
"""


if not isinstance(key, str) and not isinstance(key, unicode):
if not isinstance(key, str) and not isinstance(key, six.text_type):
raise ValueError("Expect a (unicode) string as key")
key = unicode(key)
key = six.text_type(key)

self.db.sinterstore(key, [self.key] + [o.key for o in other_sets])
return Set(key)
Expand All @@ -319,17 +321,17 @@ def difference(self, key, *other_sets):
2
>>> s3 = s1.difference('key3', s2)
>>> s3.key
u'key3'
>>> s3.members
set(['a', 'b'])
'key3'
>>> s3.members == {'a', 'b'}
True
>>> s1.clear()
>>> s2.clear()
>>> s3.clear()
"""

if not isinstance(key, str) and not isinstance(key, unicode):
if not isinstance(key, str) and not isinstance(key, six.text_type):
raise ValueError("Expect a (unicode) string as key")
key = unicode(key)
key = six.text_type(key)

self.db.sdiffstore(key, [self.key] + [o.key for o in other_sets])
return Set(key)
Expand Down Expand Up @@ -505,7 +507,7 @@ def lrange(self, start, stop):

>>> l = List("test")
>>> l.push(['a', 'b', 'c', 'd'])
4L
4
>>> l.lrange(1, 2)
['b', 'c']
>>> l.clear()
Expand All @@ -522,7 +524,7 @@ def lpush(self, *values):

>>> l = List("test")
>>> l.lpush(['a', 'b'])
2L
2
>>> l.clear()
"""
return self.db.lpush(self.key, *_parse_values(values))
Expand All @@ -536,9 +538,9 @@ def rpush(self, *values):

>>> l = List("test")
>>> l.lpush(['a', 'b'])
2L
2
>>> l.rpush(['c', 'd'])
4L
4
>>> l.members
['b', 'a', 'c', 'd']
>>> l.clear()
Expand Down Expand Up @@ -589,7 +591,7 @@ def rpoplpush(self, key):

>>> l = List('list1')
>>> l.push(['a', 'b', 'c'])
3L
3
>>> l.rpoplpush('list2')
'c'
>>> l2 = List('list2')
Expand Down Expand Up @@ -656,7 +658,7 @@ def lset(self, idx, value=0):

>>> l = List('test')
>>> l.push(['a', 'b', 'c'])
3L
3
>>> l.lset(0, 'e')
True
>>> l.members
Expand Down Expand Up @@ -709,13 +711,13 @@ def __init__(self, key, target_type, type_args=[], type_kwargs={}, **kwargs):
self.klass = self.value_type(target_type)
self._klass_args = type_args
self._klass_kwargs = type_kwargs
from models.base import Model
from .models.base import Model
self._redisco_model = issubclass(self.klass, Model)

def value_type(self, target_type):
if isinstance(target_type, basestring):
if isinstance(target_type, six.string_types):
t = target_type
from models.base import get_model_from_key
from .models.base import get_model_from_key
target_type = get_model_from_key(target_type)
if target_type is None:
raise ValueError("Unknown Redisco class %s" % t)
Expand All @@ -729,7 +731,7 @@ def typecast_item(self, value):

def typecast_iter(self, values):
if self._redisco_model:
return filter(lambda o: o is not None, [self.klass.objects.get_by_id(v) for v in values])
return [o for o in [self.klass.objects.get_by_id(v) for v in values] if o is not None]
else:
return [self.klass(v, *self._klass_args, **self._klass_kwargs) for v in values]

Expand Down Expand Up @@ -757,13 +759,13 @@ def append(self, value):
self.list.append(self.typecast_stor(value))

def extend(self, iter):
self.list.extend(map(lambda i: self.typecast_stor(i), iter))
self.list.extend([self.typecast_stor(i) for i in iter])

def __setitem__(self, index, value):
self.list[index] = self.typecast_stor(value)

def __iter__(self):
for i in xrange(len(self.list)):
for i in range(len(self.list)):
yield self[i]

def __repr__(self):
Expand Down Expand Up @@ -1211,7 +1213,7 @@ def hset(self, member, value):

>>> h = Hash("foo")
>>> h.hset("bar", "value")
1L
1
>>> h.clear()
"""
return self.db.hset(self.key, member, value)
Expand All @@ -1225,7 +1227,7 @@ def hdel(self, *members):

>>> h = Hash("foo")
>>> h.hset("bar", "value")
1L
1
>>> h.hdel("bar")
1
>>> h.clear()
Expand Down Expand Up @@ -1273,9 +1275,9 @@ def hincrby(self, field, increment=1):

>>> h = Hash("foo")
>>> h.hincrby("bar", 10)
10L
10
>>> h.hincrby("bar", 2)
12L
12
>>> h.clear()
"""
return self.db.hincrby(self.key, field, increment)
Expand Down
16 changes: 10 additions & 6 deletions redisco/containerstests.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
from __future__ import absolute_import
import unittest
import redisco
from redisco import containers as cont
import six
from six.moves import range
from six.moves import zip


class SetTestCase(unittest.TestCase):
Expand Down Expand Up @@ -293,7 +297,7 @@ def test_common_operations(self):
def test_pop_onto(self):
a = cont.List('alpha')
b = cont.List('beta')
a.extend(range(10))
a.extend(list(range(10)))

# test pop_onto
a_snap = list(a.members)
Expand Down Expand Up @@ -345,20 +349,20 @@ def tearDown(self):
self.client.flushdb()

def test_basic_types(self):
alpha = cont.TypedList('alpha', unicode, type_args=('UTF-8',))
alpha = cont.TypedList('alpha', six.text_type)
monies = u'\u0024\u00a2\u00a3\u00a5'
alpha.append(monies)
val = alpha[-1]
self.assertEquals(monies, val)

beta = cont.TypedList('beta', int)
for i in xrange(1000):
for i in range(1000):
beta.append(i)
for i, x in enumerate(beta):
self.assertEquals(i, x)

charlie = cont.TypedList('charlie', float)
for i in xrange(100):
for i in range(100):
val = 1 * pow(10, i*-1)
charlie.append(val)
for i, x in enumerate(charlie):
Expand Down Expand Up @@ -448,9 +452,9 @@ def test_basic(self):
self.assertEqual({'name': "Richard Cypher",
'real_name': "Richard Rahl"}, h.dict)

self.assertEqual(['name', 'real_name'], h.keys())
self.assertEqual(['name', 'real_name'], list(h.keys()))
self.assertEqual(["Richard Cypher", "Richard Rahl"],
h.values())
list(h.values()))

del h['name']
pulled = self.client.hgetall('hkey')
Expand Down
Loading