garner 0.5.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +31 -7
- data/.travis.yml +3 -1
- data/CHANGELOG.md +5 -0
- data/README.md +8 -2
- data/Rakefile +4 -4
- data/garner.gemspec +2 -2
- data/lib/garner/cache/context.rb +2 -2
- data/lib/garner/mixins/mongoid/document.rb +0 -1
- data/lib/garner/strategies/binding/key/binding_index.rb +1 -1
- data/lib/garner/version.rb +1 -1
- data/spec/garner/cache/context_spec.rb +0 -3
- data/spec/garner/cache/identity_spec.rb +0 -1
- data/spec/garner/cache_spec.rb +1 -1
- data/spec/garner/mixins/mongoid/identity_spec.rb +1 -0
- data/spec/garner/mixins/rack_spec.rb +0 -3
- data/spec/garner/strategies/binding/invalidation/binding_index_spec.rb +0 -2
- data/spec/garner/strategies/binding/invalidation/touch_spec.rb +0 -1
- data/spec/garner/strategies/binding/key/binding_index_spec.rb +27 -28
- data/spec/garner/strategies/binding/key/cache_key_spec.rb +0 -1
- data/spec/garner/strategies/binding/key/safe_cache_key_spec.rb +0 -1
- data/spec/garner/strategies/context/key/request_get_spec.rb +0 -1
- data/spec/integration/active_record_spec.rb +0 -1
- data/spec/integration/mongoid_spec.rb +0 -1
- data/spec/integration/sinatra_spec.rb +2 -2
- data/spec/performance/support/benchmark_context_wrapper.rb +2 -1
- data/spec/shared/conditional_get.rb +5 -5
- data/spec/support/mongoid.rb +6 -16
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84c7b960a4a1d14289fcfe1966869f130a100821
|
4
|
+
data.tar.gz: 54b2913e7ec83f309c7413253ad603b31812ecad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8efca6c55b739abb1adb3f90b4e8374b86b522f66a2d78112fd2c523dd010b1de2580fd6108007627944cd5bf03839e83d5bd2a6bb20b2facee71c0c23b05727
|
7
|
+
data.tar.gz: d0c2f0e0bc7799caf47485fbab287d0d1a818e9e0370b179e399b502cf3ab6301543a87a1d836c11e4a725f453b910a2c78dfcee26e0e32c8a8c32cced866ed2
|
data/.rubocop_todo.yml
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
# This configuration was generated by
|
2
|
-
#
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2015-10-19 17:38:30 -0400 using RuboCop version 0.34.2.
|
3
4
|
# The point is for the user to remove these configuration records
|
4
5
|
# one by one as the offenses are removed from the code base.
|
5
6
|
# Note that changes in the inspected code, or installation of new
|
@@ -13,7 +14,7 @@ Metrics/AbcSize:
|
|
13
14
|
Metrics/CyclomaticComplexity:
|
14
15
|
Max: 11
|
15
16
|
|
16
|
-
# Offense count:
|
17
|
+
# Offense count: 73
|
17
18
|
# Configuration parameters: AllowURI, URISchemes.
|
18
19
|
Metrics/LineLength:
|
19
20
|
Max: 140
|
@@ -27,23 +28,46 @@ Metrics/MethodLength:
|
|
27
28
|
Metrics/PerceivedComplexity:
|
28
29
|
Max: 12
|
29
30
|
|
30
|
-
# Offense count:
|
31
|
+
# Offense count: 24
|
32
|
+
# Configuration parameters: Exclude.
|
31
33
|
Style/Documentation:
|
32
34
|
Enabled: false
|
33
35
|
|
34
36
|
# Offense count: 3
|
35
37
|
Style/DoubleNegation:
|
36
|
-
|
38
|
+
Exclude:
|
39
|
+
- 'lib/garner/strategies/binding/invalidation/touch.rb'
|
40
|
+
- 'spec/garner/version_spec.rb'
|
41
|
+
- 'spec/support/cache.rb'
|
42
|
+
|
43
|
+
# Offense count: 2
|
44
|
+
# Cop supports --auto-correct.
|
45
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
46
|
+
Style/EmptyElse:
|
47
|
+
Exclude:
|
48
|
+
- 'lib/garner/cache.rb'
|
49
|
+
- 'lib/garner/strategies/binding/key/binding_index.rb'
|
37
50
|
|
38
51
|
# Offense count: 1
|
39
52
|
Style/ModuleFunction:
|
40
|
-
|
53
|
+
Exclude:
|
54
|
+
- 'lib/garner/config.rb'
|
41
55
|
|
42
56
|
# Offense count: 1
|
43
57
|
# Configuration parameters: SupportedStyles.
|
44
58
|
Style/RaiseArgs:
|
45
59
|
EnforcedStyle: compact
|
46
60
|
|
61
|
+
# Offense count: 2
|
62
|
+
# Cop supports --auto-correct.
|
63
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
|
64
|
+
Style/RegexpLiteral:
|
65
|
+
Exclude:
|
66
|
+
- 'garner.gemspec'
|
67
|
+
- 'spec/garner/strategies/binding/key/safe_cache_key_spec.rb'
|
68
|
+
|
47
69
|
# Offense count: 1
|
70
|
+
# Cop supports --auto-correct.
|
48
71
|
Style/RescueModifier:
|
49
|
-
|
72
|
+
Exclude:
|
73
|
+
- 'lib/garner/strategies/context/key/caller.rb'
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,12 @@
|
|
1
|
-
Garner
|
1
|
+
Garner
|
2
2
|
======
|
3
3
|
|
4
|
+
[![Gem Version](https://badge.fury.io/rb/garner.svg)](https://badge.fury.io/rb/garner)
|
5
|
+
[![Build Status](https://travis-ci.org/artsy/garner.svg?branch=master)](https://travis-ci.org/artsy/garner)
|
6
|
+
[![Dependency Status](https://gemnasium.com/artsy/garner.svg)](https://gemnasium.com/artsy/garner)
|
7
|
+
[![Code Climate](https://codeclimate.com/github/artsy/garner.svg)](https://codeclimate.com/github/artsy/garner)
|
8
|
+
[![Coverage Status](https://coveralls.io/repos/artsy/garner/badge.svg?branch=master&service=github)](https://coveralls.io/github/artsy/garner?branch=master)
|
9
|
+
|
4
10
|
Garner is a cache layer for Ruby and Rack applications, supporting model and instance binding and hierarchical invalidation. To "garner" means to gather data from various sources and to make it readily available in one place, kind of like a cache!
|
5
11
|
|
6
12
|
If you're not familiar with HTTP caching, ETags and If-Modified-Since, watch us introduce Garner in [From Zero to API Cache in 10 Minutes](http://www.confreaks.com/videos/986-goruco2012-from-zero-to-api-cache-w-grape-mongodb-in-10-minutes) at GoRuCo 2012.
|
@@ -51,7 +57,7 @@ ORM Integrations
|
|
51
57
|
|
52
58
|
### Mongoid
|
53
59
|
|
54
|
-
To use Mongoid documents and classes for Garner bindings, use `Garner::Mixins::Mongoid::Document`. You can set it up in an initializer:
|
60
|
+
To use Mongoid 3, 4 or 5 documents and classes for Garner bindings, use `Garner::Mixins::Mongoid::Document`. You can set it up in an initializer:
|
55
61
|
|
56
62
|
``` ruby
|
57
63
|
require "garner/mixins/mongoid"
|
data/Rakefile
CHANGED
@@ -27,10 +27,10 @@ YARD::Rake::YardocTask.new(:doc)
|
|
27
27
|
task :benchmark do
|
28
28
|
require 'performance/strategy_benchmark'
|
29
29
|
StrategyBenchmark.new(
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
n: ENV['N'].try(&:to_i),
|
31
|
+
d: ENV['D'].try(&:to_i),
|
32
|
+
r: ENV['R'].try(&:to_i)
|
33
|
+
).run!
|
34
34
|
end
|
35
35
|
|
36
36
|
require 'rubocop/rake_task'
|
data/garner.gemspec
CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.add_development_dependency 'sinatra'
|
30
30
|
s.add_development_dependency 'rack-test'
|
31
31
|
s.add_development_dependency 'mongoid', '>= 3.0.0'
|
32
|
-
s.add_development_dependency '
|
32
|
+
s.add_development_dependency 'mongoid-slug'
|
33
33
|
s.add_development_dependency 'activerecord'
|
34
34
|
if RUBY_PLATFORM =~ /java/
|
35
35
|
s.add_development_dependency 'jdbc-sqlite3'
|
@@ -40,5 +40,5 @@ Gem::Specification.new do |s|
|
|
40
40
|
s.add_development_dependency 'coveralls'
|
41
41
|
s.add_development_dependency 'yard'
|
42
42
|
s.add_development_dependency 'dalli'
|
43
|
-
s.add_development_dependency 'rubocop', '0.
|
43
|
+
s.add_development_dependency 'rubocop', '0.34.2'
|
44
44
|
end
|
data/lib/garner/cache/context.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Set up Garner configuration parameters
|
2
2
|
Garner.config.option(:context_key_strategies,
|
3
3
|
default: [Garner::Strategies::Context::Key::Caller]
|
4
|
-
)
|
4
|
+
)
|
5
5
|
Garner.config.option(:rack_context_key_strategies,
|
6
6
|
default: [
|
7
7
|
Garner::Strategies::Context::Key::Caller,
|
@@ -9,7 +9,7 @@ Garner.config.option(:rack_context_key_strategies,
|
|
9
9
|
Garner::Strategies::Context::Key::RequestPost,
|
10
10
|
Garner::Strategies::Context::Key::RequestPath
|
11
11
|
]
|
12
|
-
)
|
12
|
+
)
|
13
13
|
|
14
14
|
module Garner
|
15
15
|
module Cache
|
data/lib/garner/version.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Garner::Cache::Context do
|
4
|
-
|
5
4
|
describe 'garner' do
|
6
|
-
|
7
5
|
before(:each) do
|
8
6
|
class TestContext
|
9
7
|
include Garner::Cache::Context
|
@@ -33,6 +31,5 @@ describe Garner::Cache::Context do
|
|
33
31
|
end
|
34
32
|
expect(subject.call.key_hash[:caller]).to be_nil
|
35
33
|
end
|
36
|
-
|
37
34
|
end
|
38
35
|
end
|
data/spec/garner/cache_spec.rb
CHANGED
@@ -48,7 +48,7 @@ describe Garner::Cache do
|
|
48
48
|
|
49
49
|
it 'deletes record when cached block yields nil' do
|
50
50
|
binding = double('object', garner_cache_key: 'key')
|
51
|
-
expect(Garner.config.cache).to receive(:delete).with({ binding_keys: ['key'], context_keys: { key: 'value' } },
|
51
|
+
expect(Garner.config.cache).to receive(:delete).with({ binding_keys: ['key'], context_keys: { key: 'value' } }, namespace: 'foo')
|
52
52
|
subject.fetch [binding], { key: 'value' }, namespace: 'foo' do
|
53
53
|
nil
|
54
54
|
end
|
@@ -2,9 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'garner/mixins/rack'
|
3
3
|
|
4
4
|
describe Garner::Mixins::Rack do
|
5
|
-
|
6
5
|
describe 'garner' do
|
7
|
-
|
8
6
|
before(:each) do
|
9
7
|
class MockApp
|
10
8
|
include Garner::Mixins::Rack
|
@@ -43,6 +41,5 @@ describe Garner::Mixins::Rack do
|
|
43
41
|
expect(subject.call.key_hash[:caller]).to be_nil
|
44
42
|
expect(subject.call.key_hash[:request_params]).to eq('foo' => 'bar')
|
45
43
|
end
|
46
|
-
|
47
44
|
end
|
48
45
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Garner::Strategies::Binding::Invalidation::BindingIndex do
|
4
|
-
|
5
4
|
before(:each) do
|
6
5
|
@mock = double('model')
|
7
6
|
allow(@mock).to receive(:touch)
|
@@ -10,5 +9,4 @@ describe Garner::Strategies::Binding::Invalidation::BindingIndex do
|
|
10
9
|
subject { Garner::Strategies::Binding::Invalidation::BindingIndex }
|
11
10
|
|
12
11
|
it_behaves_like 'Garner::Strategies::Binding::Invalidation strategy'
|
13
|
-
|
14
12
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Garner::Strategies::Binding::Key::BindingIndex do
|
4
|
-
|
5
4
|
before(:each) do
|
6
5
|
@new_mock = double('new_mock')
|
7
6
|
|
@@ -68,9 +67,9 @@ describe Garner::Strategies::Binding::Key::BindingIndex do
|
|
68
67
|
it 'stores the cache key to cache' do
|
69
68
|
subject.fetch_cache_key_for(@persisted_mock)
|
70
69
|
expect(Garner.config.cache.read(
|
71
|
-
|
72
|
-
|
73
|
-
|
70
|
+
strategy: subject,
|
71
|
+
proxied_binding: 'Mocker/id=4'
|
72
|
+
)).to eq @mock_key
|
74
73
|
end
|
75
74
|
end
|
76
75
|
|
@@ -82,17 +81,17 @@ describe Garner::Strategies::Binding::Key::BindingIndex do
|
|
82
81
|
it 'stores the canonical binding to cache' do
|
83
82
|
subject.fetch_cache_key_for(@persisted_mock_alias)
|
84
83
|
expect(Garner.config.cache.read(
|
85
|
-
|
86
|
-
|
87
|
-
|
84
|
+
strategy: subject,
|
85
|
+
proxied_binding: 'MockerAlias/id=alias-4'
|
86
|
+
)).to eq @persisted_mock
|
88
87
|
end
|
89
88
|
|
90
89
|
it 'stores the cache key to cache' do
|
91
90
|
subject.fetch_cache_key_for(@persisted_mock_alias)
|
92
91
|
expect(Garner.config.cache.read(
|
93
|
-
|
94
|
-
|
95
|
-
|
92
|
+
strategy: subject,
|
93
|
+
proxied_binding: 'Mocker/id=4'
|
94
|
+
)).to eq @mock_key
|
96
95
|
end
|
97
96
|
|
98
97
|
context 'whose canonical binding is nil' do
|
@@ -107,9 +106,9 @@ describe Garner::Strategies::Binding::Key::BindingIndex do
|
|
107
106
|
it 'does not store the cache key to cache' do
|
108
107
|
subject.fetch_cache_key_for(@persisted_mock_alias)
|
109
108
|
expect(Garner.config.cache.read(
|
110
|
-
|
111
|
-
|
112
|
-
|
109
|
+
strategy: subject,
|
110
|
+
proxied_binding: ''
|
111
|
+
)).to be_nil
|
113
112
|
end
|
114
113
|
end
|
115
114
|
end
|
@@ -154,9 +153,9 @@ describe Garner::Strategies::Binding::Key::BindingIndex do
|
|
154
153
|
it 'stores the canonical binding to cache' do
|
155
154
|
subject.fetch_canonical_binding_for(@persisted_mock_alias)
|
156
155
|
expect(Garner.config.cache.read(
|
157
|
-
|
158
|
-
|
159
|
-
|
156
|
+
strategy: subject,
|
157
|
+
proxied_binding: 'MockerAlias/id=alias-4'
|
158
|
+
)).to eq @persisted_mock
|
160
159
|
end
|
161
160
|
end
|
162
161
|
|
@@ -221,24 +220,24 @@ describe Garner::Strategies::Binding::Key::BindingIndex do
|
|
221
220
|
expect(key1).to eq key2
|
222
221
|
|
223
222
|
expect(Garner.config.cache.read(
|
224
|
-
|
225
|
-
|
226
|
-
|
223
|
+
strategy: subject,
|
224
|
+
proxied_binding: "Garner::Mixins::Mongoid::Identity/klass=Food,handle=#{@cheese.id}"
|
225
|
+
)).to eq @cheese
|
227
226
|
|
228
227
|
expect(Garner.config.cache.read(
|
229
|
-
|
230
|
-
|
231
|
-
|
228
|
+
strategy: subject,
|
229
|
+
proxied_binding: 'Garner::Mixins::Mongoid::Identity/klass=Cheese,handle=m1'
|
230
|
+
)).to eq @cheese
|
232
231
|
|
233
232
|
expect(Garner.config.cache.read(
|
234
|
-
|
235
|
-
|
236
|
-
|
233
|
+
strategy: subject,
|
234
|
+
proxied_binding: "Cheese/id=#{@cheese.id}"
|
235
|
+
)).to eq key1
|
237
236
|
|
238
237
|
expect(Garner.config.cache.read(
|
239
|
-
|
240
|
-
|
241
|
-
|
238
|
+
strategy: subject,
|
239
|
+
proxied_binding: "Food/id=#{@cheese.id}"
|
240
|
+
)).to be_nil
|
242
241
|
end
|
243
242
|
end
|
244
243
|
end
|
@@ -3,7 +3,6 @@ require 'spec_helper'
|
|
3
3
|
describe Garner::Strategies::Context::Key::RequestGet do
|
4
4
|
%w(GET HEAD).each do |method|
|
5
5
|
context method do
|
6
|
-
|
7
6
|
before(:each) do
|
8
7
|
@cache_identity = Garner::Cache::Identity.new
|
9
8
|
@request = Rack::Request.new('REQUEST_METHOD' => method, 'QUERY_STRING' => 'foo=bar')
|
@@ -1,9 +1,10 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
require 'garner/mixins/rack'
|
3
5
|
require 'sinatra'
|
4
6
|
|
5
7
|
describe 'Sinatra integration', type: :request do
|
6
|
-
|
7
8
|
let(:app) do
|
8
9
|
class TestSinatraApp < Sinatra::Base
|
9
10
|
helpers Garner::Mixins::Rack
|
@@ -25,5 +26,4 @@ describe 'Sinatra integration', type: :request do
|
|
25
26
|
end
|
26
27
|
|
27
28
|
it_behaves_like 'Rack::ConditionalGet server'
|
28
|
-
|
29
29
|
end
|
@@ -53,7 +53,8 @@ class BenchmarkContextWrapper
|
|
53
53
|
private
|
54
54
|
|
55
55
|
def warm_caches
|
56
|
-
klass
|
56
|
+
klass = binding.class
|
57
|
+
handle = binding.slug
|
57
58
|
json = binding.reload.to_json
|
58
59
|
garner.bind(klass.identify(handle)).key(caller: nil) { json }
|
59
60
|
garner.bind(klass).key(caller: nil) { json }
|
@@ -14,28 +14,28 @@ shared_examples_for 'Rack::ConditionalGet server' do
|
|
14
14
|
|
15
15
|
it "writes the cached object's ETag from binding" do
|
16
16
|
get '/'
|
17
|
-
expect(last_response.headers['ETag'].length).to eq 32 + 2
|
17
|
+
expect(last_response.headers['ETag'].length).to eq 32 + 2 + 2
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'sends a 304 response if content has not changed (If-None-Match)' do
|
21
21
|
get '/'
|
22
22
|
expect(last_response.status).to eq 200
|
23
|
-
expect(last_response.headers['ETag']).to eq
|
24
|
-
get '/', {},
|
23
|
+
expect(last_response.headers['ETag']).to eq "W/\"#{etag_for(last_response.body)}\""
|
24
|
+
get '/', {}, 'HTTP_IF_NONE_MATCH' => last_response.headers['ETag']
|
25
25
|
expect(last_response.status).to eq 304
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'sends a 200 response if content has changed (If-None-Match)' do
|
29
29
|
get '/'
|
30
30
|
expect(last_response.status).to eq 200
|
31
|
-
get '/', {},
|
31
|
+
get '/', {}, 'HTTP_IF_NONE_MATCH' => %("#{etag_for('foobar')}")
|
32
32
|
expect(last_response.status).to eq 200
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'sends a 200 response if content has changed (valid If-Modified-Since but invalid If-None-Match)' do
|
36
36
|
get '/'
|
37
37
|
expect(last_response.status).to eq 200
|
38
|
-
get '/', {},
|
38
|
+
get '/', {}, 'HTTP_IF_MODIFIED_SINCE' => (Time.now + 1).httpdate, 'HTTP_IF_NONE_MATCH' => etag_for(last_response.body)
|
39
39
|
expect(last_response.status).to eq 200
|
40
40
|
end
|
41
41
|
|
data/spec/support/mongoid.rb
CHANGED
@@ -1,24 +1,14 @@
|
|
1
1
|
require 'garner/mixins/mongoid'
|
2
2
|
require 'mongoid_slug'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
default: {
|
8
|
-
uri: ENV['GARNER_MONGO_URL'] || 'mongodb://localhost/garner_test',
|
9
|
-
safe: true
|
10
|
-
}
|
11
|
-
},
|
12
|
-
options: {
|
13
|
-
raise_not_found_error: false
|
14
|
-
}
|
15
|
-
)
|
16
|
-
|
17
|
-
if ENV['GARNER_MONGOID_LOG']
|
18
|
-
Mongoid.logger = Logger.new(ENV['GARNER_MONGOID_LOG'])
|
19
|
-
Moped.logger = Mongoid.logger
|
4
|
+
Mongoid.configure do |config|
|
5
|
+
config.connect_to 'garner_test'
|
6
|
+
config.raise_not_found_error = false
|
20
7
|
end
|
21
8
|
|
9
|
+
Mongoid.logger.level = Logger::INFO
|
10
|
+
Mongo::Logger.logger.level = Logger::INFO if Mongoid::Compatibility::Version.mongoid5?
|
11
|
+
|
22
12
|
# Include mixin
|
23
13
|
module Mongoid
|
24
14
|
module Document
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: garner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Doubrovkine
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-10-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
@@ -166,7 +166,7 @@ dependencies:
|
|
166
166
|
- !ruby/object:Gem::Version
|
167
167
|
version: 3.0.0
|
168
168
|
- !ruby/object:Gem::Dependency
|
169
|
-
name:
|
169
|
+
name: mongoid-slug
|
170
170
|
requirement: !ruby/object:Gem::Requirement
|
171
171
|
requirements:
|
172
172
|
- - '>='
|
@@ -255,14 +255,14 @@ dependencies:
|
|
255
255
|
requirements:
|
256
256
|
- - '='
|
257
257
|
- !ruby/object:Gem::Version
|
258
|
-
version: 0.
|
258
|
+
version: 0.34.2
|
259
259
|
type: :development
|
260
260
|
prerelease: false
|
261
261
|
version_requirements: !ruby/object:Gem::Requirement
|
262
262
|
requirements:
|
263
263
|
- - '='
|
264
264
|
- !ruby/object:Gem::Version
|
265
|
-
version: 0.
|
265
|
+
version: 0.34.2
|
266
266
|
description:
|
267
267
|
email:
|
268
268
|
- dblock@dblock.org
|
@@ -371,7 +371,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
371
371
|
version: '0'
|
372
372
|
requirements: []
|
373
373
|
rubyforge_project:
|
374
|
-
rubygems_version: 2.
|
374
|
+
rubygems_version: 2.4.5
|
375
375
|
signing_key:
|
376
376
|
specification_version: 4
|
377
377
|
summary: Garner is a cache layer for Ruby and Rack applications, supporting model
|