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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/lib/aws-sdk-code-generator/api.rb +2 -1
  3. data/lib/aws-sdk-code-generator/client_constructor.rb +2 -1
  4. data/lib/aws-sdk-code-generator/client_operation_documentation.rb +2 -1
  5. data/lib/aws-sdk-code-generator/client_operation_list.rb +4 -0
  6. data/lib/aws-sdk-code-generator/code_builder.rb +54 -2
  7. data/lib/aws-sdk-code-generator/endpoint_parameter.rb +190 -0
  8. data/lib/aws-sdk-code-generator/eventstream_example.rb +34 -34
  9. data/lib/aws-sdk-code-generator/gem_builder.rb +3 -5
  10. data/lib/aws-sdk-code-generator/helper.rb +11 -1
  11. data/lib/aws-sdk-code-generator/plugin_list.rb +5 -2
  12. data/lib/aws-sdk-code-generator/rbs/error_list.rb +38 -0
  13. data/lib/aws-sdk-code-generator/rbs/keyword_argument_builder.rb +159 -0
  14. data/lib/aws-sdk-code-generator/rbs/method_signature.rb +11 -0
  15. data/lib/aws-sdk-code-generator/rbs/resource_action.rb +39 -0
  16. data/lib/aws-sdk-code-generator/rbs/resource_association.rb +50 -0
  17. data/lib/aws-sdk-code-generator/rbs/resource_batch_action.rb +59 -0
  18. data/lib/aws-sdk-code-generator/rbs/resource_client_request.rb +40 -0
  19. data/lib/aws-sdk-code-generator/rbs/waiter.rb +53 -0
  20. data/lib/aws-sdk-code-generator/rbs.rb +40 -0
  21. data/lib/aws-sdk-code-generator/resource_batch_action_code.rb +3 -1
  22. data/lib/aws-sdk-code-generator/resource_client_request.rb +3 -1
  23. data/lib/aws-sdk-code-generator/resource_waiter.rb +6 -5
  24. data/lib/aws-sdk-code-generator/service.rb +85 -16
  25. data/lib/aws-sdk-code-generator/views/async_client_class.rb +5 -1
  26. data/lib/aws-sdk-code-generator/views/client_api_module.rb +58 -16
  27. data/lib/aws-sdk-code-generator/views/client_class.rb +5 -1
  28. data/lib/aws-sdk-code-generator/views/endpoint_parameters_class.rb +6 -50
  29. data/lib/aws-sdk-code-generator/views/endpoint_provider_class.rb +9 -0
  30. data/lib/aws-sdk-code-generator/views/endpoints_module.rb +18 -124
  31. data/lib/aws-sdk-code-generator/views/endpoints_plugin.rb +46 -4
  32. data/lib/aws-sdk-code-generator/views/errors_module.rb +21 -0
  33. data/lib/aws-sdk-code-generator/views/event_streams_module.rb +7 -1
  34. data/lib/aws-sdk-code-generator/views/features/smoke.rb +100 -23
  35. data/lib/aws-sdk-code-generator/views/features/step_definitions.rb +1 -4
  36. data/lib/aws-sdk-code-generator/views/gemspec.rb +13 -3
  37. data/lib/aws-sdk-code-generator/views/rbs/client_class.rb +172 -0
  38. data/lib/aws-sdk-code-generator/views/rbs/errors_module.rb +28 -0
  39. data/lib/aws-sdk-code-generator/views/rbs/resource_class.rb +95 -0
  40. data/lib/aws-sdk-code-generator/views/rbs/root_resource_class.rb +30 -0
  41. data/lib/aws-sdk-code-generator/views/rbs/types_module.rb +257 -0
  42. data/lib/aws-sdk-code-generator/views/rbs/waiters_module.rb +22 -0
  43. data/lib/aws-sdk-code-generator/views/resource_class.rb +22 -0
  44. data/lib/aws-sdk-code-generator/views/root_resource_class.rb +19 -0
  45. data/lib/aws-sdk-code-generator/views/service_module.rb +41 -27
  46. data/lib/aws-sdk-code-generator/views/spec/endpoint_provider_spec_class.rb +25 -12
  47. data/lib/aws-sdk-code-generator/views/types_module.rb +34 -11
  48. data/lib/aws-sdk-code-generator.rb +29 -1
  49. data/templates/async_client_class.mustache +6 -1
  50. data/templates/client_api_module.mustache +14 -0
  51. data/templates/client_class.mustache +10 -47
  52. data/templates/endpoint_parameters_class.mustache +16 -13
  53. data/templates/endpoints_module.mustache +19 -11
  54. data/templates/endpoints_plugin.mustache +38 -20
  55. data/templates/errors_module.mustache +5 -0
  56. data/templates/features/smoke.mustache +11 -15
  57. data/templates/features/step_definitions.mustache +0 -5
  58. data/templates/gemspec.mustache +5 -2
  59. data/templates/rbs/client_class.mustache +39 -0
  60. data/templates/rbs/errors_module.mustache +17 -0
  61. data/templates/rbs/resource_class.mustache +71 -0
  62. data/templates/rbs/root_resource_class.mustache +26 -0
  63. data/templates/rbs/types_module.mustache +37 -0
  64. data/templates/rbs/waiters_module.mustache +17 -0
  65. data/templates/resource_class.mustache +8 -1
  66. data/templates/root_resource_class.mustache +5 -0
  67. data/templates/service_module.mustache +13 -3
  68. data/templates/spec/endpoint_provider_spec_class.mustache +11 -1
  69. data/templates/types_module.mustache +4 -0
  70. metadata +27 -7
  71. data/lib/aws-sdk-code-generator/views/features/smoke_step_definitions.rb +0 -26
  72. data/templates/features/smoke_step_definitions.mustache +0 -31
