garage_client 2.1.1 → 2.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +15 -0
- data/README.md +1 -1
- data/lib/garage_client/cachers/base.rb +11 -4
- data/lib/garage_client/client.rb +1 -1
- data/lib/garage_client/version.rb +1 -1
- data/spec/fixtures/faraday_0.8.9_response.dump +54 -0
- data/spec/fixtures/faraday_0.9.1_response.dump +54 -0
- data/spec/garage_client/cacher_spec.rb +59 -21
- data/spec/garage_client/client_spec.rb +20 -2
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 394abb9093e09a4a7d79452fc44c20792d66485b
|
4
|
+
data.tar.gz: 6bb87e45add606d55241e3bc90c56cb0ad176800
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7419abf0acb63420fb45c5ac28c10f3161846159889f85568801845c3cfe56002851525f21f3df3d0d1a09355dd8aa2ac9a343f1478f4159be6a82ee7d428595
|
7
|
+
data.tar.gz: da747820a31de77ee57195c2bb119e04fe30506a4f906ea05f4858b3c410bd4b08e8b832d174efc439d01139ffa223c8f9321ced332c9b1dd957f9e8e0003b33
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# GarageClient
|
1
|
+
# GarageClient [![Build Status](https://travis-ci.org/cookpad/garage_client.svg?branch=master)](https://travis-ci.org/cookpad/garage_client)
|
2
2
|
GarageClient is a simple Ruby library to provide a primitive client interface to the Garage application API.
|
3
3
|
|
4
4
|
## Install
|
@@ -7,20 +7,27 @@ module GarageClient
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def call
|
10
|
-
response =
|
11
|
-
|
10
|
+
response = store.read(key, options) if read_from_cache?
|
11
|
+
if response
|
12
|
+
# Faraday::Response#marshal_dump is drop request object and url
|
13
|
+
# https://github.com/lostisland/faraday/blob/edacd5eb57ea13accab3097649690ae5f48f421a/lib/faraday/response.rb#L74
|
14
|
+
response.env.merge!(@env) {|_, self_val, other_val| self_val || other_val }
|
15
|
+
else
|
16
|
+
response = yield
|
17
|
+
store.write(key, response, options) if written_to_cache?
|
18
|
+
end
|
12
19
|
response
|
13
20
|
end
|
14
21
|
|
15
22
|
private
|
16
23
|
|
17
24
|
# Return boolean to tell if we need to cache the response or not.
|
18
|
-
def
|
25
|
+
def read_from_cache?
|
19
26
|
raise NotImplementedError, "You must implement #{self.class}##{__method__}"
|
20
27
|
end
|
21
28
|
|
22
29
|
# Return boolean to tell if we can try to check cache or not.
|
23
|
-
def
|
30
|
+
def written_to_cache?
|
24
31
|
raise NotImplementedError, "You must implement #{self.class}##{__method__}"
|
25
32
|
end
|
26
33
|
|
data/lib/garage_client/client.rb
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
U:Faraday::Response{:statusi�: bodyI"�{
|
2
|
+
"id": 1,
|
3
|
+
"created": "2000-01-01T00:00:00+09:00",
|
4
|
+
"updated": "2000-01-01T00:00:00+09:00",
|
5
|
+
"name": "recipe title",
|
6
|
+
"url": "http://example.com/examples/1",
|
7
|
+
"user": {
|
8
|
+
"id": 2294,
|
9
|
+
"url": "http://example.com/kitchen/2294",
|
10
|
+
"name": "Fern1",
|
11
|
+
"_links": {
|
12
|
+
"self": {
|
13
|
+
"href": "/v1/users/2294"
|
14
|
+
},
|
15
|
+
"bookmarks": {
|
16
|
+
"href": "/v1/users/2294/bookmarks"
|
17
|
+
},
|
18
|
+
"bookmark_tags": {
|
19
|
+
"href": "/v1/users/2294/bookmark_tags"
|
20
|
+
},
|
21
|
+
"canonical": {
|
22
|
+
"href": "/v1/users/2294"
|
23
|
+
},
|
24
|
+
"diary_entries": {
|
25
|
+
"href": "/v1/users/2294/diary_entries"
|
26
|
+
},
|
27
|
+
"feedbacks": {
|
28
|
+
"href": "/v1/users/2294/feedbacks"
|
29
|
+
},
|
30
|
+
"recipes": {
|
31
|
+
"href": "/v1/users/2294/recipes"
|
32
|
+
}
|
33
|
+
}
|
34
|
+
},
|
35
|
+
"description": "this is my favorite recipe.",
|
36
|
+
"serving": null,
|
37
|
+
"published": "2000-01-01T00:00:00+09:00",
|
38
|
+
"edited": null,
|
39
|
+
"tier": "example.com:User",
|
40
|
+
"ingredients": [],
|
41
|
+
"steps": [],
|
42
|
+
"_links": {
|
43
|
+
"self": {
|
44
|
+
"href": "/examples/1"
|
45
|
+
},
|
46
|
+
"canonical": {
|
47
|
+
"href": "/examples/1"
|
48
|
+
},
|
49
|
+
"nested_examples": {
|
50
|
+
"href": "/examples/1/nested_examples"
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
:ET:response_headersIC:Faraday::Utils::Headers{I"content-type;TI"$application/json; charset=utf-8;T:@names{I"content-type;T@
|
@@ -0,0 +1,54 @@
|
|
1
|
+
U:Faraday::Response{:statusi�: bodyI"�{
|
2
|
+
"id": 1,
|
3
|
+
"created": "2000-01-01T00:00:00+09:00",
|
4
|
+
"updated": "2000-01-01T00:00:00+09:00",
|
5
|
+
"name": "recipe title",
|
6
|
+
"url": "http://example.com/examples/1",
|
7
|
+
"user": {
|
8
|
+
"id": 2294,
|
9
|
+
"url": "http://example.com/kitchen/2294",
|
10
|
+
"name": "Fern1",
|
11
|
+
"_links": {
|
12
|
+
"self": {
|
13
|
+
"href": "/v1/users/2294"
|
14
|
+
},
|
15
|
+
"bookmarks": {
|
16
|
+
"href": "/v1/users/2294/bookmarks"
|
17
|
+
},
|
18
|
+
"bookmark_tags": {
|
19
|
+
"href": "/v1/users/2294/bookmark_tags"
|
20
|
+
},
|
21
|
+
"canonical": {
|
22
|
+
"href": "/v1/users/2294"
|
23
|
+
},
|
24
|
+
"diary_entries": {
|
25
|
+
"href": "/v1/users/2294/diary_entries"
|
26
|
+
},
|
27
|
+
"feedbacks": {
|
28
|
+
"href": "/v1/users/2294/feedbacks"
|
29
|
+
},
|
30
|
+
"recipes": {
|
31
|
+
"href": "/v1/users/2294/recipes"
|
32
|
+
}
|
33
|
+
}
|
34
|
+
},
|
35
|
+
"description": "this is my favorite recipe.",
|
36
|
+
"serving": null,
|
37
|
+
"published": "2000-01-01T00:00:00+09:00",
|
38
|
+
"edited": null,
|
39
|
+
"tier": "example.com:User",
|
40
|
+
"ingredients": [],
|
41
|
+
"steps": [],
|
42
|
+
"_links": {
|
43
|
+
"self": {
|
44
|
+
"href": "/examples/1"
|
45
|
+
},
|
46
|
+
"canonical": {
|
47
|
+
"href": "/examples/1"
|
48
|
+
},
|
49
|
+
"nested_examples": {
|
50
|
+
"href": "/examples/1/nested_examples"
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
:ET:response_headersIC:Faraday::Utils::Headers{I"content-type;TI"$application/json; charset=utf-8;T:@names{I"content-type;T@
|
@@ -1,13 +1,34 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe GarageClient::Cachers::Base do
|
4
|
-
let(:
|
5
|
-
|
4
|
+
let(:store) do
|
5
|
+
Class.new do
|
6
|
+
def initialize
|
7
|
+
@table = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def read(key, options = {})
|
11
|
+
value = @table[key]
|
12
|
+
Marshal.load(value) if value
|
13
|
+
end
|
14
|
+
|
15
|
+
def write(key, value, options = {})
|
16
|
+
@table[key] = Marshal.dump(value)
|
17
|
+
end
|
18
|
+
end.new
|
6
19
|
end
|
7
20
|
|
8
21
|
let(:cacher_class) do
|
9
|
-
|
22
|
+
cache_store = store
|
10
23
|
Class.new(GarageClient::Cachers::Base) do
|
24
|
+
@store = cache_store
|
25
|
+
|
26
|
+
class << self
|
27
|
+
attr_reader :store
|
28
|
+
end
|
29
|
+
|
30
|
+
delegate :store, to: :class
|
31
|
+
|
11
32
|
private
|
12
33
|
|
13
34
|
def key
|
@@ -21,30 +42,18 @@ describe GarageClient::Cachers::Base do
|
|
21
42
|
def written_to_cache?
|
22
43
|
true
|
23
44
|
end
|
24
|
-
|
25
|
-
def store
|
26
|
-
Class.new do
|
27
|
-
def initialize
|
28
|
-
@table = {}
|
29
|
-
end
|
30
|
-
|
31
|
-
def read(key, options = {})
|
32
|
-
@table[key]
|
33
|
-
end
|
34
|
-
|
35
|
-
def write(key, value, options = {})
|
36
|
-
@table[key] = value
|
37
|
-
end
|
38
|
-
end.new
|
39
|
-
end
|
40
45
|
end
|
41
46
|
end
|
42
47
|
|
48
|
+
let(:client) do
|
49
|
+
GarageClient::Client.new(cacher: cacher_class)
|
50
|
+
end
|
51
|
+
|
43
52
|
describe "caching" do
|
44
53
|
context "with cache-enabled GarageClient::Client" do
|
45
54
|
it "caches response along passed cacher class" do
|
46
|
-
stub_get("/examples").to_return(fixture("examples.yaml")).times(1)
|
47
|
-
stub_get("/example").to_return(fixture("example.yaml")).times(1)
|
55
|
+
stub_get("/examples").to_return(fixture("examples.yaml")).times(1).then.to_raise("Not use Cache.")
|
56
|
+
stub_get("/example").to_return(fixture("example.yaml")).times(1).then.to_raise("Not use Cache.")
|
48
57
|
client.get("/examples").body.should be_a Array
|
49
58
|
client.get("/examples").body.should be_a Array
|
50
59
|
client.get("/example").body.should be_a GarageClient::Resource
|
@@ -52,4 +61,33 @@ describe GarageClient::Cachers::Base do
|
|
52
61
|
end
|
53
62
|
end
|
54
63
|
end
|
64
|
+
|
65
|
+
# Check dump data. Because cache data not broken on the version up of faraday.
|
66
|
+
describe "check Faraday::Response marshal" do
|
67
|
+
specify do
|
68
|
+
expect(Faraday::VERSION).to be < "1.0.0", "This spec is no longer needed. Delete this 'describe' section!"
|
69
|
+
end
|
70
|
+
|
71
|
+
context "v0.9.1's marshal data" do
|
72
|
+
let(:res) do
|
73
|
+
Marshal.load(File.read(File.expand_path('../fixtures/faraday_0.9.1_response.dump', __dir__)))
|
74
|
+
end
|
75
|
+
|
76
|
+
it "load data" do
|
77
|
+
expect(res).to be_instance_of Faraday::Response
|
78
|
+
expect(res.env[:body]).to eq fixture("example.yaml")[:body]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "v0.8.9's marshal data" do
|
83
|
+
let(:res) do
|
84
|
+
Marshal.load(File.read(File.expand_path('../fixtures/faraday_0.8.9_response.dump', __dir__)))
|
85
|
+
end
|
86
|
+
|
87
|
+
it "load data" do
|
88
|
+
expect(res).to be_instance_of Faraday::Response
|
89
|
+
expect(res.env[:body]).to eq fixture("example.yaml")[:body]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
55
93
|
end
|
@@ -4,6 +4,24 @@ describe GarageClient::Client do
|
|
4
4
|
let(:client) { GarageClient::Client.new(options) }
|
5
5
|
let(:options) { {} }
|
6
6
|
|
7
|
+
describe 'laziness of properties' do
|
8
|
+
before { allow(GarageClient.configuration).to receive(:endpoint).and_raise('error') }
|
9
|
+
|
10
|
+
context 'when is specified options' do
|
11
|
+
let(:options) { { endpoint: 'http://example.com' } }
|
12
|
+
|
13
|
+
it 'does not evaluate global configuration' do
|
14
|
+
expect { client.endpoint }.not_to raise_error
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when is not specified options' do
|
19
|
+
it 'evaluates global configuration' do
|
20
|
+
expect { client.endpoint }.to raise_error('error')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
7
25
|
describe "#adapter" do
|
8
26
|
context "without :adapter option value" do
|
9
27
|
it "returns default value" do
|
@@ -135,8 +153,8 @@ describe GarageClient::Client do
|
|
135
153
|
|
136
154
|
describe "#endpoint=" do
|
137
155
|
it "overwrites it" do
|
138
|
-
client.
|
139
|
-
client.
|
156
|
+
client.endpoint = "http://example.com"
|
157
|
+
client.endpoint.should == "http://example.com"
|
140
158
|
end
|
141
159
|
end
|
142
160
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: garage_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cookpad Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -201,6 +201,7 @@ extra_rdoc_files: []
|
|
201
201
|
files:
|
202
202
|
- ".gitignore"
|
203
203
|
- ".rspec"
|
204
|
+
- ".travis.yml"
|
204
205
|
- CHANGELOG.md
|
205
206
|
- Gemfile
|
206
207
|
- Guardfile
|
@@ -226,6 +227,8 @@ files:
|
|
226
227
|
- spec/fixtures/examples.yaml
|
227
228
|
- spec/fixtures/examples_dictionary.yaml
|
228
229
|
- spec/fixtures/examples_without_pagination.yaml
|
230
|
+
- spec/fixtures/faraday_0.8.9_response.dump
|
231
|
+
- spec/fixtures/faraday_0.9.1_response.dump
|
229
232
|
- spec/garage_client/cacher_spec.rb
|
230
233
|
- spec/garage_client/client_spec.rb
|
231
234
|
- spec/garage_client/configuration_spec.rb
|
@@ -254,7 +257,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
254
257
|
version: '0'
|
255
258
|
requirements: []
|
256
259
|
rubyforge_project:
|
257
|
-
rubygems_version: 2.
|
260
|
+
rubygems_version: 2.4.5
|
258
261
|
signing_key:
|
259
262
|
specification_version: 4
|
260
263
|
summary: Ruby client library for the Garage API
|
@@ -264,6 +267,8 @@ test_files:
|
|
264
267
|
- spec/fixtures/examples.yaml
|
265
268
|
- spec/fixtures/examples_dictionary.yaml
|
266
269
|
- spec/fixtures/examples_without_pagination.yaml
|
270
|
+
- spec/fixtures/faraday_0.8.9_response.dump
|
271
|
+
- spec/fixtures/faraday_0.9.1_response.dump
|
267
272
|
- spec/garage_client/cacher_spec.rb
|
268
273
|
- spec/garage_client/client_spec.rb
|
269
274
|
- spec/garage_client/configuration_spec.rb
|