sawyer 0.8.1 → 0.8.2

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
- SHA1:
3
- metadata.gz: f6cbbe41c12f00d598889cbb8aed1d64097bd8dc
4
- data.tar.gz: 938a4dd63ecc154994228964b2777ebd2c157563
2
+ SHA256:
3
+ metadata.gz: 23f3bc01fedbd455c77a935f6f4de0a6adb6e743d9b6403c92e8d756bd737527
4
+ data.tar.gz: fd376d24589522cdc89fcedf39e1d8ad122625ad81565eb99386280eb7c6d925
5
5
  SHA512:
6
- metadata.gz: cfcca0af2c72b15c6a6a3d13d327e4ca1c60fb99ac292f19a81b695a5ef56d9d49cf5ce15a87434144566713e6a87343d52cde9f4e43a191552b8767a23d89cb
7
- data.tar.gz: e8476f19b01abf5595ceb699e317fb5d5a68c590f91022778ff2e2b04b8350c98427cc5015c7132309b2856c881c90f578f2957932ef0d9297fc502467b16b43
6
+ metadata.gz: 1d4fa7381c4264398dc288cff790cba84fee46e473cf5062b72804662c1a17641dffc83c453110abfd4ca4d8b1427b49d9eadf5dcb9e747b8aaa1a4e3519392b
7
+ data.tar.gz: 8b2dd59f0110e5e1c93ff5a0d4fd7455da7470875351df1757d585cf70b3287164e882e39041af6020ec2bef23f7a69d57764e1227101618e05a52c4fa18c922
data/README.md CHANGED
@@ -1,19 +1,62 @@
1
1
  # Sawyer
2
2
 
3
- Sawyer is an experimental secret user agent built on top of
4
- [Faraday][faraday].
3
+ Sawyer is an experimental hypermedia agent for Ruby built on top of [Faraday][faraday].
5
4
 
6
5
  [faraday]: https://github.com/lostisland/faraday
7
6
 
