useless-doc 0.6.5 → 0.7.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.
- checksums.yaml +4 -4
- data/lib/useless/doc/core/body.rb +10 -3
- data/lib/useless/doc/dsl.rb +5 -2
- data/lib/useless/doc/serialization/dump.rb +2 -1
- data/lib/useless/doc/serialization/load.rb +6 -1
- data/lib/useless/doc/ui/godel.rb +2 -1
- data/lib/useless/doc/ui/godel/resource.mustache +40 -0
- data/lib/useless/doc/ui/godel/stylesheet.css +20 -0
- data/lib/useless/doc/version.rb +1 -1
- data/spec/documents/resource.json +21 -1
- data/spec/useless/doc/dsl_spec.rb +4 -0
- data/spec/useless/doc/serialization/dump_spec.rb +16 -1
- data/spec/useless/doc/serialization/load_spec.rb +3 -1
- data/spec/useless/doc/ui/godel_spec.rb +13 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ef1a097ee5d9addd33af7c1fe5c79364d438284
|
4
|
+
data.tar.gz: d85d7c813564eddc5718549d7c205684760f481a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4225d239755a926606513739e7ede9d92d4d289d1c6802cd0753429c434ae19f6a7d1e35812472ecf76c2c7d8ff315b23d0b6dabbc37d5c7ad98a516371b8053
|
7
|
+
data.tar.gz: 4a5273f15009e401bea7b39a8d672cf202ab7108f38a1fede74b48dd73bf7043070fda87420f3240246ebf56a259ae19a7a7b46344556a33f6fd50f5eae7dc3f
|
@@ -34,15 +34,21 @@ module Useless
|
|
34
34
|
#
|
35
35
|
# @!attribute [r] required
|
36
36
|
# @return [Boolean] whether or not the attribute is required. If it
|
37
|
-
# is required, and the attribute is omitted, the response should
|
38
|
-
# a 4xx code. +true+ is the default value.
|
37
|
+
# is required, and the attribute is omitted, the response should
|
38
|
+
# have a 4xx code. +true+ is the default value.
|
39
39
|
#
|
40
40
|
# @!attribute [r] description
|
41
41
|
# @return [String] a description of the attribute.
|
42
42
|
#
|
43
|
+
# @!attribute [r] attributes
|
44
|
+
# @return [Array<Body::Attribute>] documentation for the
|
45
|
+
# sub-attributes of this attribute. An empty array is the default
|
46
|
+
# value.
|
47
|
+
#
|
43
48
|
class Attribute
|
44
49
|
|
45
|
-
attr_reader :key, :type, :required, :default, :description
|
50
|
+
attr_reader :key, :type, :required, :default, :description,
|
51
|
+
:attributes
|
46
52
|
|
47
53
|
# @param [Hash] attrs corresponds to the class's instance attributes.
|
48
54
|
#
|
@@ -52,6 +58,7 @@ module Useless
|
|
52
58
|
@required = attrs.key?(:required) ? attrs[:required] : true
|
53
59
|
@default = attrs[:default]
|
54
60
|
@description = attrs[:description]
|
61
|
+
@attributes = attrs[:attributes] || []
|
55
62
|
end
|
56
63
|
end
|
57
64
|
end
|
data/lib/useless/doc/dsl.rb
CHANGED
@@ -325,8 +325,11 @@ module Useless
|
|
325
325
|
@attributes[:content_type] = value
|
326
326
|
end
|
327
327
|
|
328
|
-
def attribute(key, description, attributes = {})
|
329
|
-
|
328
|
+
def attribute(key, description, attributes = {}, &block)
|
329
|
+
subbody = Body.build({}, &block)
|
330
|
+
attribute = Doc::Core::Body::Attribute.new attributes.merge(
|
331
|
+
key: key, description: description, attributes: subbody.attributes
|
332
|
+
)
|
330
333
|
@attributes[:attributes] << attribute
|
331
334
|
end
|
332
335
|
end
|
@@ -156,7 +156,8 @@ module Useless
|
|
156
156
|
'type' => attribute.type,
|
157
157
|
'required' => attribute.required,
|
158
158
|
'default' => attribute.default,
|
159
|
-
'description' => attribute.description
|
159
|
+
'description' => attribute.description,
|
160
|
+
'attributes' => attribute.attributes.map { |attribute| body_attribute(attribute) }
|
160
161
|
end
|
161
162
|
end
|
162
163
|
|
@@ -234,12 +234,17 @@ module Useless
|
|
234
234
|
def self.body_attribute(json)
|
235
235
|
hash = json_to_hash json
|
236
236
|
|
237
|
+
attributes = (hash['attributes'] || []).map do |json|
|
238
|
+
body_attribute json
|
239
|
+
end
|
240
|
+
|
237
241
|
Useless::Doc::Core::Body::Attribute.new \
|
238
242
|
key: hash['key'],
|
239
243
|
type: hash['type'],
|
240
244
|
required: hash['required'],
|
241
245
|
default: hash['default'],
|
242
|
-
description: hash['description']
|
246
|
+
description: hash['description'],
|
247
|
+
attributes: attributes
|
243
248
|
end
|
244
249
|
end
|
245
250
|
end
|
data/lib/useless/doc/ui/godel.rb
CHANGED
@@ -175,7 +175,8 @@ module Useless
|
|
175
175
|
class Response
|
176
176
|
extend Forwardable
|
177
177
|
|
178
|
-
def_delegators :@response, :code, :description, :headers, :body
|
178
|
+
def_delegators :@response, :code, :description, :headers, :body,
|
179
|
+
:attributes
|
179
180
|
|
180
181
|
def initialize(response)
|
181
182
|
@response = response
|
@@ -96,6 +96,26 @@
|
|
96
96
|
<td>{{required}}</td>
|
97
97
|
<td>{{default}}</td>
|
98
98
|
</tr>
|
99
|
+
|
100
|
+
{{#attributes}}
|
101
|
+
<tr class="sub-attribute">
|
102
|
+
<td>{{key}}</td>
|
103
|
+
<td>{{description}}</td>
|
104
|
+
<td>{{type}}</td>
|
105
|
+
<td>{{required}}</td>
|
106
|
+
<td>{{default}}</td>
|
107
|
+
</tr>
|
108
|
+
|
109
|
+
{{#attributes}}
|
110
|
+
<tr class="sub-sub-attribute">
|
111
|
+
<td>{{key}}</td>
|
112
|
+
<td>{{description}}</td>
|
113
|
+
<td>{{type}}</td>
|
114
|
+
<td>{{required}}</td>
|
115
|
+
<td>{{default}}</td>
|
116
|
+
</tr>
|
117
|
+
{{/attributes}}
|
118
|
+
{{/attributes}}
|
99
119
|
{{/attributes}}
|
100
120
|
</tbody>
|
101
121
|
</table>
|
@@ -153,6 +173,26 @@
|
|
153
173
|
<td>{{required}}</td>
|
154
174
|
<td>{{default}}</td>
|
155
175
|
</tr>
|
176
|
+
|
177
|
+
{{#attributes}}
|
178
|
+
<tr class="sub-attribute">
|
179
|
+
<td>{{key}}</td>
|
180
|
+
<td>{{description}}</td>
|
181
|
+
<td>{{type}}</td>
|
182
|
+
<td>{{required}}</td>
|
183
|
+
<td>{{default}}</td>
|
184
|
+
</tr>
|
185
|
+
|
186
|
+
{{#attributes}}
|
187
|
+
<tr class="sub-sub-attribute">
|
188
|
+
<td>{{key}}</td>
|
189
|
+
<td>{{description}}</td>
|
190
|
+
<td>{{type}}</td>
|
191
|
+
<td>{{required}}</td>
|
192
|
+
<td>{{default}}</td>
|
193
|
+
</tr>
|
194
|
+
{{/attributes}}
|
195
|
+
{{/attributes}}
|
156
196
|
{{/attributes}}
|
157
197
|
</tbody>
|
158
198
|
</table>
|
@@ -37,6 +37,10 @@ h3 span.status-message {
|
|
37
37
|
font-weight: normal;
|
38
38
|
}
|
39
39
|
|
40
|
+
h4 {
|
41
|
+
font-size: 1.25em;
|
42
|
+
}
|
43
|
+
|
40
44
|
h4 span.content-type {
|
41
45
|
font-weight: normal;
|
42
46
|
font-family: 'Open Sans';
|
@@ -191,6 +195,22 @@ table tbody tr:last-child td, table tbody tr:last-child th {
|
|
191
195
|
border-bottom-width: 0;
|
192
196
|
}
|
193
197
|
|
198
|
+
table tr.sub-attribute {
|
199
|
+
background-color: #EEE;
|
200
|
+
}
|
201
|
+
|
202
|
+
table tr.sub-attribute td:first-child {
|
203
|
+
padding-left: 1.5em;
|
204
|
+
}
|
205
|
+
|
206
|
+
table tr.sub-sub-attribute {
|
207
|
+
background-color: #DDD;
|
208
|
+
}
|
209
|
+
|
210
|
+
table tr.sub-sub-attribute td:first-child {
|
211
|
+
padding-left: 3em;
|
212
|
+
}
|
213
|
+
|
194
214
|
table.stages {
|
195
215
|
margin-top: 2em;
|
196
216
|
}
|
data/lib/useless/doc/version.rb
CHANGED
@@ -48,7 +48,27 @@
|
|
48
48
|
"key": "created_by",
|
49
49
|
"type": "object",
|
50
50
|
"required": true,
|
51
|
-
"description": "The
|
51
|
+
"description": "The user who created this twonk.",
|
52
|
+
"attributes": [
|
53
|
+
{
|
54
|
+
"key": "id",
|
55
|
+
"type": "number",
|
56
|
+
"required": true,
|
57
|
+
"description": "The unique ID of the user."
|
58
|
+
},
|
59
|
+
{
|
60
|
+
"key": "short_name",
|
61
|
+
"type": "string",
|
62
|
+
"required": true,
|
63
|
+
"description": "A user-friendly handle for the user."
|
64
|
+
}
|
65
|
+
]
|
66
|
+
},
|
67
|
+
{
|
68
|
+
"key": "title",
|
69
|
+
"type": "string",
|
70
|
+
"required": false,
|
71
|
+
"description": "The formal title of this twonk"
|
52
72
|
}
|
53
73
|
]
|
54
74
|
}
|
@@ -62,6 +62,9 @@ describe Useless::Doc::DSL::API do
|
|
62
62
|
attribute 'name', 'The name of the widget', required: true
|
63
63
|
attribute 'age', 'The age of the widget. If missing, the widget was never born',
|
64
64
|
type: :number, required: false
|
65
|
+
attribute 'owner', 'The owner of this widget', type: 'object' do
|
66
|
+
attribute 'nickname', 'The nickname of the owner'
|
67
|
+
end
|
65
68
|
end
|
66
69
|
end
|
67
70
|
end
|
@@ -110,6 +113,7 @@ describe Useless::Doc::DSL::API do
|
|
110
113
|
collection.requests[0].method.should == 'GET'
|
111
114
|
collection.requests[0].headers[0].description.should == 'The twiddle threshold.'
|
112
115
|
collection.requests[0].responses[1].code.should == 200
|
116
|
+
collection.requests[0].responses[1].body.attributes[2].attributes[0].key.should == 'nickname'
|
113
117
|
collection.requests[1].method.should == 'POST'
|
114
118
|
collection.requests[1].description.should == 'Creates a new widget'
|
115
119
|
collection.requests[1].body.content_type.should == 'application/json'
|
@@ -112,12 +112,20 @@ describe Useless::Doc::Serialization::Dump do
|
|
112
112
|
key: 'Type',
|
113
113
|
description: 'The response type.'
|
114
114
|
|
115
|
+
get_response_body_subattribute = Useless::Doc::Core::Body::Attribute.new \
|
116
|
+
key: 'nickname',
|
117
|
+
type: 'string',
|
118
|
+
required: true,
|
119
|
+
default: nil,
|
120
|
+
description: 'The nickname of the user'
|
121
|
+
|
115
122
|
get_response_body_attribute = Useless::Doc::Core::Body::Attribute.new \
|
116
123
|
key: 'name',
|
117
124
|
type: 'string',
|
118
125
|
required: true,
|
119
126
|
default: nil,
|
120
|
-
description: 'The name of the twiddle.'
|
127
|
+
description: 'The name of the twiddle.',
|
128
|
+
attributes: [get_response_body_subattribute]
|
121
129
|
|
122
130
|
get_response_body = Useless::Doc::Core::Body.new \
|
123
131
|
content_type: 'application/json',
|
@@ -193,6 +201,13 @@ describe Useless::Doc::Serialization::Dump do
|
|
193
201
|
get_request_body_attribute_hash['required'].should == true
|
194
202
|
get_request_body_attribute_hash['default'].should be_nil
|
195
203
|
get_request_body_attribute_hash['description'].should == 'The name of the twiddle.'
|
204
|
+
|
205
|
+
get_request_body_subattribute_hash = Useless::Doc::Serialization::Load.json_to_hash(get_request_body_attribute_hash['attributes'][0])
|
206
|
+
get_request_body_subattribute_hash['key'].should == 'nickname'
|
207
|
+
get_request_body_subattribute_hash['type'].should == 'string'
|
208
|
+
get_request_body_subattribute_hash['required'].should == true
|
209
|
+
get_request_body_subattribute_hash['default'].should be_nil
|
210
|
+
get_request_body_subattribute_hash['description'].should == 'The nickname of the user'
|
196
211
|
end
|
197
212
|
end
|
198
213
|
|
@@ -119,7 +119,9 @@ describe Useless::Doc::Serialization::Load do
|
|
119
119
|
get.responses[1].body.attributes[1].type.should == 'object'
|
120
120
|
get.responses[1].body.attributes[1].required.should be_true
|
121
121
|
get.responses[1].body.attributes[1].default.should be_nil
|
122
|
-
get.responses[1].body.attributes[1].description.should == 'The
|
122
|
+
get.responses[1].body.attributes[1].description.should == 'The user who created this twonk.'
|
123
|
+
get.responses[1].body.attributes[1].attributes[0].key.should == 'id'
|
124
|
+
get.responses[1].body.attributes[1].attributes[1].key.should == 'short_name'
|
123
125
|
|
124
126
|
put = resource.requests.last
|
125
127
|
put.method.should == 'PUT'
|
@@ -188,7 +188,7 @@ describe Useless::Doc::UI::Godel do
|
|
188
188
|
it 'should add body information to a table' do
|
189
189
|
[
|
190
190
|
{ key: 'name', description: 'The name of the twonk.' },
|
191
|
-
{ key: 'created_by', description: 'The
|
191
|
+
{ key: 'created_by', description: 'The user who created this twonk.' },
|
192
192
|
{ key: 'hoinked_by', description: 'The ID of the person who hoinked this twonk.' }
|
193
193
|
].each do |attribute|
|
194
194
|
@doc.css('table').find do |table|
|
@@ -198,6 +198,18 @@ describe Useless::Doc::UI::Godel do
|
|
198
198
|
end
|
199
199
|
end
|
200
200
|
|
201
|
+
it 'should add body sub-attributes to a special table row' do
|
202
|
+
[
|
203
|
+
{ key: 'id', description: 'The unique ID of the user.' },
|
204
|
+
{ key: 'short_name', description: 'A user-friendly handle for the user.' },
|
205
|
+
].each do |attribute|
|
206
|
+
@doc.css('table tr.sub-attribute').find do |table|
|
207
|
+
table.content.match(attribute[:key]) and
|
208
|
+
table.content.match(attribute[:description])
|
209
|
+
end.should_not be_nil
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
201
213
|
it 'should add header information to a table' do
|
202
214
|
@doc.css('table').find do |table|
|
203
215
|
table.content.match('User-Agent') and
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: useless-doc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Hyland
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-04-
|
11
|
+
date: 2013-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|