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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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