aws-sdk-core 2.0.48 → 2.1.0

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 (197) hide show
  1. checksums.yaml +4 -4
  2. data/apis/autoscaling/2011-01-01/api-2.json +636 -33
  3. data/apis/cloudhsm/2014-05-30/api-2.json +3 -6
  4. data/apis/ec2/2014-10-01/api-2.json +10267 -0
  5. data/apis/ec2/2014-10-01/paginators-1.json +125 -0
  6. data/apis/ec2/2014-10-01/resources-1.json +2289 -0
  7. data/apis/ec2/2014-10-01/waiters-2.json +453 -0
  8. data/apis/ec2/2015-03-01/api-2.json +11245 -0
  9. data/apis/ec2/2015-03-01/paginators-1.json +125 -0
  10. data/apis/ec2/2015-03-01/resources-1.json +2479 -0
  11. data/apis/ec2/2015-03-01/waiters-2.json +458 -0
  12. data/apis/ec2/2015-04-15/api-2.json +182 -2
  13. data/apis/ecs/2014-11-13/api-2.json +316 -7
  14. data/apis/ecs/2014-11-13/paginators-1.json +40 -0
  15. data/apis/ecs/2014-11-13/waiters-2.json +93 -0
  16. data/apis/redshift/2012-12-01/waiters-2.json +19 -0
  17. data/apis/s3/2006-03-01/api-2.json +1 -2
  18. data/apis/sqs/2012-11-05/api-2.json +5 -6
  19. data/ca-bundle.crt +3554 -0
  20. data/lib/aws-sdk-core.rb +127 -44
  21. data/lib/aws-sdk-core/api/builder.rb +95 -0
  22. data/lib/aws-sdk-core/api/customizations.rb +152 -0
  23. data/lib/aws-sdk-core/api/docs/builder.rb +220 -0
  24. data/lib/aws-sdk-core/api/docs/client_type_documenter.rb +109 -0
  25. data/lib/aws-sdk-core/api/docs/docstring_provider.rb +66 -0
  26. data/lib/aws-sdk-core/api/docs/operation_documenter.rb +107 -0
  27. data/lib/aws-sdk-core/api/docs/param_formatter.rb +163 -0
  28. data/lib/aws-sdk-core/api/docs/request_syntax_example.rb +22 -0
  29. data/lib/aws-sdk-core/api/docs/response_structure_example.rb +91 -0
  30. data/lib/aws-sdk-core/api/docs/utils.rb +133 -0
  31. data/lib/aws-sdk-core/api/shape_map.rb +140 -0
  32. data/lib/aws-sdk-core/assume_role_credentials.rb +9 -6
  33. data/lib/aws-sdk-core/client.rb +9 -6
  34. data/lib/aws-sdk-core/client_stubs.rb +127 -133
  35. data/lib/aws-sdk-core/client_waiters.rb +1 -1
  36. data/lib/aws-sdk-core/credential_provider.rb +44 -0
  37. data/lib/aws-sdk-core/credential_provider_chain.rb +3 -2
  38. data/lib/aws-sdk-core/credentials.rb +5 -0
  39. data/lib/aws-sdk-core/deprecations.rb +69 -0
  40. data/lib/aws-sdk-core/dynamodb.rb +12 -0
  41. data/lib/aws-sdk-core/eager_loader.rb +31 -0
  42. data/lib/aws-sdk-core/ecs.rb +2 -0
  43. data/lib/aws-sdk-core/empty_structure.rb +1 -82
  44. data/lib/aws-sdk-core/endpoint_provider.rb +1 -1
  45. data/lib/aws-sdk-core/instance_profile_credentials.rb +9 -10
  46. data/lib/aws-sdk-core/json.rb +56 -0
  47. data/lib/aws-sdk-core/json/builder.rb +33 -34
  48. data/lib/aws-sdk-core/json/error_handler.rb +2 -2
  49. data/lib/aws-sdk-core/json/handler.rb +67 -0
  50. data/lib/aws-sdk-core/json/json_engine.rb +15 -0
  51. data/lib/aws-sdk-core/json/oj_engine.rb +15 -0
  52. data/lib/aws-sdk-core/json/parser.rb +30 -38
  53. data/lib/aws-sdk-core/pageable_response.rb +9 -12
  54. data/lib/aws-sdk-core/pager.rb +69 -0
  55. data/lib/aws-sdk-core/param_converter.rb +203 -0
  56. data/lib/aws-sdk-core/param_validator.rb +148 -0
  57. data/lib/aws-sdk-core/plugins/dynamodb_simple_attributes.rb +21 -18
  58. data/lib/aws-sdk-core/plugins/glacier_account_id.rb +9 -1
  59. data/lib/aws-sdk-core/plugins/glacier_checksums.rb +2 -3
  60. data/lib/aws-sdk-core/plugins/param_converter.rb +27 -0
  61. data/lib/aws-sdk-core/plugins/param_validator.rb +28 -0
  62. data/lib/aws-sdk-core/plugins/protocols/json_rpc.rb +3 -7
  63. data/lib/aws-sdk-core/plugins/protocols/rest_json.rb +1 -2
  64. data/lib/aws-sdk-core/plugins/protocols/rest_xml.rb +1 -1
  65. data/lib/aws-sdk-core/plugins/regional_endpoint.rb +1 -1
  66. data/lib/aws-sdk-core/plugins/request_signer.rb +5 -5
  67. data/lib/aws-sdk-core/plugins/response_paging.rb +20 -11
  68. data/lib/aws-sdk-core/plugins/s3_get_bucket_location_fix.rb +1 -1
  69. data/lib/aws-sdk-core/plugins/s3_request_signer.rb +1 -2
  70. data/lib/aws-sdk-core/plugins/stub_responses.rb +25 -27
  71. data/lib/aws-sdk-core/query/ec2_param_builder.rb +29 -34
  72. data/lib/aws-sdk-core/query/handler.rb +32 -18
  73. data/lib/aws-sdk-core/query/param_builder.rb +45 -53
  74. data/lib/aws-sdk-core/refreshing_credentials.rb +3 -15
  75. data/lib/aws-sdk-core/rest/handler.rb +22 -0
  76. data/lib/aws-sdk-core/rest/request/body.rb +58 -0
  77. data/lib/aws-sdk-core/rest/request/builder.rb +50 -0
  78. data/lib/aws-sdk-core/rest/request/endpoint.rb +70 -0
  79. data/lib/aws-sdk-core/rest/request/headers.rb +48 -0
  80. data/lib/aws-sdk-core/rest/response/body.rb +43 -0
  81. data/lib/aws-sdk-core/rest/response/headers.rb +60 -0
  82. data/lib/aws-sdk-core/rest/response/parser.rb +47 -0
  83. data/lib/aws-sdk-core/rest/response/status_code.rb +24 -0
  84. data/lib/aws-sdk-core/shared_credentials.rb +11 -6
  85. data/lib/aws-sdk-core/signers/base.rb +1 -1
  86. data/lib/aws-sdk-core/signers/s3.rb +2 -3
  87. data/lib/aws-sdk-core/signers/v2.rb +7 -4
  88. data/lib/aws-sdk-core/signers/v4.rb +11 -22
  89. data/lib/aws-sdk-core/structure.rb +26 -145
  90. data/lib/aws-sdk-core/stubbing/data_applicator.rb +46 -0
  91. data/lib/aws-sdk-core/stubbing/empty_stub.rb +53 -0
  92. data/lib/aws-sdk-core/stubbing/protocols/ec2.rb +49 -0
  93. data/lib/aws-sdk-core/stubbing/protocols/json.rb +40 -0
  94. data/lib/aws-sdk-core/stubbing/protocols/query.rb +40 -0
  95. data/lib/aws-sdk-core/stubbing/protocols/rest.rb +67 -0
  96. data/lib/aws-sdk-core/stubbing/protocols/rest_json.rb +25 -0
  97. data/lib/aws-sdk-core/stubbing/protocols/rest_xml.rb +38 -0
  98. data/lib/aws-sdk-core/stubbing/stub_data.rb +34 -0
  99. data/lib/aws-sdk-core/version.rb +1 -1
  100. data/lib/aws-sdk-core/xml/builder.rb +58 -52
  101. data/lib/aws-sdk-core/xml/default_map.rb +10 -0
  102. data/lib/aws-sdk-core/xml/doc_builder.rb +86 -0
  103. data/lib/aws-sdk-core/xml/error_handler.rb +7 -2
  104. data/lib/aws-sdk-core/xml/parser.rb +4 -4
  105. data/lib/aws-sdk-core/xml/parser/frame.rb +75 -70
  106. data/lib/aws-sdk-core/xml/parser/stack.rb +4 -4
  107. data/lib/seahorse.rb +0 -11
  108. data/lib/seahorse/client/base.rb +3 -12
  109. data/lib/seahorse/client/http/request.rb +9 -5
  110. data/lib/seahorse/client/plugins/endpoint.rb +5 -56
  111. data/lib/seahorse/client/plugins/restful_bindings.rb +38 -31
  112. data/lib/seahorse/client/request_context.rb +2 -2
  113. data/lib/seahorse/client/response.rb +6 -5
  114. data/lib/seahorse/model/api.rb +18 -61
  115. data/lib/seahorse/model/operation.rb +24 -54
  116. data/lib/seahorse/model/shapes.rb +120 -364
  117. data/lib/seahorse/util.rb +2 -6
  118. metadata +56 -109
  119. data/apis/autoscaling/2011-01-01/docs-2.json +0 -1246
  120. data/apis/cloudformation/2010-05-15/docs-2.json +0 -725
  121. data/apis/cloudfront/2014-11-06/docs-2.json +0 -1125
  122. data/apis/cloudhsm/2014-05-30/docs-2.json +0 -472
  123. data/apis/cloudsearch/2013-01-01/docs-2.json +0 -865
  124. data/apis/cloudsearchdomain/2013-01-01/docs-2.json +0 -311
  125. data/apis/cloudtrail/2013-11-01/docs-2.json +0 -328
  126. data/apis/codedeploy/2014-10-06/docs-2.json +0 -1261
  127. data/apis/cognito-identity/2014-06-30/docs-2.json +0 -506
  128. data/apis/cognito-sync/2014-06-30/docs-2.json +0 -582
  129. data/apis/config/2014-10-17/docs-2.json +0 -513
  130. data/apis/config/2014-11-12/docs-2.json +0 -514
  131. data/apis/datapipeline/2012-10-29/docs-2.json +0 -607
  132. data/apis/directconnect/2012-10-25/docs-2.json +0 -494
  133. data/apis/ds/2015-04-16/docs-2.json +0 -753
  134. data/apis/dynamodb/2011-12-05/api-2.json +0 -949
  135. data/apis/dynamodb/2011-12-05/docs-2.json +0 -606
  136. data/apis/dynamodb/2011-12-05/paginators-1.json +0 -26
  137. data/apis/dynamodb/2011-12-05/waiters-2.json +0 -35
  138. data/apis/dynamodb/2012-08-10/docs-2.json +0 -977
  139. data/apis/ec2/2015-04-15/docs-2.json +0 -5368
  140. data/apis/ecs/2014-11-13/docs-2.json +0 -791
  141. data/apis/elasticache/2015-02-02/docs-2.json +0 -1390
  142. data/apis/elasticbeanstalk/2010-12-01/docs-2.json +0 -1114
  143. data/apis/elasticfilesystem/2015-02-01/docs-2.json +0 -414
  144. data/apis/elasticloadbalancing/2012-06-01/docs-2.json +0 -1078
  145. data/apis/elasticmapreduce/2009-03-31/docs-2.json +0 -969
  146. data/apis/elastictranscoder/2012-09-25/docs-2.json +0 -1152
  147. data/apis/email/2010-12-01/docs-2.json +0 -441
  148. data/apis/glacier/2012-06-01/docs-2.json +0 -575
  149. data/apis/iam/2010-05-08/docs-2.json +0 -2138
  150. data/apis/importexport/2010-06-01/docs-2.json +0 -432
  151. data/apis/kinesis/2013-12-02/docs-2.json +0 -424
  152. data/apis/kms/2014-11-01/docs-2.json +0 -628
  153. data/apis/lambda/2014-11-11/docs-2.json +0 -303
  154. data/apis/lambda/2015-03-31/docs-2.json +0 -490
  155. data/apis/logs/2014-03-28/docs-2.json +0 -599
  156. data/apis/machinelearning/2014-12-12/docs-2.json +0 -1034
  157. data/apis/monitoring/2010-08-01/docs-2.json +0 -514
  158. data/apis/opsworks/2013-02-18/docs-2.json +0 -1592
  159. data/apis/rds/2014-10-31/docs-2.json +0 -2074
  160. data/apis/redshift/2012-12-01/docs-2.json +0 -1890
  161. data/apis/route53/2013-04-01/docs-2.json +0 -1159
  162. data/apis/route53domains/2014-05-15/docs-2.json +0 -620
  163. data/apis/s3/2006-03-01/docs-2.json +0 -2213
  164. data/apis/sdb/2009-04-15/docs-2.json +0 -339
  165. data/apis/sns/2010-03-31/docs-2.json +0 -564
  166. data/apis/sqs/2012-11-05/docs-2.json +0 -503
  167. data/apis/ssm/2014-11-06/docs-2.json +0 -440
  168. data/apis/storagegateway/2013-06-30/docs-2.json +0 -1331
  169. data/apis/sts/2011-06-15/docs-2.json +0 -351
  170. data/apis/support/2013-04-15/docs-2.json +0 -680
  171. data/apis/swf/2012-01-25/docs-2.json +0 -1569
  172. data/apis/workspaces/2015-04-08/docs-2.json +0 -457
  173. data/lib/aws-sdk-core/api/customizer.rb +0 -75
  174. data/lib/aws-sdk-core/api/docstrings.rb +0 -38
  175. data/lib/aws-sdk-core/api/documenter.rb +0 -241
  176. data/lib/aws-sdk-core/api/operation_documenter.rb +0 -173
  177. data/lib/aws-sdk-core/api/operation_example.rb +0 -133
  178. data/lib/aws-sdk-core/api/service_customizations.rb +0 -140
  179. data/lib/aws-sdk-core/client_paging.rb +0 -31
  180. data/lib/aws-sdk-core/json/rest_handler.rb +0 -20
  181. data/lib/aws-sdk-core/json/rpc_body_handler.rb +0 -38
  182. data/lib/aws-sdk-core/json/rpc_headers_handler.rb +0 -34
  183. data/lib/aws-sdk-core/json/simple_body_handler.rb +0 -34
  184. data/lib/aws-sdk-core/paging/null_pager.rb +0 -20
  185. data/lib/aws-sdk-core/paging/null_provider.rb +0 -13
  186. data/lib/aws-sdk-core/paging/pager.rb +0 -70
  187. data/lib/aws-sdk-core/paging/provider.rb +0 -22
  188. data/lib/aws-sdk-core/rest_body_handler.rb +0 -111
  189. data/lib/aws-sdk-core/signers/handler.rb +0 -18
  190. data/lib/aws-sdk-core/xml/rest_handler.rb +0 -20
  191. data/lib/seahorse/client/param_converter.rb +0 -207
  192. data/lib/seahorse/client/param_validator.rb +0 -139
  193. data/lib/seahorse/client/plugins/json_simple.rb +0 -33
  194. data/lib/seahorse/client/plugins/param_conversion.rb +0 -29
  195. data/lib/seahorse/client/plugins/param_validation.rb +0 -30
  196. data/lib/seahorse/client/xml/builder.rb +0 -91
  197. data/lib/seahorse/model/shape_map.rb +0 -47
