aws-sdk-code-generator 0.1.0.pre → 0.2.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 (131) hide show
  1. checksums.yaml +5 -5
  2. data/lib/aws-sdk-code-generator.rb +68 -75
  3. data/lib/aws-sdk-code-generator/api.rb +130 -0
  4. data/lib/aws-sdk-code-generator/apply_docs.rb +15 -2
  5. data/lib/aws-sdk-code-generator/client_constructor.rb +39 -0
  6. data/lib/aws-sdk-code-generator/client_operation_documentation.rb +268 -0
  7. data/lib/aws-sdk-code-generator/client_operation_list.rb +148 -0
  8. data/lib/aws-sdk-code-generator/client_response_structure_example.rb +108 -0
  9. data/lib/aws-sdk-code-generator/code_builder.rb +146 -133
  10. data/lib/aws-sdk-code-generator/crosslink.rb +42 -0
  11. data/lib/aws-sdk-code-generator/docstring.rb +199 -0
  12. data/lib/aws-sdk-code-generator/error_list.rb +77 -0
  13. data/lib/aws-sdk-code-generator/errors.rb +2 -0
  14. data/lib/aws-sdk-code-generator/eventstream_example.rb +220 -0
  15. data/lib/aws-sdk-code-generator/gem_builder.rb +19 -25
  16. data/lib/aws-sdk-code-generator/hash_formatter.rb +5 -2
  17. data/lib/aws-sdk-code-generator/helper.rb +77 -61
  18. data/lib/aws-sdk-code-generator/plugin_list.rb +146 -0
  19. data/lib/aws-sdk-code-generator/resource_action.rb +69 -0
  20. data/lib/aws-sdk-code-generator/resource_action_code.rb +57 -0
  21. data/lib/aws-sdk-code-generator/resource_association.rb +37 -0
  22. data/lib/aws-sdk-code-generator/resource_attribute.rb +76 -0
  23. data/lib/aws-sdk-code-generator/resource_batch_action.rb +56 -0
  24. data/lib/aws-sdk-code-generator/resource_batch_action_code.rb +136 -0
  25. data/lib/aws-sdk-code-generator/resource_batch_action_documentation.rb +108 -0
  26. data/lib/aws-sdk-code-generator/resource_batch_builder.rb +212 -0
  27. data/lib/aws-sdk-code-generator/resource_builder.rb +48 -0
  28. data/lib/aws-sdk-code-generator/resource_client_request.rb +62 -0
  29. data/lib/aws-sdk-code-generator/resource_client_request_documentation.rb +81 -0
  30. data/lib/aws-sdk-code-generator/resource_client_request_params.rb +86 -0
  31. data/lib/aws-sdk-code-generator/resource_data_method.rb +60 -0
  32. data/lib/aws-sdk-code-generator/resource_has_association.rb +117 -0
  33. data/lib/aws-sdk-code-generator/resource_has_many_association.rb +52 -0
  34. data/lib/aws-sdk-code-generator/resource_has_many_association_code.rb +76 -0
  35. data/lib/aws-sdk-code-generator/resource_identifier.rb +44 -0
  36. data/lib/aws-sdk-code-generator/resource_identifiers_method.rb +29 -0
  37. data/lib/aws-sdk-code-generator/resource_load_method.rb +68 -0
  38. data/lib/aws-sdk-code-generator/resource_method.rb +22 -0
  39. data/lib/aws-sdk-code-generator/resource_skip_params.rb +36 -0
  40. data/lib/aws-sdk-code-generator/resource_value_source.rb +68 -0
  41. data/lib/aws-sdk-code-generator/resource_waiter.rb +80 -0
  42. data/lib/aws-sdk-code-generator/service.rb +30 -7
  43. data/lib/aws-sdk-code-generator/shared_example.rb +131 -0
  44. data/lib/aws-sdk-code-generator/syntax_example.rb +60 -0
  45. data/lib/aws-sdk-code-generator/syntax_example_hash.rb +174 -0
  46. data/lib/aws-sdk-code-generator/underscore.rb +10 -5
  47. data/lib/aws-sdk-code-generator/view.rb +33 -0
  48. data/lib/aws-sdk-code-generator/views.rb +2 -0
  49. data/lib/aws-sdk-code-generator/views/apig_endpoint_class.rb +25 -0
  50. data/lib/aws-sdk-code-generator/views/apig_readme.rb +32 -0
  51. data/lib/aws-sdk-code-generator/views/async_client_class.rb +68 -0
  52. data/lib/aws-sdk-code-generator/views/authorizer_class.rb +17 -0
  53. data/lib/aws-sdk-code-generator/views/client_api_module.rb +583 -0
  54. data/lib/aws-sdk-code-generator/views/client_class.rb +93 -0
  55. data/lib/aws-sdk-code-generator/views/docstring.rb +27 -0
  56. data/lib/aws-sdk-code-generator/views/errors_module.rb +32 -0
  57. data/lib/aws-sdk-code-generator/views/event_streams_module.rb +149 -0
  58. data/lib/aws-sdk-code-generator/views/features/env.rb +9 -0
  59. data/lib/aws-sdk-code-generator/views/features/smoke.rb +51 -0
  60. data/lib/aws-sdk-code-generator/views/features/smoke_step_definitions.rb +26 -0
  61. data/lib/aws-sdk-code-generator/views/features/step_definitions.rb +2 -0
  62. data/lib/aws-sdk-code-generator/views/gemspec.rb +39 -5
  63. data/lib/aws-sdk-code-generator/views/resource_class.rb +122 -0
  64. data/lib/aws-sdk-code-generator/views/root_resource_class.rb +58 -0
  65. data/lib/aws-sdk-code-generator/views/service_module.rb +30 -14
  66. data/lib/aws-sdk-code-generator/views/spec/spec_helper.rb +9 -0
  67. data/lib/aws-sdk-code-generator/views/types_module.rb +294 -0
  68. data/lib/aws-sdk-code-generator/views/version.rb +2 -0
  69. data/lib/aws-sdk-code-generator/views/waiters_module.rb +37 -0
  70. data/lib/aws-sdk-code-generator/waiter.rb +95 -0
  71. data/lib/aws-sdk-code-generator/yard_option_tag.rb +43 -0
  72. metadata +61 -68
  73. data/lib/aws-sdk-code-generator/dsl/access_control_statement.rb +0 -23
  74. data/lib/aws-sdk-code-generator/dsl/attribute_accessor.rb +0 -43
  75. data/lib/aws-sdk-code-generator/dsl/attribute_reader.rb +0 -11
  76. data/lib/aws-sdk-code-generator/dsl/attribute_writer.rb +0 -11
  77. data/lib/aws-sdk-code-generator/dsl/autoload_statement.rb +0 -15
  78. data/lib/aws-sdk-code-generator/dsl/block_param.rb +0 -11
  79. data/lib/aws-sdk-code-generator/dsl/class.rb +0 -27
  80. data/lib/aws-sdk-code-generator/dsl/code_literal.rb +0 -66
  81. data/lib/aws-sdk-code-generator/dsl/code_object.rb +0 -33
  82. data/lib/aws-sdk-code-generator/dsl/docstring.rb +0 -36
  83. data/lib/aws-sdk-code-generator/dsl/eigenclass.rb +0 -15
  84. data/lib/aws-sdk-code-generator/dsl/extend_statement.rb +0 -12
  85. data/lib/aws-sdk-code-generator/dsl/formatter.rb +0 -25
  86. data/lib/aws-sdk-code-generator/dsl/include_statement.rb +0 -17
  87. data/lib/aws-sdk-code-generator/dsl/main.rb +0 -105
  88. data/lib/aws-sdk-code-generator/dsl/method.rb +0 -108
  89. data/lib/aws-sdk-code-generator/dsl/module.rb +0 -167
  90. data/lib/aws-sdk-code-generator/dsl/option_tag.rb +0 -36
  91. data/lib/aws-sdk-code-generator/dsl/param.rb +0 -43
  92. data/lib/aws-sdk-code-generator/dsl/param_list.rb +0 -38
  93. data/lib/aws-sdk-code-generator/dsl/return_tag.rb +0 -19
  94. data/lib/aws-sdk-code-generator/dsl/tag_default.rb +0 -20
  95. data/lib/aws-sdk-code-generator/dsl/tag_docstring.rb +0 -27
  96. data/lib/aws-sdk-code-generator/dsl/tag_type.rb +0 -18
  97. data/lib/aws-sdk-code-generator/generators/client_api_module.rb +0 -334
  98. data/lib/aws-sdk-code-generator/generators/client_class.rb +0 -389
  99. data/lib/aws-sdk-code-generator/generators/client_operation_documentation.rb +0 -166
  100. data/lib/aws-sdk-code-generator/generators/errors_module.rb +0 -25
  101. data/lib/aws-sdk-code-generator/generators/resource/action.rb +0 -88
  102. data/lib/aws-sdk-code-generator/generators/resource/batch_builder.rb +0 -211
  103. data/lib/aws-sdk-code-generator/generators/resource/builder.rb +0 -50
  104. data/lib/aws-sdk-code-generator/generators/resource/client_getter.rb +0 -15
  105. data/lib/aws-sdk-code-generator/generators/resource/client_request.rb +0 -49
  106. data/lib/aws-sdk-code-generator/generators/resource/client_request_docs.rb +0 -97
  107. data/lib/aws-sdk-code-generator/generators/resource/client_request_params.rb +0 -88
  108. data/lib/aws-sdk-code-generator/generators/resource/collection_class.rb +0 -180
  109. data/lib/aws-sdk-code-generator/generators/resource/data_attribute_getter.rb +0 -24
  110. data/lib/aws-sdk-code-generator/generators/resource/data_loaded_method.rb +0 -18
  111. data/lib/aws-sdk-code-generator/generators/resource/data_method.rb +0 -49
  112. data/lib/aws-sdk-code-generator/generators/resource/exists_method.rb +0 -29
  113. data/lib/aws-sdk-code-generator/generators/resource/extract_identifier_method.rb +0 -32
  114. data/lib/aws-sdk-code-generator/generators/resource/has_association.rb +0 -101
  115. data/lib/aws-sdk-code-generator/generators/resource/has_many_association.rb +0 -108
  116. data/lib/aws-sdk-code-generator/generators/resource/identifier_getter.rb +0 -26
  117. data/lib/aws-sdk-code-generator/generators/resource/identifiers_method.rb +0 -28
  118. data/lib/aws-sdk-code-generator/generators/resource/initialize_method.rb +0 -67
  119. data/lib/aws-sdk-code-generator/generators/resource/load_method.rb +0 -65
  120. data/lib/aws-sdk-code-generator/generators/resource/value_source.rb +0 -68
  121. data/lib/aws-sdk-code-generator/generators/resource/waiter_method.rb +0 -61
  122. data/lib/aws-sdk-code-generator/generators/resource_class.rb +0 -325
  123. data/lib/aws-sdk-code-generator/generators/response_structure_example.rb +0 -83
  124. data/lib/aws-sdk-code-generator/generators/root_resource_class.rb +0 -42
  125. data/lib/aws-sdk-code-generator/generators/service_documentation.rb +0 -64
  126. data/lib/aws-sdk-code-generator/generators/shared_example.rb +0 -132
  127. data/lib/aws-sdk-code-generator/generators/structure_type_class.rb +0 -95
  128. data/lib/aws-sdk-code-generator/generators/syntax_example.rb +0 -169
  129. data/lib/aws-sdk-code-generator/generators/types_module.rb +0 -52
  130. data/lib/aws-sdk-code-generator/generators/waiter_class.rb +0 -62
  131. data/lib/aws-sdk-code-generator/generators/waiters_module.rb +0 -20
