redis_obj 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +7 -0
- data/README.md +69 -2
- data/TODO.md +5 -0
- data/lib/redis_obj.rb +3 -0
- data/lib/redis_obj/base.rb +5 -1
- data/lib/redis_obj/hash.rb +82 -20
- data/lib/redis_obj/list.rb +60 -44
- data/lib/redis_obj/set.rb +97 -57
- data/lib/redis_obj/sorted_set.rb +58 -52
- data/lib/redis_obj/version.rb +1 -1
- data/redis_obj.gemspec +1 -1
- data/spec/object_types/hash_spec.rb +34 -0
- data/spec/object_types/list_spec.rb +110 -0
- data/spec/object_types/set_spec.rb +206 -0
- data/spec/object_types/sorted_set_spec.rb +11 -0
- data/spec/redis_obj_spec.rb +3 -3
- data/spec/spec_helper.rb +44 -1
- metadata +16 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 813c912763a0a73b1930d20bfbc7a67e72723ca9
|
4
|
+
data.tar.gz: e3795e83b616cdb64daab0d5f8ee920ad7a8f027
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b1ad422bc3469a8c1a2ec6220aa59ea39f58ec3f4115b71151bbf380bb99e6d4896bbf5aef324ec43a6798327d20f5f4cd16fa196695e6030df5f2fa2f098eb
|
7
|
+
data.tar.gz: ea491f767b9a5e669c2af5cff37177af7a4d0e9ceec5dca95c7dc9bd807be8804513c89d86f7a61967f6323753c7ff07531c6d169c13ed71800c1c464b300323
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
# RedisObj
|
2
2
|
|
3
|
-
|
3
|
+
[![Build Status](https://travis-ci.org/tal/redis_obj.png)](https://travis-ci.org/tal/redis_obj)
|
4
|
+
|
5
|
+
This gem allows you to treat redis stores like ruby objects.
|
6
|
+
|
7
|
+
RedisObj::Set.new('myset').include?('foo')
|
8
|
+
|
9
|
+
Will run the redis command
|
10
|
+
|
11
|
+
SISMEMBER myset foo
|
12
|
+
|
13
|
+
So a hash key would act like a ruby hash, a set a set, and a list an array.
|
4
14
|
|
5
15
|
## Installation
|
6
16
|
|
@@ -18,7 +28,64 @@ Or install it yourself as:
|
|
18
28
|
|
19
29
|
## Usage
|
20
30
|
|
21
|
-
|
31
|
+
All the RedisObj wrappers have common ruby functions implemented
|
32
|
+
|
33
|
+
RedisObj::Set.new('set1').to_a
|
34
|
+
# => SMEMBERS set1
|
35
|
+
|
36
|
+
RedisObj::Set.new('set1') & RedisObj::Set.new('set2')
|
37
|
+
#=> SINTER set1 set2
|
38
|
+
|
39
|
+
RedisObj::Set.new('set1') - RedisObj::Set.new('set2')
|
40
|
+
# => SDIFF set1 set2
|
41
|
+
|
42
|
+
You can also just call the methods staright out
|
43
|
+
|
44
|
+
RedisObj::Hash.new('hash1').mget('key','key2')
|
45
|
+
# => HMGET hash1 key key2
|
46
|
+
|
47
|
+
### Relations
|
48
|
+
|
49
|
+
You can embed redis objects into an object very easily.
|
50
|
+
|
51
|
+
class Foo
|
52
|
+
attr_accessor :id, :bar
|
53
|
+
include RedisObj::Relation
|
54
|
+
redis_set :baz
|
55
|
+
end
|
56
|
+
|
57
|
+
This will add a class and instance method to the object.
|
58
|
+
|
59
|
+
foo = Foo.new
|
60
|
+
foo.id = 123
|
61
|
+
foo.baz # => RedisObj::Set.new('foo:123:baz')
|
62
|
+
|
63
|
+
Class method:
|
64
|
+
|
65
|
+
Foo.redis_baz(id: 321) # => RedisObj::Set.new('foo:321:baz')
|
66
|
+
Foo.redis_baz(OpenStruct.new(id: 'myid')) # => RedisObj::Set.new('foo:myid:baz')
|
67
|
+
|
68
|
+
You can override the namespace for all redis relations easily:
|
69
|
+
|
70
|
+
class Foo
|
71
|
+
attr_accessor :id, :bar
|
72
|
+
include RedisObj::Relation
|
73
|
+
store_redis_in { "foons:#{id}:#{bar}" }
|
74
|
+
redis_set :baz, key: 'b'
|
75
|
+
redis_hash :hashy, key: 'h'
|
76
|
+
end
|
77
|
+
|
78
|
+
will allow the relations:
|
79
|
+
|
80
|
+
foo = Foo.new
|
81
|
+
foo.id = 123
|
82
|
+
foo.bar = 'mybar'
|
83
|
+
foo.baz # => RedisObj::Set.new('foons:123:mybar:b')
|
84
|
+
foo.hashy # => RedisObj::Hash.new('foons:123:mybar:h')
|
85
|
+
|
86
|
+
### Examples
|
87
|
+
|
88
|
+
For more information on how relations work or how to use the gem check out the [examples](https://github.com/tal/redis_obj/wiki#examples).
|
22
89
|
|
23
90
|
## Contributing
|
24
91
|
|
data/TODO.md
ADDED
@@ -0,0 +1,5 @@
|
|
1
|
+
* Detect if the redis client is currently pipelined, an instance of `Redis::Pipeline` and warn or error in that situation.
|
2
|
+
* Add range support to `List#[]`
|
3
|
+
* Optionally cache values when you pull down entire set
|
4
|
+
* In storage methods generate a random destination key if not given
|
5
|
+
* Allow sets and lists to interact with arrays directly for comparison actions
|
data/lib/redis_obj.rb
CHANGED
data/lib/redis_obj/base.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
class RedisObj::Base
|
2
|
+
extend Forwardable
|
2
3
|
attr_accessor :key, :redis
|
3
4
|
def initialize redis, key=nil
|
4
5
|
unless key
|
@@ -17,9 +18,12 @@ class RedisObj::Base
|
|
17
18
|
redis.del(key)
|
18
19
|
end
|
19
20
|
|
20
|
-
|
21
|
+
def clear
|
22
|
+
redis.del(key)
|
23
|
+
end
|
21
24
|
|
22
25
|
def get_keys(keys)
|
26
|
+
keys = keys.flatten
|
23
27
|
if keys.first.respond_to?(:key)
|
24
28
|
keys.collect(&:key)
|
25
29
|
else
|
data/lib/redis_obj/hash.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
class RedisObj::Hash < RedisObj::Base
|
2
|
-
|
2
|
+
include Enumerable
|
3
|
+
|
4
|
+
def hdel field
|
3
5
|
redis.hdel(key,field)
|
4
6
|
end
|
7
|
+
alias delete hdel
|
5
8
|
|
6
9
|
def incby field, amt
|
7
10
|
if amt.is_a?(Float)
|
@@ -10,60 +13,119 @@ class RedisObj::Hash < RedisObj::Base
|
|
10
13
|
redis.hincrby(key,field,amt)
|
11
14
|
end
|
12
15
|
end
|
13
|
-
alias
|
16
|
+
alias hincrby incby
|
17
|
+
alias hincrbyfloat incby
|
18
|
+
alias hincbyfloat incby
|
14
19
|
|
20
|
+
# Increment by one
|
15
21
|
def inc field
|
16
22
|
incby(field,1)
|
17
23
|
end
|
24
|
+
alias incr inc
|
18
25
|
|
26
|
+
# Decriment by one
|
19
27
|
def dec field
|
20
28
|
incby(field,-1)
|
21
29
|
end
|
30
|
+
alias decr dec
|
22
31
|
|
23
|
-
def
|
32
|
+
def hmget *fields
|
24
33
|
redis.hmget(key,*fields)
|
25
34
|
end
|
35
|
+
alias values_at hmget
|
26
36
|
|
27
|
-
def
|
37
|
+
def hmset *fields
|
28
38
|
redis.hmset(key,*fields)
|
29
39
|
end
|
30
40
|
|
31
|
-
def
|
41
|
+
def hvals
|
32
42
|
redis.hvals(key)
|
33
43
|
end
|
34
|
-
alias values
|
44
|
+
alias values hvals
|
35
45
|
|
36
|
-
def
|
46
|
+
def hkeys
|
37
47
|
redis.hkeys(key)
|
38
48
|
end
|
39
49
|
|
40
|
-
def
|
50
|
+
def hexists field
|
41
51
|
redis.hexists(key,field)
|
42
52
|
end
|
53
|
+
alias key? hexists
|
54
|
+
alias has_key? hexists
|
43
55
|
|
44
|
-
def
|
56
|
+
def hget field
|
45
57
|
redis.hget(key,field)
|
46
58
|
end
|
47
|
-
alias []
|
59
|
+
alias [] hget
|
48
60
|
|
49
|
-
def
|
61
|
+
def hset field, val
|
50
62
|
redis.hset(key,field,val)
|
51
63
|
end
|
52
|
-
alias []=
|
64
|
+
alias []= hset
|
53
65
|
|
54
|
-
def
|
66
|
+
def hgetall
|
55
67
|
redis.hgetall(key)
|
56
68
|
end
|
57
|
-
alias to_h
|
69
|
+
alias to_h hgetall
|
70
|
+
|
71
|
+
def to_a
|
72
|
+
to_h.to_a
|
73
|
+
end
|
74
|
+
|
75
|
+
def each &blk
|
76
|
+
to_a.each(&blk)
|
77
|
+
end
|
58
78
|
|
59
|
-
def
|
79
|
+
def hlen
|
60
80
|
redis.hlen(key)
|
61
81
|
end
|
62
|
-
alias size
|
63
|
-
alias count
|
64
|
-
alias length
|
82
|
+
alias size hlen
|
83
|
+
alias count hlen
|
84
|
+
alias length hlen
|
85
|
+
|
86
|
+
def clear
|
87
|
+
redis.del(key) and self
|
88
|
+
end
|
89
|
+
|
90
|
+
def empty?
|
91
|
+
hlen == 0
|
92
|
+
end
|
93
|
+
|
94
|
+
def has_key? key
|
95
|
+
keys.include?(key)
|
96
|
+
end
|
97
|
+
alias include? has_key?
|
98
|
+
alias member? has_key?
|
99
|
+
|
100
|
+
def has_value? val
|
101
|
+
values.include?(val)
|
102
|
+
end
|
103
|
+
|
104
|
+
def merge! hsh
|
105
|
+
redis.hmset(key,hsh.to_a.flatten)
|
106
|
+
self
|
107
|
+
end
|
108
|
+
|
109
|
+
# Allow for non prefixed versions of the commands to be sent
|
110
|
+
# as well as making future proof for new versions of redis
|
111
|
+
def method_missing method, *arguments, &blk
|
112
|
+
if redis.respond_to?(method)
|
113
|
+
# If its a method available to redis just pass it along with the key
|
114
|
+
# as the first argument
|
115
|
+
redis.__send__(method,key,*arguments,&blk)
|
116
|
+
else
|
117
|
+
# If redis responds to the method prefixed with an h pass it along
|
118
|
+
if method.to_s[0] != 'h' && (new_method = "h#{method}") && redis.respond_to?(new_method)
|
119
|
+
self.send(new_method,*arguments,&blk)
|
120
|
+
else
|
121
|
+
super
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
65
125
|
|
66
|
-
def
|
67
|
-
redis.
|
126
|
+
def respond_to_missing?(method, include_private = false)
|
127
|
+
return true if redis.respond_to?(method)
|
128
|
+
method = method.to_s
|
129
|
+
method[0] != 'h' && redis.respond_to?("h#{method}") or super
|
68
130
|
end
|
69
131
|
end
|
data/lib/redis_obj/list.rb
CHANGED
@@ -1,58 +1,39 @@
|
|
1
1
|
class RedisObj::List < RedisObj::Base
|
2
2
|
include Enumerable
|
3
3
|
|
4
|
-
def
|
5
|
-
|
4
|
+
def first num=1
|
5
|
+
lrange(0,num-1)
|
6
6
|
end
|
7
7
|
|
8
|
-
def
|
9
|
-
|
8
|
+
def take n
|
9
|
+
first(n)
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
def lindex(index)
|
17
|
-
redis.lindex(key,index)
|
18
|
-
end
|
19
|
-
alias [] lindex
|
20
|
-
|
21
|
-
def linsert(where, pivot, value)
|
22
|
-
redis.linsert(key,where,pivot,value)
|
23
|
-
end
|
24
|
-
|
25
|
-
def lrange(start, stop)
|
26
|
-
redis.lrange(key, start, stop)
|
12
|
+
def last num=1
|
13
|
+
lrange(-1*num,-1)
|
27
14
|
end
|
28
15
|
|
29
16
|
def to_a
|
30
17
|
lrange(0,-1)
|
31
18
|
end
|
32
19
|
|
33
|
-
def
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
def lrem(count, value)
|
38
|
-
redis.lrem(key, count, value)
|
20
|
+
def lindex(index)
|
21
|
+
redis.lindex(key,index)
|
39
22
|
end
|
23
|
+
alias [] lindex
|
24
|
+
alias at lindex
|
40
25
|
|
41
26
|
def lset(index, value)
|
42
27
|
redis.lset(key, index, value)
|
43
28
|
end
|
44
29
|
alias []= lset
|
45
30
|
|
46
|
-
def
|
47
|
-
redis.ltrim(key, start, stop)
|
48
|
-
end
|
49
|
-
|
50
|
-
def len
|
31
|
+
def llen
|
51
32
|
redis.llen(key)
|
52
33
|
end
|
53
|
-
alias length
|
54
|
-
alias size
|
55
|
-
alias count
|
34
|
+
alias length llen
|
35
|
+
alias size llen
|
36
|
+
alias count llen
|
56
37
|
|
57
38
|
def lpop
|
58
39
|
redis.lpop(key)
|
@@ -60,30 +41,65 @@ class RedisObj::List < RedisObj::Base
|
|
60
41
|
alias shift lpop
|
61
42
|
|
62
43
|
def lpush val
|
63
|
-
redis.lpush(val)
|
44
|
+
redis.lpush(key,val)
|
64
45
|
end
|
65
46
|
alias unshift lpush
|
66
47
|
|
67
|
-
def lpushx val
|
68
|
-
redis.lpushx(key,val)
|
69
|
-
end
|
70
|
-
|
71
48
|
def rpop
|
72
49
|
redis.rpop(key)
|
73
50
|
end
|
74
51
|
alias pop rpop
|
75
52
|
|
76
|
-
def rpoplpush destination
|
77
|
-
redis.rpoplpush(key, destination)
|
78
|
-
end
|
79
|
-
|
80
53
|
def rpush val
|
81
54
|
redis.rpush(key,val)
|
82
55
|
end
|
83
56
|
alias << rpush
|
84
57
|
alias push rpush
|
85
58
|
|
86
|
-
def
|
87
|
-
redis
|
59
|
+
def include?(val)
|
60
|
+
warn('Calling include on redis list, must pull down entire list to process')
|
61
|
+
!!find {|v| v == val}
|
62
|
+
end
|
63
|
+
|
64
|
+
def drop n
|
65
|
+
redis.ltrim(key,n,-1)
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
def sample n=1
|
70
|
+
cnt = llen
|
71
|
+
if n==1
|
72
|
+
lindex(rand(cnt))
|
73
|
+
else
|
74
|
+
arr = []
|
75
|
+
n.times do
|
76
|
+
arr << lindex(rand(cnt))
|
77
|
+
end
|
78
|
+
arr
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Make future proof for new versions of redis
|
83
|
+
def method_missing method, *arguments, &blk
|
84
|
+
if redis.respond_to?(method)
|
85
|
+
# If its a method available to redis just pass it along with the key
|
86
|
+
# as the first argument
|
87
|
+
redis.__send__(method,key,*arguments,&blk)
|
88
|
+
else
|
89
|
+
super
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def respond_to_missing?(method, include_private = false)
|
94
|
+
redis.respond_to?(method) || super
|
95
|
+
end
|
96
|
+
|
97
|
+
def_delegators :_delegated_to_a, :pack, :join, :each, :uniq
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def _delegated_to_a
|
102
|
+
warn('Calling include on redis list, must pull down entire list to process')
|
103
|
+
to_a
|
88
104
|
end
|
89
105
|
end
|
data/lib/redis_obj/set.rb
CHANGED
@@ -1,74 +1,48 @@
|
|
1
1
|
class RedisObj::Set < RedisObj::Base
|
2
2
|
include Enumerable
|
3
3
|
|
4
|
-
def
|
4
|
+
def smembers
|
5
5
|
redis.smembers(key)
|
6
6
|
end
|
7
|
-
alias to_a
|
7
|
+
alias to_a smembers
|
8
8
|
|
9
|
-
def
|
9
|
+
def each &blk
|
10
|
+
to_a.each(&blk)
|
11
|
+
end
|
12
|
+
|
13
|
+
def sismember val
|
10
14
|
redis.sismember(key,val)
|
11
15
|
end
|
12
|
-
alias include?
|
16
|
+
alias include? sismember
|
13
17
|
|
14
|
-
def
|
18
|
+
def sinter *keys
|
15
19
|
redis.sinter(key,*get_keys(keys))
|
16
20
|
end
|
17
|
-
alias &
|
18
|
-
|
19
|
-
def interstore destination, *keys
|
20
|
-
redis.sinterstore(destination,key,*get_keys(keys))
|
21
|
-
new_key = self.class.new(redis,destination)
|
22
|
-
|
23
|
-
if block_given?
|
24
|
-
begin
|
25
|
-
yield(new_key)
|
26
|
-
ensure
|
27
|
-
redis.del(destination)
|
28
|
-
end
|
29
|
-
end
|
21
|
+
alias & sinter
|
22
|
+
alias intersection sinter
|
30
23
|
|
31
|
-
|
24
|
+
def sinterstore destination, *keys, &blk
|
25
|
+
store_block_syntax(:sinterstore,destination,keys,&blk)
|
32
26
|
end
|
33
27
|
|
34
|
-
def
|
28
|
+
def sdiff *keys
|
35
29
|
redis.sdiff(key,*get_keys(keys))
|
36
30
|
end
|
37
|
-
alias -
|
38
|
-
|
39
|
-
def diffstore destination, *keys
|
40
|
-
redis.sdiffstore(destination,key,*get_keys(keys))
|
41
|
-
new_key = self.class.new(redis,destination)
|
31
|
+
alias - sdiff
|
32
|
+
alias difference sdiff
|
42
33
|
|
43
|
-
|
44
|
-
|
45
|
-
yield(new_key)
|
46
|
-
ensure
|
47
|
-
redis.del(destination)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
new_key
|
34
|
+
def sdiffstore destination, *keys, &blk
|
35
|
+
store_block_syntax(:sdiffstore,destination,keys,&blk)
|
52
36
|
end
|
53
37
|
|
54
|
-
def
|
38
|
+
def sunion *keys
|
55
39
|
redis.sunion(key,*get_keys(keys))
|
56
40
|
end
|
57
|
-
alias |
|
58
|
-
|
59
|
-
def unionstore destination, *keys
|
60
|
-
redis.sunionstore(destination,key,*get_keys(keys))
|
61
|
-
new_key = self.class.new(redis,destination)
|
62
|
-
|
63
|
-
if block_given?
|
64
|
-
begin
|
65
|
-
yield(new_key)
|
66
|
-
ensure
|
67
|
-
redis.del(destination)
|
68
|
-
end
|
69
|
-
end
|
41
|
+
alias | sunion
|
42
|
+
alias + sunion
|
70
43
|
|
71
|
-
|
44
|
+
def sunionstore destination, *keys, &blk
|
45
|
+
store_block_syntax(:sunionstore,destination,keys,&blk)
|
72
46
|
end
|
73
47
|
|
74
48
|
def pop
|
@@ -77,25 +51,91 @@ class RedisObj::Set < RedisObj::Base
|
|
77
51
|
|
78
52
|
def add val
|
79
53
|
redis.sadd(key,val)
|
54
|
+
self
|
80
55
|
end
|
81
56
|
alias << add
|
82
57
|
|
83
|
-
def
|
84
|
-
redis.
|
58
|
+
def add? val
|
59
|
+
redis.sadd(key,val) ? self : nil
|
60
|
+
end
|
61
|
+
|
62
|
+
def remove(val)
|
63
|
+
srem(val)
|
64
|
+
self
|
65
|
+
end
|
66
|
+
|
67
|
+
def remove?(val)
|
68
|
+
srem(val) ? self : nil
|
85
69
|
end
|
86
70
|
|
87
71
|
def srandmember num=1
|
88
72
|
redis.srandmember(key,num)
|
89
73
|
end
|
74
|
+
alias sample srandmember
|
90
75
|
|
91
|
-
def
|
76
|
+
def scard
|
92
77
|
redis.scard(key)
|
93
78
|
end
|
94
|
-
alias length
|
95
|
-
alias size
|
96
|
-
alias count
|
79
|
+
alias length scard
|
80
|
+
alias size scard
|
81
|
+
alias count scard
|
97
82
|
|
98
|
-
def
|
99
|
-
|
83
|
+
def empty?
|
84
|
+
scard == 0
|
85
|
+
end
|
86
|
+
|
87
|
+
def delete_if(&blk)
|
88
|
+
vals_to_delete = select(&blk)
|
89
|
+
redis.srem(key,vals_to_delete)
|
90
|
+
vals_to_delete
|
91
|
+
end
|
92
|
+
|
93
|
+
# Allow for non prefixed versions of the commands to be sent
|
94
|
+
# as well as making future proof for new versions of redis
|
95
|
+
def method_missing method, *arguments, &blk
|
96
|
+
if redis.respond_to?(method)
|
97
|
+
# If its a method available to redis just pass it along with the key
|
98
|
+
# as the first argument
|
99
|
+
redis.__send__(method,key,*arguments,&blk)
|
100
|
+
else
|
101
|
+
# If redis responds to the method prefixed with an h pass it along
|
102
|
+
if method.to_s[0] != 's' && (new_method = "s#{method}") && redis.respond_to?(new_method)
|
103
|
+
self.send(new_method,*arguments,&blk)
|
104
|
+
else
|
105
|
+
super
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def respond_to_missing?(method, include_private = false)
|
111
|
+
return true if redis.respond_to?(method)
|
112
|
+
method = method.to_s
|
113
|
+
method[0] != 's' && redis.respond_to?("s#{method}") or super
|
114
|
+
end
|
115
|
+
|
116
|
+
private
|
117
|
+
|
118
|
+
# If a block is passed yeild up the new key object and
|
119
|
+
# then delete the key afterwards
|
120
|
+
def store_block_syntax(command, destination, keys, &blk)
|
121
|
+
if block_given?
|
122
|
+
keys.unshift destination
|
123
|
+
destination = SecureRandom.uuid
|
124
|
+
end
|
125
|
+
|
126
|
+
keys.unshift(key)
|
127
|
+
redis.__send__(command,destination,*get_keys(keys))
|
128
|
+
|
129
|
+
new_key = self.class.new(redis,destination)
|
130
|
+
|
131
|
+
if block_given?
|
132
|
+
begin
|
133
|
+
yield(new_key)
|
134
|
+
ensure
|
135
|
+
redis.del(destination)
|
136
|
+
end
|
137
|
+
else
|
138
|
+
new_key
|
139
|
+
end
|
100
140
|
end
|
101
141
|
end
|
data/lib/redis_obj/sorted_set.rb
CHANGED
@@ -1,14 +1,11 @@
|
|
1
1
|
class RedisObj::SortedSet < RedisObj::Base
|
2
|
-
def
|
3
|
-
redis.zadd(key,score,member)
|
4
|
-
end
|
5
|
-
|
6
|
-
def rem member
|
7
|
-
redis.zrem(key,mem)
|
8
|
-
end
|
9
|
-
|
10
|
-
def card min=0,max=0
|
2
|
+
def card min=nil,max=nil
|
11
3
|
if min
|
4
|
+
if min.respond_to?(:max) && min.respond_to?(:min)
|
5
|
+
max = min.max
|
6
|
+
min = min.min
|
7
|
+
end
|
8
|
+
|
12
9
|
redis.zcount(key,min,max)
|
13
10
|
else
|
14
11
|
redis.zcard(key)
|
@@ -16,74 +13,84 @@ class RedisObj::SortedSet < RedisObj::Base
|
|
16
13
|
end
|
17
14
|
alias length card
|
18
15
|
alias size card
|
19
|
-
alias
|
16
|
+
alias zcount card
|
20
17
|
|
21
|
-
def
|
18
|
+
def zincrby amt, member
|
22
19
|
redis.zincby(key,amt,member)
|
23
20
|
end
|
21
|
+
alias incby zincrby
|
24
22
|
|
25
23
|
def inc member
|
26
|
-
|
24
|
+
incrby(1,member)
|
27
25
|
end
|
26
|
+
alias incr inc
|
28
27
|
|
29
28
|
def dec member
|
30
|
-
|
29
|
+
incrby(-1,member)
|
31
30
|
end
|
31
|
+
alias decr dec
|
32
32
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
33
|
+
def zremrangebyrank start, stop=nil
|
34
|
+
if start.respond_to?(:max) && start.respond_to?(:min)
|
35
|
+
stop = start.max
|
36
|
+
start = start.min
|
37
|
+
end
|
36
38
|
|
37
|
-
|
38
|
-
redis.zrevrange(key,start,stop,opts)
|
39
|
+
redis.zremrangebyrank(key,start,stop)
|
39
40
|
end
|
40
41
|
|
41
|
-
def
|
42
|
-
|
43
|
-
|
42
|
+
def zremrangebyscore start, stop=nil
|
43
|
+
if start.respond_to?(:max) && start.respond_to?(:min)
|
44
|
+
stop = start.max
|
45
|
+
start = start.min
|
46
|
+
end
|
44
47
|
|
45
|
-
|
46
|
-
redis.zrevrangebyscore(key,start,stop,opts)
|
48
|
+
redis.zremrangebyscore(key,start,stop)
|
47
49
|
end
|
48
50
|
|
49
|
-
def
|
50
|
-
|
51
|
+
def zinterstore(destination, keys, options = {}, &blk)
|
52
|
+
store_block_syntax(:zinterstore,destination,keys,options,&blk)
|
51
53
|
end
|
52
54
|
|
53
|
-
def
|
54
|
-
|
55
|
+
def zunionstore(destination, keys, options = {}, &blk)
|
56
|
+
store_block_syntax(:zunionstore,destination,keys,options,&blk)
|
55
57
|
end
|
56
58
|
|
57
|
-
|
58
|
-
|
59
|
+
# Allow for non prefixed versions of the commands to be sent
|
60
|
+
# as well as making future proof for new versions of redis
|
61
|
+
def method_missing method, *arguments, &blk
|
62
|
+
if redis.respond_to?(method)
|
63
|
+
# If its a method available to redis just pass it along with the key
|
64
|
+
# as the first argument
|
65
|
+
redis.__send__(method,key,*arguments,&blk)
|
66
|
+
else
|
67
|
+
# If redis responds to the method prefixed with an h pass it along
|
68
|
+
if method.to_s[0] != 'z' && (new_method = "z#{method}") && redis.respond_to?(new_method)
|
69
|
+
self.send(new_method,*arguments,&blk)
|
70
|
+
else
|
71
|
+
super
|
72
|
+
end
|
73
|
+
end
|
59
74
|
end
|
60
75
|
|
61
|
-
def
|
62
|
-
redis.
|
76
|
+
def respond_to_missing?(method, include_private = false)
|
77
|
+
return true if redis.respond_to?(method)
|
78
|
+
method = method.to_s
|
79
|
+
method[0] != 'z' && redis.respond_to?("z#{method}") or super
|
63
80
|
end
|
64
81
|
|
65
|
-
|
66
|
-
keys = [key]+keys
|
67
|
-
|
68
|
-
redis.zinterstore(destination,keys,options)
|
69
|
-
|
70
|
-
new_key = self.class.new(redis,destination)
|
82
|
+
private
|
71
83
|
|
84
|
+
# If a block is passed yeild up the new key object and
|
85
|
+
# then delete the key afterwards
|
86
|
+
def store_block_syntax(command, destination, keys, options,&blk)
|
72
87
|
if block_given?
|
73
|
-
|
74
|
-
|
75
|
-
ensure
|
76
|
-
redis.del(destination)
|
77
|
-
end
|
88
|
+
keys.unshift destination
|
89
|
+
destination = SecureRandom.uuid
|
78
90
|
end
|
79
91
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
def unionstore(destination, keys, options = {})
|
84
|
-
keys = [key]+keys
|
85
|
-
|
86
|
-
redis.zunionstore(destination,keys,options)
|
92
|
+
keys.unshift(key)
|
93
|
+
redis.__send__(command,destination,get_keys(keys),options)
|
87
94
|
|
88
95
|
new_key = self.class.new(redis,destination)
|
89
96
|
|
@@ -93,9 +100,8 @@ class RedisObj::SortedSet < RedisObj::Base
|
|
93
100
|
ensure
|
94
101
|
redis.del(destination)
|
95
102
|
end
|
103
|
+
else
|
104
|
+
new_key
|
96
105
|
end
|
97
|
-
|
98
|
-
new_key
|
99
106
|
end
|
100
|
-
|
101
107
|
end
|
data/lib/redis_obj/version.rb
CHANGED
data/redis_obj.gemspec
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RedisObj::Hash do
|
4
|
+
let(:redis_method) {:"some_redis_method!"}
|
5
|
+
let(:redis) { double(Redis, redis_method => true) }
|
6
|
+
let(:key) { "key#{rand}" }
|
7
|
+
let(:val) { rand }
|
8
|
+
subject {RedisObj::Hash.new(redis,key)}
|
9
|
+
|
10
|
+
it_should_behave_like "a method missing object", 'h'
|
11
|
+
|
12
|
+
describe '#hget' do
|
13
|
+
let(:index) { rand(10000) }
|
14
|
+
before do
|
15
|
+
expect(redis).to receive(:hget).with(key,index).once
|
16
|
+
end
|
17
|
+
|
18
|
+
it { subject.hget(index) }
|
19
|
+
it { subject.get(index) }
|
20
|
+
it { subject[index] }
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#hset' do
|
24
|
+
let(:index) { rand(10000) }
|
25
|
+
let(:val) { rand }
|
26
|
+
before do
|
27
|
+
expect(redis).to receive(:hset).with(key,index,val).once
|
28
|
+
end
|
29
|
+
|
30
|
+
it { subject.hset(index,val) }
|
31
|
+
it { subject.set(index,val) }
|
32
|
+
it { subject[index] = val}
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RedisObj::List do
|
4
|
+
let(:redis_method) {:"some_redis_method!"}
|
5
|
+
let(:redis) { double(Redis, redis_method => true) }
|
6
|
+
let(:key) { "key#{rand}" }
|
7
|
+
let(:val) { rand }
|
8
|
+
subject {RedisObj::List.new(redis,key)}
|
9
|
+
|
10
|
+
it_should_behave_like "a method missing object"
|
11
|
+
|
12
|
+
describe '#lindex' do
|
13
|
+
let(:val) { rand }
|
14
|
+
before do
|
15
|
+
expect(redis).to receive(:lindex).with(key,val).once
|
16
|
+
end
|
17
|
+
|
18
|
+
it { subject.lindex(val) }
|
19
|
+
it { subject[val] }
|
20
|
+
it { subject.at(val) }
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#first' do
|
24
|
+
it "should work with no args" do
|
25
|
+
expect(redis).to receive(:lrange).with(key,0,0).once
|
26
|
+
subject.first
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should work with no args" do
|
30
|
+
expect(redis).to receive(:lrange).with(key,0,2).once
|
31
|
+
subject.first(3)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should work with no args" do
|
35
|
+
expect(redis).to receive(:lrange).with(key,0,2).once
|
36
|
+
subject.take(3)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#last' do
|
41
|
+
it "should work with no args" do
|
42
|
+
expect(redis).to receive(:lrange).with(key,-1,-1).once
|
43
|
+
subject.last
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should work with no args" do
|
47
|
+
expect(redis).to receive(:lrange).with(key,-3,-1).once
|
48
|
+
subject.last(3)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#set' do
|
53
|
+
let(:index) { rand(100000) }
|
54
|
+
before do
|
55
|
+
expect(redis).to receive(:lset).with(key,index,val).once
|
56
|
+
end
|
57
|
+
|
58
|
+
it { subject.lset(index,val) }
|
59
|
+
it { subject[index] = val }
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#llen' do
|
63
|
+
before do
|
64
|
+
expect(redis).to receive(:llen).with(key).once
|
65
|
+
end
|
66
|
+
|
67
|
+
it { subject.length }
|
68
|
+
it { subject.size }
|
69
|
+
it { subject.count }
|
70
|
+
it { subject.llen }
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#lpop' do
|
74
|
+
before do
|
75
|
+
expect(redis).to receive(:lpop).with(key).once
|
76
|
+
end
|
77
|
+
|
78
|
+
it { subject.lpop }
|
79
|
+
it { subject.shift }
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#lpush' do
|
83
|
+
before do
|
84
|
+
expect(redis).to receive(:lpush).with(key,val).once
|
85
|
+
end
|
86
|
+
|
87
|
+
it { subject.lpush val }
|
88
|
+
it { subject.unshift val }
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#rpop' do
|
92
|
+
before do
|
93
|
+
expect(redis).to receive(:rpop).with(key).once
|
94
|
+
end
|
95
|
+
|
96
|
+
it { subject.rpop }
|
97
|
+
it { subject.pop }
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '#rpush' do
|
101
|
+
before do
|
102
|
+
expect(redis).to receive(:rpush).with(key,val).once
|
103
|
+
end
|
104
|
+
|
105
|
+
it { subject.rpush val }
|
106
|
+
it { subject << val}
|
107
|
+
it { subject.push val}
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
@@ -0,0 +1,206 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RedisObj::Set do
|
4
|
+
let(:redis_method) {:"some_redis_method!"}
|
5
|
+
let(:redis) { double(Redis, redis_method => true) }
|
6
|
+
let(:key) { "key#{rand}" }
|
7
|
+
let(:val) { rand }
|
8
|
+
subject {RedisObj::Set.new(redis,key)}
|
9
|
+
|
10
|
+
describe '#smembers' do
|
11
|
+
before do
|
12
|
+
expect(redis).to receive(:smembers).with(key).once
|
13
|
+
end
|
14
|
+
|
15
|
+
it { subject.smembers }
|
16
|
+
it { subject.to_a }
|
17
|
+
it { subject.members }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#sismember' do
|
21
|
+
before do
|
22
|
+
expect(redis).to receive(:sismember).with(key,val).once
|
23
|
+
end
|
24
|
+
|
25
|
+
it { subject.sismember val }
|
26
|
+
it { subject.include? val }
|
27
|
+
it { subject.ismember val }
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'other key interaction' do
|
31
|
+
let(:keys) { %w{key1 key2 key3} }
|
32
|
+
let(:objs) { %w{key1 key2 key3}.collect {|k| RedisObj::Set.new(redis,k)} }
|
33
|
+
let(:destination) { 'destination' }
|
34
|
+
|
35
|
+
let(:test_key) {keys.first}
|
36
|
+
let(:test_objs) {objs.first}
|
37
|
+
|
38
|
+
describe '#sinter' do
|
39
|
+
before do
|
40
|
+
expect(redis).to receive(:sinter).with(key,*keys).once
|
41
|
+
end
|
42
|
+
|
43
|
+
it { subject.sinter *keys }
|
44
|
+
it { subject.sinter keys }
|
45
|
+
it { subject.inter keys }
|
46
|
+
it { subject & keys }
|
47
|
+
it { subject.intersection keys }
|
48
|
+
|
49
|
+
it { subject.sinter *objs }
|
50
|
+
it { subject.sinter objs }
|
51
|
+
it { subject.inter objs }
|
52
|
+
it { subject & objs }
|
53
|
+
it { subject.intersection objs }
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#sdiff' do
|
57
|
+
before do
|
58
|
+
expect(redis).to receive(:sdiff).with(key,*keys).once
|
59
|
+
end
|
60
|
+
|
61
|
+
it { subject.sdiff *keys }
|
62
|
+
it { subject.sdiff keys }
|
63
|
+
it { subject.diff keys }
|
64
|
+
it { subject - keys }
|
65
|
+
it { subject.difference keys }
|
66
|
+
|
67
|
+
it { subject.sdiff *objs }
|
68
|
+
it { subject.sdiff objs }
|
69
|
+
it { subject.diff objs }
|
70
|
+
it { subject - objs }
|
71
|
+
it { subject.difference objs }
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '#sunion' do
|
75
|
+
before do
|
76
|
+
expect(redis).to receive(:sunion).with(key,*keys).once
|
77
|
+
end
|
78
|
+
|
79
|
+
it { subject.sunion *keys }
|
80
|
+
it { subject.sunion keys }
|
81
|
+
it { subject.union keys }
|
82
|
+
it { subject | keys }
|
83
|
+
it { subject + keys }
|
84
|
+
|
85
|
+
it { subject.sunion *objs }
|
86
|
+
it { subject.sunion objs }
|
87
|
+
it { subject.union objs }
|
88
|
+
it { subject | objs }
|
89
|
+
it { subject + objs }
|
90
|
+
end
|
91
|
+
|
92
|
+
describe '#sinterstore' do
|
93
|
+
before do
|
94
|
+
expect(redis).to receive(:sinterstore).with(destination,key,*keys).once
|
95
|
+
end
|
96
|
+
|
97
|
+
it { subject.sinterstore destination, *keys }
|
98
|
+
it { subject.interstore destination, keys }
|
99
|
+
|
100
|
+
it 'should delete key after when returning block' do
|
101
|
+
expect(redis).to receive(:del).with(destination).once
|
102
|
+
expect(redis).to receive(redis_method).with(destination).once
|
103
|
+
expect(SecureRandom).to receive(:uuid).once.and_return(destination)
|
104
|
+
|
105
|
+
subject.sinterstore *keys do |new_key|
|
106
|
+
new_key.send redis_method
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
describe '#sdiffstore' do
|
113
|
+
before do
|
114
|
+
expect(redis).to receive(:sdiffstore).with(destination,key,*keys).once
|
115
|
+
end
|
116
|
+
|
117
|
+
it { subject.sdiffstore destination, *keys }
|
118
|
+
it { subject.diffstore destination, keys }
|
119
|
+
|
120
|
+
it 'should delete key after when returning block' do
|
121
|
+
expect(redis).to receive(:del).with(destination).once
|
122
|
+
expect(redis).to receive(redis_method).with(destination).once
|
123
|
+
expect(SecureRandom).to receive(:uuid).once.and_return(destination)
|
124
|
+
|
125
|
+
subject.sdiffstore *keys do |new_key|
|
126
|
+
new_key.send redis_method
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
describe '#sunionstore' do
|
133
|
+
before do
|
134
|
+
expect(redis).to receive(:sunionstore).with(destination,key,*keys).once
|
135
|
+
end
|
136
|
+
|
137
|
+
it { subject.sunionstore destination, *keys }
|
138
|
+
it { subject.unionstore destination, keys }
|
139
|
+
|
140
|
+
it 'should delete key after when returning block' do
|
141
|
+
expect(redis).to receive(:del).with(destination).once
|
142
|
+
expect(redis).to receive(redis_method).with(destination).once
|
143
|
+
expect(SecureRandom).to receive(:uuid).once.and_return(destination)
|
144
|
+
|
145
|
+
subject.sunionstore *keys do |new_key|
|
146
|
+
new_key.send redis_method
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
describe '#pop' do
|
155
|
+
before do
|
156
|
+
expect(redis).to receive(:pop).with(key).once
|
157
|
+
end
|
158
|
+
|
159
|
+
it { subject.pop }
|
160
|
+
end
|
161
|
+
|
162
|
+
describe '#srandmember' do
|
163
|
+
before do
|
164
|
+
expect(redis).to receive(:srandmember).with(key,1).once
|
165
|
+
end
|
166
|
+
|
167
|
+
it { subject.srandmember }
|
168
|
+
it { subject.randmember }
|
169
|
+
it { subject.sample }
|
170
|
+
end
|
171
|
+
|
172
|
+
describe '#scard' do
|
173
|
+
before do
|
174
|
+
expect(redis).to receive(:scard).with(key).once
|
175
|
+
end
|
176
|
+
|
177
|
+
it { subject.scard }
|
178
|
+
it { subject.card }
|
179
|
+
it { subject.length }
|
180
|
+
it { subject.size }
|
181
|
+
it { subject.count }
|
182
|
+
end
|
183
|
+
|
184
|
+
describe '#add' do
|
185
|
+
let(:ret) {double('return')}
|
186
|
+
before do
|
187
|
+
expect(redis).to receive(:sadd).with(key,val).once.and_return(ret)
|
188
|
+
end
|
189
|
+
|
190
|
+
it { subject.add(val).should be subject }
|
191
|
+
it { subject.sadd(val).should be ret }
|
192
|
+
it { (subject << val).should be subject }
|
193
|
+
end
|
194
|
+
|
195
|
+
describe '#remove' do
|
196
|
+
let(:ret) {double('return')}
|
197
|
+
before do
|
198
|
+
expect(redis).to receive(:srem).with(key,val).once.and_return(ret)
|
199
|
+
end
|
200
|
+
|
201
|
+
it { subject.srem(val).should be ret }
|
202
|
+
it { subject.remove(val).should be subject }
|
203
|
+
end
|
204
|
+
|
205
|
+
it_should_behave_like "a method missing object", 's'
|
206
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RedisObj::SortedSet do
|
4
|
+
let(:redis_method) {:"some_redis_method!"}
|
5
|
+
let(:redis) { double(Redis, redis_method => true) }
|
6
|
+
let(:key) { "key#{rand}" }
|
7
|
+
let(:val) { rand }
|
8
|
+
subject {RedisObj::SortedSet.new(redis,key)}
|
9
|
+
|
10
|
+
it_should_behave_like "a method missing object", 'z'
|
11
|
+
end
|
data/spec/redis_obj_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe RedisObj do
|
4
|
-
let(:base_redis) {
|
4
|
+
let(:base_redis) { double("BaseRedis") }
|
5
5
|
before { RedisObj.redis = base_redis }
|
6
6
|
|
7
7
|
let(:test_klass) do
|
@@ -37,7 +37,7 @@ describe RedisObj do
|
|
37
37
|
|
38
38
|
describe "global redis instance" do
|
39
39
|
subject{obj.friends}
|
40
|
-
let(:redis) {
|
40
|
+
let(:redis) {double('Redis')}
|
41
41
|
|
42
42
|
before { RedisObj.redis = redis; test_klass.redis_set :friends }
|
43
43
|
after { RedisObj.redis = base_redis }
|
@@ -63,7 +63,7 @@ describe RedisObj do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
describe 'redis_set defined default key' do
|
66
|
-
let(:redis) {
|
66
|
+
let(:redis) {double('Redis')}
|
67
67
|
before do
|
68
68
|
test_klass.redis_set :friends
|
69
69
|
test_klass.redis_set :friends2, key: 'f', redis: redis
|
data/spec/spec_helper.rb
CHANGED
@@ -16,7 +16,50 @@ RSpec.configure do |config|
|
|
16
16
|
config.order = 'random'
|
17
17
|
end
|
18
18
|
|
19
|
-
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__),'..','lib')))
|
19
|
+
# $:.unshift(File.expand_path(File.join(File.dirname(__FILE__),'..','lib')))
|
20
20
|
|
21
21
|
require 'redis'
|
22
22
|
require 'redis_obj'
|
23
|
+
|
24
|
+
|
25
|
+
shared_examples "a method missing object" do |has_pefix=false|
|
26
|
+
describe 'method missing' do
|
27
|
+
let(:non_redis_method) { :"rand_method_#{rand}" }
|
28
|
+
|
29
|
+
it 'should respond to redis methods' do
|
30
|
+
subject.respond_to?(redis_method).should be true
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should pass method along' do
|
34
|
+
expect(redis).to receive(redis_method).with(key)
|
35
|
+
subject.__send__(redis_method)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should not respond to non redis methods' do
|
39
|
+
subject.respond_to?(non_redis_method).should be false
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should error if you call non redis method' do
|
43
|
+
redis.should_not_receive(:non_redis_method)
|
44
|
+
expect { subject.send(non_redis_method) }.to raise_error(NoMethodError)
|
45
|
+
end
|
46
|
+
|
47
|
+
if has_pefix
|
48
|
+
let(:prefixed_redis_method) { :"#{has_pefix}prefixed_redis_method" }
|
49
|
+
before do
|
50
|
+
allow(redis).to receive(prefixed_redis_method)
|
51
|
+
end
|
52
|
+
|
53
|
+
it { subject.respond_to?(prefixed_redis_method).should be true }
|
54
|
+
it 'should pass method along' do
|
55
|
+
expect(redis).to receive(prefixed_redis_method).with(key)
|
56
|
+
subject.__send__(prefixed_redis_method)
|
57
|
+
end
|
58
|
+
it { subject.respond_to?(:prefixed_redis_method).should be true }
|
59
|
+
it 'should pass method along' do
|
60
|
+
expect(redis).to receive(:prefixed_redis_method).with(key)
|
61
|
+
subject.__send__(:prefixed_redis_method)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis_obj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tal Atlas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-07-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 2.14.0.rc1
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 2.14.0.rc1
|
69
69
|
description: methods for managing redis keys in an object oriented manner
|
70
70
|
email:
|
71
71
|
- me@tal.by
|
@@ -75,10 +75,12 @@ extra_rdoc_files: []
|
|
75
75
|
files:
|
76
76
|
- .gitignore
|
77
77
|
- .rspec
|
78
|
+
- .travis.yml
|
78
79
|
- Gemfile
|
79
80
|
- LICENSE.txt
|
80
81
|
- README.md
|
81
82
|
- Rakefile
|
83
|
+
- TODO.md
|
82
84
|
- lib/redis_obj.rb
|
83
85
|
- lib/redis_obj/base.rb
|
84
86
|
- lib/redis_obj/hash.rb
|
@@ -88,6 +90,10 @@ files:
|
|
88
90
|
- lib/redis_obj/sorted_set.rb
|
89
91
|
- lib/redis_obj/version.rb
|
90
92
|
- redis_obj.gemspec
|
93
|
+
- spec/object_types/hash_spec.rb
|
94
|
+
- spec/object_types/list_spec.rb
|
95
|
+
- spec/object_types/set_spec.rb
|
96
|
+
- spec/object_types/sorted_set_spec.rb
|
91
97
|
- spec/redis_obj_class_methods_spec.rb
|
92
98
|
- spec/redis_obj_spec.rb
|
93
99
|
- spec/spec_helper.rb
|
@@ -116,6 +122,10 @@ signing_key:
|
|
116
122
|
specification_version: 4
|
117
123
|
summary: kinda like a redis ORM
|
118
124
|
test_files:
|
125
|
+
- spec/object_types/hash_spec.rb
|
126
|
+
- spec/object_types/list_spec.rb
|
127
|
+
- spec/object_types/set_spec.rb
|
128
|
+
- spec/object_types/sorted_set_spec.rb
|
119
129
|
- spec/redis_obj_class_methods_spec.rb
|
120
130
|
- spec/redis_obj_spec.rb
|
121
131
|
- spec/spec_helper.rb
|