aws-sdk-code-generator 0.1.0.pre → 0.2.4.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/aws-sdk-code-generator/api.rb +150 -0
- data/lib/aws-sdk-code-generator/apply_docs.rb +15 -2
- data/lib/aws-sdk-code-generator/client_constructor.rb +39 -0
- data/lib/aws-sdk-code-generator/client_operation_documentation.rb +282 -0
- data/lib/aws-sdk-code-generator/client_operation_list.rb +148 -0
- data/lib/aws-sdk-code-generator/client_response_structure_example.rb +115 -0
- data/lib/aws-sdk-code-generator/code_builder.rb +146 -133
- data/lib/aws-sdk-code-generator/crosslink.rb +42 -0
- data/lib/aws-sdk-code-generator/docstring.rb +199 -0
- data/lib/aws-sdk-code-generator/error_list.rb +77 -0
- data/lib/aws-sdk-code-generator/errors.rb +2 -0
- data/lib/aws-sdk-code-generator/eventstream_example.rb +220 -0
- data/lib/aws-sdk-code-generator/gem_builder.rb +42 -25
- data/lib/aws-sdk-code-generator/hash_formatter.rb +5 -2
- data/lib/aws-sdk-code-generator/helper.rb +86 -119
- data/lib/aws-sdk-code-generator/plugin_list.rb +147 -0
- data/lib/aws-sdk-code-generator/resource_action.rb +69 -0
- data/lib/aws-sdk-code-generator/resource_action_code.rb +57 -0
- data/lib/aws-sdk-code-generator/resource_association.rb +37 -0
- data/lib/aws-sdk-code-generator/resource_attribute.rb +76 -0
- data/lib/aws-sdk-code-generator/resource_batch_action.rb +56 -0
- data/lib/aws-sdk-code-generator/resource_batch_action_code.rb +136 -0
- data/lib/aws-sdk-code-generator/resource_batch_action_documentation.rb +108 -0
- data/lib/aws-sdk-code-generator/resource_batch_builder.rb +212 -0
- data/lib/aws-sdk-code-generator/resource_builder.rb +48 -0
- data/lib/aws-sdk-code-generator/resource_client_request.rb +62 -0
- data/lib/aws-sdk-code-generator/resource_client_request_documentation.rb +81 -0
- data/lib/aws-sdk-code-generator/resource_client_request_params.rb +86 -0
- data/lib/aws-sdk-code-generator/resource_data_method.rb +60 -0
- data/lib/aws-sdk-code-generator/resource_has_association.rb +117 -0
- data/lib/aws-sdk-code-generator/resource_has_many_association.rb +52 -0
- data/lib/aws-sdk-code-generator/resource_has_many_association_code.rb +76 -0
- data/lib/aws-sdk-code-generator/resource_identifier.rb +44 -0
- data/lib/aws-sdk-code-generator/resource_identifiers_method.rb +29 -0
- data/lib/aws-sdk-code-generator/resource_load_method.rb +68 -0
- data/lib/aws-sdk-code-generator/resource_method.rb +22 -0
- data/lib/aws-sdk-code-generator/resource_skip_params.rb +36 -0
- data/lib/aws-sdk-code-generator/resource_value_source.rb +68 -0
- data/lib/aws-sdk-code-generator/resource_waiter.rb +80 -0
- data/lib/aws-sdk-code-generator/service.rb +30 -7
- data/lib/aws-sdk-code-generator/shared_example.rb +131 -0
- data/lib/aws-sdk-code-generator/syntax_example.rb +60 -0
- data/lib/aws-sdk-code-generator/syntax_example_hash.rb +174 -0
- data/lib/aws-sdk-code-generator/underscore.rb +10 -5
- data/lib/aws-sdk-code-generator/view.rb +33 -0
- data/lib/aws-sdk-code-generator/views/apig_endpoint_class.rb +25 -0
- data/lib/aws-sdk-code-generator/views/apig_readme.rb +32 -0
- data/lib/aws-sdk-code-generator/views/async_client_class.rb +68 -0
- data/lib/aws-sdk-code-generator/views/authorizer_class.rb +17 -0
- data/lib/aws-sdk-code-generator/views/client_api_module.rb +602 -0
- data/lib/aws-sdk-code-generator/views/client_class.rb +93 -0
- data/lib/aws-sdk-code-generator/views/docstring.rb +27 -0
- data/lib/aws-sdk-code-generator/views/errors_module.rb +32 -0
- data/lib/aws-sdk-code-generator/views/event_streams_module.rb +149 -0
- data/lib/aws-sdk-code-generator/views/features/env.rb +9 -0
- data/lib/aws-sdk-code-generator/views/features/smoke.rb +52 -0
- data/lib/aws-sdk-code-generator/views/features/smoke_step_definitions.rb +26 -0
- data/lib/aws-sdk-code-generator/views/features/step_definitions.rb +6 -2
- data/lib/aws-sdk-code-generator/views/gemspec.rb +39 -5
- data/lib/aws-sdk-code-generator/views/resource_class.rb +122 -0
- data/lib/aws-sdk-code-generator/views/root_resource_class.rb +58 -0
- data/lib/aws-sdk-code-generator/views/service_module.rb +38 -14
- data/lib/aws-sdk-code-generator/views/spec/spec_helper.rb +9 -0
- data/lib/aws-sdk-code-generator/views/types_module.rb +329 -0
- data/lib/aws-sdk-code-generator/views/version.rb +2 -0
- data/lib/aws-sdk-code-generator/views/waiters_module.rb +37 -0
- data/lib/aws-sdk-code-generator/views.rb +2 -0
- data/lib/aws-sdk-code-generator/waiter.rb +95 -0
- data/lib/aws-sdk-code-generator/yard_option_tag.rb +43 -0
- data/lib/aws-sdk-code-generator.rb +68 -75
- data/templates/apig_endpoint_class.mustache +16 -0
- data/templates/apig_readme.mustache +62 -0
- data/templates/async_client_class.mustache +125 -0
- data/templates/authorizer_class.mustache +37 -0
- data/templates/client_api_module.mustache +106 -0
- data/templates/client_class.mustache +295 -0
- data/templates/code.mustache +4 -0
- data/templates/documentation.mustache +4 -0
- data/templates/errors_module.mustache +70 -0
- data/templates/event_streams_module.mustache +76 -0
- data/templates/features/env.mustache +15 -0
- data/templates/features/smoke.mustache +22 -0
- data/templates/features/smoke_step_definitions.mustache +31 -0
- data/templates/features/step_definitions.mustache +13 -0
- data/templates/gemspec.mustache +31 -0
- data/templates/license.txt +202 -0
- data/templates/method.mustache +7 -0
- data/templates/resource_class.mustache +304 -0
- data/templates/root_resource_class.mustache +51 -0
- data/templates/service_module.mustache +58 -0
- data/templates/spec/spec_helper.mustache +15 -0
- data/templates/types_module.mustache +53 -0
- data/templates/version.mustache +1 -0
- data/templates/waiters_module.mustache +112 -0
- metadata +115 -70
- data/lib/aws-sdk-code-generator/dsl/access_control_statement.rb +0 -23
- data/lib/aws-sdk-code-generator/dsl/attribute_accessor.rb +0 -43
- data/lib/aws-sdk-code-generator/dsl/attribute_reader.rb +0 -11
- data/lib/aws-sdk-code-generator/dsl/attribute_writer.rb +0 -11
- data/lib/aws-sdk-code-generator/dsl/autoload_statement.rb +0 -15
- data/lib/aws-sdk-code-generator/dsl/block_param.rb +0 -11
- data/lib/aws-sdk-code-generator/dsl/class.rb +0 -27
- data/lib/aws-sdk-code-generator/dsl/code_literal.rb +0 -66
- data/lib/aws-sdk-code-generator/dsl/code_object.rb +0 -33
- data/lib/aws-sdk-code-generator/dsl/docstring.rb +0 -36
- data/lib/aws-sdk-code-generator/dsl/eigenclass.rb +0 -15
- data/lib/aws-sdk-code-generator/dsl/extend_statement.rb +0 -12
- data/lib/aws-sdk-code-generator/dsl/formatter.rb +0 -25
- data/lib/aws-sdk-code-generator/dsl/include_statement.rb +0 -17
- data/lib/aws-sdk-code-generator/dsl/main.rb +0 -105
- data/lib/aws-sdk-code-generator/dsl/method.rb +0 -108
- data/lib/aws-sdk-code-generator/dsl/module.rb +0 -167
- data/lib/aws-sdk-code-generator/dsl/option_tag.rb +0 -36
- data/lib/aws-sdk-code-generator/dsl/param.rb +0 -43
- data/lib/aws-sdk-code-generator/dsl/param_list.rb +0 -38
- data/lib/aws-sdk-code-generator/dsl/return_tag.rb +0 -19
- data/lib/aws-sdk-code-generator/dsl/tag_default.rb +0 -20
- data/lib/aws-sdk-code-generator/dsl/tag_docstring.rb +0 -27
- data/lib/aws-sdk-code-generator/dsl/tag_type.rb +0 -18
- data/lib/aws-sdk-code-generator/generators/client_api_module.rb +0 -334
- data/lib/aws-sdk-code-generator/generators/client_class.rb +0 -389
- data/lib/aws-sdk-code-generator/generators/client_operation_documentation.rb +0 -166
- data/lib/aws-sdk-code-generator/generators/errors_module.rb +0 -25
- data/lib/aws-sdk-code-generator/generators/resource/action.rb +0 -88
- data/lib/aws-sdk-code-generator/generators/resource/batch_builder.rb +0 -211
- data/lib/aws-sdk-code-generator/generators/resource/builder.rb +0 -50
- data/lib/aws-sdk-code-generator/generators/resource/client_getter.rb +0 -15
- data/lib/aws-sdk-code-generator/generators/resource/client_request.rb +0 -49
- data/lib/aws-sdk-code-generator/generators/resource/client_request_docs.rb +0 -97
- data/lib/aws-sdk-code-generator/generators/resource/client_request_params.rb +0 -88
- data/lib/aws-sdk-code-generator/generators/resource/collection_class.rb +0 -180
- data/lib/aws-sdk-code-generator/generators/resource/data_attribute_getter.rb +0 -24
- data/lib/aws-sdk-code-generator/generators/resource/data_loaded_method.rb +0 -18
- data/lib/aws-sdk-code-generator/generators/resource/data_method.rb +0 -49
- data/lib/aws-sdk-code-generator/generators/resource/exists_method.rb +0 -29
- data/lib/aws-sdk-code-generator/generators/resource/extract_identifier_method.rb +0 -32
- data/lib/aws-sdk-code-generator/generators/resource/has_association.rb +0 -101
- data/lib/aws-sdk-code-generator/generators/resource/has_many_association.rb +0 -108
- data/lib/aws-sdk-code-generator/generators/resource/identifier_getter.rb +0 -26
- data/lib/aws-sdk-code-generator/generators/resource/identifiers_method.rb +0 -28
- data/lib/aws-sdk-code-generator/generators/resource/initialize_method.rb +0 -67
- data/lib/aws-sdk-code-generator/generators/resource/load_method.rb +0 -65
- data/lib/aws-sdk-code-generator/generators/resource/value_source.rb +0 -68
- data/lib/aws-sdk-code-generator/generators/resource/waiter_method.rb +0 -61
- data/lib/aws-sdk-code-generator/generators/resource_class.rb +0 -325
- data/lib/aws-sdk-code-generator/generators/response_structure_example.rb +0 -83
- data/lib/aws-sdk-code-generator/generators/root_resource_class.rb +0 -42
- data/lib/aws-sdk-code-generator/generators/service_documentation.rb +0 -64
- data/lib/aws-sdk-code-generator/generators/shared_example.rb +0 -132
- data/lib/aws-sdk-code-generator/generators/structure_type_class.rb +0 -95
- data/lib/aws-sdk-code-generator/generators/syntax_example.rb +0 -169
- data/lib/aws-sdk-code-generator/generators/types_module.rb +0 -52
- data/lib/aws-sdk-code-generator/generators/waiter_class.rb +0 -62
- data/lib/aws-sdk-code-generator/generators/waiters_module.rb +0 -20
@@ -1,211 +0,0 @@
|
|
1
|
-
require 'set'
|
2
|
-
|
3
|
-
module AwsSdkCodeGenerator
|
4
|
-
module Generators
|
5
|
-
module Resource
|
6
|
-
class BatchBuilder < Dsl::CodeLiteral
|
7
|
-
|
8
|
-
include Helper
|
9
|
-
|
10
|
-
# @option options [required, Hash] :resource
|
11
|
-
# @option options [String] :resp_var_name ('resp')
|
12
|
-
def initialize(options)
|
13
|
-
@resource = options.fetch(:resource)
|
14
|
-
@resp_var_name = options.fetch(:resp_var_name, 'resp')
|
15
|
-
verify_resource!
|
16
|
-
@context = loop_context
|
17
|
-
super()
|
18
|
-
|
19
|
-
# create nested blocks from each loop expression
|
20
|
-
stack = [self]
|
21
|
-
loops.each do |loop_expression|
|
22
|
-
stack.last.append(loop_expression)
|
23
|
-
stack << stack.last.indent
|
24
|
-
end
|
25
|
-
|
26
|
-
# add resource to the batch
|
27
|
-
stack.last.append("batch << #{resource_class}.new(#{constructor_args})")
|
28
|
-
|
29
|
-
# add closing end tags
|
30
|
-
stack.pop
|
31
|
-
stack.each { |c| c.append('end') }
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def resource_class
|
37
|
-
@resource['type']
|
38
|
-
end
|
39
|
-
|
40
|
-
def constructor_args
|
41
|
-
hash = {}
|
42
|
-
hash.update(identifiers)
|
43
|
-
hash[:data] = data_path if @resource['path']
|
44
|
-
hash[:client] = "@client"
|
45
|
-
HashFormatter.new(wrap:false, inline:true).format(hash)
|
46
|
-
end
|
47
|
-
|
48
|
-
def identifiers
|
49
|
-
(@resource['identifiers'] || []).inject({}) do |hash, identifier|
|
50
|
-
value = relative_identifier_path(identifier)
|
51
|
-
hash[underscore(identifier['target']).to_sym] = value
|
52
|
-
hash
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def data_path
|
57
|
-
relative_identifier_path({
|
58
|
-
'source' => 'data',
|
59
|
-
'path' => @resource['path'],
|
60
|
-
})
|
61
|
-
end
|
62
|
-
|
63
|
-
def relative_identifier_path(identifier)
|
64
|
-
path = identifier['path']
|
65
|
-
if path && path.include?('[]')
|
66
|
-
prefix = loops.last.match(/\|(.+)\|/)[1]
|
67
|
-
suffix = underscore(path[common_prefix.length..-1])
|
68
|
-
if @context == :options
|
69
|
-
suffix = suffix.gsub(/\.\w+/) { |word| "[:#{word[1..-1]}]" }
|
70
|
-
end
|
71
|
-
suffix.length == 0 ? prefix : prefix + suffix
|
72
|
-
else
|
73
|
-
ValueSource.new(identifier).to_s
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def common_prefix
|
78
|
-
paths = plural_paths
|
79
|
-
if paths.empty?
|
80
|
-
''
|
81
|
-
elsif paths.size == 1
|
82
|
-
# grab everything upto and including the final []
|
83
|
-
paths.first.match(/(.+\[\]).*?$/)[1]
|
84
|
-
else
|
85
|
-
prefix = find_prefix(paths)
|
86
|
-
prefix = prefix.sub(/\[\].+?$/, '[]')
|
87
|
-
if prefix[-2..-1] != '[]'
|
88
|
-
msg = 'response paths must have a common prefix ending in [], got :'
|
89
|
-
msg << paths.inspect
|
90
|
-
raise ArgumentError, msg
|
91
|
-
else
|
92
|
-
prefix
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def find_prefix(paths)
|
98
|
-
prefix = ''
|
99
|
-
loop.with_index do |_, n|
|
100
|
-
return prefix if paths.empty?
|
101
|
-
letter = paths[0][n]
|
102
|
-
paths.each do |path|
|
103
|
-
return prefix if path[n].nil?
|
104
|
-
return prefix if path[n] != letter
|
105
|
-
end
|
106
|
-
prefix += letter
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def loops
|
111
|
-
loop_var =
|
112
|
-
case @context
|
113
|
-
when :data then 'data.'
|
114
|
-
when :options then 'options'
|
115
|
-
when :response then "#{@resp_var_name}.data."
|
116
|
-
end
|
117
|
-
|
118
|
-
used_vars = Set.new
|
119
|
-
used_vars << loop_var
|
120
|
-
|
121
|
-
parts = common_prefix.split('[]')
|
122
|
-
parts = parts.map.with_index do |part,n|
|
123
|
-
part = underscore(part)
|
124
|
-
if @context == :options
|
125
|
-
part = part.gsub(/\w+/) { |word| "[:#{word}]" }
|
126
|
-
part = part.gsub(/\./, '')
|
127
|
-
end
|
128
|
-
part = "#{loop_var}#{part}"
|
129
|
-
loop_var = loop_letter(part, used_vars)
|
130
|
-
part = part + ".each do |#{loop_var}|"
|
131
|
-
part
|
132
|
-
end
|
133
|
-
parts
|
134
|
-
end
|
135
|
-
|
136
|
-
def loop_letter(str, used_vars)
|
137
|
-
letter = if @context == :options
|
138
|
-
str.scan(/:\w/).last[1]
|
139
|
-
else
|
140
|
-
str.split('.').last[0]
|
141
|
-
end
|
142
|
-
n = 1
|
143
|
-
var = letter
|
144
|
-
while used_vars.include?(var)
|
145
|
-
n += 1
|
146
|
-
var = "#{letter}#{n}"
|
147
|
-
end
|
148
|
-
used_vars << var
|
149
|
-
var
|
150
|
-
end
|
151
|
-
|
152
|
-
def all_plural_paths
|
153
|
-
paths = {}
|
154
|
-
@resource['identifiers'].each do |i|
|
155
|
-
if i['path'] && i['path'].include?('[]')
|
156
|
-
paths[i['source']] ||= []
|
157
|
-
paths[i['source']] << i['path']
|
158
|
-
end
|
159
|
-
end
|
160
|
-
#if @resource['path'] && @resource['path'].include?('[]')
|
161
|
-
# type = @context == :data ? 'data' : 'response'
|
162
|
-
# paths[type] ||= []
|
163
|
-
# paths[type] << @resource['path']
|
164
|
-
#end
|
165
|
-
paths
|
166
|
-
end
|
167
|
-
|
168
|
-
def plural_paths
|
169
|
-
all_plural_paths.values.first
|
170
|
-
end
|
171
|
-
|
172
|
-
def verify_resource!
|
173
|
-
verify_plural_paths!
|
174
|
-
end
|
175
|
-
|
176
|
-
def verify_plural_paths!
|
177
|
-
paths = all_plural_paths
|
178
|
-
case paths.size
|
179
|
-
when 0
|
180
|
-
msg = 'expected at least one plural identifier path, got none'
|
181
|
-
raise ArgumentError, msg
|
182
|
-
when 1
|
183
|
-
case paths.keys.first
|
184
|
-
when 'requestParameter'
|
185
|
-
when 'response'
|
186
|
-
when 'data'
|
187
|
-
else
|
188
|
-
msg = "unsupported identifier source #{paths.keys.first.inspect}"
|
189
|
-
raise ArgumentError, msg
|
190
|
-
end
|
191
|
-
else
|
192
|
-
msg = 'mixing plural source types is not supported'
|
193
|
-
raise ArgumentError, msg
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
def loop_context
|
198
|
-
case all_plural_paths.keys
|
199
|
-
when ['response'] then :response
|
200
|
-
when ['data'] then :data
|
201
|
-
when ['requestParameter'] then :options
|
202
|
-
else
|
203
|
-
msg = "unable to determine loop context: #{@resource.inspect}"
|
204
|
-
raise msg
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
module AwsSdkCodeGenerator
|
2
|
-
module Generators
|
3
|
-
module Resource
|
4
|
-
class Builder < Dsl::CodeLiteral
|
5
|
-
|
6
|
-
include Helper
|
7
|
-
|
8
|
-
# @option options [required, Hash] :resource
|
9
|
-
# @option options [required, Boolean] :request_made
|
10
|
-
def initialize(options = {})
|
11
|
-
super()
|
12
|
-
@resource = options.fetch(:resource)
|
13
|
-
@request_made = options.fetch(:request_made)
|
14
|
-
append("#{resource_class}.new(#{constructor_options})")
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def resource_class
|
20
|
-
@resource['type']
|
21
|
-
end
|
22
|
-
|
23
|
-
def constructor_options
|
24
|
-
options = {}
|
25
|
-
options.update(identifiers)
|
26
|
-
options[:data] = data_path if @resource['path']
|
27
|
-
options[:client] = "@client"
|
28
|
-
HashFormatter.new(wrap:false, inline:true).format(options)
|
29
|
-
end
|
30
|
-
|
31
|
-
def identifiers
|
32
|
-
(@resource['identifiers'] || []).inject({}) do |hash, identifier|
|
33
|
-
value = ValueSource.new(identifier).to_s
|
34
|
-
hash[underscore(identifier['target']).to_sym] = value
|
35
|
-
hash
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def data_path
|
40
|
-
if @request_made
|
41
|
-
ValueSource.new('source' => 'response', 'path' => @resource['path'])
|
42
|
-
else
|
43
|
-
ValueSource.new('source' => 'data', 'path' => @resource['path'])
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module AwsSdkCodeGenerator
|
2
|
-
module Generators
|
3
|
-
module Resource
|
4
|
-
class ClientRequest < Dsl::CodeLiteral
|
5
|
-
|
6
|
-
include Helper
|
7
|
-
|
8
|
-
# @option options [required, Hash] :request
|
9
|
-
# @option options [Boolean] :resp (false)
|
10
|
-
# @option options [Boolean] :merge (true)
|
11
|
-
def initialize(options = {})
|
12
|
-
@request = options.fetch(:request)
|
13
|
-
@params = ClientRequestParams.new(params: @request['params'])
|
14
|
-
@resp = options.fetch(:resp, false)
|
15
|
-
if options.fetch(:merge, true)
|
16
|
-
super("#{request_options}#{assignement}@client.#{operation_name}(options)")
|
17
|
-
else
|
18
|
-
super("#{assignement}@client.#{operation_name}#{params}")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def request_options
|
25
|
-
if @params.empty?
|
26
|
-
''
|
27
|
-
elsif @params.simple?
|
28
|
-
"options = options.merge(#{@params})\n"
|
29
|
-
else
|
30
|
-
"options = Aws::Util.deep_merge(options, #{@params})\n"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def params
|
35
|
-
@params.empty? ? @params : "(#{@params})"
|
36
|
-
end
|
37
|
-
|
38
|
-
def assignement
|
39
|
-
"resp = " if @resp
|
40
|
-
end
|
41
|
-
|
42
|
-
def operation_name
|
43
|
-
underscore(@request['operation'])
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,97 +0,0 @@
|
|
1
|
-
require 'set'
|
2
|
-
|
3
|
-
module AwsSdkCodeGenerator
|
4
|
-
module Generators
|
5
|
-
module Resource
|
6
|
-
class ClientRequestDocs
|
7
|
-
|
8
|
-
include Helper
|
9
|
-
|
10
|
-
# @option options [required, Hash] :api
|
11
|
-
# @option options [required, Hash] :request
|
12
|
-
# @option options [Array<String>] :skip ([])
|
13
|
-
# @option options [required, String] :var_name
|
14
|
-
# @option options [required, String] :returns
|
15
|
-
def initialize(options)
|
16
|
-
@api = options.fetch(:api)
|
17
|
-
@request = options.fetch(:request)
|
18
|
-
@skip = Set.new(options.fetch(:skip, []))
|
19
|
-
@var_name = options.fetch(:var_name)
|
20
|
-
@returns = options.fetch(:returns)
|
21
|
-
end
|
22
|
-
|
23
|
-
# @param [Dsl::Method] method
|
24
|
-
def apply(method)
|
25
|
-
apply_request_syntax_example(method)
|
26
|
-
apply_option_tags(method)
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def apply_option_tags(method)
|
32
|
-
input_members.each do |member_name, member_ref, required|
|
33
|
-
method.option(
|
34
|
-
name: underscore(member_name),
|
35
|
-
type: ruby_input_type(member_ref),
|
36
|
-
required: required,
|
37
|
-
docstring: documentation(member_ref)
|
38
|
-
)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def apply_request_syntax_example(method)
|
43
|
-
if input_shape
|
44
|
-
syntax = SyntaxExample.new(
|
45
|
-
struct_shape: input_shape,
|
46
|
-
api: @api,
|
47
|
-
indent: ' '
|
48
|
-
).format.strip
|
49
|
-
method.docstring.append("@example Request syntax with placeholder values")
|
50
|
-
if @returns
|
51
|
-
method.docstring.append("\n #{@returns} = #{@var_name}.#{method.name}(#{syntax})")
|
52
|
-
else
|
53
|
-
method.docstring.append("\n #{@var_name}.#{method.name}(#{syntax})")
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def input_members
|
59
|
-
if input_shape
|
60
|
-
Enumerator.new do |y|
|
61
|
-
input_shape['members'].each_pair do |member_name, member_ref|
|
62
|
-
required = (input_shape['required'] || []).include?(member_name)
|
63
|
-
y.yield(member_name, member_ref, required)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
else
|
67
|
-
[]
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def operation
|
72
|
-
@api['operations'][@request['operation']]
|
73
|
-
end
|
74
|
-
|
75
|
-
def input_shape
|
76
|
-
struct = shape(operation['input'])
|
77
|
-
if struct
|
78
|
-
struct = deep_copy(struct)
|
79
|
-
struct['members'].keys.each do |member_name|
|
80
|
-
struct['members'].delete(member_name) if request_param?(member_name)
|
81
|
-
struct['members'].delete(member_name) if @skip.include?(member_name)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
struct
|
85
|
-
end
|
86
|
-
|
87
|
-
def request_param?(member_name)
|
88
|
-
params = @request['params'] || []
|
89
|
-
params.any? do |param|
|
90
|
-
param['target'].match(/^#{member_name}\b/) && !(param['target'].include?('[') && param['target'].include?('.'))
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
module AwsSdkCodeGenerator
|
2
|
-
module Generators
|
3
|
-
module Resource
|
4
|
-
class ClientRequestParams < String
|
5
|
-
|
6
|
-
include Helper
|
7
|
-
|
8
|
-
# @option options [Array] :params ([])
|
9
|
-
def initialize(options = {})
|
10
|
-
@params = options.fetch(:params, nil) || []
|
11
|
-
super(format_params)
|
12
|
-
end
|
13
|
-
|
14
|
-
def simple?
|
15
|
-
@params.all? { |p| p['target'].match(/^\w+$/) }
|
16
|
-
end
|
17
|
-
|
18
|
-
def empty?
|
19
|
-
@params.empty?
|
20
|
-
end
|
21
|
-
|
22
|
-
def size
|
23
|
-
@params.size
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def format_params
|
29
|
-
hash = {}
|
30
|
-
@params.each do |param|
|
31
|
-
ParamTarget.new(param).apply(hash, ValueSource.new(param))
|
32
|
-
end
|
33
|
-
formatter = HashFormatter.new(wrap:false, inline: @params.count == 1)
|
34
|
-
params = formatter.format(hash)
|
35
|
-
@params.size == 1 ? params.strip : params
|
36
|
-
end
|
37
|
-
|
38
|
-
class ParamTarget
|
39
|
-
|
40
|
-
def initialize(param)
|
41
|
-
@target = param['target']
|
42
|
-
@steps = []
|
43
|
-
@target.scan(/\w+|\[\]|\[\*\]|\[[0-9]+\]/) do |step|
|
44
|
-
case step
|
45
|
-
when /\[\d+\]/ then @steps += [:array, step[1..-2].to_i]
|
46
|
-
when /\[\*\]/ then @steps += [:array, :n]
|
47
|
-
when '[]' then @steps += [:array, -1]
|
48
|
-
else @steps += [:hash, Underscore.underscore(step).to_sym]
|
49
|
-
end
|
50
|
-
end
|
51
|
-
@steps.shift
|
52
|
-
@final = @steps.pop
|
53
|
-
end
|
54
|
-
|
55
|
-
# @return [String] target
|
56
|
-
attr_reader :target
|
57
|
-
|
58
|
-
def apply(hash, value, options = {})
|
59
|
-
resource_index = options.fetch(:resource_index, 0)
|
60
|
-
if @final == -1
|
61
|
-
build_context(hash, resource_index) << value
|
62
|
-
else
|
63
|
-
build_context(hash, resource_index)[@final] = value
|
64
|
-
end
|
65
|
-
hash
|
66
|
-
end
|
67
|
-
|
68
|
-
private
|
69
|
-
|
70
|
-
def build_context(params, n)
|
71
|
-
@steps.each_slice(2).inject(params) do |context, (key, type)|
|
72
|
-
entry = type == :array ? [] : {}
|
73
|
-
if key == -1
|
74
|
-
context << entry
|
75
|
-
entry
|
76
|
-
elsif key == :n
|
77
|
-
context[n] ||= entry
|
78
|
-
else
|
79
|
-
context[key] ||= entry
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
@@ -1,180 +0,0 @@
|
|
1
|
-
module AwsSdkCodeGenerator
|
2
|
-
module Generators
|
3
|
-
module Resource
|
4
|
-
class CollectionClass < Dsl::Class
|
5
|
-
|
6
|
-
include Helper
|
7
|
-
|
8
|
-
# @option options [required, String] :resource_name
|
9
|
-
# @option options [required, Hash] :resource
|
10
|
-
# @option options [required, Hash] :api
|
11
|
-
def initialize(options)
|
12
|
-
@resource_name = options.fetch(:resource_name)
|
13
|
-
@resource = options.fetch(:resource)
|
14
|
-
@variable_name = underscore(@resource_name)
|
15
|
-
@api = options.fetch(:api)
|
16
|
-
super('Collection', extends: 'Aws::Resources::Collection')
|
17
|
-
add(*batch_actions)
|
18
|
-
end
|
19
|
-
|
20
|
-
def apply(mod)
|
21
|
-
mod.class(@resource_name) do |m|
|
22
|
-
m.add(self)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def batch_actions
|
29
|
-
if @resource['batchActions']
|
30
|
-
actions = []
|
31
|
-
actions << '# @!group Batch Actions'
|
32
|
-
@resource['batchActions'].each do |name, action|
|
33
|
-
actions << Dsl::Method.new(batch_action_name(name, action)) do |m|
|
34
|
-
m.returns('void')
|
35
|
-
m.param('options', default: {})
|
36
|
-
param_hash(action)
|
37
|
-
apply_batch_action_doc(action, m)
|
38
|
-
m.code('batch_enum.each do |batch|')
|
39
|
-
m.code(initialize_params)
|
40
|
-
m.code(apply_params_per_batch)
|
41
|
-
m.code(batch_request(action))
|
42
|
-
m.code('end')
|
43
|
-
m.code(batch_response)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
actions << '# @!endgroup'
|
47
|
-
actions
|
48
|
-
else
|
49
|
-
[]
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def param_hash(action)
|
54
|
-
@batch_obj = {}
|
55
|
-
@per_batch = {}
|
56
|
-
@action_prefix = false
|
57
|
-
action['request']['params'].each do |param|
|
58
|
-
if param['target'].include?('[')
|
59
|
-
parts = param['target'].split('[')
|
60
|
-
pair = parts[0].split('.')
|
61
|
-
if pair.length > 1
|
62
|
-
@action_prefix = pair.first
|
63
|
-
end
|
64
|
-
batch_name = pair.last
|
65
|
-
batch_param = underscore(parts[1].sub(/.*?\./, ''))
|
66
|
-
batch_param = batch_param == "" ? underscore(param['name']) : batch_param
|
67
|
-
(@batch_obj[batch_name] ||= []) << {
|
68
|
-
batch_param.to_sym => underscore(param['name'] || param['path'])
|
69
|
-
}
|
70
|
-
else
|
71
|
-
@per_batch[param['target']] = underscore(param['name'])
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def apply_batch_action_doc(action, method)
|
77
|
-
skip = []
|
78
|
-
if @action_prefix
|
79
|
-
skip << @action_prefix
|
80
|
-
else
|
81
|
-
skip += @per_batch.keys
|
82
|
-
skip += @batch_obj.keys
|
83
|
-
end
|
84
|
-
ClientRequestDocs.new(
|
85
|
-
request: action['request'],
|
86
|
-
api: @api,
|
87
|
-
skip: skip,
|
88
|
-
var_name: @variable_name,
|
89
|
-
returns: nil
|
90
|
-
).apply(method)
|
91
|
-
end
|
92
|
-
|
93
|
-
def initialize_params
|
94
|
-
param_block = []
|
95
|
-
param_block << " params = Aws::Util.copy_hash(options)"
|
96
|
-
param_block << apply_param_hash
|
97
|
-
param_block.join("\n")
|
98
|
-
end
|
99
|
-
|
100
|
-
def apply_param_hash
|
101
|
-
block = []
|
102
|
-
@per_batch.each do |key, value|
|
103
|
-
block << " params[:#{underscore(key)}] = batch[0].#{value}"
|
104
|
-
end
|
105
|
-
if @action_prefix
|
106
|
-
action = underscore(@action_prefix)
|
107
|
-
block << " params[:#{action}] ||= {}"
|
108
|
-
@batch_obj.keys.each do |key|
|
109
|
-
block << " params[:#{action}][:#{underscore(key)}] ||= []"
|
110
|
-
end
|
111
|
-
else
|
112
|
-
@batch_obj.keys.each {|key| block << " params[:#{underscore(key)}] ||= []"}
|
113
|
-
end
|
114
|
-
block.join("\n")
|
115
|
-
end
|
116
|
-
|
117
|
-
def apply_params_per_batch
|
118
|
-
each_batch = []
|
119
|
-
each_batch << " batch.each do |item|"
|
120
|
-
@batch_obj.each do |key, value|
|
121
|
-
hash = {}
|
122
|
-
value.each do |v|
|
123
|
-
param, identifier = v.first
|
124
|
-
hash[param.to_sym] = "item.#{identifier}"
|
125
|
-
end
|
126
|
-
# Construct hash block
|
127
|
-
if @action_prefix
|
128
|
-
each_batch << " params[:#{underscore(@action_prefix)}][:#{underscore(key)}] << {"
|
129
|
-
else
|
130
|
-
each_batch << " params[:#{underscore(key)}] << {"
|
131
|
-
end
|
132
|
-
# hashformatter treats this as inline, need extra indent
|
133
|
-
indent_count = hash.size == 1 ? 3 : 2
|
134
|
-
each_batch << indent_helper(HashFormatter.new(wrap: false).format(hash), indent_count)
|
135
|
-
each_batch << " }"
|
136
|
-
end
|
137
|
-
each_batch << " end"
|
138
|
-
each_batch.join("\n")
|
139
|
-
end
|
140
|
-
|
141
|
-
def batch_request(action)
|
142
|
-
" batch[0].client.#{underscore(action['request']['operation'])}(params)"
|
143
|
-
end
|
144
|
-
|
145
|
-
def batch_response
|
146
|
-
"nil"
|
147
|
-
end
|
148
|
-
|
149
|
-
def indent_helper(lines, count)
|
150
|
-
block = []
|
151
|
-
lines.split("\n").each do |line|
|
152
|
-
next if line.strip == ""
|
153
|
-
block << " " * count + line
|
154
|
-
end
|
155
|
-
block.join("\n")
|
156
|
-
end
|
157
|
-
|
158
|
-
def batch_action_name(name, action)
|
159
|
-
method_name = "batch_" + underscore(name)
|
160
|
-
method_name += '!' if dangerous?(name, action)
|
161
|
-
method_name
|
162
|
-
end
|
163
|
-
|
164
|
-
def dangerous?(name, action)
|
165
|
-
if
|
166
|
-
name.match(/delete/i) ||
|
167
|
-
name.match(/terminate/i) ||
|
168
|
-
action['request']['operation'].match(/delete/i) ||
|
169
|
-
action['request']['operation'].match(/terminate/i)
|
170
|
-
then
|
171
|
-
true
|
172
|
-
else
|
173
|
-
false
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|