redis 2.2.2 → 3.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/.gitignore +2 -0
  2. data/.yardopts +3 -0
  3. data/CHANGELOG.md +65 -1
  4. data/README.md +6 -0
  5. data/Rakefile +19 -27
  6. data/lib/redis.rb +737 -170
  7. data/lib/redis/client.rb +82 -67
  8. data/lib/redis/connection/command_helper.rb +15 -16
  9. data/lib/redis/connection/hiredis.rb +6 -3
  10. data/lib/redis/connection/ruby.rb +2 -1
  11. data/lib/redis/connection/synchrony.rb +3 -1
  12. data/lib/redis/distributed.rb +20 -18
  13. data/lib/redis/errors.rb +38 -0
  14. data/lib/redis/hash_ring.rb +2 -2
  15. data/lib/redis/pipeline.rb +91 -19
  16. data/lib/redis/subscribe.rb +1 -16
  17. data/lib/redis/version.rb +1 -1
  18. data/redis.gemspec +30 -11
  19. data/test/command_map_test.rb +29 -0
  20. data/test/commands_on_hashes_test.rb +3 -3
  21. data/test/commands_on_lists_test.rb +1 -1
  22. data/test/commands_on_sets_test.rb +0 -2
  23. data/test/commands_on_sorted_sets_test.rb +8 -9
  24. data/test/commands_on_strings_test.rb +3 -3
  25. data/test/commands_on_value_types_test.rb +0 -1
  26. data/test/connection_handling_test.rb +120 -4
  27. data/test/distributed_commands_on_hashes_test.rb +0 -1
  28. data/test/distributed_commands_on_lists_test.rb +0 -1
  29. data/test/distributed_commands_on_sets_test.rb +0 -1
  30. data/test/distributed_commands_on_sorted_sets_test.rb +19 -0
  31. data/test/distributed_commands_on_strings_test.rb +0 -1
  32. data/test/distributed_commands_on_value_types_test.rb +0 -1
  33. data/test/distributed_connection_handling_test.rb +0 -1
  34. data/test/distributed_key_tags_test.rb +0 -1
  35. data/test/distributed_persistence_control_commands_test.rb +0 -1
  36. data/test/distributed_publish_subscribe_test.rb +1 -2
  37. data/test/distributed_remote_server_control_commands_test.rb +2 -3
  38. data/test/distributed_transactions_test.rb +0 -1
  39. data/test/encoding_test.rb +0 -1
  40. data/test/helper.rb +14 -4
  41. data/test/helper_test.rb +8 -0
  42. data/test/internals_test.rb +25 -33
  43. data/test/lint/hashes.rb +17 -3
  44. data/test/lint/internals.rb +2 -3
  45. data/test/lint/lists.rb +17 -3
  46. data/test/lint/sets.rb +30 -6
  47. data/test/lint/sorted_sets.rb +56 -27
  48. data/test/lint/strings.rb +9 -13
  49. data/test/lint/value_types.rb +12 -15
  50. data/test/persistence_control_commands_test.rb +0 -1
  51. data/test/pipelining_commands_test.rb +69 -6
  52. data/test/publish_subscribe_test.rb +1 -1
  53. data/test/redis_mock.rb +14 -5
  54. data/test/remote_server_control_commands_test.rb +8 -2
  55. data/test/sorting_test.rb +0 -1
  56. data/test/test.conf +1 -0
  57. data/test/transactions_test.rb +88 -15
  58. data/test/unknown_commands_test.rb +1 -2
  59. data/test/url_param_test.rb +0 -1
  60. metadata +68 -16
  61. data/lib/redis/compat.rb +0 -21
data/test/lint/strings.rb CHANGED
@@ -1,3 +1,7 @@
1
+ require File.expand_path("../redis_mock", File.dirname(__FILE__))
2
+
3
+ include RedisMock::Helper
4
+
1
5
  test "SET and GET" do |r|
2
6
  r.set("foo", "s1")
3
7
 
@@ -33,14 +37,12 @@ test "SET and GET with ASCII characters" do |r|
33
37
  end
34
38
  end if defined?(Encoding)
35
39
 
36
- test "SETEX" do |r|
37
- r.setex("foo", 1, "s1")
38
-
39
- assert "s1" == r.get("foo")
40
-
41
- sleep 2
40
+ test "SETEX" do
41
+ redis_mock(:setex => lambda { |*args| "+#{args.join(" ")}" }) do
42
+ r = Redis.new(OPTIONS.merge(:port => 6380))
42
43
 
