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.
- checksums.yaml +4 -4
- data/lib/aws-sdk-code-generator/api.rb +2 -1
- data/lib/aws-sdk-code-generator/client_constructor.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 +54 -2
- data/lib/aws-sdk-code-generator/endpoint_parameter.rb +190 -0
- data/lib/aws-sdk-code-generator/eventstream_example.rb +34 -34
- data/lib/aws-sdk-code-generator/gem_builder.rb +3 -5
- data/lib/aws-sdk-code-generator/helper.rb +11 -1
- data/lib/aws-sdk-code-generator/plugin_list.rb +5 -2
- data/lib/aws-sdk-code-generator/rbs/error_list.rb +38 -0
- data/lib/aws-sdk-code-generator/rbs/keyword_argument_builder.rb +159 -0
- data/lib/aws-sdk-code-generator/rbs/method_signature.rb +11 -0
- data/lib/aws-sdk-code-generator/rbs/resource_action.rb +39 -0
- data/lib/aws-sdk-code-generator/rbs/resource_association.rb +50 -0
- data/lib/aws-sdk-code-generator/rbs/resource_batch_action.rb +59 -0
- data/lib/aws-sdk-code-generator/rbs/resource_client_request.rb +40 -0
- data/lib/aws-sdk-code-generator/rbs/waiter.rb +53 -0
- data/lib/aws-sdk-code-generator/rbs.rb +40 -0
- data/lib/aws-sdk-code-generator/resource_batch_action_code.rb +3 -1
- data/lib/aws-sdk-code-generator/resource_client_request.rb +3 -1
- data/lib/aws-sdk-code-generator/resource_waiter.rb +6 -5
- data/lib/aws-sdk-code-generator/service.rb +85 -16
- data/lib/aws-sdk-code-generator/views/async_client_class.rb +5 -1
- data/lib/aws-sdk-code-generator/views/client_api_module.rb +58 -16
- data/lib/aws-sdk-code-generator/views/client_class.rb +5 -1
- 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/event_streams_module.rb +7 -1
- data/lib/aws-sdk-code-generator/views/features/smoke.rb +100 -23
- data/lib/aws-sdk-code-generator/views/features/step_definitions.rb +1 -4
- data/lib/aws-sdk-code-generator/views/gemspec.rb +13 -3
- data/lib/aws-sdk-code-generator/views/rbs/client_class.rb +172 -0
- data/lib/aws-sdk-code-generator/views/rbs/errors_module.rb +28 -0
- data/lib/aws-sdk-code-generator/views/rbs/resource_class.rb +95 -0
- data/lib/aws-sdk-code-generator/views/rbs/root_resource_class.rb +30 -0
- data/lib/aws-sdk-code-generator/views/rbs/types_module.rb +257 -0
- data/lib/aws-sdk-code-generator/views/rbs/waiters_module.rb +22 -0
- 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 +25 -12
- data/lib/aws-sdk-code-generator/views/types_module.rb +34 -11
- data/lib/aws-sdk-code-generator.rb +29 -1
- data/templates/async_client_class.mustache +6 -1
- data/templates/client_api_module.mustache +14 -0
- data/templates/client_class.mustache +10 -47
- data/templates/endpoint_parameters_class.mustache +16 -13
- data/templates/endpoints_module.mustache +19 -11
- data/templates/endpoints_plugin.mustache +38 -20
- data/templates/errors_module.mustache +5 -0
- data/templates/features/smoke.mustache +11 -15
- data/templates/features/step_definitions.mustache +0 -5
- data/templates/gemspec.mustache +5 -2
- data/templates/rbs/client_class.mustache +39 -0
- data/templates/rbs/errors_module.mustache +17 -0
- data/templates/rbs/resource_class.mustache +71 -0
- data/templates/rbs/root_resource_class.mustache +26 -0
- data/templates/rbs/types_module.mustache +37 -0
- data/templates/rbs/waiters_module.mustache +17 -0
- data/templates/resource_class.mustache +8 -1
- data/templates/root_resource_class.mustache +5 -0
- data/templates/service_module.mustache +13 -3
- data/templates/spec/endpoint_provider_spec_class.mustache +11 -1
- data/templates/types_module.mustache +4 -0
- metadata +27 -7
- data/lib/aws-sdk-code-generator/views/features/smoke_step_definitions.rb +0 -26
- data/templates/features/smoke_step_definitions.mustache +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a56cc48e83d1c1b3f3c4abf956e29fdd7adb2aed45c2ff8d69b8489ad569518
|
4
|
+
data.tar.gz: 5ff9d87ff0f38a08370358ccccd6bf9e69f0e77da2bcba60b1042501fead60d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be96b1aa147f0e2a8bdf45c383feaa21511d81c6129e648cc5fc488f1f19808aee62ec78916c2f9a9a5e3060dcc12bdb61a1e9a890af21c3ee610438997e3798
|
7
|
+
data.tar.gz: c4f0731f69dd91ddcd4498363cb149ee361cfe452c8cbe6c8e7e05d85586bf11b84494a4ececd41f0308ce1dfb612aa3e032575f9abca3566f6476f6857d1a67
|
@@ -131,7 +131,8 @@ module AwsSdkCodeGenerator
|
|
131
131
|
# @return [Boolean]
|
132
132
|
def streaming_input?(shape, operation)
|
133
133
|
shape['streaming'] && operation &&
|
134
|
-
operation['
|
134
|
+
(operation['unsignedPayload'] ||
|
135
|
+
operation['authtype'] == 'v4-unsigned-body')
|
135
136
|
end
|
136
137
|
|
137
138
|
def plural?(resource)
|
@@ -8,7 +8,8 @@ module AwsSdkCodeGenerator
|
|
8
8
|
|
9
9
|
def initialize(options)
|
10
10
|
plugin_options = documented_plugin_options(options.fetch(:plugins)) +
|
11
|
-
documented_plugin_options(options.fetch(:codegenerated_plugins))
|
11
|
+
documented_plugin_options(options.fetch(:codegenerated_plugins)) +
|
12
|
+
documented_plugin_options(options.fetch(:default_plugins, []))
|
12
13
|
documentation = {}
|
13
14
|
plugin_options.each do |option|
|
14
15
|
documentation[option.name] = YardOptionTag.new(
|
@@ -16,6 +16,7 @@ module AwsSdkCodeGenerator
|
|
16
16
|
@method_name = options.fetch(:method_name)
|
17
17
|
@operation = options.fetch(:operation)
|
18
18
|
@api = options.fetch(:api)
|
19
|
+
@protocol = options.fetch(:protocol)
|
19
20
|
@client_examples = options.fetch(:client_examples, [])
|
20
21
|
@examples = options.fetch(:examples)
|
21
22
|
@module_name = options.fetch(:module_name)
|
@@ -279,7 +280,7 @@ module AwsSdkCodeGenerator
|
|
279
280
|
|
280
281
|
def see_also_tag(operation, api)
|
281
282
|
uid = api['metadata']['uid']
|
282
|
-
if
|
283
|
+
if @protocol != 'api-gateway' && Crosslink.taggable?(uid)
|
283
284
|
"# " + Crosslink.tag_string(uid, operation)
|
284
285
|
end
|
285
286
|
end
|
@@ -9,6 +9,7 @@ module AwsSdkCodeGenerator
|
|
9
9
|
api = options.fetch(:api)
|
10
10
|
examples = options.fetch(:examples, {})
|
11
11
|
module_name = options.fetch(:module_name)
|
12
|
+
protocol = options.fetch(:protocol)
|
12
13
|
protocol_settings = options.fetch(:protocol_settings, {})
|
13
14
|
client_examples = options.fetch(:client_examples, {})
|
14
15
|
paginators = options.fetch(:paginators, {})
|
@@ -41,6 +42,7 @@ module AwsSdkCodeGenerator
|
|
41
42
|
method_name: method_name,
|
42
43
|
operation: operation,
|
43
44
|
api: api,
|
45
|
+
protocol: protocol,
|
44
46
|
examples: examples,
|
45
47
|
client_examples: client_examples[method_name] || [],
|
46
48
|
async_client: true
|
@@ -60,6 +62,7 @@ module AwsSdkCodeGenerator
|
|
60
62
|
method_name: method_name,
|
61
63
|
operation: operation,
|
62
64
|
api: api,
|
65
|
+
protocol: protocol,
|
63
66
|
examples: examples,
|
64
67
|
client_examples: client_examples[method_name] || [],
|
65
68
|
async_client: false
|
@@ -80,6 +83,7 @@ module AwsSdkCodeGenerator
|
|
80
83
|
method_name: method_name,
|
81
84
|
operation: operation,
|
82
85
|
api: api,
|
86
|
+
protocol: protocol,
|
83
87
|
examples: examples,
|
84
88
|
client_examples: client_examples[method_name] || [],
|
85
89
|
async_client: false,
|
@@ -109,6 +109,58 @@ module AwsSdkCodeGenerator
|
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
112
|
+
# @return [Enumerable<String<path>, String<code>>]
|
113
|
+
def rbs_files(options = {})
|
114
|
+
Enumerator.new do |y|
|
115
|
+
prefix = options.fetch(:prefix, '')
|
116
|
+
codegenerated_plugins = codegen_plugins(prefix)
|
117
|
+
client_class = Views::RBS::ClientClass.new(
|
118
|
+
service_name: @service.name,
|
119
|
+
codegenerated_plugins: codegenerated_plugins,
|
120
|
+
aws_sdk_core_lib_path: @aws_sdk_core_lib_path,
|
121
|
+
legacy_endpoints: @service.legacy_endpoints?,
|
122
|
+
signature_version: @service.signature_version,
|
123
|
+
api: @service.api,
|
124
|
+
waiters: @service.waiters,
|
125
|
+
protocol: @service.protocol,
|
126
|
+
add_plugins: @service.add_plugins,
|
127
|
+
remove_plugins: @service.remove_plugins,
|
128
|
+
)
|
129
|
+
y.yield("#{prefix}/client.rbs", client_class.render)
|
130
|
+
y.yield("#{prefix}/errors.rbs", Views::RBS::ErrorsModule.new(
|
131
|
+
service: @service
|
132
|
+
).render)
|
133
|
+
y.yield("#{prefix}/resource.rbs", Views::RBS::RootResourceClass.new(
|
134
|
+
service_name: @service.name,
|
135
|
+
client_class: client_class,
|
136
|
+
api: @service.api,
|
137
|
+
resources: @service.resources,
|
138
|
+
paginators: @service.paginators,
|
139
|
+
).render)
|
140
|
+
y.yield("#{prefix}/waiters.rbs", Views::RBS::WaitersModule.new(
|
141
|
+
service_name: @service.name,
|
142
|
+
api: @service.api,
|
143
|
+
waiters: @service.waiters,
|
144
|
+
).render)
|
145
|
+
y.yield("#{prefix}/types.rbs", Views::RBS::TypesModule.new(
|
146
|
+
service: @service
|
147
|
+
).render)
|
148
|
+
if @resources
|
149
|
+
@resources['resources'].keys.sort.each do |class_name|
|
150
|
+
path = "#{prefix}/#{Underscore.underscore(class_name)}.rbs"
|
151
|
+
code = Views::RBS::ResourceClass.new(
|
152
|
+
service_name: @service.name,
|
153
|
+
class_name: class_name,
|
154
|
+
resource: @resources['resources'][class_name],
|
155
|
+
api: @service.api,
|
156
|
+
paginators: @service.paginators,
|
157
|
+
).render
|
158
|
+
y.yield(path, code)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
112
164
|
private
|
113
165
|
|
114
166
|
def service_module(prefix, codegenerated_plugins)
|
@@ -133,13 +185,13 @@ module AwsSdkCodeGenerator
|
|
133
185
|
Views::ClientClass.new(
|
134
186
|
service_identifier: @service.identifier,
|
135
187
|
service_name: @service.name,
|
188
|
+
protocol: @service.protocol,
|
136
189
|
protocol_settings: @service.protocol_settings,
|
137
190
|
module_name: @service.module_name,
|
138
191
|
gem_name: @service.gem_name,
|
139
192
|
gem_version: @service.gem_version,
|
140
193
|
aws_sdk_core_lib_path: @aws_sdk_core_lib_path,
|
141
194
|
client_examples: @client_examples,
|
142
|
-
protocol: @service.protocol,
|
143
195
|
signature_version: @service.signature_version,
|
144
196
|
require_endpoint_discovery: @service.require_endpoint_discovery,
|
145
197
|
add_plugins: @service.add_plugins,
|
@@ -158,12 +210,12 @@ module AwsSdkCodeGenerator
|
|
158
210
|
Views::AsyncClientClass.new(
|
159
211
|
service_identifier: @service.identifier,
|
160
212
|
service_name: @service.name,
|
213
|
+
protocol: @service.protocol,
|
161
214
|
protocol_settings: @service.protocol_settings,
|
162
215
|
module_name: @service.module_name,
|
163
216
|
gem_name: @service.gem_name,
|
164
217
|
gem_version: @service.gem_version,
|
165
218
|
aws_sdk_core_lib_path: @aws_sdk_core_lib_path,
|
166
|
-
protocol: @service.protocol,
|
167
219
|
signature_version: @service.signature_version,
|
168
220
|
add_plugins: @service.add_plugins,
|
169
221
|
remove_plugins: @service.remove_plugins,
|
@@ -0,0 +1,190 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AwsSdkCodeGenerator
|
4
|
+
class EndpointParameter
|
5
|
+
def initialize(name, definition, service, operation=nil)
|
6
|
+
@name = name
|
7
|
+
|
8
|
+
@value, @source = endpoint_parameter_value(name, definition, service, operation)
|
9
|
+
|
10
|
+
@type = definition['type']
|
11
|
+
@built_in = definition['builtIn']
|
12
|
+
@default = definition['default']
|
13
|
+
@required = definition['required']
|
14
|
+
@documentation = "# @!attribute #{key}\n"
|
15
|
+
if definition['documentation']
|
16
|
+
@documentation += " # #{definition['documentation']}\n"
|
17
|
+
end
|
18
|
+
if deprecated = definition['deprecated']
|
19
|
+
@documentation += " #\n # @deprecated\n"
|
20
|
+
if deprecated['message']
|
21
|
+
@documentation += " # #{deprecated['message']}\n"
|
22
|
+
end
|
23
|
+
if deprecated['since']
|
24
|
+
@documentation += " # Since: #{deprecated['since']}\n"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
@documentation += " #\n # @return [#{@type}]\n #"
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [String]
|
31
|
+
attr_reader :name
|
32
|
+
|
33
|
+
# @return [String]
|
34
|
+
attr_reader :documentation
|
35
|
+
|
36
|
+
# @return [Boolean]
|
37
|
+
attr_reader :required
|
38
|
+
|
39
|
+
# @return [String]
|
40
|
+
attr_reader :source
|
41
|
+
|
42
|
+
# @return [String]
|
43
|
+
attr_reader :value
|
44
|
+
|
45
|
+
# @return [String,Boolean,Array]
|
46
|
+
def default
|
47
|
+
case @default
|
48
|
+
when String
|
49
|
+
"\"#{@default}\""
|
50
|
+
else
|
51
|
+
@default.to_s
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def default?
|
56
|
+
!@default.nil?
|
57
|
+
end
|
58
|
+
|
59
|
+
def validate_required?
|
60
|
+
required && !default?
|
61
|
+
end
|
62
|
+
|
63
|
+
def key
|
64
|
+
Underscore.underscore(name)
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
# Most to least
|
70
|
+
# staticContextParams
|
71
|
+
# contextParam
|
72
|
+
# operationContextParams
|
73
|
+
# clientContextParams (always sourced from config)
|
74
|
+
# Built-In Bindings (sourced from config in most cases, context in some cases to allow operation level overrides)
|
75
|
+
# Built-in binding default values
|
76
|
+
# @retyrn [value, source]. source may be one of [operation, config, default]
|
77
|
+
def endpoint_parameter_value(param_name, param_data, service, operation)
|
78
|
+
unless operation.nil?
|
79
|
+
value, source = [
|
80
|
+
static_context_param(operation, param_name), 'operation'
|
81
|
+
]
|
82
|
+
value, source = [
|
83
|
+
context_param_value(service, operation, param_name), 'operation'
|
84
|
+
] unless value
|
85
|
+
value, source = [
|
86
|
+
operation_context_param_value(operation, param_name), 'operation'
|
87
|
+
] unless value
|
88
|
+
end
|
89
|
+
|
90
|
+
value, source = [
|
91
|
+
client_context_param_value(service, param_name, param_data),
|
92
|
+
'config'
|
93
|
+
] unless value
|
94
|
+
|
95
|
+
|
96
|
+
# built-ins may be sourced from operation context in some cases
|
97
|
+
unless value
|
98
|
+
value, source = built_in_param_value(service, param_data)
|
99
|
+
end
|
100
|
+
|
101
|
+
[value || 'nil', source || 'default']
|
102
|
+
end
|
103
|
+
|
104
|
+
def client_context_param_value(service, param_name, param_data)
|
105
|
+
if service.api['clientContextParams']&.key?(param_name) &&
|
106
|
+
!param_data['builtIn']
|
107
|
+
"config.#{Underscore.underscore(param_name)}"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# built-ins may be sourced from operation context in some cases
|
112
|
+
def built_in_param_value(service, param_data)
|
113
|
+
source = 'config'
|
114
|
+
value =
|
115
|
+
case param_data['builtIn']
|
116
|
+
when 'AWS::Region'
|
117
|
+
'config.region'
|
118
|
+
when 'AWS::UseFIPS'
|
119
|
+
'config.use_fips_endpoint'
|
120
|
+
when 'AWS::UseDualStack'
|
121
|
+
if service.name == 'S3' || service.name == 'S3Control'
|
122
|
+
source = 'operation'
|
123
|
+
'context[:use_dualstack_endpoint]'
|
124
|
+
else
|
125
|
+
'config.use_dualstack_endpoint'
|
126
|
+
end
|
127
|
+
when 'AWS::Auth::AccountId'
|
128
|
+
'config.credentials.credentials.account_id'
|
129
|
+
when 'AWS::Auth::AccountIdEndpointMode'
|
130
|
+
'config.account_id_endpoint_mode'
|
131
|
+
when 'AWS::STS::UseGlobalEndpoint'
|
132
|
+
"config.sts_regional_endpoints == 'legacy'"
|
133
|
+
when 'AWS::S3::UseGlobalEndpoint'
|
134
|
+
"config.s3_us_east_1_regional_endpoint == 'legacy'"
|
135
|
+
when 'AWS::S3::Accelerate'
|
136
|
+
if service.name == 'S3' || service.name == 'S3Control'
|
137
|
+
source = 'operation'
|
138
|
+
'context[:use_accelerate_endpoint]'
|
139
|
+
else
|
140
|
+
'config.use_accelerate_endpoint'
|
141
|
+
end
|
142
|
+
when 'AWS::S3::ForcePathStyle'
|
143
|
+
'config.force_path_style'
|
144
|
+
when 'AWS::S3::UseArnRegion', 'AWS::S3Control::UseArnRegion'
|
145
|
+
'config.s3_use_arn_region'
|
146
|
+
when 'AWS::S3::DisableMultiRegionAccessPoints'
|
147
|
+
'config.s3_disable_multiregion_access_points'
|
148
|
+
when 'SDK::Endpoint'
|
149
|
+
'(config.endpoint.to_s unless config.regional_endpoint)'
|
150
|
+
else
|
151
|
+
source = nil
|
152
|
+
nil # no value, not a default
|
153
|
+
end
|
154
|
+
[value, source]
|
155
|
+
end
|
156
|
+
|
157
|
+
def context_param_value(service, operation, param_name)
|
158
|
+
return nil unless operation['input']
|
159
|
+
|
160
|
+
input_shape = operation['input']['shape']
|
161
|
+
members = service.api['shapes'][input_shape].fetch('members', {})
|
162
|
+
members.detect do |(member_name, member)|
|
163
|
+
context_param = member.fetch('contextParam', {})
|
164
|
+
if context_param.fetch('name', nil) == param_name
|
165
|
+
break "context.params[:#{Underscore.underscore(member_name)}]"
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def operation_context_param_value(operation, param_name)
|
171
|
+
return nil unless operation['input']
|
172
|
+
|
173
|
+
binding = operation.fetch('operationContextParams', {})[param_name]
|
174
|
+
|
175
|
+
return nil unless binding
|
176
|
+
|
177
|
+
"JMESPath.search(\"#{Underscore.underscore_jmespath(binding['path'])}\", context.params)"
|
178
|
+
end
|
179
|
+
|
180
|
+
def static_context_param(operation, param_name)
|
181
|
+
value = operation.fetch('staticContextParams', {})
|
182
|
+
.fetch(param_name, {}).fetch('value', nil)
|
183
|
+
if !value.nil? && value.is_a?(String)
|
184
|
+
"\"#{value}\""
|
185
|
+
else
|
186
|
+
value
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
@@ -39,52 +39,53 @@ module AwsSdkCodeGenerator
|
|
39
39
|
<<-EXAMPLE.strip
|
40
40
|
# @example Bi-directional EventStream Operation Example
|
41
41
|
#
|
42
|
-
# You can signal input events after initial request is
|
43
|
-
#
|
44
|
-
#
|
42
|
+
# You can signal input events after the initial request is established. Events
|
43
|
+
# will be sent to the stream immediately once the stream connection is
|
44
|
+
# established successfully.
|
45
45
|
#
|
46
|
-
# To signal events, you can call #signal methods from an #{@input_eventstream}
|
47
|
-
#
|
46
|
+
# To signal events, you can call the #signal methods from an #{@input_eventstream}
|
47
|
+
# object. You must signal events before calling #wait or #join! on the async response.
|
48
48
|
#
|
49
49
|
# input_stream = #{@input_eventstream}.new
|
50
50
|
#
|
51
|
-
# async_resp = #{@receiver}.#{@method_name}(
|
51
|
+
# async_resp = #{@receiver}.#{@method_name}(
|
52
|
+
# # params input
|
52
53
|
# input_event_stream_handler: input_stream) do |out_stream|
|
53
54
|
#
|
54
|
-
# # register callbacks for events
|
55
|
+
# # register callbacks for events
|
55
56
|
#{event_entry(:output, 'out_stream', 2)}
|
56
57
|
#
|
57
58
|
# end
|
58
|
-
# # =>
|
59
|
+
# # => Aws::Seahorse::Client::AsyncResponse
|
59
60
|
#
|
60
61
|
# # signal events
|
61
62
|
#{event_entry(:input, 'input_stream')}
|
62
63
|
#
|
63
|
-
# # make sure
|
64
|
+
# # make sure to signal :end_stream at the end
|
64
65
|
# input_stream.signal_end_stream
|
65
66
|
#
|
66
|
-
# # wait until stream is closed before finalizing sync response
|
67
|
+
# # wait until stream is closed before finalizing the sync response
|
67
68
|
# resp = async_resp.wait
|
68
|
-
# # Or close stream and
|
69
|
+
# # Or close the stream and finalize sync response immediately
|
69
70
|
# # resp = async_resp.join!
|
70
71
|
#
|
71
|
-
#
|
72
|
-
#
|
72
|
+
# You can also provide an #{@output_eventstream} object to register callbacks
|
73
|
+
# before initializing the request instead of processing from the request block.
|
73
74
|
#
|
74
75
|
# output_stream = #{@output_eventstream}.new
|
75
|
-
# # register callbacks for events
|
76
|
+
# # register callbacks for output events
|
76
77
|
#{event_entry(:output, 'output_stream')}
|
77
78
|
#{error_event_entry('output_stream')}
|
78
79
|
#
|
79
|
-
# async_resp = #{@receiver}.#{@method_name} (
|
80
|
+
# async_resp = #{@receiver}.#{@method_name} (
|
81
|
+
# # params input
|
80
82
|
# input_event_stream_handler: input_stream
|
81
83
|
# output_event_stream_handler: output_stream
|
82
84
|
# )
|
83
85
|
#
|
84
|
-
# resp = async_resp.
|
86
|
+
# resp = async_resp.join!
|
85
87
|
#
|
86
|
-
#
|
87
|
-
# iterate through events after response complete.
|
88
|
+
# You can also iterate through events after the response is complete.
|
88
89
|
#
|
89
90
|
# Events are available at #{@resp_var}.#{@output_eventstream_member} # => Enumerator
|
90
91
|
EXAMPLE
|
@@ -94,22 +95,22 @@ module AwsSdkCodeGenerator
|
|
94
95
|
<<-EXAMPLE.strip
|
95
96
|
# @example EventStream Operation Example
|
96
97
|
#
|
97
|
-
# You can process event once it arrives immediately, or wait until
|
98
|
-
# full response complete and iterate through eventstream enumerator.
|
98
|
+
# You can process the event once it arrives immediately, or wait until the
|
99
|
+
# full response is complete and iterate through the eventstream enumerator.
|
99
100
|
#
|
100
101
|
# To interact with event immediately, you need to register ##{@method_name}
|
101
|
-
# with callbacks
|
102
|
-
#
|
102
|
+
# with callbacks. Callbacks can be registered for specific events or for all
|
103
|
+
# events, including error events.
|
103
104
|
#
|
104
|
-
# Callbacks can be passed
|
105
|
-
# statement attached to ##{@method_name} call directly. Hybrid
|
106
|
-
# is also supported.
|
105
|
+
# Callbacks can be passed into the `:event_stream_handler` option or within a
|
106
|
+
# block statement attached to the ##{@method_name} call directly. Hybrid
|
107
|
+
# pattern of both is also supported.
|
107
108
|
#
|
108
|
-
# `:event_stream_handler` option takes in either Proc object or
|
109
|
+
# `:event_stream_handler` option takes in either a Proc object or
|
109
110
|
# #{@output_eventstream} object.
|
110
111
|
#
|
111
|
-
# Usage pattern a):
|
112
|
-
# Example for registering callbacks for all event types and error event
|
112
|
+
# Usage pattern a): Callbacks with a block attached to ##{@method_name}
|
113
|
+
# Example for registering callbacks for all event types and an error event
|
113
114
|
#
|
114
115
|
# #{@receiver}.#{@method_name}( # params input# ) do |stream|
|
115
116
|
#{error_event_entry('stream', 2)}
|
@@ -122,9 +123,9 @@ module AwsSdkCodeGenerator
|
|
122
123
|
#
|
123
124
|
# end
|
124
125
|
#
|
125
|
-
# Usage pattern b):
|
126
|
+
# Usage pattern b): Pass in `:event_stream_handler` for ##{@method_name}
|
126
127
|
#
|
127
|
-
# 1)
|
128
|
+
# 1) Create a #{@output_eventstream} object
|
128
129
|
# Example for registering callbacks with specific events
|
129
130
|
#
|
130
131
|
# handler = #{@output_eventstream}.new
|
@@ -132,7 +133,7 @@ module AwsSdkCodeGenerator
|
|
132
133
|
#
|
133
134
|
# #{@receiver}.#{@method_name}( # params input #, event_stream_handler: handler)
|
134
135
|
#
|
135
|
-
# 2)
|
136
|
+
# 2) Use a Ruby Proc object
|
136
137
|
# Example for registering callbacks with specific events
|
137
138
|
#
|
138
139
|
# handler = Proc.new do |stream|
|
@@ -141,7 +142,7 @@ module AwsSdkCodeGenerator
|
|
141
142
|
#
|
142
143
|
# #{@receiver}.#{@method_name}( # params input #, event_stream_handler: handler)
|
143
144
|
#
|
144
|
-
# Usage pattern c):
|
145
|
+
# Usage pattern c): Hybrid pattern of a) and b)
|
145
146
|
#
|
146
147
|
# handler = #{@output_eventstream}.new
|
147
148
|
#{event_entry(:output, 'handler', 2)}
|
@@ -150,8 +151,7 @@ module AwsSdkCodeGenerator
|
|
150
151
|
#{error_event_entry('stream', 2)}
|
151
152
|
# end
|
152
153
|
#
|
153
|
-
#
|
154
|
-
# iterate through events after response complete.
|
154
|
+
# You can also iterate through events after the response complete.
|
155
155
|
#
|
156
156
|
# Events are available at #{@resp_var}.#{@output_eventstream_member} # => Enumerator
|
157
157
|
# For parameter input example, please refer to following request syntax
|
@@ -25,7 +25,6 @@ module AwsSdkCodeGenerator
|
|
25
25
|
y.yield('features/step_definitions.rb', features_step_definitions_file)
|
26
26
|
if @service.smoke_tests
|
27
27
|
y.yield('features/smoke.feature', smoke_file)
|
28
|
-
y.yield('features/smoke_step_definitions.rb', smoke_step_definitions_file)
|
29
28
|
end
|
30
29
|
y.yield('VERSION', version_file)
|
31
30
|
y.yield('LICENSE.txt', license_file)
|
@@ -37,6 +36,9 @@ module AwsSdkCodeGenerator
|
|
37
36
|
code.spec_files.each do |path, code|
|
38
37
|
y.yield("spec/#{path}", code)
|
39
38
|
end
|
39
|
+
code.rbs_files.each do |path, code|
|
40
|
+
y.yield("sig/#{path}", code)
|
41
|
+
end
|
40
42
|
end.each(&block)
|
41
43
|
end
|
42
44
|
|
@@ -54,10 +56,6 @@ module AwsSdkCodeGenerator
|
|
54
56
|
Views::Features::Smoke.new(options).render
|
55
57
|
end
|
56
58
|
|
57
|
-
def smoke_step_definitions_file
|
58
|
-
Views::Features::SmokeStepDefinitions.new(options).render
|
59
|
-
end
|
60
|
-
|
61
59
|
def features_step_definitions_file
|
62
60
|
Views::Features::StepDefinitions.new(options).render
|
63
61
|
end
|
@@ -175,8 +175,18 @@ module AwsSdkCodeGenerator
|
|
175
175
|
str.gsub(/(.{1,#{width}})(\s+|\Z)/, "#{indent}\\1\n").chomp
|
176
176
|
end
|
177
177
|
|
178
|
+
def gem_lib_path(gem_name)
|
179
|
+
File.expand_path(
|
180
|
+
File.join(
|
181
|
+
__dir__,
|
182
|
+
"../../../../gems/#{gem_name}/lib/"
|
183
|
+
)
|
184
|
+
)
|
185
|
+
end
|
186
|
+
|
178
187
|
module_function :deep_copy, :operation_streaming?, :downcase_first, :wrap_string, :apig_prefix,
|
179
|
-
:eventstream_output?, :eventstream_input?, :operation_eventstreaming?, :pascal_case
|
188
|
+
:eventstream_output?, :eventstream_input?, :operation_eventstreaming?, :pascal_case,
|
189
|
+
:gem_lib_path
|
180
190
|
|
181
191
|
end
|
182
192
|
end
|
@@ -54,14 +54,17 @@ module AwsSdkCodeGenerator
|
|
54
54
|
'Aws::Plugins::ResponsePaging' => "#{core_plugins}/response_paging.rb",
|
55
55
|
'Aws::Plugins::StubResponses' => "#{core_plugins}/stub_responses.rb",
|
56
56
|
'Aws::Plugins::IdempotencyToken' => "#{core_plugins}/idempotency_token.rb",
|
57
|
+
'Aws::Plugins::InvocationId' => "#{core_plugins}/invocation_id.rb",
|
57
58
|
'Aws::Plugins::JsonvalueConverter' => "#{core_plugins}/jsonvalue_converter.rb",
|
58
59
|
'Aws::Plugins::ClientMetricsPlugin' => "#{core_plugins}/client_metrics_plugin.rb",
|
59
60
|
'Aws::Plugins::ClientMetricsSendPlugin' => "#{core_plugins}/client_metrics_send_plugin.rb",
|
60
61
|
'Aws::Plugins::TransferEncoding' => "#{core_plugins}/transfer_encoding.rb",
|
61
62
|
'Aws::Plugins::HttpChecksum' => "#{core_plugins}/http_checksum.rb",
|
62
63
|
'Aws::Plugins::ChecksumAlgorithm' => "#{core_plugins}/checksum_algorithm.rb",
|
64
|
+
'Aws::Plugins::RequestCompression' => "#{core_plugins}/request_compression.rb",
|
63
65
|
'Aws::Plugins::DefaultsMode' => "#{core_plugins}/defaults_mode.rb",
|
64
|
-
'Aws::Plugins::RecursionDetection' => "#{core_plugins}/recursion_detection.rb"
|
66
|
+
'Aws::Plugins::RecursionDetection' => "#{core_plugins}/recursion_detection.rb",
|
67
|
+
'Aws::Plugins::Telemetry' => "#{core_plugins}/telemetry.rb"
|
65
68
|
}
|
66
69
|
end
|
67
70
|
|
@@ -74,7 +77,6 @@ module AwsSdkCodeGenerator
|
|
74
77
|
plugins.delete('Aws::Plugins::ClientMetricsPlugin')
|
75
78
|
plugins.delete('Aws::Plugins::ClientMetricsSendPlugin')
|
76
79
|
plugins.delete('Aws::Plugins::TransferEncoding')
|
77
|
-
plugins['Aws::Plugins::InvocationId'] = "#{core_plugins}/invocation_id.rb"
|
78
80
|
plugins
|
79
81
|
end
|
80
82
|
|
@@ -85,6 +87,7 @@ module AwsSdkCodeGenerator
|
|
85
87
|
'rest-xml' => { 'Aws::Plugins::Protocols::RestXml' => "#{core_plugins}/protocols/rest_xml.rb" },
|
86
88
|
'query' => { 'Aws::Plugins::Protocols::Query' => "#{core_plugins}/protocols/query.rb" },
|
87
89
|
'ec2' => { 'Aws::Plugins::Protocols::EC2' => "#{core_plugins}/protocols/ec2.rb" },
|
90
|
+
'smithy-rpc-v2-cbor' => { 'Aws::Plugins::Protocols::RpcV2' => "#{core_plugins}/protocols/rpc_v2.rb" },
|
88
91
|
'api-gateway' => {
|
89
92
|
'Aws::Plugins::Protocols::ApiGateway' => "#{core_plugins}/protocols/api_gateway.rb",
|
90
93
|
'Aws::Plugins::ApiKey' => "#{core_plugins}/api_key.rb",
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AwsSdkCodeGenerator
|
4
|
+
module RBS
|
5
|
+
class ErrorList
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
def initialize(api:, module_name:)
|
9
|
+
@api = api
|
10
|
+
@module_name = module_name
|
11
|
+
@errors = @api['shapes'].inject([]) do |es, (name, shape)|
|
12
|
+
if error_struct?(shape)
|
13
|
+
members = shape["members"].map do |member_name, member_body|
|
14
|
+
MethodSignature.new(
|
15
|
+
method_name: Underscore.underscore(member_name),
|
16
|
+
overloads: ["() -> #{Docstring.ucfirst(member_body['type'] ||'::String')}"]
|
17
|
+
)
|
18
|
+
end
|
19
|
+
es << {
|
20
|
+
name: name,
|
21
|
+
members: members,
|
22
|
+
}
|
23
|
+
end
|
24
|
+
es
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def error_struct?(shape)
|
29
|
+
shape['type'] == 'structure' && !!!shape['event'] &&
|
30
|
+
(shape['error'] || shape['exception'])
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_a
|
34
|
+
@errors
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|