instructure-redis-store 1.0.0.1.instructure1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/.travis.yml +7 -0
  2. data/CHANGELOG +311 -0
  3. data/Gemfile +34 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +239 -0
  6. data/Rakefile +60 -0
  7. data/VERSION +1 -0
  8. data/lib/action_controller/session/redis_session_store.rb +81 -0
  9. data/lib/active_support/cache/redis_store.rb +254 -0
  10. data/lib/cache/merb/redis_store.rb +79 -0
  11. data/lib/cache/sinatra/redis_store.rb +131 -0
  12. data/lib/i18n/backend/redis.rb +67 -0
  13. data/lib/rack/cache/redis_entitystore.rb +48 -0
  14. data/lib/rack/cache/redis_metastore.rb +40 -0
  15. data/lib/rack/session/merb.rb +32 -0
  16. data/lib/rack/session/redis.rb +88 -0
  17. data/lib/redis-store.rb +45 -0
  18. data/lib/redis/distributed_store.rb +39 -0
  19. data/lib/redis/factory.rb +46 -0
  20. data/lib/redis/store.rb +39 -0
  21. data/lib/redis/store/interface.rb +17 -0
  22. data/lib/redis/store/marshalling.rb +51 -0
  23. data/lib/redis/store/namespace.rb +62 -0
  24. data/lib/redis/store/ttl.rb +37 -0
  25. data/lib/redis/store/version.rb +12 -0
  26. data/spec/action_controller/session/redis_session_store_spec.rb +126 -0
  27. data/spec/active_support/cache/redis_store_spec.rb +426 -0
  28. data/spec/cache/merb/redis_store_spec.rb +143 -0
  29. data/spec/cache/sinatra/redis_store_spec.rb +192 -0
  30. data/spec/config/node-one.conf +417 -0
  31. data/spec/config/node-two.conf +417 -0
  32. data/spec/config/redis.conf +417 -0
  33. data/spec/i18n/backend/redis_spec.rb +72 -0
  34. data/spec/rack/cache/entitystore/pony.jpg +0 -0
  35. data/spec/rack/cache/entitystore/redis_spec.rb +124 -0
  36. data/spec/rack/cache/metastore/redis_spec.rb +259 -0
  37. data/spec/rack/session/redis_spec.rb +234 -0
  38. data/spec/redis/distributed_store_spec.rb +55 -0
  39. data/spec/redis/factory_spec.rb +110 -0
  40. data/spec/redis/store/interface_spec.rb +23 -0
  41. data/spec/redis/store/marshalling_spec.rb +119 -0
  42. data/spec/redis/store/namespace_spec.rb +76 -0
  43. data/spec/redis/store/version_spec.rb +7 -0
  44. data/spec/redis/store_spec.rb +13 -0
  45. data/spec/spec_helper.rb +43 -0
  46. data/tasks/redis.tasks.rb +235 -0
  47. metadata +249 -0
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Redis::Store::Namespace" do
4
+ before :each do
5
+ @namespace = "theplaylist"
6
+ @store = Redis::Store.new :namespace => @namespace, :marshalling => false # TODO remove mashalling option
7
+ @client = @store.instance_variable_get(:@client)
8
+ @rabbit = "bunny"
9
+ end
10
+
11
+ after :each do
12
+ @store.should_receive(:quit) # stupid rspec, meh!
13
+ @store.quit
14
+ end
15
+
16
+ it "should only decorate instances that needs to be namespaced" do
17
+ @store = Redis::Store.new
18
+ client = @store.instance_variable_get(:@client)
19
+ client.should_receive(:call).with([:get, "rabbit"])
20
+ @store.get("rabbit")
21
+ end
22
+
23
+ it "should not namespace a key which is already namespaced" do
24
+ @store.send(:interpolate, "#{@namespace}:rabbit").should == "#{@namespace}:rabbit"
25
+ end
26
+
27
+ it "should namespace get" do
28
+ @client.should_receive(:call).with([:get, "#{@namespace}:rabbit"])
29
+ @store.get("rabbit")
30
+ end
31
+
32
+ it "should namespace set" do
33
+ @client.should_receive(:call).with([:set, "#{@namespace}:rabbit", @rabbit])
34
+ @store.set "rabbit", @rabbit
35
+ end
36
+
37
+ it "should namespace setnx" do
38
+ @client.should_receive(:call).with([:setnx, "#{@namespace}:rabbit", @rabbit])
39
+ @store.setnx "rabbit", @rabbit
40
+ end
41
+
42
+ it "should namespace del with single key" do
43
+ @client.should_receive(:call).with([:del, "#{@namespace}:rabbit"])
44
+ @store.del "rabbit"
45
+ end
46
+
47
+ it "should namespace del with multiple keys" do
48
+ @client.should_receive(:call).with([:del, "#{@namespace}:rabbit", "#{@namespace}:white_rabbit"])
49
+ @store.del "rabbit", "white_rabbit"
50
+ end
51
+
52
+ it "should namespace keys" do
53
+ @store.set "rabbit", @rabbit
54
+ @store.keys("rabb*").should == [ "rabbit" ]
55
+ end
56
+
57
+ it "should namespace exists" do
58
+ @client.should_receive(:call).with([:exists, "#{@namespace}:rabbit"])
59
+ @store.exists "rabbit"
60
+ end
61
+
62
+ it "should namespace incrby" do
63
+ @client.should_receive(:call).with([:incrby, "#{@namespace}:counter", 1])
64
+ @store.incrby "counter", 1
65
+ end
66
+
67
+ it "should namespace decrby" do
68
+ @client.should_receive(:call).with([:decrby, "#{@namespace}:counter", 1])
69
+ @store.decrby "counter", 1
70
+ end
71
+
72
+ it "should namespace mget" do
73
+ @client.should_receive(:call).with([:mget, "#{@namespace}:rabbit", "#{@namespace}:white_rabbit"])
74
+ @store.mget "rabbit", "white_rabbit"
75
+ end
76
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Redis::Store::VERSION do
4
+ it "should describe Redis::Store version" do
5
+ Redis::Store::VERSION::STRING.should == "1.0.0.1"
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Redis::Store" do
4
+ before :each do
5
+ @store = Redis::Store.new
6
+ end
7
+
8
+ it "should force reconnection" do
9
+ client = @store.instance_variable_get(:@client)
10
+ client.should_receive(:reconnect)
11
+ @store.reconnect
12
+ end
13
+ end
@@ -0,0 +1,43 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "/../lib")))
2
+ ARGV << "-b"
3
+ require "rubygems"
4
+ require "bundler"
5
+ Bundler.setup
6
+ require "methopara" if RUBY_VERSION.match /1\.9/
7
+ require "ostruct"
8
+ require "spec"
9
+ require "spec/autorun"
10
+ require "redis"
11
+ require "merb"
12
+ require "i18n"
13
+ require "rack/cache"
14
+ require "rack/cache/metastore"
15
+ require "rack/cache/entitystore"
16
+ require "redis-store"
17
+ require "active_support"
18
+ begin
19
+ require "action_controller/session/abstract_store" # Rails 2.3.x
20
+ rescue LoadError
21
+ require "action_dispatch/middleware/session/abstract_store" # Rails 3.x
22
+ module ::Rails
23
+ module VERSION
24
+ MAJOR = 3
25
+ end
26
+ end
27
+ end
28
+ require "active_support/cache/redis_store"
29
+ require "action_controller/session/redis_session_store"
30
+ require "cache/sinatra/redis_store"
31
+
32
+ $DEBUG = ENV["DEBUG"] === "true"
33
+
34
+ # http://mentalized.net/journal/2010/04/02/suppress_warnings_from_ruby/
35
+ module Kernel
36
+ def suppress_warnings
37
+ original_verbosity = $VERBOSE
38
+ $VERBOSE = nil
39
+ result = yield
40
+ $VERBOSE = original_verbosity
41
+ return result
42
+ end
43
+ end
@@ -0,0 +1,235 @@
1
+ # inspired by old Rake tasks from redis-rb
2
+ require 'rake'
3
+ require 'fileutils'
4
+ require 'open-uri'
5
+
6
+ class RedisRunner
7
+ def self.port
8
+ 6379
9
+ end
10
+
11
+ def self.redisdir
12
+ @@redisdir ||= File.expand_path File.join(File.dirname(__FILE__), '..', 'vendor', 'redis')
13
+ end
14
+
15
+ def self.redisconfdir
16
+ '/etc/redis.conf'
17
+ end
18
+
19
+ def self.dtach_socket
20
+ '/tmp/redis.dtach'
21
+ end
22
+
23
+ # Just check for existance of dtach socket
24
+ def self.running?
25
+ File.exists? dtach_socket
26
+ end
27
+
28
+ def self.start
29
+ puts 'Detach with Ctrl+\ Re-attach with rake redis:attach'
30
+ sleep 3
31
+ exec "dtach -A #{dtach_socket} redis-server #{redisconfdir}"
32
+ end
33
+
34
+ def self.start_detached
35
+ system "dtach -n #{dtach_socket} redis-server #{redisconfdir}"
36
+ end
37
+
38
+ def self.attach
39
+ exec "dtach -a #{dtach_socket}"
40
+ end
41
+
42
+ def self.stop
43
+ system %(redis-cli -p #{port} SHUTDOWN)
44
+ end
45
+ end
46
+
47
+ class MainRedisRunner < RedisRunner
48
+ def self.redisconfdir
49
+ File.expand_path(File.dirname(__FILE__) + "/../spec/config/redis.conf")
50
+ end
51
+ end
52
+
53
+ class NodeOneRedisRunner < RedisRunner
54
+ def self.redisconfdir
55
+ File.expand_path(File.dirname(__FILE__) + "/../spec/config/node-one.conf")
56
+ end
57
+
58
+ def self.dtach_socket
59
+ "/tmp/redis-node-one.dtach"
60
+ end
61
+
62
+ def self.port
63
+ 6380
64
+ end
65
+ end
66
+
67
+ class NodeTwoRedisRunner < RedisRunner
68
+ def self.redisconfdir
69
+ File.expand_path(File.dirname(__FILE__) + "/../spec/config/node-two.conf")
70
+ end
71
+
72
+ def self.dtach_socket
73
+ "/tmp/redis-node-two.dtach"
74
+ end
75
+
76
+ def self.port
77
+ 6381
78
+ end
79
+ end
80
+
81
+ class RedisReplicationRunner
82
+ def self.runners
83
+ [ MainRedisRunner, NodeOneRedisRunner, NodeTwoRedisRunner ]
84
+ end
85
+
86
+ def self.start_detached
87
+ runners.each do |runner|
88
+ runner.start_detached
89
+ end
90
+ end
91
+
92
+ def self.stop
93
+ runners.each do |runner|
94
+ runner.stop
95
+ end
96
+ end
97
+ end
98
+
99
+ namespace :redis do
100
+ desc 'About redis'
101
+ task :about do
102
+ puts "\nSee http://code.google.com/p/redis/ for information about redis.\n\n"
103
+ end
104
+
105
+ desc 'Start redis'
106
+ task :start => 'dtach:check' do
107
+ RedisRunner.start
108
+ end
109
+
110
+ desc 'Stop redis'
111
+ task :stop do
112
+ RedisRunner.stop
113
+ end
114
+
115
+ desc 'Restart redis'
116
+ task :restart do
117
+ RedisRunner.stop
118
+ RedisRunner.start
119
+ end
120
+
121
+ desc 'Attach to redis dtach socket'
122
+ task :attach do
123
+ RedisRunner.attach
124
+ end
125
+
126
+ desc 'Install the lastest verison of Redis from Github (requires git, duh)'
127
+ task :install => [ :about, :download, :make ] do
128
+ %w(redis-benchmark redis-cli redis-server).each do |bin|
129
+ if File.exist?(path = "#{RedisRunner.redisdir}/src/#{bin}")
130
+ sh "sudo cp #{path} /usr/bin/"
131
+ else
132
+ sh "sudo cp #{RedisRunner.redisdir}/#{bin} /usr/bin/"
133
+ end
134
+ end
135
+
136
+ puts "Installed redis-benchmark, redis-cli and redis-server to /usr/bin/"
137
+
138
+ sh "sudo cp #{RedisRunner.redisdir}/redis.conf /etc/"
139
+ puts "Installed redis.conf to /etc/ \n You should look at this file!"
140
+ end
141
+
142
+ task :make do
143
+ sh "cd #{RedisRunner.redisdir} && make clean"
144
+ sh "cd #{RedisRunner.redisdir} && make"
145
+ end
146
+
147
+ desc "Download package"
148
+ task :download do
149
+ require 'git'
150
+
151
+ sh "rm -rf #{RedisRunner.redisdir} && mkdir -p vendor && rm -rf redis"
152
+ Git.clone("git://github.com/antirez/redis.git", "redis")
153
+ sh "mv redis vendor"
154
+
155
+ commit = case ENV['VERSION']
156
+ when "1.3.12" then "26ef09a83526e5099bce"
157
+ when "2.2.8" then "ec279203df0bc6ddc981"
158
+ end
159
+
160
+ arguments = commit.nil? ? "pull origin master" : "reset --hard #{commit}"
161
+ sh "cd #{RedisRunner.redisdir} && git #{arguments}"
162
+ end
163
+
164
+ desc "Open an IRb session"
165
+ task :console do
166
+ RedisRunner.start_detached
167
+ system "bundle exec irb -I lib -I extra -r redis-store.rb"
168
+ RedisRunner.stop
169
+ end
170
+
171
+ namespace :replication do
172
+ desc "Starts redis replication servers"
173
+ task :start => 'dtach:check' do
174
+ result = RedisReplicationRunner.start_detached
175
+ raise("Could not start redis-server, aborting.") unless result
176
+ end
177
+
178
+ desc "Stops redis replication servers"
179
+ task :stop do
180
+ RedisReplicationRunner.stop
181
+ end
182
+
183
+ desc "Open an IRb session with the master/slave replication"
184
+ task :console do
185
+ RedisReplicationRunner.start_detached
186
+ system "bundle exec irb -I lib -I extra -r redis-store.rb"
187
+ RedisReplicationRunner.stop
188
+ end
189
+ end
190
+ end
191
+
192
+ namespace :dtach do
193
+ desc 'About dtach'
194
+ task :about do
195
+ puts "\nSee http://dtach.sourceforge.net/ for information about dtach.\n\n"
196
+ end
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
+
205
+ desc 'Install dtach 0.8 from source'
206
+ task :install => [:about] do
207
+
208
+ Dir.chdir('/tmp/')
209
+ unless File.exists?('/tmp/dtach-0.8.tar.gz')
210
+ require 'net/http'
211
+
212
+ url = 'http://downloads.sourceforge.net/project/dtach/dtach/0.8/dtach-0.8.tar.gz'
213
+ open('/tmp/dtach-0.8.tar.gz', 'wb') do |file| file.write(open(url).read) end
214
+ end
215
+
216
+ unless File.directory?('/tmp/dtach-0.8')
217
+ system('tar xzf dtach-0.8.tar.gz')
218
+ end
219
+
220
+ Dir.chdir('/tmp/dtach-0.8/')
221
+ sh 'cd /tmp/dtach-0.8/ && ./configure && make'
222
+ sh 'sudo cp /tmp/dtach-0.8/dtach /usr/bin/'
223
+
224
+ puts 'Dtach successfully installed to /usr/bin.'
225
+ end
226
+ end
227
+
228
+ def invoke_with_redis_replication(task_name)
229
+ begin
230
+ Rake::Task["redis:replication:start"].invoke
231
+ Rake::Task[task_name].invoke
232
+ ensure
233
+ Rake::Task["redis:replication:stop"].invoke
234
+ end
235
+ end
metadata ADDED
@@ -0,0 +1,249 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: instructure-redis-store
3
+ version: !ruby/object:Gem::Version
4
+ hash: 743671203
5
+ prerelease: 8
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ - 1
11
+ - instructure
12
+ - 1
13
+ version: 1.0.0.1.instructure1
14
+ platform: ruby
15
+ authors:
16
+ - Luca Guidi
17
+ - Brian Palmer
18
+ autorequire:
19
+ bindir: bin
20
+ cert_chain: []
21
+
22
+ date: 2012-06-12 00:00:00 Z
23
+ dependencies:
24
+ - !ruby/object:Gem::Dependency
25
+ version_requirements: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - "="
29
+ - !ruby/object:Gem::Version
30
+ hash: 5
31
+ segments:
32
+ - 3
33
+ - 0
34
+ - 1
35
+ version: 3.0.1
36
+ name: redis
37
+ prerelease: false
38
+ type: :runtime
39
+ requirement: *id001
40
+ - !ruby/object:Gem::Dependency
41
+ version_requirements: &id002 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ hash: 3
47
+ segments:
48
+ - 0
49
+ version: "0"
50
+ name: jeweler
51
+ prerelease: false
52
+ type: :development
53
+ requirement: *id002
54
+ - !ruby/object:Gem::Dependency
55
+ version_requirements: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ hash: 3
61
+ segments:
62
+ - 0
63
+ version: "0"
64
+ name: git
65
+ prerelease: false
66
+ type: :development
67
+ requirement: *id003
68
+ - !ruby/object:Gem::Dependency
69
+ version_requirements: &id004 !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ hash: 3
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ name: rack-cache
79
+ prerelease: false
80
+ type: :development
81
+ requirement: *id004
82
+ - !ruby/object:Gem::Dependency
83
+ version_requirements: &id005 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - "="
87
+ - !ruby/object:Gem::Version
88
+ hash: 19
89
+ segments:
90
+ - 1
91
+ - 1
92
+ - 0
93
+ version: 1.1.0
94
+ name: merb
95
+ prerelease: false
96
+ type: :development
97
+ requirement: *id005
98
+ - !ruby/object:Gem::Dependency
99
+ version_requirements: &id006 !ruby/object:Gem::Requirement
100
+ none: false
101
+ requirements:
102
+ - - "="
103
+ - !ruby/object:Gem::Version
104
+ hash: 27
105
+ segments:
106
+ - 1
107
+ - 3
108
+ - 0
109
+ version: 1.3.0
110
+ name: rspec
111
+ prerelease: false
112
+ type: :development
113
+ requirement: *id006
114
+ - !ruby/object:Gem::Dependency
115
+ version_requirements: &id007 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ hash: 3
121
+ segments:
122
+ - 0
123
+ version: "0"
124
+ name: i18n
125
+ prerelease: false
126
+ type: :development
127
+ requirement: *id007
128
+ - !ruby/object:Gem::Dependency
129
+ version_requirements: &id008 !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ hash: 3
135
+ segments:
136
+ - 0
137
+ version: "0"
138
+ name: ruby-debug
139
+ prerelease: false
140
+ type: :development
141
+ requirement: *id008
142
+ - !ruby/object:Gem::Dependency
143
+ version_requirements: &id009 !ruby/object:Gem::Requirement
144
+ none: false
145
+ requirements:
146
+ - - "="
147
+ - !ruby/object:Gem::Version
148
+ hash: 5
149
+ segments:
150
+ - 3
151
+ - 0
152
+ - 1
153
+ version: 3.0.1
154
+ name: redis
155
+ prerelease: false
156
+ type: :runtime
157
+ requirement: *id009
158
+ description: Namespaced Rack::Session, Rack::Cache, I18n and cache Redis stores for Ruby web frameworks.
159
+ email: brianp@instructure.com
160
+ executables: []
161
+
162
+ extensions: []
163
+
164
+ extra_rdoc_files:
165
+ - README.md
166
+ files:
167
+ - .travis.yml
168
+ - CHANGELOG
169
+ - Gemfile
170
+ - MIT-LICENSE
171
+ - README.md
172
+ - Rakefile
173
+ - VERSION
174
+ - lib/action_controller/session/redis_session_store.rb
175
+ - lib/active_support/cache/redis_store.rb
176
+ - lib/cache/merb/redis_store.rb
177
+ - lib/cache/sinatra/redis_store.rb
178
+ - lib/i18n/backend/redis.rb
179
+ - lib/rack/cache/redis_entitystore.rb
180
+ - lib/rack/cache/redis_metastore.rb
181
+ - lib/rack/session/merb.rb
182
+ - lib/rack/session/redis.rb
183
+ - lib/redis-store.rb
184
+ - lib/redis/distributed_store.rb
185
+ - lib/redis/factory.rb
186
+ - lib/redis/store.rb
187
+ - lib/redis/store/interface.rb
188
+ - lib/redis/store/marshalling.rb
189
+ - lib/redis/store/namespace.rb
190
+ - lib/redis/store/ttl.rb
191
+ - lib/redis/store/version.rb
192
+ - spec/action_controller/session/redis_session_store_spec.rb
193
+ - spec/active_support/cache/redis_store_spec.rb
194
+ - spec/cache/merb/redis_store_spec.rb
195
+ - spec/cache/sinatra/redis_store_spec.rb
196
+ - spec/config/node-one.conf
197
+ - spec/config/node-two.conf
198
+ - spec/config/redis.conf
199
+ - spec/i18n/backend/redis_spec.rb
200
+ - spec/rack/cache/entitystore/pony.jpg
201
+ - spec/rack/cache/entitystore/redis_spec.rb
202
+ - spec/rack/cache/metastore/redis_spec.rb
203
+ - spec/rack/session/redis_spec.rb
204
+ - spec/redis/distributed_store_spec.rb
205
+ - spec/redis/factory_spec.rb
206
+ - spec/redis/store/interface_spec.rb
207
+ - spec/redis/store/marshalling_spec.rb
208
+ - spec/redis/store/namespace_spec.rb
209
+ - spec/redis/store/version_spec.rb
210
+ - spec/redis/store_spec.rb
211
+ - spec/spec_helper.rb
212
+ - tasks/redis.tasks.rb
213
+ homepage: http://github.com/instructure/redis-store
214
+ licenses: []
215
+
216
+ post_install_message:
217
+ rdoc_options: []
218
+
219
+ require_paths:
220
+ - lib
221
+ required_ruby_version: !ruby/object:Gem::Requirement
222
+ none: false
223
+ requirements:
224
+ - - ">="
225
+ - !ruby/object:Gem::Version
226
+ hash: 3
227
+ segments:
228
+ - 0
229
+ version: "0"
230
+ required_rubygems_version: !ruby/object:Gem::Requirement
231
+ none: false
232
+ requirements:
233
+ - - ">"
234
+ - !ruby/object:Gem::Version
235
+ hash: 25
236
+ segments:
237
+ - 1
238
+ - 3
239
+ - 1
240
+ version: 1.3.1
241
+ requirements: []
242
+
243
+ rubyforge_project:
244
+ rubygems_version: 1.8.11
245
+ signing_key:
246
+ specification_version: 3
247
+ summary: Namespaced Rack::Session, Rack::Cache, I18n and cache Redis stores for Ruby web frameworks.
248
+ test_files: []
249
+