http_api_client 0.2.2 → 0.2.3
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 +15 -0
- data/LICENSE.txt +1 -1
- data/README.md +4 -0
- data/Rakefile +4 -0
- data/http_api_client.gemspec +1 -2
- data/lib/http_api_client/client.rb +16 -4
- data/lib/http_api_client/version.rb +1 -1
- data/spec/http_client/client_spec.rb +29 -1
- metadata +19 -26
- data/lib/http_api_client/timed_result.rb +0 -32
- data/spec/http_client/timed_result_spec.rb +0 -31
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YTliMDAwZWQ2Y2ZjMzMwNWIxMGQzN2U1ZDQ1YjM1YTQ1NWQwMzNjOQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MzIwMWJiNjQ4MDMxZDVhZDJlYzEyZTllNTFmNWUzMTkxZmRlOGY4Mg==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YjMyNjQ0N2QxMjY2MDRkYzM3MjQxYzM4ODc3Y2YzMmEyZTBlYzNlMGZmOTgw
|
10
|
+
ZTk5OTg2NzMwYmU2NDgzMjY5YjViNzAyNDBkM2E4YzJiMThkODZkYWJhZTFj
|
11
|
+
MTJiN2M4OTgxM2MwMjA2M2JjMDY1OWVhMTQzYjk4OGQzN2FiNDI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MzkzNTQwMjBkNzdkZjA0OGIyNjQ1MjExOWQwZWI2ZWQ4NjAxZmEwNzUxNmFm
|
14
|
+
NWIyZDk1NGNiMWZjMDhhY2EzMWRkZGRkNDA1MTc3MmQ3ZThkMzZlMGE3YTE0
|
15
|
+
MDhhZTIzMWEyMDQ2YmJhYmFkN2Y5NWJiMmExYzhiMjlhOThhNmI=
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -170,3 +170,7 @@ This will install `/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt`
|
|
170
170
|
|
171
171
|
### 0.2.2 - 2014-04-08
|
172
172
|
* TimedResult class is now no longer in the global namespace. It is in the HttpApiClient namespace now. Fixes problems with name collisions
|
173
|
+
|
174
|
+
### 0.2.3 - 2014-05-05
|
175
|
+
* Add logging for json parsing failures
|
176
|
+
* Remove unused timed result
|
data/Rakefile
CHANGED
data/http_api_client.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
21
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
22
|
+
spec.add_development_dependency "rake"
|
22
23
|
spec.add_development_dependency 'rspec', '~> 2.14'
|
23
24
|
spec.add_development_dependency 'pry', '~> 0.9'
|
24
25
|
spec.add_development_dependency 'pry-debugger', '~> 0.2'
|
@@ -28,6 +29,4 @@ Gem::Specification.new do |spec|
|
|
28
29
|
spec.add_dependency 'net-http-persistent', '~> 2.9'
|
29
30
|
spec.add_dependency 'oj', '~> 2.7'
|
30
31
|
|
31
|
-
|
32
|
-
|
33
32
|
end
|
@@ -7,7 +7,6 @@ require 'oj'
|
|
7
7
|
require 'http_api_client'
|
8
8
|
require 'http_api_client/errors'
|
9
9
|
require 'http_api_client/connection_factory'
|
10
|
-
require 'http_api_client/timed_result'
|
11
10
|
|
12
11
|
module HttpApiClient
|
13
12
|
class Client
|
@@ -90,15 +89,28 @@ module HttpApiClient
|
|
90
89
|
def handle_response(response, method, path)
|
91
90
|
if ok?(response)
|
92
91
|
if response.body
|
93
|
-
|
94
|
-
|
92
|
+
begin
|
93
|
+
#Don't use regular load method - any strings starting with ':' ( :-) from example) will be interpreted as a symbol
|
94
|
+
Oj.strict_load(response.body)
|
95
|
+
|
96
|
+
rescue Oj::ParseError => e
|
97
|
+
|
98
|
+
HttpApiClient.logger.error(
|
99
|
+
error_class: 'OJ::ParseError',
|
100
|
+
message: e.message,
|
101
|
+
backtrace: e.backtrace,
|
102
|
+
json: response.body
|
103
|
+
)
|
104
|
+
|
105
|
+
raise e
|
106
|
+
end
|
95
107
|
else
|
96
108
|
true
|
97
109
|
end
|
98
110
|
else
|
99
111
|
error_class = error_for_status(response.status)
|
100
112
|
message = "#{response.status} #{method}: #{path}"
|
101
|
-
HttpApiClient.logger.
|
113
|
+
HttpApiClient.logger.info("Http Client #{error_class}: #{message}")
|
102
114
|
raise error_class.new(message, response.body)
|
103
115
|
end
|
104
116
|
end
|
@@ -138,7 +138,7 @@ module HttpApiClient
|
|
138
138
|
describe "response status code handling" do
|
139
139
|
|
140
140
|
context "with a response with a status code in the 200 range" do
|
141
|
-
let(:
|
141
|
+
let(:get_response) { double('response', :body => '{"id": 1}', status: 200) }
|
142
142
|
|
143
143
|
describe "response" do
|
144
144
|
it "returns expected response body as hash" do
|
@@ -170,6 +170,34 @@ module HttpApiClient
|
|
170
170
|
|
171
171
|
end
|
172
172
|
|
173
|
+
describe 'response parsing' do
|
174
|
+
|
175
|
+
let(:get_response) { double('response', :body => json, status: 200) }
|
176
|
+
|
177
|
+
context 'with a valid json response' do
|
178
|
+
|
179
|
+
let(:json) { '{"id": 1}' }
|
180
|
+
|
181
|
+
it 'returns the json as a ruby hash' do
|
182
|
+
response = client.find('/path', 1)
|
183
|
+
expect(response['id']).to eq 1
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
context 'with and invalid json response' do
|
189
|
+
|
190
|
+
let(:json) { 'invalid json' }
|
191
|
+
|
192
|
+
it 'logs and re-raises error' do
|
193
|
+
HttpApiClient.logger.should_receive(:error)
|
194
|
+
lambda { client.find('/path', 1) }.should raise_error(Oj::ParseError)
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
|
173
201
|
context 'without request id tracking configured' do
|
174
202
|
it "does not add the Request-Id header to the request" do
|
175
203
|
connection.should_receive(:get).with('/test-base-uri/path/1', {}, base_get_headers)
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http_api_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Rob Monie
|
@@ -12,12 +11,11 @@ authors:
|
|
12
11
|
autorequire:
|
13
12
|
bindir: bin
|
14
13
|
cert_chain: []
|
15
|
-
date: 2014-
|
14
|
+
date: 2014-05-05 00:00:00.000000000 Z
|
16
15
|
dependencies:
|
17
16
|
- !ruby/object:Gem::Dependency
|
18
17
|
name: bundler
|
19
18
|
requirement: !ruby/object:Gem::Requirement
|
20
|
-
none: false
|
21
19
|
requirements:
|
22
20
|
- - ~>
|
23
21
|
- !ruby/object:Gem::Version
|
@@ -25,15 +23,27 @@ dependencies:
|
|
25
23
|
type: :development
|
26
24
|
prerelease: false
|
27
25
|
version_requirements: !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
26
|
requirements:
|
30
27
|
- - ~>
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: '1.3'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ! '>='
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
37
|
+
type: :development
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
33
44
|
- !ruby/object:Gem::Dependency
|
34
45
|
name: rspec
|
35
46
|
requirement: !ruby/object:Gem::Requirement
|
36
|
-
none: false
|
37
47
|
requirements:
|
38
48
|
- - ~>
|
39
49
|
- !ruby/object:Gem::Version
|
@@ -41,7 +51,6 @@ dependencies:
|
|
41
51
|
type: :development
|
42
52
|
prerelease: false
|
43
53
|
version_requirements: !ruby/object:Gem::Requirement
|
44
|
-
none: false
|
45
54
|
requirements:
|
46
55
|
- - ~>
|
47
56
|
- !ruby/object:Gem::Version
|
@@ -49,7 +58,6 @@ dependencies:
|
|
49
58
|
- !ruby/object:Gem::Dependency
|
50
59
|
name: pry
|
51
60
|
requirement: !ruby/object:Gem::Requirement
|
52
|
-
none: false
|
53
61
|
requirements:
|
54
62
|
- - ~>
|
55
63
|
- !ruby/object:Gem::Version
|
@@ -57,7 +65,6 @@ dependencies:
|
|
57
65
|
type: :development
|
58
66
|
prerelease: false
|
59
67
|
version_requirements: !ruby/object:Gem::Requirement
|
60
|
-
none: false
|
61
68
|
requirements:
|
62
69
|
- - ~>
|
63
70
|
- !ruby/object:Gem::Version
|
@@ -65,7 +72,6 @@ dependencies:
|
|
65
72
|
- !ruby/object:Gem::Dependency
|
66
73
|
name: pry-debugger
|
67
74
|
requirement: !ruby/object:Gem::Requirement
|
68
|
-
none: false
|
69
75
|
requirements:
|
70
76
|
- - ~>
|
71
77
|
- !ruby/object:Gem::Version
|
@@ -73,7 +79,6 @@ dependencies:
|
|
73
79
|
type: :development
|
74
80
|
prerelease: false
|
75
81
|
version_requirements: !ruby/object:Gem::Requirement
|
76
|
-
none: false
|
77
82
|
requirements:
|
78
83
|
- - ~>
|
79
84
|
- !ruby/object:Gem::Version
|
@@ -81,7 +86,6 @@ dependencies:
|
|
81
86
|
- !ruby/object:Gem::Dependency
|
82
87
|
name: activesupport
|
83
88
|
requirement: !ruby/object:Gem::Requirement
|
84
|
-
none: false
|
85
89
|
requirements:
|
86
90
|
- - ! '>='
|
87
91
|
- !ruby/object:Gem::Version
|
@@ -89,7 +93,6 @@ dependencies:
|
|
89
93
|
type: :runtime
|
90
94
|
prerelease: false
|
91
95
|
version_requirements: !ruby/object:Gem::Requirement
|
92
|
-
none: false
|
93
96
|
requirements:
|
94
97
|
- - ! '>='
|
95
98
|
- !ruby/object:Gem::Version
|
@@ -97,7 +100,6 @@ dependencies:
|
|
97
100
|
- !ruby/object:Gem::Dependency
|
98
101
|
name: faraday
|
99
102
|
requirement: !ruby/object:Gem::Requirement
|
100
|
-
none: false
|
101
103
|
requirements:
|
102
104
|
- - ~>
|
103
105
|
- !ruby/object:Gem::Version
|
@@ -105,7 +107,6 @@ dependencies:
|
|
105
107
|
type: :runtime
|
106
108
|
prerelease: false
|
107
109
|
version_requirements: !ruby/object:Gem::Requirement
|
108
|
-
none: false
|
109
110
|
requirements:
|
110
111
|
- - ~>
|
111
112
|
- !ruby/object:Gem::Version
|
@@ -113,7 +114,6 @@ dependencies:
|
|
113
114
|
- !ruby/object:Gem::Dependency
|
114
115
|
name: net-http-persistent
|
115
116
|
requirement: !ruby/object:Gem::Requirement
|
116
|
-
none: false
|
117
117
|
requirements:
|
118
118
|
- - ~>
|
119
119
|
- !ruby/object:Gem::Version
|
@@ -121,7 +121,6 @@ dependencies:
|
|
121
121
|
type: :runtime
|
122
122
|
prerelease: false
|
123
123
|
version_requirements: !ruby/object:Gem::Requirement
|
124
|
-
none: false
|
125
124
|
requirements:
|
126
125
|
- - ~>
|
127
126
|
- !ruby/object:Gem::Version
|
@@ -129,7 +128,6 @@ dependencies:
|
|
129
128
|
- !ruby/object:Gem::Dependency
|
130
129
|
name: oj
|
131
130
|
requirement: !ruby/object:Gem::Requirement
|
132
|
-
none: false
|
133
131
|
requirements:
|
134
132
|
- - ~>
|
135
133
|
- !ruby/object:Gem::Version
|
@@ -137,7 +135,6 @@ dependencies:
|
|
137
135
|
type: :runtime
|
138
136
|
prerelease: false
|
139
137
|
version_requirements: !ruby/object:Gem::Requirement
|
140
|
-
none: false
|
141
138
|
requirements:
|
142
139
|
- - ~>
|
143
140
|
- !ruby/object:Gem::Version
|
@@ -162,7 +159,6 @@ files:
|
|
162
159
|
- lib/http_api_client/connection_factory.rb
|
163
160
|
- lib/http_api_client/errors.rb
|
164
161
|
- lib/http_api_client/rails_params_encoder.rb
|
165
|
-
- lib/http_api_client/timed_result.rb
|
166
162
|
- lib/http_api_client/version.rb
|
167
163
|
- spec/config/http_api_clients.yml
|
168
164
|
- spec/config/http_api_clients_with_basic_auth.yml
|
@@ -174,31 +170,29 @@ files:
|
|
174
170
|
- spec/http_client/config_spec.rb
|
175
171
|
- spec/http_client/connection_factory_spec.rb
|
176
172
|
- spec/http_client/errors_spec.rb
|
177
|
-
- spec/http_client/timed_result_spec.rb
|
178
173
|
homepage: ''
|
179
174
|
licenses:
|
180
175
|
- MIT
|
176
|
+
metadata: {}
|
181
177
|
post_install_message:
|
182
178
|
rdoc_options: []
|
183
179
|
require_paths:
|
184
180
|
- lib
|
185
181
|
required_ruby_version: !ruby/object:Gem::Requirement
|
186
|
-
none: false
|
187
182
|
requirements:
|
188
183
|
- - ! '>='
|
189
184
|
- !ruby/object:Gem::Version
|
190
185
|
version: '0'
|
191
186
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
192
|
-
none: false
|
193
187
|
requirements:
|
194
188
|
- - ! '>='
|
195
189
|
- !ruby/object:Gem::Version
|
196
190
|
version: '0'
|
197
191
|
requirements: []
|
198
192
|
rubyforge_project:
|
199
|
-
rubygems_version:
|
193
|
+
rubygems_version: 2.2.2
|
200
194
|
signing_key:
|
201
|
-
specification_version:
|
195
|
+
specification_version: 4
|
202
196
|
summary: ''
|
203
197
|
test_files:
|
204
198
|
- spec/config/http_api_clients.yml
|
@@ -211,4 +205,3 @@ test_files:
|
|
211
205
|
- spec/http_client/config_spec.rb
|
212
206
|
- spec/http_client/connection_factory_spec.rb
|
213
207
|
- spec/http_client/errors_spec.rb
|
214
|
-
- spec/http_client/timed_result_spec.rb
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module HttpApiClient
|
3
|
-
class TimedResult
|
4
|
-
|
5
|
-
def self.time(event, log_data = {})
|
6
|
-
start_time = Time.now
|
7
|
-
yield
|
8
|
-
ensure
|
9
|
-
|
10
|
-
time = millis_since(start_time)
|
11
|
-
|
12
|
-
log_entries = ["event_name=#{event}"]
|
13
|
-
log_entries << "request_id=#{Thread.current[:request_id]}" if Thread.current[:request_id]
|
14
|
-
log_entries << "timing=#{time}"
|
15
|
-
log_entries.concat(as_log_entries(log_data))
|
16
|
-
|
17
|
-
HttpApiClient.logger.info(log_entries.join(", "))
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.millis_since(start_time)
|
22
|
-
(Time.now - start_time) * 1000
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.as_log_entries(hash)
|
26
|
-
hash.inject [] do |result, entry|
|
27
|
-
result << "#{entry[0]}=#{entry[1]}"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'http_api_client'
|
4
|
-
|
5
|
-
module HttpApiClient
|
6
|
-
|
7
|
-
describe TimedResult do
|
8
|
-
|
9
|
-
context 'without extra log data' do
|
10
|
-
|
11
|
-
let(:request_id) { 'abc-123' }
|
12
|
-
let(:logger) { HttpApiClient.logger }
|
13
|
-
|
14
|
-
before do
|
15
|
-
TimedResult.stub(:millis_since).and_return 1000
|
16
|
-
Thread.current[:request_id] = request_id
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'logs event with base data' do
|
20
|
-
logger.should_receive(:info).with("event_name=my_event, request_id=#{request_id}, timing=#{1000}")
|
21
|
-
TimedResult.time('my_event') { }
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'logs event with extra data' do
|
25
|
-
logger.should_receive(:info).with("event_name=my_event, request_id=#{request_id}, timing=#{1000}, foo=bar")
|
26
|
-
TimedResult.time('my_event', { foo: 'bar' }) { }
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|