grac 2.1.0 → 2.2.0
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 +4 -4
- data/lib/grac/client.rb +89 -74
- data/lib/grac/response.rb +5 -1
- data/lib/grac/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33443c6f3e578e14ecc60fcffe50fb7c27d6ce6b
|
4
|
+
data.tar.gz: 60df99b767b5cfe672c6981faeb561e65b7f82ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c60ec0246b6bfde509fbcdbde29e382839822113a777d218d1f01a340164d5ab4e141b3cc652a5f04e59806e86b6622bb5b292776d38fa2fb60e5c229be8d0d9
|
7
|
+
data.tar.gz: 338143fb8bb70fb2e237a6f25c10748e705260be627d0b9f7ff67a7359d1e50a4c55dd91be0b100895bff9ae7e2fa4d5e569a38c8b9d5aa6414d890aa2761a1e
|
data/lib/grac/client.rb
CHANGED
@@ -19,7 +19,7 @@ module Grac
|
|
19
19
|
:params => options[:params] || {},
|
20
20
|
:headers => { "User-Agent" => "Grac v#{Grac::VERSION}" }.merge(options[:headers] || {}),
|
21
21
|
:postprocessing => options[:postprocessing] || {},
|
22
|
-
:middleware => options[:middleware]
|
22
|
+
:middleware => options[:middleware] || []
|
23
23
|
}
|
24
24
|
@options.freeze
|
25
25
|
[:params, :headers, :postprocessing, :middleware].each do |k|
|
@@ -30,7 +30,7 @@ module Grac
|
|
30
30
|
|
31
31
|
def set(options = {})
|
32
32
|
options = options.merge({
|
33
|
-
headers: @options[:headers].merge(options[:headers]
|
33
|
+
headers: @options[:headers].merge(options[:headers] || {}),
|
34
34
|
middleware: @options[:middleware] + (options[:middleware] || [])
|
35
35
|
})
|
36
36
|
|
@@ -46,103 +46,118 @@ module Grac
|
|
46
46
|
|
47
47
|
%w{post put patch}.each do |method|
|
48
48
|
define_method method do |body = {}, params = {}|
|
49
|
-
|
50
|
-
|
49
|
+
response = build_and_run(method, { :body => body, :params => params })
|
50
|
+
check_response(method, response)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
54
|
%w{get delete}.each do |method|
|
55
55
|
define_method method do |params = {}|
|
56
|
-
|
57
|
-
|
56
|
+
response = build_and_run(method, { :params => params })
|
57
|
+
check_response(method, response)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
params
|
65
|
-
|
66
|
-
opts
|
67
|
-
|
61
|
+
def call(opts, request_uri, method, params, body)
|
62
|
+
request_hash = {
|
63
|
+
:method => method,
|
64
|
+
:params => params,
|
65
|
+
:body => body,
|
66
|
+
:connecttimeout => opts[:connecttimeout],
|
67
|
+
:timeout => opts[:timeout],
|
68
|
+
:headers => opts[:headers]
|
69
|
+
}
|
68
70
|
|
69
|
-
|
70
|
-
|
71
|
-
end
|
71
|
+
request = ::Typhoeus::Request.new(request_uri, request_hash)
|
72
|
+
response = request.run
|
72
73
|
|
73
|
-
|
74
|
-
|
75
|
-
request_hash[:body] = body
|
76
|
-
request_hash[:connecttimeout] = opts[:connecttimeout]
|
77
|
-
request_hash[:timeout] = opts[:timeout]
|
78
|
-
request_hash[:headers] = opts[:headers]
|
74
|
+
# Retry GET and HEAD requests - modifying requests might not be idempotent
|
75
|
+
response = request.run if response.timed_out? && ['get', 'head'].include?(method)
|
79
76
|
|
80
|
-
|
77
|
+
# A request can time out while receiving data. In this case response.code might indicate
|
78
|
+
# success although data hasn't been fully transferred. Thus rely on Typhoeus for
|
79
|
+
# detecting a timeout.
|
80
|
+
if response.timed_out?
|
81
|
+
raise Exception::ServiceTimeout.new(method, request.url, response.return_message)
|
81
82
|
end
|
82
83
|
|
83
|
-
|
84
|
-
|
84
|
+
return Response.new(response)
|
85
|
+
end
|
85
86
|
|
86
|
-
|
87
|
-
data.each do |key, value|
|
88
|
-
processing = nil
|
89
|
-
@options[:postprocessing].each do |regex, action|
|
90
|
-
if /#{regex}/ =~ key
|
91
|
-
processing = action
|
92
|
-
end
|
93
|
-
end
|
87
|
+
private
|
94
88
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
89
|
+
def build_and_run(method, options = {})
|
90
|
+
body = options[:body].nil? || options[:body].empty? ? nil : options[:body].to_json
|
91
|
+
params = @options[:params].merge(options[:params] || {})
|
92
|
+
return middleware_chain.call(@options, uri, method, params, body)
|
93
|
+
end
|
94
|
+
|
95
|
+
def middleware_chain
|
96
|
+
callee = self
|
97
|
+
|
98
|
+
@options[:middleware].reverse.each do |mw|
|
99
|
+
if mw.kind_of?(Array)
|
100
|
+
middleware_class = mw[0]
|
101
|
+
params = mw[1..-1]
|
102
|
+
|
103
|
+
callee = middleware_class.new(callee, *params)
|
101
104
|
else
|
102
|
-
|
105
|
+
callee = mw.new(callee)
|
103
106
|
end
|
104
|
-
|
105
|
-
return data
|
106
107
|
end
|
107
108
|
|
108
|
-
|
109
|
-
|
109
|
+
return callee
|
110
|
+
end
|
110
111
|
|
111
|
-
|
112
|
-
|
113
|
-
|
112
|
+
def check_response(method, response)
|
113
|
+
case response.code
|
114
|
+
when 200..203, 206..299
|
115
|
+
# unknown status codes must be treated as the x00 of their class, so 200
|
116
|
+
if response.json_content?
|
117
|
+
return postprocessing(response.parsed_json)
|
118
|
+
end
|
114
119
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
raise Exception::
|
120
|
-
|
120
|
+
return response.body
|
121
|
+
when 204, 205
|
122
|
+
return true
|
123
|
+
when 0
|
124
|
+
raise Exception::RequestFailed.new(method, response.effective_url, response.return_message)
|
125
|
+
when 400
|
126
|
+
raise Exception::BadRequest.new(method, response.effective_url, response.parsed_or_raw_body)
|
127
|
+
when 403
|
128
|
+
raise Exception::Forbidden.new(method, response.effective_url, response.parsed_or_raw_body)
|
129
|
+
when 404
|
130
|
+
raise Exception::NotFound.new(method, response.effective_url, response.parsed_or_raw_body)
|
131
|
+
when 409
|
132
|
+
raise Exception::Conflict.new(method, response.effective_url, response.parsed_or_raw_body)
|
133
|
+
else
|
134
|
+
raise Exception::ServiceError.new(method, response.effective_url, response.parsed_or_raw_body)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def postprocessing(data, processing = nil)
|
139
|
+
return data if @options[:postprocessing].nil? || @options[:postprocessing].empty?
|
121
140
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
if
|
127
|
-
|
141
|
+
if data.kind_of?(Hash)
|
142
|
+
data.each do |key, value|
|
143
|
+
processing = nil
|
144
|
+
@options[:postprocessing].each do |regex, action|
|
145
|
+
if /#{regex}/ =~ key
|
146
|
+
processing = action
|
128
147
|
end
|
148
|
+
end
|
129
149
|
|
130
|
-
|
131
|
-
when 204, 205
|
132
|
-
return true
|
133
|
-
when 0
|
134
|
-
raise Exception::RequestFailed.new(method, request.url, response.return_message)
|
135
|
-
when 400
|
136
|
-
raise Exception::BadRequest.new(method, request.url, grac_response.parsed_or_raw_body)
|
137
|
-
when 403
|
138
|
-
raise Exception::Forbidden.new(method, request.url, grac_response.parsed_or_raw_body)
|
139
|
-
when 404
|
140
|
-
raise Exception::NotFound.new(method, request.url, grac_response.parsed_or_raw_body)
|
141
|
-
when 409
|
142
|
-
raise Exception::Conflict.new(method, request.url, grac_response.parsed_or_raw_body)
|
143
|
-
else
|
144
|
-
raise Exception::ServiceError.new(method, request.url, grac_response.parsed_or_raw_body)
|
150
|
+
data[key] = postprocessing(value, processing)
|
145
151
|
end
|
152
|
+
elsif data.kind_of?(Array)
|
153
|
+
data.each_with_index do |value, index|
|
154
|
+
data[index] = postprocessing(value, processing)
|
155
|
+
end
|
156
|
+
else
|
157
|
+
data = processing.nil? ? data : processing.call(data)
|
146
158
|
end
|
159
|
+
|
160
|
+
return data
|
161
|
+
end
|
147
162
|
end
|
148
163
|
end
|
data/lib/grac/response.rb
CHANGED
@@ -8,9 +8,13 @@ module Grac
|
|
8
8
|
extend Forwardable
|
9
9
|
|
10
10
|
def_delegator :@response, :body
|
11
|
+
def_delegator :@response, :code
|
12
|
+
def_delegator :@response, :effective_url
|
13
|
+
def_delegator :@response, :headers
|
14
|
+
def_delegator :@response, :return_message
|
11
15
|
|
12
16
|
def initialize(typhoeus_response)
|
13
|
-
@response
|
17
|
+
@response = typhoeus_response
|
14
18
|
end
|
15
19
|
|
16
20
|
def content_type
|
data/lib/grac/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grac
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Schoknecht
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02
|
11
|
+
date: 2016-03-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|