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.
Files changed (56) hide show
  1. checksums.yaml +5 -13
  2. data/Rakefile +5 -0
  3. data/diesel.gemspec +4 -0
  4. data/lib/diesel.rb +13 -5
  5. data/lib/diesel/api_base.rb +27 -0
  6. data/lib/diesel/api_builder.rb +98 -34
  7. data/lib/diesel/api_error.rb +3 -0
  8. data/lib/diesel/api_group.rb +27 -0
  9. data/lib/diesel/data_model.rb +24 -0
  10. data/lib/diesel/endpoint.rb +15 -33
  11. data/lib/diesel/middleware/auth/api_key.rb +27 -0
  12. data/lib/diesel/middleware/debug.rb +20 -0
  13. data/lib/diesel/middleware/set_body_parameter.rb +11 -0
  14. data/lib/diesel/middleware/set_header.rb +15 -0
  15. data/lib/diesel/middleware/set_parameter_base.rb +33 -0
  16. data/lib/diesel/middleware/set_path_parameter.rb +17 -0
  17. data/lib/diesel/middleware/set_query_parameter.rb +13 -0
  18. data/lib/diesel/middleware_builder.rb +15 -0
  19. data/lib/diesel/middleware_stack.rb +21 -0
  20. data/lib/diesel/request_context.rb +40 -15
  21. data/lib/diesel/swagger/data_type_field.rb +25 -0
  22. data/lib/diesel/swagger/definition.rb +12 -0
  23. data/lib/diesel/swagger/external_docs.rb +10 -0
  24. data/lib/diesel/swagger/info.rb +14 -0
  25. data/lib/diesel/swagger/node.rb +140 -0
  26. data/lib/diesel/swagger/operation.rb +22 -0
  27. data/lib/diesel/swagger/parameter.rb +32 -0
  28. data/lib/diesel/swagger/parser.rb +70 -0
  29. data/lib/diesel/swagger/path.rb +27 -0
  30. data/lib/diesel/swagger/property.rb +8 -0
  31. data/lib/diesel/swagger/security_definition.rb +15 -0
  32. data/lib/diesel/swagger/specification.rb +30 -0
  33. data/lib/diesel/utils/inflections.rb +46 -0
  34. data/lib/diesel/version.rb +1 -1
  35. data/spec/diesel/api_builder_spec.rb +14 -0
  36. data/spec/diesel/swagger/parser_spec.rb +80 -0
  37. data/spec/diesel_spec.rb +43 -0
  38. data/spec/files/honeybadger.json +80 -0
  39. data/spec/files/pivotal_tracker.json +94 -0
  40. data/spec/fixtures/vcr_cassettes/honeybadger.yml +98 -0
  41. data/spec/fixtures/vcr_cassettes/pivotal_tracker_create_story.yml +61 -0
  42. data/spec/spec_helper.rb +10 -0
  43. metadata +110 -25
  44. data/apis/pivotal_tracker.rb +0 -55
  45. data/examples/create_pivotal_task.rb +0 -13
  46. data/lib/diesel/action/http.rb +0 -92
  47. data/lib/diesel/api.rb +0 -33
  48. data/lib/diesel/auth/api_key.rb +0 -39
  49. data/lib/diesel/auth/base.rb +0 -8
  50. data/lib/diesel/auth/oauth2.rb +0 -13
  51. data/lib/diesel/authenticator.rb +0 -35
  52. data/lib/diesel/complex_type_builder.rb +0 -24
  53. data/lib/diesel/container_builder.rb +0 -6
  54. data/lib/diesel/dsl.rb +0 -239
  55. data/lib/diesel/model_builder.rb +0 -9
  56. data/lib/diesel/profile.rb +0 -112
@@ -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
@@ -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
@@ -1,8 +0,0 @@
1
- module Diesel
2
- module Auth
3
- class Base
4
- attr_accessor :name
5
- end
6
- end
7
- end
8
-
@@ -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
@@ -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
@@ -1,6 +0,0 @@
1
- require 'diesel/model_builder'
2
-
3
- module Diesel
4
- class ContainerBuilder < ModelBuilder
5
- end
6
- 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