aws-sdk-code-generator 0.4.0.pre → 0.5.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/lib/aws-sdk-code-generator/client_constructor.rb +2 -1
  3. data/lib/aws-sdk-code-generator/code_builder.rb +52 -0
  4. data/lib/aws-sdk-code-generator/eventstream_example.rb +34 -34
  5. data/lib/aws-sdk-code-generator/gem_builder.rb +3 -5
  6. data/lib/aws-sdk-code-generator/plugin_list.rb +2 -1
  7. data/lib/aws-sdk-code-generator/rbs/error_list.rb +38 -0
  8. data/lib/aws-sdk-code-generator/rbs/keyword_argument_builder.rb +159 -0
  9. data/lib/aws-sdk-code-generator/rbs/method_signature.rb +11 -0
  10. data/lib/aws-sdk-code-generator/rbs/resource_action.rb +39 -0
  11. data/lib/aws-sdk-code-generator/rbs/resource_association.rb +50 -0
  12. data/lib/aws-sdk-code-generator/rbs/resource_batch_action.rb +59 -0
  13. data/lib/aws-sdk-code-generator/rbs/resource_client_request.rb +40 -0
  14. data/lib/aws-sdk-code-generator/rbs/waiter.rb +53 -0
  15. data/lib/aws-sdk-code-generator/rbs.rb +40 -0
  16. data/lib/aws-sdk-code-generator/resource_batch_action_code.rb +3 -1
  17. data/lib/aws-sdk-code-generator/resource_client_request.rb +3 -1
  18. data/lib/aws-sdk-code-generator/resource_waiter.rb +6 -5
  19. data/lib/aws-sdk-code-generator/service.rb +21 -0
  20. data/lib/aws-sdk-code-generator/views/async_client_class.rb +5 -1
  21. data/lib/aws-sdk-code-generator/views/client_api_module.rb +29 -4
  22. data/lib/aws-sdk-code-generator/views/client_class.rb +5 -1
  23. data/lib/aws-sdk-code-generator/views/event_streams_module.rb +7 -1
  24. data/lib/aws-sdk-code-generator/views/features/smoke.rb +99 -23
  25. data/lib/aws-sdk-code-generator/views/features/step_definitions.rb +1 -4
  26. data/lib/aws-sdk-code-generator/views/gemspec.rb +13 -3
  27. data/lib/aws-sdk-code-generator/views/rbs/client_class.rb +172 -0
  28. data/lib/aws-sdk-code-generator/views/rbs/errors_module.rb +28 -0
  29. data/lib/aws-sdk-code-generator/views/rbs/resource_class.rb +95 -0
  30. data/lib/aws-sdk-code-generator/views/rbs/root_resource_class.rb +30 -0
  31. data/lib/aws-sdk-code-generator/views/rbs/types_module.rb +257 -0
  32. data/lib/aws-sdk-code-generator/views/rbs/waiters_module.rb +22 -0
  33. data/lib/aws-sdk-code-generator/views/spec/endpoint_provider_spec_class.rb +5 -1
  34. data/lib/aws-sdk-code-generator/views/types_module.rb +8 -9
  35. data/lib/aws-sdk-code-generator.rb +17 -1
  36. data/templates/client_api_module.mustache +7 -0
  37. data/templates/client_class.mustache +0 -45
  38. data/templates/endpoints_module.mustache +1 -0
  39. data/templates/endpoints_plugin.mustache +4 -2
  40. data/templates/features/smoke.mustache +11 -15
  41. data/templates/features/step_definitions.mustache +0 -5
  42. data/templates/gemspec.mustache +5 -2
  43. data/templates/rbs/client_class.mustache +39 -0
  44. data/templates/rbs/errors_module.mustache +17 -0
  45. data/templates/rbs/resource_class.mustache +71 -0
  46. data/templates/rbs/root_resource_class.mustache +26 -0
  47. data/templates/rbs/types_module.mustache +37 -0
  48. data/templates/rbs/waiters_module.mustache +17 -0
  49. data/templates/resource_class.mustache +3 -1
  50. data/templates/spec/endpoint_provider_spec_class.mustache +10 -0
  51. metadata +24 -5
  52. data/lib/aws-sdk-code-generator/views/features/smoke_step_definitions.rb +0 -26
  53. data/templates/features/smoke_step_definitions.mustache +0 -31