@@ -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']]['exceptionEvent'] = 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['exceptionEvent']
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
@@ -106,8 +106,30 @@ module AwsSdkCodeGenerator
106
106
  @identifiers.size > 0
107
107
  end
108
108
 
109
+ # @return [Boolean]
110
+ def customization_file_exists?
111
+ File.exist?(
112
+ File.join(
113
+ Helper.gem_lib_path(gem_name), "#{resource_customization}.rb"
114
+ )
115
+ )
116
+ end
117
+
118
+ # @return [String]
119
+ def resource_customization
120
+ "#{gem_name}/customizations/#{underscored_name}"
121
+ end
122
+
109
123
  private
110
124
 
125
+ def gem_name
126
+ "aws-sdk-#{module_name.split('::').last.downcase}"
127
+ end
128
+
129
+ def underscored_name
130
+ class_name.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
131
+ end
132
+
111
133
  def build_associations(options)
112
134
  ResourceAssociation.build_list(
113
135
  class_name: options.fetch(:class_name),
@@ -53,6 +53,25 @@ module AwsSdkCodeGenerator
53
53
  actions? || associations?
54
54
  end
55
55
 
56
+ # @return [Boolean]
57
+ def customization_file_exists?
58
+ File.exist?(
59
+ File.join(
60
+ Helper.gem_lib_path(gem_name), "#{customization_file_path}.rb"
61
+ )
62
+ )
63
+ end
64
+
65
+ # @return [String]
66
+ def customization_file_path
67
+ "#{gem_name}/customizations/resource"
68
+ end
69
+
70
+ private
71
+
72
+ def gem_name
73
+ "aws-sdk-#{module_name.split('::').last.downcase}"
74
+ end
56
75
  end
57
76
  end
58
77
  end
@@ -11,9 +11,12 @@ module AwsSdkCodeGenerator
11
11
  def initialize(options)
12
12
  @service = options.fetch(:service)
13
13
  @prefix = options.fetch(:prefix)
14
- @codegenerated_plugins = options.fetch(:codegenerated_plugins)
14
+ @codegenerated_plugins = options.fetch(:codegenerated_plugins) || []
15
15
  end
16
16
 
17
+ # @return [String]
18
+ attr_reader :prefix
19
+
17
20
  # @return [String|nil]
18
21
  def generated_src_warning
19
22
  return if @service.protocol == 'api-gateway'
@@ -60,47 +63,57 @@ module AwsSdkCodeGenerator
60
63
  @service.included_in_core?
61
64
  end
62
65
 
63
- # @return [Array<String>]
64
- def relative_requires
65
- paths = Set.new
66
- paths << "#{@prefix}/types"
67
- paths << "#{@prefix}/client_api"
66
+ # @return [String]
67
+ def service_identifier
68
+ @service.identifier
69
+ end
70
+
71
+ # @return [Array<Hash>] list of autoload path hashes with :path, :class_name and
72
+ # :is_plugin keys.
73
+ def autoloads
74
+ paths = []
75
+ paths << auto_load("#{@prefix}/types", :Types)
76
+ paths << auto_load("#{@prefix}/client_api", :ClientApi)
68
77
 
69
78
  # these must be required before the client
70
- if @codegenerated_plugins
71
- paths += @codegenerated_plugins.map { | p| p.path }
79
+ paths += @codegenerated_plugins.map do |p|
80
+ auto_load(p.path, p.class_name.split('::').last, true)
72
81
  end
73
82
 
74
- paths << "#{@prefix}/client"
75
- paths << "#{@prefix}/errors"
76
- paths << "#{@prefix}/waiters" if @service.waiters
77
- paths << "#{@prefix}/resource"
83
+ paths << auto_load("#{@prefix}/client", :Client)
84
+ paths << auto_load("#{@prefix}/errors", :Errors)
85
+ paths << auto_load("#{@prefix}/waiters", :Waiters) if @service.waiters
86
+ paths << auto_load("#{@prefix}/resource", :Resource)
78
87
 
79
88
  unless @service.legacy_endpoints?
80
- paths << "#{@prefix}/endpoint_parameters"
81
- paths << "#{@prefix}/endpoint_provider"
82
- paths << "#{@prefix}/endpoints"
89
+ paths << auto_load("#{@prefix}/endpoint_parameters", :EndpointParameters)
90
+ paths << auto_load("#{@prefix}/endpoint_provider", :EndpointProvider)
91
+ paths << auto_load("#{@prefix}/endpoints", :Endpoints)
83
92
  end
84
93
 
85
94
  if @service.resources && @service.resources['resources']
86
95
  @service.resources['resources'].keys.each do |resource_name|
87
96
  path = "#{@prefix}/#{underscore(resource_name)}"
88
- if paths.include?(path)
89
- raise "resource path conflict for `#{resource_name}'"
90
- else
91
- paths << path
92
- end
97
+ paths << auto_load(path, resource_name)
93
98
  end
94
99
  end
95
- paths << "#{@prefix}/customizations"
96
100
  if @service.api['metadata']['protocolSettings'] &&
97
- @service.api['metadata']['protocolSettings']['h2'] == 'eventstream'
98
- paths << "#{@prefix}/async_client"
99
- paths << "#{@prefix}/event_streams"
101
+ @service.api['metadata']['protocolSettings']['h2'] == 'eventstream'
102
+ paths << auto_load("#{@prefix}/async_client", :AsyncClient)
103
+ paths << auto_load("#{@prefix}/event_streams", :EventStreams)
100
104
  elsif eventstream_shape?
101
- paths << "#{@prefix}/event_streams"
105
+ paths << auto_load("#{@prefix}/event_streams", :EventStreams)
102
106
  end
103
- paths.to_a
107
+
108
+ paths
109
+ end
110
+
111
+ def auto_load(path, class_name, is_plugin = false)
112
+ {
113
+ file_path: path,
114
+ class_name: class_name,
115
+ is_plugin: is_plugin
116
+ }
104
117
  end
105
118
 
106
119
  def example_var_name
@@ -108,7 +121,8 @@ module AwsSdkCodeGenerator
108
121
  end
109
122
 
110
123
  def example_operation_name
111
- raise "no operations found for the service" if @service.api['operations'].empty?
124
+ raise 'no operations found for the service' if @service.api['operations'].empty?
125
+
112
126
  underscore(@service.api['operations'].keys.first)
113
127
  end
114
128
 
@@ -51,9 +51,9 @@ module AwsSdkCodeGenerator
51
51
  operation_name: Underscore.underscore(
52
52
  operation_inputs_test['operationName']
53
53
  ),
54
- operation_params: operation_inputs_test['operationParams'] || [],
55
- built_in_params: operation_inputs_test['builtInParams'] || [],
56
- client_params: operation_inputs_test['clientParams'] || []
54
+ operation_params: operation_inputs_test['operationParams'] || {},
55
+ built_in_params: operation_inputs_test['builtInParams'] || {},
56
+ client_params: operation_inputs_test['clientParams'] || {}
57
57
  )