43
- assert nil == r.get("foo")
44
+ assert_equal "foo 1 s1", r.setex("foo", 1, "s1")
45
+ end
44
46
  end
45
47
 
46
48
  test "GETSET" do |r|
@@ -95,12 +97,6 @@ test "APPEND" do |r|
95
97
  assert "s1" == r.get("foo")
96
98
  end
97
99
 
98
- test "SUBSTR" do |r|
99
- r.set "foo", "lorem"
100
-
101
- assert "ore" == r.substr("foo", 1, 3)
102
- end
103
-
104
100
  test "GETBIT" do |r|
105
101
  r.set("foo", "a")
106
102
 
@@ -1,3 +1,7 @@
1
+ require File.expand_path("../redis_mock", File.dirname(__FILE__))
2
+
3
+ include RedisMock::Helper
4
+
1
5
  test "EXISTS" do |r|
2
6
  assert false == r.exists("foo")
3
7
 
@@ -23,25 +27,19 @@ test "KEYS" do |r|
23
27
  end
24
28
 
25
29
  test "EXPIRE" do |r|
26
- r.set("foo", "s1")
27
- r.expire("foo", 1)
28
-
29
- assert "s1" == r.get("foo")
30
-
31
- sleep 2
30
+ redis_mock(:expire => lambda { |*args| args == ["foo", "1"] ? ":1" : ":0" }) do
31
+ r = Redis.new(OPTIONS.merge(:port => 6380))
32
32
 
33
- assert nil == r.get("foo")
33
+ assert r.expire("foo", 1)
34
+ end
34
35
  end
35
36
 
36
37
  test "EXPIREAT" do |r|
37
- r.set("foo", "s1")
38
- r.expireat("foo", Time.now.to_i + 1)
39
-
40
- assert "s1" == r.get("foo")
38
+ redis_mock(:expireat => lambda { |*args| args == ["foo", "1328236326"] ? ":1" : ":0" }) do
39
+ r = Redis.new(OPTIONS.merge(:port => 6380))
41
40
 
42
- sleep 2
43
-
44
- assert nil == r.get("foo")
41
+ assert r.expireat("foo", 1328236326)
42
+ end
45
43
  end
46
44
 
47
45
  test "PERSIST" do |r|
@@ -81,4 +79,3 @@ test "MOVE" do |r|
81
79
  assert "s1" == r.get("foo")
82
80
  assert "s3" == r.get("bar")
83
81
  end
84
-
@@ -19,4 +19,3 @@ end
19
19
  test "LASTSAVE" do |r|
20
20
  assert Time.at(r.lastsave) <= Time.now
21
21
  end
22
-
@@ -76,6 +76,69 @@ test "Returning the result of a pipeline" do |r|
76
76
  assert ["OK", "bar", nil] == result
77
77
  end
78
78
 
79
+ test "Assignment of results inside the block" do |r|
80
+ r.pipelined do
81
+ @first = r.sadd("foo", 1)
82
+ @second = r.sadd("foo", 1)
83
+ end
84
+
85
+ assert_equal true, @first.value
86
+ assert_equal false, @second.value
87
+ end
88
+
89
+ # Although we could support accessing the values in these futures,
90
+ # it doesn't make a lot of sense.
91
+ test "Assignment of results inside the block with errors" do |r|
92
+ assert_raise do
93
+ r.pipelined do
94
+ r.doesnt_exist
95
+ @first = r.sadd("foo", 1)
96
+ r.doesnt_exist
97
+ @second = r.sadd("foo", 1)
98
+ r.doesnt_exist
99
+ end
100
+ end
101
+
102
+ assert_raise(Redis::FutureNotReady) { @first.value }
103
+ assert_raise(Redis::FutureNotReady) { @second.value }
104
+ end
105
+
106
+ test "Assignment of results inside a nested block" do |r|
107
+ r.pipelined do
108
+ @first = r.sadd("foo", 1)
109
+
110
+ r.pipelined do
111
+ @second = r.sadd("foo", 1)
112
+ end
113
+ end
114
+
115
+ assert_equal true, @first.value
116
+ assert_equal false, @second.value
117
+ end
118
+
119
+ test "Futures raise when confused with something else" do |r|
120
+ r.pipelined do
121
+ @result = r.sadd("foo", 1)
122
+ end
123
+
124
+ assert_raise(NoMethodError) { @result.to_s }
125
+ end
126
+
127
+ test "Futures raise when trying to access their values too early" do |r|
128
+ r.pipelined do
129
+ assert_raise(Redis::FutureNotReady) do
130
+ r.sadd("foo", 1).value
131
+ end
132
+ end
133
+ end
134
+
135
+ test "Returning the result of an empty pipeline" do |r|
136
+ result = r.pipelined do
137
+ end
138
+
139
+ assert [] == result
140
+ end
141
+
79
142
  test "Nesting pipeline blocks" do |r|
