useless-doc 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +18 -0
- data/.rbenv-version +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +3 -0
- data/Rakefile +1 -0
- data/config.ru +4 -0
- data/lib/useless/doc/action.rb +50 -0
- data/lib/useless/doc/body.rb +58 -0
- data/lib/useless/doc/dsl.rb +208 -0
- data/lib/useless/doc/header.rb +24 -0
- data/lib/useless/doc/rack/application.rb +31 -0
- data/lib/useless/doc/rack/proxy.rb +58 -0
- data/lib/useless/doc/rack/stylesheet.rb +24 -0
- data/lib/useless/doc/rack/transform.rb +35 -0
- data/lib/useless/doc/rack/ui.rb +35 -0
- data/lib/useless/doc/request/parameter.rb +47 -0
- data/lib/useless/doc/request.rb +29 -0
- data/lib/useless/doc/resource.rb +29 -0
- data/lib/useless/doc/response/status.rb +27 -0
- data/lib/useless/doc/response.rb +29 -0
- data/lib/useless/doc/serialization/dump.rb +122 -0
- data/lib/useless/doc/serialization/load.rb +171 -0
- data/lib/useless/doc/sinatra.rb +48 -0
- data/lib/useless/doc/ui/godel/stylesheet.css +1 -0
- data/lib/useless/doc/ui/godel/template.mustache +199 -0
- data/lib/useless/doc/ui/godel.rb +92 -0
- data/lib/useless/doc/ui.rb +37 -0
- data/lib/useless/doc/version.rb +5 -0
- data/lib/useless/doc.rb +4 -0
- data/spec/documents/twonk.json +106 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/useless/doc/dsl_spec.rb +71 -0
- data/spec/useless/doc/proxy_spec.rb +48 -0
- data/spec/useless/doc/serialization/dump_spec.rb +116 -0
- data/spec/useless/doc/serialization/load_spec.rb +99 -0
- data/spec/useless/doc/sinatra_spec.rb +64 -0
- data/useless-doc.gemspec +26 -0
- metadata +217 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
module Useless
|
2
|
+
module Doc
|
3
|
+
|
4
|
+
# Documentation for an API resource.
|
5
|
+
#
|
6
|
+
# @!attribute [r] path
|
7
|
+
# @return [String] the path segment of the resource URL.
|
8
|
+
#
|
9
|
+
# @!attribute [r] description
|
10
|
+
# @return [String] a description of the resource.
|
11
|
+
#
|
12
|
+
# @!attribute [r] actions
|
13
|
+
# @return [Array<Action>] documentation for the available actions for the
|
14
|
+
# resource.
|
15
|
+
#
|
16
|
+
class Resource
|
17
|
+
|
18
|
+
attr_reader :path, :description, :actions
|
19
|
+
|
20
|
+
# @param [Hash] attrs corresponds to the class's instance attributes.
|
21
|
+
#
|
22
|
+
def initialize(attrs = {})
|
23
|
+
@path = attrs[:path]
|
24
|
+
@description = attrs[:description]
|
25
|
+
@actions = attrs[:actions]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Useless
|
2
|
+
module Doc
|
3
|
+
class Response
|
4
|
+
|
5
|
+
# Documentation for a response status for an API action.
|
6
|
+
#
|
7
|
+
# @!attribute [r] code
|
8
|
+
# @return [Integer] the HTTP status code of the response.
|
9
|
+
#
|
10
|
+
# @!attribute [r] description
|
11
|
+
# @return [String] a description of the rationale for
|
12
|
+
# the response.
|
13
|
+
#
|
14
|
+
class Status
|
15
|
+
|
16
|
+
attr_reader :code, :description
|
17
|
+
|
18
|
+
# @param [Hash] attrs corresponds to the class's instance attributes.
|
19
|
+
#
|
20
|
+
def initialize(attrs = {})
|
21
|
+
@code = attrs[:code]
|
22
|
+
@description = attrs[:description]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Useless
|
2
|
+
module Doc
|
3
|
+
|
4
|
+
# Documentation for an HTTP response.
|
5
|
+
#
|
6
|
+
# @!attribute [r] statuses
|
7
|
+
# @return [Array<Response::Status] documentation for the possible
|
8
|
+
# statuses of the response.
|
9
|
+
#
|
10
|
+
# @!attribute [r] headers
|
11
|
+
# @return [Array<Header>] documentation for the headers of the
|
12
|
+
# response.
|
13
|
+
#
|
14
|
+
# @!attribute [r] body
|
15
|
+
# @return [Body] documentation for the body of the response.
|
16
|
+
#
|
17
|
+
class Response
|
18
|
+
attr_accessor :statuses, :headers, :body
|
19
|
+
|
20
|
+
# @param [Hash] attrs corresponds to the class's instance attributes.
|
21
|
+
#
|
22
|
+
def initialize(attrs = {})
|
23
|
+
@statuses = attrs[:statuses]
|
24
|
+
@headers = attrs[:headers]
|
25
|
+
@body = attrs[:body]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'oj'
|
2
|
+
|
3
|
+
module Useless
|
4
|
+
module Doc
|
5
|
+
module Serialization
|
6
|
+
module Dump
|
7
|
+
|
8
|
+
# Converts a hash to a JSON representation.
|
9
|
+
#
|
10
|
+
# @param [Hash, String] hash the hash to be converted.
|
11
|
+
#
|
12
|
+
# @raise [ArgumentError] if json is not a Hash, String or IO.
|
13
|
+
#
|
14
|
+
# @return [String] a JSON representation corresponding to the
|
15
|
+
# specified hash.
|
16
|
+
#
|
17
|
+
def self.hash_to_json(hash)
|
18
|
+
hash.is_a?(String) ? hash : Oj.dump(hash)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Converts +Doc::Resource+ instance to a JSON representation.
|
22
|
+
#
|
23
|
+
# @param [Doc::Resource] resource the resource to be converted to JSON.
|
24
|
+
#
|
25
|
+
# @return [String] a JSON representation of the specified resource.
|
26
|
+
#
|
27
|
+
def self.resource(resource)
|
28
|
+
if resource
|
29
|
+
hash_to_json \
|
30
|
+
'path' => resource.path,
|
31
|
+
'description' => resource.description,
|
32
|
+
'actions' => resource.actions.map { |action| action(action) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# @api private
|
37
|
+
def self.action(action)
|
38
|
+
if action
|
39
|
+
hash_to_json \
|
40
|
+
'description' => action.description,
|
41
|
+
'method' => action.method,
|
42
|
+
'authentication_required' => action.authentication_required,
|
43
|
+
'request' => request(action.request),
|
44
|
+
'response' => response(action.response)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# @api private
|
49
|
+
def self.request(request)
|
50
|
+
if request
|
51
|
+
hash_to_json \
|
52
|
+
'parameters' => request.parameters.map { |parameter| request_parameter(parameter) },
|
53
|
+
'headers' => request.headers.map { |header| header(header) },
|
54
|
+
'body' => body(request.body)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# @api private
|
59
|
+
def self.response(response)
|
60
|
+
if response
|
61
|
+
hash_to_json \
|
62
|
+
'statuses' => response.statuses.map { |status| response_status(status) },
|
63
|
+
'headers' => response.headers.map { |header| header(header) },
|
64
|
+
'body' => body(response.body)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# @api private
|
69
|
+
def self.request_parameter(parameter)
|
70
|
+
if parameter
|
71
|
+
hash_to_json \
|
72
|
+
'type' => parameter.type,
|
73
|
+
'key' => parameter.key,
|
74
|
+
'required' => parameter.required,
|
75
|
+
'default' => parameter.default,
|
76
|
+
'description' => parameter.description
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# @api private
|
81
|
+
def self.header(header)
|
82
|
+
if header
|
83
|
+
hash_to_json \
|
84
|
+
'key' => header.key,
|
85
|
+
'description' => header.description
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# @api private
|
90
|
+
def self.response_status(status)
|
91
|
+
if status
|
92
|
+
hash_to_json \
|
93
|
+
'code' => status.code,
|
94
|
+
'description' => status.description
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# @api private
|
99
|
+
def self.body(body)
|
100
|
+
if body
|
101
|
+
hash_to_json \
|
102
|
+
'content_type' => body.content_type,
|
103
|
+
'attributes' => body.attributes.map { |attribute| body_attribute(attribute) }
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
# @api private
|
108
|
+
def self.body_attribute(attribute)
|
109
|
+
if attribute
|
110
|
+
hash_to_json \
|
111
|
+
'key' => attribute.key,
|
112
|
+
'type' => attribute.type,
|
113
|
+
'required' => attribute.required,
|
114
|
+
'default' => attribute.default,
|
115
|
+
'description' => attribute.description
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
require 'oj'
|
2
|
+
|
3
|
+
require 'useless/doc/action'
|
4
|
+
require 'useless/doc/body'
|
5
|
+
require 'useless/doc/header'
|
6
|
+
require 'useless/doc/request'
|
7
|
+
require 'useless/doc/request/parameter'
|
8
|
+
require 'useless/doc/resource'
|
9
|
+
require 'useless/doc/response'
|
10
|
+
require 'useless/doc/response/status'
|
11
|
+
|
12
|
+
module Useless
|
13
|
+
module Doc
|
14
|
+
module Serialization
|
15
|
+
module Load
|
16
|
+
|
17
|
+
# Converts a JSON representation to a hash.
|
18
|
+
#
|
19
|
+
# @param [String, Hash] json the JSON representation to be converted.
|
20
|
+
#
|
21
|
+
# @raise [ArgumentError] if json is not a Hash, String or IO.
|
22
|
+
#
|
23
|
+
# @return [Hash] a hash corresponding to the specified JSON representation.
|
24
|
+
#
|
25
|
+
def self.json_to_hash(json)
|
26
|
+
json.is_a?(Hash) ? json : Oj.load(json)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Converts a JSON represntation to an instance of +Doc::Resource+
|
30
|
+
#
|
31
|
+
# @param [String, Hash] json the JSON representation to be converted to
|
32
|
+
# a resource.
|
33
|
+
#
|
34
|
+
# @return [Doc::Resource] the resource corresponding to the specified
|
35
|
+
# JSON.
|
36
|
+
#
|
37
|
+
def self.resource(json)
|
38
|
+
hash = json_to_hash json
|
39
|
+
|
40
|
+
actions = (hash['actions'] || []).map do |json|
|
41
|
+
action(json)
|
42
|
+
end
|
43
|
+
|
44
|
+
Useless::Doc::Resource.new \
|
45
|
+
path: hash['path'],
|
46
|
+
description: hash['description'],
|
47
|
+
actions: actions
|
48
|
+
end
|
49
|
+
|
50
|
+
# @api private
|
51
|
+
def self.action(json)
|
52
|
+
hash = json_to_hash json
|
53
|
+
|
54
|
+
if hash['request']
|
55
|
+
request = request hash['request']
|
56
|
+
end
|
57
|
+
|
58
|
+
if hash['response']
|
59
|
+
response = response hash['response']
|
60
|
+
end
|
61
|
+
|
62
|
+
Useless::Doc::Action.new \
|
63
|
+
description: hash['description'],
|
64
|
+
method: hash['method'],
|
65
|
+
authentication_required: hash['authentication_required'],
|
66
|
+
request: request,
|
67
|
+
response: response
|
68
|
+
end
|
69
|
+
|
70
|
+
# @api private
|
71
|
+
def self.request(json)
|
72
|
+
hash = json_to_hash json
|
73
|
+
|
74
|
+
parameters = (hash['parameters'] || []).map do |json|
|
75
|
+
request_parameter json
|
76
|
+
end
|
77
|
+
|
78
|
+
headers = (hash['headers'] || []).map do |json|
|
79
|
+
header json
|
80
|
+
end
|
81
|
+
|
82
|
+
if hash['body']
|
83
|
+
body = body hash['body']
|
84
|
+
end
|
85
|
+
|
86
|
+
Useless::Doc::Request.new \
|
87
|
+
parameters: parameters,
|
88
|
+
headers: headers,
|
89
|
+
body: body
|
90
|
+
end
|
91
|
+
|
92
|
+
# @api private
|
93
|
+
def self.response(json)
|
94
|
+
hash = json_to_hash json
|
95
|
+
|
96
|
+
statuses = (hash['statuses'] || []).map do |json|
|
97
|
+
response_statuses json
|
98
|
+
end
|
99
|
+
|
100
|
+
headers = (hash['headers'] || []).map do |json|
|
101
|
+
header json
|
102
|
+
end
|
103
|
+
|
104
|
+
if hash['body']
|
105
|
+
body = body hash['body']
|
106
|
+
end
|
107
|
+
|
108
|
+
Useless::Doc::Response.new \
|
109
|
+
statuses: statuses,
|
110
|
+
headers: headers,
|
111
|
+
body: body
|
112
|
+
end
|
113
|
+
|
114
|
+
# @api private
|
115
|
+
def self.request_parameter(json)
|
116
|
+
hash = json_to_hash json
|
117
|
+
|
118
|
+
Useless::Doc::Request::Parameter.new \
|
119
|
+
type: hash['type'],
|
120
|
+
key: hash['key'],
|
121
|
+
required: hash['required'],
|
122
|
+
default: hash['default'],
|
123
|
+
description: hash['description']
|
124
|
+
end
|
125
|
+
|
126
|
+
# @api private
|
127
|
+
def self.header(json)
|
128
|
+
hash = json_to_hash json
|
129
|
+
|
130
|
+
Useless::Doc::Header.new \
|
131
|
+
key: hash['key'],
|
132
|
+
description: hash['description']
|
133
|
+
end
|
134
|
+
|
135
|
+
# @api private
|
136
|
+
def self.body(json)
|
137
|
+
hash = json_to_hash json
|
138
|
+
|
139
|
+
attributes = (hash['attributes'] || []).map do |json|
|
140
|
+
body_attribute json
|
141
|
+
end
|
142
|
+
|
143
|
+
Useless::Doc::Body.new \
|
144
|
+
content_type: hash['content_type'],
|
145
|
+
attributes: attributes
|
146
|
+
end
|
147
|
+
|
148
|
+
# @api private
|
149
|
+
def self.body_attribute(json)
|
150
|
+
hash = json_to_hash json
|
151
|
+
|
152
|
+
Useless::Doc::Body::Attribute.new \
|
153
|
+
key: hash['key'],
|
154
|
+
type: hash['type'],
|
155
|
+
required: hash['required'],
|
156
|
+
default: hash['default'],
|
157
|
+
description: hash['description']
|
158
|
+
end
|
159
|
+
|
160
|
+
# @api private
|
161
|
+
def self.response_statuses(json)
|
162
|
+
hash = json_to_hash json
|
163
|
+
|
164
|
+
Useless::Doc::Response::Status.new \
|
165
|
+
code: hash['code'],
|
166
|
+
description: hash['description']
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'sinatra'
|
2
|
+
|
3
|
+
require 'useless/doc/dsl'
|
4
|
+
require 'useless/doc/serialization/dump'
|
5
|
+
|
6
|
+
module Useless
|
7
|
+
module Doc
|
8
|
+
module Sinatra
|
9
|
+
|
10
|
+
# Provides access to the +Doc::DSL+. The JSON of the resource that is
|
11
|
+
# created will then be served via an OPTIONS request to the specified
|
12
|
+
# +path+.
|
13
|
+
#
|
14
|
+
# @param [String] path the path of the resource to be documented.
|
15
|
+
#
|
16
|
+
# @param block is passed to the DSL to build the resource.
|
17
|
+
#
|
18
|
+
# @example
|
19
|
+
# class ResourceApp < Sinatra::Base
|
20
|
+
# register Useless::Doc::Sinatra
|
21
|
+
#
|
22
|
+
# doc '/some-resources' do
|
23
|
+
# get 'Get all of these resources' do
|
24
|
+
# request do
|
25
|
+
# parameter 'page', 'The page of resources to return.'
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# response do
|
29
|
+
# body do
|
30
|
+
# attribute 'name', 'The name of the resource.'
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
# end
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
def doc(path, &block)
|
38
|
+
resource = Useless::Doc::DSL::Resource.build path: path, &block
|
39
|
+
|
40
|
+
options(path) do
|
41
|
+
Doc::Serialization::Dump.resource(resource)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
Sinatra.register Useless::Doc::Sinatra
|
@@ -0,0 +1 @@
|
|
1
|
+
body { color: #333; }
|
@@ -0,0 +1,199 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>{{path}} | doc.useless.io</title>
|
5
|
+
<link href="/doc.css" media="screen" rel="stylesheet" type="text/css" />
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
|
9
|
+
<h1>{{path}}</h1>
|
10
|
+
|
11
|
+
<p>{{description}}</p>
|
12
|
+
|
13
|
+
{{#actions}}
|
14
|
+
<section>
|
15
|
+
<h2>{{method}}</h2>
|
16
|
+
|
17
|
+
<p>{{description}}</p>
|
18
|
+
|
19
|
+
<ul>
|
20
|
+
<li>{{authentication_requirement}}</li>
|
21
|
+
</ul>
|
22
|
+
|
23
|
+
{{#request}}
|
24
|
+
<section>
|
25
|
+
<h3>Request</h3>
|
26
|
+
|
27
|
+
{{#parameters?}}
|
28
|
+
<section>
|
29
|
+
<h4>Parameters</h4>
|
30
|
+
<table>
|
31
|
+
<th>
|
32
|
+
<tr>
|
33
|
+
<td>Name</td>
|
34
|
+
<td>Type</td>
|
35
|
+
<td>Required</td>
|
36
|
+
<td>Default</td>
|
37
|
+
<td>Description</td>
|
38
|
+
<tr>
|
39
|
+
</th>
|
40
|
+
<tbody>
|
41
|
+
{{#parameters}}
|
42
|
+
<tr>
|
43
|
+
<td>{{key}}</td>
|
44
|
+
<td>{{type}}</td>
|
45
|
+
<td>{{required}}</td>
|
46
|
+
<td>{{default}}</td>
|
47
|
+
<td>{{description}}</td>
|
48
|
+
</tr>
|
49
|
+
{{/parameters}}
|
50
|
+
</tbody>
|
51
|
+
</table>
|
52
|
+
</section>
|
53
|
+
{{/parameters?}}
|
54
|
+
|
55
|
+
{{#headers?}}
|
56
|
+
<section>
|
57
|
+
<h4>Headers</h4>
|
58
|
+
<table>
|
59
|
+
<th>
|
60
|
+
<tr>
|
61
|
+
<td>Name</td>
|
62
|
+
<td>Description</td>
|
63
|
+
<tr>
|
64
|
+
</th>
|
65
|
+
<tbody>
|
66
|
+
{{#headers}}
|
67
|
+
<tr>
|
68
|
+
<td>{{key}}</td>
|
69
|
+
<td>{{description}}</td>
|
70
|
+
</tr>
|
71
|
+
{{/headers}}
|
72
|
+
</tbody>
|
73
|
+
</table>
|
74
|
+
</section>
|
75
|
+
{{/headers?}}
|
76
|
+
|
77
|
+
{{#body}}
|
78
|
+
<section>
|
79
|
+
<h4>Body</h4>
|
80
|
+
|
81
|
+
<ul>
|
82
|
+
<li>{{content_type}}</li>
|
83
|
+
</ul>
|
84
|
+
|
85
|
+
<table>
|
86
|
+
<th>
|
87
|
+
<tr>
|
88
|
+
<td>Name</td>
|
89
|
+
<td>Type</td>
|
90
|
+
<td>Required</td>
|
91
|
+
<td>Default</td>
|
92
|
+
<td>Description</td>
|
93
|
+
<tr>
|
94
|
+
</th>
|
95
|
+
<tbody>
|
96
|
+
{{#attributes}}
|
97
|
+
<tr>
|
98
|
+
<td>{{key}}</td>
|
99
|
+
<td>{{type}}</td>
|
100
|
+
<td>{{required}}</td>
|
101
|
+
<td>{{default}}</td>
|
102
|
+
<td>{{description}}</td>
|
103
|
+
</tr>
|
104
|
+
{{/attributes}}
|
105
|
+
</tbody>
|
106
|
+
</table>
|
107
|
+
</section>
|
108
|
+
{{/body}}
|
109
|
+
|
110
|
+
</section>
|
111
|
+
{{/request}}
|
112
|
+
|
113
|
+
{{#response}}
|
114
|
+
<section>
|
115
|
+
<h3>Response</h3>
|
116
|
+
|
117
|
+
{{#statuses?}}
|
118
|
+
<section>
|
119
|
+
<h4>Statuses</h4>
|
120
|
+
<table>
|
121
|
+
<th>
|
122
|
+
<tr>
|
123
|
+
<td>Code</td>
|
124
|
+
<td>Description</td>
|
125
|
+
<tr>
|
126
|
+
</th>
|
127
|
+
<tbody>
|
128
|
+
{{#statuses}}
|
129
|
+
<tr>
|
130
|
+
<td>{{code}}</td>
|
131
|
+
<td>{{description}}</td>
|
132
|
+
</tr>
|
133
|
+
{{/statuses}}
|
134
|
+
</tbody>
|
135
|
+
</table>
|
136
|
+
</section>
|
137
|
+
{{/statuses?}}
|
138
|
+
|
139
|
+
{{#headers?}}
|
140
|
+
<section>
|
141
|
+
<h4>Headers</h4>
|
142
|
+
<table>
|
143
|
+
<th>
|
144
|
+
<tr>
|
145
|
+
<td>Name</td>
|
146
|
+
<td>Description</td>
|
147
|
+
<tr>
|
148
|
+
</th>
|
149
|
+
<tbody>
|
150
|
+
{{#headers}}
|
151
|
+
<tr>
|
152
|
+
<td>{{key}}</td>
|
153
|
+
<td>{{description}}</td>
|
154
|
+
</tr>
|
155
|
+
{{/headers}}
|
156
|
+
</tbody>
|
157
|
+
</table>
|
158
|
+
</section>
|
159
|
+
{{/headers?}}
|
160
|
+
|
161
|
+
{{#body}}
|
162
|
+
<section>
|
163
|
+
<h4>Body</h4>
|
164
|
+
|
165
|
+
<ul>
|
166
|
+
<li>{{content_type}}</li>
|
167
|
+
</ul>
|
168
|
+
|
169
|
+
<table>
|
170
|
+
<th>
|
171
|
+
<tr>
|
172
|
+
<td>Name</td>
|
173
|
+
<td>Type</td>
|
174
|
+
<td>Required</td>
|
175
|
+
<td>Default</td>
|
176
|
+
<td>Description</td>
|
177
|
+
<tr>
|
178
|
+
</th>
|
179
|
+
<tbody>
|
180
|
+
{{#attributes}}
|
181
|
+
<tr>
|
182
|
+
<td>{{key}}</td>
|
183
|
+
<td>{{type}}</td>
|
184
|
+
<td>{{required}}</td>
|
185
|
+
<td>{{default}}</td>
|
186
|
+
<td>{{description}}</td>
|
187
|
+
</tr>
|
188
|
+
{{/attributes}}
|
189
|
+
</tbody>
|
190
|
+
</table>
|
191
|
+
</section>
|
192
|
+
{{/body}}
|
193
|
+
|
194
|
+
</section>
|
195
|
+
{{/response}}
|
196
|
+
</section>
|
197
|
+
{{/actions}}
|
198
|
+
|
199
|
+
</body>
|