redis-activesupport 4.0.0 → 4.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e812b725218799448b4fccf029a6e3f45e9dd9a5
4
- data.tar.gz: 997c46b3aebb292245a7c1f2f1353907b5de70c3
3
+ metadata.gz: fbde1fe9e22083ceba3ff74535d88465a7097434
4
+ data.tar.gz: e807712d514c1f5361ef005cd04a028fa802d19f
5
5
  SHA512:
6
- metadata.gz: 50f9ebe7469531e877506c2c0319f4f6510d0f5e039098d4fa93ebf318d8b2de9cc9cc71acf0582fe5d9fc361443a591cf17ff3d2071ffbf02ee40c3c3115cd5
7
- data.tar.gz: 20fa18aa279d0fcba4633c09e61af83966e15be4c8d7cf356d43bccb7f81ca8f1870a2d1a324c596a53f3d3c9dafebbc8d55f77194e94a7311380e1a1ed8a9e7
6
+ metadata.gz: de702e1868ba3090390e4c52cc82e9d7ad89e9252cdf45aebf85dd5c5d46a20c917ce8385cd7bcd424e6e4efa1fdeb7b7b106145597bd57dc9a944808264a457
7
+ data.tar.gz: f0cbe5961a33c63a1b4985ea0415f4391de07dc4e7137fbe898100a2eec96d38d1846c89a80ad31587c3814b705c664f0e5f64d303638dfdf0b0c632cbe80711
data/.gitignore CHANGED
@@ -1,5 +1,3 @@
1
- *.gem
2
- .bundle
3
1
  Gemfile.lock
