apidiesel 0.9 → 0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/apidiesel/action.rb +18 -3
- data/lib/apidiesel/api.rb +25 -26
- data/lib/apidiesel/dsl.rb +9 -6
- data/lib/apidiesel/handlers/http_request_helper.rb +6 -2
- data/lib/apidiesel/handlers/json.rb +27 -0
- data/lib/apidiesel/handlers.rb +28 -0
- data/lib/apidiesel/request.rb +11 -1
- data/lib/apidiesel/version.rb +1 -1
- data/lib/apidiesel.rb +2 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: abd698dc7975148cd9d24f1a365abb1e21dcf873
|
4
|
+
data.tar.gz: 28f247075558965d6c68c59a3fa0afe9fc899ea4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dd5aac9aa74b83ef5a14bf1537ae97893db4f768b099464fefe0af1094da9246691e7c695543b3dfd60453f53f0e0902a23d997c9df16ffb92a2d640ca70200
|
7
|
+
data.tar.gz: 6f761f94ba751451f2f2fa42243bd0a54325e97f7bff55b362545f7f3f3830953df807321a0cd99dafee75b1f673c0659ea83e6d83d0b694a23f04e4275f8714
|
data/lib/apidiesel/action.rb
CHANGED
@@ -7,6 +7,8 @@ module Apidiesel
|
|
7
7
|
# accessors for class instance variables
|
8
8
|
# (class-level variables, not shared with subclasses)
|
9
9
|
class << self
|
10
|
+
include Handlers
|
11
|
+
|
10
12
|
attr_reader :url_args
|
11
13
|
|
12
14
|
# Hash for storing validation closures. These closures are called with the request
|
@@ -53,7 +55,9 @@ module Apidiesel
|
|
53
55
|
def url(value = nil, **args)
|
54
56
|
return @url unless value || args.any?
|
55
57
|
|
56
|
-
if value
|
58
|
+
if value && value.is_a?(Proc)
|
59
|
+
@url = value
|
60
|
+
elsif value
|
57
61
|
@url = URI.parse(value)
|
58
62
|
else
|
59
63
|
@url_args = args
|
@@ -124,10 +128,21 @@ module Apidiesel
|
|
124
128
|
self.class.endpoint
|
125
129
|
end
|
126
130
|
|
131
|
+
def base_url
|
132
|
+
if self.class.url.nil? || self.class.url.is_a?(Proc)
|
133
|
+
@api.class.url.dup
|
134
|
+
else
|
135
|
+
self.class.url.dup
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
127
139
|
def url
|
128
|
-
|
140
|
+
if self.class.url.is_a?(Proc)
|
141
|
+
url = self.class.url
|
142
|
+
|
143
|
+
elsif self.class.url_args
|
144
|
+
url = base_url
|
129
145
|
|
130
|
-
if self.class.url_args
|
131
146
|
self.class.url_args.each do |key, value|
|
132
147
|
url.send("#{key}=", value)
|
133
148
|
end
|
data/lib/apidiesel/api.rb
CHANGED
@@ -26,17 +26,7 @@ module Apidiesel
|
|
26
26
|
#
|
27
27
|
class Api
|
28
28
|
class << self
|
29
|
-
|
30
|
-
@request_handlers ||= []
|
31
|
-
end
|
32
|
-
|
33
|
-
def response_handlers
|
34
|
-
@response_handlers ||= []
|
35
|
-
end
|
36
|
-
|
37
|
-
def exception_handlers
|
38
|
-
@exception_handlers ||= []
|
39
|
-
end
|
29
|
+
include Handlers
|
40
30
|
|
41
31
|
def config(key = nil, value = nil)
|
42
32
|
@config ||= {}
|
@@ -74,18 +64,18 @@ module Apidiesel
|
|
74
64
|
end
|
75
65
|
end
|
76
66
|
|
77
|
-
#
|
67
|
+
# Combined getter/setter for the HTTP Basic Auth
|
78
68
|
#
|
79
|
-
#
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
69
|
+
# Falls back to the Api setting if blank.
|
70
|
+
#
|
71
|
+
# @param [String] value
|
72
|
+
def http_basic_auth(username = nil, password = nil)
|
73
|
+
if username && password
|
74
|
+
config[:http_basic_username] = username
|
75
|
+
config[:http_basic_password] = password
|
76
|
+
else
|
77
|
+
return config[:http_basic_username], config[:http_basic_password]
|
78
|
+
end
|
89
79
|
end
|
90
80
|
|
91
81
|
# Registers the individual API endpoint definitions
|
@@ -120,7 +110,13 @@ module Apidiesel
|
|
120
110
|
def execute_request(action_klass, *args)
|
121
111
|
request = action_klass.new(self).build_request(*args)
|
122
112
|
|
123
|
-
|
113
|
+
request_handlers =
|
114
|
+
action_klass.request_handlers.any? ? action_klass.request_handlers : self.class.request_handlers
|
115
|
+
|
116
|
+
response_handlers =
|
117
|
+
action_klass.response_handlers.any? ? action_klass.response_handlers : self.class.response_handlers
|
118
|
+
|
119
|
+
request_handlers.each do |handler|
|
124
120
|
request = handler.run(request, @config)
|
125
121
|
break if request.response_body.present?
|
126
122
|
end
|
@@ -129,12 +125,12 @@ module Apidiesel
|
|
129
125
|
raise "All request handlers failed to deliver a response"
|
130
126
|
end
|
131
127
|
|
132
|
-
|
128
|
+
response_handlers.each do |handler|
|
133
129
|
request = handler.run(request, @config)
|
134
130
|
end
|
135
131
|
|
136
132
|
response_handler_klasses =
|
137
|
-
|
133
|
+
response_handlers.collect { |handler| handler.class.name.split('::')[-2] }
|
138
134
|
|
139
135
|
# Execute the actions' `responds_with` block automatically, unless
|
140
136
|
# the handler has been included manually in order to control the
|
@@ -145,7 +141,10 @@ module Apidiesel
|
|
145
141
|
|
146
142
|
request
|
147
143
|
rescue => e
|
148
|
-
|
144
|
+
exception_handlers =
|
145
|
+
action_klass.exception_handlers.any? ? action_klass.exception_handlers : self.class.exception_handlers
|
146
|
+
|
147
|
+
exception_handlers.each do |handler|
|
149
148
|
request = handler.run(e, request, @config)
|
150
149
|
end
|
151
150
|
|
data/lib/apidiesel/dsl.rb
CHANGED
@@ -369,7 +369,7 @@ module Apidiesel
|
|
369
369
|
# integer :order_id
|
370
370
|
# datetime :ordered_at
|
371
371
|
#
|
372
|
-
#
|
372
|
+
# array :products do
|
373
373
|
# string :name
|
374
374
|
# integer :product_id
|
375
375
|
# end
|
@@ -390,7 +390,7 @@ module Apidiesel
|
|
390
390
|
#
|
391
391
|
# @example
|
392
392
|
# expects do
|
393
|
-
#
|
393
|
+
# array do
|
394
394
|
# string :name
|
395
395
|
# integer :order_id
|
396
396
|
# end
|
@@ -410,7 +410,7 @@ module Apidiesel
|
|
410
410
|
args = normalize_arguments(args, kargs)
|
411
411
|
|
412
412
|
response_formatters << lambda do |data, processed_data|
|
413
|
-
data = get_value(data, args[:at])
|
413
|
+
data = get_value(data, args[:at]) if args[:at]
|
414
414
|
|
415
415
|
return processed_data unless data.present?
|
416
416
|
|
@@ -438,9 +438,12 @@ module Apidiesel
|
|
438
438
|
result
|
439
439
|
end
|
440
440
|
|
441
|
-
|
442
|
-
|
443
|
-
|
441
|
+
if args[:as]
|
442
|
+
processed_data[ args[:as] ] = array_of_hashes.compact
|
443
|
+
processed_data
|
444
|
+
else
|
445
|
+
array_of_hashes.compact
|
446
|
+
end
|
444
447
|
end
|
445
448
|
end
|
446
449
|
|
@@ -11,9 +11,13 @@ module Apidiesel
|
|
11
11
|
# instance, as given to the handlers #run method
|
12
12
|
#
|
13
13
|
def execute_request(request:, payload:, api_config:)
|
14
|
-
http_request = HTTPI::Request.new(request.
|
14
|
+
http_request = HTTPI::Request.new(request.url.try(:to_s))
|
15
15
|
http_request.body = payload
|
16
16
|
|
17
|
+
if api_config[:http_basic_username] && api_config[:http_basic_password]
|
18
|
+
http_request.auth.basic(api_config[:http_basic_username], api_config[:http_basic_password])
|
19
|
+
end
|
20
|
+
|
17
21
|
http_request.auth.ssl.verify_mode = api_config[:ssl_verify_mode] || :peer
|
18
22
|
http_request.open_timeout = api_config[:timeout] || 30
|
19
23
|
http_request.read_timeout = api_config[:timeout] || 30
|
@@ -28,7 +32,7 @@ module Apidiesel
|
|
28
32
|
end
|
29
33
|
|
30
34
|
if response.error?
|
31
|
-
raise RequestError.new("#{request.action.http_method} #{request.
|
35
|
+
raise RequestError.new("#{request.action.http_method} #{request.url} returned #{response.code}", request)
|
32
36
|
end
|
33
37
|
|
34
38
|
request
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Apidiesel
|
2
|
+
module Handlers
|
3
|
+
module JSON
|
4
|
+
class RequestHandler
|
5
|
+
include HttpRequestHelper
|
6
|
+
|
7
|
+
def run(request, api_config)
|
8
|
+
action = request.action
|
9
|
+
|
10
|
+
payload = ::JSON.dump(request.parameters)
|
11
|
+
|
12
|
+
request.metadata[:started_at] = DateTime.now
|
13
|
+
|
14
|
+
execute_request(request: request,
|
15
|
+
payload: payload,
|
16
|
+
api_config: api_config)
|
17
|
+
|
18
|
+
request.metadata[:finished_at] = DateTime.now
|
19
|
+
|
20
|
+
request.response_body = ::JSON.parse(request.http_response.body)
|
21
|
+
|
22
|
+
request
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Apidiesel
|
2
|
+
module Handlers
|
3
|
+
def request_handlers
|
4
|
+
@request_handlers ||= []
|
5
|
+
end
|
6
|
+
|
7
|
+
def response_handlers
|
8
|
+
@response_handlers ||= []
|
9
|
+
end
|
10
|
+
|
11
|
+
def exception_handlers
|
12
|
+
@exception_handlers ||= []
|
13
|
+
end
|
14
|
+
|
15
|
+
# Registers a handler for requests, responses and/or exceptions
|
16
|
+
#
|
17
|
+
# @param [Class] klass
|
18
|
+
def use(klass, *args, &block)
|
19
|
+
request_handler = "#{klass.name}::RequestHandler".safe_constantize
|
20
|
+
response_handler = "#{klass.name}::ResponseHandler".safe_constantize
|
21
|
+
exception_handler = "#{klass.name}::ExceptionHandler".safe_constantize
|
22
|
+
|
23
|
+
request_handlers << request_handler.new(*args, &block) if request_handler
|
24
|
+
response_handlers << response_handler.new(*args, &block) if response_handler
|
25
|
+
exception_handlers << exception_handler.new(*args, &block) if exception_handler
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/apidiesel/request.rb
CHANGED
@@ -13,6 +13,16 @@ module Apidiesel
|
|
13
13
|
@metadata = metadata
|
14
14
|
end
|
15
15
|
|
16
|
+
def url
|
17
|
+
@url ||=
|
18
|
+
case action.url
|
19
|
+
when Proc
|
20
|
+
action.url.call(action.base_url, self)
|
21
|
+
when URI
|
22
|
+
action.url
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
16
26
|
def response_body
|
17
27
|
@response_body || http_response.try(:body)
|
18
28
|
end
|
@@ -31,7 +41,7 @@ module Apidiesel
|
|
31
41
|
[
|
32
42
|
"Apidiesel::Request",
|
33
43
|
action.http_method.to_s.upcase,
|
34
|
-
|
44
|
+
url.try(:to_s),
|
35
45
|
action.endpoint,
|
36
46
|
parameters.collect { |key, value| "#{key}: #{value}"}.join(',')
|
37
47
|
].join(' ')
|
data/lib/apidiesel/version.rb
CHANGED
data/lib/apidiesel.rb
CHANGED
@@ -6,10 +6,12 @@ HTTPI.log = false
|
|
6
6
|
require 'apidiesel/version'
|
7
7
|
|
8
8
|
require 'apidiesel/errors'
|
9
|
+
require 'apidiesel/handlers'
|
9
10
|
require 'apidiesel/api'
|
10
11
|
require 'apidiesel/dsl'
|
11
12
|
require 'apidiesel/request'
|
12
13
|
require 'apidiesel/action'
|
13
14
|
require 'apidiesel/handlers/action_response_processor'
|
14
15
|
require 'apidiesel/handlers/http_request_helper'
|
16
|
+
require 'apidiesel/handlers/json'
|
15
17
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apidiesel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.10'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan-Christian Foeh
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-02-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -88,8 +88,10 @@ files:
|
|
88
88
|
- lib/apidiesel/api.rb
|
89
89
|
- lib/apidiesel/dsl.rb
|
90
90
|
- lib/apidiesel/errors.rb
|
91
|
+
- lib/apidiesel/handlers.rb
|
91
92
|
- lib/apidiesel/handlers/action_response_processor.rb
|
92
93
|
- lib/apidiesel/handlers/http_request_helper.rb
|
94
|
+
- lib/apidiesel/handlers/json.rb
|
93
95
|
- lib/apidiesel/handlers/mock_response.rb
|
94
96
|
- lib/apidiesel/request.rb
|
95
97
|
- lib/apidiesel/version.rb
|