instructure-redis-store 1.0.0.1.instructure1

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 (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
+