grac 2.1.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|