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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2b7388a3893226c18a95cf03b7f9c11dada6f6bc
4
- data.tar.gz: 617dd5a6f749929bbe26277bfd0ae9b26fe91091
3
+ metadata.gz: 33443c6f3e578e14ecc60fcffe50fb7c27d6ce6b
4
+ data.tar.gz: 60df99b767b5cfe672c6981faeb561e65b7f82ab
5
5
  SHA512:
6
- metadata.gz: bf132d0ea4f5d427c36b79c5a3fa124bad63990eef29e8974252b09658cc78e6e3c0df9e95ed914cb9416a144569a942bccdf7a57c25f2076e19c055324640f0
7
- data.tar.gz: b1dc8341930b7352ff18484f0591c038fc8d4269915195b69b340cbb50bf8a802448f83e9a0c43a18d63e1b30bca32be489d517952d195677ee18c74c81be13c
6
+ metadata.gz: c60ec0246b6bfde509fbcdbde29e382839822113a777d218d1f01a340164d5ab4e141b3cc652a5f04e59806e86b6622bb5b292776d38fa2fb60e5c229be8d0d9
7
+ data.tar.gz: 338143fb8bb70fb2e237a6f25c10748e705260be627d0b9f7ff67a7359d1e50a4c55dd91be0b100895bff9ae7e2fa4d5e569a38c8b9d5aa6414d890aa2761a1e
@@ -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
- request = build_request(method, { :body => body, :params => params })
50
- run(request)
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
- request = build_request(method, { :params => params })
57
- run(request)
56
+ response = build_and_run(method, { :params => params })
57
+ check_response(method, response)
58
58
  end
59
59
  end
60
60
 
61
- private
62
- def build_request(method, options = {})
63
- body = options[:body].nil? || options[:body].empty? ? nil : options[:body].to_json
64
- params = @options[:params].merge(options[:params] || {})
65
-
66
- opts = @options
67
- request_uri = uri
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
- @options[:middleware].each do |mw|
70
- opts, request_uri, method, params, body = mw.call(opts, request_uri, method, params, body)
71
- end
71
+ request = ::Typhoeus::Request.new(request_uri, request_hash)
72
+ response = request.run
72
73
 
73
- request_hash = { :method => method }
74
- request_hash[:params] = params
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
- return ::Typhoeus::Request.new(request_uri, request_hash)
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
- def postprocessing(data, processing = nil)
84
- return data if @options[:postprocessing].nil? || @options[:postprocessing].empty?
84
+ return Response.new(response)
85
+ end
85
86
 
86
- if data.kind_of?(Hash)
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
- data[key] = postprocessing(value, processing)
96
- end
97
- elsif data.kind_of?(Array)
98
- data.each_with_index do |value, index|
99
- data[index] = postprocessing(value, processing)
100
- end
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
- data = processing.nil? ? data : processing.call(data)
105
+ callee = mw.new(callee)
103
106
  end
104
-
105
- return data
106
107
  end
107
108
 
108
- def run(request)
109
- response = request.run
109
+ return callee
110
+ end
110
111
 
111
- # Retry GET and HEAD requests - modifying requests might not be idempotent
112
- method = request.options[:method].to_s.downcase
113
- response = request.run if response.timed_out? && ['get', 'head'].include?(method)
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
- # A request can time out while receiving data. In this case response.code might indicate
116
- # success although data hasn't been fully transferred. Thus rely on Typhoeus for
117
- # detecting a timeout.
118
- if response.timed_out?
119
- raise Exception::ServiceTimeout.new(method, request.url, response.return_message)
120
- end
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
- grac_response = Response.new(response)
123
- case response.code
124
- when 200..203, 206..299
125
- # unknown status codes must be treated as the x00 of their class, so 200
126
- if grac_response.json_content?
127
- return postprocessing(grac_response.parsed_json)
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
- return grac_response.body
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
@@ -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 = typhoeus_response
17
+ @response = typhoeus_response
14
18
  end
15
19
 
16
20
  def content_type
@@ -1,3 +1,3 @@
1
1
  module Grac
2
- VERSION = "2.1.0"
2
+ VERSION = "2.2.0"
3
3
  end
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.1.0
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-22 00:00:00.000000000 Z
11
+ date: 2016-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake