chain 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 78f46a473a0b2ca4c82513bb2d4e492cb6e85c46
4
- data.tar.gz: ef312f8a83617ba52da44b9f304298c68306932a
3
+ metadata.gz: d41aefd46847e3024559446254ca04cff1145beb
4
+ data.tar.gz: ad97bde45dc46839e592b45c3244b2eae472c2a1
5
5
  SHA512:
6
- metadata.gz: 36763e8dc1cdf79e8fec74b121b0344412bd9465cc5941264f35888d82b7883421550676e8cc2ee23eb38814c90badaaa4fda4245e318306c2e2ef334dbe6b8f
7
- data.tar.gz: 9d04368dacab30f6ca15eaa377599fa6e158e41a724facda1adaf356ba3dbf9fe5f560b8624729a4550e95a48eccdf9fa0bdd61b1359589bed1ddc41ebd2e127
6
+ metadata.gz: 0f7475d798767b183a715e9952f486818d27fbf4887900e7551c06d062fdf9776b53ce7661668d7b6982a082a34c043ec2bf06a842b6a69a550c731a89cb1e95
7
+ data.tar.gz: 652d27ed64b97d9d0d056f6d0891511d32a44b972a13572d0bcbdd71b54801666d29c2558090604aa8280758a14ab31c1f137a0c79e0459b945b85ef18d2cd28
data/README.md CHANGED
@@ -32,7 +32,7 @@ items = site.items!
32
32
  items.data.each do |item|
33
33
 
34
34
  # ...iterate through and print out the `name` attribute for http://www.site.com/items/#
35
- puts items[item.id]!.name
35
+ puts items[item.id]._fetch.name
36
36
  end
37
37
  ```
38
38
 
data/lib/chain.rb CHANGED
@@ -7,3 +7,5 @@ require "hashie"
7
7
  require "chain/url"
8
8
  require "chain/version"
9
9
  require "chain/middleware/hashie_mash_response"
10
+ require "chain/middleware/parse_error"
11
+ require "chain/middleware/request_error"
@@ -2,12 +2,28 @@ module Chain
2
2
  module Middleware
3
3
  class HashieMashResponse < Faraday::Response::Middleware
4
4
  def on_complete(env)
5
- body = JSON.parse(env[:body].to_s.encode('UTF-8', {:invalid => :replace, :undef => :replace, :replace => '?'}))
6
- headers = env[:response_headers]
7
- env[:body] = Hashie::Mash.new(body).tap do |item|
8
- item._headers = Hashie::Mash.new(headers)
9
- item._status = env[:status]
5
+ case env[:status]
6
+ when 200
7
+ body = env[:body].to_s.encode('UTF-8', {invalid: :replace, undef: :replace, replace: '?'})
8
+
9
+ json = JSON.parse(body)
10
+ headers = env[:response_headers]
11
+
12
+ env[:body] = Hashie::Mash.new(json).tap do |item|
13
+ item._headers = Hashie::Mash.new(headers)
14
+ item._status = env[:status]
15
+ end
16
+ else
17
+ raise Chain::Middleware::RequestError, env[:status]
10
18
  end
19
+
20
+ rescue JSON::ParserError => ex
21
+ raise Chain::Middleware::ParseError, "Unable to parse JSON response: #{ex.message}"
22
+
23
+ rescue NoMethodError => ex
24
+ # This captures parsing errors from Hashie::Mash. Unfortunately, HM does not raise
25
+ # their own errors.
26
+ raise Chain::Middleware::ParseError, "Unable to parse JSON as object: #{ex.message}"
11
27
  end
12
28
  end
13
29
  end
@@ -0,0 +1,9 @@
1
+ module Chain
2
+ module Middleware
3
+ class ParseError < StandardError
4
+ def initialize(message)
5
+ super(message)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ module Chain
2
+ module Middleware
3
+ class RequestError < StandardError
4
+ attr_reader :error_code
5
+
6
+ def initialize(error_code)
7
+ @error_code = error_code
8
+ super("HTTP Response Code: #{error_code}")
9
+ end
10
+ end
11
+ end
12
+ end
data/lib/chain/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Chain
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chain::Middleware::HashieMashResponse do
4
+
5
+ subject do
6
+ described_class.new
7
+ end
8
+
9
+ describe '#on_complete' do
10
+
11
+ context 'a valid response response with a 200 status' do
12
+ let(:env){{body: {success: true}.to_json, status: 200}}
13
+
14
+ it 'should yield a Hashie::Mash object from the request' do
15
+ subject.on_complete(env)
16
+ expect(env[:body].success).to be true
17
+ end
18
+ end
19
+
20
+ context 'a response with invalid json' do
21
+ let(:env){{body: "[1,2,3]", status: 200}}
22
+
23
+ it 'should raise a ParseError instance' do
24
+ expect { subject.on_complete(env) }.to raise_error(Chain::Middleware::ParseError)
25
+ end
26
+ end
27
+
28
+ context 'a response with a 404 status' do
29
+ let(:env){{body: nil, status: 404}}
30
+
31
+ it 'should raise an instance of RequestError with a 404 status code' do
32
+ expect { subject.on_complete(env) }.to raise_error do |exception|
33
+ expect(exception.status_code).to eq(404)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
data/spec/url_spec.rb CHANGED
@@ -88,6 +88,14 @@ describe Chain::Url do
88
88
  should have_been_made
89
89
  end
90
90
 
91
+ it 'should generate a request if a hash is passed into a method' do
92
+ subject.item(foo: 'bar')
93
+
94
+ a_request(:get, 'http://test.com/item').
95
+ with(query: hash_including({'foo' => 'bar'})).
96
+ should have_been_made
97
+ end
98
+
91
99
  it 'should parse the _method parameter as the HTTP request type' do
92
100
  subject.item[_method: :post]._fetch
93
101
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chain
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Novak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-18 00:00:00.000000000 Z
11
+ date: 2013-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -109,8 +109,11 @@ files:
109
109
  - chain.gemspec
110
110
  - lib/chain.rb
111
111
  - lib/chain/middleware/hashie_mash_response.rb
112
+ - lib/chain/middleware/parse_error.rb
113
+ - lib/chain/middleware/request_error.rb
112
114
  - lib/chain/url.rb
113
115
  - lib/chain/version.rb
116
+ - spec/middleware/hasie_mash_response_spec.rb
114
117
  - spec/spec_helper.rb
115
118
  - spec/url_spec.rb
116
119
  homepage: https://github.com/slnovak/chain
@@ -138,5 +141,6 @@ signing_key:
138
141
  specification_version: 4
139
142
  summary: Access API endpoints via method chaining in Ruby.
140
143
  test_files:
144
+ - spec/middleware/hasie_mash_response_spec.rb
141
145
  - spec/spec_helper.rb
142
146
  - spec/url_spec.rb