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
@@ -27,23 +27,26 @@ module AwsSdkCodeGenerator
27
27
  SHAPE_KEYS = {
28
28
  # keep
29
29
  'flattened' => true,
30
- 'timestampFormat' => true, # glacier api customization
30
+ 'timestampFormat' => true,
31
31
  'xmlNamespace' => true,
32
- 'streaming' => true, # transfer-encoding
33
- 'requiresLength' => true, # transfer-encoding
34
- 'union' => false, # should remain false
32
+ 'streaming' => true,
33
+ 'requiresLength' => true,
34
+ 'union' => false, # handled separately - should remain false
35
35
  'document' => true,
36
36
  'jsonvalue' => true,
37
+ 'error' => true,
38
+ 'locationName' => true,
39
+ # ignore
37
40
  # event stream modeling
38
41
  'event' => false,
39
42
  'eventstream' => false,
40
43
  'eventheader' => false,
41
44
  'eventpayload' => false,
42
- # ignore
45
+ 'exceptionEvent' => false, # internal, exceptions cannot be events
46
+ # other
43
47
  'synthetic' => false,
44
48
  'box' => false,
45
49
  'fault' => false,
46
- 'error' => false,
47
50
  'deprecated' => false,
48
51
  'deprecatedMessage' => false,
49
52
  'type' => false,
@@ -51,7 +54,6 @@ module AwsSdkCodeGenerator
51
54
  'members' => false,
52
55
  'member' => false,
53
56
  'key' => false,
54
- 'locationName' => false,
55
57
  'value' => false,
56
58
  'required' => false,
57
59
  'enum' => false,
@@ -67,27 +69,29 @@ module AwsSdkCodeGenerator
67
69
  }
68
70
 
69
71
  METADATA_KEYS = {
70
- # keep all
72
+ # keep
71
73
  'endpointPrefix' => true,
72
74
  'signatureVersion' => true,
75
+ 'auth' => true,
73
76
  'signingName' => true,
74
77
  'serviceFullName' => true,
75
78
  'protocol' => true,
79
+ 'protocols' => true,
76
80
  'targetPrefix' => true,
77
81
  'jsonVersion' => true,
78
82
  'errorPrefix' => true,
79
- 'timestampFormat' => true, # glacier api customization
83
+ 'timestampFormat' => true,
80
84
  'xmlNamespace' => true,
81
- 'protocolSettings' => {}, # current unused unless for h2 exclude
85
+ 'protocolSettings' => {},
82
86
  'serviceId' => true,
83
87
  'apiVersion' => true,
84
88
  'checksumFormat' => true,
85
89
  'globalEndpoint' => true,
86
90
  'serviceAbbreviation' => true,
87
91
  'uid' => true,
88
- 'awsQueryCompatible' => true, # AwsQuery migration
92
+ 'awsQueryCompatible' => true,
89
93
  # ignore
90
- 'ripServiceName' => true
94
+ 'ripServiceName' => false
91
95
  }
92
96
 
93
97
  # @option options [required, Service] :service
@@ -98,6 +102,7 @@ module AwsSdkCodeGenerator
98
102
  # @return [String|nil]
99
103
  def generated_src_warning
100
104
  return if @service.protocol == 'api-gateway'
105
+
101
106
  GENERATED_SRC_WARNING
102
107
  end
103
108
 
@@ -187,7 +192,11 @@ module AwsSdkCodeGenerator
187
192
  value: @service.api['metadata'][key].inspect
188
193
  }
189
194
  elsif METADATA_KEYS[key].nil?
190
- raise "unhandled metadata key #{key.inspect}"
195
+ AwsSdkCodeGenerator.warn(
196
+ @service.service_id,
197
+ :invalid_key,
198
+ "unhandled metadata key `#{key}`"
199
+ )
191
200
  end
192
201
  end
193
202
  metadata
@@ -204,12 +213,18 @@ module AwsSdkCodeGenerator
204
213
  if operation.key?('httpChecksum')
