diesel-api-dsl 0.0.1 → 0.1.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 +5 -13
- data/Rakefile +5 -0
- data/diesel.gemspec +4 -0
- data/lib/diesel.rb +13 -5
- data/lib/diesel/api_base.rb +27 -0
- data/lib/diesel/api_builder.rb +98 -34
- data/lib/diesel/api_error.rb +3 -0
- data/lib/diesel/api_group.rb +27 -0
- data/lib/diesel/data_model.rb +24 -0
- data/lib/diesel/endpoint.rb +15 -33
- data/lib/diesel/middleware/auth/api_key.rb +27 -0
- data/lib/diesel/middleware/debug.rb +20 -0
- data/lib/diesel/middleware/set_body_parameter.rb +11 -0
- data/lib/diesel/middleware/set_header.rb +15 -0
- data/lib/diesel/middleware/set_parameter_base.rb +33 -0
- data/lib/diesel/middleware/set_path_parameter.rb +17 -0
- data/lib/diesel/middleware/set_query_parameter.rb +13 -0
- data/lib/diesel/middleware_builder.rb +15 -0
- data/lib/diesel/middleware_stack.rb +21 -0
- data/lib/diesel/request_context.rb +40 -15
- data/lib/diesel/swagger/data_type_field.rb +25 -0
- data/lib/diesel/swagger/definition.rb +12 -0
- data/lib/diesel/swagger/external_docs.rb +10 -0
- data/lib/diesel/swagger/info.rb +14 -0
- data/lib/diesel/swagger/node.rb +140 -0
- data/lib/diesel/swagger/operation.rb +22 -0
- data/lib/diesel/swagger/parameter.rb +32 -0
- data/lib/diesel/swagger/parser.rb +70 -0
- data/lib/diesel/swagger/path.rb +27 -0
- data/lib/diesel/swagger/property.rb +8 -0
- data/lib/diesel/swagger/security_definition.rb +15 -0
- data/lib/diesel/swagger/specification.rb +30 -0
- data/lib/diesel/utils/inflections.rb +46 -0
- data/lib/diesel/version.rb +1 -1
- data/spec/diesel/api_builder_spec.rb +14 -0
- data/spec/diesel/swagger/parser_spec.rb +80 -0
- data/spec/diesel_spec.rb +43 -0
- data/spec/files/honeybadger.json +80 -0
- data/spec/files/pivotal_tracker.json +94 -0
- data/spec/fixtures/vcr_cassettes/honeybadger.yml +98 -0
- data/spec/fixtures/vcr_cassettes/pivotal_tracker_create_story.yml +61 -0
- data/spec/spec_helper.rb +10 -0
- metadata +110 -25
- data/apis/pivotal_tracker.rb +0 -55
- data/examples/create_pivotal_task.rb +0 -13
- data/lib/diesel/action/http.rb +0 -92
- data/lib/diesel/api.rb +0 -33
- data/lib/diesel/auth/api_key.rb +0 -39
- data/lib/diesel/auth/base.rb +0 -8
- data/lib/diesel/auth/oauth2.rb +0 -13
- data/lib/diesel/authenticator.rb +0 -35
- data/lib/diesel/complex_type_builder.rb +0 -24
- data/lib/diesel/container_builder.rb +0 -6
- data/lib/diesel/dsl.rb +0 -239
- data/lib/diesel/model_builder.rb +0 -9
- data/lib/diesel/profile.rb +0 -112
data/lib/diesel/action/http.rb
DELETED
@@ -1,92 +0,0 @@
|
|
1
|
-
require 'httparty'
|
2
|
-
|
3
|
-
module Diesel
|
4
|
-
module Action
|
5
|
-
class HTTP
|
6
|
-
attr_accessor :filters, :request_method
|
7
|
-
|
8
|
-
def filters
|
9
|
-
@filters ||= []
|
10
|
-
end
|
11
|
-
|
12
|
-
def perform(context)
|
13
|
-
req = Request.new(request_method, context.endpoint_url)
|
14
|
-
[context.api.class.authenticator].concat(filters).each do |filter|
|
15
|
-
filter.apply_filter(req, context)
|
16
|
-
end
|
17
|
-
|
18
|
-
if context.logger && context.logger.debug?
|
19
|
-
context.logger.debug("Request Method: #{request_method}")
|
20
|
-
context.logger.debug("URL: #{req.url}")
|
21
|
-
context.logger.debug("Options: #{req.http_options.inspect}")
|
22
|
-
end
|
23
|
-
|
24
|
-
req.perform
|
25
|
-
end
|
26
|
-
|
27
|
-
class Request
|
28
|
-
attr_reader :method, :headers, :query
|
29
|
-
attr_accessor :url, :body
|
30
|
-
|
31
|
-
def initialize(method, url)
|
32
|
-
@method = method
|
33
|
-
@url = url
|
34
|
-
@headers = {}
|
35
|
-
@query = {}
|
36
|
-
end
|
37
|
-
|
38
|
-
def perform
|
39
|
-
HTTParty.send(method, url, http_options)
|
40
|
-
end
|
41
|
-
|
42
|
-
def http_options
|
43
|
-
{headers: headers, query: query, body: body}
|
44
|
-
end
|
45
|
-
|
46
|
-
def add_query_parameter(name, value)
|
47
|
-
@url = if url.index('?')
|
48
|
-
"#{url}&#{URI.escape(name)}=#{URI.escape(value)}"
|
49
|
-
else
|
50
|
-
"#{url}?#{URI.escape(name)}=#{URI.escape(value)}"
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
class ParameterFilter
|
56
|
-
attr_reader :parameter
|
57
|
-
|
58
|
-
def initialize(parameter)
|
59
|
-
@parameter = parameter
|
60
|
-
end
|
61
|
-
|
62
|
-
def apply_filter(request, context)
|
63
|
-
v = find_parameter_value(context)
|
64
|
-
case parameter.param_type
|
65
|
-
when :query
|
66
|
-
request.query[parameter.name] = v
|
67
|
-
when :path
|
68
|
-
request.url = request.url.gsub(path_regex, v.to_s)
|
69
|
-
when :body
|
70
|
-
request.body = v
|
71
|
-
when :header
|
72
|
-
request.headers[parameter.name] = v
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def find_parameter_value(context)
|
77
|
-
if parameter.complex?
|
78
|
-
model = context.api.class.models[parameter.data_type]
|
79
|
-
model.build(parameter, context)
|
80
|
-
else
|
81
|
-
parameter.value || context.get_attribute(parameter.name)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
protected
|
86
|
-
def path_regex
|
87
|
-
Regexp.new(Regexp.quote("{#{parameter.name}}"))
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
data/lib/diesel/api.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
module Diesel
|
2
|
-
class API
|
3
|
-
attr_accessor :logger
|
4
|
-
|
5
|
-
class << self
|
6
|
-
def base_path; @base_path; end
|
7
|
-
def base_path=(base_path)
|
8
|
-
@base_path = base_path
|
9
|
-
end
|
10
|
-
|
11
|
-
def endpoints; @endpoints ||= []; end
|
12
|
-
def endpoints=(endpoints)
|
13
|
-
@endpoints = endpoints
|
14
|
-
end
|
15
|
-
|
16
|
-
def authenticator; @authenticator; end
|
17
|
-
def authenticator=(auth)
|
18
|
-
@authenticator = auth
|
19
|
-
@authenticator.activate(self)
|
20
|
-
end
|
21
|
-
|
22
|
-
def models; @models ||= {}; end
|
23
|
-
def models=(models)
|
24
|
-
@models = models
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
protected
|
29
|
-
def execute(endpoint, options)
|
30
|
-
RequestContext.new(self, endpoint, options).perform
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/lib/diesel/auth/api_key.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'diesel/auth/base'
|
2
|
-
|
3
|
-
module Diesel
|
4
|
-
module Auth
|
5
|
-
class APIKey < Base
|
6
|
-
attr_accessor :nickname, :pass_as, :name
|
7
|
-
|
8
|
-
def self.build(authorization)
|
9
|
-
auth = new
|
10
|
-
auth.name = authorization.name
|
11
|
-
auth.nickname = authorization.nickname
|
12
|
-
auth.pass_as = authorization.pass_as
|
13
|
-
auth
|
14
|
-
end
|
15
|
-
|
16
|
-
def activate(api_class)
|
17
|
-
header_name = name
|
18
|
-
api_class.__send__(:define_method, "#{nickname}=".to_sym) do |header_value|
|
19
|
-
(@_auth_http_headers ||= {})[header_name] = header_value
|
20
|
-
end
|
21
|
-
api_class.send(:include, InstanceMethods)
|
22
|
-
end
|
23
|
-
|
24
|
-
def apply_filter(request, context)
|
25
|
-
if pass_as.to_sym == :header
|
26
|
-
request.headers[name] = context.api.auth_http_headers[name]
|
27
|
-
elsif pass_as.to_sym == :query_parameter
|
28
|
-
request.add_query_parameter(name, context.api.auth_http_headers[name])
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
module InstanceMethods
|
33
|
-
def auth_http_headers
|
34
|
-
@_auth_http_headers
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/lib/diesel/auth/base.rb
DELETED
data/lib/diesel/auth/oauth2.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
module Diesel
|
2
|
-
module Auth
|
3
|
-
class OAuth2
|
4
|
-
def self.activate(api_class, options)
|
5
|
-
api_class.send :attr_accessor, :access_token
|
6
|
-
end
|
7
|
-
|
8
|
-
def self.append_authentication(context, http_options)
|
9
|
-
(http_options[:headers] ||= {})['Authorization'] = "Bearer #{context.api.access_token}"
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
data/lib/diesel/authenticator.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
module Diesel
|
2
|
-
class Authenticator
|
3
|
-
attr_reader :strategies
|
4
|
-
|
5
|
-
def self.build(authorizations)
|
6
|
-
strategies = authorizations.map do |auth|
|
7
|
-
case auth.type
|
8
|
-
when :oauth2
|
9
|
-
require 'diesel/auth/oauth2'
|
10
|
-
Diesel::Auth::OAuth2.build(auth)
|
11
|
-
when :api_key
|
12
|
-
require 'diesel/auth/api_key'
|
13
|
-
Diesel::Auth::APIKey.build(auth)
|
14
|
-
else
|
15
|
-
raise "Unsupported authentication: #{auth.type}"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
new(strategies)
|
20
|
-
end
|
21
|
-
|
22
|
-
def initialize(strategies)
|
23
|
-
@strategies = strategies
|
24
|
-
end
|
25
|
-
|
26
|
-
def activate(api_class)
|
27
|
-
@strategies.each { |s| s.activate(api_class) }
|
28
|
-
end
|
29
|
-
|
30
|
-
def apply_filter(request, context)
|
31
|
-
@strategies.each { |s| s.apply_filter(request, context) }
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'multi_json'
|
2
|
-
require 'diesel/model_builder'
|
3
|
-
|
4
|
-
module Diesel
|
5
|
-
class ComplexTypeBuilder < ModelBuilder
|
6
|
-
def build(parameter, context)
|
7
|
-
h = context.get_attribute(parameter.name)
|
8
|
-
unless h
|
9
|
-
if parameter.required?
|
10
|
-
raise "Missing required parameter #{parameter.name}"
|
11
|
-
else
|
12
|
-
return nil
|
13
|
-
end
|
14
|
-
end
|
15
|
-
if model.required.detect { |r| h[r].nil? }
|
16
|
-
raise "Missing required value #{r} in #{parameter.name}"
|
17
|
-
end
|
18
|
-
json = model.properties.reduce({}) do |m, property|
|
19
|
-
m[property.name] = h[property.name] if h[property.name]; m
|
20
|
-
end
|
21
|
-
MultiJson.dump(json)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/lib/diesel/dsl.rb
DELETED
@@ -1,239 +0,0 @@
|
|
1
|
-
require 'diesel/profile'
|
2
|
-
require 'diesel/endpoint'
|
3
|
-
require 'diesel/request_context'
|
4
|
-
|
5
|
-
module Diesel
|
6
|
-
module DSL
|
7
|
-
def self.load_profile(name, filename)
|
8
|
-
loader = DSL::Loader.new(name)
|
9
|
-
loader.instance_eval File.read(filename), filename
|
10
|
-
loader.profile
|
11
|
-
end
|
12
|
-
|
13
|
-
class LoaderBase
|
14
|
-
attr_reader :object
|
15
|
-
|
16
|
-
class << self
|
17
|
-
def attribute(name)
|
18
|
-
define_method(name) do |val|
|
19
|
-
@object.__send__("#{name}=".to_sym, val)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
attribute :description
|
25
|
-
end
|
26
|
-
|
27
|
-
module Parameters
|
28
|
-
def header(*args, &block)
|
29
|
-
ParameterLoader.load_parameters(@object, :header, *args, &block)
|
30
|
-
end
|
31
|
-
|
32
|
-
def body(*args, &block)
|
33
|
-
ParameterLoader.load_parameters(@object, :body, *args, &block)
|
34
|
-
end
|
35
|
-
|
36
|
-
def parameter(*args, &block)
|
37
|
-
ParameterLoader.load_parameters(@object, nil, *args, &block)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
#class PartLoader
|
42
|
-
# attr_reader :part
|
43
|
-
|
44
|
-
# def initialize(*args)
|
45
|
-
# @part = Part.new(*args)
|
46
|
-
# end
|
47
|
-
|
48
|
-
# def header name, value
|
49
|
-
# @part.set_header(name, value)
|
50
|
-
# end
|
51
|
-
|
52
|
-
# def body value
|
53
|
-
# @part.body = value
|
54
|
-
# end
|
55
|
-
#end
|
56
|
-
|
57
|
-
#class ActionLoader < PartLoader
|
58
|
-
# attr_reader :action
|
59
|
-
|
60
|
-
# def initialize(endpoint, method, options)
|
61
|
-
# @part = @action = Action.new(endpoint, method, options)
|
62
|
-
# end
|
63
|
-
|
64
|
-
# def multipart(options = {}, &block)
|
65
|
-
# loader = MultipartLoader.new(options)
|
66
|
-
# loader.instance_eval(&block)
|
67
|
-
# action.multipart = loader.multipart
|
68
|
-
# end
|
69
|
-
#end
|
70
|
-
|
71
|
-
#class MultipartLoader
|
72
|
-
# attr_reader :multipart
|
73
|
-
|
74
|
-
# def initialize(options)
|
75
|
-
# @multipart = Multipart.new(options)
|
76
|
-
# end
|
77
|
-
|
78
|
-
# def part(*args, &block)
|
79
|
-
# loader = PartLoader.new(*args)
|
80
|
-
# loader.instance_eval(&block) if block
|
81
|
-
# multipart.add_part(loader.part)
|
82
|
-
# end
|
83
|
-
#end
|
84
|
-
|
85
|
-
class AuthorizationLoader < LoaderBase
|
86
|
-
attribute :name
|
87
|
-
attribute :nickname
|
88
|
-
attribute :pass_as
|
89
|
-
attribute :type
|
90
|
-
|
91
|
-
def initialize
|
92
|
-
@object = Diesel::Profile::Authorization.new
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
class PropertyLoader < LoaderBase
|
97
|
-
attribute :name
|
98
|
-
|
99
|
-
def initialize
|
100
|
-
@object = Diesel::Profile::Property.new
|
101
|
-
end
|
102
|
-
|
103
|
-
def enum(*values)
|
104
|
-
@object.enum = values
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
class ComplexTypeLoader < LoaderBase
|
109
|
-
attribute :name
|
110
|
-
|
111
|
-
def initialize
|
112
|
-
@object = Diesel::Profile::ComplexType.new
|
113
|
-
end
|
114
|
-
|
115
|
-
def required(*required_properties)
|
116
|
-
@object.required = required_properties
|
117
|
-
end
|
118
|
-
|
119
|
-
def property(name, &block)
|
120
|
-
l = PropertyLoader.new
|
121
|
-
l.name(name)
|
122
|
-
l.instance_eval(&block) if block
|
123
|
-
@object.properties << l.object
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
class OperationLoader < LoaderBase
|
128
|
-
include Parameters
|
129
|
-
|
130
|
-
attribute :nickname
|
131
|
-
attribute :reference_url
|
132
|
-
attribute :method
|
133
|
-
|
134
|
-
def initialize
|
135
|
-
@object = Diesel::Profile::Operation.new
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
class ResourceLoader < LoaderBase
|
140
|
-
def initialize(path)
|
141
|
-
@object = Diesel::Profile::Resource.new(path)
|
142
|
-
end
|
143
|
-
|
144
|
-
def operation(nickname, &block)
|
145
|
-
l = OperationLoader.new
|
146
|
-
l.nickname(nickname)
|
147
|
-
l.instance_eval(&block)
|
148
|
-
@object.operations << l.object
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
class ParameterLoader < LoaderBase
|
153
|
-
attribute :param_type
|
154
|
-
attribute :name
|
155
|
-
attribute :value
|
156
|
-
attribute :required
|
157
|
-
attribute :data_type
|
158
|
-
|
159
|
-
def initialize
|
160
|
-
@object = Diesel::Profile::Parameter.new
|
161
|
-
end
|
162
|
-
|
163
|
-
def required(required = true)
|
164
|
-
@object.required = required
|
165
|
-
end
|
166
|
-
|
167
|
-
def self.load_parameters(target, param_type, *args, &block)
|
168
|
-
if args.first.is_a?(::Hash)
|
169
|
-
args.shift.each_pair do |name, value|
|
170
|
-
l = new
|
171
|
-
l.param_type(param_type)
|
172
|
-
l.name(name)
|
173
|
-
l.value(value)
|
174
|
-
target.parameters << l.object
|
175
|
-
end
|
176
|
-
else
|
177
|
-
l = new
|
178
|
-
l.param_type(param_type)
|
179
|
-
l.name(args.first)
|
180
|
-
l.instance_eval(&block) if block
|
181
|
-
target.parameters << l.object
|
182
|
-
end
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
class APILoader < LoaderBase
|
187
|
-
include Parameters
|
188
|
-
|
189
|
-
attribute :api_version
|
190
|
-
attribute :base_path
|
191
|
-
|
192
|
-
def initialize(api_profile)
|
193
|
-
@object = api_profile
|
194
|
-
end
|
195
|
-
|
196
|
-
def resource(path, &block)
|
197
|
-
l = ResourceLoader.new(path)
|
198
|
-
l.instance_eval(&block)
|
199
|
-
@object.resources << l.object
|
200
|
-
end
|
201
|
-
|
202
|
-
def complex_type(name, &block)
|
203
|
-
l = ComplexTypeLoader.new
|
204
|
-
l.name(name)
|
205
|
-
l.instance_eval(&block)
|
206
|
-
@object.models << l.object
|
207
|
-
end
|
208
|
-
|
209
|
-
def container_type(name, &block)
|
210
|
-
l = ContainerTypeLoader.new
|
211
|
-
l.name(name)
|
212
|
-
l.instance_eval(&block)
|
213
|
-
@object.models << l.object
|
214
|
-
end
|
215
|
-
|
216
|
-
def api_key(name, &block)
|
217
|
-
l = AuthorizationLoader.new
|
218
|
-
l.name(name)
|
219
|
-
l.type(:api_key)
|
220
|
-
l.instance_eval(&block)
|
221
|
-
@object.authorizations << l.object
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
class Loader
|
226
|
-
attr_reader :name
|
227
|
-
attr_reader :profile
|
228
|
-
|
229
|
-
def initialize(name)
|
230
|
-
@name = name
|
231
|
-
end
|
232
|
-
|
233
|
-
def apis(&block)
|
234
|
-
@profile = Profile::API.new(name)
|
235
|
-
APILoader.new(@profile).instance_eval(&block)
|
236
|
-
end
|
237
|
-
end
|
238
|
-
end
|
239
|
-
end
|