58
58
  end
59
59
  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
@@ -113,12 +117,13 @@ module AwsSdkCodeGenerator
113
117
  @client_params = options[:client_params].map do |k,v|
114
118
  Param.new(Underscore.underscore(k), v)
115
119
  end
116
-
117
120
  @client_params += options[:built_in_params].map do |k,v|
118
121
  built_in_to_param(k, v)
119
122
  end
120
- # the expected default of UseGlobalEndpoint does not match the SDK's default value
121
- if @service.identifier == 's3' && !options[:built_in_params].include?('AWS::S3::UseGlobalEndpoint')
123
+ # the expected default of UseGlobalEndpoint in rules
124
+ # does not match the Ruby SDK's default value
125
+ if @service.identifier == 's3' &&
126
+ !options[:built_in_params].include?('AWS::S3::UseGlobalEndpoint')
122
127
  @client_params << built_in_to_param('AWS::S3::UseGlobalEndpoint', false)
123
128
  end
124
129
  end
@@ -137,7 +142,7 @@ module AwsSdkCodeGenerator
137
142
  case value
138
143
  when Hash
139
144
  value.each_with_object({}) do |(k, v), o|
140
- o[Underscore.underscore(k)] = transform_operation_values(v)
145
+ o[Underscore.underscore(k).to_sym] = transform_operation_values(v)
141
146
  end
