chain 0.0.2 → 0.0.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 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