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 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
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 Rob Monie
1
+ Copyright (c) 2014 Hooroo
2
2
 
3
3
  MIT License
4
4
 
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
@@ -1 +1,5 @@
1
1
  require "bundler/gem_tasks"
2
+ require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+ task :default => :spec
5
+ RSpec::Core::RakeTask.new
@@ -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
- #Don't use regular load method - any strings starting with ':' ( :-) from example) will be interpreted as a symbol
94
- Oj.strict_load(response.body)
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.warn("Http Client #{error_class}: #{message}")
113
+ HttpApiClient.logger.info("Http Client #{error_class}: #{message}")
102
114
  raise error_class.new(message, response.body)
103
115
  end
104
116
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module HttpApiClient
4
- VERSION = "0.2.2"
4
+ VERSION = "0.2.3"
5
5
  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(:response) { double('response', :body => '{"id": 1}', status: 200) }
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.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-04-14 00:00:00.000000000 Z
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: 1.8.23
193
+ rubygems_version: 2.2.2
200
194
  signing_key:
201
- specification_version: 3
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