142
147
  when Array
143
148
  value.map { |v| transform_operation_values(v) }
@@ -154,6 +159,14 @@ module AwsSdkCodeGenerator
154
159
  Param.new('use_fips_endpoint', value)
155
160
  when 'AWS::UseDualStack'
156
161
  Param.new('use_dualstack_endpoint', value)
162
+ when 'AWS::Auth::AccountId'
163
+ Param.new(
164
+ 'credentials',
165
+ "Aws::Credentials.new('stubbed-akid', 'stubbed-secret', account_id: '#{value}')",
166
+ true
167
+ )
168
+ when 'AWS::Auth::AccountIdEndpointMode'
169
+ Param.new('account_id_endpoint_mode', value)
157
170
  when 'AWS::STS::UseGlobalEndpoint'
158
171
  Param.new('sts_regional_endpoints', value ? 'legacy' : 'regional')
159
172
  when 'AWS::S3::UseGlobalEndpoint'
@@ -162,9 +175,7 @@ module AwsSdkCodeGenerator
162
175
  Param.new('use_accelerate_endpoint', value)
163
176
  when 'AWS::S3::ForcePathStyle'
164
177
  Param.new('force_path_style', value)
165
- when 'AWS::S3::UseArnRegion'
166
- Param.new('s3_use_arn_region', value)
167
- when 'AWS::S3Control::UseArnRegion'
178
+ when 'AWS::S3::UseArnRegion', 'AWS::S3Control::UseArnRegion'
168
179
  Param.new('s3_use_arn_region', value)
169
180
  when 'AWS::S3::DisableMultiRegionAccessPoints'
170
181
  Param.new('s3_disable_multiregion_access_points', value)
@@ -177,14 +188,16 @@ module AwsSdkCodeGenerator
177
188
  end
178
189
 
179
190
  class Param
180
- def initialize(param, value)
191
+ def initialize(param, value, literal = false)
181
192
  @param = param
182
193
  @value = value
194
+ @literal = literal
183
195
  end
196
+
184
197
  attr_accessor :param
185
198
 
186
199
  def value
187
- if @value.is_a? String
200
+ if @value.is_a?(String) && !@literal
188
201
  "'#{@value}'"
189
202
  else
190
203
  @value
@@ -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']]['exceptionEvent'] = true
39
38
  end
40
39
  end
41
40
  end
@@ -81,19 +80,43 @@ module AwsSdkCodeGenerator
81
80
  end
82
81
  end
83
82
 
83
+ # @return [Array<String>]
84
+ def types_customizations
85
+ Dir.glob(File.join(Helper.gem_lib_path(gem_name), "#{gem_name}/customizations/types", '*.rb')).map do |file|
86
+ filename = File.basename(file, '.rb')
87
+ "#{gem_name}/customizations/types/#{filename}"
88
+ end
89
+ end
90
+
84
91
  private
85
92
 
93
+ def gem_name
94
+ "aws-sdk-#{module_name.split('::').last.downcase}"
95
+ end
96
+
86
97
  def struct_members(shape)
87
98
  return if shape['members'].nil?
88
99
  members = shape['members'].map do |member_name, member_ref|
100
+ member_target = @api['shapes'][member_ref['shape']]
89
101
  sensitive = !!(member_ref['sensitive'] ||
90
- @api['shapes'][member_ref['shape']]['sensitive'])
102
+ member_target['sensitive'])
103
+
104
+ case member_target["type"]
105
+ when 'map'
106
+ key_shape = @api['shapes'][member_target['key']['shape']]
107
+ value_shape = @api['shapes'][member_target['value']['shape']]
108
+ sensitive ||= !!(key_shape['sensitive'] || value_shape['sensitive'])
109
+ when 'list'
110
+ list_member = @api['shapes'][member_target['member']['shape']]
111
+ sensitive ||= !!(list_member['sensitive'])
112
+ end
113
+
91
114
  StructMember.new(
92
115
  member_name: underscore(member_name),
93
116
  sensitive: sensitive
94
117
  )