205
214
  operation['httpChecksum']['requestAlgorithmMember'] = underscore(operation['httpChecksum']['requestAlgorithmMember']) if operation['httpChecksum']['requestAlgorithmMember']
206
215
  operation['httpChecksum']['requestValidationModeMember'] = underscore(operation['httpChecksum']['requestValidationModeMember']) if operation['httpChecksum']['requestValidationModeMember']
207
-
208
216
  o.http_checksum = operation['httpChecksum'].inject([]) do |a, (k, v)|
209
217
  a << { key: k.inspect, value: v.inspect }
210
218
  a
211
219
  end
212
220
  end
221
+
222
+ if operation.key?('requestcompression')
223
+ o.request_compression = operation['requestcompression'].each_with_object([]) do |(k, v), arr|
224
+ arr << { key: k.inspect, value: v.inspect }
225
+ end
226
+ end
227
+
213
228
  %w(input output).each do |key|
214
229
  if operation[key]
215
230
  o.shape_references << "o.#{key} = #{operation_ref(operation[key])}"
@@ -240,6 +255,8 @@ module AwsSdkCodeGenerator
240
255
  end
241
256
  o.authorizer = operation['authorizer'] if operation.key?('authorizer')
242
257
  o.authtype = operation['authtype'] if operation.key?('authtype')
258
+ o.unsigned_payload = operation['unsignedPayload'] if operation.key?('unsignedPayload')
259
+ o.auth = operation['auth'] if operation.key?('auth')
243
260
  o.require_apikey = operation['requiresApiKey'] if operation.key?('requiresApiKey')
244
261
  o.pager = pager(operation_name)
245
262
  o.async = @service.protocol_settings['h2'] == 'eventstream' &&
@@ -250,6 +267,7 @@ module AwsSdkCodeGenerator
250
267
 
251
268
  def apig_authorizer
252
269
  return nil unless @service.api.key? 'authorizers'
270
+
253
271
  @service.api['authorizers'].map do |name, authorizer|
254
272
  Authorizer.new.tap do |a|
255
273
  a.name = name
@@ -298,9 +316,16 @@ module AwsSdkCodeGenerator
298
316
  args << "name: '#{shape_name}'"
299
317
  shape.each_pair do |key, value|
300
318
  if SHAPE_KEYS[key]
319
+ # only query protocols have custom error code
320
+ next if @service.protocol != 'query' && key == 'error'
321
+
301
322
  args << "#{key}: #{value.inspect}"
302
323
  elsif SHAPE_KEYS[key].nil?
303
- raise "unhandled shape key #{key.inspect}"
324
+ AwsSdkCodeGenerator.warn(
325
+ @service.service_id,
326
+ :invalid_key,
327
+ "unhandled shape key `#{key}` on `#{shape_name}`"
328
+ )
304
329
  end
305
330
  end
306
331
  args.join(', ')
@@ -491,8 +516,16 @@ module AwsSdkCodeGenerator
491
516
  options = {}
492
517
  metadata.each_pair do |key, value|
493
518
  next if key == 'resultWrapper'
519
+
494
520
  if key == 'locationName'
495
- options[:location_name] = value.inspect
521
+ options[:location_name] =
522
+ # use the xmlName on shape if defined
523
+ if (@service.protocol == 'rest-xml') &&
524
+ (shape_location_name = @service.api['shapes'][shape_name]['locationName'])
525
+ shape_location_name.inspect
526
+ else
527
+ value.inspect
528
+ end
496
529
  else
497
530
  options[:metadata] ||= {}
498
531
  options[:metadata][key] = value.inspect
@@ -551,6 +584,9 @@ module AwsSdkCodeGenerator
551
584
  # @return [Hash]
552
585
  attr_accessor :http_checksum
553
586
 
587
+ # @return [Hash]
588
+ attr_accessor :request_compression
589
+
554
590
  # @return [Array<String>]
555
591
  attr_accessor :shape_references
556
592
 
@@ -572,6 +608,12 @@ module AwsSdkCodeGenerator
572
608
  # @return [String,nil]