@@ -0,0 +1,172 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AwsSdkCodeGenerator
4
+ module Views
5
+ module RBS
6
+ class ClientClass < View
7
+ SKIP_MEMBERS = Set.new(%w[
8
+ context
9
+ data
10
+ error
11
+ checksum_validated
12
+ on
13
+ on_success
14
+ ])
15
+
16
+ def initialize(options)
17
+ @options = options
18
+ @service_name = options.fetch(:service_name)
19
+ @api = options.fetch(:api)
20
+ @aws_sdk_core_lib_path = options.fetch(:aws_sdk_core_lib_path)
21
+ @plugins = PluginList.new(options)
22
+ @codegenerated_plugins = options.fetch(:codegenerated_plugins)
23
+ @waiters = AwsSdkCodeGenerator::RBS::Waiter.build_list(api: @api, waiters:options.fetch(:waiters))
24
+ end
25
+
26
+ # @return [String|nil]
27
+ def generated_src_warning
28
+ GENERATED_SRC_WARNING
29
+ end
30
+
31
+ def service_name
32
+ @service_name
33
+ end
34
+
35
+ def client_option(indent: ' ' * 20)
36
+ plugin_options = documented_plugin_options(@plugins) + documented_plugin_options(@codegenerated_plugins)
37
+ [
38
+ '',
39
+ "#{indent} #{build_keyword_arguments(plugin_options).join(",\n#{indent} ")}",
40
+ indent,
41
+ ].join("\n")
42
+ end
43
+
44
+ def operations
45
+ shapes = @api["shapes"]
46
+ @api["operations"].map do |name, body|
47
+ method_name = Underscore.underscore(name)
48
+ indent = " " * (12 + method_name.length)
49
+ input_shape_name = body.dig("input", "shape")
50
+ arguments = nil
51
+ include_required = false
52
+ if input_shape_name
53
+ input_shape = shapes[input_shape_name]
54
+ builder = AwsSdkCodeGenerator::RBS::KeywordArgumentBuilder.new(
55
+ api: @api,
56
+ shape: input_shape,
57
+ newline: true,
58
+ )
59
+ arguments = builder.format(indent: indent)
60
+ include_required = input_shape["required"]&.empty?&.!
61
+ end
62
+ if AwsSdkCodeGenerator::Helper.operation_streaming?(body, @api)
63
+ block = " ?{ (*untyped) -> void }"
64
+ end
65
+ if output_shape_name = body.dig("output", "shape")
66
+ output_shape = shapes[output_shape_name]
67
+ data = AwsSdkCodeGenerator::RBS.to_type(body.fetch( "output"), @api)
68
+ interface = "_#{name}ResponseSuccess"
69
+ else
70
+ output_shape = nil
71
+ data = "::Aws::EmptyStructure"
72
+ interface = empty_interface = "::Seahorse::Client::_ResponseSuccess[::Aws::EmptyStructure]"
73
+ end
74
+ returns_members = output_shape&.[]("members")&.inject([]) do |a, (member_name, member_ref)|
75
+ member_name_underscore = Underscore.underscore(member_name)
76
+ next a if SKIP_MEMBERS.include?(member_name_underscore)
77
+ a << {
78
+ method_name: member_name_underscore,
79
+ returns: AwsSdkCodeGenerator::RBS.to_type(member_ref, @api),
80
+ }
81
+ end
82
+
83
+ {
84
+ method_name: method_name,
85
+ signature: AwsSdkCodeGenerator::RBS::MethodSignature.new(
86
+ method_name: method_name,
87
+ overloads: [
88
+ "(#{arguments})#{block} -> #{interface}",
89
+ "(#{include_required ? "" : "?"}Hash[Symbol, untyped] params, ?Hash[Symbol, untyped] options)#{block} -> #{interface}",
90
+ ]).signature,
91
+ interface: interface,
92
+ data: data,
93
+ returns_members: returns_members,
94
+ empty_structure: output_shape.nil?
95
+ }
96
+ end
97
+ end
98
+
99
+ def waiters?
100
+ @waiters.size > 0
101
+ end
102
+
103
+ def waiters_first
104
+ [@waiters.first]
105
+ end
106
+
107
+ def waiters_others
108
+ @waiters[1..-1]
109
+ end
110
+
111
+ private
112
+
113
+ def documented_plugin_options(plugins)
114
+ i = 0
115
+ plugins.map(&:options).flatten.select(&:documented?).sort_by do |opt|
116
+ [opt.required ? 'a' : 'b', opt.name, i += 1]
117
+ end
118
+ end
119
+
120
+ def build_keyword_arguments(plugins)
121
+ buffer = plugins.map do |opt|
122
+ if opt.rbs_type
123
+ opt.rbs_type
124
+ else
125
+ case opt.doc_type
126
+ when "Boolean"
127
+ "bool"
128
+ when nil
129
+ "untyped"
130
+ else
131
+ opt.doc_type.to_s
132
+ end
133
+ end.yield_self do |type|
134
+ [opt.name, "?#{opt.name}: #{type}", opt.doc_type]
135
+ end
136
+ end
137
+ # Find duplicated key
138
+ grouped = buffer.group_by { |name, _| name }
139
+ grouped.transform_values(&:count).find_all { |_, c| 1 < c }.each do |name,|
140
+ case name
141
+ when :endpoint, :endpoint_provider, :retry_limit, :disable_s3_express_session_auth
142
+ # ok
143
+ else
144
+ warn("Duplicate client option in #{@service_name}: `#{grouped[name].map { |g| g.values_at(0, 2) }}`", uplevel: 0)
145
+ end
146
+ end
147
+ buffer.uniq! { |b| b[0] }
148
+ buffer.map! { |b| b[1] }
149
+ buffer.concat([
150
+ # from mustache
151
+ "?http_proxy: String",
152
+ "?http_open_timeout: (Float | Integer)",
153
+ "?http_read_timeout: (Float | Integer)",
154
+ "?http_idle_timeout: (Float | Integer)",
155
+ "?http_continue_timeout: (Float | Integer)",
156
+ "?ssl_timeout: (Float | Integer | nil)",
157
+ "?http_wire_trace: bool",
158
+ "?ssl_verify_peer: bool",
159
+ "?ssl_ca_bundle: String",
160
+ "?ssl_ca_directory: String",
161
+ # from object
162
+ "?ssl_ca_store: String",
163
+ "?on_chunk_received: Proc",
164
+ "?on_chunk_sent: Proc",
165
+ "?raise_response_errors: bool",
166
+ ])
167
+ buffer
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AwsSdkCodeGenerator
4
+ module Views
5
+ module RBS
6
+ class ErrorsModule < View
7
+ attr_reader :errors
8
+
9
+ def initialize(service:)
10
+ @service = service
11
+ @errors = AwsSdkCodeGenerator::RBS::ErrorList.new(
12
+ api: service.api,
13
+ module_name: service.module_name
14
+ ).to_a
15
+ end
16
+
17
+ # @return [String|nil]
18
+ def generated_src_warning
19
+ GENERATED_SRC_WARNING
20
+ end
21
+
22
+ def service_name
23
+ @service.name
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AwsSdkCodeGenerator
4
+ module Views
5
+ module RBS
6
+ class ResourceClass < View
7
+ attr_reader :service_name
8
+ attr_reader :class_name
9
+ attr_reader :identifiers
10
+ attr_reader :data_attributes
11
+ attr_reader :shape
12
+ attr_reader :exists_waiters
13
+ attr_reader :waiters
14
+ attr_reader :actions
15
+ attr_reader :associations
16
+ attr_reader :batch_actions
17
+
18
+ def initialize(service_name:, class_name:, resource:, api:, paginators:)
19
+ @class_name = class_name
20
+ @resource = resource
21
+ @service_name = service_name
22
+ @identifiers = ResourceIdentifier.build_list(resource)
23
+ @data_attributes = if @resource["shape"]
24
+ data_attribute_names = AwsSdkCodeGenerator::ResourceAttribute.send(:data_attribute_names, @resource, api)
25
+ data_attribute_names.map do |member_name, member_ref|
26
+ AwsSdkCodeGenerator::RBS::MethodSignature.new(
27
+ method_name: Underscore.underscore(member_name),
28
+ overloads: ["() -> #{AwsSdkCodeGenerator::RBS.to_type(member_ref, api)}"]
29
+ )
30
+ end
31
+ else
32
+ []
33
+ end
34
+ @shape = @resource["shape"]
35
+ @exists_waiters = @resource.fetch("waiters", []).any? { |name, _| name == "Exists" }
36
+ @waiters = @resource.fetch("waiters", []).map do |waiter_name, waiter_body|
37
+ AwsSdkCodeGenerator::RBS::MethodSignature.new(
38
+ method_name: "wait_until_#{Underscore.underscore(waiter_name)}",
39
+ overloads: [
40
+ "(?max_attempts: Integer, ?delay: Numeric, ?before_attempt: (^(Integer attempts) -> void), ?before_wait: (^(Integer attempts, untyped response) -> void)) ?{ (untyped waiter) -> void } -> #{class_name}",
41
+ "(?Hash[Symbol, untyped]) ?{ (untyped waiter) -> void } -> #{class_name}",
42
+ ],
43
+ )
44
+ end
45
+ @actions = AwsSdkCodeGenerator::RBS::ResourceAction.build_method_signature_list(resource: @resource, api: api)
46
+ @associations = AwsSdkCodeGenerator::RBS::ResourceAssociation.build_method_signature_list(resource: @resource, api: api, paginators: paginators)
47
+ @batch_actions = AwsSdkCodeGenerator::RBS::ResourceBatchAction.build_method_signature_list(resource: @resource, api: api)
48
+ avoid_duplicate_methods
49
+ end
50
+
51
+ # @return [String|nil]
52
+ def generated_src_warning
53
+ GENERATED_SRC_WARNING
54
+ end
55
+
56
+ def initialize_signature
57
+ initialize_overloads =
58
+ if @identifiers.empty?
59
+ []
60
+ else
61
+ positional = @identifiers.map { |id| "#{id.type} #{id.name}" } << "Hash[Symbol, untyped] options"
62
+ keyword = @identifiers.map { |id| "#{id.name}: #{id.type}" } << "?client: Client"
63
+ [
64
+ "(#{positional.join(', ')}) -> void",
65
+ "(#{keyword.join(', ')}) -> void"
66
+ ]
67
+ end
68
+ initialize_overloads << "(Hash[Symbol, untyped] args) -> void"
69
+ "def initialize: #{initialize_overloads.join("\n | ")}"
70
+ end
71
+
72
+ def load?
73
+ @resource["load"]
74
+ end
75
+
76
+ def load_or_shape?
77
+ load? or !!shape
78
+ end
79
+
80
+ private
81
+
82
+ # `Aws::RDS::DBEngineVersion` has a duplicated method named `engine`.
83
+ # This is a rare case and should be patched minimally.
84
+ def avoid_duplicate_methods
85
+ overrided_method_names = @actions.map(&:method_name).to_set + @associations.map(&:method_name).to_set
86
+ @identifiers.each do |identifier|
87
+ if identifier.alias && overrided_method_names.include?(identifier.alias)
88
+ identifier.alias = nil
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AwsSdkCodeGenerator
4
+ module Views
5
+ module RBS
6
+ class RootResourceClass < View
7
+ attr_reader :actions
8
+ attr_reader :associations
9
+ attr_reader :service_name
10
+
11
+ def initialize(client_class:, api:, resources:, service_name:, paginators:)
12
+ @client_class = client_class
13
+ @service_name = service_name
14
+ resource = resources&.[]("service") || {}
15
+ @actions = AwsSdkCodeGenerator::RBS::ResourceAction.build_method_signature_list(resource: resource, api: api)
16
+ @associations = AwsSdkCodeGenerator::RBS::ResourceAssociation.build_method_signature_list(resource: resource, api: api, paginators: paginators)
17
+ end
18
+
19
+ # @return [String|nil]
20
+ def generated_src_warning
21
+ GENERATED_SRC_WARNING
22
+ end
23
+
24
+ def client_option
25
+ @client_class.client_option(indent: ' ' * 22)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,257 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AwsSdkCodeGenerator
4
+ module Views
5
+ module RBS
6
+ class TypesModule < View
7
+
8
+ include Helper
9
+
10
+ # @option options [required, Service] :service
11
+ def initialize(options)
12
+ @service = options.fetch(:service)
13
+ @api = @service.api
14
+ end
15
+
16
+ # @return [String|nil]
17
+ def generated_src_warning
18
+ return if @service.protocol == 'api-gateway'
19
+ GENERATED_SRC_WARNING
20
+ end
21
+
22
+ def module_name
23
+ @service.module_name
24
+ end
25
+
26
+ # @return [Array<StructClass>]
27
+ def structures
28
+ @service.api['shapes'].each do |_, shape|
29
+ if shape['eventstream']
30
+ # add internal exception_event ctrait to all exceptions
31
+ # exceptions will not have the event trait.
32
+ shape['members'].each do |name, ref|
33
+ if !!@service.api['shapes'][ref['shape']]['exception']
34
+ @service.api['shapes'][ref['shape']]['exception_event'] = true
35
+ end
36
+ end
37
+ end
38
+ end
39
+ @service.api['shapes'].inject([]) do |list, (shape_name, shape)|
40
+ # APIG model can have input/output shape with downcase and '__'
41
+ if @service.protocol == 'api-gateway'
42
+ shape_name = lstrip_prefix(upcase_first(shape_name))
43
+ end
44
+ # eventstream shape will be inheriting from enumerator
45
+ if shape['eventstream']
46
+ list
47
+ elsif shape['type'] == 'structure' && !shape['document']
48
+ struct_members = struct_members(shape)
49
+ sensitive_params = struct_members.select(&:sensitive).map do |m|
50
+ m.member_name.to_sym
51
+ end
52
+ list << StructClass.new(
53
+ class_name: shape_name,
54
+ members: struct_members,
55
+ sensitive_params: sensitive_params,
56
+ documentation: struct_class_docs(shape_name, shape),
57
+ union: shape['union']
58
+ )
59
+ else
60
+ list
61
+ end
62
+ end
63
+ end
64
+
65
+ # return [Array<EventStreamClass>]
66
+ def eventstreams
67
+ @service.api['shapes'].inject([]) do |list, (shape_name, shape)|
68
+ if shape['eventstream']
69
+ list << EventStreamClass.new(
70
+ class_name: shape_name,
71
+ types: struct_members(shape),
72
+ documentation: eventstream_class_docs(shape_name, shape)
73
+ )
74
+ else
75
+ list
76
+ end
77
+ end
78
+ end
79
+
80
+ private
81
+
82
+ def struct_members(shape)
83
+ return if shape['members'].nil?
84
+ members = shape['members'].map do |member_name, member_ref|
85
+ sensitive = !!(member_ref['sensitive'] ||
86
+ @api['shapes'][member_ref['shape']]['sensitive'])
87
+ StructMember.new(
88
+ member_name: underscore(member_name),
89
+ sensitive: sensitive,
90
+ returns: AwsSdkCodeGenerator::RBS.to_type(member_ref, @api)
91
+ )
92
+ end
93
+ if shape['event'] || shape['exception_event']
94
+ members << StructMember.new(
95
+ member_name: 'event_type',
96
+ returns: 'untyped'
97
+ )
98
+ end
99
+ members
100
+ end
101
+
102
+ def struct_class_docs(shape_name, shape)
103
+ nil
104
+ end
105
+
106
+ def eventstream_class_docs(shape_name, shape)
107
+ nil
108
+ end
109
+
110
+ def eventstream_docs(shape_name)
111
+ nil
112
+ end
113
+
114
+ def output_example_docs(shape_name, shape)
115
+ nil
116
+ end
117
+
118
+ def input_example_docs(shape_name, shape)
119
+ nil
120
+ end
121
+
122
+ def attribute_macros_docs(shape_name)
123
+ nil
124
+ end
125
+
126
+ def idempotency_token?(member_ref)
127
+ member_ref['idempotencyToken'] || shape(member_ref)['idempotencyToken']
128
+ end
129
+
130
+ def idempotency_token_msg
131
+ "<p><b>A suitable default value is auto-generated.</b> You should normally not need to pass this option.</p>"
132
+ end
133
+
134
+ def visit_shapes(shape_ref, shapes)
135
+ return if shapes.include?(shape_ref['shape']) # recursion
136
+ shapes << shape_ref['shape']
137
+ s = shape(shape_ref)
138
+ raise "cannot locate shape #{shape_ref['shape']}" if s.nil?
139
+ case s['type']
140
+ when 'structure'
141
+ return if s['members'].nil?
142
+ s['members'].each_pair do |_, member_ref|
143
+ visit_shapes(member_ref, shapes)
144
+ end
145
+ when 'list'
146
+ visit_shapes(s['member'], shapes)
147
+ when 'map'
148
+ visit_shapes(s['key'], shapes)
149
+ visit_shapes(s['value'], shapes)
150
+ end
151
+ end
152
+
153
+ def shape(shape_ref)
154
+ Api.resolve(shape_ref, @api)[1]
155
+ end
156
+
157
+ class EventStreamClass
158
+
159
+ def initialize(options)
160
+ @class_name = options.fetch(:class_name)
161
+ @types = options.fetch(:types)
162
+ @documentation = options.fetch(:documentation)
163
+ if @types.nil? || @types.empty?
164
+ @empty = true
165
+ else
166
+ @empty = false
167
+ @types.last.last = true
168
+ end
169
+ end
170
+
171
+ # @return [String]
172
+ attr_accessor :class_name
173
+
174
+ # @return [Array<StructMember>]
175
+ attr_accessor :types
176
+
177
+ # @return [String, nil]
178
+ attr_accessor :documentation
179
+
180
+ # @return [Boolean]
181
+ def empty?
182
+ @empty
183
+ end
184
+
185
+ end
186
+
187
+ class StructClass
188
+
189
+ def initialize(options)
190
+ @class_name = options.fetch(:class_name)
191
+ @members = options.fetch(:members)
192
+ @documentation = options.fetch(:documentation)
193
+ @sensitive_params = options.fetch(:sensitive_params)
194
+ @union = options.fetch(:union)
195
+ @members << StructMember.new(
196
+ member_name: :unknown,
197
+ returns: 'untyped' # FIXME
198
+ ) if @union
199
+ if @members.nil? || @members.empty?
200
+ @empty = true
201
+ else
202
+ @empty = false
203
+ @members.last.last = true
204
+ end
205
+ end
206
+
207
+ # @return [String]
208
+ attr_accessor :class_name
209
+
210
+ # @return [Array<StructMember>]
211
+ attr_accessor :members
212
+
213
+ # @return [String, nil]
214
+ attr_accessor :documentation
215
+
216
+ # @return [Array<Symbol>]
217
+ attr_accessor :sensitive_params
218
+
219
+ # @return [Boolean]
220
+ def union?
221
+ @union
222
+ end
223
+
224
+ # @return [Boolean]
225
+ def empty?
226
+ @empty
227
+ end
228
+ end
229
+
230
+ class StructMember
231
+ def initialize(member_name:, sensitive: false, returns:)
232
+ @member_name = member_name
233
+ @member_class_name = AwsSdkCodeGenerator::Helper::pascal_case(@member_name)
234
+ @sensitive = sensitive
235
+ @returns = returns
236
+ @last = false
237
+ end
238
+
239
+ # @return [String]
240
+ attr_accessor :member_name
241
+
242
+ # @return [Boolean]
243
+ attr_accessor :sensitive
244
+
245
+ # @return [String]
246
+ attr_accessor :member_class_name
247
+
248
+ # @return [String]
249
+ attr_accessor :returns
250
+
251
+ # @return [Boolean]
252
+ attr_accessor :last
253
+ end
254
+ end
255
+ end
256
+ end
257
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AwsSdkCodeGenerator
4
+ module Views
5
+ module RBS
6
+ class WaitersModule < View
7
+ attr_reader :service_name
8
+ attr_reader :waiters
9
+
10
+ def initialize(service_name:, api:, waiters:)
11
+ @service_name = service_name
12
+ @waiters = AwsSdkCodeGenerator::RBS::Waiter.build_list(api: api, waiters: waiters)
13
+ end
14
+
15
+ # @return [String|nil]
16
+ def generated_src_warning
17
+ GENERATED_SRC_WARNING
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -90,6 +90,10 @@ module AwsSdkCodeGenerator
90
90
  !@expect['endpoint']['properties']['authSchemes'].empty?