4
- pkg/*
5
- tmp/*
2
+ *.gem
3
+ tmp/
data/.travis.yml ADDED
@@ -0,0 +1,15 @@
1
+ language: ruby
2
+ script: 'bundle exec rake'
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - ruby-head
7
+ - rbx-19mode
8
+ - jruby-19mode
9
+ - jruby-head
10
+ services:
11
+ - redis-server
12
+ matrix:
13
+ allow_failures:
14
+ - rvm: jruby-head
15
+ - rvm: ruby-head
data/Gemfile CHANGED
@@ -1,16 +1,8 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
- gem 'redis-store', '~> 1.1.0', path: '../redis-store'
5
- gem 'i18n'
6
-
7
- version = ENV["RAILS_VERSION"] || "4"
8
-
9
- rails = case version
10
- when "master"
11
- {:github => "rails/rails"}
12
- else
13
- "~> #{version}.0"
4
+ if ::File.directory?(gem_path = '../redis-store')
5
+ gem 'redis-store', '~> 1.1.0', path: gem_path
14
6
  end
15
7
 
16
- gem "rails", rails
8
+ gem 'i18n'
data/README.md CHANGED
@@ -1,28 +1,38 @@
1
1
  # Redis stores for ActiveSupport
2
2
 
3
- __`redis-activesupport`__ provides a cache for __ActiveSupport__. See the main [redis-store readme](https://github.com/jodosha/redis-store) for general guidelines.
3
+ __`redis-activesupport`__ provides a cache for __ActiveSupport__. See the main [redis-store readme](https://github.com/redis-store/redis-store) for general guidelines.
4
4
 
5
5
  ## Installation
6
6
 
7
- # Gemfile
8
- gem 'redis-activesupport'
7
+ ```ruby
8
+ # Gemfile
9
+ gem 'redis-activesupport'
10
+ ```
9
11
 
10
- ### Usage
12
+ ## Usage
11
13
 
12
- If you are using redis-store with Rails, consider using the [redis-rails gem](https://github.com/jodosha/redis-store/tree/master/redis-rails) instead. For standalone usage:
14
+ If you are using redis-store with Rails, consider using the [redis-rails gem](https://github.com/redis-store/redis-rails) instead. For standalone usage:
13
15
 
14
- ActiveSupport::Cache.lookup_store :redis_store # { ... optional configuration ... }
16
+ ```ruby
17
+ ActiveSupport::Cache.lookup_store :redis_store # { ... optional configuration ... }
18
+ ```
15
19
 
16
20
  ## Running tests
17
21
 
18
- gem install bundler
19
- git clone git://github.com/jodosha/redis-store.git
20
- cd redis-store/redis-activesupport
21
- bundle install
22
- bundle exec rake
22
+ ```shell
23
+ gem install bundler
24
+ git clone git://github.com/redis-store/redis-activesupport.git
25
+ cd redis-activesupport
26
+ bundle install
27
+ bundle exec rake
28
+ ```
23
29
 
24
30
  If you are on **Snow Leopard** you have to run `env ARCHFLAGS="-arch x86_64" bundle exec rake`
25
31
 
32
+ ## Status
33
+
34
+ [![Gem Version](https://badge.fury.io/rb/redis-activesupport.png)](http://badge.fury.io/rb/redis-activesupport) [![Build Status](https://secure.travis-ci.org/redis-store/redis-activesupport.png?branch=master)](http://travis-ci.org/jodosha/redis-activesupport?branch=master) [![Code Climate](https://codeclimate.com/github/jodosha/redis-store.png)](https://codeclimate.com/github/redis-store/redis-activesupport)
35
+
26
36
  ## Copyright
27
37
 
28
- (c) 2009 - 2011 Luca Guidi - [http://lucaguidi.com](http://lucaguidi.com), released under the MIT license
38
+ 2009 - 2013 Luca Guidi - [http://lucaguidi.com](http://lucaguidi.com), released under the MIT license
data/Rakefile CHANGED
@@ -1,8 +1,4 @@
1
- require 'bundler'
2
- Bundler.setup
1
+ require 'bundler/setup'
3
2
  require 'rake'
4
3
  require 'bundler/gem_tasks'
5
-
6
- load 'tasks/redis.tasks.rb'
7
- task :default => 'redis:test:suite'
8
-
4
+ require 'redis-store/testing/tasks'
@@ -4,6 +4,8 @@ require 'redis-store'
4
4
  module ActiveSupport
5
5
  module Cache
6
6
  class RedisStore < Store
7
+ attr_reader :data
8
+
7
9
  # Instantiate the store.
8
10
  #
9
11
  # Example:
@@ -24,9 +26,31 @@ module ActiveSupport
24
26
  #
25
27
  # RedisStore.new "localhost:6379/0", "localhost:6380/0"
26
28
  # # => instantiate a cluster
29
+ #
30
+ # RedisStore.new "localhost:6379/0", "localhost:6380/0", pool_size: 5, pool_timeout: 10
31
+ # # => use a ConnectionPool
32
+ #
33
+ # RedisStore.new "localhost:6379/0", "localhost:6380/0",
34
+ # pool: ::ConnectionPool.new(size: 1, timeout: 1) { ::Redis::Store::Factory.create("localhost:6379/0") })
35
+ # # => supply an existing connection pool (e.g. for use with redis-sentinel or redis-failover)
27
36
  def initialize(*addresses)
28
- @data = ::Redis::Store::Factory.create(addresses)
29
- super(addresses.extract_options!)
37
+ @options = addresses.extract_options!
38
+
39
+ @data = if @options[:pool]
40
+ raise "pool must be an instance of ConnectionPool" unless @options[:pool].is_a?(ConnectionPool)
41
+ @pooled = true
42
+ @options[:pool]
43
+ elsif [:pool_size, :pool_timeout].any? { |key| @options.has_key?(key) }
44
+ pool_options = {}
45
+ pool_options[:size] = options[:pool_size] if options[:pool_size]
46
+ pool_options[:timeout] = options[:pool_timeout] if options[:pool_timeout]
47
+ @pooled = true
48
+ ::ConnectionPool.new(pool_options) { ::Redis::Store::Factory.create(addresses) }
49
+ else
50
+ ::Redis::Store::Factory.create(addresses)
51
+ end
52
+
53
+ super(@options)
30
54
  end
31
55
 
32
56
  def write(name, value, options = nil)
@@ -45,14 +69,16 @@ module ActiveSupport
45
69
  # avoid this method.
46
70
  #
47
71
  # Example:
48
- # cache.del_matched "rab*"
72
+ # cache.delete_matched "rab*"
49
73
  def delete_matched(matcher, options = nil)
50
74
  options = merged_options(options)
51
75
  instrument(:delete_matched, matcher.inspect) do
52
76
  matcher = key_matcher(matcher, options)
53
77
  begin
54
- !(keys = @data.keys(matcher)).empty? && @data.del(*keys)
55
- rescue Errno::ECONNREFUSED => e
78
+ with do |store|
79
+ !(keys = store.keys(matcher)).empty? && store.del(*keys)
80
+ end
81
+ rescue Errno::ECONNREFUSED, Redis::CannotConnectError
56
82
  false
57
83
  end
58
84
  end
@@ -65,17 +91,42 @@ module ActiveSupport
65
91
  # cache.read_multi "rabbit", "white-rabbit"
66
92
  # cache.read_multi "rabbit", "white-rabbit", :raw => true
67
93
  def read_multi(*names)
68
- values = @data.mget(*names)
94
+ options = names.extract_options!
95
+ keys = names.map{|name| namespaced_key(name, options)}
96
+ values = with { |c| c.mget(*keys) }
69
97
  values.map! { |v| v.is_a?(ActiveSupport::Cache::Entry) ? v.value : v }
70
98
 
71
99
  # Remove the options hash before mapping keys to values
72
100
  names.extract_options!
73
101
 
74
- result = Hash[names.zip(values)]
102
+ result = Hash[keys.zip(values)]
75
103
  result.reject!{ |k,v| v.nil? }
76
104
  result
77
105
  end
78
106
 
107
+ def fetch_multi(*names)
108
+ results = read_multi(*names)
109
+ options = names.extract_options!
110
+ fetched = {}
111
+
112
+ with do |c|
113
+ c.multi do
114
+ fetched = names.inject({}) do |memo, (name, _)|
115
+ key = namespaced_key(name, options)
116
+ memo[key] = results.fetch(key) do
117
+ value = yield name
118
+ write(name, value, options)
119
+ value
120
+ end
121
+
122
+ memo
123
+ end
124
+ end
125
+ end
126
+
127
+ fetched
128
+ end
129
+
79
130
  # Increment a key in the store.
80
131
  #
81
132
  # If the key doesn't exist it will be initialized on 0.
@@ -99,7 +150,7 @@ module ActiveSupport
99
150
  # cache.read "rabbit", :raw => true # => "1"
100
151
  def increment(key, amount = 1)
101
152
  instrument(:increment, key, :amount => amount) do
102
- @data.incrby key, amount
153
+ with{|c| c.incrby key, amount}
103
154
  end
104
155
  end
105
156
 
@@ -126,18 +177,19 @@ module ActiveSupport
126
177
  # cache.read "rabbit", :raw => true # => "-1"
127
178
  def decrement(key, amount = 1)
128
179
  instrument(:decrement, key, :amount => amount) do
129
- @data.decrby key, amount
180
+ with{|c| c.decrby key, amount}
181
+
130
182
  end
131
183
  end
132
184
 
133
185
  def expire(key, ttl)
134
- @data.expire key, ttl
186
+ with { |c| c.expire key, ttl }
135
187
  end
136
188
 
137
189
  # Clear all the data from the store.
138
190
  def clear
139
191
  instrument(:clear, nil, nil) do
140
- @data.flushdb
192
+ with(&:flushdb)
141
193
  end
142
194
  end
143
195
 
@@ -149,28 +201,35 @@ module ActiveSupport
149
201
  end
150
202
 
151
203
  def stats
152
- @data.info
204
+ with(&:info)
205
+ end
206
+
207
+ def with(&block)
208
+ if @pooled
209
+ @data.with(&block)
210
+ else
211
+ block.call(@data)
212
+ end
153
213
  end
154
214
 
155
- # Force client reconnection, useful Unicorn deployed apps.
156
215
  def reconnect
157
- @data.reconnect
216
+ @data.reconnect if @data.respond_to?(:reconnect)
158
217
  end
159
218
 
160
219
  protected
161
220
  def write_entry(key, entry, options)
162
221
  method = options && options[:unless_exist] ? :setnx : :set
163
- @data.send method, key, entry, options
164
- rescue Errno::ECONNREFUSED => e
222
+ with { |client| client.send method, key, entry, options }
223
+ rescue Errno::ECONNREFUSED, Redis::CannotConnectError
165
224
  false
166
225
  end
167
226
 
168
227
  def read_entry(key, options)
169
- entry = @data.get key, options
228
+ entry = with { |c| c.get key, options }
170
229
  if entry
171
230
  entry.is_a?(ActiveSupport::Cache::Entry) ? entry : ActiveSupport::Cache::Entry.new(entry)
172
231
  end
173
- rescue Errno::ECONNREFUSED => e
232
+ rescue Errno::ECONNREFUSED, Redis::CannotConnectError
174
233
  nil
175
234
  end
176
235
 
@@ -180,8 +239,8 @@ module ActiveSupport
180
239
  # It's really needed and use
181
240
  #
182
241
  def delete_entry(key, options)
183
- @data.del key
184
- rescue Errno::ECONNREFUSED => e
242
+ entry = with { |c| c.del key }
243
+ rescue Errno::ECONNREFUSED, Redis::CannotConnectError
185
244
  false
186
245
  end
187
246
 
@@ -1,5 +1,5 @@
1
1
  class Redis
2
2
  module ActiveSupport
3
- VERSION = '4.0.0'
3
+ VERSION = '4.1.0'
4
4
  end
5
5
  end
@@ -1,22 +1,23 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "redis/activesupport/version"
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'redis/activesupport/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = "redis-activesupport"
6
+ s.name = 'redis-activesupport'
7
7
  s.version = Redis::ActiveSupport::VERSION
8
- s.authors = ["Luca Guidi"]
9
- s.email = ["me@lucaguidi.com"]
10
- s.homepage = "http://redis-store.org/redis-activesupport"
11
- s.summary = %q{Redis store for ActiveSupport::Cache}
12
- s.description = %q{Redis store for ActiveSupport::Cache}
8
+ s.authors = ['Luca Guidi']
9
+ s.email = ['me@lucaguidi.com']
10
+ s.homepage = 'http://redis-store.org/redis-activesupport'
11
+ s.summary = %q{Redis store for ActiveSupport}
12
+ s.description = %q{Redis store for ActiveSupport}
13
+ s.license = 'MIT'
13
14
 
14
- s.rubyforge_project = "redis-activesupport"
15
+ s.rubyforge_project = 'redis-activesupport'
15
16
 
16
17
  s.files = `git ls-files`.split("\n")
17
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
- s.require_paths = ["lib"]
20
+ s.require_paths = ['lib']
20
21
 
21
22
  s.add_runtime_dependency 'redis-store', '~> 1.1.0'
22
23
  s.add_runtime_dependency 'activesupport', '~> 4'
@@ -25,5 +26,7 @@ Gem::Specification.new do |s|
25
26
  s.add_development_dependency 'bundler', '~> 1.3'
26
27
  s.add_development_dependency 'mocha', '~> 0.14.0'
27
28
  s.add_development_dependency 'minitest', '~> 4.2'
29
+ s.add_development_dependency 'connection_pool', '~> 1.2.0'
30
+ s.add_development_dependency 'redis-store-testing'
28
31
  end
29
32
 
@@ -1,9 +1,20 @@
1
1
  require 'test_helper'
2
+ require 'ostruct'
3
+ require 'connection_pool'
2
4
 
3
5
  describe ActiveSupport::Cache::RedisStore do
4
6
  def setup
5
7
  @store = ActiveSupport::Cache::RedisStore.new
6
- @dstore = ActiveSupport::Cache::RedisStore.new "redis://127.0.0.1:6380/1", "redis://127.0.0.1:6381/1"
8
+ @dstore = ActiveSupport::Cache::RedisStore.new "redis://127.0.0.1:6379/5", "redis://127.0.0.1:6379/6"
9
+ @pool_store = ActiveSupport::Cache::RedisStore.new("redis://127.0.0.1:6379/2", pool_size: 5, pool_timeout: 10)
10
+ @external_pool_store = ActiveSupport::Cache::RedisStore.new(pool: ::ConnectionPool.new(size: 1, timeout: 1) { ::Redis::Store::Factory.create("redis://127.0.0.1:6379/3") })
11
+
12
+ @pool_store.data.class.must_equal ::ConnectionPool
13
+ @pool_store.data.instance_variable_get(:@size).must_equal 5
14
+ @external_pool_store.data.class.must_equal ::ConnectionPool
15
+ @external_pool_store.data.instance_variable_get(:@size).must_equal 1
16
+
17
+
7
18
  @rabbit = OpenStruct.new :name => "bunny"
8
19
  @white_rabbit = OpenStruct.new :color => "white"
9
20
 
@@ -14,6 +25,56 @@ describe ActiveSupport::Cache::RedisStore do
14
25
  end
15
26
  end
16
27
 
28
+ it "raises an error if :pool isn't a pool" do
29
+ assert_raises(RuntimeError, 'pool must be an instance of ConnectionPool') do
30
+ ActiveSupport::Cache::RedisStore.new(pool: 'poolio')
31
+ end
32
+ end
33
+
34
+ it "namespaces all operations" do
35
+ address = "redis://127.0.0.1:6380/1/cache-namespace"
36
+ store = ActiveSupport::Cache::RedisStore.new(address)
37
+ redis = Redis.new(url: address)
38
+
39
+ store.write("white-rabbit", 0)
40
+
41
+ redis.exists('cache-namespace:white-rabbit').must_equal(true)
42
+ end
43
+
44
+ it "creates a normal store when given no addresses" do
45
+ underlying_store = instantiate_store
46
+ underlying_store.must_be_instance_of(::Redis::Store)
47
+ end
48
+
49
+ it "creates a normal store when given options only" do
50
+ underlying_store = instantiate_store(:expires_in => 1.second)
51
+ underlying_store.must_be_instance_of(::Redis::Store)
52
+ end
53
+
54
+ it "creates a normal store when given a single address" do
55
+ underlying_store = instantiate_store("redis://127.0.0.1:6380/1")
56
+ underlying_store.must_be_instance_of(::Redis::Store)
57
+ end
58
+
59
+ it "creates a normal store when given a single address and options" do
60
+ underlying_store = instantiate_store("redis://127.0.0.1:6380/1",
61
+ { :expires_in => 1.second})
62
+ underlying_store.must_be_instance_of(::Redis::Store)
63
+ end
64
+
65
+ it "creates a distributed store when given multiple addresses" do
66
+ underlying_store = instantiate_store("redis://127.0.0.1:6380/1",
67
+ "redis://127.0.0.1:6381/1")
68
+ underlying_store.must_be_instance_of(::Redis::DistributedStore)
69
+ end
70
+
71
+ it "creates a distributed store when given multiple address and options" do
72
+ underlying_store = instantiate_store("redis://127.0.0.1:6380/1",
73
+ "redis://127.0.0.1:6381/1",
74
+ :expires_in => 1.second)
75
+ underlying_store.must_be_instance_of(::Redis::DistributedStore)
76
+ end
77
+
17
78
  it "reads the data" do
18
79
  with_store_management do |store|
19
80
  store.read("rabbit").must_equal(@rabbit)
@@ -27,31 +88,28 @@ describe ActiveSupport::Cache::RedisStore do
27
88
  end
28
89
  end
29
90
 
30
- it "writes the data with expiration time" do
91
+ it "writes the data with specified namespace" do
31
92
  with_store_management do |store|
32
- store.write "rabbit", @white_rabbit, :expires_in => 1.second
33
- store.read("rabbit").must_equal(@white_rabbit)
34
- sleep 2
35
- store.read("rabbit").must_be_nil
93
+ store.write "rabbit", @white_rabbit, namespace:'namespaced'
94
+ store.read("namespaced:rabbit").must_equal(@white_rabbit)
36
95
  end
37
96
  end
38
97
 
39
- it "respects expiration time in seconds" do
98
+ it "writes the data with expiration time" do
40
99
  with_store_management do |store|
41
- store.write "rabbit", @white_rabbit
100
+ store.write "rabbit", @white_rabbit, :expires_in => 1.second
42
101
  store.read("rabbit").must_equal(@white_rabbit)
43
- store.expire "rabbit", 1.seconds
44
102
  sleep 2
45
103
  store.read("rabbit").must_be_nil
46
104
  end
47
105
  end
48
106
 
49
- it "respects expiration time in minutes" do
107
+ it "respects expiration time in seconds" do
50
108
  with_store_management do |store|
51
109
  store.write "rabbit", @white_rabbit
52
110
  store.read("rabbit").must_equal(@white_rabbit)
53
- store.expire "rabbit", 1.minutes
54
- sleep 61
111
+ store.expire "rabbit", 1.second
112
+ sleep 2
55
113
  store.read("rabbit").must_be_nil
56
114
  end
57
115
  end
@@ -95,6 +153,14 @@ describe ActiveSupport::Cache::RedisStore do
95
153
  end
96
154
  end
97
155
 
156
+ it "deletes namespaced data" do
157
+ with_store_management do |store|
158
+ store.write "rabbit", @white_rabbit, namespace:'namespaced'
159
+ store.delete "rabbit", namespace:'namespaced'
160
+ store.read("namespaced:rabbit").must_be_nil
161
+ end
162
+ end
163
+
98
164
  it "deletes matched data" do
99
165
  with_store_management do |store|
100
166
  store.delete_matched "rabb*"
@@ -158,7 +224,7 @@ describe ActiveSupport::Cache::RedisStore do
158
224
  it "clears the store" do
159
225
  with_store_management do |store|
160
226
  store.clear
161
- store.instance_variable_get(:@data).keys("*").flatten.must_be_empty
227
+ store.with { |client| client.keys("*") }.flatten.must_be_empty
162
228
  end
163
229
  end
164
230
 
@@ -174,14 +240,27 @@ describe ActiveSupport::Cache::RedisStore do
174
240
  store.fetch("rub-a-dub").must_be_nil
175
241
  store.fetch("rub-a-dub") { "Flora de Cana" }
176
242
  store.fetch("rub-a-dub").must_equal("Flora de Cana")
243
+ end
244
+ end
245
+
246
+ it "fetches data with expiration time" do
247
+ with_store_management do |store|
177
248
  store.fetch("rabbit", :force => true) # force cache miss
178
249
  store.fetch("rabbit", :force => true, :expires_in => 1.second) { @white_rabbit }
179
- # store.fetch("rabbit").must_equal(@white_rabbit)
250
+ store.fetch("rabbit").must_equal(@white_rabbit)
180
251
  sleep 2
181
252
  store.fetch("rabbit").must_be_nil
182
253
  end
183
254
  end
184
255
 
256
+ it "fetches namespaced data" do
257
+ with_store_management do |store|
258
+ store.delete("rabbit", namespace:'namespaced')
259
+ store.fetch("rabbit", namespace:'namespaced'){@rabbit}.must_equal(@rabbit)
260
+ store.read("rabbit", namespace:'namespaced').must_equal(@rabbit)
261
+ end
262
+ end
263
+
185
264
  it "reads multiple keys" do
186
265
  @store.write "irish whisky", "Jameson"
187
266
  result = @store.read_multi "rabbit", "irish whisky"
@@ -196,6 +275,40 @@ describe ActiveSupport::Cache::RedisStore do
196
275
  result.must_include('rabbit')
197
276
  end
198
277
 
278
+ it "reads multiple namespaced keys" do
279
+ @store.write "rub-a-dub", "Flora de Cana", namespace:'namespaced'
280
+ @store.write "irish whisky", "Jameson", namespace:'namespaced'
281
+ result = @store.read_multi "rub-a-dub", "irish whisky", namespace:'namespaced'
282
+ result['namespaced:rub-a-dub'].must_equal("Flora de Cana")
283
+ result['namespaced:irish whisky'].must_equal("Jameson")
284
+ end
285
+
286
+ describe "fetch_multi" do
287
+ it "reads existing keys and fills in anything missing" do
288
+ @store.write "bourbon", "makers"
289
+
290
+ result = @store.fetch_multi("bourbon", "rye") do |key|
291
+ "#{key}-was-missing"
292
+ end
293
+
294
+ result.must_equal({ "bourbon" => "makers", "rye" => "rye-was-missing" })
295
+ @store.read("rye").must_equal("rye-was-missing")
296
+ end
297
+ end
298
+
299
+ describe "fetch_multi namespaced keys" do
300
+ it "reads existing keys and fills in anything missing" do
301
+ @store.write "bourbon", "makers", namespace:'namespaced'
302
+
303
+ result = @store.fetch_multi("bourbon", "rye", namespace:'namespaced') do |key|
304
+ "#{key}-was-missing"
305
+ end
306
+
307
+ result.must_equal({ "namespaced:bourbon" => "makers", "namespaced:rye" => "rye-was-missing" })
308
+ @store.read("namespaced:rye").must_equal("rye-was-missing")
309
+ end
310
+ end
311
+
199
312
  describe "notifications" do
200
313
  it "notifies on #fetch" do
201
314
  with_notifications do
@@ -298,13 +411,15 @@ describe ActiveSupport::Cache::RedisStore do
298
411
  end
299
412
 
300
413
  private
301
- def instantiate_store(addresses = nil)
302
- ActiveSupport::Cache::RedisStore.new(addresses).instance_variable_get(:@data)
414
+ def instantiate_store(*addresses)
415
+ ActiveSupport::Cache::RedisStore.new(*addresses).instance_variable_get(:@data)
303
416
  end
304
417
 
305
418
  def with_store_management
306
419
  yield @store
307
420
  yield @dstore
421
+ yield @pool_store
422
+ yield @external_pool_store
308
423
  end
309
424
 
310
425
  def with_notifications
metadata CHANGED
@@ -1,107 +1,136 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-activesupport
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-20 00:00:00.000000000 Z
11
+ date: 2015-07-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis-store
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.1.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.1.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '4'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '4'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '10'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '10'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '1.3'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.3'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: mocha
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: 0.14.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.14.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: minitest
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: '4.2'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '4.2'
97
- description: Redis store for ActiveSupport::Cache
97
+ - !ruby/object:Gem::Dependency
98
+ name: connection_pool
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 1.2.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 1.2.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: redis-store-testing
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Redis store for ActiveSupport
98
126
  email:
99
127
  - me@lucaguidi.com
100
128
  executables: []
101
129
  extensions: []
102
130
  extra_rdoc_files: []
103
131
  files:
104
- - .gitignore
132
+ - ".gitignore"
133
+ - ".travis.yml"
105
134
  - Gemfile
106
135
  - MIT-LICENSE
107
136
  - README.md
@@ -114,7 +143,8 @@ files:
114
143
  - test/redis/activesupport/version_test.rb
115
144
  - test/test_helper.rb
116
145
  homepage: http://redis-store.org/redis-activesupport
117
- licenses: []
146
+ licenses:
147
+ - MIT
118
148
  metadata: {}
119
149
  post_install_message:
120
150
  rdoc_options: []
@@ -122,20 +152,20 @@ require_paths:
122
152
  - lib
123
153
  required_ruby_version: !ruby/object:Gem::Requirement
124
154
  requirements:
125
- - - '>='
155
+ - - ">="
126
156
  - !ruby/object:Gem::Version
127
157
  version: '0'
128
158
  required_rubygems_version: !ruby/object:Gem::Requirement
129
159
  requirements:
130
- - - '>='
160
+ - - ">="
131
161
  - !ruby/object:Gem::Version
132
162
  version: '0'
133
163
  requirements: []
134
164
  rubyforge_project: redis-activesupport
135
- rubygems_version: 2.0.3
165
+ rubygems_version: 2.4.8
136
166
  signing_key:
137
167
  specification_version: 4
138
- summary: Redis store for ActiveSupport::Cache
168
+ summary: Redis store for ActiveSupport
139
169
  test_files:
140
170
  - test/active_support/cache/redis_store_test.rb
141
171
  - test/redis/activesupport/version_test.rb