aws-sdk-code-generator 0.5.0.pre → 0.6.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/aws-sdk-code-generator/api.rb +2 -1
- data/lib/aws-sdk-code-generator/client_operation_documentation.rb +2 -1
- data/lib/aws-sdk-code-generator/client_operation_list.rb +4 -0
- data/lib/aws-sdk-code-generator/code_builder.rb +2 -2
- data/lib/aws-sdk-code-generator/endpoint_parameter.rb +190 -0
- data/lib/aws-sdk-code-generator/helper.rb +11 -1
- data/lib/aws-sdk-code-generator/plugin_list.rb +3 -1
- data/lib/aws-sdk-code-generator/resource_batch_action_code.rb +1 -1
- data/lib/aws-sdk-code-generator/resource_client_request.rb +1 -1
- data/lib/aws-sdk-code-generator/resource_waiter.rb +1 -1
- data/lib/aws-sdk-code-generator/service.rb +65 -17
- data/lib/aws-sdk-code-generator/views/client_api_module.rb +32 -15
- data/lib/aws-sdk-code-generator/views/endpoint_parameters_class.rb +6 -50
- data/lib/aws-sdk-code-generator/views/endpoint_provider_class.rb +9 -0
- data/lib/aws-sdk-code-generator/views/endpoints_module.rb +18 -124
- data/lib/aws-sdk-code-generator/views/endpoints_plugin.rb +46 -4
- data/lib/aws-sdk-code-generator/views/errors_module.rb +21 -0
- data/lib/aws-sdk-code-generator/views/features/smoke.rb +5 -4
- data/lib/aws-sdk-code-generator/views/rbs/client_class.rb +1 -1
- data/lib/aws-sdk-code-generator/views/rbs/types_module.rb +2 -2
- data/lib/aws-sdk-code-generator/views/resource_class.rb +22 -0
- data/lib/aws-sdk-code-generator/views/root_resource_class.rb +19 -0
- data/lib/aws-sdk-code-generator/views/service_module.rb +41 -27
- data/lib/aws-sdk-code-generator/views/spec/endpoint_provider_spec_class.rb +20 -11
- data/lib/aws-sdk-code-generator/views/types_module.rb +28 -4
- data/lib/aws-sdk-code-generator.rb +12 -0
- data/templates/async_client_class.mustache +6 -1
- data/templates/client_api_module.mustache +7 -0
- data/templates/client_class.mustache +11 -3
- data/templates/endpoint_parameters_class.mustache +16 -13
- data/templates/endpoints_module.mustache +18 -11
- data/templates/endpoints_plugin.mustache +34 -18
- data/templates/errors_module.mustache +5 -0
- data/templates/resource_class.mustache +6 -1
- data/templates/root_resource_class.mustache +5 -0
- data/templates/service_module.mustache +13 -3
- data/templates/spec/endpoint_provider_spec_class.mustache +1 -1
- data/templates/types_module.mustache +4 -0
- metadata +6 -5
@@ -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),
|
14
|
-
|
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
|
-
|
50
|
+
attr_reader :operation
|
67
51
|
|
68
|
-
# @return [
|
69
|
-
|
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),
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
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
|
-
|
10
|
-
|
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
|
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
|
-
|
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
|
@@ -85,13 +85,14 @@ module AwsSdkCodeGenerator
|
|
85
85
|
when 'sigv4aRegionSet' then nil # TODO
|
86
86
|
when 'uri' then ['endpoint', raw_value]
|
87
87
|
when 'useFips' then ['use_fips_endpoint', raw_value]
|
88
|
-
when '
|
88
|
+
when 'useDualstack' then ['use_dualstack_endpoint', raw_value]
|
89
89
|
# service specific
|
90
90
|
when 'useGlobalEndpoint'
|
91
91
|
value = raw_value == 'true' ? 'legacy' : 'regional'
|
92
|
-
|
92
|
+
case @service.name
|
93
|
+
when 'S3'
|
93
94
|
['s3_us_east_1_regional_endpoint', value]
|
94
|
-
|
95
|
+
when 'STS'
|
95
96
|
['sts_regional_endpoints', value]
|
96
97
|
end
|
97
98
|
# s3 specific
|
@@ -104,7 +105,7 @@ module AwsSdkCodeGenerator
|
|
104
105
|
when 'useAccountIdRouting' then nil # TODO
|
105
106
|
else
|
106
107
|
# catch all, possible code generated config options
|
107
|
-
[
|
108
|
+
[underscore(raw_key), raw_value]
|
108
109
|
end
|
109
110
|
end
|
110
111
|
|
@@ -138,7 +138,7 @@ module AwsSdkCodeGenerator
|
|
138
138
|
grouped = buffer.group_by { |name, _| name }
|
139
139
|
grouped.transform_values(&:count).find_all { |_, c| 1 < c }.each do |name,|
|
140
140
|
case name
|
141
|
-
when :endpoint, :endpoint_provider, :retry_limit, :disable_s3_express_session_auth
|
141
|
+
when :endpoint, :endpoint_provider, :retry_limit, :disable_s3_express_session_auth, :account_id_endpoint_mode
|
142
142
|
# ok
|
143
143
|
else
|
144
144
|
warn("Duplicate client option in #{@service_name}: `#{grouped[name].map { |g| g.values_at(0, 2) }}`", uplevel: 0)
|
@@ -31,7 +31,7 @@ module AwsSdkCodeGenerator
|
|
31
31
|
# exceptions will not have the event trait.
|
32
32
|
shape['members'].each do |name, ref|
|
33
33
|
if !!@service.api['shapes'][ref['shape']]['exception']
|
34
|
-
@service.api['shapes'][ref['shape']]['
|
34
|
+
@service.api['shapes'][ref['shape']]['exceptionEvent'] = true
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -90,7 +90,7 @@ module AwsSdkCodeGenerator
|
|
90
90
|
returns: AwsSdkCodeGenerator::RBS.to_type(member_ref, @api)
|
91
91
|
)
|
92
92
|
end
|
93
|
-
if shape['event'] || shape['
|
93
|
+
if shape['event'] || shape['exceptionEvent']
|
94
94
|
members << StructMember.new(
|
95
95
|
member_name: 'event_type',
|
96
96
|
returns: 'untyped'
|
@@ -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 [
|
64
|
-
def
|
65
|
-
|
66
|
-
|
67
|
-
|
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
|
-
|
71
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
@@ -117,12 +117,13 @@ module AwsSdkCodeGenerator
|
|
117
117
|
@client_params = options[:client_params].map do |k,v|
|
118
118
|
Param.new(Underscore.underscore(k), v)
|
119
119
|
end
|
120
|
-
|
121
120
|
@client_params += options[:built_in_params].map do |k,v|
|
122
121
|
built_in_to_param(k, v)
|
123
122
|
end
|
124
|
-
# the expected default of UseGlobalEndpoint
|
125
|
-
|
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')
|
126
127
|
@client_params << built_in_to_param('AWS::S3::UseGlobalEndpoint', false)
|
127
128
|
end
|
128
129
|
end
|
@@ -158,6 +159,14 @@ module AwsSdkCodeGenerator
|
|
158
159
|
Param.new('use_fips_endpoint', value)
|
159
160
|
when 'AWS::UseDualStack'
|
160
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)
|
161
170
|
when 'AWS::STS::UseGlobalEndpoint'
|
162
171
|
Param.new('sts_regional_endpoints', value ? 'legacy' : 'regional')
|
163
172
|
when 'AWS::S3::UseGlobalEndpoint'
|
@@ -166,9 +175,7 @@ module AwsSdkCodeGenerator
|
|
166
175
|
Param.new('use_accelerate_endpoint', value)
|
167
176
|
when 'AWS::S3::ForcePathStyle'
|
168
177
|
Param.new('force_path_style', value)
|
169
|
-
when 'AWS::S3::UseArnRegion'
|
170
|
-
Param.new('s3_use_arn_region', value)
|
171
|
-
when 'AWS::S3Control::UseArnRegion'
|
178
|
+
when 'AWS::S3::UseArnRegion', 'AWS::S3Control::UseArnRegion'
|
172
179
|
Param.new('s3_use_arn_region', value)
|
173
180
|
when 'AWS::S3::DisableMultiRegionAccessPoints'
|
174
181
|
Param.new('s3_disable_multiregion_access_points', value)
|
@@ -181,14 +188,16 @@ module AwsSdkCodeGenerator
|
|
181
188
|
end
|
182
189
|
|
183
190
|
class Param
|
184
|
-
def initialize(param, value)
|
191
|
+
def initialize(param, value, literal = false)
|
185
192
|
@param = param
|
186
193
|
@value = value
|
194
|
+
@literal = literal
|
187
195
|
end
|
196
|
+
|
188
197
|
attr_accessor :param
|
189
198
|
|
190
199
|
def value
|
191
|
-
if @value.is_a?
|
200
|
+
if @value.is_a?(String) && !@literal
|
192
201
|
"'#{@value}'"
|
193
202
|
else
|
194
203
|
@value
|