573
609
  attr_accessor :authtype
574
610
 
611
+ # @return [Boolean,nil]
612
+ attr_accessor :unsigned_payload
613
+
614
+ # @return [Array<String>]
615
+ attr_accessor :auth
616
+
575
617
  # @return [Boolean]
576
618
  attr_accessor :endpoint_trait
577
619
 
@@ -27,10 +27,14 @@ module AwsSdkCodeGenerator
27
27
  @gem_version = options.fetch(:gem_version)
28
28
  @plugins = PluginList.new(options)
29
29
  @codegenerated_plugins = options.fetch(:codegenerated_plugins, [])
30
+ @default_plugins = Seahorse::Client::Base.plugins.map do |plugin|
31
+ PluginList::Plugin.new(class_name: plugin.name, options: plugin.options, path: '')
32
+ end
30
33
  @client_constructor = ClientConstructor.new(
31
34
  options.merge(
32
35
  plugins: @plugins,
33
- codegenerated_plugins: @codegenerated_plugins))
36
+ codegenerated_plugins: @codegenerated_plugins,
37
+ default_plugins: @default_plugins))
34
38
  @operations = ClientOperationList.new(options).to_a
35
39
  @waiters = Waiter.build_list(options[:waiters])
36
40
  @custom = options.fetch(:custom)
@@ -9,7 +9,7 @@ module AwsSdkCodeGenerator
9
9
  @service = options.fetch(:service)
10
10
  if (parameters = @service.endpoint_rules&.fetch('parameters'))
11
11
  @parameters = parameters.map do |k,p|
12
- EndpointParameter.new(k, p)
12
+ EndpointParameter.new(k, p, @service)
13
13
  end
14
14
  end
15
15
  end
@@ -17,6 +17,11 @@ module AwsSdkCodeGenerator
17
17
  # @return [Array<EndpointParameter>]
18
18
  attr_reader :parameters
19
19
 
20
+ # @return [Array<EndpointParameter>]
21
+ def config_parameters
22
+ parameters.select { |p| p.source == 'config' }
23
+ end
24
+
20
25
  # @return [String|nil]
21
26
  def generated_src_warning
22
27
  return if @service.protocol == 'api-gateway'
@@ -26,55 +31,6 @@ module AwsSdkCodeGenerator
26
31
  def module_name
27
32
  @service.module_name
28
33
  end
29
-
30
- class EndpointParameter
31
- def initialize(name, definition={})
32
- @name = name
33
- @type = definition['type']
34
- @built_in = definition['builtIn']
35
- @default = definition['default']
36
- @required = definition['required']
37
- @documentation = "# @!attribute #{underscore_name}\n"
38
- if definition['documentation']
39
- @documentation += " # #{definition['documentation']}\n"
40
- end
41
- if deprecated = definition['deprecated']
42
- @documentation += " #\n # @deprecated\n"
43
- if deprecated['message']
44
- @documentation += " # #{deprecated['message']}\n"
45
- end
46
- if deprecated['since']
47
- @documentation += " # Since: #{deprecated['since']}\n"
48
- end
49
- end
50
- @documentation += " #\n # @return [#{@type}]\n #"
51
- end
52
-
53
- # @return [String]
54
- attr_reader :name
55
-
56
- # @return [String]
57
- attr_reader :documentation
58
-
59
- # @return [Boolean]
60
- attr_reader :required
61
-
62
- # @return [String,Boolean]
63
- attr_reader :default
64
-
65
- def default?
66
- !@default.nil?
67
- end
68
-
69
- def boolean_default?
70
- default? && (@default == true || @default == false)
71
- end
72
-
73
- def underscore_name
74
- Underscore.underscore(name)
75
- end
76
- end
77
-
78
34
  end
79
35
  end
80
36
  end
@@ -9,6 +9,11 @@ module AwsSdkCodeGenerator
9
9
  def initialize(options)
10
10
  @service = options.fetch(:service)
11
11
  @endpoint_rules = @service.endpoint_rules
