aws-sdk-code-generator 0.4.0.pre → 0.5.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.
- checksums.yaml +4 -4
- data/lib/aws-sdk-code-generator/client_constructor.rb +2 -1
- data/lib/aws-sdk-code-generator/code_builder.rb +52 -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/plugin_list.rb +2 -1
- 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 +21 -0
- data/lib/aws-sdk-code-generator/views/async_client_class.rb +5 -1
- data/lib/aws-sdk-code-generator/views/client_api_module.rb +29 -4
- data/lib/aws-sdk-code-generator/views/client_class.rb +5 -1
- data/lib/aws-sdk-code-generator/views/event_streams_module.rb +7 -1
- data/lib/aws-sdk-code-generator/views/features/smoke.rb +99 -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/spec/endpoint_provider_spec_class.rb +5 -1
- data/lib/aws-sdk-code-generator/views/types_module.rb +8 -9
- data/lib/aws-sdk-code-generator.rb +17 -1
- data/templates/client_api_module.mustache +7 -0
- data/templates/client_class.mustache +0 -45
- data/templates/endpoints_module.mustache +1 -0
- data/templates/endpoints_plugin.mustache +4 -2
- 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 +3 -1
- data/templates/spec/endpoint_provider_spec_class.mustache +10 -0
- metadata +24 -5
- data/lib/aws-sdk-code-generator/views/features/smoke_step_definitions.rb +0 -26
- data/templates/features/smoke_step_definitions.mustache +0 -31
@@ -0,0 +1,172 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AwsSdkCodeGenerator
|
4
|
+
module Views
|
5
|
+
module RBS
|
6
|
+
class ClientClass < View
|
7
|
+
SKIP_MEMBERS = Set.new(%w[
|
8
|
+
context
|
9
|
+
data
|
10
|
+
error
|
11
|
+
checksum_validated
|
12
|
+
on
|
13
|
+
on_success
|
14
|
+
])
|
15
|
+
|
16
|
+
def initialize(options)
|
17
|
+
@options = options
|
18
|
+
@service_name = options.fetch(:service_name)
|
19
|
+
@api = options.fetch(:api)
|
20
|
+
@aws_sdk_core_lib_path = options.fetch(:aws_sdk_core_lib_path)
|
21
|
+
@plugins = PluginList.new(options)
|
22
|
+
@codegenerated_plugins = options.fetch(:codegenerated_plugins)
|
23
|
+
@waiters = AwsSdkCodeGenerator::RBS::Waiter.build_list(api: @api, waiters:options.fetch(:waiters))
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return [String|nil]
|
27
|
+
def generated_src_warning
|
28
|
+
GENERATED_SRC_WARNING
|
29
|
+
end
|
30
|
+
|
31
|
+
def service_name
|
32
|
+
@service_name
|
33
|
+
end
|
34
|
+
|
35
|
+
def client_option(indent: ' ' * 20)
|
36
|
+
plugin_options = documented_plugin_options(@plugins) + documented_plugin_options(@codegenerated_plugins)
|
37
|
+
[
|
38
|
+
'',
|
39
|
+
"#{indent} #{build_keyword_arguments(plugin_options).join(",\n#{indent} ")}",
|
40
|
+
indent,
|
41
|
+
].join("\n")
|
42
|
+
end
|
43
|
+
|
44
|
+
def operations
|
45
|
+
shapes = @api["shapes"]
|
46
|
+
@api["operations"].map do |name, body|
|
47
|
+
method_name = Underscore.underscore(name)
|
48
|
+
indent = " " * (12 + method_name.length)
|
49
|
+
input_shape_name = body.dig("input", "shape")
|
50
|
+
arguments = nil
|
51
|
+
include_required = false
|
52
|
+
if input_shape_name
|
53
|
+
input_shape = shapes[input_shape_name]
|
54
|
+
builder = AwsSdkCodeGenerator::RBS::KeywordArgumentBuilder.new(
|
55
|
+
api: @api,
|
56
|
+
shape: input_shape,
|
57
|
+
newline: true,
|
58
|
+
)
|
59
|
+
arguments = builder.format(indent: indent)
|
60
|
+
include_required = input_shape["required"]&.empty?&.!
|
61
|
+
end
|
62
|
+
if AwsSdkCodeGenerator::Helper.operation_streaming?(body, @api)
|
63
|
+
block = " ?{ (*untyped) -> void }"
|
64
|
+
end
|
65
|
+
if output_shape_name = body.dig("output", "shape")
|
66
|
+
output_shape = shapes[output_shape_name]
|
67
|
+
data = AwsSdkCodeGenerator::RBS.to_type(body.fetch( "output"), @api)
|
68
|
+
interface = "_#{name}ResponseSuccess"
|
69
|
+
else
|
70
|
+
output_shape = nil
|
71
|
+
data = "::Aws::EmptyStructure"
|
72
|
+
interface = empty_interface = "::Seahorse::Client::_ResponseSuccess[::Aws::EmptyStructure]"
|
73
|
+
end
|
74
|
+
returns_members = output_shape&.[]("members")&.inject([]) do |a, (member_name, member_ref)|
|
75
|
+
member_name_underscore = Underscore.underscore(member_name)
|
76
|
+
next a if SKIP_MEMBERS.include?(member_name_underscore)
|
77
|
+
a << {
|
78
|
+
method_name: member_name_underscore,
|
79
|
+
returns: AwsSdkCodeGenerator::RBS.to_type(member_ref, @api),
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
{
|
84
|
+
method_name: method_name,
|
85
|
+
signature: AwsSdkCodeGenerator::RBS::MethodSignature.new(
|
86
|
+
method_name: method_name,
|
87
|
+
overloads: [
|
88
|
+
"(#{arguments})#{block} -> #{interface}",
|
89
|
+
"(#{include_required ? "" : "?"}Hash[Symbol, untyped] params, ?Hash[Symbol, untyped] options)#{block} -> #{interface}",
|
90
|
+
]).signature,
|
91
|
+
interface: interface,
|
92
|
+
data: data,
|
93
|
+
returns_members: returns_members,
|
94
|
+
empty_structure: output_shape.nil?
|
95
|
+
}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def waiters?
|
100
|
+
@waiters.size > 0
|
101
|
+
end
|
102
|
+
|
103
|
+
def waiters_first
|
104
|
+
[@waiters.first]
|
105
|
+
end
|
106
|
+
|
107
|
+
def waiters_others
|
108
|
+
@waiters[1..-1]
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
def documented_plugin_options(plugins)
|
114
|
+
i = 0
|
115
|
+
plugins.map(&:options).flatten.select(&:documented?).sort_by do |opt|
|
116
|
+
[opt.required ? 'a' : 'b', opt.name, i += 1]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def build_keyword_arguments(plugins)
|
121
|
+
buffer = plugins.map do |opt|
|
122
|
+
if opt.rbs_type
|
123
|
+
opt.rbs_type
|
124
|
+
else
|
125
|
+
case opt.doc_type
|
126
|
+
when "Boolean"
|
127
|
+
"bool"
|
128
|
+
when nil
|
129
|
+
"untyped"
|
130
|
+
else
|
131
|
+
opt.doc_type.to_s
|
132
|
+
end
|
133
|
+
end.yield_self do |type|
|
134
|
+
[opt.name, "?#{opt.name}: #{type}", opt.doc_type]
|
135
|
+
end
|
136
|
+
end
|
137
|
+
# Find duplicated key
|
138
|
+
grouped = buffer.group_by { |name, _| name }
|
139
|
+
grouped.transform_values(&:count).find_all { |_, c| 1 < c }.each do |name,|
|
140
|
+
case name
|
141
|
+
when :endpoint, :endpoint_provider, :retry_limit, :disable_s3_express_session_auth
|
142
|
+
# ok
|
143
|
+
else
|
144
|
+
warn("Duplicate client option in #{@service_name}: `#{grouped[name].map { |g| g.values_at(0, 2) }}`", uplevel: 0)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
buffer.uniq! { |b| b[0] }
|
148
|
+
buffer.map! { |b| b[1] }
|
149
|
+
buffer.concat([
|
150
|
+
# from mustache
|
151
|
+
"?http_proxy: String",
|
152
|
+
"?http_open_timeout: (Float | Integer)",
|
153
|
+
"?http_read_timeout: (Float | Integer)",
|
154
|
+
"?http_idle_timeout: (Float | Integer)",
|
155
|
+
"?http_continue_timeout: (Float | Integer)",
|
156
|
+
"?ssl_timeout: (Float | Integer | nil)",
|
157
|
+
"?http_wire_trace: bool",
|
158
|
+
"?ssl_verify_peer: bool",
|
159
|
+
"?ssl_ca_bundle: String",
|
160
|
+
"?ssl_ca_directory: String",
|
161
|
+
# from object
|
162
|
+
"?ssl_ca_store: String",
|
163
|
+
"?on_chunk_received: Proc",
|
164
|
+
"?on_chunk_sent: Proc",
|
165
|
+
"?raise_response_errors: bool",
|
166
|
+
])
|
167
|
+
buffer
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AwsSdkCodeGenerator
|
4
|
+
module Views
|
5
|
+
module RBS
|
6
|
+
class ErrorsModule < View
|
7
|
+
attr_reader :errors
|
8
|
+
|
9
|
+
def initialize(service:)
|
10
|
+
@service = service
|
11
|
+
@errors = AwsSdkCodeGenerator::RBS::ErrorList.new(
|
12
|
+
api: service.api,
|
13
|
+
module_name: service.module_name
|
14
|
+
).to_a
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [String|nil]
|
18
|
+
def generated_src_warning
|
19
|
+
GENERATED_SRC_WARNING
|
20
|
+
end
|
21
|
+
|
22
|
+
def service_name
|
23
|
+
@service.name
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AwsSdkCodeGenerator
|
4
|
+
module Views
|
5
|
+
module RBS
|
6
|
+
class ResourceClass < View
|
7
|
+
attr_reader :service_name
|
8
|
+
attr_reader :class_name
|
9
|
+
attr_reader :identifiers
|
10
|
+
attr_reader :data_attributes
|
11
|
+
attr_reader :shape
|
12
|
+
attr_reader :exists_waiters
|
13
|
+
attr_reader :waiters
|
14
|
+
attr_reader :actions
|
15
|
+
attr_reader :associations
|
16
|
+
attr_reader :batch_actions
|
17
|
+
|
18
|
+
def initialize(service_name:, class_name:, resource:, api:, paginators:)
|
19
|
+
@class_name = class_name
|
20
|
+
@resource = resource
|
21
|
+
@service_name = service_name
|
22
|
+
@identifiers = ResourceIdentifier.build_list(resource)
|
23
|
+
@data_attributes = if @resource["shape"]
|
24
|
+
data_attribute_names = AwsSdkCodeGenerator::ResourceAttribute.send(:data_attribute_names, @resource, api)
|
25
|
+
data_attribute_names.map do |member_name, member_ref|
|
26
|
+
AwsSdkCodeGenerator::RBS::MethodSignature.new(
|
27
|
+
method_name: Underscore.underscore(member_name),
|
28
|
+
overloads: ["() -> #{AwsSdkCodeGenerator::RBS.to_type(member_ref, api)}"]
|
29
|
+
)
|
30
|
+
end
|
31
|
+
else
|
32
|
+
[]
|
33
|
+
end
|
34
|
+
@shape = @resource["shape"]
|
35
|
+
@exists_waiters = @resource.fetch("waiters", []).any? { |name, _| name == "Exists" }
|
36
|
+
@waiters = @resource.fetch("waiters", []).map do |waiter_name, waiter_body|
|
37
|
+
AwsSdkCodeGenerator::RBS::MethodSignature.new(
|
38
|
+
method_name: "wait_until_#{Underscore.underscore(waiter_name)}",
|
39
|
+
overloads: [
|
40
|
+
"(?max_attempts: Integer, ?delay: Numeric, ?before_attempt: (^(Integer attempts) -> void), ?before_wait: (^(Integer attempts, untyped response) -> void)) ?{ (untyped waiter) -> void } -> #{class_name}",
|
41
|
+
"(?Hash[Symbol, untyped]) ?{ (untyped waiter) -> void } -> #{class_name}",
|
42
|
+
],
|
43
|
+
)
|
44
|
+
end
|
45
|
+
@actions = AwsSdkCodeGenerator::RBS::ResourceAction.build_method_signature_list(resource: @resource, api: api)
|
46
|
+
@associations = AwsSdkCodeGenerator::RBS::ResourceAssociation.build_method_signature_list(resource: @resource, api: api, paginators: paginators)
|
47
|
+
@batch_actions = AwsSdkCodeGenerator::RBS::ResourceBatchAction.build_method_signature_list(resource: @resource, api: api)
|
48
|
+
avoid_duplicate_methods
|
49
|
+
end
|
50
|
+
|
51
|
+
# @return [String|nil]
|
52
|
+
def generated_src_warning
|
53
|
+
GENERATED_SRC_WARNING
|
54
|
+
end
|
55
|
+
|
56
|
+
def initialize_signature
|
57
|
+
initialize_overloads =
|
58
|
+
if @identifiers.empty?
|
59
|
+
[]
|
60
|
+
else
|
61
|
+
positional = @identifiers.map { |id| "#{id.type} #{id.name}" } << "Hash[Symbol, untyped] options"
|
62
|
+
keyword = @identifiers.map { |id| "#{id.name}: #{id.type}" } << "?client: Client"
|
63
|
+
[
|
64
|
+
"(#{positional.join(', ')}) -> void",
|
65
|
+
"(#{keyword.join(', ')}) -> void"
|
66
|
+
]
|
67
|
+
end
|
68
|
+
initialize_overloads << "(Hash[Symbol, untyped] args) -> void"
|
69
|
+
"def initialize: #{initialize_overloads.join("\n | ")}"
|
70
|
+
end
|
71
|
+
|
72
|
+
def load?
|
73
|
+
@resource["load"]
|
74
|
+
end
|
75
|
+
|
76
|
+
def load_or_shape?
|
77
|
+
load? or !!shape
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
# `Aws::RDS::DBEngineVersion` has a duplicated method named `engine`.
|
83
|
+
# This is a rare case and should be patched minimally.
|
84
|
+
def avoid_duplicate_methods
|
85
|
+
overrided_method_names = @actions.map(&:method_name).to_set + @associations.map(&:method_name).to_set
|
86
|
+
@identifiers.each do |identifier|
|
87
|
+
if identifier.alias && overrided_method_names.include?(identifier.alias)
|
88
|
+
identifier.alias = nil
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AwsSdkCodeGenerator
|
4
|
+
module Views
|
5
|
+
module RBS
|
6
|
+
class RootResourceClass < View
|
7
|
+
attr_reader :actions
|
8
|
+
attr_reader :associations
|
9
|
+
attr_reader :service_name
|
10
|
+
|
11
|
+
def initialize(client_class:, api:, resources:, service_name:, paginators:)
|
12
|
+
@client_class = client_class
|
13
|
+
@service_name = service_name
|
14
|
+
resource = resources&.[]("service") || {}
|
15
|
+
@actions = AwsSdkCodeGenerator::RBS::ResourceAction.build_method_signature_list(resource: resource, api: api)
|
16
|
+
@associations = AwsSdkCodeGenerator::RBS::ResourceAssociation.build_method_signature_list(resource: resource, api: api, paginators: paginators)
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [String|nil]
|
20
|
+
def generated_src_warning
|
21
|
+
GENERATED_SRC_WARNING
|
22
|
+
end
|
23
|
+
|
24
|
+
def client_option
|
25
|
+
@client_class.client_option(indent: ' ' * 22)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,257 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AwsSdkCodeGenerator
|
4
|
+
module Views
|
5
|
+
module RBS
|
6
|
+
class TypesModule < View
|
7
|
+
|
8
|
+
include Helper
|
9
|
+
|
10
|
+
# @option options [required, Service] :service
|
11
|
+
def initialize(options)
|
12
|
+
@service = options.fetch(:service)
|
13
|
+
@api = @service.api
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [String|nil]
|
17
|
+
def generated_src_warning
|
18
|
+
return if @service.protocol == 'api-gateway'
|
19
|
+
GENERATED_SRC_WARNING
|
20
|
+
end
|
21
|
+
|
22
|
+
def module_name
|
23
|
+
@service.module_name
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return [Array<StructClass>]
|
27
|
+
def structures
|
28
|
+
@service.api['shapes'].each do |_, shape|
|
29
|
+
if shape['eventstream']
|
30
|
+
# add internal exception_event ctrait to all exceptions
|
31
|
+
# exceptions will not have the event trait.
|
32
|
+
shape['members'].each do |name, ref|
|
33
|
+
if !!@service.api['shapes'][ref['shape']]['exception']
|
34
|
+
@service.api['shapes'][ref['shape']]['exception_event'] = true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
@service.api['shapes'].inject([]) do |list, (shape_name, shape)|
|
40
|
+
# APIG model can have input/output shape with downcase and '__'
|
41
|
+
if @service.protocol == 'api-gateway'
|
42
|
+
shape_name = lstrip_prefix(upcase_first(shape_name))
|
43
|
+
end
|
44
|
+
# eventstream shape will be inheriting from enumerator
|
45
|
+
if shape['eventstream']
|
46
|
+
list
|
47
|
+
elsif shape['type'] == 'structure' && !shape['document']
|
48
|
+
struct_members = struct_members(shape)
|
49
|
+
sensitive_params = struct_members.select(&:sensitive).map do |m|
|
50
|
+
m.member_name.to_sym
|
51
|
+
end
|
52
|
+
list << StructClass.new(
|
53
|
+
class_name: shape_name,
|
54
|
+
members: struct_members,
|
55
|
+
sensitive_params: sensitive_params,
|
56
|
+
documentation: struct_class_docs(shape_name, shape),
|
57
|
+
union: shape['union']
|
58
|
+
)
|
59
|
+
else
|
60
|
+
list
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# return [Array<EventStreamClass>]
|
66
|
+
def eventstreams
|
67
|
+
@service.api['shapes'].inject([]) do |list, (shape_name, shape)|
|
68
|
+
if shape['eventstream']
|
69
|
+
list << EventStreamClass.new(
|
70
|
+
class_name: shape_name,
|
71
|
+
types: struct_members(shape),
|
72
|
+
documentation: eventstream_class_docs(shape_name, shape)
|
73
|
+
)
|
74
|
+
else
|
75
|
+
list
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def struct_members(shape)
|
83
|
+
return if shape['members'].nil?
|
84
|
+
members = shape['members'].map do |member_name, member_ref|
|
85
|
+
sensitive = !!(member_ref['sensitive'] ||
|
86
|
+
@api['shapes'][member_ref['shape']]['sensitive'])
|
87
|
+
StructMember.new(
|
88
|
+
member_name: underscore(member_name),
|
89
|
+
sensitive: sensitive,
|
90
|
+
returns: AwsSdkCodeGenerator::RBS.to_type(member_ref, @api)
|
91
|
+
)
|
92
|
+
end
|
93
|
+
if shape['event'] || shape['exception_event']
|
94
|
+
members << StructMember.new(
|
95
|
+
member_name: 'event_type',
|
96
|
+
returns: 'untyped'
|
97
|
+
)
|
98
|
+
end
|
99
|
+
members
|
100
|
+
end
|
101
|
+
|
102
|
+
def struct_class_docs(shape_name, shape)
|
103
|
+
nil
|
104
|
+
end
|
105
|
+
|
106
|
+
def eventstream_class_docs(shape_name, shape)
|
107
|
+
nil
|
108
|
+
end
|
109
|
+
|
110
|
+
def eventstream_docs(shape_name)
|
111
|
+
nil
|
112
|
+
end
|
113
|
+
|
114
|
+
def output_example_docs(shape_name, shape)
|
115
|
+
nil
|
116
|
+
end
|
117
|
+
|
118
|
+
def input_example_docs(shape_name, shape)
|
119
|
+
nil
|
120
|
+
end
|
121
|
+
|
122
|
+
def attribute_macros_docs(shape_name)
|
123
|
+
nil
|
124
|
+
end
|
125
|
+
|
126
|
+
def idempotency_token?(member_ref)
|
127
|
+
member_ref['idempotencyToken'] || shape(member_ref)['idempotencyToken']
|
128
|
+
end
|
129
|
+
|
130
|
+
def idempotency_token_msg
|
131
|
+
"<p><b>A suitable default value is auto-generated.</b> You should normally not need to pass this option.</p>"
|
132
|
+
end
|
133
|
+
|
134
|
+
def visit_shapes(shape_ref, shapes)
|
135
|
+
return if shapes.include?(shape_ref['shape']) # recursion
|
136
|
+
shapes << shape_ref['shape']
|
137
|
+
s = shape(shape_ref)
|
138
|
+
raise "cannot locate shape #{shape_ref['shape']}" if s.nil?
|
139
|
+
case s['type']
|
140
|
+
when 'structure'
|
141
|
+
return if s['members'].nil?
|
142
|
+
s['members'].each_pair do |_, member_ref|
|
143
|
+
visit_shapes(member_ref, shapes)
|
144
|
+
end
|
145
|
+
when 'list'
|
146
|
+
visit_shapes(s['member'], shapes)
|
147
|
+
when 'map'
|
148
|
+
visit_shapes(s['key'], shapes)
|
149
|
+
visit_shapes(s['value'], shapes)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def shape(shape_ref)
|
154
|
+
Api.resolve(shape_ref, @api)[1]
|
155
|
+
end
|
156
|
+
|
157
|
+
class EventStreamClass
|
158
|
+
|
159
|
+
def initialize(options)
|
160
|
+
@class_name = options.fetch(:class_name)
|
161
|
+
@types = options.fetch(:types)
|
162
|
+
@documentation = options.fetch(:documentation)
|
163
|
+
if @types.nil? || @types.empty?
|
164
|
+
@empty = true
|
165
|
+
else
|
166
|
+
@empty = false
|
167
|
+
@types.last.last = true
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# @return [String]
|
172
|
+
attr_accessor :class_name
|
173
|
+
|
174
|
+
# @return [Array<StructMember>]
|
175
|
+
attr_accessor :types
|
176
|
+
|
177
|
+
# @return [String, nil]
|
178
|
+
attr_accessor :documentation
|
179
|
+
|
180
|
+
# @return [Boolean]
|
181
|
+
def empty?
|
182
|
+
@empty
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
|
187
|
+
class StructClass
|
188
|
+
|
189
|
+
def initialize(options)
|
190
|
+
@class_name = options.fetch(:class_name)
|
191
|
+
@members = options.fetch(:members)
|
192
|
+
@documentation = options.fetch(:documentation)
|
193
|
+
@sensitive_params = options.fetch(:sensitive_params)
|
194
|
+
@union = options.fetch(:union)
|
195
|
+
@members << StructMember.new(
|
196
|
+
member_name: :unknown,
|
197
|
+
returns: 'untyped' # FIXME
|
198
|
+
) if @union
|
199
|
+
if @members.nil? || @members.empty?
|
200
|
+
@empty = true
|
201
|
+
else
|
202
|
+
@empty = false
|
203
|
+
@members.last.last = true
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
# @return [String]
|
208
|
+
attr_accessor :class_name
|
209
|
+
|
210
|
+
# @return [Array<StructMember>]
|
211
|
+
attr_accessor :members
|
212
|
+
|
213
|
+
# @return [String, nil]
|
214
|
+
attr_accessor :documentation
|
215
|
+
|
216
|
+
# @return [Array<Symbol>]
|
217
|
+
attr_accessor :sensitive_params
|
218
|
+
|
219
|
+
# @return [Boolean]
|
220
|
+
def union?
|
221
|
+
@union
|
222
|
+
end
|
223
|
+
|
224
|
+
# @return [Boolean]
|
225
|
+
def empty?
|
226
|
+
@empty
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
class StructMember
|
231
|
+
def initialize(member_name:, sensitive: false, returns:)
|
232
|
+
@member_name = member_name
|
233
|
+
@member_class_name = AwsSdkCodeGenerator::Helper::pascal_case(@member_name)
|
234
|
+
@sensitive = sensitive
|
235
|
+
@returns = returns
|
236
|
+
@last = false
|
237
|
+
end
|
238
|
+
|
239
|
+
# @return [String]
|
240
|
+
attr_accessor :member_name
|
241
|
+
|
242
|
+
# @return [Boolean]
|
243
|
+
attr_accessor :sensitive
|
244
|
+
|
245
|
+
# @return [String]
|
246
|
+
attr_accessor :member_class_name
|
247
|
+
|
248
|
+
# @return [String]
|
249
|
+
attr_accessor :returns
|
250
|
+
|
251
|
+
# @return [Boolean]
|
252
|
+
attr_accessor :last
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AwsSdkCodeGenerator
|
4
|
+
module Views
|
5
|
+
module RBS
|
6
|
+
class WaitersModule < View
|
7
|
+
attr_reader :service_name
|
8
|
+
attr_reader :waiters
|
9
|
+
|
10
|
+
def initialize(service_name:, api:, waiters:)
|
11
|
+
@service_name = service_name
|
12
|
+
@waiters = AwsSdkCodeGenerator::RBS::Waiter.build_list(api: api, waiters: waiters)
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [String|nil]
|
16
|
+
def generated_src_warning
|
17
|
+
GENERATED_SRC_WARNING
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -90,6 +90,10 @@ module AwsSdkCodeGenerator
|
|
90
90
|
!@expect['endpoint']['properties']['authSchemes'].empty?
|
91
91
|
end
|
92
92
|
|
93
|
+
def s3_express_auth?
|
94
|
+
expect_auth? && expected_auth['name'] == 'sigv4-s3express'
|
95
|
+
end
|
96
|
+
|
93
97
|
def expected_headers
|
94
98
|
@expect['endpoint']['headers'].map { |k,v| Param.new(k, v.join(",")) }
|
95
99
|
end
|
@@ -137,7 +141,7 @@ module AwsSdkCodeGenerator
|
|
137
141
|
case value
|
138
142
|
when Hash
|
139
143
|
value.each_with_object({}) do |(k, v), o|
|
140
|
-
o[Underscore.underscore(k)] = transform_operation_values(v)
|
144
|
+
o[Underscore.underscore(k).to_sym] = transform_operation_values(v)
|
141
145
|
end
|
142
146
|
when Array
|
143
147
|
value.map { |v| transform_operation_values(v) }
|
@@ -28,14 +28,13 @@ module AwsSdkCodeGenerator
|
|
28
28
|
|
29
29
|
# @return [Array<StructClass>]
|
30
30
|
def structures
|
31
|
-
|
32
|
-
if
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
31
|
+
@service.api['shapes'].each do |_, shape|
|
32
|
+
if shape['eventstream']
|
33
|
+
# add internal exception_event ctrait to all exceptions
|
34
|
+
# exceptions will not have the event trait.
|
35
|
+
shape['members'].each do |name, ref|
|
36
|
+
if !!@service.api['shapes'][ref['shape']]['exception']
|
37
|
+
@service.api['shapes'][ref['shape']]['exception_event'] = true
|
39
38
|
end
|
40
39
|
end
|
41
40
|
end
|
@@ -93,7 +92,7 @@ module AwsSdkCodeGenerator
|
|
93
92
|
sensitive: sensitive
|
94
93
|
)
|
95
94
|
end
|
96
|
-
if shape['event']
|
95
|
+
if shape['event'] || shape['exception_event']
|
97
96
|
members << StructMember.new(member_name: 'event_type')
|
98
97
|
end
|
99
98
|
members
|
@@ -50,7 +50,6 @@ require_relative 'aws-sdk-code-generator/views/docstring'
|
|
50
50
|
require_relative 'aws-sdk-code-generator/views/errors_module'
|
51
51
|
require_relative 'aws-sdk-code-generator/views/features/env'
|
52
52
|
require_relative 'aws-sdk-code-generator/views/features/step_definitions'
|
53
|
-
require_relative 'aws-sdk-code-generator/views/features/smoke_step_definitions'
|
54
53
|
require_relative 'aws-sdk-code-generator/views/features/smoke'
|
55
54
|
require_relative 'aws-sdk-code-generator/views/gemspec'
|
56
55
|
require_relative 'aws-sdk-code-generator/views/resource_class'
|
@@ -76,6 +75,23 @@ require_relative 'aws-sdk-code-generator/yard_option_tag'
|
|
76
75
|
require_relative 'aws-sdk-code-generator/code_builder'
|
77
76
|
require_relative 'aws-sdk-code-generator/gem_builder'
|
78
77
|
|
78
|
+
# RBS
|
79
|
+
require_relative 'aws-sdk-code-generator/rbs'
|
80
|
+
require_relative 'aws-sdk-code-generator/rbs/error_list'
|
81
|
+
require_relative 'aws-sdk-code-generator/rbs/method_signature'
|
82
|
+
require_relative 'aws-sdk-code-generator/rbs/keyword_argument_builder'
|
83
|
+
require_relative 'aws-sdk-code-generator/rbs/resource_action'
|
84
|
+
require_relative 'aws-sdk-code-generator/rbs/resource_association'
|
85
|
+
require_relative 'aws-sdk-code-generator/rbs/resource_batch_action'
|
86
|
+
require_relative 'aws-sdk-code-generator/rbs/resource_client_request'
|
87
|
+
require_relative 'aws-sdk-code-generator/rbs/waiter'
|
88
|
+
require_relative 'aws-sdk-code-generator/views/rbs/client_class'
|
89
|
+
require_relative 'aws-sdk-code-generator/views/rbs/errors_module'
|
90
|
+
require_relative 'aws-sdk-code-generator/views/rbs/resource_class'
|
91
|
+
require_relative 'aws-sdk-code-generator/views/rbs/root_resource_class'
|
92
|
+
require_relative 'aws-sdk-code-generator/views/rbs/types_module'
|
93
|
+
require_relative 'aws-sdk-code-generator/views/rbs/waiters_module'
|
94
|
+
|
79
95
|
module AwsSdkCodeGenerator
|
80
96
|
|
81
97
|
GENERATED_SRC_WARNING = <<-WARNING_TXT
|