91
91
  end
92
92
 
93
+ def s3_express_auth?
94
+ expect_auth? && expected_auth['name'] == 'sigv4-s3express'
95
+ end
96
+
93
97
  def expected_headers
94
98
  @expect['endpoint']['headers'].map { |k,v| Param.new(k, v.join(",")) }
95
99
  end
@@ -137,7 +141,7 @@ module AwsSdkCodeGenerator
137
141
  case value
138
142
  when Hash
139
143
  value.each_with_object({}) do |(k, v), o|
140
- o[Underscore.underscore(k)] = transform_operation_values(v)
144
+ o[Underscore.underscore(k).to_sym] = transform_operation_values(v)
141
145
  end
142
146
  when Array
143
147
  value.map { |v| transform_operation_values(v) }
@@ -28,14 +28,13 @@ module AwsSdkCodeGenerator
28
28
 
29
29
  # @return [Array<StructClass>]
30
30
  def structures
31
- unless @service.protocol_settings.empty?
32
- if @service.protocol_settings['h2'] == 'eventstream'
33
- @service.api['shapes'].each do |_, shape|
34
- if shape['eventstream']
35
- # add event trait to all members if not exists
36
- shape['members'].each do |name, ref|
37
- @service.api['shapes'][ref['shape']]['event'] = true
38
- end
31
+ @service.api['shapes'].each do |_, shape|
32
+ if shape['eventstream']
33
+ # add internal exception_event ctrait to all exceptions
34
+ # exceptions will not have the event trait.
35
+ shape['members'].each do |name, ref|
36
+ if !!@service.api['shapes'][ref['shape']]['exception']
37
+ @service.api['shapes'][ref['shape']]['exception_event'] = true
39
38
  end