8
- ![](http://techno-weenie.net/sawyer/images/faraday.jpeg)
7
+ ## Installation
9
8
 
10
- Think of Faraday as the nerdy scientist behind an HTTP API. Sure, he
11
- knows the technical details of how to communicate with an application.
12
- But he also gets overly obsessive about alternate timelines to be of
13
- much use.
9
+ Add this line to your application's Gemfile:
14
10
 
15
- ![](http://techno-weenie.net/sawyer/images/sawyer.jpeg)
11
+ ```ruby
12
+ gem 'sawyer'
13
+ ```
16
14
 
17
- Sawyer knows what needs to be done. He gets in there, assesses the
18
- situation, and figures out the next action.
15
+ And then execute:
19
16
 
17
+ ```sh
18
+ bundle
19
+ ```
20
+
21
+ Or install it yourself as:
22
+
23
+ ```sh
24
+ gem install sawyer
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ ```ruby
30
+ require "sawyer"
31
+
32
+ # Create a Sawyer agent
33
+ agent = Sawyer::Agent.new("https://api.github.com",
34
+ links_parser: Sawyer::LinkParsers::Simple.new)
35
+
36
+ # Fetch the root of the API
37
+ root = agent.root.data
38
+
39
+ # Access a resource directly
40
+ contributors = agent.call(:get, "repos/lostisland/sawyer/contributors").data
41
+
42
+ # Load a hypermedia relation
43
+ top_contributor = contributors.first
44
+ followers = top_contributor.rels[:followers].get.data
45
+ ```
46
+
47
+ For more information, check out the [documentation](http://www.rubydoc.info/gems/sawyer/).
48
+
49
+ ## Development
50
+
51
+ After checking out the repo, run `script/test` to bootstrap the project and run the tests.
52
+ You can also run `script/console` for an interactive prompt that will allow you to experiment.
53
+
54
+ To package the gem, run `script/package`. To release a new version, update the version number in [`lib/sawyer.rb`](lib/sawyer.rb), and then run `script/release`, which will create a git tag for the version, push git commits and tags, and push the .gem file to [rubygems.org](https://rubygems.org).
55
+
56
+ ## Contributing
57
+
58
+ Check out the [contributing guide](CONTRIBUTING.md) for more information on contributing.
59
+
60
+ ## License
61
+
62
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -1,5 +1,5 @@
1
1
  module Sawyer
2
- VERSION = "0.8.1"
2
+ VERSION = "0.8.2"
3
3
 
4
4
  class Error < StandardError; end
5
5
  end
@@ -38,6 +38,7 @@ module Sawyer
38
38
  def keys
39
39
  @map.keys
40
40
  end
41
+
41
42
  def to_hash
42
43
  pairs = @map.map do |k, v|
43
44
  [(k.to_s + "_url").to_sym, v.href]
@@ -3,7 +3,8 @@ module Sawyer
3
3
  attr_reader :agent,
4
4
  :status,
5
5
  :headers,
6
- :data,
6
+ :env,
7
+ :body,
7
8
  :rels
8
9
 
9
10
  # Builds a Response after a completed request.
@@ -15,12 +16,19 @@ module Sawyer
15
16
  @status = res.status
16
17
  @headers = res.headers
17
18
  @env = res.env
18
- @data = @headers[:content_type] =~ /json|msgpack/ ? process_data(@agent.decode_body(res.body)) : res.body
19
+ @body = res.body
19
20
  @rels = process_rels
20
21
  @started = options[:sawyer_started]
21
22
  @ended = options[:sawyer_ended]
22
23
  end
23
24
 
25
+ def data
26
+ @data ||= begin
27
+ return(body) unless (headers[:content_type] =~ /json|msgpack/)
28
+ process_data(agent.decode_body(body))
29
+ end
30
+ end
31
+
24
32
  # Turns parsed contents from an API response into a Resource or
25
33
  # collection of Resources.
26
34
  #
@@ -58,7 +66,7 @@ module Sawyer
58
66
  end
59
67
 
60
68
  def inspect
61
- %(#<#{self.class}: #{@status} @rels=#{@rels.inspect} @data=#{@data.inspect}>)
69
+ %(#<#{self.class}: #{@status} @rels=#{@rels.inspect} @data=#{data.inspect}>)
62
70
  end
63
71
  end
64
72
  end
@@ -4,7 +4,9 @@ require 'time'
4
4
  module Sawyer
5
5
  class Serializer
6
6
  def self.any_json
7
- yajl || multi_json || json
7
+ yajl || multi_json || json || begin
8
+ raise RuntimeError, "Sawyer requires a JSON gem: yajl, multi_json, or json"
9
+ end
8
10
  end
9
11
 
10
12
  def self.yajl
@@ -17,13 +17,12 @@ Gem::Specification.new do |spec|
17
17
  spec.homepage = 'https://github.com/lostisland/sawyer'
18
18
  spec.licenses = ['MIT']
19
19
 
20
- spec.add_dependency 'faraday', ['~> 0.8', '< 1.0']
21
- spec.add_dependency 'addressable', ['>= 2.3.5', '< 2.6']
20
+ spec.add_dependency 'faraday', ['> 0.8', '< 2.0']
21
+ spec.add_dependency 'addressable', ['>= 2.3.5']
22
22
 
23
23
  spec.files = %w(Gemfile LICENSE.md README.md Rakefile)
24
24
  spec.files << "#{lib}.gemspec"
25
25
  spec.files += Dir.glob("lib/**/*.rb")
26
- spec.files += Dir.glob("test/**/*.rb")
27
26
  spec.files += Dir.glob("script/*")
28
27
 
29
28
  dev_null = File.exist?('/dev/null') ? '/dev/null' : 'NUL'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sawyer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rick Olson
@@ -9,28 +9,28 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-11-18 00:00:00.000000000 Z
12
+ date: 2019-05-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
18
+ - - ">"
19
19
  - !ruby/object:Gem::Version
20
20
  version: '0.8'
21
21
  - - "<"
22
22
  - !ruby/object:Gem::Version
23
- version: '1.0'
23
+ version: '2.0'
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
27
27
  requirements:
28
- - - "~>"
28
+ - - ">"
29
29
  - !ruby/object:Gem::Version
30
30
  version: '0.8'
31
31
  - - "<"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: '2.0'
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: addressable
36
36
  requirement: !ruby/object:Gem::Requirement
@@ -38,9 +38,6 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 2.3.5
41
- - - "<"
42
- - !ruby/object:Gem::Version
43
- version: '2.6'
44
41
  type: :runtime
45
42
  prerelease: false
46
43
  version_requirements: !ruby/object:Gem::Requirement
@@ -48,9 +45,6 @@ dependencies:
48
45
  - - ">="
49
46
  - !ruby/object:Gem::Version
50
47
  version: 2.3.5
51
- - - "<"
52
- - !ruby/object:Gem::Version
53
- version: '2.6'
54
48
  description:
55
49
  email: technoweenie@gmail.com
56
50
  executables: []
@@ -75,11 +69,6 @@ files:
75
69
  - script/package
76
70
  - script/release
77
71
  - script/test
78
- - test/agent_test.rb
79
- - test/helper.rb
80
- - test/relation_test.rb
81
- - test/resource_test.rb
82
- - test/response_test.rb
83
72
  homepage: https://github.com/lostisland/sawyer
84
73
  licenses:
85
74
  - MIT
@@ -100,9 +89,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
89
  version: 1.3.5
101
90
  requirements: []
102
91
  rubyforge_project:
103
- rubygems_version: 2.4.5.1
92
+ rubygems_version: 2.7.6
104
93
  signing_key:
105
94
  specification_version: 2
106
95
  summary: Secret User Agent of HTTP
107
96
  test_files: []
108
- has_rdoc:
@@ -1,195 +0,0 @@
1
- require File.expand_path("../helper", __FILE__)
2
-
3
- require 'faraday/adapter/test'
4
-
5
- module Sawyer
6
- class AgentTest < TestCase
7
-
8
- class InlineRelsParser
9
- def parse(data)
10
- links = {}
11
- data.keys.select {|k| k[/_url$/] }.each {|k| links[k.to_s.gsub(/_url$/, '')] = data.delete(k) }
12
-
13
- return data, links
14
- end
15
- end
16
-
17
- def setup
18
- @stubs = Faraday::Adapter::Test::Stubs.new
19
- @agent = Sawyer::Agent.new "http://foo.com/a/" do |conn|
20
- conn.builder.handlers.delete(Faraday::Adapter::NetHttp)
21
- conn.adapter :test, @stubs
22
- end
23
- end
24
-
25
- def test_accesses_root_relations
26
- @stubs.get '/a/' do |env|
27
- assert_equal 'foo.com', env[:url].host
28
-
29
- [200, {'Content-Type' => 'application/json'}, Sawyer::Agent.encode(
30
- :_links => {
31
- :users => {:href => '/users'}})]
32
- end
33
-
34
- assert_equal 200, @agent.root.status
35
-
36
- assert_equal '/users', @agent.rels[:users].href
37
- assert_equal :get, @agent.rels[:users].method
38
- end
39
-
40
- def test_allows_custom_rel_parsing
41
- @stubs.get '/a/' do |env|
42
- assert_equal 'foo.com', env[:url].host
43
-
44
- [200, {'Content-Type' => 'application/json'}, Sawyer::Agent.encode(
45
- :url => '/',
46
- :users_url => '/users',
47
- :repos_url => '/repos')]
48
- end
49
-
50
- agent = Sawyer::Agent.new "http://foo.com/a/" do |conn|
51
- conn.builder.handlers.delete(Faraday::Adapter::NetHttp)
52
- conn.adapter :test, @stubs
53
- end
54
- agent.links_parser = InlineRelsParser.new
55
-
56
- assert_equal 200, agent.root.status
57
-
58
- assert_equal '/users', agent.rels[:users].href
59
- assert_equal :get, agent.rels[:users].method
60
- assert_equal '/repos', agent.rels[:repos].href
61
- assert_equal :get, agent.rels[:repos].method
62
-
63
- end
64
-
65
- def test_saves_root_endpoint
66
- @stubs.get '/a/' do |env|
67
- [200, {}, '{}']
68
- end
69
-
70
- assert_kind_of Sawyer::Response, @agent.root
71
- refute_equal @agent.root.time, @agent.start.time
72
- end
73
-
74
- def test_starts_a_session
75
- @stubs.get '/a/' do |env|
76
- assert_equal 'foo.com', env[:url].host
77
-
78
- [200, {'Content-Type' => 'application/json'}, Sawyer::Agent.encode(
79
- :_links => {
80
- :users => {:href => '/users'}})]
81
- end
82
-
83
- res = @agent.start
84
-
85
- assert_equal 200, res.status
86
- assert_kind_of Sawyer::Resource, resource = res.data
87
-
88
- assert_equal '/users', resource.rels[:users].href
89
- assert_equal :get, resource.rels[:users].method
90
- end
91
-
92
- def test_requests_with_body_and_options
93
- @stubs.post '/a/b/c' do |env|
94
- assert_equal '{"a":1}', env[:body]
95
- assert_equal 'abc', env[:request_headers]['x-test']
96
- assert_equal 'foo=bar', env[:url].query
97
- [200, {}, "{}"]
98
- end
99
-
100
- res = @agent.call :post, 'b/c' , {:a => 1},
101
- :headers => {"X-Test" => "abc"},
102
- :query => {:foo => 'bar'}
103
- assert_equal 200, res.status
104
- end
105
-
106
- def test_requests_with_body_and_options_to_get
107
- @stubs.get '/a/b/c' do |env|
108
- assert_nil env[:body]
109
- assert_equal 'abc', env[:request_headers]['x-test']
110
- assert_equal 'foo=bar', env[:url].query
111
- [200, {}, "{}"]
112
- end
113
-
114
- res = @agent.call :get, 'b/c' , {:a => 1},
115
- :headers => {"X-Test" => "abc"},
116
- :query => {:foo => 'bar'}
117
- assert_equal 200, res.status
118
- end
119
-
120
- def test_encodes_and_decodes_times
121
- time = Time.at(Time.now.to_i)
122
- data = {
123
- :a => 1,
124
- :b => true,
125
- :c => 'c',
126
- :created_at => time,
127
- :published_at => nil,
128
- :updated_at => "An invalid date",
129
- :pub_date => time,
130
- :subscribed_at => time.to_i,
131
- :lost_at => time.to_f,
132
- :first_date => false,
133
- :validate => true
134
- }
135
- data = [data.merge(:foo => [data])]
136
- encoded = Sawyer::Agent.encode(data)
137
- decoded = Sawyer::Agent.decode(encoded)
138
-
139
- 2.times do
140
- assert_equal 1, decoded.size
141
- decoded = decoded.shift
142
-
143
- assert_equal 1, decoded[:a]
144
- assert_equal true, decoded[:b]
145
- assert_equal 'c', decoded[:c]
146
- assert_equal time, decoded[:created_at], "Did not parse created_at as Time"
147
- assert_nil decoded[:published_at]
148
- assert_equal "An invalid date", decoded[:updated_at]
149
- assert_equal time, decoded[:pub_date], "Did not parse pub_date as Time"
150
- assert_equal true, decoded[:validate]
151
- assert_equal time, decoded[:subscribed_at], "Did not parse subscribed_at as Time"
152
- assert_equal time, decoded[:lost_at], "Did not parse lost_at as Time"
153
- assert_equal false, decoded[:first_date], "Parsed first_date"
154
- decoded = decoded[:foo]
155
- end
156
- end
157
-
158
- def test_does_not_encode_non_json_content_types
159
- @stubs.get '/a/' do |env|
160
- assert_equal 'foo.com', env[:url].host
161
-
162
- [200, {'Content-Type' => 'text/plain'}, "This is plain text"]
163
- end
164
- res = @agent.call :get, '/a/',
165
- :headers => {"Accept" => "text/plain"}
166
- assert_equal 200, res.status
167
-
168
- assert_equal "This is plain text", res.data
169
- end
170
-
171
- def test_handle_yaml_dump_and_load
172
- require 'yaml'
173
- res = Agent.new 'http://example.com', :a => 1
174
- YAML.load(YAML.dump(res))
175
- end
176
-
177
- def test_handle_marshal_dump_and_load
178
- res = Agent.new 'http://example.com', :a => 1
179
- Marshal.load(Marshal.dump(res))
180
- end
181
-
182
- def test_blank_response_doesnt_raise
183
- @stubs.get "/a/" do |env|
184
- assert_equal "foo.com", env[:url].host
185
- [200, { "Content-Type" => "application/json" }, " "]
186
- end
187
-
188
- agent = Sawyer::Agent.new "http://foo.com/a/" do |conn|
189
- conn.adapter :test, @stubs
190
- end
191
-
192
- assert_equal 200, agent.root.status
193
- end
194
- end
195
- end
@@ -1,7 +0,0 @@
1
- require "minitest/autorun"
2
- require File.expand_path('../../lib/sawyer', __FILE__)
3
-
4
- class Sawyer::TestCase < Minitest::Test
5
- def default_test
6
- end
7
- end
@@ -1,174 +0,0 @@
1
- require File.expand_path("../helper", __FILE__)
2
-
3
- module Sawyer
4
- class RelationTest < TestCase
5
- def test_builds_relation_from_hash
6
- hash = {:href => '/users/1', :method => 'post'}
7
- rel = Sawyer::Relation.from_link(nil, :self, hash)
8
-
9
- assert_equal :self, rel.name
10
- assert_equal '/users/1', rel.href
11
- assert_equal :post, rel.method
12
- assert_equal [:post], rel.available_methods.to_a
13
- end
14
-
15
- def test_builds_multiple_rels_from_multiple_methods
16
- index = {
17
- 'comments' => {:href => '/comments', :method => 'get,post'}
18
- }
19
-
20
- rels = Sawyer::Relation.from_links(nil, index)
21
- assert_equal 1, rels.size
22
- assert_equal [:comments], rels.keys
23
-
24
- assert rel = rels[:comments]
25
- assert_equal '/comments', rel.href
26
- assert_equal :get, rel.method
27
- assert_equal [:get, :post], rel.available_methods.to_a
28
- assert_kind_of Addressable::Template, rel.href_template
29
- end
30
-
31
- def test_builds_rels_from_hash
32
- index = {
33
- 'self' => '/users/1'
34
- }
35
-
36
- rels = Sawyer::Relation.from_links(nil, index)
37
-
38
- assert_equal 1, rels.size
39
- assert_equal [:self], rels.keys
40
- assert rel = rels[:self]
41
- assert_equal :self, rel.name
42
- assert_equal '/users/1', rel.href
43
- assert_equal :get, rel.method
44
- assert_equal [:get], rel.available_methods.to_a
45
- assert_kind_of Addressable::Template, rel.href_template
46
- end
47
-
48
- def test_builds_rels_from_hash_index
49
- index = {
50
- 'self' => {:href => '/users/1'}
51
- }
52
-
53
- rels = Sawyer::Relation.from_links(nil, index)
54
-
55
- assert_equal 1, rels.size
56
- assert_equal [:self], rels.keys
57
- assert rel = rels[:self]
58
- assert_equal :self, rel.name
59
- assert_equal '/users/1', rel.href
60
- assert_equal :get, rel.method
61
- assert_equal [:get], rel.available_methods.to_a
62
- assert_kind_of Addressable::Template, rel.href_template
63
- end
64
-
65
- def test_builds_rels_from_nil
66
- rels = Sawyer::Relation.from_links nil, nil
67
- assert_equal 0, rels.size
68
- assert_equal [], rels.keys
69
- end
70
-
71
- def test_relation_api_calls
72
- agent = Sawyer::Agent.new "http://foo.com/a/" do |conn|
73
- conn.builder.handlers.delete(Faraday::Adapter::NetHttp)
74
- conn.adapter :test do |stubs|
75
- stubs.get '/a/1' do
76
- [200, {}, '{}']
77
- end
78
- stubs.delete '/a/1' do
79
- [204, {}, '{}']
80
- end
81
- end
82
- end
83
-
84
- rel = Sawyer::Relation.new agent, :self, "/a/1", "get,put,delete"
85
- assert_equal :get, rel.method
86
- [:get, :put, :delete].each do |m|
87
- assert rel.available_methods.include?(m), "#{m.inspect} is not available: #{rel.available_methods.inspect}"
88
- end
89
-
90
- assert_equal 200, rel.call.status
91
- assert_equal 200, rel.call(:method => :head).status
92
- assert_equal 204, rel.call(nil, :method => :delete).status
93
- assert_raises ArgumentError do
94
- rel.call nil, :method => :post
95
- end
96
-
97
- assert_equal 200, rel.head.status
98
- assert_equal 200, rel.get.status
99
- assert_equal 204, rel.delete.status
100
-
101
- assert_raises ArgumentError do
102
- rel.post
103
- end
104
- end
105
-
106
- def test_relation_api_calls_with_uri_tempate
107
- agent = Sawyer::Agent.new "http://foo.com/a" do |conn|
108
- conn.builder.handlers.delete(Faraday::Adapter::NetHttp)
109
- conn.adapter :test do |stubs|
110
- stubs.get '/octocat/hello' do |env|
111
- assert_equal "a=1&b=2", env[:url].query
112
- [200, {}, '{}']
113
- end
114
-
115
- stubs.get '/a' do
116
- [404, {}, '{}']
117
- end
118
- end
119
- end
120
-
121
- rel = Sawyer::Relation.new agent, :repo, "{/user,repo}{?a,b}"
122
-
123
- assert_equal '', rel.href
124
- assert_equal '/octocat', rel.href(:user => :octocat)
125
-
126
- assert_equal 404, rel.get.status
127
- assert_equal 200, rel.get(:uri => {'user' => 'octocat', 'repo' => 'hello', 'a' => 1, 'b' => 2}).status
128
- end
129
-
130
- def test_handles_invalid_uri
131
- hash = {:href => '/this has spaces', :method => 'post'}
132
- rel = Sawyer::Relation.from_link(nil, :self, hash)
133
-
134
- assert_equal :self, rel.name
135
- assert_equal '/this has spaces', rel.href
136
- end
137
-
138
- def test_allows_all_methods_when_not_in_strict_mode
139
-
140
- agent = Sawyer::Agent.new "http://foo.com/a/", :allow_undefined_methods => true do |conn|
141
- conn.builder.handlers.delete(Faraday::Adapter::NetHttp)
142
- conn.adapter :test do |stubs|
143
- stubs.get '/a/1' do
144
- [200, {}, '{}']
145
- end
146
- stubs.delete '/a/1' do
147
- [204, {}, '{}']
148
- end
149
- stubs.post '/a/1' do
150
- [200, {}, '{}']
151
- end
152
- stubs.put '/a/1' do
153
- [204, {}, '{}']
154
- end
155
- end
156
- end
157
-
158
- rel = Sawyer::Relation.new agent, :self, "/a/1"
159
- assert_equal 200, rel.get.status
160
- assert_equal 200, rel.post.status
161
- assert_equal 204, rel.put.status
162
- assert_equal 204, rel.delete.status
163
- end
164
-
165
- def test_map_inspect
166
- map = Sawyer::Relation::Map.new
167
- hash = {:href => '/users/1', :method => 'post'}
168
- rel = Sawyer::Relation.from_link(nil, :self, hash)
169
- map << rel
170
-
171
- assert_equal "{:self_url=>\"/users/1\"}", map.inspect
172
- end
173
- end
174
- end
@@ -1,199 +0,0 @@
1
- require File.expand_path("../helper", __FILE__)
2
-
3
- module Sawyer
4
- class ResourceTest < TestCase
5
-
6
- def setup
7
- @stubs = Faraday::Adapter::Test::Stubs.new
8
- @agent = Sawyer::Agent.new "http://foo.com/a/" do |conn|
9
- conn.builder.handlers.delete(Faraday::Adapter::NetHttp)
10
- conn.adapter :test, @stubs
11
- end
12
- end
13
-
14
- def test_accessible_keys
15
- res = Resource.new @agent, :a => 1,
16
- :_links => {:self => {:href => '/'}}
17
-
18
- assert_equal 1, res.a
19
- assert res.rels[:self]
20
- assert_equal @agent, res.agent
21
- assert_equal 1, res.fields.size
22
- assert res.fields.include?(:a)
23
- end
24
-
25
- def test_clashing_keys
26
- res = Resource.new @agent, :agent => 1, :rels => 2, :fields => 3,
27
- :_links => {:self => {:href => '/'}}
28
-
29
- assert_equal 1, res.agent
30
- assert_equal 2, res.rels
31
- assert_equal 3, res.fields
32
-
33
- assert res._rels[:self]
34
- assert_equal @agent, res._agent
35
- assert_equal 3, res._fields.size
36
- [:agent, :rels, :fields].each do |f|
37
- assert res._fields.include?(f)
38
- end
39
- end
40
-
41
- def test_nested_object
42
- res = Resource.new @agent,
43
- :user => {:id => 1, :_links => {:self => {:href => '/users/1'}}},
44
- :_links => {:self => {:href => '/'}}
45
-
46
- assert_equal '/', res.rels[:self].href
47
- assert_kind_of Resource, res.user
48
- assert_equal 1, res.user.id
49
- assert_equal '/users/1', res.user.rels[:self].href
50
- end
51
-
52
- def test_nested_collection
53
- res = Resource.new @agent,
54
- :users => [{:id => 1, :_links => {:self => {:href => '/users/1'}}}],
55
- :_links => {:self => {:href => '/'}}
56
-
57
- assert_equal '/', res.rels[:self].href
58
- assert_kind_of Array, res.users
59
-
60
- assert user = res.users.first
61
- assert_kind_of Resource, user
62
- assert_equal 1, user.id
63
- assert_equal '/users/1', user.rels[:self].href
64
- end
65
-
66
- def test_attribute_predicates
67
- res = Resource.new @agent, :a => 1, :b => true, :c => nil, :d => false
68
-
69
- assert res.a?
70
- assert res.b?
71
- assert !res.c?
72
- assert !res.d?
73
- end
74
-
75
- def test_attribute_setter
76
- res = Resource.new @agent, :a => 1
77
- assert_equal 1, res.a
78
- assert !res.key?(:b)
79
-
80
- res.b = 2
81
- assert_equal 2, res.b
82
- assert res.key?(:b)
83
- end
84
-
85
- def test_dynamic_attribute_methods_from_getter
86
- res = Resource.new @agent, :a => 1
87
- assert res.key?(:a)
88
- assert res.respond_to?(:a)
89
- assert res.respond_to?(:a=)
90
-
91
- assert_equal 1, res.a
92
- assert res.respond_to?(:a)
93
- assert res.respond_to?(:a=)
94
- end
95
-
96
- def test_nillable_attribute_getters
97
- res = Resource.new @agent, :a => 1
98
- assert !res.key?(:b)
99
- assert !res.respond_to?(:b)
100
- assert !res.respond_to?(:b=)
101
- assert_nil res.b
102
- res.b
103
- end
104
-
105
- def test_dynamic_attribute_methods_from_setter
106
- res = Resource.new @agent, :a => 1
107
- assert !res.key?(:b)
108
- assert !res.respond_to?(:b)
109
- assert !res.respond_to?(:b=)
110
-
111
- res.b = 1
112
- assert res.key?(:b)
113
- assert res.respond_to?(:b)
114
- assert res.respond_to?(:b=)
115
- end
116
-
117
- def test_attrs
118
- res = Resource.new @agent, :a => 1
119
- hash = {:a => 1 }
120
- assert_equal hash, res.attrs
121
- end
122
-
123
- def test_to_h
124
- res = Resource.new @agent, :a => 1
125
- hash = {:a => 1 }
126
- assert_equal hash, res.to_h
127
- end
128
-
129
- def test_to_h_with_nesting
130
- res = Resource.new @agent, :a => {:b => 1}
131
- hash = {:a => {:b => 1}}
132
- assert_equal hash, res.to_h
133
- end
134
-
135
- def test_to_attrs_for_sawyer_resource_arrays
136
- res = Resource.new @agent, :a => 1, :b => [Resource.new(@agent, :a => 2)]
137
- hash = {:a => 1, :b => [{:a => 2}]}
138
- assert_equal hash, res.to_attrs
139
- end
140
-
141
- def test_handle_hash_notation_with_string_key
142
- res = Resource.new @agent, :a => 1
143
- assert_equal 1, res['a']
144
-
145
- res[:b] = 2
146
- assert_equal 2, res.b
147
- end
148
-
149
- def test_simple_rel_parsing
150
- @agent.links_parser = Sawyer::LinkParsers::Simple.new
151
- res = Resource.new @agent,
152
- :url => '/',
153
- :user => {
154
- :id => 1,
155
- :url => '/users/1',
156
- :followers_url => '/users/1/followers'
157
- }
158
-
159
- assert_equal '/', res.rels[:self].href
160
- assert_kind_of Resource, res.user
161
- assert_equal '/', res.url
162
- assert_equal 1, res.user.id
163
- assert_equal '/users/1', res.user.rels[:self].href
164
- assert_equal '/users/1', res.user.url
165
- assert_equal '/users/1/followers', res.user.rels[:followers].href
166
- assert_equal '/users/1/followers', res.user.followers_url
167
- end
168
-
169
- def test_handle_yaml_dump
170
- require 'yaml'
171
- res = Resource.new @agent, :a => 1
172
- YAML.dump(res)
173
- end
174
-
175
- def test_handle_marshal_dump
176
- dump = Marshal.dump(Resource.new(@agent, :a => 1))
177
- resource = Marshal.load(dump)
178
- assert_equal 1, resource.a
179
- end
180
-
181
- def test_inspect
182
- resource = Resource.new @agent, :a => 1
183
- assert_equal "{:a=>1}", resource.inspect
184
- end
185
-
186
- def test_each
187
- resource = Resource.new @agent, { :a => 1, :b => 2 }
188
- output = []
189
- resource.each { |k,v| output << [k,v] }
190
- assert_equal [[:a, 1], [:b, 2]], output
191
- end
192
-
193
- def test_enumerable
194
- resource = Resource.new @agent, { :a => 1, :b => 2 }
195
- enum = resource.map
196
- assert_equal Enumerator, enum.class
197
- end
198
- end
199
- end
@@ -1,77 +0,0 @@
1
- require File.expand_path("../helper", __FILE__)
2
-
3
- module Sawyer
4
- class ResponseTest < TestCase
5
- def setup
6
- @now = Time.now
7
- @stubs = Faraday::Adapter::Test::Stubs.new
8
- @agent = Sawyer::Agent.new "http://foo.com" do |conn|
9
- conn.builder.handlers.delete(Faraday::Adapter::NetHttp)
10
- conn.adapter :test, @stubs do |stub|
11
- stub.get '/' do
12
- [200, {
13
- 'Content-Type' => 'application/json',
14
- 'Link' => '</starred?page=2>; rel="next", </starred?page=19>; rel="last"'
15
- }, Sawyer::Agent.encode(
16
- :a => 1,
17
- :_links => {
18
- :self => {:href => '/a', :method => 'POST'}
19
- }
20
- )]
21
- end
22
-
23
- stub.get '/emails' do
24
- emails = %w(rick@example.com technoweenie@example.com)
25
- [200, {'Content-Type' => 'application/json'}, Sawyer::Agent.encode(emails)]
26
- end
27
- end
28
- end
29
-
30
- @res = @agent.start
31
- assert_kind_of Sawyer::Response, @res
32
- end
33
-
34
- def test_gets_status
35
- assert_equal 200, @res.status
36
- end
37
-
38
- def test_gets_headers
39
- assert_equal 'application/json', @res.headers['content-type']
40
- end
41
-
42
- def test_gets_body
43
- assert_equal 1, @res.data.a
44
- assert_equal [:a], @res.data.fields.to_a
45
- end
46
-
47
- def test_gets_rels
48
- assert_equal '/starred?page=2', @res.rels[:next].href
49
- assert_equal :get, @res.rels[:next].method
50
- assert_equal '/starred?page=19', @res.rels[:last].href
51
- assert_equal :get, @res.rels[:next].method
52
- assert_equal '/a', @res.data.rels[:self].href
53
- assert_equal :post, @res.data.rels[:self].method
54
- end
55
-
56
- def test_gets_response_timing
57
- assert @res.timing > 0
58
- assert @res.time >= @now
59
- end
60
-
61
- def test_makes_request_from_relation
62
- @stubs.post '/a' do
63
- [201, {'Content-Type' => 'application/json'}, ""]
64
- end
65
-
66
- res = @res.data.rels[:self].call
67
- assert_equal 201, res.status
68
- assert_nil res.data
69
- end
70
-
71
- def test_handles_arrays_of_strings
72
- res = @agent.call(:get, '/emails')
73
- assert_equal 'rick@example.com', res.data.first
74
- end
75
- end
76
- end
77
-