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.
Files changed (155) hide show
  1. checksums.yaml +5 -5
  2. data/lib/aws-sdk-code-generator/api.rb +150 -0
  3. data/lib/aws-sdk-code-generator/apply_docs.rb +15 -2
  4. data/lib/aws-sdk-code-generator/client_constructor.rb +39 -0
  5. data/lib/aws-sdk-code-generator/client_operation_documentation.rb +282 -0
  6. data/lib/aws-sdk-code-generator/client_operation_list.rb +148 -0
  7. data/lib/aws-sdk-code-generator/client_response_structure_example.rb +115 -0
  8. data/lib/aws-sdk-code-generator/code_builder.rb +146 -133
  9. data/lib/aws-sdk-code-generator/crosslink.rb +42 -0
  10. data/lib/aws-sdk-code-generator/docstring.rb +199 -0
  11. data/lib/aws-sdk-code-generator/error_list.rb +77 -0
  12. data/lib/aws-sdk-code-generator/errors.rb +2 -0
  13. data/lib/aws-sdk-code-generator/eventstream_example.rb +220 -0
  14. data/lib/aws-sdk-code-generator/gem_builder.rb +42 -25
  15. data/lib/aws-sdk-code-generator/hash_formatter.rb +5 -2
  16. data/lib/aws-sdk-code-generator/helper.rb +86 -119
  17. data/lib/aws-sdk-code-generator/plugin_list.rb +147 -0
  18. data/lib/aws-sdk-code-generator/resource_action.rb +69 -0
  19. data/lib/aws-sdk-code-generator/resource_action_code.rb +57 -0
  20. data/lib/aws-sdk-code-generator/resource_association.rb +37 -0
  21. data/lib/aws-sdk-code-generator/resource_attribute.rb +76 -0
  22. data/lib/aws-sdk-code-generator/resource_batch_action.rb +56 -0
  23. data/lib/aws-sdk-code-generator/resource_batch_action_code.rb +136 -0
  24. data/lib/aws-sdk-code-generator/resource_batch_action_documentation.rb +108 -0
  25. data/lib/aws-sdk-code-generator/resource_batch_builder.rb +212 -0
  26. data/lib/aws-sdk-code-generator/resource_builder.rb +48 -0
  27. data/lib/aws-sdk-code-generator/resource_client_request.rb +62 -0
  28. data/lib/aws-sdk-code-generator/resource_client_request_documentation.rb +81 -0
  29. data/lib/aws-sdk-code-generator/resource_client_request_params.rb +86 -0
  30. data/lib/aws-sdk-code-generator/resource_data_method.rb +60 -0
  31. data/lib/aws-sdk-code-generator/resource_has_association.rb +117 -0
  32. data/lib/aws-sdk-code-generator/resource_has_many_association.rb +52 -0
  33. data/lib/aws-sdk-code-generator/resource_has_many_association_code.rb +76 -0
  34. data/lib/aws-sdk-code-generator/resource_identifier.rb +44 -0
  35. data/lib/aws-sdk-code-generator/resource_identifiers_method.rb +29 -0
  36. data/lib/aws-sdk-code-generator/resource_load_method.rb +68 -0
  37. data/lib/aws-sdk-code-generator/resource_method.rb +22 -0
  38. data/lib/aws-sdk-code-generator/resource_skip_params.rb +36 -0
  39. data/lib/aws-sdk-code-generator/resource_value_source.rb +68 -0
  40. data/lib/aws-sdk-code-generator/resource_waiter.rb +80 -0
  41. data/lib/aws-sdk-code-generator/service.rb +30 -7
  42. data/lib/aws-sdk-code-generator/shared_example.rb +131 -0
  43. data/lib/aws-sdk-code-generator/syntax_example.rb +60 -0
  44. data/lib/aws-sdk-code-generator/syntax_example_hash.rb +174 -0
  45. data/lib/aws-sdk-code-generator/underscore.rb +10 -5
  46. data/lib/aws-sdk-code-generator/view.rb +33 -0
  47. data/lib/aws-sdk-code-generator/views/apig_endpoint_class.rb +25 -0
  48. data/lib/aws-sdk-code-generator/views/apig_readme.rb +32 -0
  49. data/lib/aws-sdk-code-generator/views/async_client_class.rb +68 -0
  50. data/lib/aws-sdk-code-generator/views/authorizer_class.rb +17 -0
  51. data/lib/aws-sdk-code-generator/views/client_api_module.rb +602 -0
  52. data/lib/aws-sdk-code-generator/views/client_class.rb +93 -0
  53. data/lib/aws-sdk-code-generator/views/docstring.rb +27 -0
  54. data/lib/aws-sdk-code-generator/views/errors_module.rb +32 -0
  55. data/lib/aws-sdk-code-generator/views/event_streams_module.rb +149 -0
  56. data/lib/aws-sdk-code-generator/views/features/env.rb +9 -0
  57. data/lib/aws-sdk-code-generator/views/features/smoke.rb +52 -0
  58. data/lib/aws-sdk-code-generator/views/features/smoke_step_definitions.rb +26 -0
  59. data/lib/aws-sdk-code-generator/views/features/step_definitions.rb +6 -2
  60. data/lib/aws-sdk-code-generator/views/gemspec.rb +39 -5
  61. data/lib/aws-sdk-code-generator/views/resource_class.rb +122 -0
  62. data/lib/aws-sdk-code-generator/views/root_resource_class.rb +58 -0
  63. data/lib/aws-sdk-code-generator/views/service_module.rb +38 -14
  64. data/lib/aws-sdk-code-generator/views/spec/spec_helper.rb +9 -0
  65. data/lib/aws-sdk-code-generator/views/types_module.rb +329 -0
  66. data/lib/aws-sdk-code-generator/views/version.rb +2 -0
  67. data/lib/aws-sdk-code-generator/views/waiters_module.rb +37 -0
  68. data/lib/aws-sdk-code-generator/views.rb +2 -0
  69. data/lib/aws-sdk-code-generator/waiter.rb +95 -0
  70. data/lib/aws-sdk-code-generator/yard_option_tag.rb +43 -0
  71. data/lib/aws-sdk-code-generator.rb +68 -75
  72. data/templates/apig_endpoint_class.mustache +16 -0
  73. data/templates/apig_readme.mustache +62 -0
  74. data/templates/async_client_class.mustache +125 -0
  75. data/templates/authorizer_class.mustache +37 -0
  76. data/templates/client_api_module.mustache +106 -0
  77. data/templates/client_class.mustache +295 -0
  78. data/templates/code.mustache +4 -0
  79. data/templates/documentation.mustache +4 -0
  80. data/templates/errors_module.mustache +70 -0
  81. data/templates/event_streams_module.mustache +76 -0
  82. data/templates/features/env.mustache +15 -0
  83. data/templates/features/smoke.mustache +22 -0
  84. data/templates/features/smoke_step_definitions.mustache +31 -0
  85. data/templates/features/step_definitions.mustache +13 -0
  86. data/templates/gemspec.mustache +31 -0
  87. data/templates/license.txt +202 -0
  88. data/templates/method.mustache +7 -0
  89. data/templates/resource_class.mustache +304 -0
  90. data/templates/root_resource_class.mustache +51 -0
  91. data/templates/service_module.mustache +58 -0
  92. data/templates/spec/spec_helper.mustache +15 -0
  93. data/templates/types_module.mustache +53 -0
  94. data/templates/version.mustache +1 -0
  95. data/templates/waiters_module.mustache +112 -0
  96. metadata +115 -70
  97. data/lib/aws-sdk-code-generator/dsl/access_control_statement.rb +0 -23
  98. data/lib/aws-sdk-code-generator/dsl/attribute_accessor.rb +0 -43
  99. data/lib/aws-sdk-code-generator/dsl/attribute_reader.rb +0 -11
  100. data/lib/aws-sdk-code-generator/dsl/attribute_writer.rb +0 -11
  101. data/lib/aws-sdk-code-generator/dsl/autoload_statement.rb +0 -15
  102. data/lib/aws-sdk-code-generator/dsl/block_param.rb +0 -11
  103. data/lib/aws-sdk-code-generator/dsl/class.rb +0 -27
  104. data/lib/aws-sdk-code-generator/dsl/code_literal.rb +0 -66
  105. data/lib/aws-sdk-code-generator/dsl/code_object.rb +0 -33
  106. data/lib/aws-sdk-code-generator/dsl/docstring.rb +0 -36
  107. data/lib/aws-sdk-code-generator/dsl/eigenclass.rb +0 -15
  108. data/lib/aws-sdk-code-generator/dsl/extend_statement.rb +0 -12
  109. data/lib/aws-sdk-code-generator/dsl/formatter.rb +0 -25
  110. data/lib/aws-sdk-code-generator/dsl/include_statement.rb +0 -17
  111. data/lib/aws-sdk-code-generator/dsl/main.rb +0 -105
  112. data/lib/aws-sdk-code-generator/dsl/method.rb +0 -108
  113. data/lib/aws-sdk-code-generator/dsl/module.rb +0 -167
  114. data/lib/aws-sdk-code-generator/dsl/option_tag.rb +0 -36
  115. data/lib/aws-sdk-code-generator/dsl/param.rb +0 -43
  116. data/lib/aws-sdk-code-generator/dsl/param_list.rb +0 -38
  117. data/lib/aws-sdk-code-generator/dsl/return_tag.rb +0 -19
  118. data/lib/aws-sdk-code-generator/dsl/tag_default.rb +0 -20
  119. data/lib/aws-sdk-code-generator/dsl/tag_docstring.rb +0 -27
  120. data/lib/aws-sdk-code-generator/dsl/tag_type.rb +0 -18
  121. data/lib/aws-sdk-code-generator/generators/client_api_module.rb +0 -334
  122. data/lib/aws-sdk-code-generator/generators/client_class.rb +0 -389
  123. data/lib/aws-sdk-code-generator/generators/client_operation_documentation.rb +0 -166
  124. data/lib/aws-sdk-code-generator/generators/errors_module.rb +0 -25
  125. data/lib/aws-sdk-code-generator/generators/resource/action.rb +0 -88
  126. data/lib/aws-sdk-code-generator/generators/resource/batch_builder.rb +0 -211
  127. data/lib/aws-sdk-code-generator/generators/resource/builder.rb +0 -50
  128. data/lib/aws-sdk-code-generator/generators/resource/client_getter.rb +0 -15
  129. data/lib/aws-sdk-code-generator/generators/resource/client_request.rb +0 -49
  130. data/lib/aws-sdk-code-generator/generators/resource/client_request_docs.rb +0 -97
  131. data/lib/aws-sdk-code-generator/generators/resource/client_request_params.rb +0 -88
  132. data/lib/aws-sdk-code-generator/generators/resource/collection_class.rb +0 -180
  133. data/lib/aws-sdk-code-generator/generators/resource/data_attribute_getter.rb +0 -24
  134. data/lib/aws-sdk-code-generator/generators/resource/data_loaded_method.rb +0 -18
  135. data/lib/aws-sdk-code-generator/generators/resource/data_method.rb +0 -49
  136. data/lib/aws-sdk-code-generator/generators/resource/exists_method.rb +0 -29
  137. data/lib/aws-sdk-code-generator/generators/resource/extract_identifier_method.rb +0 -32
  138. data/lib/aws-sdk-code-generator/generators/resource/has_association.rb +0 -101
  139. data/lib/aws-sdk-code-generator/generators/resource/has_many_association.rb +0 -108
  140. data/lib/aws-sdk-code-generator/generators/resource/identifier_getter.rb +0 -26
  141. data/lib/aws-sdk-code-generator/generators/resource/identifiers_method.rb +0 -28
  142. data/lib/aws-sdk-code-generator/generators/resource/initialize_method.rb +0 -67
  143. data/lib/aws-sdk-code-generator/generators/resource/load_method.rb +0 -65
  144. data/lib/aws-sdk-code-generator/generators/resource/value_source.rb +0 -68
  145. data/lib/aws-sdk-code-generator/generators/resource/waiter_method.rb +0 -61
  146. data/lib/aws-sdk-code-generator/generators/resource_class.rb +0 -325
  147. data/lib/aws-sdk-code-generator/generators/response_structure_example.rb +0 -83
  148. data/lib/aws-sdk-code-generator/generators/root_resource_class.rb +0 -42
  149. data/lib/aws-sdk-code-generator/generators/service_documentation.rb +0 -64
  150. data/lib/aws-sdk-code-generator/generators/shared_example.rb +0 -132
  151. data/lib/aws-sdk-code-generator/generators/structure_type_class.rb +0 -95
  152. data/lib/aws-sdk-code-generator/generators/syntax_example.rb +0 -169
  153. data/lib/aws-sdk-code-generator/generators/types_module.rb +0 -52
  154. data/lib/aws-sdk-code-generator/generators/waiter_class.rb +0 -62
  155. 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,15 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Generators
3
- module Resource
4
- class ClientGetter < Dsl::Method
5
-
6
- def initialize
7
- super('client')
8
- returns('Client')
9
- code('@client')
10
- end
11
-
12
- end
13
- end
14
- end
15
- 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