40
39
  end
41
40
  end
@@ -93,7 +92,7 @@ module AwsSdkCodeGenerator
93
92
  sensitive: sensitive
94
93
  )
95
94
  end
96
- if shape['event']
95
+ if shape['event'] || shape['exception_event']
97
96
  members << StructMember.new(member_name: 'event_type')
98
97
  end
99
98
  members
@@ -50,7 +50,6 @@ require_relative 'aws-sdk-code-generator/views/docstring'
50
50
  require_relative 'aws-sdk-code-generator/views/errors_module'
51
51
  require_relative 'aws-sdk-code-generator/views/features/env'
52
52
  require_relative 'aws-sdk-code-generator/views/features/step_definitions'
53
- require_relative 'aws-sdk-code-generator/views/features/smoke_step_definitions'
54
53
  require_relative 'aws-sdk-code-generator/views/features/smoke'
55
54
  require_relative 'aws-sdk-code-generator/views/gemspec'
56
55
  require_relative 'aws-sdk-code-generator/views/resource_class'
@@ -76,6 +75,23 @@ require_relative 'aws-sdk-code-generator/yard_option_tag'
76
75
  require_relative 'aws-sdk-code-generator/code_builder'
77
76
  require_relative 'aws-sdk-code-generator/gem_builder'