@@ -0,0 +1,220 @@
1
+ require 'erb'
2
+
3
+ module Aws
4
+ module Api
5
+ module Docs
6
+ class Builder
7
+
8
+ def self.document(svc_module)
9
+ new(svc_module).document
10
+ end
11
+
12
+ def initialize(svc_module)
13
+ @svc_module = svc_module
14
+ @svc_name = svc_module.name.split('::').last
15
+ @client_class = svc_module.const_get(:Client)
16
+ @api = @client_class.api
17
+ @full_name = @api.metadata['serviceFullName']
18
+ @error_names = @api.operations.map {|_,o| o.errors.map(&:shape).map(&:name) }
19
+ @error_names = @error_names.flatten.uniq.sort
20
+ @namespace = YARD::Registry['Aws']
21
+ end
22
+
23
+ def document
24
+ document_service
25
+ document_types
26
+ document_client
27
+ document_errors
28
+ end
29
+
30
+ private
31
+
32
+ def document_service
33
+ yard_mod = YARD::CodeObjects::ModuleObject.new(@namespace, @svc_name)
34
+ yard_mod.docstring = service_docstring
35
+ yard_mod.docstring.add_tag(YARD::Tags::Tag.new(:service, @svc_name))
36
+ @namespace = yard_mod
37
+ end
38
+
39
+ def service_docstring
40
+ path = "doc-src/services/#{@svc_name}/service.md"
41
+ path = 'doc-src/services/default/service.md' unless File.exists?(path)
42
+ template = read(path)
43
+ svc_name = @svc_name
44
+ api = @api
45
+ full_name = @full_name
46
+ ERB.new(template).result(binding)
47
+ end
48
+
49
+ def document_errors
50
+ yard_mod = YARD::CodeObjects::ModuleObject.new(@namespace, 'Errors')
51
+ yard_mod.docstring = errors_docstring
52
+
53
+ base_error = YARD::CodeObjects::ClassObject.new(yard_mod, 'ServiceError')
54
+ base_error.docstring = "Base class for all Aws::#{@svc_name} errors."
55
+ base_error.superclass = YARD::Registry['Aws::Errors::ServiceError']
56
+
57
+ @error_names.each do |error_name|
58
+ error_klass = YARD::CodeObjects::ClassObject.new(yard_mod, error_name)
59
+ error_klass.superclass = base_error
60
+ end
61
+ end
62
+
63
+ def errors_docstring
64
+ path = "doc-src/services/#{@svc_name}/errors.md"
65
+ path = 'doc-src/services/default/errors.md' unless File.exists?(path)
66
+ template = read(path)
67
+ svc_name = @svc_name
68
+ api = @api
69
+ full_name = @full_name
70
+ known_errors = @error_names
71
+ ERB.new(template).result(binding)
72
+ end
73
+
74
+ def document_client
75
+ yard_class = YARD::CodeObjects::ClassObject.new(@namespace, 'Client')
76
+ yard_class.superclass = YARD::Registry['Seahorse::Client::Base']
77
+ yard_class.docstring = client_docstring
78
+ document_client_constructor(yard_class)
79
+ document_client_operations(yard_class)
80
+ document_client_waiters(yard_class)
81
+ end
82
+
83
+ def document_types
84
+ namespace = YARD::CodeObjects::ModuleObject.new(@namespace, 'Types')
85
+ documenter = ClientTypeDocumenter.new(namespace)
86
+ @api.metadata['shapes'].each_structure do |shape|
87
+ documenter.document(@api, shape)
88
+ end
89
+ end
90
+
91
+ def client_docstring
92
+ path = "doc-src/services/#{@svc_name}/client.md"
93
+ path = 'doc-src/services/default/client.md' unless File.exists?(path)
94
+ render(path)
95
+ end
96
+
97
+ def render(path)
98
+ svc_name = @svc_name
99
+ api = @api
100
+ full_name = @full_name
101
+ ERB.new(File.read(path)).result(binding)
102
+ end
103
+
104
+ def document_client_constructor(namespace)
105
+ constructor = YARD::CodeObjects::MethodObject.new(namespace, :initialize)
106
+ constructor.group = 'Constructor'
107
+ constructor.scope = :instance
108
+ constructor.parameters << ['options', '{}']
109
+ constructor.docstring = client_constructor_docstring
110
+ end
111
+
112
+ def client_constructor_docstring
113
+ <<-DOCS.strip
114
+ Constructs an API client.
115
+ #{client_constructor_options}
116
+ @return [#{@client_class.name}] Returns an API client.
117
+ DOCS
118
+ end
119
+
120
+ def client_constructor_options
121
+ options = {}
122
+ @client_class.plugins.each do |plugin|
123
+ if p = YARD::Registry[plugin.name]
124
+ p.tags.each do |tag|
125
+ if tag.tag_name == 'seahorse_client_option'
126
+ option_name = tag.text.match(/.+(:\w+)/)[1]
127
+ option_text = "@option options " + tag.text.split("\n").join("\n ")
128
+ options[option_name] = option_text +
129
+ " See {#{plugin.name}} for more details."
130
+ end
131
+ end
132
+ end
133
+ end
134
+ options.sort_by { |k,v| k }.map(&:last).join("\n")
135
+ end
136
+
137
+ def document_client_operations(namespace)
138
+ @api.operations.each do |method_name, operation|
139
+ document_client_operation(namespace, method_name, operation)
140
+ end
141
+ end
142
+
143
+ def document_client_operation(namespace, method_name, operation)
144
+ documenter = OperationDocumenter.new(@svc_name, namespace)
145
+ documenter.document(method_name, operation)
146
+ end
147
+
148
+ def document_client_waiters(yard_class)
149
+ m = YARD::CodeObjects::MethodObject.new(yard_class, :wait_until)
150
+ m.scope = :instance
151
+ m.parameters << ['waiter_name', nil]
152
+ m.parameters << ['params', '{}']
153
+ m.docstring = YARD::Registry['Aws::ClientWaiters#wait_until'].docstring
154
+
155
+ waiters = @client_class.waiters.waiter_names.sort.inject('') do |w,name|
156
+ waiter = @client_class.waiters.waiter(name)
157
+ operation = waiter.poller.operation_name
158
+ w << "<tr><td><tt>:#{name}</tt></td><td>{##{operation}}</td><td>#{waiter.delay}</td><td>#{waiter.max_attempts}</td></tr>"
159
+ end
160
+ docstring = <<-DOCSTRING
161
+ Returns the list of supported waiters. The following table lists the supported
162
+ waiters and the client method they call:
163
+ <table>
164
+ <thead>
165
+ <tr><th>Waiter Name</th><th>Client Method</th><th>Delay</th><th>Max Attempts</th></tr>
166
+ </thead>
167
+ <tbody>
168
+ #{waiters}
169
+ </tbody>
170
+ </table>
171
+ @return [Array<Symbol>] the list of supported waiters.
172
+ DOCSTRING
173
+ m = YARD::CodeObjects::MethodObject.new(yard_class, :waiter_names)
174
+ m.scope = :instance
175
+ m.docstring = docstring
176
+ end
177
+
178
+ class Tabulator
179
+
180
+ def initialize
181
+ @tabs = []
182
+ @tab_contents = []
183
+ end
184
+
185
+ def tab(method_name, tab_name, &block)
186
+ tab_class = tab_name.downcase.gsub(/[^a-z]+/i, '-')
187
+ tab_id = "#{method_name.to_s.gsub(/_/, '-')}-#{tab_class}"
188
+ class_names = ['tab-contents', tab_class]
189
+ @tabs << [tab_id, tab_name]
190
+ @tab_contents << "<div class=\"#{class_names.join(' ')}\" id=\"#{tab_id}\">"
191
+ @tab_contents << yield
192
+ @tab_contents << '</div>'
193
+ end
194
+
195
+ def to_html
196
+ lines = []
197
+ lines << '<div class="tab-box">'
198
+ lines << '<ul class="tabs">'
199
+ @tabs.each do |tab_id, tab_name|
200
+ lines << "<li data-tab-id=\"#{tab_id}\">#{tab_name}</li>"
201
+ end
202
+ lines << '</ul>'
203
+ lines.concat(@tab_contents)
204
+ lines << '</div>'
205
+ lines.join
206
+ end
207
+ alias inspect to_html
208
+ alias to_str to_html
209
+ alias to_s to_html
210
+
211
+ end
212
+
213
+ def read(path)
214
+ File.open(path, 'r', encoding: 'UTF-8') { |f| f.read }
215
+ end
216
+
217
+ end
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,109 @@
1
+ module Aws
2
+ module Api
3
+ module Docs
4
+ class ClientTypeDocumenter
5
+
6
+ include Utils
7
+ include Seahorse::Model
8
+ include Seahorse::Model::Shapes
9
+
10
+ # @param [Yard::CodeObjects::Base] namespace
11
+ def initialize(namespace)
12
+ @namespace = namespace
13
+ end
14
+
15
+ # @param [Seahorse::Model::Api] api
16
+ # @param [Seahorse::Model::Shapes::StructureShape] shape
17
+ def document(api, shape)
18
+ yard_class = YARD::CodeObjects::ClassObject.new(@namespace, shape.name)
19
+ yard_class.superclass = 'Struct'
20
+ yard_class.docstring = docstring(api, shape)
21
+ tags(api, shape).each do |tag|
22
+ yard_class.add_tag(tag)
23
+ end
24
+ shape.members.each do |member_name, ref|
25
+ document_struct_member(yard_class, member_name, ref)
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def docstring(api, shape)
32
+ docs = shape.documentation || ''
33
+ methods = returned_by(api, shape)
34
+ unless methods.empty?
35
+ docs += "<p>Returned by:</p>"
36
+ docs += "<ul>"
37
+ docs += methods.map{|m| "<li>{#{m}}</li>" }.join
38
+ docs += "</ul>"
39
+ end
40
+ docs
41
+ end
42
+
43
+ def tags(api, shape)
44
+ tags = []
45
+ tags << input_example_tag(api, shape) if input_shape?(api, shape)
46
+ tags
47
+ end
48
+
49
+ # Returns `true` if the given shape is ever used as input in the api.
50
+ def input_shape?(haystack, needle, stack = [])
51
+ if stack.include?(haystack)
52
+ return false
53
+ else
54
+ stack += [haystack]
55
+ end
56
+ case haystack
57
+ when needle
58
+ return true
59
+ when Seahorse::Model::Api
60
+ haystack.operations.each do |_, operation|
61
+ if operation.input && input_shape?(operation.input.shape, needle, stack)
62
+ return true
63
+ end
64
+ end
65
+ when StructureShape
66
+ haystack.members.each do |_, member_ref|
67
+ if input_shape?(member_ref.shape, needle, stack)
68
+ return true
69
+ end
70
+ end
71
+ when ListShape
72
+ return input_shape?(haystack.member.shape, needle, stack)
73
+ when MapShape
74
+ return input_shape?(haystack.value.shape, needle, stack)
75
+ end
76
+ false
77
+ end
78
+
79
+ def input_example_tag(api, shape)
80
+ params = ParamFormatter.new(ShapeRef.new(shape: shape))
81
+ note = "@note When passing #{shape.name} as input to an #{Client} "
82
+ note << "method, you can use a\n vanilla Hash:\n\n "
83
+ note << params.format.lines.join(" ")
84
+ tag(note)
85
+ end
86
+
87
+ def returned_by(api, shape)
88
+ methods = []
89
+
90
+ api.metadata['shapes'].each_structure do |struct|
91
+ struct.members.each do |member_name, member_ref|
92
+ if member_ref.shape == shape
93
+ methods << "Types::#{struct.name}##{member_name}"
94
+ end
95
+ end
96
+ end
97
+
98
+ api.operations.each do |operation_name, operation|
99
+ if operation.output && operation.output.shape == shape
100
+ methods << "Client##{operation_name}"
101
+ end
102
+ end
103
+ methods
104
+ end
105
+
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,66 @@
1
+ module Aws
2
+ module Api
3
+ module Docs
4
+ class DocstringProvider
5
+
6
+ def initialize(docstrings)
7
+ @docstrings = docstrings
8
+ end
9
+
10
+ # @param [String] operation_name
11
+ # @return [String,nil]
12
+ def operation_docs(operation_name)
13
+ clean(@docstrings['operations'][operation_name])
14
+ end
15
+
16
+ # @param [String] shape_name
17
+ # @return [String,nil]
18
+ def shape_docs(shape_name)
19
+ clean(shape(shape_name)['base'])
20
+ end
21
+
22
+ # @param [String] shape_name
23
+ # @param [String] target
24
+ # @return [String,nil]
25
+ def shape_ref_docs(shape_name, target)
26
+ if ref_docs = shape(shape_name)['refs'][target]
27
+ clean(ref_docs)
28
+ else
29
+ shape_docs(shape_name)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def shape(name)
36
+ @docstrings['shapes'][name] || { 'base' => nil, 'refs' => {} }
37
+ end
38
+
39
+ def clean(value)
40
+ if value.nil?
41
+ ''
42
+ else
43
+ value.gsub(/\{(\S+)\}/, '`{\1}`').strip
44
+ end
45
+ end
46
+
47
+ end
48
+
49
+ class NullDocstringProvider
50
+
51
+ def operation_docs(operation_name)
52
+ nil
53
+ end
54
+
55
+ def shape_docs(shape_name)
56
+ nil
57
+ end
58
+
59
+ def shape_ref_docs(shape_name, target)
60
+ nil
61
+ end
62
+
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,107 @@
1
+ module Aws
2
+ module Api
3
+ module Docs
4
+ class OperationDocumenter
5
+
6
+ include Seahorse::Model
7
+ include Utils
8
+
9
+ def initialize(service_name, namespace)
10
+ @service_name = service_name
11
+ @namespace = namespace
12
+ @optname = 'options'
13
+ end
14
+
15
+ # @param [Symbol] method_name
16
+ # @param [Seahorse::Model::Opeation] operation
17
+ def document(method_name, operation)
18
+ m = YARD::CodeObjects::MethodObject.new(@namespace, method_name)
19
+ m.group = 'API Operations'
20
+ m.scope = :instance
21
+ m.parameters << [@optname, '{}']
22
+ m.docstring = operation.documentation
23
+ tags(method_name, operation).each do |tag|
24
+ m.add_tag(tag)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def tags(method_name, operation)
31
+ tags = []
32
+ tags += param_tags(method_name, operation)
33
+ tags += option_tags(method_name, operation)
34
+ tags += return_tags(method_name, operation)
35
+ tags += example_tags(method_name, operation)
36
+ tags += see_also_tags(method_name, operation)
37
+ end
38
+
39
+ def param_tags(method_name, operation)
40
+ []
41
+ end
42
+
43
+ def option_tags(method_name, operation)
44
+ operation_input_ref(operation).shape.members.map do |name, ref|
45
+ req = ref.required ? 'required,' : ''
46
+ type = input_type(ref)
47
+ tag("@option #{@optname} [#{req}#{type}] :#{name} #{ref.documentation}")
48
+ end
49
+ end
50
+
51
+ def return_tags(method_name, operation)
52
+ resp = '{Seahorse::Client::Response response}'
53
+ if operation.output && operation.output.shape.members.count > 0
54
+ rtype = output_type(operation.output)
55
+ returns = "[#{rtype}] Returns a #{resp} object which responds to "
56
+ returns << "the following methods:\n\n"
57
+ operation.output.shape.members.each do |mname, mref|
58
+ returns << " * {#{rtype}##{mname} ##{mname}} => #{output_type(mref, true)}\n"
59
+ end
60
+ else
61
+ returns = "[Struct] Returns an empty #{resp}."
62
+ end
63
+ [tag("@return #{returns}")]
64
+ end
65
+
66
+ def example_tags(method_name, operation)
67
+ examples_from_disk(method_name, operation) + [
68
+ request_syntax_example(method_name, operation),
69
+ response_structure_example(method_name, operation),
70
+ ].compact
71
+ end
72
+
73
+ def examples_from_disk(method_name, operation)
74
+ dir = "examples/#{@service_name.downcase}/client/#{method_name}/*.md"
75
+ Dir.glob(dir).map do |path|
76
+ title = File.basename(path).split(/\./).first
77
+ title = title.sub(/^\d+_/, '').gsub(/_/, ' ')
78
+ title = title[0].upcase + title[1..-1]
79
+ tag("@example #{title}\n\n " + File.read(path).lines.join(' '))
80
+ end
81
+ end
82
+
83
+ def request_syntax_example(method_name, operation)
84
+ example = RequestSyntaxExample.new(method_name, operation).to_str
85
+ parts = []
86
+ parts << "@example Request syntax with placeholder values\n\n"
87
+ parts += example.lines.map { |line| " " + line }
88
+ tag(parts.join)
89
+ end
90
+
91
+ def response_structure_example(method_name, operation)
92
+ if example = ResponseStructureExample.new(method_name, operation).to_str
93
+ parts = []
94
+ parts << "@example Response structure\n\n"
95
+ parts += example.lines.map { |line| " " + line }
96
+ tag(parts.join)
97
+ end
98
+ end
99
+
100
+ def see_also_tags(method_name, operation)
101
+ []
102
+ end
103
+
104
+ end
105
+ end
106
+ end
107
+ end