80
143
  r.pipelined do
81
144
  r.set("foo", "s1")
@@ -88,29 +151,29 @@ test "Nesting pipeline blocks" do |r|
88
151
  assert "s2" == r.get("bar")
89
152
  end
90
153
 
91
- test "INFO in a pipeline" do |r|
154
+ test "INFO in a pipeline returns hash" do |r|
92
155
  result = r.pipelined do
93
156
  r.info
94
157
  end
95
158
 
96
- assert result.first.kind_of?(String)
159
+ assert result.first.kind_of?(Hash)
97
160
  end
98
161
 
99
- test "CONFIG GET in a pipeline" do |r|
162
+ test "CONFIG GET in a pipeline returns hash" do |r|
100
163
  result = r.pipelined do
101
164
  r.config(:get, "*")
102
165
  end
103
166
 
104
- assert result.first.kind_of?(Array)
167
+ assert result.first.kind_of?(Hash)
105
168
  end
106
169
 
107
- test "HGETALL in a pipeline should not return hash" do |r|
170
+ test "HGETALL in a pipeline returns hash" do |r|
108
171
  r.hmset("hash", "field", "value")
109
172
  result = r.pipelined do
110
173
  r.hgetall("hash")
111
174
  end
112
175
 
113
- assert ["field", "value"] == result.first
176
+ assert result.first == { "field" => "value" }
114
177
  end
115
178
 
116
179
  test "KEYS in a pipeline" do |r|
@@ -112,7 +112,7 @@ test "SUBSCRIBE within SUBSCRIBE" do |r|
112
112
  end
113
113
 
114
114
  test "other commands within a SUBSCRIBE" do |r|
115
- assert_raise RuntimeError do
115
+ assert_raise Redis::CommandError do
116
116
  r.subscribe("foo") do |on|
117
117
  on.subscribe do |channel, total|
118
118
  r.set("bar", "s2")
data/test/redis_mock.rb CHANGED
@@ -10,9 +10,10 @@ module RedisMock
10
10
  @thread = Thread.new { run(&block) }
11
11
  end
12
12
 
13
- # This raises an exception in the thread calling @server.accept which
14
- # in turn will cause the thread to terminate.
13
+ # Bail out of @server.accept before closing the socket. This is required
14
+ # to avoid EADDRINUSE after a couple of iterations.
15
15
  def shutdown
16
+ @thread.terminate if @thread
16
17
  @server.close if @server
17
18
  rescue => ex
18
19
  $stderr.puts "Error closing mock server: #{ex.message}" if VERBOSE
@@ -34,12 +35,18 @@ module RedisMock
34
35
 
35
36
  response = yield(*parts)
36
37
 
37
- if response.nil?
38
+ # Convert a nil response to :close
39
+ response ||= :close
40
+
41
+ if response == :exit
42
+ session.shutdown(Socket::SHUT_RDWR)
43
+ return # exit server body
44
+ elsif response == :close
38
45
  session.shutdown(Socket::SHUT_RDWR)
39
- break
46
+ break # exit connection body
40
47
  else
41
48
  session.write(response)
42
- session.write("\r\n")
49
+ session.write("\r\n") unless response.end_with?("\r\n")
43
50
  end
44
51
  end
45
52
  rescue Errno::ECONNRESET
@@ -49,6 +56,8 @@ module RedisMock
49
56
  rescue => ex
50
57
  $stderr.puts "Error running mock server: #{ex.message}" if VERBOSE
51
58
  $stderr.puts ex.backtrace if VERBOSE
59
+ ensure
60
+ @server.close
52
61
  end
