redis-rack-cache 2.0.2 → 2.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 +4 -4
- data/.travis.yml +1 -2
- data/CODEOWNERS +1 -0
- data/Gemfile +0 -2
- data/README.md +34 -1
- data/lib/rack/cache/redis_base.rb +33 -0
- data/lib/rack/cache/redis_entitystore.rb +8 -24
- data/lib/rack/cache/redis_metastore.rb +5 -21
- data/lib/redis-rack-cache/version.rb +1 -1
- data/redis-rack-cache.gemspec +2 -2
- data/stdout +0 -0
- data/test/rack/cache/entitystore/redis_test.rb +15 -0
- data/test/rack/cache/metastore/redis_test.rb +20 -0
- metadata +12 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b5230f97382eccbaacff83196ec80685cd91787
|
4
|
+
data.tar.gz: cdf39ba1459ec99a691e40343e924179cbe8e69c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6f40646f5eecf1276afe30345d1e15f62cdc4cc04f924e1cddae8a689a965ac0146d5884795768e7bc3cf49cc146e0e1c479a2621b1aaf99babad2558eb4db3
|
7
|
+
data.tar.gz: 289a3c824840723a7e16c271a0c8451af2fadde18f8637089982ea93fc4be266f179eddbdb1877319c8a9fbcf31e4d8a973b802976f8f94bfa04b270ebccaec7
|
data/.travis.yml
CHANGED
data/CODEOWNERS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
* @tubbo
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -5,6 +5,12 @@
|
|
5
5
|
|
6
6
|
__`redis-rack-cache`__ provides a Redis backed store for __Rack::Cache__, an HTTP cache. See the main [redis-store readme](https://github.com/redis-store/redis-store) for general guidelines.
|
7
7
|
|
8
|
+
**NOTE:** This gem is necessary in addition to
|
9
|
+
[redis-rails](https://github.com/redis-store/redis-rails) if you use
|
10
|
+
Redis to store the Rails cache. `redis-rails` does not pull in this gem
|
11
|
+
by default since not all applications use `Rack::Cache` as their HTTP
|
12
|
+
cache.
|
13
|
+
|
8
14
|
## Installation
|
9
15
|
|
10
16
|
```ruby
|
@@ -14,7 +20,34 @@ gem 'redis-rack-cache'
|
|
14
20
|
|
15
21
|
## Usage
|
16
22
|
|
17
|
-
|
23
|
+
In a Rails app, you can configure your `Rack::Cache` stores like this:
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
# config/environments/production.rb
|
27
|
+
Rails.application.configure do
|
28
|
+
config.action_dispatch.rack_cache = {
|
29
|
+
metastore: "#{Rails.credentials.redis_url}/1/rack_cache_metastore",
|
30
|
+
entitystore: "#{Rails.credentials.redis_url}/1/rack_cache_entitystore"
|
31
|
+
# NOTE: `:meta_store` and `:entity_store` are also supported.
|
32
|
+
}
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
For more complicated setups, like when using custom options, the
|
37
|
+
following syntax can also be used:
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
# config/environments/production.rb
|
41
|
+
Rails.application.configure do
|
42
|
+
config.action_dispatch.rack_cache = {
|
43
|
+
meta_store: ::Rack::Cache::MetaStore::Redis.new("#{Rails.credentials.redis_url}/1/rack_cache_metastore", default_ttl: 10.days.to_i),
|
44
|
+
entity_store: ::Rack::Cache::EntityStore::Redis.new("#{Rails.credentials.redis_url}/1/rack_cache_entitystore", default_ttl: 120.days.to_i)
|
45
|
+
# NOTE: `:metastore` and `:entitystore` are also supported.
|
46
|
+
}
|
47
|
+
end
|
48
|
+
```
|
49
|
+
|
50
|
+
For standalone usage (in non-Rails apps):
|
18
51
|
|
19
52
|
```ruby
|
20
53
|
# config.ru
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'rack/utils'
|
2
|
+
|
3
|
+
module Rack
|
4
|
+
module Cache
|
5
|
+
module RedisBase
|
6
|
+
def self.included(base)
|
7
|
+
base.extend ClassMethods
|
8
|
+
base.instance_eval do
|
9
|
+
extend Rack::Utils
|
10
|
+
|
11
|
+
attr_reader :cache, :options, :default_ttl
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
def resolve(uri)
|
17
|
+
new ::Redis::Store::Factory.resolve(uri.to_s)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(server, options = {})
|
22
|
+
@cache = ::Redis::Store::Factory.create(server)
|
23
|
+
@options = options
|
24
|
+
@default_ttl = options[:default_ttl] || ::Redis::Rack::Cache::DEFAULT_TTL
|
25
|
+
end
|
26
|
+
|
27
|
+
def open(key)
|
28
|
+
data = read(key)
|
29
|
+
data && [data]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,29 +1,12 @@
|
|
1
1
|
require 'rack/cache/entity_store'
|
2
2
|
require 'redis-rack-cache/constants'
|
3
|
+
require 'rack/cache/redis_base'
|
3
4
|
|
4
5
|
module Rack
|
5
6
|
module Cache
|
6
7
|
class EntityStore
|
7
|
-
class
|
8
|
-
|
9
|
-
attr_reader :cache
|
10
|
-
|
11
|
-
extend Rack::Utils
|
12
|
-
|
13
|
-
def open(key)
|
14
|
-
data = read(key)
|
15
|
-
data && [data]
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.resolve(uri)
|
19
|
-
new ::Redis::Store::Factory.resolve(uri.to_s)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
class Redis < RedisBase
|
24
|
-
def initialize(server, options = {})
|
25
|
-
@cache = ::Redis::Store::Factory.create(server)
|
26
|
-
end
|
8
|
+
class Redis < self
|
9
|
+
include RedisBase
|
27
10
|
|
28
11
|
def exist?(key)
|
29
12
|
cache.exists key
|
@@ -35,10 +18,11 @@ module Rack
|
|
35
18
|
|
36
19
|
def write(body, ttl=0)
|
37
20
|
buf = StringIO.new
|
38
|
-
key, size = slurp(body){|part| buf.write(part) }
|
21
|
+
key, size = slurp(body) {|part| buf.write(part) }
|
22
|
+
ttl = ttl.to_i.zero? ? default_ttl : ttl
|
39
23
|
|
40
|
-
|
41
|
-
[key, size]
|
24
|
+
return unless cache.setex(key, ttl, buf.string)
|
25
|
+
[key, size]
|
42
26
|
end
|
43
27
|
|
44
28
|
def purge(key)
|
@@ -47,7 +31,7 @@ module Rack
|
|
47
31
|
end
|
48
32
|
end
|
49
33
|
|
50
|
-
REDIS = Redis
|
34
|
+
REDIS = REDISS = Redis
|
51
35
|
end
|
52
36
|
end
|
53
37
|
end
|
@@ -1,37 +1,21 @@
|
|
1
1
|
require 'digest/sha1'
|
2
|
-
require 'rack/utils'
|
3
2
|
require 'rack/cache/key'
|
4
3
|
require 'rack/cache/meta_store'
|
5
4
|
require 'redis-rack-cache/constants'
|
5
|
+
require 'rack/cache/redis_base'
|
6
6
|
|
7
7
|
module Rack
|
8
8
|
module Cache
|
9
9
|
class MetaStore
|
10
|
-
class
|
11
|
-
|
12
|
-
|
13
|
-
# The Redis::Store object used to communicate with the Redis daemon.
|
14
|
-
attr_reader :cache
|
15
|
-
|
16
|
-
def self.resolve(uri)
|
17
|
-
new ::Redis::Store::Factory.resolve(uri.to_s)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class Redis < RedisBase
|
22
|
-
# The Redis instance used to communicated with the Redis daemon.
|
23
|
-
attr_reader :cache
|
24
|
-
|
25
|
-
def initialize(server, options = {})
|
26
|
-
@cache = ::Redis::Store::Factory.create(server)
|
27
|
-
end
|
10
|
+
class Redis < self
|
11
|
+
include RedisBase
|
28
12
|
|
29
13
|
def read(key)
|
30
14
|
cache.get(hexdigest(key)) || []
|
31
15
|
end
|
32
16
|
|
33
17
|
def write(key, entries, ttl=0)
|
34
|
-
ttl =
|
18
|
+
ttl = ttl.to_i.zero? ? default_ttl : ttl
|
35
19
|
cache.setex(hexdigest(key), ttl, entries)
|
36
20
|
end
|
37
21
|
|
@@ -41,7 +25,7 @@ module Rack
|
|
41
25
|
end
|
42
26
|
end
|
43
27
|
|
44
|
-
REDIS = Redis
|
28
|
+
REDIS = REDISS = Redis
|
45
29
|
end
|
46
30
|
end
|
47
31
|
end
|
data/redis-rack-cache.gemspec
CHANGED
@@ -19,11 +19,11 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
20
|
s.require_paths = ['lib']
|
21
21
|
|
22
|
-
s.add_dependency 'redis-store', '>= 1.
|
22
|
+
s.add_dependency 'redis-store', '>= 1.6', '< 2'
|
23
23
|
s.add_dependency 'rack-cache', '>= 1.6', '< 2'
|
24
24
|
|
25
25
|
s.add_development_dependency 'rake', '~> 10'
|
26
|
-
s.add_development_dependency 'bundler'
|
26
|
+
s.add_development_dependency 'bundler'
|
27
27
|
s.add_development_dependency 'mocha', '~> 0.14.0'
|
28
28
|
s.add_development_dependency 'minitest', '~> 5'
|
29
29
|
s.add_development_dependency 'redis-store-testing'
|
data/stdout
ADDED
File without changes
|
@@ -11,6 +11,17 @@ describe Rack::Cache::EntityStore::Redis do
|
|
11
11
|
@store = ::Rack::Cache::EntityStore::Redis.new :host => 'localhost'
|
12
12
|
end
|
13
13
|
|
14
|
+
it 'respects the default_tll options' do
|
15
|
+
@store = ::Rack::Cache::EntityStore::Redis.new({ :host => 'localhost' }, { :default_ttl => 120 })
|
16
|
+
@store.default_ttl.must_equal(120)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'properly delegates the TTL to redis' do
|
20
|
+
@store = ::Rack::Cache::EntityStore::Redis.new({ :host => 'localhost' }, { :default_ttl => 120 })
|
21
|
+
key, size = @store.write(['She rode to the devil,'])
|
22
|
+
assert @store.cache.ttl(key) <= 120
|
23
|
+
end
|
24
|
+
|
14
25
|
it 'has the class referenced by homonym constant' do
|
15
26
|
::Rack::Cache::EntityStore::REDIS.must_equal(::Rack::Cache::EntityStore::Redis)
|
16
27
|
end
|
@@ -20,6 +31,10 @@ describe Rack::Cache::EntityStore::Redis do
|
|
20
31
|
cache.must_be_kind_of(::Redis)
|
21
32
|
cache.id.must_equal("redis://127.0.0.1:6379/0")
|
22
33
|
|
34
|
+
cache = ::Rack::Cache::EntityStore::Redis.resolve(uri("rediss://127.0.0.1")).cache
|
35
|
+
cache.must_be_kind_of(::Redis)
|
36
|
+
cache.instance_variable_get(:@client).scheme.must_equal('rediss')
|
37
|
+
|
23
38
|
cache = ::Rack::Cache::EntityStore::Redis.resolve(uri("redis://127.0.0.1:6380")).cache
|
24
39
|
cache.id.must_equal("redis://127.0.0.1:6380/0")
|
25
40
|
|
@@ -13,6 +13,26 @@ describe Rack::Cache::MetaStore::Redis do
|
|
13
13
|
@entity_store.cache.flushall
|
14
14
|
end
|
15
15
|
|
16
|
+
it "respects the default_tll options" do
|
17
|
+
@store = ::Rack::Cache::MetaStore::Redis.new({ :host => "localhost" }, { :default_ttl => 120 })
|
18
|
+
@store.default_ttl.must_equal(120)
|
19
|
+
|
20
|
+
@entity_store = ::Rack::Cache::EntityStore::Redis.new({ :host => "localhost" }, { :default_ttl => 120 })
|
21
|
+
@entity_store.default_ttl.must_equal(120)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "properly delegates the TTL to redis" do
|
25
|
+
key = '/test/'
|
26
|
+
@store = ::Rack::Cache::MetaStore::Redis.new({ :host => "localhost" }, { :default_ttl => 120 })
|
27
|
+
|
28
|
+
@store.write(key, [[{},{}]])
|
29
|
+
assert @store.cache.ttl(key) <= 120
|
30
|
+
|
31
|
+
@entity_store = ::Rack::Cache::EntityStore::Redis.new({ :host => "localhost" }, { :default_ttl => 120 })
|
32
|
+
key, size = @entity_store.write(['She rode to the devil,'])
|
33
|
+
assert @entity_store.cache.ttl(key) <= 120
|
34
|
+
end
|
35
|
+
|
16
36
|
it "has the class referenced by homonym constant" do
|
17
37
|
::Rack::Cache::MetaStore::REDIS.must_equal(::Rack::Cache::MetaStore::Redis)
|
18
38
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-rack-cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.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:
|
11
|
+
date: 2019-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis-store
|
@@ -16,7 +16,7 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.6'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '2'
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '1.
|
29
|
+
version: '1.6'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '2'
|
@@ -68,16 +68,16 @@ dependencies:
|
|
68
68
|
name: bundler
|
69
69
|
requirement: !ruby/object:Gem::Requirement
|
70
70
|
requirements:
|
71
|
-
- - "
|
71
|
+
- - ">="
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
version: '
|
73
|
+
version: '0'
|
74
74
|
type: :development
|
75
75
|
prerelease: false
|
76
76
|
version_requirements: !ruby/object:Gem::Requirement
|
77
77
|
requirements:
|
78
|
-
- - "
|
78
|
+
- - ">="
|
79
79
|
- !ruby/object:Gem::Version
|
80
|
-
version: '
|
80
|
+
version: '0'
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: mocha
|
83
83
|
requirement: !ruby/object:Gem::Requirement
|
@@ -145,6 +145,7 @@ files:
|
|
145
145
|
- ".gitignore"
|
146
146
|
- ".travis.yml"
|
147
147
|
- Appraisals
|
148
|
+
- CODEOWNERS
|
148
149
|
- Gemfile
|
149
150
|
- MIT-LICENSE
|
150
151
|
- README.md
|
@@ -152,12 +153,14 @@ files:
|
|
152
153
|
- bin/appraisal
|
153
154
|
- gemfiles/rack_cache_1.6.gemfile
|
154
155
|
- gemfiles/rack_cache_1.7.gemfile
|
156
|
+
- lib/rack/cache/redis_base.rb
|
155
157
|
- lib/rack/cache/redis_entitystore.rb
|
156
158
|
- lib/rack/cache/redis_metastore.rb
|
157
159
|
- lib/redis-rack-cache.rb
|
158
160
|
- lib/redis-rack-cache/constants.rb
|
159
161
|
- lib/redis-rack-cache/version.rb
|
160
162
|
- redis-rack-cache.gemspec
|
163
|
+
- stdout
|
161
164
|
- test/rack/cache/entitystore/pony.jpg
|
162
165
|
- test/rack/cache/entitystore/redis_test.rb
|
163
166
|
- test/rack/cache/metastore/redis_test.rb
|
@@ -183,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
186
|
version: '0'
|
184
187
|
requirements: []
|
185
188
|
rubyforge_project: redis-rack-cache
|
186
|
-
rubygems_version: 2.6.14
|
189
|
+
rubygems_version: 2.6.14.1
|
187
190
|
signing_key:
|
188
191
|
specification_version: 4
|
189
192
|
summary: A Redis backend store for Rack::Cache
|