@@ -1,167 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Dsl
3
- class Module < Dsl::Main
4
-
5
- include Dsl::CodeObject
6
-
7
- # @option options [Main, Module] :parent (nil)
8
- def initialize(name, options = {}, &block)
9
- @name = name
10
- @code_objects = []
11
- @access = :public
12
- @parent = options.fetch(:parent, nil)
13
- @docstring = Dsl::Docstring.new(nil)
14
- yield(self) if block
15
- end
16
-
17
- attr_reader :name
18
-
19
- def add(*code_objects)
20
- code_objects.each do |code_object|
21
- if Dsl::Method === code_object && code_object.access != @access
22
- add(AccessControlStatement.new(code_object.access))
23
- elsif Dsl::AccessControlStatement === code_object
24
- @access = code_object.access
25
- end
26
- super(code_object)
27
- end
28
- end
29
-
30
- def require_statement(path)
31
- root.require(path)
32
- end
33
- alias require require_statement
34
-
35
- def docstring(docstring = nil)
36
- @docstring ||= Dsl::Docstring.new
37
- @docstring.append(docstring) unless docstring.nil?
38
- @docstring
39
- end
40
-
41
- def require_relative(path)
42
- root.require_relative(path)
43
- end
44
-
45
- def constructor(options = {}, &block)
46
- method(:initialize, options, &block)
47
- end
48
-
49
- def attr_accessor(name, options = {}, &block)
50
- a = Dsl::AttributeAccessor.new(name, options)
51
- yield(a) if block
52
- add(a)
53
- end
54
-
55
- def autoload(const_name, path)
56
- @code_objects << AutoloadStatement.new(const_name, path)
57
- end
58
-
59
- def attr_reader(name, options = {}, &block)
60
- a = Dsl::AttributeReader.new(name, options)
61
- yield(a) if block
62
- add(a)
63
- end
64
-
65
- def attr_writer(name, &block)
66
- a = Dsl::AttributeWriter.new(name)
67
- yield(a) if block
68
- add(a)
69
- end
70
-
71
- def eigenclass(&block)
72
- m = Dsl::Eigenclass.new
73
- yield(m) if block
74
- add(m)
75
- end
76
-
77
- def lines
78
- code = []
79
- code.concat(@docstring.lines)
80
- code += open_module
81
- code << :newline if padded?(0)
82
-
83
- @code_objects.each.with_index do |code_object, n|
84
- code << code_object.lines
85
- code << :newline if separator?(n)
86
- end
87
-
88
- if @code_objects.empty?
89
- code[-1] += "; end"
90
- else
91
- code += close_module
92
- end
93
- code
94
- end
95
-
96
- private
97
-
98
- def open_module
99
- ["module #{@name}"]
100
- end
101
-
102
- def close_module
103
- ["end"]
104
- end
105
-
106
- def padded?(n)
107
- !@code_objects[n].kind_of?(Dsl::Module) &&
108
- !(
109
- @code_objects.all? { |obj| autoload_statement?(obj) } ||
110
- @code_objects.all? { |obj| mixin?(obj) } ||
111
- @code_objects.all? { |obj| undocumented_attr_macro?(obj) }
112
- )
113
- end
114
-
115
- def separator?(n)
116
- if last?(n)
117
- padded?(@code_objects.size - 1)
118
- elsif grouped_statements?(n)
119
- false
120
- else
121
- true
122
- end
123
- end
124
-
125
- def last?(n)
126
- @code_objects.size == n + 1
127
- end
128
-
129
- def grouped_statements?(n)
130
- two_autoloads?(n) ||
131
- two_mixins?(n) ||
132
- two_undocumented_attr_macros?(n)
133
- end
134
-
135
- def two_autoloads?(n)
136
- @code_objects[n + 1] &&
137
- autoload_statement?(@code_objects[n + 1]) &&
138
- autoload_statement?(@code_objects[n])
139
- end
140
-
141
- def two_mixins?(n)
142
- @code_objects[n + 1] &&
143
- mixin?(@code_objects[n + 1]) &&
144
- mixin?(@code_objects[n])
145
- end
146
-
147
- def two_undocumented_attr_macros?(n)
148
- @code_objects[n + 1] &&
149
- undocumented_attr_macro?(@code_objects[n + 1]) &&
150
- undocumented_attr_macro?(@code_objects[n])
151
- end
152
-
153
- def autoload_statement?(code_object)
154
- Dsl::AutoloadStatement === code_object
155
- end
156
-
157
- def mixin?(code_object)
158
- Dsl::IncludeStatement === code_object
159
- end
160
-
161
- def undocumented_attr_macro?(code_object)
162
- Dsl::AttributeAccessor === code_object && !code_object.documented?
163
- end
164
-
165
- end
166
- end
167
- end
@@ -1,36 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Dsl
3
- class OptionTag
4
-
5
- # @option options [required, String] :name
6
- # @option options [required, String] :type
7
- # @option options [String] :param ('options')
8
- # @option options [Boolean] :required (false)
9
- # @option options [String, nil] :docstring (nil)
10
- # @option options [Object] :default
11
- def initialize(options)
12
- @name = options.fetch(:name)
13
- @type = options.fetch(:type)
14
- @param = options.fetch(:param, 'options')
15
- @required = options.fetch(:required, false) ? 'required, ' : ''
16
- @docstring = Dsl::TagDocstring.new(options.fetch(:docstring, nil))
17
- @default = Dsl::TagDefault.new(options.fetch(:default, nil))
18
- end
19
-
20
- def lines
21
- [first_line] + @docstring.lines
22
- end
23
-
24
- private
25
-
26
- def first_line
27
- "# @option #{@param} [#{@required}#{@type}] :#{@name}#{yard_default}"
28
- end
29
-
30
- def yard_default
31
- @default.empty? ? '' : " (#{@default})"
32
- end
33
-
34
- end
35
- end
36
- end
@@ -1,43 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Dsl
3
- class Param
4
-
5
- # @option options [String] :type
6
- # @option options [Object] :default
7
- # @option options [String] :docstring
8
- # @option options [Boolean] :documented (true)
9
- def initialize(name, options = {})
10
- @name = name.to_s
11
- @type = TagType.new(options.fetch(:type, nil))
12
- @default = TagDefault.new(options.fetch(:default, nil))
13
- @docstring = TagDocstring.new(options.fetch(:docstring, nil))
14
- @documented = options.fetch(:documented, true)
15
- end
16
-
17
- attr_reader :name, :default
18
-
19
- def documented?
20
- !!@documented
21
- end
22
-
23
- def tag
24
- if [@type, @default, @docstring].all?(&:empty?)
25
- []
26
- else
27
- [first_line] + @docstring.lines
28
- end
29
- end
30
-
31
- private
32
-
33
- def first_line
34
- "# @param#{@type} #{@name}#{yard_default}"
35
- end
36
-
37
- def yard_default
38
- @default.empty? ? '' : " (#{@default})"
39
- end
40
-
41
- end
42
- end
43
- end
@@ -1,38 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Dsl
3
- # @api private
4
- class ParamList
5
-
6
- def initialize(params)
7
- @params = params
8
- end
9
-
10
- def signature
11
- if @params.empty?
12
- nil
13
- else
14
- "(#{@params.map { |p| param_signature(p) }.join(', ')})"
15
- end
16
- end
17
-
18
- def tags
19
- lines = []
20
- @params.each do |param|
21
- lines.concat(param.tag) if param.documented?
22
- end
23
- lines
24
- end
25
-
26
- private
27
-
28
- def param_signature(param)
29
- if param.default.empty?
30
- param.name
31
- else
32
- "#{param.name} = #{param.default}"
33
- end
34
- end
35
-
36
- end
37
- end
38
- end
@@ -1,19 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Dsl
3
- # @api private
4
- class ReturnTag
5
-
6
- # @option options [required, String] :type
7
- # @option options [String] :docstring
8
- def initialize(options)
9
- @type = Dsl::TagType.new(options.fetch(:type))
10
- @docstring = Dsl::TagDocstring.new(options.fetch(:docstring, nil))
11
- end
12
-
13
- def lines
14
- ["# @return#{@type}"] + @docstring.lines
15
- end
16
-
17
- end
18
- end
19
- end
@@ -1,20 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Dsl
3
- # @api private
4
- class TagDefault
5
-
6
- def initialize(default)
7
- @default = default
8
- end
9
-
10
- def to_s
11
- @default.inspect
12
- end
13
-
14
- def empty?
15
- @default.nil?
16
- end
17
-
18
- end
19
- end
20
- end
@@ -1,27 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Dsl
3
- # @api private
4
- class TagDocstring
5
-
6
- def initialize(docstring)
7
- @lines = docstring.to_s.strip.lines.inject([]) do |lines, line|
8
- line = line.rstrip
9
- if line.empty?
10
- lines << "#"
11
- else
12
- lines << "# #{line.rstrip}"
13
- end
14
- end
15
- end
16
-
17
- # @return Array<String>
18
- attr_reader :lines
19
-
20
- # @return [Boolean]
21
- def empty?
22
- @lines.empty?
23
- end
24
-
25
- end
26
- end
27
- end
@@ -1,18 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Dsl
3
- # @api private
4
- class TagType < String
5
-
6
- def self.new(type)
7
- if type
8
- types = Array(type)
9
- types = types.map { |t| t.nil? ? 'nil' : t.to_s }
10
- super(types.empty? ? '' : " [#{types.join(', ')}]")
11
- else
12
- super('')
13
- end
14
- end
15
-
16
- end
17
- end
18
- end
@@ -1,334 +0,0 @@
1
- module AwsSdkCodeGenerator
2
- module Generators
3
- class ClientApiModule < Dsl::Module
4
-
5
- include Helper
6
-
7
- SKIP_TRAITS = Set.new(%w(shape deprecated location locationName documentation))
8
-
9
- SHAPE_CLASSES = {
10
- 'blob' => 'BlobShape',
11
- 'byte' => 'IntegerShape',
12
- 'boolean' => 'BooleanShape',
13
- 'character' => 'StringShape',
14
- 'double' => 'FloatShape',
15
- 'float' => 'FloatShape',
16
- 'integer' => 'IntegerShape',
17
- 'list' => 'ListShape',
18
- 'long' => 'IntegerShape',
19
- 'map' => 'MapShape',
20
- 'string' => 'StringShape',
21
- 'structure' => 'StructureShape',
22
- 'timestamp' => 'TimestampShape',
23
- }
24
-
25
- SHAPE_KEYS = {
26
- # keep
27
- 'flattened' => true,
28
- 'timestampFormat' => true, # glacier api customization
29
- 'xmlNamespace' => true,
30
- # ignore
31
- 'box' => false,
32
- 'fault' => false,
33
- 'error' => false,
34
- 'deprecated' => false,
35
- 'type' => false,
36
- 'documentation' => false,
37
- 'members' => false,
38
- 'member' => false,
39
- 'key' => false,
40
- 'locationName' => false,
41
- 'value' => false,
42
- 'required' => false,
43
- 'streaming' => false,
44
- 'enum' => false,
45
- 'exception' => false,
46
- 'payload' => false,
47
- 'pattern' => false,
48
- 'sensitive' => false,
49
- 'min' => false,
50
- 'max' => false,
51
- 'wrapper' => false,
52
- 'xmlOrder' => false,
53
- }
54
-
55
- METADATA_KEYS = {
56
- # keep
57
- 'endpointPrefix' => true,
58
- 'signatureVersion' => true,
59
- 'signingName' => true,
60
- 'serviceFullName' => true,
61
- 'protocol' => true,
62
- 'targetPrefix' => true,
63
- 'jsonVersion' => true,
64
- 'errorPrefix' => true,
65
- 'timestampFormat' => true, # glacier api customization
66
- 'xmlNamespace' => true,
67
-
68
- # ignore
69
- 'apiVersion' => false,
70
- 'checksumFormat' => false,
71
- 'globalEndpoint' => false,
72
- 'serviceAbbreviation' => false,
73
- 'uid' => false,
74
- }
75
-
76
- # @option options [required, Hash] :api
77
- # @option options [required, Hash, nil] :paginators
78
- def initialize(options)
79
- @api = options.fetch(:api)
80
- @paginators = options.fetch(:paginators)
81
- super('ClientApi')
82
- docstring("@api private")
83
- include('Seahorse::Model')
84
- apply_shape_classes(self)
85
- apply_shape_definitions(self)
86
- apply_api_const(self)
87
- end
88
-
89
- private
90
-
91
- def metadata
92
- Dsl::CodeLiteral.new do |c|
93
- c << "api.metadata = {"
94
- c.indent do
95
- (@api['metadata'] || {}).keys.sort.each do |key|
96
- if METADATA_KEYS[key]
97
- c << "#{key.inspect} => #{@api['metadata'][key].inspect},"
98
- elsif METADATA_KEYS[key].nil?
99
- raise "unhandled metadata key #{key.inspect}"
100
- end
101
- end
102
- end
103
- c << "}"
104
- end
105
- end
106
-
107
- def operations
108
- (@api['operations'] || {}).map do |name, operation|
109
- operation(name, operation)
110
- end
111
- end
112
-
113
- def operation(name, operation)
114
- Dsl::CodeLiteral.new do |code|
115
- code << "api.add_operation(:#{underscore(name)}, Seahorse::Model::Operation.new.tap do |o|"
116
- code.indent do |c|
117
- c << "o.name = #{name.inspect}"
118
- c << "o.http_method = #{operation['http']['method'].inspect}"
119
- c << "o.http_request_uri = #{operation['http']['requestUri'].inspect}"
120
- c << "o.deprecated = true" if operation['deprecated']
121
- c << "o['authtype'] = #{operation['authtype'].inspect}" if operation['authtype']
122
- %w(input output).each do |mode|
123
- c << "o.#{mode} = #{operation_shape_ref(operation[mode])}"
124
- end
125
- Array(operation['errors']).each do |error|
126
- c << "o.errors << #{operation_shape_ref(error)}"
127
- end
128
- apply_operation_pager(c, name)
129
- end
130
- code << "end)"
131
- end
132
- end
133
-
134
- def operation_shape_ref(ref)
135
- if ref
136
- metadata = ref.dup
137
- shape_name = metadata.delete('shape')
138
- if metadata.empty?
139
- options = ''
140
- else
141
- options = {}
142
- metadata.each_pair do |key, value|
143
- next if key == 'resultWrapper'
144
- if key == 'locationName'
145
- options[:location_name] = value.inspect
146
- else
147
- options[:metadata] ||= {}
148
- options[:metadata][key] = value.inspect
149
- end
150
- end
151
- if options.empty?
152
- options = ''
153
- else
154
- options = ', ' + HashFormatter.new(wrap:false).format(options)
155
- end
156
- end
157
- "Shapes::ShapeRef.new(shape: #{shape_name}#{options})"
158
- else
159
- "Shapes::ShapeRef.new(shape: Shapes::StructureShape.new(struct_class: Aws::EmptyStructure))"
160
- end
161
- end
162
-
163
- def shape_ref(ref, member_name = nil, required = Set.new)
164
- line = "Shapes::ShapeRef.new(shape: #{ref['shape']}"
165
- line += shape_ref_required(required, member_name)
166
- line += shape_ref_deprecated(ref)
167
- line += shape_ref_location(ref)
168
- line += shape_ref_location_name(member_name, ref)
169
- line += shape_ref_metadata(ref)
170
- line += ")"
171
- line
172
- end
173
-
174
- def apply_operation_pager(code, operation_name)
175
- if @paginators && @paginators['pagination'][operation_name]
176
- p = @paginators['pagination'][operation_name]
177
- input = Array(p['input_token'])
178
- output = Array(p['output_token'])
179
- tokens = {}
180
- input.each.with_index do |key, n|
181
- tokens[underscore_jmespath(output[n])] = underscore_jmespath(key)
182
- end
183
- options = {}
184
- options[:more_results] = underscore_jmespath(p['more_results']) if p['more_results']
185
- options[:limit_key] = underscore_jmespath(p['limit_key']) if p['limit_key']
186
- options[:tokens] = tokens
187
- options = HashFormatter.new(
188
- quote_strings: true,
189
- inline: true,
190
- wrap: false,
191
- ).format(options)
192
- code << "o[:pager] = Aws::Pager.new(#{options})" unless tokens.empty?
193
- end
194
- end
195
-
196
- def underscore_jmespath(str)
197
- Underscore.underscore_jmespath(str)
198
- end
199
-
200
- def apply_shape_classes(m)
201
- m.code do |c|
202
- shape_defs.each do |shape_name, shape|
203
- attrs = []
204
- attrs << "name: '#{shape_name}'"
205
- shape.each_pair do |key, value|
206
- if SHAPE_KEYS[key]
207
- attrs << "#{key}: #{value.inspect}"
208
- elsif SHAPE_KEYS[key].nil?
209
- raise "unhandled shape key #{key.inspect}"
210
- end
211
- end
212
- attrs = attrs.join(', ')
213
- c << "#{shape_name} = Shapes::#{shape_class(shape['type'])}.new(#{attrs})"
214
- end
215
- end
216
- end
217
-
218
- def apply_shape_definitions(m)
219
- m.code do |c|
220
- shape_defs.each do |shape_name, shape|
221
- if shape['type'] == 'structure' && !shape['error'] && !shape['exception']
222
- required = Set.new(shape['required'] || [])
223
- shape['members'].each do |member_name, member_ref|
224
- c << "#{shape_name}.add_member(:#{underscore(member_name)}, #{shape_ref(member_ref, member_name, required)})"
225
- end
226
- c << "#{shape_name}.struct_class = Types::#{shape_name}"
227
- if payload = shape['payload']
228
- c << "#{shape_name}[:payload] = :#{underscore(payload)}"
229
- c << "#{shape_name}[:payload_member] = #{shape_name}.member(:#{underscore(payload)})"
230
- end
231
- elsif shape['type'] == 'list'
232
- c << "#{shape_name}.member = #{shape_ref(shape['member'])}"
233
- elsif shape['type'] == 'map'
234
- c << "#{shape_name}.key = #{shape_ref(shape['key'])}"
235
- c << "#{shape_name}.value = #{shape_ref(shape['value'])}"
236
- else
237
- next
238
- end
239
- c.newline
240
- end
241
- end
242
- end
243
-
244
- def apply_api_const(m)
245
- m.code do |c|
246
- c << "# @api private"
247
- c << "API = Seahorse::Model::Api.new.tap do |api|"
248
- c.indent do
249
- c.newline
250
- if @api['metadata'] && @api['metadata']['apiVersion']
251
- c << "api.version = #{@api['metadata']['apiVersion'].inspect}"
252
- c.newline
253
- end
254
- c << metadata
255
- operations.each do |operation|
256
- c.newline
257
- c << operation
258
- end
259
- end
260
- c << "end"
261
- end
262
- end
263
-
264
- def shape_ref_required(required, member_name)
265
- if required.include?(member_name)
266
- ", required: true"
267
- else
268
- ""
269
- end
270
- end
271
-
272
- def shape_ref_deprecated(ref)
273
- if ref['deprecated'] || @api['shapes'][ref['shape']]['deprecated']
274
- ", deprecated: true"
275
- else
276
- ""
277
- end
278
- end
279
-
280
- def shape_ref_location(ref)
281
- if ref['location']
282
- ", location: #{ref['location'].inspect}"
283
- else
284
- ''
285
- end
286
- end
287
-
288
- def shape_ref_location_name(member_name, member_ref)
289
- location_name = member_ref['locationName']
290
- location_name ||= member_name unless member_ref['location'] == 'headers'
291
- location_name ? ", location_name: #{location_name.inspect}" : ""
292
- end
293
-
294
- def shape_ref_metadata(member_ref)
295
- metadata = member_ref.inject({}) do |hash, (key, value)|
296
- hash[key] = value unless SKIP_TRAITS.include?(key)
297
- hash
298
- end
299
- if metadata.empty?
300
- ""
301
- else
302
- ", metadata: #{metadata.inspect}"
303
- end
304
- end
305
-
306
- def shape_class(type)
307
- if SHAPE_CLASSES.key?(type)
308
- SHAPE_CLASSES[type]
309
- else
310
- raise ArgumentError, "unsupported shape type `#{type}'"
311
- end
312
- end
313
-
314
- def shape_defs
315
- Enumerator.new do |y|
316
- (@api['shapes'] || {}).keys.sort.each do |shape_name|
317
- y.yield(shape_name, @api['shapes'][shape_name])
318
- end
319
- end
320
- end
321
-
322
- def structure_defs
323
- Enumerator.new do |y|
324
- shape_defs.each do |shape_name, shape|
325
- if shape['type'] == 'structure' && !shape['error'] && !shape['exception']
326
- y.yield(shape_name, shape)
327
- end
328
- end
329
- end
330
- end
331
-
332
- end
333
- end
334
- end