12
+ # Used to collect metrics in the generated endpoint provider
13
+ @has_account_id_endpoint_mode =
14
+ @endpoint_rules['parameters'].find do |_, param|
15
+ param['builtIn'] == 'AWS::Auth::AccountIdEndpointMode'
16
+ end
12
17
 
13
18
  version = @endpoint_rules['version']
14
19
  return if version&.match(/^\d+\.\d+$/) # && version == '1.0'
@@ -76,6 +81,10 @@ module AwsSdkCodeGenerator
76
81
  if endpoint['properties']
77
82
  res << ", properties: #{templated_hash_to_s(endpoint['properties'])}"
78
83
  end
84
+ if @has_account_id_endpoint_mode
85
+ account_id_endpoint = endpoint['url'].include?('{AccountId}')
86
+ res << ", metadata: { account_id_endpoint: #{account_id_endpoint} }"
87
+ end
79
88
  res << ")\n"
80
89
  indent(res.string, levels)
81
90
  end
@@ -10,11 +10,12 @@ module AwsSdkCodeGenerator
10
10
  @parameters = @service.endpoint_rules.fetch('parameters', {})
11
11
 
12
12
  @endpoint_classes = @service.api['operations'].each.with_object([]) do
13
- |(name, op), array|
14
- array << EndpointClass.new(
13
+ |(name, op), classes|
14
+ endpoint_class = EndpointClass.new(
15
15
  name: name,
16
16
  parameters: endpoint_parameters_for_operation(op)
17
17
  )
18
+ classes << endpoint_class unless endpoint_class.parameters.empty?
18
19
  end
19
20
  end
20
21
 
@@ -31,147 +32,40 @@ module AwsSdkCodeGenerator
31
32
  @service.module_name
32
33
  end
33
34
 
35
+ def operation_specific_parameters?
36
+ @endpoint_classes.empty?
37
+ end
38
+
34
39
  class EndpointClass
35
40
  def initialize(options)
36
41
  @name = options[:name]
42
+ @operation = Underscore.underscore(@name)
37
43
  @parameters = options[:parameters]
38
44
  end
39
45
 
40
46
  # @return [String]
41
47
  attr_reader :name
42
48
 
43
- # @return [Array<EndpointParameter>]
44
- attr_reader :parameters
45
-
46
- def has_endpoint_built_in?
47
- parameters.any? { |p| p.param_data['builtIn'] == 'SDK::Endpoint' }
48
- end
49
- end
50
-
51
- class EndpointParameter
52
- def initialize(options)
53
- @key = options[:key]
54
- @value = options[:value]
55
- @source = options[:source]
56
- @param_data = options[:param_data]
57
- end
58
-
59
- # @return [String]
60
- attr_accessor :key
61
-
62
- # @return [String]
63
- attr_accessor :value
64
-
65
49
  # @return [String]
66
- attr_accessor :source
50
+ attr_reader :operation
67
51
 
68
- # @return [Hash]
69
- attr_accessor :param_data
70
-
71
- def static_string?
72
- @source == 'staticContextParam' && value.is_a?(String)
73
- end
52
+ # @return [Array<EndpointParameter>]
53
+ attr_reader :parameters
74
54
  end
75
55
 
76
-
77
56
  private
78
57
 
79
58
  def endpoint_parameters_for_operation(operation)
80
- @parameters.each.with_object([]) do |(param_name, param_data), endpoint_parameters|
81
- value, source = endpoint_parameter_value(
82
- operation, param_name, param_data
83
- )
84
-
85
- endpoint_parameters << EndpointParameter.new(
86
- key: Underscore.underscore(param_name),
87
- value: value,
88
- source: source,
89
- param_data: param_data
59
+ @parameters.each.with_object([]) do |(param_name, param_data), parameters|
60
+ p = EndpointParameter.new(
61
+ param_name,
62
+ param_data,
63
+ @service,
64
+ operation
90
65
  )
66
+ parameters << p if p.source == 'operation'
91
67
  end
92
68
  end
93
-
94
- # Most to least
95
- # staticContextParams
96
- # contextParam
97
- # clientContextParams
98
- # Built-In Bindings
99
- # Built-in binding default values
100
- def endpoint_parameter_value(operation, param_name, param_data)
101
- value, source = [
102
- static_context_param(operation, param_name), 'staticContextParam'
103
- ]
104
- value, source = [
105
- context_param_value(operation, param_name), 'contextParam'
106
- ] unless value
107
- value, source = [
108
- client_context_param_value(param_name, param_data),
109
- 'clientContextParam'
110
- ] unless value
111
- value, source = [
112
- built_in_client_context_param_value(param_data), 'builtIn'
113
- ] unless value
114
-
115
- [value || 'nil', source]
116
- end
117
-
118
- def client_context_param_value(param_name, param_data)
119
- if @service.api['clientContextParams']&.key?(param_name) &&
120
- !param_data['builtIn']
121
- "context.config.#{Underscore.underscore(param_name)}"
122
- end
123
- end
124
-
125
- def built_in_client_context_param_value(param_data)
126
- case param_data['builtIn']
127
- when 'AWS::Region'
128
- 'context.config.region'
129
- when 'AWS::UseFIPS'
130
- 'context.config.use_fips_endpoint'
131
- when 'AWS::UseDualStack'
132
- if @service.name == 'S3' || @service.name == 'S3Control'
133
- 'context[:use_dualstack_endpoint]'
134
- else
135
- 'context.config.use_dualstack_endpoint'
136
- end
137
- when 'AWS::STS::UseGlobalEndpoint'
138
- "context.config.sts_regional_endpoints == 'legacy'"
139
- when 'AWS::S3::UseGlobalEndpoint'
140
- "context.config.s3_us_east_1_regional_endpoint == 'legacy'"
141
- when 'AWS::S3::Accelerate'
142
- if @service.name == 'S3' || @service.name == 'S3Control'
143
- 'context[:use_accelerate_endpoint]'
144
- else
145
- 'context.config.use_accelerate_endpoint'
146
- end
147
- when 'AWS::S3::ForcePathStyle'
148
- 'context.config.force_path_style'
149
- when 'AWS::S3::UseArnRegion', 'AWS::S3Control::UseArnRegion'
150
- 'context.config.s3_use_arn_region'
151
- when 'AWS::S3::DisableMultiRegionAccessPoints'
152
- 'context.config.s3_disable_multiregion_access_points'
153
- when 'SDK::Endpoint'
154
- 'endpoint'
155
- end
156
- end
157
-
158
- def context_param_value(operation, param_name)
159
- return nil unless operation['input']
160
-
161
- input_shape = operation['input']['shape']
162
- members = @service.api['shapes'][input_shape].fetch('members', {})
163
- members.detect do |(member_name, member)|
164
- context_param = member.fetch('contextParam', {})
165
- if context_param.fetch('name', nil) == param_name
166
- break "context.params[:#{Underscore.underscore(member_name)}]"
167
- end
168
- end
169
- end
170
-
171
- def static_context_param(operation, param_name)
172
- operation.fetch('staticContextParams', {})
173
- .fetch(param_name, {}).fetch('value', nil)
174
- end
175
69
  end
176
70
  end
177
71
  end
@@ -6,15 +6,25 @@ module AwsSdkCodeGenerator
6
6
  # @option options [required, Service] :service
7
7
  def initialize(options)
8
8
  @service = options.fetch(:service)
9
- if (client_options = @service.api['clientContextParams'])
10
- endpoint_parameters = @service.endpoint_rules.fetch('parameters', {})
9
+ endpoint_parameters = @service.endpoint_rules.fetch('parameters', {})
10
+
11
+ # HACK: AccountIdEndpointMode should likely be a client context
12
+ # param, but it's a built in that should be per-service.
13
+ @endpoint_options = []
14
+ endpoint_parameters.each do |_key, data|
15
+ next unless data['builtIn'] == 'AWS::Auth::AccountIdEndpointMode'
11
16
 
12
- @endpoint_options = client_options.each.with_object([]) do |(name, _data), array|
17
+ @endpoint_options << account_id_endpoint_mode_option
18
+ @account_id_endpoint_mode = true
19
+ end
20
+
21
+ if (client_options = @service.api['clientContextParams'])
22
+ client_options.each do |name, _data|
13
23
  param_data = endpoint_parameters[name]
14
24
 
15
25
  next if param_data['builtIn']
16
26
 
17
- array << EndpointOption.new(
27
+ @endpoint_options << EndpointOption.new(
18
28
  name: Underscore.underscore(name),
19
29
  docstring: param_data['documentation'],
20
30
  doc_type: param_data['type'],
@@ -22,6 +32,7 @@ module AwsSdkCodeGenerator
22
32
  )
23
33
  end
24
34
  end
35
+
25
36
  @endpoint_classes = @service.api['operations'].each.with_object([]) do
26
37
  |(op, _api), array|
27
38
  array << EndpointClass.new(
@@ -47,6 +58,37 @@ module AwsSdkCodeGenerator
47
58
  @service.module_name
48
59
  end
49
60
 
61
+ def has_account_id_endpoint_mode?
62
+ @account_id_endpoint_mode
63
+ end
64
+
65
+ private
66
+
67
+ def account_id_endpoint_mode_option
68
+ docstring = <<-DOCSTRING.chomp
69
+ The account ID endpoint mode to use. This can be one of the following values:
70
+ * `preferred` - The default behavior. Use the account ID endpoint if
71
+ available, otherwise use the standard endpoint.
72
+ * `disabled` - Never use the account ID endpoint. Only use the standard
73
+ endpoint.
74
+ * `required` - Always use the account ID endpoint. If the account ID
75
+ cannot be retrieved from credentials, an error is raised.
76
+ DOCSTRING
77
+
78
+ default = <<-DEFAULT.chomp
79
+ value = ENV['AWS_ACCOUNT_ID_ENDPOINT_MODE']
80
+ value ||= Aws.shared_config.account_id_endpoint_mode(profile: cfg.profile)
81
+ value || 'preferred'
82
+ DEFAULT
83
+
84
+ EndpointOption.new(
85
+ name: 'account_id_endpoint_mode',
86
+ docstring: docstring,
87
+ doc_type: 'String',
88
+ default: default
89
+ )
90
+ end
91
+
50
92
  class EndpointClass
51
93
  def initialize(options)
52
94
  @operation_name = options[:operation_name]
@@ -23,10 +23,31 @@ module AwsSdkCodeGenerator
23
23
  GENERATED_SRC_WARNING
24
24
  end
25
25
 
26
+ # @return [String]
26
27
  def module_name
27
28
  @service.module_name
28
29
  end
29
30
 
31
+ # @return [Boolean]
32
+ def customization_file_exists?
33
+ File.exist?(
34
+ File.join(
35
+ Helper.gem_lib_path(gem_name), "#{customization_file_path}.rb"
36
+ )
37
+ )
38
+ end
39
+
40
+ # @return [String]
41
+ def customization_file_path
42
+ "#{gem_name}/customizations/errors"
43
+ end
44
+
45
+ private
46
+
47
+ # @return [String]
48
+ def gem_name
49
+ "aws-sdk-#{module_name.split('::').last.downcase}"
50
+ end
30
51
  end
31
52
  end
32
53
  end
@@ -99,9 +99,15 @@ module AwsSdkCodeGenerator
99
99
  ).to_s
100
100
  end
101
101
  param_hash_str = Docstring.join_docstrings([option_tags], block_comment: false)
102
+ param_hash =
103
+ if param_hash_str.nil?
104
+ '# This event has no members'
105
+ else
106
+ Docstring.indent(param_hash_str, ' ')
107
+ end
102
108
  m << EventEntry.new(
103
109
  name: underscore(n),
104
- param_hash: Docstring.indent(param_hash_str, ' ')
110
+ param_hash: param_hash
105
111
  )
106
112
  m
107
113
  end