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 +5 -5
- data/README.md +53 -10
- data/lib/sawyer.rb +1 -1
- data/lib/sawyer/relation.rb +1 -0
- data/lib/sawyer/response.rb +11 -3
- data/lib/sawyer/serializer.rb +3 -1
- data/sawyer.gemspec +2 -3
- metadata +7 -19
- data/test/agent_test.rb +0 -195
- data/test/helper.rb +0 -7
- data/test/relation_test.rb +0 -174
- data/test/resource_test.rb +0 -199
- data/test/response_test.rb +0 -77
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 23f3bc01fedbd455c77a935f6f4de0a6adb6e743d9b6403c92e8d756bd737527
|
4
|
+
data.tar.gz: fd376d24589522cdc89fcedf39e1d8ad122625ad81565eb99386280eb7c6d925
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
-
|
7
|
+
## Installation
|
9
8
|
|
10
|
-
|
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
|
-
|
11
|
+
```ruby
|
12
|
+
gem 'sawyer'
|
13
|
+
```
|
16
14
|
|
17
|
-
|
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).
|
data/lib/sawyer.rb
CHANGED
data/lib/sawyer/relation.rb
CHANGED
data/lib/sawyer/response.rb
CHANGED
@@ -3,7 +3,8 @@ module Sawyer
|
|
3
3
|
attr_reader :agent,
|
4
4
|
:status,
|
5
5
|
:headers,
|
6
|
-
:
|
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
|
-
@
|
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=#{
|
69
|
+
%(#<#{self.class}: #{@status} @rels=#{@rels.inspect} @data=#{data.inspect}>)
|
62
70
|
end
|
63
71
|
end
|
64
72
|
end
|
data/lib/sawyer/serializer.rb
CHANGED
data/sawyer.gemspec
CHANGED
@@ -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', ['
|
21
|
-
spec.add_dependency 'addressable', ['>= 2.3.5'
|
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.
|
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:
|
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: '
|
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: '
|
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.
|
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:
|
data/test/agent_test.rb
DELETED
@@ -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
|
data/test/helper.rb
DELETED
data/test/relation_test.rb
DELETED
@@ -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
|
data/test/resource_test.rb
DELETED
@@ -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
|
data/test/response_test.rb
DELETED
@@ -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
|
-
|