useless-doc 0.5.0 → 0.6.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.
- data/lib/useless/doc/core/api.rb +14 -1
- data/lib/useless/doc/core/stage.rb +29 -0
- data/lib/useless/doc/serialization/dump.rb +18 -1
- data/lib/useless/doc/serialization/load.rb +37 -5
- data/lib/useless/doc/ui/godel/api.mustache +39 -0
- data/lib/useless/doc/ui/godel/stylesheet.css +16 -0
- data/lib/useless/doc/ui/godel.rb +35 -0
- data/lib/useless/doc/version.rb +1 -1
- data/spec/documents/api.json +12 -0
- data/spec/useless/doc/serialization/dump_spec.rb +29 -1
- data/spec/useless/doc/serialization/load_spec.rb +6 -0
- data/spec/useless/doc/ui/godel_spec.rb +20 -0
- metadata +3 -2
data/lib/useless/doc/core/api.rb
CHANGED
@@ -19,9 +19,19 @@ module Useless
|
|
19
19
|
# @!attribute [r] resources
|
20
20
|
# @return [Array<Resource>] the resources included in the API.
|
21
21
|
#
|
22
|
+
# @!attribute [r] concept
|
23
|
+
# @return [Stage] a `Core::Stage` instance for the API concept.
|
24
|
+
#
|
25
|
+
# @!attribute [r] specification
|
26
|
+
# @return [Stage] a `Core::Stage` instance for the API specification.
|
27
|
+
#
|
28
|
+
# @!attribute [r] implementation
|
29
|
+
# @return [Stage] a `Core::Stage` instance for the API implementation.
|
30
|
+
#
|
22
31
|
class API
|
23
32
|
|
24
|
-
attr_accessor :name, :url, :description, :timestamp, :resources
|
33
|
+
attr_accessor :name, :url, :description, :timestamp, :resources,
|
34
|
+
:concept, :specification, :implementation
|
25
35
|
|
26
36
|
# @param [Hash] attrs corresponds to the class's instance attributes.
|
27
37
|
#
|
@@ -31,6 +41,9 @@ module Useless
|
|
31
41
|
@description = attrs[:description]
|
32
42
|
@timestamp = attrs[:timestamp]
|
33
43
|
@resources = attrs[:resources] || []
|
44
|
+
@concept = attrs[:concept]
|
45
|
+
@specification = attrs[:specification]
|
46
|
+
@implementation = attrs[:implementation]
|
34
47
|
end
|
35
48
|
end
|
36
49
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Useless
|
2
|
+
module Doc
|
3
|
+
module Core
|
4
|
+
|
5
|
+
# `Core::Stage` documents credit and progress of a stage in the
|
6
|
+
# development of an API. For example, a stage is one of "concept",
|
7
|
+
# "specification" or "implementation" in `Core::API`.
|
8
|
+
#
|
9
|
+
# @!attribute [r] credit
|
10
|
+
# @return [Array<String>] names of the people responsible for this
|
11
|
+
# stage.
|
12
|
+
#
|
13
|
+
# @!attribute [r] progress
|
14
|
+
# @return [String] a string identifying how far the stage has
|
15
|
+
# progressed.
|
16
|
+
#
|
17
|
+
class Stage
|
18
|
+
attr_accessor :credit, :progress
|
19
|
+
|
20
|
+
# @param [Hash] attrs corresponds to the class's instance attributes.
|
21
|
+
#
|
22
|
+
def initialize(attrs = {})
|
23
|
+
@credit = attrs[:credit] || []
|
24
|
+
@progress = attrs[:progress]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -48,7 +48,24 @@ module Useless
|
|
48
48
|
'url' => api.url,
|
49
49
|
'description' => api.description,
|
50
50
|
'timestamp' => api.timestamp ? api.timestamp.iso8601 : nil,
|
51
|
-
'resources' => api.resources.map { |resource| resource(resource) }
|
51
|
+
'resources' => api.resources.map { |resource| resource(resource) },
|
52
|
+
'concept' => stage(api.concept),
|
53
|
+
'specification' => stage(api.specification),
|
54
|
+
'implementation' => stage(api.implementation)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Converts +Core::Stage+ instance to a JSON representation.
|
59
|
+
#
|
60
|
+
# @param [Core::Stage] stage the stage to be converted to JSON.
|
61
|
+
#
|
62
|
+
# @return [String] a JSON representation of the specified stage.
|
63
|
+
#
|
64
|
+
def self.stage(stage)
|
65
|
+
if stage
|
66
|
+
hash_to_json \
|
67
|
+
'credit' => stage.credit,
|
68
|
+
'progress' => stage.progress
|
52
69
|
end
|
53
70
|
end
|
54
71
|
|
@@ -6,6 +6,7 @@ require 'useless/doc/core/header'
|
|
6
6
|
require 'useless/doc/core/request'
|
7
7
|
require 'useless/doc/core/resource'
|
8
8
|
require 'useless/doc/core/response'
|
9
|
+
require 'useless/doc/core/stage'
|
9
10
|
|
10
11
|
module Useless
|
11
12
|
module Doc
|
@@ -86,12 +87,43 @@ module Useless
|
|
86
87
|
nil
|
87
88
|
end
|
88
89
|
|
90
|
+
if hash['concept']
|
91
|
+
concept = stage hash['concept']
|
92
|
+
end
|
93
|
+
|
94
|
+
if hash['specification']
|
95
|
+
specification = stage hash['specification']
|
96
|
+
end
|
97
|
+
|
98
|
+
if hash['implementation']
|
99
|
+
implementation = stage hash['implementation']
|
100
|
+
end
|
101
|
+
|
89
102
|
Useless::Doc::Core::API.new \
|
90
|
-
name:
|
91
|
-
url:
|
92
|
-
timestamp:
|
93
|
-
description:
|
94
|
-
resources:
|
103
|
+
name: hash['name'],
|
104
|
+
url: hash['url'],
|
105
|
+
timestamp: timestamp,
|
106
|
+
description: hash['description'],
|
107
|
+
resources: resources,
|
108
|
+
concept: concept,
|
109
|
+
specification: specification,
|
110
|
+
implementation: implementation
|
111
|
+
end
|
112
|
+
|
113
|
+
# Converts a JSON representation to an instance of +Core::Stage+
|
114
|
+
#
|
115
|
+
# @param [String, Hash] json the JSON representation to be converted to
|
116
|
+
# a stage.
|
117
|
+
#
|
118
|
+
# @return [Core::Resource] the stage corresponding to the specified
|
119
|
+
# JSON.
|
120
|
+
#
|
121
|
+
def self.stage(json)
|
122
|
+
hash = json_to_hash json
|
123
|
+
|
124
|
+
Useless::Doc::Core::Stage.new \
|
125
|
+
credit: hash['credit'],
|
126
|
+
progress: hash['progress']
|
95
127
|
end
|
96
128
|
|
97
129
|
# Converts a JSON represntation to an instance of +Core::Resource+
|
@@ -32,6 +32,45 @@
|
|
32
32
|
<section class="main description">
|
33
33
|
<article class="description api">
|
34
34
|
{{{description}}}
|
35
|
+
|
36
|
+
<table class="stages">
|
37
|
+
<thead>
|
38
|
+
<th>Specification</th>
|
39
|
+
<th>Implementation</th>
|
40
|
+
<th>Concept</th>
|
41
|
+
<tbody>
|
42
|
+
<tr>
|
43
|
+
<td>
|
44
|
+
{{#specification}}
|
45
|
+
{{progress}}
|
46
|
+
{{/specification}}
|
47
|
+
</td>
|
48
|
+
<td>
|
49
|
+
{{#implementation}}
|
50
|
+
{{progress}}
|
51
|
+
{{/implementation}}
|
52
|
+
</td>
|
53
|
+
<td class="concept-credit" rowspan=2>
|
54
|
+
{{#concept}}
|
55
|
+
{{credit}}
|
56
|
+
{{/concept}}
|
57
|
+
</td>
|
58
|
+
</tr>
|
59
|
+
|
60
|
+
<tr>
|
61
|
+
<td>
|
62
|
+
{{#specification}}
|
63
|
+
{{credit}}
|
64
|
+
{{/specification}}
|
65
|
+
</td>
|
66
|
+
<td class="implementation-credit">
|
67
|
+
{{#implementation}}
|
68
|
+
{{credit}}
|
69
|
+
{{/implementation}}
|
70
|
+
</td>
|
71
|
+
</tr>
|
72
|
+
</tbody>
|
73
|
+
</table>
|
35
74
|
</article>
|
36
75
|
</section>
|
37
76
|
|
@@ -163,3 +163,19 @@ table td:last-child, table th:last-child {
|
|
163
163
|
table tbody tr:last-child td, table tbody tr:last-child th {
|
164
164
|
border-bottom-width: 0;
|
165
165
|
}
|
166
|
+
|
167
|
+
table.stages {
|
168
|
+
margin-top: 2em;
|
169
|
+
}
|
170
|
+
|
171
|
+
table.stages td, table.stages th {
|
172
|
+
padding: 0.5em 1em;
|
173
|
+
}
|
174
|
+
|
175
|
+
table.stages td.implementation-credit {
|
176
|
+
border-right: 1px solid #DDD;
|
177
|
+
}
|
178
|
+
|
179
|
+
table.stages td.concept-credit {
|
180
|
+
border-bottom-width: 0;
|
181
|
+
}
|
data/lib/useless/doc/ui/godel.rb
CHANGED
@@ -89,6 +89,24 @@ module Useless
|
|
89
89
|
def resources
|
90
90
|
@api.resources.map{ |resource| Godel::Resource.new(resource, @router) }
|
91
91
|
end
|
92
|
+
|
93
|
+
def concept
|
94
|
+
if @api.concept
|
95
|
+
Godel::Stage.new(@api.concept)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def specification
|
100
|
+
if @api.specification
|
101
|
+
Godel::Stage.new(@api.specification)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def implementation
|
106
|
+
if @api.implementation
|
107
|
+
Godel::Stage.new(@api.implementation)
|
108
|
+
end
|
109
|
+
end
|
92
110
|
end
|
93
111
|
|
94
112
|
class Resource < Mustache
|
@@ -160,6 +178,23 @@ module Useless
|
|
160
178
|
headers.any?
|
161
179
|
end
|
162
180
|
end
|
181
|
+
|
182
|
+
class Stage
|
183
|
+
def initialize(stage)
|
184
|
+
@stage = stage
|
185
|
+
end
|
186
|
+
|
187
|
+
def progress
|
188
|
+
@stage.progress.
|
189
|
+
split('-').
|
190
|
+
map { |word| word.capitalize }.
|
191
|
+
join(' ')
|
192
|
+
end
|
193
|
+
|
194
|
+
def credit
|
195
|
+
@stage.credit.join(', ')
|
196
|
+
end
|
197
|
+
end
|
163
198
|
end
|
164
199
|
end
|
165
200
|
end
|
data/lib/useless/doc/version.rb
CHANGED
data/spec/documents/api.json
CHANGED
@@ -3,6 +3,18 @@
|
|
3
3
|
"url": "twonk.useless.io",
|
4
4
|
"timestamp": "2013-03-06T23:13:00-05:00",
|
5
5
|
"description": "Twonk information. Duh.",
|
6
|
+
"concept": {
|
7
|
+
"credit": ["John Henry"],
|
8
|
+
"progress": "complete"
|
9
|
+
},
|
10
|
+
"specification": {
|
11
|
+
"credit": ["Bill Wever"],
|
12
|
+
"progress": "in-progress"
|
13
|
+
},
|
14
|
+
"implementation": {
|
15
|
+
"credit": ["Bill Wever", "John Henry"],
|
16
|
+
"progress": "pending"
|
17
|
+
},
|
6
18
|
"resources": [
|
7
19
|
{
|
8
20
|
"path": "/twonks/:id",
|
@@ -7,6 +7,7 @@ require 'useless/doc/core/header'
|
|
7
7
|
require 'useless/doc/core/request'
|
8
8
|
require 'useless/doc/core/resource'
|
9
9
|
require 'useless/doc/core/response'
|
10
|
+
require 'useless/doc/core/stage'
|
10
11
|
require 'useless/doc/serialization/dump'
|
11
12
|
require 'useless/doc/serialization/load'
|
12
13
|
|
@@ -53,6 +54,18 @@ describe Useless::Doc::Serialization::Dump do
|
|
53
54
|
|
54
55
|
describe '.api' do
|
55
56
|
it 'should convert the specified Core::API instance to JSON' do
|
57
|
+
concept = Useless::Doc::Core::Stage.new \
|
58
|
+
credit: ['Joe Blue'],
|
59
|
+
progress: 'complete'
|
60
|
+
|
61
|
+
specification = Useless::Doc::Core::Stage.new \
|
62
|
+
credit: ['Bill Grey'],
|
63
|
+
progress: 'in-progress'
|
64
|
+
|
65
|
+
implementation = Useless::Doc::Core::Stage.new \
|
66
|
+
credit: ['Bill Grey', 'Joe Blue'],
|
67
|
+
progress: 'pending'
|
68
|
+
|
56
69
|
resource = Useless::Doc::Core::Resource.new \
|
57
70
|
path: '/twiddles',
|
58
71
|
description: 'The full lot of twiddles.',
|
@@ -63,7 +76,10 @@ describe Useless::Doc::Serialization::Dump do
|
|
63
76
|
url: 'twiddles.useless.io',
|
64
77
|
timestamp: Time.parse('2013-03-06 11:13 PM'),
|
65
78
|
description: 'Pretty much, like, everything you\'re looking for',
|
66
|
-
resources: [resource]
|
79
|
+
resources: [resource],
|
80
|
+
concept: concept,
|
81
|
+
specification: specification,
|
82
|
+
implementation: implementation
|
67
83
|
|
68
84
|
json = Useless::Doc::Serialization::Dump.api(api)
|
69
85
|
hash = Useless::Doc::Serialization::Load.json_to_hash(json)
|
@@ -72,6 +88,18 @@ describe Useless::Doc::Serialization::Dump do
|
|
72
88
|
hash['timestamp'].should == Time.parse('2013-03-06 11:13 PM').iso8601
|
73
89
|
hash['description'].should == 'Pretty much, like, everything you\'re looking for'
|
74
90
|
|
91
|
+
concept_hash = Useless::Doc.load.json_to_hash(hash['concept'])
|
92
|
+
concept_hash['credit'].should == ['Joe Blue']
|
93
|
+
concept_hash['progress'].should == 'complete'
|
94
|
+
|
95
|
+
specification_hash = Useless::Doc.load.json_to_hash(hash['specification'])
|
96
|
+
specification_hash['credit'].should == ['Bill Grey']
|
97
|
+
specification_hash['progress'].should == 'in-progress'
|
98
|
+
|
99
|
+
implementation_hash = Useless::Doc.load.json_to_hash(hash['implementation'])
|
100
|
+
implementation_hash['credit'].should == ['Bill Grey', 'Joe Blue']
|
101
|
+
implementation_hash['progress'].should == 'pending'
|
102
|
+
|
75
103
|
resource_hash = Useless::Doc::Serialization::Load.json_to_hash(hash['resources'][0])
|
76
104
|
resource_hash['path'].should == '/twiddles'
|
77
105
|
resource_hash['description'].should == 'The full lot of twiddles.'
|
@@ -61,6 +61,12 @@ describe Useless::Doc::Serialization::Load do
|
|
61
61
|
api.url.should == 'twonk.useless.io'
|
62
62
|
api.timestamp.should == Time.parse('2013-03-06T23:13:00-05:00')
|
63
63
|
api.description.should == 'Twonk information. Duh.'
|
64
|
+
api.concept.credit.should == ['John Henry']
|
65
|
+
api.concept.progress.should == 'complete'
|
66
|
+
api.specification.credit.should == ['Bill Wever']
|
67
|
+
api.specification.progress.should == 'in-progress'
|
68
|
+
api.implementation.credit.should == ['Bill Wever', 'John Henry']
|
69
|
+
api.implementation.progress.should == 'pending'
|
64
70
|
api.resources.first.path.should == '/twonks/:id'
|
65
71
|
api.resources.first.description.should == 'The most critical aspect.'
|
66
72
|
end
|
@@ -114,6 +114,26 @@ describe Useless::Doc::UI::Godel do
|
|
114
114
|
as.find { |a| a.content == 'POST' }['href'].should == '/twonks/:id/werp#POST'
|
115
115
|
td_content.should include 'Make dem werps.'
|
116
116
|
end
|
117
|
+
|
118
|
+
it 'should display concept information' do
|
119
|
+
stages = @doc.css('table.stages').first.content
|
120
|
+
stages.should include 'Concept'
|
121
|
+
stages.should include 'John Henry'
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'should display specification information' do
|
125
|
+
stages = @doc.css('table.stages').first.content
|
126
|
+
stages.should include 'Specification'
|
127
|
+
stages.should include 'Bill Wever'
|
128
|
+
stages.should include 'In Progress'
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should display implementation information' do
|
132
|
+
stages = @doc.css('table.stages').first.content
|
133
|
+
stages.should include 'Implementation'
|
134
|
+
stages.should include 'Bill Wever, John Henry'
|
135
|
+
stages.should include 'Pending'
|
136
|
+
end
|
117
137
|
end
|
118
138
|
|
119
139
|
context 'for a Core::Resource instance' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: useless-doc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: oj
|
@@ -192,6 +192,7 @@ files:
|
|
192
192
|
- lib/useless/doc/core/request.rb
|
193
193
|
- lib/useless/doc/core/resource.rb
|
194
194
|
- lib/useless/doc/core/response.rb
|
195
|
+
- lib/useless/doc/core/stage.rb
|
195
196
|
- lib/useless/doc/dsl.rb
|
196
197
|
- lib/useless/doc/proxy.rb
|
197
198
|
- lib/useless/doc/proxy/css.rb
|