53
62
  end
54
63
 
@@ -16,8 +16,8 @@ test "INFO" do |r|
16
16
  end
17
17
 
18
18
  test "INFO COMMANDSTATS" do |r|
19
- # Only available on Redis >= 2.3.0
20
- next if r.info["redis_version"] < "2.3.0"
19
+ # Only available on Redis >= 2.9.0
20
+ next if version(r) < 209000
21
21
 
22
22
  r.config(:resetstat)
23
23
  r.ping
@@ -80,3 +80,9 @@ test "SYNC" do |r|
80
80
  assert "OK" == redis.sync
81
81
  end
82
82
  end
83
+
84
+ test "SLOWLOG" do |r|
85
+ r.slowlog(:reset)
86
+ result = r.slowlog(:len)
87
+ assert result == 0
88
+ end
data/test/sorting_test.rb CHANGED
@@ -41,4 +41,3 @@ test "SORT with STORE" do |r|
41
41
  r.sort("bar", :get => "foo:*", :store => "baz")
42
42
  assert ["s1", "s2"] == r.lrange("baz", 0, -1)
43
43
  end
44
-
data/test/test.conf CHANGED
@@ -1,6 +1,7 @@
1
1
  dir ./test/db
2
2
  pidfile ./redis.pid
3
3
  port 6379
4
+ unixsocket /tmp/redis.sock
4
5
  timeout 300
5
6
  loglevel debug
6
7
  logfile stdout
@@ -23,7 +23,61 @@ test "MULTI/EXEC with a block" do |r|
23
23
  end
24
24
 
25
25
  assert "s1" == r.get("foo")
26
+ end
27
+
28
+ test "MULTI/EXEC with a block doesn't return replies for MULTI and EXEC" do |r|
29
+ r1, r2, nothing_else = r.multi do |multi|
30
+ multi.set "foo", "s1"
31
+ multi.get "foo"
32
+ end
33
+
34
+ assert_equal "OK", r1
35
+ assert_equal "s1", r2
36
+ assert_equal nil, nothing_else
37
+ end
38
+
39
+ test "Assignment inside MULTI/EXEC block" do |r|
40
+ r.multi do |m|
41
+ @first = m.sadd("foo", 1)
42
+ @second = m.sadd("foo", 1)
43
+ end
44
+
45
+ assert_equal true, @first.value
46
+ assert_equal false, @second.value
47
+ end
48
+
49
+ # Although we could support accessing the values in these futures,
50
+ # it doesn't make a lot of sense.
51
+ test "Assignment inside MULTI/EXEC block with delayed command errors" do |r|
52
+ assert_raise do
53
+ r.multi do |m|
54
+ @first = m.set("foo", "s1")
55
+ @second = m.incr("foo") # not an integer
56
+ @third = m.lpush("foo", "value") # wrong kind of value
57
+ end
58
+ end
59
+
60
+ assert_equal "OK", @first.value
61
+ assert_raise { @second.value }
62
+ assert_raise { @third.value }
63
+ end
64
+
65
+ test "Assignment inside MULTI/EXEC block with immediate command errors" do |r|
66
+ assert_raise do
67
+ r.multi do |m|
68
+ m.doesnt_exist
69
+ @first = m.sadd("foo", 1)
70
+ m.doesnt_exist
71
+ @second = m.sadd("foo", 1)
72
+ m.doesnt_exist
73
+ end
74
+ end
75
+
76
+ assert_raise(Redis::FutureNotReady) { @first.value }
77
+ assert_raise(Redis::FutureNotReady) { @second.value }
78
+ end
26
79
 
80
+ test "Raise immediate errors in MULTI/EXEC" do |r|
27
81
  assert_raise(RuntimeError) do
28
82
  r.multi do |multi|
29
83
  multi.set "bar", "s2"
@@ -36,29 +90,49 @@ test "MULTI/EXEC with a block" do |r|
36
90
  assert nil == r.get("baz")
37
91
  end
38
92
 
39
- test "Don't raise (and ignore) immediate error in MULTI/EXEC" do |r|
40
- result = r.multi do |m|
41
- m.set("foo", "s1")
42
- m.unknown_command
93
+ test "Transformed replies as return values for MULTI/EXEC block" do |r|
94
+ info, _ = r.multi do |m|
95
+ r.info
43
96
  end
