apidiesel 0.9 → 0.10
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/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
|