redis 2.2.2 → 3.0.0.rc1

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.
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