44
97
 
45
- assert 1 == result.size
46
- assert "OK" == result.first
47
- assert "s1" == r.get("foo")
98
+ assert info.kind_of?(Hash)
99
+ end
100
+
101
+ test "Transformed replies inside MULTI/EXEC block" do |r|
102
+ r.multi do |m|
103
+ @info = r.info
104
+ end
105
+
106
+ assert @info.value.kind_of?(Hash)
48
107
  end
49
108
 
50
- test "Don't raise delayed error in MULTI/EXEC" do |r|
51
- result = r.multi do |m|
52
- m.set("foo", "s1")
53
- m.incr("foo") # not an integer
54
- m.lpush("foo", "value") # wrong kind of value
109
+ test "Raise command errors in MULTI/EXEC" do |r|
110
+ assert_raise do
111
+ r.multi do |m|
112
+ m.set("foo", "s1")
113
+ m.incr("foo") # not an integer
114
+ m.lpush("foo", "value") # wrong kind of value
115
+ end
55
116
  end
56
117
 
57
- assert result[1].message =~ /not an integer/i
58
- assert result[2].message =~ /wrong kind of value/i
59
118
  assert "s1" == r.get("foo")
60
119
  end
61
120
 
121
+ test "Raise command errors when accessing futures after MULTI/EXEC" do |r|
122
+ begin
123
+ r.multi do |m|
124
+ m.set("foo", "s1")
125
+ @counter = m.incr("foo") # not an integer
126
+ end
127
+ rescue Exception
128
+ # Not gonna deal with it
129
+ end
130
+
131
+ # We should test for Redis::Error here, but hiredis doesn't yet do
132
+ # custom error classes.
133
+ assert_raise(RuntimeError) { @counter.value }
134
+ end
135
+
62
136
  test "MULTI with a block yielding the client" do |r|
63
137
  r.multi do |multi|
64
138
  multi.set "foo", "s1"
@@ -97,4 +171,3 @@ test "UNWATCH with a modified key" do |r|
97
171
 
98
172
  assert "s2" == r.get("foo")
99
173
  end
100
-
@@ -7,8 +7,7 @@ setup do
7
7
  end
8
8
 
9
9
  test "should try to work" do |r|
10
- assert_raise RuntimeError do
10
+ assert_raise Redis::CommandError do
11
11
  r.not_yet_implemented_command
12
12
  end
13
13
  end
14
-
@@ -57,4 +57,3 @@ test "uses REDIS_URL over default if available" do
57
57
 
58
58
  ENV.delete("REDIS_URL")
59
59
  end
60
-
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.2
5
- prerelease:
4
+ version: 3.0.0.rc1
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Ezra Zygmuntowicz
@@ -14,19 +14,66 @@ authors:
14
14
  - Michel Martens
15
15
  - Damian Janowski
16
16
  - Pieter Noordhuis
17
- autorequire: redis
17
+ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
- date: 2011-08-04 00:00:00.000000000 -03:00
21
- default_executable:
22
- dependencies: []
23
- description: Ruby client library for Redis, the key value storage server
24
- email: ez@engineyard.com
20
+ date: 2012-03-10 00:00:00.000000000 Z
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
23
+ name: rake
24
+ requirement: &2152542300 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ type: :development
31
+ prerelease: false
32
+ version_requirements: *2152542300
33
+ - !ruby/object:Gem::Dependency
34
+ name: cutest
35
+ requirement: &2152541580 !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ type: :development
42
+ prerelease: false
43
+ version_requirements: *2152541580
44
+ - !ruby/object:Gem::Dependency
45
+ name: hiredis
46
+ requirement: &2152541000 !ruby/object:Gem::Requirement
47
+ none: false
48
+ requirements:
49
+ - - ! '>='
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ type: :development
53
+ prerelease: false
54
+ version_requirements: *2152541000
55
+ - !ruby/object:Gem::Dependency
56
+ name: em-synchrony
57
+ requirement: &2152540580 !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: *2152540580
66
+ description: ! " A simple Ruby client trying to match Redis' API one-to-one while
67
+ still providing a Rubystic interface.\n It features thread safety, client-side
68
+ sharding, and an obsession for performance.\n"
69
+ email:
70
+ - redis-db@googlegroups.com
25
71
  executables: []
26
72
  extensions: []
27
73
  extra_rdoc_files: []
