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 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