sawyer 0.0.3 → 0.0.4
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.
- data/lib/sawyer.rb +2 -1
- data/lib/sawyer/agent.rb +28 -5
- data/lib/sawyer/response.rb +0 -2
- data/lib/sawyer/serializer.rb +106 -0
- data/sawyer.gemspec +3 -3
- data/test/agent_test.rb +2 -2
- data/test/response_test.rb +1 -1
- metadata +6 -18
data/lib/sawyer.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Sawyer
|
2
|
-
VERSION = "0.0.
|
2
|
+
VERSION = "0.0.4"
|
3
3
|
|
4
4
|
class Error < StandardError; end
|
5
5
|
end
|
@@ -10,5 +10,6 @@ require 'set'
|
|
10
10
|
resource
|
11
11
|
relation
|
12
12
|
response
|
13
|
+
serializer
|
13
14
|
agent
|
14
15
|
).each { |f| require File.expand_path("../sawyer/#{f}", __FILE__) }
|
data/lib/sawyer/agent.rb
CHANGED
@@ -3,15 +3,38 @@ require 'uri_template'
|
|
3
3
|
|
4
4
|
module Sawyer
|
5
5
|
class Agent
|
6
|
-
NO_BODY = Set.new
|
6
|
+
NO_BODY = Set.new([:get, :head])
|
7
|
+
|
8
|
+
class << self
|
9
|
+
attr_writer :serializer
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.serializer
|
13
|
+
@serializer ||= Serializer.any_json
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.encode(data)
|
17
|
+
serializer.encode(data)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.decode(data)
|
21
|
+
serializer.decode(data)
|
22
|
+
end
|
7
23
|
|
8
24
|
# Agents handle making the requests, and passing responses to
|
9
25
|
# Sawyer::Response.
|
10
26
|
#
|
11
27
|
# endpoint - String URI of the API entry point.
|
12
|
-
|
28
|
+
# options - Hash of options.
|
29
|
+
# :faraday - Optional Faraday::Connection to use.
|
30
|
+
# :serializer - Optional serializer Class. Defaults to
|
31
|
+
# self.serializer_class.
|
32
|
+
#
|
33
|
+
# Yields the Faraday::Connection if a block is given.
|
34
|
+
def initialize(endpoint, options = nil)
|
13
35
|
@endpoint = endpoint
|
14
|
-
@conn
|
36
|
+
@conn = (options && options[:faraday]) || Faraday.new(endpoint)
|
37
|
+
@serializer = (options && options[:serializer]) || self.class.serializer
|
15
38
|
yield @conn if block_given?
|
16
39
|
end
|
17
40
|
|
@@ -80,7 +103,7 @@ module Sawyer
|
|
80
103
|
#
|
81
104
|
# Returns a String.
|
82
105
|
def encode_body(data)
|
83
|
-
|
106
|
+
@serializer.encode(data)
|
84
107
|
end
|
85
108
|
|
86
109
|
# Decodes a String response body to a resource.
|
@@ -89,7 +112,7 @@ module Sawyer
|
|
89
112
|
#
|
90
113
|
# Returns an Object resource (Hash by default).
|
91
114
|
def decode_body(str)
|
92
|
-
|
115
|
+
@serializer.decode(str)
|
93
116
|
end
|
94
117
|
|
95
118
|
def expand_url(url, options = nil)
|
data/lib/sawyer/response.rb
CHANGED
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'time'
|
3
|
+
|
4
|
+
module Sawyer
|
5
|
+
class Serializer
|
6
|
+
def self.any_json
|
7
|
+
yajl || multi_json || json
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.yajl
|
11
|
+
require 'yajl'
|
12
|
+
new(Yajl)
|
13
|
+
rescue LoadError
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.json
|
17
|
+
require 'json'
|
18
|
+
new(JSON)
|
19
|
+
rescue LoadError
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.multi_json
|
23
|
+
require 'multi_json'
|
24
|
+
new(MultiJson)
|
25
|
+
rescue LoadError
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.message_pack
|
29
|
+
require 'msgpack'
|
30
|
+
new(MessagePack, :pack, :unpack)
|
31
|
+
rescue LoadError
|
32
|
+
end
|
33
|
+
|
34
|
+
# Public: Wraps a serialization format for Sawyer. Nested objects are
|
35
|
+
# prepared for serialization (such as changing Times to ISO 8601 Strings).
|
36
|
+
# Any serialization format that responds to #dump and #load will work.
|
37
|
+
def initialize(format, dump_method_name = nil, load_method_name = nil)
|
38
|
+
@format = format
|
39
|
+
@dump = @format.method(dump_method_name || :dump)
|
40
|
+
@load = @format.method(load_method_name || :load)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Public: Encodes an Object (usually a Hash or Array of Hashes).
|
44
|
+
#
|
45
|
+
# data - Object to be encoded.
|
46
|
+
#
|
47
|
+
# Returns an encoded String.
|
48
|
+
def encode(data)
|
49
|
+
@dump.call(encode_object(data))
|
50
|
+
end
|
51
|
+
|
52
|
+
# Public: Decodes a String into an Object (usually a Hash or Array of
|
53
|
+
# Hashes).
|
54
|
+
#
|
55
|
+
# data - An encoded String.
|
56
|
+
#
|
57
|
+
# Returns a decoded Object.
|
58
|
+
def decode(data)
|
59
|
+
return nil if data.nil? || data.empty?
|
60
|
+
decode_object(@load.call(data))
|
61
|
+
end
|
62
|
+
|
63
|
+
def encode_object(data)
|
64
|
+
case data
|
65
|
+
when Hash then encode_hash(data)
|
66
|
+
when Array then data.map { |o| encode_object(data) }
|
67
|
+
else data
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def encode_hash(hash)
|
72
|
+
hash.keys.each do |key|
|
73
|
+
case value = hash[key]
|
74
|
+
when Date then hash[key] = value.to_time.utc.xmlschema
|
75
|
+
when Time then hash[key] = value.utc.xmlschema
|
76
|
+
end
|
77
|
+
end
|
78
|
+
hash
|
79
|
+
end
|
80
|
+
|
81
|
+
def decode_object(data)
|
82
|
+
case data
|
83
|
+
when Hash then decode_hash(data)
|
84
|
+
when Array then data.map { |o| decode_object(data) }
|
85
|
+
else data
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def decode_hash(hash)
|
90
|
+
hash.keys.each do |key|
|
91
|
+
hash[key.to_sym] = decode_hash_value(key, hash.delete(key))
|
92
|
+
end
|
93
|
+
hash
|
94
|
+
end
|
95
|
+
|
96
|
+
def decode_hash_value(key, value)
|
97
|
+
if key =~ /^_(at|on)$/
|
98
|
+
Time.parse(value)
|
99
|
+
elsif value.is_a?(Hash)
|
100
|
+
decode_hash(value)
|
101
|
+
else
|
102
|
+
value
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
data/sawyer.gemspec
CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
|
|
13
13
|
## If your rubyforge_project name is different, then edit it and comment out
|
14
14
|
## the sub! line in the Rakefile
|
15
15
|
s.name = 'sawyer'
|
16
|
-
s.version = '0.0.
|
17
|
-
s.date = '2012-09-
|
16
|
+
s.version = '0.0.4'
|
17
|
+
s.date = '2012-09-27'
|
18
18
|
s.rubyforge_project = 'sawyer'
|
19
19
|
|
20
20
|
## Make sure your summary is short. The description may be as long
|
@@ -37,7 +37,6 @@ Gem::Specification.new do |s|
|
|
37
37
|
## that are needed for an end user to actually USE your code.
|
38
38
|
s.add_dependency('faraday', ['~> 0.8.4'])
|
39
39
|
s.add_dependency('uri_template', ['~> 0.5.0'])
|
40
|
-
s.add_dependency('yajl-ruby', ['~> 1.1.0'])
|
41
40
|
|
42
41
|
## List your development dependencies here. Development dependencies are
|
43
42
|
## those that are only needed during development
|
@@ -62,6 +61,7 @@ Gem::Specification.new do |s|
|
|
62
61
|
lib/sawyer/relation.rb
|
63
62
|
lib/sawyer/resource.rb
|
64
63
|
lib/sawyer/response.rb
|
64
|
+
lib/sawyer/serializer.rb
|
65
65
|
sawyer.gemspec
|
66
66
|
test/agent_test.rb
|
67
67
|
test/helper.rb
|
data/test/agent_test.rb
CHANGED
@@ -14,7 +14,7 @@ module Sawyer
|
|
14
14
|
@stubs.get '/a/' do |env|
|
15
15
|
assert_equal 'foo.com', env[:url].host
|
16
16
|
|
17
|
-
[200, {},
|
17
|
+
[200, {}, Sawyer::Agent.encode(
|
18
18
|
:_links => {
|
19
19
|
:users => {:href => '/users'}})]
|
20
20
|
end
|
@@ -38,7 +38,7 @@ module Sawyer
|
|
38
38
|
@stubs.get '/a/' do |env|
|
39
39
|
assert_equal 'foo.com', env[:url].host
|
40
40
|
|
41
|
-
[200, {},
|
41
|
+
[200, {}, Sawyer::Agent.encode(
|
42
42
|
:_links => {
|
43
43
|
:users => {:href => '/users'}})]
|
44
44
|
end
|
data/test/response_test.rb
CHANGED
@@ -9,7 +9,7 @@ module Sawyer
|
|
9
9
|
conn.builder.handlers.delete(Faraday::Adapter::NetHttp)
|
10
10
|
conn.adapter :test, @stubs do |stub|
|
11
11
|
stub.get '/' do
|
12
|
-
[200, {'Content-Type' => 'application/json'},
|
12
|
+
[200, {'Content-Type' => 'application/json'}, Sawyer::Agent.encode(
|
13
13
|
:a => 1,
|
14
14
|
:_links => {
|
15
15
|
:self => {:href => '/a', :method => 'POST'}
|
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.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -43,22 +43,6 @@ dependencies:
|
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: 0.5.0
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: yajl-ruby
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ~>
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: 1.1.0
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 1.1.0
|
62
46
|
description: Secret User Agent of HTTP built on Faraday
|
63
47
|
email: technoweenie@gmail.com
|
64
48
|
executables: []
|
@@ -79,6 +63,7 @@ files:
|
|
79
63
|
- lib/sawyer/relation.rb
|
80
64
|
- lib/sawyer/resource.rb
|
81
65
|
- lib/sawyer/response.rb
|
66
|
+
- lib/sawyer/serializer.rb
|
82
67
|
- sawyer.gemspec
|
83
68
|
- test/agent_test.rb
|
84
69
|
- test/helper.rb
|
@@ -97,6 +82,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
97
82
|
- - ! '>='
|
98
83
|
- !ruby/object:Gem::Version
|
99
84
|
version: '0'
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
hash: -3466190819871303014
|
100
88
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
89
|
none: false
|
102
90
|
requirements:
|