ohm 0.0.27 → 0.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +1 -1
- data/Thorfile +14 -0
- data/lib/ohm.rb +6 -7
- data/lib/ohm/redis.rb +90 -45
- data/test/model_test.rb +2 -2
- data/test/redis_test.rb +119 -40
- data/test/test.conf +1 -4
- metadata +7 -5
data/README.markdown
CHANGED
|
@@ -190,7 +190,7 @@ Note that calling these methods results in new sets being created
|
|
|
190
190
|
on the fly. This is important so that you can perform further operations
|
|
191
191
|
before reading the items to the client.
|
|
192
192
|
|
|
193
|
-
For more information, see (
|
|
193
|
+
For more information, see [SINTERSTORE](http://code.google.com/p/redis/wiki/SinterstoreCommand) and [SDIFFSTORE](http://code.google.com/p/redis/wiki/SdiffstoreCommand).
|
|
194
194
|
|
|
195
195
|
Validations
|
|
196
196
|
-----------
|
data/Thorfile
CHANGED
|
@@ -20,8 +20,22 @@ class Ohm < Thor
|
|
|
20
20
|
|
|
21
21
|
desc "test", "Run all tests"
|
|
22
22
|
def test
|
|
23
|
+
invoke "ohm:redis:start"
|
|
24
|
+
|
|
23
25
|
Dir["test/**/*_test.rb"].each do |file|
|
|
24
26
|
load file
|
|
25
27
|
end
|
|
26
28
|
end
|
|
29
|
+
|
|
30
|
+
class Redis < Thor
|
|
31
|
+
desc "start", "Start Redis server"
|
|
32
|
+
def start
|
|
33
|
+
%x{dtach -n /tmp/ohm.dtach redis-server test/test.conf}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
desc "attach", "Attach to Redis server"
|
|
37
|
+
def attach
|
|
38
|
+
%x{dtach -a /tmp/ohm.dtach}
|
|
39
|
+
end
|
|
40
|
+
end
|
|
27
41
|
end
|
data/lib/ohm.rb
CHANGED
|
@@ -610,7 +610,12 @@ module Ohm
|
|
|
610
610
|
end
|
|
611
611
|
|
|
612
612
|
def write
|
|
613
|
-
attributes.
|
|
613
|
+
unless attributes.empty?
|
|
614
|
+
rems, adds = attributes.map { |a| [key(a), send(a)] }.partition { |t| t.last.nil? }
|
|
615
|
+
|
|
616
|
+
db.del(*rems.flatten.compact) unless rems.empty?
|
|
617
|
+
db.mset(adds.flatten) unless adds.empty?
|
|
618
|
+
end
|
|
614
619
|
end
|
|
615
620
|
|
|
616
621
|
private
|
|
@@ -694,12 +699,6 @@ module Ohm
|
|
|
694
699
|
db.get(key(att)) unless new?
|
|
695
700
|
end
|
|
696
701
|
|
|
697
|
-
def write_remote(att, value)
|
|
698
|
-
value.nil? ?
|
|
699
|
-
db.del(key(att)) :
|
|
700
|
-
db.set(key(att), value)
|
|
701
|
-
end
|
|
702
|
-
|
|
703
702
|
def read_locals(attrs)
|
|
704
703
|
attrs.map do |att|
|
|
705
704
|
send(att)
|
data/lib/ohm/redis.rb
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# encoding: UTF-8
|
|
2
2
|
|
|
3
|
+
# Redis client based on RubyRedis, original work of Salvatore Sanfilippo
|
|
4
|
+
# http://github.com/antirez/redis/blob/4a327b4af9885d89b5860548f44569d1d2bde5ab/client-libraries/ruby_2/rubyredis.rb
|
|
5
|
+
#
|
|
6
|
+
# Some improvements where inspired by the Redis-rb library, including the testing suite.
|
|
7
|
+
# http://github.com/ezmobius/redis-rb/
|
|
3
8
|
require 'socket'
|
|
4
9
|
|
|
5
10
|
begin
|
|
@@ -22,25 +27,34 @@ module Ohm
|
|
|
22
27
|
end
|
|
23
28
|
end
|
|
24
29
|
|
|
25
|
-
|
|
26
|
-
:
|
|
27
|
-
:
|
|
28
|
-
:rpush => true,
|
|
30
|
+
BULK_COMMANDS = {
|
|
31
|
+
:echo => true,
|
|
32
|
+
:getset => true,
|
|
29
33
|
:lpush => true,
|
|
30
|
-
:lset => true,
|
|
31
34
|
:lrem => true,
|
|
35
|
+
:lset => true,
|
|
36
|
+
:rpoplpush => true,
|
|
37
|
+
:rpush => true,
|
|
32
38
|
:sadd => true,
|
|
33
|
-
:
|
|
39
|
+
:set => true,
|
|
40
|
+
:setnx => true,
|
|
34
41
|
:sismember => true,
|
|
35
|
-
:
|
|
36
|
-
:
|
|
37
|
-
:
|
|
42
|
+
:smove => true,
|
|
43
|
+
:srem => true,
|
|
44
|
+
:zadd => true,
|
|
45
|
+
:zrem => true,
|
|
46
|
+
:zscore => true
|
|
38
47
|
}
|
|
39
48
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
49
|
+
MULTI_BULK_COMMANDS = {
|
|
50
|
+
:mset => true,
|
|
51
|
+
:msetnx => true
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
PROCESSOR_IDENTITY = lambda { |reply| reply }
|
|
55
|
+
PROCESSOR_CONVERT_TO_BOOL = lambda { |reply| reply == 0 ? false : reply }
|
|
56
|
+
PROCESSOR_SPLIT_KEYS = lambda { |reply| reply.split(" ") }
|
|
57
|
+
PROCESSOR_INFO = lambda do |reply|
|
|
44
58
|
info = Hash.new
|
|
45
59
|
reply.each_line do |line|
|
|
46
60
|
key, value = line.split(":", 2).map { |part| part.chomp }
|
|
@@ -49,30 +63,33 @@ module Ohm
|
|
|
49
63
|
info
|
|
50
64
|
end
|
|
51
65
|
|
|
52
|
-
|
|
53
|
-
:exists =>
|
|
54
|
-
:sismember=>
|
|
55
|
-
:sadd=>
|
|
56
|
-
:srem=>
|
|
57
|
-
:smove=>
|
|
58
|
-
:
|
|
59
|
-
:
|
|
60
|
-
:
|
|
61
|
-
:
|
|
62
|
-
:
|
|
63
|
-
:
|
|
64
|
-
:
|
|
66
|
+
REPLY_PROCESSOR = {
|
|
67
|
+
:exists => PROCESSOR_CONVERT_TO_BOOL,
|
|
68
|
+
:sismember=> PROCESSOR_CONVERT_TO_BOOL,
|
|
69
|
+
:sadd=> PROCESSOR_CONVERT_TO_BOOL,
|
|
70
|
+
:srem=> PROCESSOR_CONVERT_TO_BOOL,
|
|
71
|
+
:smove=> PROCESSOR_CONVERT_TO_BOOL,
|
|
72
|
+
:zadd => PROCESSOR_CONVERT_TO_BOOL,
|
|
73
|
+
:zrem => PROCESSOR_CONVERT_TO_BOOL,
|
|
74
|
+
:move=> PROCESSOR_CONVERT_TO_BOOL,
|
|
75
|
+
:setnx=> PROCESSOR_CONVERT_TO_BOOL,
|
|
76
|
+
:del=> PROCESSOR_CONVERT_TO_BOOL,
|
|
77
|
+
:renamenx=> PROCESSOR_CONVERT_TO_BOOL,
|
|
78
|
+
:expire=> PROCESSOR_CONVERT_TO_BOOL,
|
|
79
|
+
:keys => PROCESSOR_SPLIT_KEYS,
|
|
80
|
+
:info => PROCESSOR_INFO
|
|
65
81
|
}
|
|
66
82
|
|
|
67
|
-
|
|
68
|
-
hash[key] =
|
|
83
|
+
REPLY_PROCESSOR.send(:initialize) do |hash, key|
|
|
84
|
+
hash[key] = PROCESSOR_IDENTITY
|
|
69
85
|
end
|
|
70
86
|
|
|
71
|
-
def initialize(
|
|
72
|
-
@host =
|
|
73
|
-
@port =
|
|
74
|
-
@db =
|
|
75
|
-
@timeout =
|
|
87
|
+
def initialize(options = {})
|
|
88
|
+
@host = options[:host] || '127.0.0.1'
|
|
89
|
+
@port = options[:port] || 6379
|
|
90
|
+
@db = options[:db] || 0
|
|
91
|
+
@timeout = options[:timeout] || 0
|
|
92
|
+
@password = options[:password]
|
|
76
93
|
connect
|
|
77
94
|
end
|
|
78
95
|
|
|
@@ -104,6 +121,7 @@ module Ohm
|
|
|
104
121
|
|
|
105
122
|
def connect
|
|
106
123
|
connect_to(@host, @port, @timeout == 0 ? nil : @timeout)
|
|
124
|
+
call_command([:auth, @password]) if @password
|
|
107
125
|
call_command([:select, @db]) if @db != 0
|
|
108
126
|
@sock
|
|
109
127
|
end
|
|
@@ -172,26 +190,49 @@ module Ohm
|
|
|
172
190
|
end
|
|
173
191
|
|
|
174
192
|
def raw_call_command(argv)
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
193
|
+
bulk_command?(argv) ?
|
|
194
|
+
process_bulk_command(argv) :
|
|
195
|
+
multi_bulk_command?(argv) ?
|
|
196
|
+
process_multi_bulk_command(argv) :
|
|
197
|
+
process_command(argv)
|
|
178
198
|
process_reply(argv[0])
|
|
179
199
|
end
|
|
180
200
|
|
|
181
|
-
def
|
|
182
|
-
|
|
201
|
+
def process_command(argv)
|
|
202
|
+
@sock.write("#{argv.join(" ")}\r\n")
|
|
183
203
|
end
|
|
184
204
|
|
|
185
|
-
def
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
205
|
+
def process_bulk_command(argv)
|
|
206
|
+
bulk = argv.pop.to_s
|
|
207
|
+
argv.push ssize(bulk)
|
|
208
|
+
@sock.write("#{argv.join(" ")}\r\n")
|
|
209
|
+
@sock.write("#{bulk}\r\n")
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def process_multi_bulk_command(argv)
|
|
213
|
+
params = argv.pop.to_a.flatten
|
|
214
|
+
params.unshift(argv[0])
|
|
215
|
+
|
|
216
|
+
command = ["*#{params.size}"]
|
|
217
|
+
params.each do |param|
|
|
218
|
+
param = param.to_s
|
|
219
|
+
command << "$#{ssize(param)}"
|
|
220
|
+
command << param
|
|
190
221
|
end
|
|
222
|
+
|
|
223
|
+
@sock.write(command.map { |cmd| "#{cmd}\r\n"}.join)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def bulk_command?(argv)
|
|
227
|
+
BULK_COMMANDS[argv[0]] and argv.length > 1
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def multi_bulk_command?(argv)
|
|
231
|
+
MULTI_BULK_COMMANDS[argv[0]]
|
|
191
232
|
end
|
|
192
233
|
|
|
193
234
|
def process_reply(command)
|
|
194
|
-
|
|
235
|
+
REPLY_PROCESSOR[command][read_reply]
|
|
195
236
|
end
|
|
196
237
|
|
|
197
238
|
def read_reply
|
|
@@ -239,7 +280,7 @@ module Ohm
|
|
|
239
280
|
|
|
240
281
|
def format_bulk_reply(line)
|
|
241
282
|
bulklen = line.to_i
|
|
242
|
-
return
|
|
283
|
+
return if bulklen == -1
|
|
243
284
|
reply = @sock.read(bulklen)
|
|
244
285
|
@sock.read(2) # Discard CRLF.
|
|
245
286
|
|
|
@@ -253,5 +294,9 @@ module Ohm
|
|
|
253
294
|
line.to_i.times { reply << read_reply }
|
|
254
295
|
reply
|
|
255
296
|
end
|
|
297
|
+
|
|
298
|
+
def ssize(string)
|
|
299
|
+
string.respond_to?(:bytesize) ? string.bytesize : string.size
|
|
300
|
+
end
|
|
256
301
|
end
|
|
257
302
|
end
|
data/test/model_test.rb
CHANGED
|
@@ -100,7 +100,7 @@ class TestRedis < Test::Unit::TestCase
|
|
|
100
100
|
|
|
101
101
|
context "Finding an event" do
|
|
102
102
|
setup do
|
|
103
|
-
Ohm.redis.sadd("Event", 1)
|
|
103
|
+
Ohm.redis.sadd("Event:all", 1)
|
|
104
104
|
Ohm.redis.set("Event:1:name", "Concert")
|
|
105
105
|
end
|
|
106
106
|
|
|
@@ -171,7 +171,7 @@ class TestRedis < Test::Unit::TestCase
|
|
|
171
171
|
end
|
|
172
172
|
|
|
173
173
|
context "Saving a model" do
|
|
174
|
-
should "create the model if it
|
|
174
|
+
should "create the model if it is new" do
|
|
175
175
|
event = Event.new(:name => "Foo").save
|
|
176
176
|
assert_equal "Foo", Event[event.id].name
|
|
177
177
|
end
|
data/test/redis_test.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
require File.join(File.dirname(__FILE__), "test_helper")
|
|
2
2
|
|
|
3
|
+
# This test suit is based on the Redis-rb spec,
|
|
4
|
+
# located at http://github.com/ezmobius/redis-rb/
|
|
3
5
|
class Foo
|
|
4
6
|
attr_accessor :bar
|
|
5
7
|
def initialize(bar)
|
|
@@ -22,30 +24,43 @@ class RedisTest < Test::Unit::TestCase
|
|
|
22
24
|
@r.flushdb
|
|
23
25
|
end
|
|
24
26
|
|
|
25
|
-
should "
|
|
27
|
+
should "be able to GET a key" do
|
|
26
28
|
assert_equal "bar", @r.get("foo")
|
|
27
29
|
end
|
|
28
30
|
|
|
29
|
-
should "
|
|
31
|
+
should "be able to SET a key" do
|
|
30
32
|
@r.set("foo", "nik")
|
|
31
33
|
assert_equal "nik", @r.get("foo")
|
|
32
34
|
end
|
|
33
35
|
|
|
34
|
-
should "
|
|
36
|
+
should "be able to SETNX(setnx)" do
|
|
35
37
|
@r.set("foo", "nik")
|
|
36
38
|
assert_equal "nik", @r.get("foo")
|
|
37
39
|
@r.setnx("foo", "bar")
|
|
38
40
|
assert_equal "nik", @r.get("foo")
|
|
39
41
|
end
|
|
40
42
|
|
|
41
|
-
should "
|
|
43
|
+
should "be able to MSET keys" do
|
|
44
|
+
@r.mset(:foo => "foobar", :bar => 1000)
|
|
45
|
+
assert_equal ["foobar", "1000"], @r.mget("foo", "bar")
|
|
46
|
+
assert_equal ["foobar", "1000", nil], @r.mget("foo", "bar", "baz")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
should "be able to MGET keys" do
|
|
50
|
+
@r.set("foo", 1000)
|
|
51
|
+
@r.set("bar", 2000)
|
|
52
|
+
assert_equal ["1000", "2000"], @r.mget("foo", "bar")
|
|
53
|
+
assert_equal ["1000", "2000", nil], @r.mget("foo", "bar", "baz")
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
should "be able to INCR(increment) a key" do
|
|
42
57
|
@r.del("counter")
|
|
43
58
|
assert_equal 1, @r.incr("counter")
|
|
44
59
|
assert_equal 2, @r.incr("counter")
|
|
45
60
|
assert_equal 3, @r.incr("counter")
|
|
46
61
|
end
|
|
47
62
|
|
|
48
|
-
should "
|
|
63
|
+
should "be able to DECR(decrement) a key" do
|
|
49
64
|
@r.del("counter")
|
|
50
65
|
assert_equal 1, @r.incr("counter")
|
|
51
66
|
assert_equal 2, @r.incr("counter")
|
|
@@ -54,11 +69,11 @@ class RedisTest < Test::Unit::TestCase
|
|
|
54
69
|
assert_equal 0, @r.decrby("counter", 2)
|
|
55
70
|
end
|
|
56
71
|
|
|
57
|
-
should "
|
|
72
|
+
should "be able to RANDKEY(return a random key)" do
|
|
58
73
|
assert_not_nil @r.randomkey
|
|
59
74
|
end
|
|
60
75
|
|
|
61
|
-
should "
|
|
76
|
+
should "be able to RENAME a key" do
|
|
62
77
|
@r.del "foo"
|
|
63
78
|
@r.del "bar"
|
|
64
79
|
@r.set("foo", "hi")
|
|
@@ -66,7 +81,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
66
81
|
assert_equal "hi", @r.get("bar")
|
|
67
82
|
end
|
|
68
83
|
|
|
69
|
-
should "
|
|
84
|
+
should "be able to RENAMENX(rename unless the new key already exists) a key" do
|
|
70
85
|
@r.del "foo"
|
|
71
86
|
@r.del "bar"
|
|
72
87
|
@r.set("foo", "hi")
|
|
@@ -77,14 +92,14 @@ class RedisTest < Test::Unit::TestCase
|
|
|
77
92
|
assert_equal "ohai", @r.get("bar")
|
|
78
93
|
end
|
|
79
94
|
|
|
80
|
-
should "
|
|
95
|
+
should "be able to EXISTS(check if key exists)" do
|
|
81
96
|
@r.set("foo", "nik")
|
|
82
97
|
assert @r.exists("foo")
|
|
83
98
|
@r.del "foo"
|
|
84
99
|
assert_equal false, @r.exists("foo")
|
|
85
100
|
end
|
|
86
101
|
|
|
87
|
-
should "
|
|
102
|
+
should "be able to KEYS(glob for keys)" do
|
|
88
103
|
@r.keys("f*").each do |key|
|
|
89
104
|
@r.del key
|
|
90
105
|
end
|
|
@@ -94,14 +109,14 @@ class RedisTest < Test::Unit::TestCase
|
|
|
94
109
|
assert_equal ["f","fo", "foo"], @r.keys("f*").sort
|
|
95
110
|
end
|
|
96
111
|
|
|
97
|
-
should "
|
|
112
|
+
should "be able to check the TYPE of a key" do
|
|
98
113
|
@r.set("foo", "nik")
|
|
99
114
|
assert_equal "string", @r.type("foo")
|
|
100
115
|
@r.del "foo"
|
|
101
116
|
assert_equal "none", @r.type("foo")
|
|
102
117
|
end
|
|
103
118
|
|
|
104
|
-
should "
|
|
119
|
+
should "be able to push to the head of a list" do
|
|
105
120
|
@r.lpush "list", "hello"
|
|
106
121
|
@r.lpush "list", 42
|
|
107
122
|
assert_equal "list", @r.type("list")
|
|
@@ -110,14 +125,14 @@ class RedisTest < Test::Unit::TestCase
|
|
|
110
125
|
@r.del("list")
|
|
111
126
|
end
|
|
112
127
|
|
|
113
|
-
should "
|
|
128
|
+
should "be able to push to the tail of a list" do
|
|
114
129
|
@r.rpush "list", "hello"
|
|
115
130
|
assert_equal "list", @r.type("list")
|
|
116
131
|
assert_equal 1, @r.llen("list")
|
|
117
132
|
@r.del("list")
|
|
118
133
|
end
|
|
119
134
|
|
|
120
|
-
should "
|
|
135
|
+
should "be able to pop the tail of a list" do
|
|
121
136
|
@r.rpush "list", "hello"
|
|
122
137
|
@r.rpush "list", "goodbye"
|
|
123
138
|
assert_equal "list", @r.type("list")
|
|
@@ -126,7 +141,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
126
141
|
@r.del("list")
|
|
127
142
|
end
|
|
128
143
|
|
|
129
|
-
should "
|
|
144
|
+
should "be able to pop the head of a list" do
|
|
130
145
|
@r.rpush "list", "hello"
|
|
131
146
|
@r.rpush "list", "goodbye"
|
|
132
147
|
assert_equal "list", @r.type("list")
|
|
@@ -135,7 +150,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
135
150
|
@r.del("list")
|
|
136
151
|
end
|
|
137
152
|
|
|
138
|
-
should "
|
|
153
|
+
should "be able to get the length of a list" do
|
|
139
154
|
@r.rpush "list", "hello"
|
|
140
155
|
@r.rpush "list", "goodbye"
|
|
141
156
|
assert_equal "list", @r.type("list")
|
|
@@ -143,7 +158,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
143
158
|
@r.del("list")
|
|
144
159
|
end
|
|
145
160
|
|
|
146
|
-
should "
|
|
161
|
+
should "be able to get a range of values from a list" do
|
|
147
162
|
@r.rpush "list", "hello"
|
|
148
163
|
@r.rpush "list", "goodbye"
|
|
149
164
|
@r.rpush "list", "1"
|
|
@@ -155,7 +170,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
155
170
|
@r.del("list")
|
|
156
171
|
end
|
|
157
172
|
|
|
158
|
-
should "
|
|
173
|
+
should "be able to get all the values from a list" do
|
|
159
174
|
@r.rpush "list", "1"
|
|
160
175
|
@r.rpush "list", "2"
|
|
161
176
|
@r.rpush "list", "3"
|
|
@@ -165,7 +180,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
165
180
|
@r.del("list")
|
|
166
181
|
end
|
|
167
182
|
|
|
168
|
-
should "
|
|
183
|
+
should "be able to trim a list" do
|
|
169
184
|
@r.rpush "list", "hello"
|
|
170
185
|
@r.rpush "list", "goodbye"
|
|
171
186
|
@r.rpush "list", "1"
|
|
@@ -179,7 +194,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
179
194
|
@r.del("list")
|
|
180
195
|
end
|
|
181
196
|
|
|
182
|
-
should "
|
|
197
|
+
should "be able to get a value by indexing into a list" do
|
|
183
198
|
@r.rpush "list", "hello"
|
|
184
199
|
@r.rpush "list", "goodbye"
|
|
185
200
|
assert_equal "list", @r.type("list")
|
|
@@ -188,7 +203,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
188
203
|
@r.del("list")
|
|
189
204
|
end
|
|
190
205
|
|
|
191
|
-
should "
|
|
206
|
+
should "be able to set a value by indexing into a list" do
|
|
192
207
|
@r.rpush "list", "hello"
|
|
193
208
|
@r.rpush "list", "hello"
|
|
194
209
|
assert_equal "list", @r.type("list")
|
|
@@ -198,7 +213,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
198
213
|
@r.del("list")
|
|
199
214
|
end
|
|
200
215
|
|
|
201
|
-
should "
|
|
216
|
+
should "be able to remove values from a list LREM" do
|
|
202
217
|
@r.rpush "list", "hello"
|
|
203
218
|
@r.rpush "list", "goodbye"
|
|
204
219
|
assert_equal "list", @r.type("list")
|
|
@@ -208,7 +223,23 @@ class RedisTest < Test::Unit::TestCase
|
|
|
208
223
|
@r.del("list")
|
|
209
224
|
end
|
|
210
225
|
|
|
211
|
-
should "
|
|
226
|
+
should "be able to pop values from a list and push them onto a temp list with RPOPLPUSH" do
|
|
227
|
+
@r.rpush "list", 'one'
|
|
228
|
+
@r.rpush "list", 'two'
|
|
229
|
+
@r.rpush "list", 'three'
|
|
230
|
+
assert_equal "list", @r.type('list')
|
|
231
|
+
assert_equal 3, @r.llen('list')
|
|
232
|
+
assert_equal %w(one two three), @r.lrange('list',0,-1)
|
|
233
|
+
assert_equal [], @r.lrange('tmp',0,-1)
|
|
234
|
+
assert_equal "three", @r.rpoplpush('list', 'tmp')
|
|
235
|
+
assert_equal %w(three), @r.lrange('tmp',0,-1)
|
|
236
|
+
assert_equal "two", @r.rpoplpush('list', 'tmp')
|
|
237
|
+
assert_equal %w(two three), @r.lrange('tmp',0,-1)
|
|
238
|
+
assert_equal "one", @r.rpoplpush('list', 'tmp')
|
|
239
|
+
assert_equal %w(one two three), @r.lrange('tmp',0,-1)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
should "be able add members to a set" do
|
|
212
243
|
@r.sadd "set", "key1"
|
|
213
244
|
@r.sadd "set", "key2"
|
|
214
245
|
assert_equal "set", @r.type("set")
|
|
@@ -217,7 +248,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
217
248
|
@r.del("set")
|
|
218
249
|
end
|
|
219
250
|
|
|
220
|
-
should "
|
|
251
|
+
should "be able delete members to a set" do
|
|
221
252
|
@r.sadd "set", "key1"
|
|
222
253
|
@r.sadd "set", "key2"
|
|
223
254
|
assert_equal "set", @r.type("set")
|
|
@@ -229,7 +260,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
229
260
|
@r.del("set")
|
|
230
261
|
end
|
|
231
262
|
|
|
232
|
-
should "
|
|
263
|
+
should "be able count the members of a set" do
|
|
233
264
|
@r.sadd "set", "key1"
|
|
234
265
|
@r.sadd "set", "key2"
|
|
235
266
|
assert_equal "set", @r.type("set")
|
|
@@ -237,7 +268,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
237
268
|
@r.del("set")
|
|
238
269
|
end
|
|
239
270
|
|
|
240
|
-
should "
|
|
271
|
+
should "be able test for set membership" do
|
|
241
272
|
@r.sadd "set", "key1"
|
|
242
273
|
@r.sadd "set", "key2"
|
|
243
274
|
assert_equal "set", @r.type("set")
|
|
@@ -248,7 +279,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
248
279
|
@r.del("set")
|
|
249
280
|
end
|
|
250
281
|
|
|
251
|
-
should "
|
|
282
|
+
should "be able to do set intersection" do
|
|
252
283
|
@r.sadd "set", "key1"
|
|
253
284
|
@r.sadd "set", "key2"
|
|
254
285
|
@r.sadd "set2", "key2"
|
|
@@ -256,7 +287,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
256
287
|
@r.del("set")
|
|
257
288
|
end
|
|
258
289
|
|
|
259
|
-
should "
|
|
290
|
+
should "be able to do set intersection and store the results in a key" do
|
|
260
291
|
@r.sadd "set", "key1"
|
|
261
292
|
@r.sadd "set", "key2"
|
|
262
293
|
@r.sadd "set2", "key2"
|
|
@@ -265,7 +296,7 @@ class RedisTest < Test::Unit::TestCase
|
|
|
265
296
|
@r.del("set")
|
|
266
297
|
end
|
|
267
298
|
|
|
268
|
-
should "
|
|
299
|
+
should "be able to do crazy SORT queries" do
|
|
269
300
|
@r.set("dog_1", "louie")
|
|
270
301
|
@r.rpush "dogs", 1
|
|
271
302
|
@r.set("dog_2", "lucy")
|
|
@@ -278,13 +309,68 @@ class RedisTest < Test::Unit::TestCase
|
|
|
278
309
|
assert_equal ["taj"], @r.sort("dogs", :get => "dog_*", :limit => [0,1], :order => "desc alpha")
|
|
279
310
|
end
|
|
280
311
|
|
|
281
|
-
should "
|
|
312
|
+
should "be able add members to a zset ZADD" do
|
|
313
|
+
@r.zadd 'zset', 1, 'set'
|
|
314
|
+
assert_equal %w(set), @r.zrange('zset', 0, 1)
|
|
315
|
+
assert_equal 1, @r.zcard('zset')
|
|
316
|
+
@r.del('zset')
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
should "be able count the members of a zset ZCARD" do
|
|
320
|
+
@r.zadd 'zset', 1, 'foo'
|
|
321
|
+
@r.zcard('zset')
|
|
322
|
+
@r.del('zset')
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
should "be able delete members of a zset ZREM" do
|
|
327
|
+
@r.zadd 'zset', 1, 'set'
|
|
328
|
+
assert_equal 1, @r.zcard('zset')
|
|
329
|
+
@r.zadd 'zset', 2, 'set2'
|
|
330
|
+
assert_equal 2, @r.zcard('zset')
|
|
331
|
+
@r.zrem 'zset', 'set'
|
|
332
|
+
assert_equal 1, @r.zcard('zset')
|
|
333
|
+
@r.del('zset')
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
should "be able to get a range of values from a zset ZRANGE" do
|
|
337
|
+
@r.zadd 'zset', 1, 'set'
|
|
338
|
+
@r.zadd 'zset', 2, 'set2'
|
|
339
|
+
@r.zadd 'zset', 3, 'set3'
|
|
340
|
+
assert_equal 3, @r.zcard('zset')
|
|
341
|
+
assert_equal %w(set set2 set3), @r.zrange('zset', 0, 3)
|
|
342
|
+
@r.del('set')
|
|
343
|
+
@r.del('set2')
|
|
344
|
+
@r.del('set3')
|
|
345
|
+
@r.del('zset')
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
should "be able to get a reverse range of values from a zset ZREVRANGE" do
|
|
349
|
+
@r.zadd 'zset', 1, 'set'
|
|
350
|
+
@r.zadd 'zset', 2, 'set2'
|
|
351
|
+
@r.zadd 'zset', 3, 'set3'
|
|
352
|
+
assert_equal 3, @r.zcard('zset')
|
|
353
|
+
assert_equal %w(set3 set2 set), @r.zrevrange('zset', 0, 3)
|
|
354
|
+
@r.del('zset')
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
should "be able to get a range by score of values from a zset ZRANGEBYSCORE" do
|
|
358
|
+
@r.zadd 'zset', 1, 'set'
|
|
359
|
+
@r.zadd 'zset', 2, 'set2'
|
|
360
|
+
@r.zadd 'zset', 3, 'set3'
|
|
361
|
+
@r.zadd 'zset', 4, 'set4'
|
|
362
|
+
assert_equal 4, @r.zcard('zset')
|
|
363
|
+
assert_equal %w(set2 set3), @r.zrangebyscore('zset', 2, 3)
|
|
364
|
+
@r.del('zset')
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
should "provide info" do
|
|
282
368
|
[:last_save_time, :redis_version, :total_connections_received, :connected_clients, :total_commands_processed, :connected_slaves, :uptime_in_seconds, :used_memory, :uptime_in_days, :changes_since_last_save].each do |x|
|
|
283
369
|
assert @r.info.keys.include?(x)
|
|
284
370
|
end
|
|
285
371
|
end
|
|
286
372
|
|
|
287
|
-
should "
|
|
373
|
+
should "be able to flush the database" do
|
|
288
374
|
@r.set("key1", "keyone")
|
|
289
375
|
@r.set("key2", "keytwo")
|
|
290
376
|
assert_equal ["foo", "key1", "key2"], @r.keys("*").sort #foo from before
|
|
@@ -292,20 +378,13 @@ class RedisTest < Test::Unit::TestCase
|
|
|
292
378
|
assert_equal [], @r.keys("*")
|
|
293
379
|
end
|
|
294
380
|
|
|
295
|
-
should "
|
|
381
|
+
should "be able to provide the last save time" do
|
|
296
382
|
savetime = @r.lastsave
|
|
297
383
|
assert_equal Time, Time.at(savetime).class
|
|
298
384
|
assert Time.at(savetime) <= Time.now
|
|
299
385
|
end
|
|
300
386
|
|
|
301
|
-
should "
|
|
302
|
-
@r.set("foo", 1000)
|
|
303
|
-
@r.set("bar", 2000)
|
|
304
|
-
assert_equal ["1000", "2000"], @r.mget("foo", "bar")
|
|
305
|
-
assert_equal ["1000", "2000", nil], @r.mget("foo", "bar", "baz")
|
|
306
|
-
end
|
|
307
|
-
|
|
308
|
-
should "should bgsave" do
|
|
387
|
+
should "bgsave" do
|
|
309
388
|
assert_nothing_raised do
|
|
310
389
|
@r.bgsave
|
|
311
390
|
end
|
data/test/test.conf
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ohm
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.28
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Michel Martens
|
|
@@ -10,7 +10,7 @@ autorequire:
|
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
12
|
|
|
13
|
-
date: 2009-11-
|
|
13
|
+
date: 2009-11-24 00:00:00 -03:00
|
|
14
14
|
default_executable:
|
|
15
15
|
dependencies: []
|
|
16
16
|
|
|
@@ -43,8 +43,10 @@ files:
|
|
|
43
43
|
- test/test_helper.rb
|
|
44
44
|
- test/validations_test.rb
|
|
45
45
|
- test/test.conf
|
|
46
|
-
has_rdoc:
|
|
46
|
+
has_rdoc: true
|
|
47
47
|
homepage: http://github.com/soveran/ohm
|
|
48
|
+
licenses: []
|
|
49
|
+
|
|
48
50
|
post_install_message:
|
|
49
51
|
rdoc_options: []
|
|
50
52
|
|
|
@@ -65,9 +67,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
65
67
|
requirements: []
|
|
66
68
|
|
|
67
69
|
rubyforge_project: ohm
|
|
68
|
-
rubygems_version: 1.3.
|
|
70
|
+
rubygems_version: 1.3.5
|
|
69
71
|
signing_key:
|
|
70
|
-
specification_version:
|
|
72
|
+
specification_version: 3
|
|
71
73
|
summary: Object-hash mapping library for Redis.
|
|
72
74
|
test_files: []
|
|
73
75
|
|