redis-store 1.0.0.rc1 → 1.0.0.1
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.
Potentially problematic release.
This version of redis-store might be problematic. Click here for more details.
- data/.travis.yml +7 -0
- data/CHANGELOG +15 -0
- data/Gemfile +1 -1
- data/MIT-LICENSE +1 -1
- data/README.md +7 -7
- data/VERSION +1 -1
- data/lib/action_controller/session/redis_session_store.rb +10 -3
- data/lib/active_support/cache/redis_store.rb +8 -1
- data/lib/rack/cache/redis_metastore.rb +2 -1
- data/lib/rack/session/redis.rb +8 -1
- data/lib/redis/store.rb +5 -0
- data/lib/redis/store/marshalling.rb +15 -5
- data/lib/redis/store/version.rb +1 -1
- data/redis-store.gemspec +8 -26
- data/spec/action_controller/session/redis_session_store_spec.rb +2 -2
- data/spec/active_support/cache/redis_store_spec.rb +38 -16
- data/spec/redis/store/marshalling_spec.rb +36 -0
- data/spec/redis/store/namespace_spec.rb +10 -10
- data/spec/redis/store/version_spec.rb +1 -1
- data/tasks/redis.tasks.rb +12 -5
- metadata +15 -33
- data/Gemfile.lock +0 -180
data/.travis.yml
ADDED
data/CHANGELOG
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
*1.0.0.1 (September 6, 2011)*
|
2
|
+
|
3
|
+
* Bump version v1.0.0.1
|
4
|
+
|
5
|
+
*1.0.0 (September 1, 2011)*
|
6
|
+
|
7
|
+
* Bump version v1.0.0
|
8
|
+
* Avoid encoding issues when sending strings to Redis. [Damian Janowski]
|
9
|
+
* Fixed a bug that caused all the users to share the same session (with a session_id of 0 or 1) [Mathieu Ravaux]
|
10
|
+
* ActiveSupport cache stores reply to read_multi with a hash, not an array. [Matt Griffin]
|
11
|
+
* Rack::Session && Rack::Cache store can be created with options [aligo]
|
12
|
+
* add destroy_session [aligo]
|
13
|
+
* compatible with rails 3.1. rely on Rack::Session::Redis stores API. [aligo]
|
14
|
+
* Fixed Marshalling semantic
|
15
|
+
|
1
16
|
*1.0.0 [rc1] (June 5, 2011)*
|
2
17
|
|
3
18
|
* Bump version v1.0.0.rc1
|
data/Gemfile
CHANGED
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -42,13 +42,13 @@ Made up of the following:
|
|
42
42
|
password: secret
|
43
43
|
|
44
44
|
If you want to specify the `namespace` option, you have to pass the `db` param too.
|
45
|
-
#### __Important__:
|
45
|
+
#### __Important__: `namespace` is only supported for single, non-distributed stores.
|
46
46
|
|
47
47
|
### Set by Hash
|
48
48
|
|
49
49
|
{ :host => 192.168.1.100, :port => 23682, :db => 13, :namespace => "theplaylist", :password => "secret" }
|
50
50
|
|
51
|
-
#### __Important__:
|
51
|
+
#### __Important__: `namespace` is only supported for single, non-distributed stores.
|
52
52
|
|
53
53
|
## Cache store
|
54
54
|
|
@@ -72,7 +72,7 @@ Provides a cache store for your Ruby web framework of choice.
|
|
72
72
|
|
73
73
|
# Gemfile
|
74
74
|
gem 'redis'
|
75
|
-
gem 'redis-store', '1.0.0.
|
75
|
+
gem 'redis-store', '1.0.0.1'
|
76
76
|
|
77
77
|
# config/environments/production.rb
|
78
78
|
config.cache_store = :redis_store, { ... optional configuration ... }
|
@@ -81,7 +81,7 @@ For advanced configurations scenarios please visit [the wiki](https://github.com
|
|
81
81
|
|
82
82
|
### Merb
|
83
83
|
|
84
|
-
dependency "redis-store", "1.0.0.
|
84
|
+
dependency "redis-store", "1.0.0.1"
|
85
85
|
dependency("merb-cache", merb_gems_version) do
|
86
86
|
Merb::Cache.setup do
|
87
87
|
register(:redis, Merb::Cache::RedisStore, :servers => ["127.0.0.1:6379"])
|
@@ -162,7 +162,7 @@ Provides a Redis store for Rack::Session. See [http://rack.rubyforge.org/doc/Rac
|
|
162
162
|
# Gemfile
|
163
163
|
gem 'rails', '3.0.3'
|
164
164
|
gem 'redis'
|
165
|
-
gem 'redis-store', '1.0.0.
|
165
|
+
gem 'redis-store', '1.0.0.1'
|
166
166
|
|
167
167
|
# config/initializers/session_store.rb
|
168
168
|
MyApp::Application.config.session_store :redis_session_store
|
@@ -171,7 +171,7 @@ For advanced configurations scenarios please visit [the wiki](https://github.com
|
|
171
171
|
|
172
172
|
### Merb
|
173
173
|
|
174
|
-
dependency "redis-store", "1.0.0.
|
174
|
+
dependency "redis-store", "1.0.0.1"
|
175
175
|
Merb::Config.use do |c|
|
176
176
|
c[:session_store] = "redis"
|
177
177
|
end
|
@@ -236,4 +236,4 @@ If you are on **Snow Leopard** you have to run `env ARCHFLAGS="-arch x86_64" bun
|
|
236
236
|
|
237
237
|
## Copyright
|
238
238
|
|
239
|
-
(c) 2009 -
|
239
|
+
(c) 2009 - 2011 Luca Guidi - [http://lucaguidi.com](http://lucaguidi.com), released under the MIT license
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.0.
|
1
|
+
1.0.0.1
|
@@ -43,7 +43,7 @@ module RedisStore
|
|
43
43
|
[sid, session]
|
44
44
|
end
|
45
45
|
|
46
|
-
def set_session(env, sid, session_data)
|
46
|
+
def set_session(env, sid, session_data, opts=nil)
|
47
47
|
options = env['rack.session.options']
|
48
48
|
@pool.set(sid, session_data, options)
|
49
49
|
return(::Redis::Store.rails3? ? sid : true)
|
@@ -54,6 +54,7 @@ module RedisStore
|
|
54
54
|
def destroy(env)
|
55
55
|
if sid = current_session_id(env)
|
56
56
|
@pool.del(sid)
|
57
|
+
sid
|
57
58
|
end
|
58
59
|
rescue Errno::ECONNREFUSED
|
59
60
|
false
|
@@ -62,8 +63,13 @@ module RedisStore
|
|
62
63
|
end
|
63
64
|
end
|
64
65
|
end
|
65
|
-
|
66
|
-
|
66
|
+
if ::Redis::Store.rails31?
|
67
|
+
require 'action_dispatch/middleware/session/abstract_store'
|
68
|
+
class ActionDispatch::Session::RedisSessionStore < Rack::Session::Redis
|
69
|
+
include ActionDispatch::Session::Compatibility
|
70
|
+
include ActionDispatch::Session::StaleSessionCheck
|
71
|
+
end
|
72
|
+
elsif ::Redis::Store.rails3?
|
67
73
|
class ActionDispatch::Session::RedisSessionStore < ActionDispatch::Session::AbstractStore
|
68
74
|
include RedisStore::Rack::Session::Rails
|
69
75
|
end
|
@@ -72,3 +78,4 @@ else
|
|
72
78
|
include RedisStore::Rack::Session::Rails
|
73
79
|
end
|
74
80
|
end
|
81
|
+
|
@@ -170,7 +170,14 @@ module ActiveSupport
|
|
170
170
|
# cache.read_multi "rabbit", "white-rabbit"
|
171
171
|
# cache.read_multi "rabbit", "white-rabbit", :raw => true
|
172
172
|
def read_multi(*names)
|
173
|
-
@data.mget
|
173
|
+
values = @data.mget(*names)
|
174
|
+
|
175
|
+
# Remove the options hash before mapping keys to values
|
176
|
+
names.extract_options!
|
177
|
+
|
178
|
+
result = Hash[names.zip(values)]
|
179
|
+
result.reject!{ |k,v| v.nil? }
|
180
|
+
result
|
174
181
|
end
|
175
182
|
|
176
183
|
# Increment a key in the store.
|
data/lib/rack/session/redis.rb
CHANGED
@@ -7,7 +7,8 @@ module Rack
|
|
7
7
|
def initialize(app, options = {})
|
8
8
|
super
|
9
9
|
@mutex = Mutex.new
|
10
|
-
|
10
|
+
options[:redis_server] ||= @default_options[:redis_server]
|
11
|
+
@pool = ::Redis::Factory.create options
|
11
12
|
end
|
12
13
|
|
13
14
|
def generate_sid
|
@@ -58,6 +59,11 @@ module Rack
|
|
58
59
|
@mutex.unlock if env['rack.multithread']
|
59
60
|
end
|
60
61
|
|
62
|
+
def destroy_session(env, session_id, options)
|
63
|
+
options = { :renew => true }.update(options) unless options[:drop]
|
64
|
+
set_session(env, session_id, 0, options)
|
65
|
+
end
|
66
|
+
|
61
67
|
private
|
62
68
|
def merge_sessions(sid, old, new, cur=nil)
|
63
69
|
cur ||= {}
|
@@ -79,3 +85,4 @@ module Rack
|
|
79
85
|
end
|
80
86
|
end
|
81
87
|
end
|
88
|
+
|
data/lib/redis/store.rb
CHANGED
@@ -12,6 +12,10 @@ class Redis
|
|
12
12
|
defined?(::Rails) && ::Rails::VERSION::MAJOR == 3
|
13
13
|
end
|
14
14
|
|
15
|
+
def self.rails31? #:nodoc:
|
16
|
+
defined?(::Rails) && ::Rails::VERSION::MAJOR == 3 && ::Rails::VERSION::MINOR == 1
|
17
|
+
end
|
18
|
+
|
15
19
|
def reconnect
|
16
20
|
@client.reconnect
|
17
21
|
end
|
@@ -32,3 +36,4 @@ class Redis
|
|
32
36
|
end
|
33
37
|
end
|
34
38
|
end
|
39
|
+
|
@@ -2,11 +2,11 @@ class Redis
|
|
2
2
|
class Store < self
|
3
3
|
module Marshalling
|
4
4
|
def set(key, value, options = nil)
|
5
|
-
_marshal(value, options) { |value| super key, value, options }
|
5
|
+
_marshal(value, options) { |value| super encode(key), encode(value), options }
|
6
6
|
end
|
7
7
|
|
8
8
|
def setnx(key, value, options = nil)
|
9
|
-
_marshal(value, options) { |value| super key, value, options }
|
9
|
+
_marshal(value, options) { |value| super encode(key), encode(value), options }
|
10
10
|
end
|
11
11
|
|
12
12
|
def get(key, options = nil)
|
@@ -22,7 +22,7 @@ class Redis
|
|
22
22
|
|
23
23
|
private
|
24
24
|
def _marshal(val, options)
|
25
|
-
yield marshal?(options) ?
|
25
|
+
yield marshal?(options) ? Marshal.dump(val) : val
|
26
26
|
end
|
27
27
|
|
28
28
|
def _unmarshal(val, options)
|
@@ -30,11 +30,21 @@ class Redis
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def marshal?(options)
|
33
|
-
options && options[:raw]
|
33
|
+
!(options && options[:raw])
|
34
34
|
end
|
35
35
|
|
36
36
|
def unmarshal?(result, options)
|
37
|
-
result && result.size > 0 &&
|
37
|
+
result && result.size > 0 && marshal?(options)
|
38
|
+
end
|
39
|
+
|
40
|
+
if defined?(Encoding)
|
41
|
+
def encode(string)
|
42
|
+
string.to_s.force_encoding(Encoding::BINARY)
|
43
|
+
end
|
44
|
+
else
|
45
|
+
def encode(string)
|
46
|
+
string
|
47
|
+
end
|
38
48
|
end
|
39
49
|
end
|
40
50
|
end
|
data/lib/redis/store/version.rb
CHANGED
data/redis-store.gemspec
CHANGED
@@ -5,20 +5,20 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{redis-store}
|
8
|
-
s.version = "1.0.0.
|
8
|
+
s.version = "1.0.0.1"
|
9
9
|
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = [%q{Luca Guidi}]
|
12
|
-
s.date = %q{2011-06
|
12
|
+
s.date = %q{2011-09-06}
|
13
13
|
s.description = %q{Namespaced Rack::Session, Rack::Cache, I18n and cache Redis stores for Ruby web frameworks.}
|
14
14
|
s.email = %q{guidi.luca@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"README.md"
|
17
17
|
]
|
18
18
|
s.files = [
|
19
|
+
".travis.yml",
|
19
20
|
"CHANGELOG",
|
20
21
|
"Gemfile",
|
21
|
-
"Gemfile.lock",
|
22
22
|
"MIT-LICENSE",
|
23
23
|
"README.md",
|
24
24
|
"Rakefile",
|
@@ -66,32 +66,14 @@ Gem::Specification.new do |s|
|
|
66
66
|
]
|
67
67
|
s.homepage = %q{http://github.com/jodosha/redis-store}
|
68
68
|
s.require_paths = [%q{lib}]
|
69
|
-
s.rubygems_version = %q{1.8.
|
69
|
+
s.rubygems_version = %q{1.8.6}
|
70
70
|
s.summary = %q{Namespaced Rack::Session, Rack::Cache, I18n and cache Redis stores for Ruby web frameworks.}
|
71
|
-
s.test_files = [
|
72
|
-
"spec/action_controller/session/redis_session_store_spec.rb",
|
73
|
-
"spec/active_support/cache/redis_store_spec.rb",
|
74
|
-
"spec/cache/merb/redis_store_spec.rb",
|
75
|
-
"spec/cache/sinatra/redis_store_spec.rb",
|
76
|
-
"spec/i18n/backend/redis_spec.rb",
|
77
|
-
"spec/rack/cache/entitystore/redis_spec.rb",
|
78
|
-
"spec/rack/cache/metastore/redis_spec.rb",
|
79
|
-
"spec/rack/session/redis_spec.rb",
|
80
|
-
"spec/redis/distributed_store_spec.rb",
|
81
|
-
"spec/redis/factory_spec.rb",
|
82
|
-
"spec/redis/store/interface_spec.rb",
|
83
|
-
"spec/redis/store/marshalling_spec.rb",
|
84
|
-
"spec/redis/store/namespace_spec.rb",
|
85
|
-
"spec/redis/store/version_spec.rb",
|
86
|
-
"spec/redis/store_spec.rb",
|
87
|
-
"spec/spec_helper.rb"
|
88
|
-
]
|
89
71
|
|
90
72
|
if s.respond_to? :specification_version then
|
91
73
|
s.specification_version = 3
|
92
74
|
|
93
75
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
94
|
-
s.add_runtime_dependency(%q<redis>, ["~> 2.2.
|
76
|
+
s.add_runtime_dependency(%q<redis>, ["~> 2.2.1"])
|
95
77
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
96
78
|
s.add_development_dependency(%q<git>, [">= 0"])
|
97
79
|
s.add_development_dependency(%q<rack-cache>, [">= 0"])
|
@@ -100,7 +82,7 @@ Gem::Specification.new do |s|
|
|
100
82
|
s.add_development_dependency(%q<i18n>, [">= 0"])
|
101
83
|
s.add_development_dependency(%q<ruby-debug>, [">= 0"])
|
102
84
|
else
|
103
|
-
s.add_dependency(%q<redis>, ["~> 2.2.
|
85
|
+
s.add_dependency(%q<redis>, ["~> 2.2.1"])
|
104
86
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
105
87
|
s.add_dependency(%q<git>, [">= 0"])
|
106
88
|
s.add_dependency(%q<rack-cache>, [">= 0"])
|
@@ -110,7 +92,7 @@ Gem::Specification.new do |s|
|
|
110
92
|
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
111
93
|
end
|
112
94
|
else
|
113
|
-
s.add_dependency(%q<redis>, ["~> 2.2.
|
95
|
+
s.add_dependency(%q<redis>, ["~> 2.2.1"])
|
114
96
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
115
97
|
s.add_dependency(%q<git>, [">= 0"])
|
116
98
|
s.add_dependency(%q<rack-cache>, [">= 0"])
|
@@ -104,12 +104,12 @@ describe RAILS_SESSION_STORE_CLASS do
|
|
104
104
|
end
|
105
105
|
|
106
106
|
it "should read the data" do
|
107
|
-
@client.should_receive(:call).with(:get, "#{@namespace}:#{@sid}")
|
107
|
+
@client.should_receive(:call).with([:get, "#{@namespace}:#{@sid}"])
|
108
108
|
@store.send :get_session, @env, @sid
|
109
109
|
end
|
110
110
|
|
111
111
|
it "should write the data" do
|
112
|
-
@client.should_receive(:call).with(:set, "#{@namespace}:#{@sid}", Marshal.dump(@white_rabbit))
|
112
|
+
@client.should_receive(:call).with([:set, "#{@namespace}:#{@sid}", Marshal.dump(@white_rabbit)])
|
113
113
|
@store.send :set_session, @env, @sid, @white_rabbit
|
114
114
|
end
|
115
115
|
end
|
@@ -149,6 +149,22 @@ module ActiveSupport
|
|
149
149
|
end
|
150
150
|
end
|
151
151
|
|
152
|
+
it "should increment a raw key" do
|
153
|
+
with_store_management do |store|
|
154
|
+
store.write("raw-counter", 1, :raw => true).should be_true
|
155
|
+
store.increment("raw-counter", 2)
|
156
|
+
store.read("raw-counter", :raw => true).to_i.should == 3
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should decrement a raw key" do
|
161
|
+
with_store_management do |store|
|
162
|
+
store.write("raw-counter", 3, :raw => true).should be_true
|
163
|
+
store.decrement("raw-counter", 2)
|
164
|
+
store.read("raw-counter", :raw => true).to_i.should == 1
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
152
168
|
it "should increment a key by given value" do
|
153
169
|
with_store_management do |store|
|
154
170
|
store.increment "counter", 3
|
@@ -194,18 +210,24 @@ module ActiveSupport
|
|
194
210
|
if ::Redis::Store.rails3?
|
195
211
|
it "should read multiple keys" do
|
196
212
|
@store.write "irish whisky", "Jameson"
|
197
|
-
|
198
|
-
rabbit.raw_value.should === @rabbit
|
199
|
-
whisky.raw_value.should == "Jameson"
|
213
|
+
result = @store.read_multi "rabbit", "irish whisky"
|
214
|
+
result['rabbit'].raw_value.should === @rabbit
|
215
|
+
result['irish whisky'].raw_value.should == "Jameson"
|
200
216
|
end
|
201
217
|
else
|
202
218
|
it "should read multiple keys" do
|
203
219
|
@store.write "irish whisky", "Jameson"
|
204
|
-
|
205
|
-
|
206
|
-
whisky.should == "Jameson"
|
220
|
+
result = @store.read_multi "rabbit", "irish whisky"
|
221
|
+
result.should == { 'rabbit' => @rabbit, 'irish whisky' => 'Jameson' }
|
207
222
|
end
|
208
223
|
end
|
224
|
+
|
225
|
+
it 'should read multiple keys and return only matches' do
|
226
|
+
@store.delete 'irish whisky'
|
227
|
+
result = @store.read_multi "rabbit", "irish whisky"
|
228
|
+
result.should_not include('irish whisky')
|
229
|
+
result.should include('rabbit')
|
230
|
+
end
|
209
231
|
|
210
232
|
describe "namespace" do
|
211
233
|
before :each do
|
@@ -216,7 +238,7 @@ module ActiveSupport
|
|
216
238
|
end
|
217
239
|
|
218
240
|
it "should read the data" do
|
219
|
-
@client.should_receive(:call).with(:get, "#{@namespace}:rabbit")
|
241
|
+
@client.should_receive(:call).with([:get, "#{@namespace}:rabbit"])
|
220
242
|
@store.read("rabbit")
|
221
243
|
end
|
222
244
|
|
@@ -228,19 +250,19 @@ module ActiveSupport
|
|
228
250
|
# end
|
229
251
|
else
|
230
252
|
it "should write the data" do
|
231
|
-
@client.should_receive(:call).with(:set, "#{@namespace}:rabbit", Marshal.dump(@white_rabbit))
|
253
|
+
@client.should_receive(:call).with([:set, "#{@namespace}:rabbit", Marshal.dump(@white_rabbit)])
|
232
254
|
@store.write "rabbit", @white_rabbit
|
233
255
|
end
|
234
256
|
end
|
235
257
|
|
236
258
|
it "should delete the data" do
|
237
|
-
@client.should_receive(:call).with(:del, "#{@namespace}:rabbit")
|
259
|
+
@client.should_receive(:call).with([:del, "#{@namespace}:rabbit"])
|
238
260
|
@store.delete "rabbit"
|
239
261
|
end
|
240
262
|
|
241
263
|
it "should delete matched data" do
|
242
|
-
@client.should_receive(:call).with(:del, "#{@namespace}:rabbit")
|
243
|
-
@client.should_receive(:call).with(:keys, "theplaylist:rabb*").and_return [ "#{@namespace}:rabbit" ]
|
264
|
+
@client.should_receive(:call).with([:del, "#{@namespace}:rabbit"])
|
265
|
+
@client.should_receive(:call).with([:keys, "theplaylist:rabb*"]).and_return [ "#{@namespace}:rabbit" ]
|
244
266
|
@store.delete_matched "rabb*"
|
245
267
|
end
|
246
268
|
|
@@ -251,29 +273,29 @@ module ActiveSupport
|
|
251
273
|
end
|
252
274
|
else
|
253
275
|
it "should verify existence of an object in the store" do
|
254
|
-
@client.should_receive(:call).with(:exists, "#{@namespace}:rabbit")
|
276
|
+
@client.should_receive(:call).with([:exists, "#{@namespace}:rabbit"])
|
255
277
|
@store.exist?("rabbit")
|
256
278
|
end
|
257
279
|
end
|
258
280
|
|
259
281
|
it "should increment a key" do
|
260
|
-
@client.should_receive(:call).with(:incrby, "#{@namespace}:counter", 1)
|
282
|
+
@client.should_receive(:call).with([:incrby, "#{@namespace}:counter", 1])
|
261
283
|
@store.increment "counter"
|
262
284
|
end
|
263
285
|
|
264
286
|
it "should decrement a key" do
|
265
|
-
@client.should_receive(:call).with(:decrby, "#{@namespace}:counter", 1)
|
287
|
+
@client.should_receive(:call).with([:decrby, "#{@namespace}:counter", 1])
|
266
288
|
@store.decrement "counter"
|
267
289
|
end
|
268
290
|
|
269
291
|
it "should fetch data" do
|
270
|
-
@client.should_receive(:call).with(:get, "#{@namespace}:rabbit")
|
292
|
+
@client.should_receive(:call).with([:get, "#{@namespace}:rabbit"])
|
271
293
|
@store.fetch "rabbit"
|
272
294
|
end
|
273
295
|
|
274
296
|
it "should read multiple keys" do
|
275
297
|
rabbits = [ Marshal.dump(@rabbit), Marshal.dump(@white_rabbit) ]
|
276
|
-
@client.should_receive(:call).with(:mget, "#{@namespace}:rabbit", "#{@namespace}:white_rabbit").and_return rabbits
|
298
|
+
@client.should_receive(:call).with([:mget, "#{@namespace}:rabbit", "#{@namespace}:white_rabbit"]).and_return rabbits
|
277
299
|
@store.read_multi "rabbit", "white_rabbit"
|
278
300
|
end
|
279
301
|
end
|
@@ -79,5 +79,41 @@ describe "Redis::Marshalling" do
|
|
79
79
|
rabbit2.should == "\004\bU:\017OpenStruct{\006:\ncolor\"\nwhite"
|
80
80
|
end
|
81
81
|
end
|
82
|
+
|
83
|
+
describe "binary safety" do
|
84
|
+
it "should marshal objects" do
|
85
|
+
utf8_key = [51339].pack("U*")
|
86
|
+
ascii_rabbit = OpenStruct.new(:name => [128].pack("C*"))
|
87
|
+
|
88
|
+
@store.set(utf8_key, ascii_rabbit)
|
89
|
+
@store.get(utf8_key).should === ascii_rabbit
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should get and set raw values" do
|
93
|
+
utf8_key = [51339].pack("U*")
|
94
|
+
ascii_string = [128].pack("C*")
|
95
|
+
|
96
|
+
@store.set(utf8_key, ascii_string, :raw => true)
|
97
|
+
@store.get(utf8_key, :raw => true).bytes.to_a === ascii_string.bytes.to_a
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should marshal objects on setnx" do
|
101
|
+
utf8_key = [51339].pack("U*")
|
102
|
+
ascii_rabbit = OpenStruct.new(:name => [128].pack("C*"))
|
103
|
+
|
104
|
+
@store.del(utf8_key)
|
105
|
+
@store.setnx(utf8_key, ascii_rabbit)
|
106
|
+
@store.get(utf8_key).should === ascii_rabbit
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should get and set raw values on setnx" do
|
110
|
+
utf8_key = [51339].pack("U*")
|
111
|
+
ascii_string = [128].pack("C*")
|
112
|
+
|
113
|
+
@store.del(utf8_key)
|
114
|
+
@store.setnx(utf8_key, ascii_string, :raw => true)
|
115
|
+
@store.get(utf8_key, :raw => true).bytes.to_a === ascii_string.bytes.to_a
|
116
|
+
end
|
117
|
+
end if defined?(Encoding)
|
82
118
|
end
|
83
119
|
|
@@ -16,7 +16,7 @@ describe "Redis::Store::Namespace" do
|
|
16
16
|
it "should only decorate instances that needs to be namespaced" do
|
17
17
|
@store = Redis::Store.new
|
18
18
|
client = @store.instance_variable_get(:@client)
|
19
|
-
client.should_receive(:call).with(:get, "rabbit")
|
19
|
+
client.should_receive(:call).with([:get, "rabbit"])
|
20
20
|
@store.get("rabbit")
|
21
21
|
end
|
22
22
|
|
@@ -25,27 +25,27 @@ describe "Redis::Store::Namespace" do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should namespace get" do
|
28
|
-
@client.should_receive(:call).with(:get, "#{@namespace}:rabbit")
|
28
|
+
@client.should_receive(:call).with([:get, "#{@namespace}:rabbit"])
|
29
29
|
@store.get("rabbit")
|
30
30
|
end
|
31
31
|
|
32
32
|
it "should namespace set" do
|
33
|
-
@client.should_receive(:call).with(:set, "#{@namespace}:rabbit", @rabbit)
|
33
|
+
@client.should_receive(:call).with([:set, "#{@namespace}:rabbit", @rabbit])
|
34
34
|
@store.set "rabbit", @rabbit
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should namespace setnx" do
|
38
|
-
@client.should_receive(:call).with(:setnx, "#{@namespace}:rabbit", @rabbit)
|
38
|
+
@client.should_receive(:call).with([:setnx, "#{@namespace}:rabbit", @rabbit])
|
39
39
|
@store.setnx "rabbit", @rabbit
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should namespace del with single key" do
|
43
|
-
@client.should_receive(:call).with(:del, "#{@namespace}:rabbit")
|
43
|
+
@client.should_receive(:call).with([:del, "#{@namespace}:rabbit"])
|
44
44
|
@store.del "rabbit"
|
45
45
|
end
|
46
46
|
|
47
47
|
it "should namespace del with multiple keys" do
|
48
|
-
@client.should_receive(:call).with(:del, "#{@namespace}:rabbit", "#{@namespace}:white_rabbit")
|
48
|
+
@client.should_receive(:call).with([:del, "#{@namespace}:rabbit", "#{@namespace}:white_rabbit"])
|
49
49
|
@store.del "rabbit", "white_rabbit"
|
50
50
|
end
|
51
51
|
|
@@ -55,22 +55,22 @@ describe "Redis::Store::Namespace" do
|
|
55
55
|
end
|
56
56
|
|
57
57
|
it "should namespace exists" do
|
58
|
-
@client.should_receive(:call).with(:exists, "#{@namespace}:rabbit")
|
58
|
+
@client.should_receive(:call).with([:exists, "#{@namespace}:rabbit"])
|
59
59
|
@store.exists "rabbit"
|
60
60
|
end
|
61
61
|
|
62
62
|
it "should namespace incrby" do
|
63
|
-
@client.should_receive(:call).with(:incrby, "#{@namespace}:counter", 1)
|
63
|
+
@client.should_receive(:call).with([:incrby, "#{@namespace}:counter", 1])
|
64
64
|
@store.incrby "counter", 1
|
65
65
|
end
|
66
66
|
|
67
67
|
it "should namespace decrby" do
|
68
|
-
@client.should_receive(:call).with(:decrby, "#{@namespace}:counter", 1)
|
68
|
+
@client.should_receive(:call).with([:decrby, "#{@namespace}:counter", 1])
|
69
69
|
@store.decrby "counter", 1
|
70
70
|
end
|
71
71
|
|
72
72
|
it "should namespace mget" do
|
73
|
-
@client.should_receive(:call).with(:mget, "#{@namespace}:rabbit", "#{@namespace}:white_rabbit")
|
73
|
+
@client.should_receive(:call).with([:mget, "#{@namespace}:rabbit", "#{@namespace}:white_rabbit"])
|
74
74
|
@store.mget "rabbit", "white_rabbit"
|
75
75
|
end
|
76
76
|
end
|
data/tasks/redis.tasks.rb
CHANGED
@@ -103,7 +103,7 @@ namespace :redis do
|
|
103
103
|
end
|
104
104
|
|
105
105
|
desc 'Start redis'
|
106
|
-
task :start do
|
106
|
+
task :start => 'dtach:check' do
|
107
107
|
RedisRunner.start
|
108
108
|
end
|
109
109
|
|
@@ -153,8 +153,8 @@ namespace :redis do
|
|
153
153
|
sh "mv redis vendor"
|
154
154
|
|
155
155
|
commit = case ENV['VERSION']
|
156
|
-
when "1.
|
157
|
-
when "2.2.
|
156
|
+
when "1.3.12" then "26ef09a83526e5099bce"
|
157
|
+
when "2.2.8" then "ec279203df0bc6ddc981"
|
158
158
|
end
|
159
159
|
|
160
160
|
arguments = commit.nil? ? "pull origin master" : "reset --hard #{commit}"
|
@@ -170,7 +170,7 @@ namespace :redis do
|
|
170
170
|
|
171
171
|
namespace :replication do
|
172
172
|
desc "Starts redis replication servers"
|
173
|
-
task :start do
|
173
|
+
task :start => 'dtach:check' do
|
174
174
|
result = RedisReplicationRunner.start_detached
|
175
175
|
raise("Could not start redis-server, aborting.") unless result
|
176
176
|
end
|
@@ -186,7 +186,7 @@ namespace :redis do
|
|
186
186
|
system "bundle exec irb -I lib -I extra -r redis-store.rb"
|
187
187
|
RedisReplicationRunner.stop
|
188
188
|
end
|
189
|
-
end
|
189
|
+
end
|
190
190
|
end
|
191
191
|
|
192
192
|
namespace :dtach do
|
@@ -195,6 +195,13 @@ namespace :dtach do
|
|
195
195
|
puts "\nSee http://dtach.sourceforge.net/ for information about dtach.\n\n"
|
196
196
|
end
|
197
197
|
|
198
|
+
desc 'Check that dtach is available'
|
199
|
+
task :check do
|
200
|
+
if !ENV['TRAVIS'] && !system('which dtach')
|
201
|
+
raise "dtach is not installed. Install it manually or run 'rake dtach:install'"
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
198
205
|
desc 'Install dtach 0.8 from source'
|
199
206
|
task :install => [:about] do
|
200
207
|
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-store
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 93
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
9
|
- 0
|
10
|
-
- rc
|
11
10
|
- 1
|
12
|
-
version: 1.0.0.
|
11
|
+
version: 1.0.0.1
|
13
12
|
platform: ruby
|
14
13
|
authors:
|
15
14
|
- Luca Guidi
|
@@ -17,7 +16,7 @@ autorequire:
|
|
17
16
|
bindir: bin
|
18
17
|
cert_chain: []
|
19
18
|
|
20
|
-
date: 2011-06
|
19
|
+
date: 2011-09-06 00:00:00 Z
|
21
20
|
dependencies:
|
22
21
|
- !ruby/object:Gem::Dependency
|
23
22
|
name: redis
|
@@ -27,12 +26,12 @@ dependencies:
|
|
27
26
|
requirements:
|
28
27
|
- - ~>
|
29
28
|
- !ruby/object:Gem::Version
|
30
|
-
hash:
|
29
|
+
hash: 5
|
31
30
|
segments:
|
32
31
|
- 2
|
33
32
|
- 2
|
34
|
-
-
|
35
|
-
version: 2.2.
|
33
|
+
- 1
|
34
|
+
version: 2.2.1
|
36
35
|
type: :runtime
|
37
36
|
version_requirements: *id001
|
38
37
|
- !ruby/object:Gem::Dependency
|
@@ -146,9 +145,9 @@ extensions: []
|
|
146
145
|
extra_rdoc_files:
|
147
146
|
- README.md
|
148
147
|
files:
|
148
|
+
- .travis.yml
|
149
149
|
- CHANGELOG
|
150
150
|
- Gemfile
|
151
|
-
- Gemfile.lock
|
152
151
|
- MIT-LICENSE
|
153
152
|
- README.md
|
154
153
|
- Rakefile
|
@@ -213,35 +212,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
213
212
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
214
213
|
none: false
|
215
214
|
requirements:
|
216
|
-
- - "
|
215
|
+
- - ">="
|
217
216
|
- !ruby/object:Gem::Version
|
218
|
-
hash:
|
217
|
+
hash: 3
|
219
218
|
segments:
|
220
|
-
-
|
221
|
-
|
222
|
-
- 1
|
223
|
-
version: 1.3.1
|
219
|
+
- 0
|
220
|
+
version: "0"
|
224
221
|
requirements: []
|
225
222
|
|
226
223
|
rubyforge_project:
|
227
|
-
rubygems_version: 1.8.
|
224
|
+
rubygems_version: 1.8.6
|
228
225
|
signing_key:
|
229
226
|
specification_version: 3
|
230
227
|
summary: Namespaced Rack::Session, Rack::Cache, I18n and cache Redis stores for Ruby web frameworks.
|
231
|
-
test_files:
|
232
|
-
|
233
|
-
- spec/active_support/cache/redis_store_spec.rb
|
234
|
-
- spec/cache/merb/redis_store_spec.rb
|
235
|
-
- spec/cache/sinatra/redis_store_spec.rb
|
236
|
-
- spec/i18n/backend/redis_spec.rb
|
237
|
-
- spec/rack/cache/entitystore/redis_spec.rb
|
238
|
-
- spec/rack/cache/metastore/redis_spec.rb
|
239
|
-
- spec/rack/session/redis_spec.rb
|
240
|
-
- spec/redis/distributed_store_spec.rb
|
241
|
-
- spec/redis/factory_spec.rb
|
242
|
-
- spec/redis/store/interface_spec.rb
|
243
|
-
- spec/redis/store/marshalling_spec.rb
|
244
|
-
- spec/redis/store/namespace_spec.rb
|
245
|
-
- spec/redis/store/version_spec.rb
|
246
|
-
- spec/redis/store_spec.rb
|
247
|
-
- spec/spec_helper.rb
|
228
|
+
test_files: []
|
229
|
+
|
data/Gemfile.lock
DELETED
@@ -1,180 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: http://rubygems.org/
|
3
|
-
specs:
|
4
|
-
ParseTree (3.0.6)
|
5
|
-
RubyInline (>= 3.7.0)
|
6
|
-
sexp_processor (>= 3.0.0)
|
7
|
-
RubyInline (3.8.6)
|
8
|
-
ZenTest (~> 4.3)
|
9
|
-
ZenTest (4.4.2)
|
10
|
-
abstract (1.0.0)
|
11
|
-
actionpack (2.3.11)
|
12
|
-
activesupport (= 2.3.11)
|
13
|
-
rack (~> 1.1.0)
|
14
|
-
activesupport (2.3.11)
|
15
|
-
addressable (2.2.2)
|
16
|
-
bcrypt-ruby (2.1.2)
|
17
|
-
columnize (0.3.2)
|
18
|
-
data_objects (0.10.2)
|
19
|
-
addressable (~> 2.1)
|
20
|
-
diff-lcs (1.1.2)
|
21
|
-
dm-aggregates (0.10.2)
|
22
|
-
dm-core (~> 0.10.2)
|
23
|
-
dm-constraints (0.10.2)
|
24
|
-
dm-core (~> 0.10.2)
|
25
|
-
dm-core (0.10.2)
|
26
|
-
addressable (~> 2.1)
|
27
|
-
extlib (~> 0.9.14)
|
28
|
-
dm-migrations (0.10.2)
|
29
|
-
dm-core (~> 0.10.2)
|
30
|
-
dm-serializer (0.10.2)
|
31
|
-
dm-core (~> 0.10.2)
|
32
|
-
fastercsv (~> 1.5.0)
|
33
|
-
json_pure (~> 1.2.0)
|
34
|
-
dm-sweatshop (0.10.2)
|
35
|
-
dm-core (~> 0.10.2)
|
36
|
-
randexp (~> 0.1.4)
|
37
|
-
dm-timestamps (0.10.2)
|
38
|
-
dm-core (~> 0.10.2)
|
39
|
-
dm-types (0.10.2)
|
40
|
-
bcrypt-ruby (~> 2.1.2)
|
41
|
-
dm-core (~> 0.10.2)
|
42
|
-
fastercsv (~> 1.5.0)
|
43
|
-
json_pure (~> 1.2.0)
|
44
|
-
stringex (~> 1.1.0)
|
45
|
-
uuidtools (~> 2.1.1)
|
46
|
-
dm-validations (0.10.2)
|
47
|
-
dm-core (~> 0.10.2)
|
48
|
-
do_sqlite3 (0.10.2)
|
49
|
-
data_objects (= 0.10.2)
|
50
|
-
erubis (2.6.6)
|
51
|
-
abstract (>= 1.0.0)
|
52
|
-
extlib (0.9.15)
|
53
|
-
fastercsv (1.5.3)
|
54
|
-
git (1.2.5)
|
55
|
-
haml (3.0.24)
|
56
|
-
highline (1.6.1)
|
57
|
-
i18n (0.5.0)
|
58
|
-
jeweler (1.5.1)
|
59
|
-
bundler (~> 1.0.0)
|
60
|
-
git (>= 1.2.5)
|
61
|
-
rake
|
62
|
-
json_pure (1.2.4)
|
63
|
-
linecache (0.43)
|
64
|
-
mailfactory (1.4.0)
|
65
|
-
mime-types (>= 1.13.1)
|
66
|
-
merb (1.1.0)
|
67
|
-
dm-aggregates (~> 0.10)
|
68
|
-
dm-constraints (~> 0.10)
|
69
|
-
dm-serializer (~> 0.10)
|
70
|
-
dm-sweatshop (~> 0.10)
|
71
|
-
dm-timestamps (~> 0.10)
|
72
|
-
dm-types (~> 0.10)
|
73
|
-
dm-validations (~> 0.10)
|
74
|
-
do_sqlite3 (~> 0.10)
|
75
|
-
merb-action-args (= 1.1.0)
|
76
|
-
merb-assets (= 1.1.0)
|
77
|
-
merb-auth (= 1.1.0)
|
78
|
-
merb-cache (= 1.1.0)
|
79
|
-
merb-core (= 1.1.0)
|
80
|
-
merb-exceptions (= 1.1.0)
|
81
|
-
merb-gen (= 1.1.0)
|
82
|
-
merb-haml (= 1.1.0)
|
83
|
-
merb-helpers (= 1.1.0)
|
84
|
-
merb-mailer (= 1.1.0)
|
85
|
-
merb-param-protection (= 1.1.0)
|
86
|
-
merb-slices (= 1.1.0)
|
87
|
-
merb_datamapper (= 1.1.0)
|
88
|
-
merb-action-args (1.1.0)
|
89
|
-
ParseTree (>= 2.1.1)
|
90
|
-
merb-core (~> 1.1.0)
|
91
|
-
ruby2ruby (>= 1.1.9)
|
92
|
-
merb-assets (1.1.0)
|
93
|
-
merb-core (~> 1.1.0)
|
94
|
-
merb-auth (1.1.0)
|
95
|
-
merb-auth-core (~> 1.1.0)
|
96
|
-
merb-auth-more (~> 1.1.0)
|
97
|
-
merb-auth-slice-password (~> 1.1.0)
|
98
|
-
merb-core (~> 1.1.0)
|
99
|
-
merb-auth-core (1.1.1)
|
100
|
-
merb-core (~> 1.1)
|
101
|
-
merb-auth-more (1.1.1)
|
102
|
-
merb-auth-core (~> 1.1.1)
|
103
|
-
merb-auth-slice-password (1.1.1)
|
104
|
-
merb-auth-core (~> 1.1.1)
|
105
|
-
merb-auth-more (~> 1.1.1)
|
106
|
-
merb-slices (~> 1.1)
|
107
|
-
merb-cache (1.1.0)
|
108
|
-
merb-core (~> 1.1.0)
|
109
|
-
merb-core (1.1.0)
|
110
|
-
bundler (>= 0.9.3)
|
111
|
-
erubis (>= 2.6.2)
|
112
|
-
extlib (>= 0.9.13)
|
113
|
-
mime-types (>= 1.16)
|
114
|
-
rack
|
115
|
-
rake
|
116
|
-
rspec
|
117
|
-
merb-exceptions (1.1.0)
|
118
|
-
merb-core (~> 1.1.0)
|
119
|
-
merb-mailer (~> 1.1.0)
|
120
|
-
merb-gen (1.1.0)
|
121
|
-
merb-core (~> 1.1.0)
|
122
|
-
templater (>= 1.0.0)
|
123
|
-
merb-haml (1.1.0)
|
124
|
-
haml (>= 2.0.3)
|
125
|
-
merb-core (~> 1.1.0)
|
126
|
-
merb-helpers (1.1.0)
|
127
|
-
merb-core (~> 1.1.0)
|
128
|
-
merb-mailer (1.1.0)
|
129
|
-
mailfactory (>= 1.2.3)
|
130
|
-
merb-core (~> 1.1.0)
|
131
|
-
merb-param-protection (1.1.0)
|
132
|
-
merb-core (~> 1.1.0)
|
133
|
-
merb-slices (1.1.0)
|
134
|
-
merb-core (~> 1.1.0)
|
135
|
-
merb_datamapper (1.1.0)
|
136
|
-
dm-core (~> 0.10)
|
137
|
-
dm-migrations (~> 0.10)
|
138
|
-
merb-core (~> 1.1.0)
|
139
|
-
mime-types (1.16)
|
140
|
-
rack (1.1.0)
|
141
|
-
rack-cache (0.5.3)
|
142
|
-
rack (>= 0.4)
|
143
|
-
rake (0.8.7)
|
144
|
-
randexp (0.1.5)
|
145
|
-
ParseTree
|
146
|
-
redis (2.2.0)
|
147
|
-
rspec (1.3.0)
|
148
|
-
ruby-debug (0.10.4)
|
149
|
-
columnize (>= 0.1)
|
150
|
-
ruby-debug-base (~> 0.10.4.0)
|
151
|
-
ruby-debug-base (0.10.4)
|
152
|
-
linecache (>= 0.3)
|
153
|
-
ruby2ruby (1.2.5)
|
154
|
-
ruby_parser (~> 2.0)
|
155
|
-
sexp_processor (~> 3.0)
|
156
|
-
ruby_parser (2.0.5)
|
157
|
-
sexp_processor (~> 3.0)
|
158
|
-
sexp_processor (3.0.5)
|
159
|
-
stringex (1.1.0)
|
160
|
-
templater (1.0.0)
|
161
|
-
diff-lcs (>= 1.1.2)
|
162
|
-
extlib (>= 0.9.5)
|
163
|
-
highline (>= 1.4.0)
|
164
|
-
uuidtools (2.1.1)
|
165
|
-
|
166
|
-
PLATFORMS
|
167
|
-
ruby
|
168
|
-
|
169
|
-
DEPENDENCIES
|
170
|
-
actionpack (= 2.3.11)
|
171
|
-
activesupport (= 2.3.11)
|
172
|
-
git
|
173
|
-
i18n
|
174
|
-
jeweler
|
175
|
-
merb (= 1.1.0)
|
176
|
-
rack (~> 1.1.0)
|
177
|
-
rack-cache
|
178
|
-
redis (~> 2.2.0)
|
179
|
-
rspec (= 1.3.0)
|
180
|
-
ruby-debug
|