28
74
  files:
29
75
  - .gitignore
76
+ - .yardopts
30
77
  - CHANGELOG.md
31
78
  - LICENSE
32
79
  - README.md
@@ -48,7 +95,6 @@ files:
48
95
  - examples/unicorn/unicorn.rb
49
96
  - lib/redis.rb
50
97
  - lib/redis/client.rb
51
- - lib/redis/compat.rb
52
98
  - lib/redis/connection.rb
53
99
  - lib/redis/connection/command_helper.rb
54
100
  - lib/redis/connection/hiredis.rb
@@ -56,11 +102,13 @@ files:
56
102
  - lib/redis/connection/ruby.rb
57
103
  - lib/redis/connection/synchrony.rb
58
104
  - lib/redis/distributed.rb
105
+ - lib/redis/errors.rb
59
106
  - lib/redis/hash_ring.rb
60
107
  - lib/redis/pipeline.rb
61
108
  - lib/redis/subscribe.rb
62
109
  - lib/redis/version.rb
63
110
  - redis.gemspec
111
+ - test/command_map_test.rb
64
112
  - test/commands_on_hashes_test.rb
65
113
  - test/commands_on_lists_test.rb
66
114
  - test/commands_on_sets_test.rb
@@ -73,6 +121,7 @@ files:
73
121
  - test/distributed_commands_on_hashes_test.rb
74
122
  - test/distributed_commands_on_lists_test.rb
75
123
  - test/distributed_commands_on_sets_test.rb
124
+ - test/distributed_commands_on_sorted_sets_test.rb
76
125
  - test/distributed_commands_on_strings_test.rb
77
126
  - test/distributed_commands_on_value_types_test.rb
78
127
  - test/distributed_commands_requiring_clustering_test.rb
@@ -88,6 +137,7 @@ files:
88
137
  - test/encoding_test.rb
89
138
  - test/error_replies_test.rb
90
139
  - test/helper.rb
140
+ - test/helper_test.rb
91
141
  - test/internals_test.rb
92
142
  - test/lint/hashes.rb
93
143
  - test/lint/internals.rb
@@ -108,8 +158,7 @@ files:
108
158
  - test/transactions_test.rb
109
159
  - test/unknown_commands_test.rb
110
160
  - test/url_param_test.rb
111
- has_rdoc: true
112
- homepage: http://github.com/ezmobius/redis-rb
161
+ homepage: https://github.com/ezmobius/redis-rb
113
162
  licenses: []
114
163
  post_install_message:
115
164
  rdoc_options: []
@@ -124,16 +173,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
124
173
  required_rubygems_version: !ruby/object:Gem::Requirement
125
174
  none: false
126
175
  requirements:
127
- - - ! '>='
176
+ - - ! '>'
128
177
  - !ruby/object:Gem::Version
129
- version: '0'
178
+ version: 1.3.1
130
179
  requirements: []
131
- rubyforge_project: redis-rb
132
- rubygems_version: 1.6.2
180
+ rubyforge_project:
181
+ rubygems_version: 1.8.10
133
182
  signing_key:
134
183
  specification_version: 3
135
- summary: Ruby client library for Redis, the key value storage server
184
+ summary: A Ruby client library for the Redis key-value store.
136
185
  test_files:
186
+ - test/command_map_test.rb
137
187
  - test/commands_on_hashes_test.rb
138
188
  - test/commands_on_lists_test.rb
139
189
  - test/commands_on_sets_test.rb
@@ -146,6 +196,7 @@ test_files:
146
196
  - test/distributed_commands_on_hashes_test.rb
147
197
  - test/distributed_commands_on_lists_test.rb
148
198
  - test/distributed_commands_on_sets_test.rb
199
+ - test/distributed_commands_on_sorted_sets_test.rb
149
200
  - test/distributed_commands_on_strings_test.rb
150
201
  - test/distributed_commands_on_value_types_test.rb
151
202
  - test/distributed_commands_requiring_clustering_test.rb
@@ -161,6 +212,7 @@ test_files:
161
212
  - test/encoding_test.rb
162
213
  - test/error_replies_test.rb
163
214
  - test/helper.rb
215
+ - test/helper_test.rb
164
216
  - test/internals_test.rb
165
217
  - test/lint/hashes.rb
166
218
  - test/lint/internals.rb