78
77
 
78
+ # RBS
79
+ require_relative 'aws-sdk-code-generator/rbs'
80
+ require_relative 'aws-sdk-code-generator/rbs/error_list'
81
+ require_relative 'aws-sdk-code-generator/rbs/method_signature'
82
+ require_relative 'aws-sdk-code-generator/rbs/keyword_argument_builder'
83
+ require_relative 'aws-sdk-code-generator/rbs/resource_action'
84
+ require_relative 'aws-sdk-code-generator/rbs/resource_association'
85
+ require_relative 'aws-sdk-code-generator/rbs/resource_batch_action'
86
+ require_relative 'aws-sdk-code-generator/rbs/resource_client_request'
87
+ require_relative 'aws-sdk-code-generator/rbs/waiter'
88
+ require_relative 'aws-sdk-code-generator/views/rbs/client_class'
89
+ require_relative 'aws-sdk-code-generator/views/rbs/errors_module'
90
+ require_relative 'aws-sdk-code-generator/views/rbs/resource_class'
91
+ require_relative 'aws-sdk-code-generator/views/rbs/root_resource_class'
92
+ require_relative 'aws-sdk-code-generator/views/rbs/types_module'
93
+ require_relative 'aws-sdk-code-generator/views/rbs/waiters_module'
94
+
79
95
  module AwsSdkCodeGenerator
80
96
 
81
97
  GENERATED_SRC_WARNING = <<-WARNING_TXT