95
118
  end
96
- if shape['event']
119
+ if shape['event'] || shape['exceptionEvent']
97
120
  members << StructMember.new(member_name: 'event_type')
98
121
  end
99
122
  members
@@ -181,7 +204,7 @@ module AwsSdkCodeGenerator
181
204
 
182
205
  def see_also_tag(shape_name)
183
206
  uid = @api['metadata']['uid']
184
- if @api['metadata']['protocol'] != 'api-gateway' && Crosslink.taggable?(uid)
207
+ if @service.protocol != 'api-gateway' && Crosslink.taggable?(uid)
185
208
  Crosslink.tag_string(uid, shape_name)
186
209
  end
187
210
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'aws-sdk-core'
4
+
3
5
  require_relative 'aws-sdk-code-generator/api'
4
6
  require_relative 'aws-sdk-code-generator/apply_docs'
5
7
  require_relative 'aws-sdk-code-generator/codegenerated_plugin'
@@ -10,6 +12,7 @@ require_relative 'aws-sdk-code-generator/error_list'
10
12
  require_relative 'aws-sdk-code-generator/client_response_structure_example'
11
13
  require_relative 'aws-sdk-code-generator/crosslink'
12
14
  require_relative 'aws-sdk-code-generator/docstring'
15
+ require_relative 'aws-sdk-code-generator/endpoint_parameter'
13
16
  require_relative 'aws-sdk-code-generator/hash_formatter'
14
17
  require_relative 'aws-sdk-code-generator/helper'
15
18
  require_relative 'aws-sdk-code-generator/plugin_list'
@@ -50,7 +53,6 @@ require_relative 'aws-sdk-code-generator/views/docstring'
50
53
  require_relative 'aws-sdk-code-generator/views/errors_module'
51
54
  require_relative 'aws-sdk-code-generator/views/features/env'
52
55
  require_relative 'aws-sdk-code-generator/views/features/step_definitions'
53
- require_relative 'aws-sdk-code-generator/views/features/smoke_step_definitions'
54
56
  require_relative 'aws-sdk-code-generator/views/features/smoke'
55
57
  require_relative 'aws-sdk-code-generator/views/gemspec'
56
58
  require_relative 'aws-sdk-code-generator/views/resource_class'
@@ -76,6 +78,23 @@ require_relative 'aws-sdk-code-generator/yard_option_tag'
76
78
  require_relative 'aws-sdk-code-generator/code_builder'
77
79
  require_relative 'aws-sdk-code-generator/gem_builder'
78
80
 
81
+ # RBS
82
+ require_relative 'aws-sdk-code-generator/rbs'
83
+ require_relative 'aws-sdk-code-generator/rbs/error_list'
84
+ require_relative 'aws-sdk-code-generator/rbs/method_signature'
85
+ require_relative 'aws-sdk-code-generator/rbs/keyword_argument_builder'
86
+ require_relative 'aws-sdk-code-generator/rbs/resource_action'
87
+ require_relative 'aws-sdk-code-generator/rbs/resource_association'
88
+ require_relative 'aws-sdk-code-generator/rbs/resource_batch_action'
89
+ require_relative 'aws-sdk-code-generator/rbs/resource_client_request'
90
+ require_relative 'aws-sdk-code-generator/rbs/waiter'
91
+ require_relative 'aws-sdk-code-generator/views/rbs/client_class'
92
+ require_relative 'aws-sdk-code-generator/views/rbs/errors_module'
93
+ require_relative 'aws-sdk-code-generator/views/rbs/resource_class'
94
+ require_relative 'aws-sdk-code-generator/views/rbs/root_resource_class'
95
+ require_relative 'aws-sdk-code-generator/views/rbs/types_module'
96
+ require_relative 'aws-sdk-code-generator/views/rbs/waiters_module'
97
+
79
98
  module AwsSdkCodeGenerator
80
99
 
81
100
  GENERATED_SRC_WARNING = <<-WARNING_TXT
@@ -87,4 +106,13 @@ module AwsSdkCodeGenerator
87
106
  # WARNING ABOUT GENERATED CODE
88
107
  WARNING_TXT
89
108
 
109
+ @warnings = []
110
+
111
+ class << self
112
+ attr_reader :warnings
113
+ def warn(service, type, message)
114
+ Kernel.warn(message)
115
+ @warnings << { service: service, type: type, message: message }
116
+ end
117
+ end
90
118
  end