fdoc 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. data/README.md +15 -0
  2. data/lib/fdoc.rb +2 -1
  3. data/lib/fdoc/cli.rb +53 -15
  4. data/lib/fdoc/meta_service.rb +1 -1
  5. data/lib/fdoc/presenters/{html_presenter.rb → base_presenter.rb} +12 -17
  6. data/lib/fdoc/presenters/endpoint_presenter.rb +22 -24
  7. data/lib/fdoc/presenters/json_presenter.rb +31 -0
  8. data/lib/fdoc/presenters/meta_service_presenter.rb +25 -6
  9. data/lib/fdoc/presenters/response_code_presenter.rb +13 -4
  10. data/lib/fdoc/presenters/schema_presenter.rb +36 -4
  11. data/lib/fdoc/presenters/service_presenter.rb +25 -6
  12. data/lib/fdoc/templates/endpoint.html.erb +5 -5
  13. data/lib/fdoc/templates/endpoint.md.erb +40 -0
  14. data/lib/fdoc/templates/meta_service.html.erb +3 -1
  15. data/lib/fdoc/templates/meta_service.md.erb +20 -0
  16. data/lib/fdoc/templates/service.html.erb +4 -2
  17. data/lib/fdoc/templates/service.md.erb +18 -0
  18. data/lib/fdoc/templates/shared/endpoint_name.html.erb +8 -0
  19. data/lib/fdoc/templates/shared/endpoint_name.md.erb +1 -0
  20. data/lib/fdoc/templates/styles.css +1 -1
  21. data/spec/fdoc/cli_spec.rb +87 -40
  22. data/spec/fdoc/endpoint_scaffold_spec.rb +5 -5
  23. data/spec/fdoc/endpoint_spec.rb +18 -18
  24. data/spec/fdoc/presenters/base_presenter_spec.rb +28 -0
  25. data/spec/fdoc/presenters/endpoint_presenter_spec.rb +8 -1
  26. data/spec/fdoc/presenters/meta_service_presenter_spec.rb +38 -0
  27. data/spec/fdoc/presenters/schema_presenter_spec.rb +34 -0
  28. data/spec/fdoc/presenters/service_presenter_spec.rb +24 -1
  29. data/spec/fixtures/members/list/complex-params-GET.fdoc +20 -20
  30. data/spec/spec_helper.rb +1 -0
  31. metadata +14 -2
@@ -1,7 +1,12 @@
1
- # An HtmlPresenter for Fdoc::Service
2
- class Fdoc::ServicePresenter < Fdoc::HtmlPresenter
1
+ # An BasePresenter for Fdoc::Service
2
+ class Fdoc::ServicePresenter < Fdoc::BasePresenter
3
3
  attr_reader :service
4
4
 
5
+ extend Forwardable
6
+
7
+ def_delegators :service, :name, :service_dir, :meta_service
8
+
9
+
5
10
  def initialize(service, options = {})
6
11
  super(options)
7
12
  @service = service
@@ -11,6 +16,10 @@ class Fdoc::ServicePresenter < Fdoc::HtmlPresenter
11
16
  render_erb('service.html.erb')
12
17
  end
13
18
 
19
+ def to_markdown
20
+ render_erb('service.md.erb')
21
+ end
22
+
14
23
  def name_as_link(options = {})
15
24
  path = service.meta_service ? index_path(slug_name) : index_path
16
25
  '<a href="%s">%s %s</a>' % [ path, options[:prefix], service.name ]
@@ -46,11 +55,21 @@ class Fdoc::ServicePresenter < Fdoc::HtmlPresenter
46
55
  @endpoints
47
56
  end
48
57
 
49
- def description
50
- render_markdown(service.description)
58
+ def description(options = {:render => true})
59
+ options[:render] ? render_markdown(service.description) : service.description
51
60
  end
52
61
 
53
- def discussion
54
- render_markdown(service.discussion)
62
+ def discussion(options = {:render => true})
63
+ options[:render] ? render_markdown(service.discussion) : service.discussion
55
64
  end
65
+
66
+ def relative_meta_service_path(file_name = nil)
67
+ service_path = service_dir.gsub(meta_service.meta_service_dir, "")
68
+ service_path = service_path.count("/").times.map { "../" }.join
69
+ if file_name
70
+ service_path = File.join(service_path, file_name)
71
+ end
72
+ service_path
73
+ end
74
+
56
75
  end
@@ -11,7 +11,7 @@
11
11
  <div id="page">
12
12
  <div id="content">
13
13
  <h1>
14
- <%= name %>
14
+ <%= render_erb('shared/endpoint_name.html.erb', endpoint_presenter.get_binding) %>
15
15
  </h1>
16
16
 
17
17
  <div id="nav">
@@ -31,19 +31,19 @@
31
31
  <%= tag_with_anchor('h2', 'Request') %>
32
32
 
33
33
  <%= tag_with_anchor('h3', 'Example Request') %>
34
- <%= example_request %>
34
+ <%= example_request.to_html %>
35
35
 
36
36
  <%= tag_with_anchor('h3', 'Request Parameters') %>
37
- <%= request_parameters %>
37
+ <%= request_parameters.to_html %>
38
38
  <% end %>
39
39
 
40
40
  <%= tag_with_anchor('h2', 'Response') %>
41
41
  <% if show_response? %>
42
42
  <%= tag_with_anchor('h3', 'Example Response') %>
43
- <%= example_response %>
43
+ <%= example_response.to_html %>
44
44
 
45
45
  <%= tag_with_anchor('h3', 'Response Parameters') %>
46
- <%= response_parameters %>
46
+ <%= response_parameters.to_html %>
47
47
  <% end %>
48
48
 
49
49
  <%= tag_with_anchor('h3', 'Response Codes') %>
@@ -0,0 +1,40 @@
1
+ # <%= endpoint.verb -%> <%= base_path -%><%= path -%><%= "deprecated" if deprecated? -%>
2
+
3
+ <%= description %>
4
+
5
+ <% if show_request? %>
6
+ ## Request
7
+ ### Example Request
8
+ ```
9
+ <%= example_request.to_markdown %>
10
+ ```
11
+
12
+ ### Example Parameters
13
+ <%= request_parameters.to_markdown %>
14
+ <% end %>
15
+
16
+ ## Response
17
+ <% if show_response? %>
18
+ ### Example Response
19
+ ```
20
+ <%= example_response.to_markdown %>
21
+ ```
22
+
23
+ ### Response Parameters
24
+ <%= response_parameters.to_markdown %>
25
+ <% end %>
26
+
27
+ ### Response Codes
28
+ <% if !successful_response_codes.empty? %>
29
+ #### Successful Response Codes
30
+ <% successful_response_codes.each do |response_code| %>
31
+ * <%= response_code.to_markdown %>
32
+ <% end %>
33
+ <% end %>
34
+
35
+ <% if !successful_response_codes.empty? %>
36
+ #### Failure Response Codes
37
+ <% failure_response_codes.each do |response_code| %>
38
+ * <%= response_code.to_markdown %>
39
+ <% end %>
40
+ <% end %>
@@ -35,7 +35,9 @@
35
35
  <ul>
36
36
  <% endpoint_ary.each do |endpoint| %>
37
37
  <li>
38
- <%= endpoint.name_as_link %>
38
+ <a href="<%= endpoint.url %>">
39
+ <%= render_erb("shared/endpoint_name.html.erb", endpoint.get_binding) %>
40
+ </a>
39
41
  </li>
40
42
  <% end %>
41
43
  </ul>
@@ -0,0 +1,20 @@
1
+ # <%= name %>
2
+
3
+ <%= description(:render => false) %>
4
+
5
+ <% services.each do |serv| %>
6
+ * <%= "[#{serv.name}](#{relative_service_path(serv, "index.md")})" %>
7
+ <% end %>
8
+
9
+ ## Endpoints
10
+ <% endpoints.each do |endpoint_ary| %>
11
+ ### <%= endpoint_ary.first.prefix %>
12
+ <% endpoint_ary.each do |endpoint| %>
13
+ * <%= render_erb("shared/endpoint_name.md.erb", endpoint.get_binding) %>
14
+ <% end -%>
15
+ <% end -%>
16
+
17
+ <% if discussion %>
18
+ ## Discussion
19
+ <%= discussion(:render => false) %>
20
+ <% end %>
@@ -31,8 +31,10 @@
31
31
  <ul>
32
32
  <% endpoint_ary.each do |endpoint| %>
33
33
  <li>
34
- <%= endpoint.name_as_link %>
35
- </li>
34
+ <a href="<%= endpoint.url %>">
35
+ <%= render_erb("shared/endpoint_name.html.erb", endpoint.get_binding) %>
36
+ </a>
37
+ </li>
36
38
  <% end %>
37
39
  </ul>
38
40
  <% end %>
@@ -0,0 +1,18 @@
1
+ # <%= name %>
2
+ <% if meta_service %>
3
+ ### &#187; <%= "[#{meta_service.name}](#{relative_meta_service_path("index.md")})" %>
4
+ <% end %>
5
+
6
+ <%= description(:render => false) %>
7
+
8
+ <% endpoints.each do |endpoint_ary| %>
9
+ ### <%= endpoint_ary.first.prefix %>
10
+ <% endpoint_ary.each do |endpoint| %>
11
+ * <%= render_erb("shared/endpoint_name.md.erb", endpoint.get_binding) %>
12
+ <% end %>
13
+ <% end %>
14
+
15
+ <% if discussion %>
16
+ ## Discussion
17
+ <%= discussion(:render => false) %>
18
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <span class="endpoint-name <%= 'deprecated' if deprecated? -%>">
2
+ <span class="verb"><%= endpoint.verb %></span>
3
+ <span class="root"><%= base_path %></span>
4
+ <span class="path"><%= path %></span>
5
+ <% if deprecated? %>
6
+ (deprecated)
7
+ <% end %>
8
+ </span>
@@ -0,0 +1 @@
1
+ <%= endpoint.verb -%> [<%= base_path -%><%= path -%><%= "deprecated" if deprecated? -%>](<%= url('.md') %>)
@@ -61,7 +61,7 @@ tt, kbd, code {
61
61
  background: #eee;
62
62
  padding: .1em;
63
63
  border: 1pt solid #ddd;
64
- white-space: pre-wrap;
64
+ white-space: pre-wrap;
65
65
  }
66
66
 
67
67
  .endpoint-name {}
@@ -5,9 +5,10 @@ describe Fdoc::Cli do
5
5
  let(:temporary_path) { Dir.mktmpdir("fdoc-cli") }
6
6
  let(:fdoc_path) { File.expand_path("fdoc", temporary_path) }
7
7
  let(:html_path) { File.expand_path("html", temporary_path) }
8
- let(:options) { {} }
8
+ let(:markdown_path) { File.expand_path("markdown", temporary_path) }
9
+ let(:options) { { :format => 'html' } }
9
10
 
10
- subject(:cli) { Fdoc::Cli.new([fdoc_path], options) }
11
+ subject { Fdoc::Cli.new([fdoc_path], options) }
11
12
 
12
13
  before { FileUtils.mkdir_p(fdoc_path) }
13
14
 
@@ -28,7 +29,7 @@ describe Fdoc::Cli do
28
29
 
29
30
  it "raises an exception" do
30
31
  expect do
31
- cli.convert(fdoc_path)
32
+ subject.convert(fdoc_path)
32
33
  end.to raise_exception(Fdoc::NotFound)
33
34
  end
34
35
  end
@@ -37,7 +38,7 @@ describe Fdoc::Cli do
37
38
  context "when the destination does not exist" do
38
39
  it "makes a destination directory" do
39
40
  expect do
40
- cli.convert(fdoc_path)
41
+ subject.convert(fdoc_path)
41
42
  end.to change { File.directory?(html_path) }.to(true)
42
43
  end
43
44
  end
@@ -47,70 +48,58 @@ describe Fdoc::Cli do
47
48
 
48
49
  it "raises an exception" do
49
50
  expect do
50
- cli.convert(fdoc_path)
51
+ subject.convert(fdoc_path)
51
52
  end.to raise_exception(Fdoc::NotADirectory)
52
53
  end
53
54
  end
54
55
 
55
56
  it "copies the css to the destination" do
56
57
  expect do
57
- cli.convert(fdoc_path)
58
+ subject.convert(fdoc_path)
58
59
  end.to change { File.exist?(styles_css_path) }.from(false)
59
60
  end
60
61
 
61
- context "when there is a meta service fdoc" do
62
- let(:root_html) { File.expand_path("index.html", html_path) }
63
- let(:members_html) do
64
- File.expand_path("members_api/index.html", html_path)
65
- end
66
- let(:endpoint_html) do
67
- File.expand_path("members_api/add-PUT.html", html_path)
68
- end
69
-
62
+ shared_examples "when there is a meta service fdoc" do
70
63
  before { with_fixture("sample_group.fdoc.meta") }
71
64
 
72
65
  context "when no service fdoc exists" do
73
- specify { expect { cli.convert(fdoc_path) }.to raise_error }
66
+ specify { expect { subject.convert(fdoc_path) }.to raise_error }
74
67
  end
75
68
 
76
69
  context "when a service fdoc exists" do
77
70
  before { with_fixture("members/members.fdoc.service") }
78
71
 
79
- it "creates a root-level html file" do
72
+ it "creates a root-level file" do
80
73
  expect do
81
- cli.convert(fdoc_path)
82
- end.to change { File.exist?(root_html) }.from(false)
74
+ subject.convert(fdoc_path)
75
+ end.to change { File.exist?(root_file) }.from(false)
83
76
  end
84
77
 
85
- it "writes the service-level html file" do
78
+ it "writes the service-level file" do
86
79
  expect do
87
- cli.convert(fdoc_path)
88
- end.to change { File.exist?(members_html) }.from(false)
80
+ subject.convert(fdoc_path)
81
+ end.to change { File.exist?(members_file) }.from(false)
89
82
  end
90
83
 
91
84
  context "when an endpoint fdoc exists" do
92
85
  before { with_fixture("members/add-PUT.fdoc") }
93
86
 
94
- it "writes the endpoint html file" do
87
+ it "writes the endpoint file" do
95
88
  expect do
96
- cli.convert(fdoc_path)
97
- end.to change { File.exist?(endpoint_html) }.from(false)
89
+ subject.convert(fdoc_path)
90
+ end.to change { File.exist?(endpoint_file) }.from(false)
98
91
  end
99
92
  end
100
93
  end
101
94
  end
102
95
 
103
- context "when there is no meta service fdoc" do
104
- let(:root_html) { File.expand_path("index.html", html_path) }
105
- let(:endpoint_html) do
106
- File.expand_path("add-PUT.html", html_path)
107
- end
96
+ shared_examples "when there is no meta service fdoc" do
108
97
 
109
98
  context "when no service fdoc exists" do
110
99
  it "creates a dummy index" do
111
100
  expect do
112
- cli.convert(fdoc_path)
113
- end.to change { File.exist?(root_html) }.from(false)
101
+ subject.convert(fdoc_path)
102
+ end.to change { File.exist?(root_file) }.from(false)
114
103
  end
115
104
  end
116
105
 
@@ -121,8 +110,8 @@ describe Fdoc::Cli do
121
110
 
122
111
  it "writes the service-level html file" do
123
112
  expect do
124
- cli.convert(fdoc_path)
125
- end.to change { File.exist?(root_html) }.from(false)
113
+ subject.convert(fdoc_path)
114
+ end.to change { File.exist?(root_file) }.from(false)
126
115
  end
127
116
 
128
117
  context "when an endpoint fdoc exists" do
@@ -130,12 +119,61 @@ describe Fdoc::Cli do
130
119
 
131
120
  it "writes the endpoint html file" do
132
121
  expect do
133
- cli.convert(fdoc_path)
134
- end.to change { File.exist?(endpoint_html) }.from(false)
122
+ subject.convert(fdoc_path)
123
+ end.to change { File.exist?(endpoint_file) }.from(false)
135
124
  end
136
125
  end
137
126
  end
138
127
  end
128
+
129
+ context "output HTML" do
130
+
131
+ context "when there is no meta service fdoc" do
132
+ let(:root_file) { File.expand_path("index.html", html_path) }
133
+ let(:members_file) do
134
+ File.expand_path("members_api/index.html", html_path)
135
+ end
136
+ let(:endpoint_file) do
137
+ File.expand_path("members_api/add-PUT.html", html_path)
138
+ end
139
+
140
+ it_behaves_like "when there is a meta service fdoc"
141
+ end
142
+
143
+ context "when there is no meta service fdoc" do
144
+ let(:root_file) { File.expand_path("index.html", html_path) }
145
+ let(:endpoint_file) do
146
+ File.expand_path("add-PUT.html", html_path)
147
+ end
148
+ it_behaves_like "when there is no meta service fdoc"
149
+ end
150
+
151
+ end
152
+
153
+ context "output Markdown" do
154
+ let(:options) { { :format => 'markdown' } }
155
+
156
+ context "when there is no meta service fdoc" do
157
+ let(:root_file) { File.expand_path("index.md", markdown_path) }
158
+ let(:members_file) do
159
+ File.expand_path("members_api/index.md", markdown_path)
160
+ end
161
+ let(:endpoint_file) do
162
+ File.expand_path("members_api/add-PUT.md", markdown_path)
163
+ end
164
+
165
+ it_behaves_like "when there is a meta service fdoc"
166
+ end
167
+
168
+ context "when there is no meta service fdoc" do
169
+ let(:root_file) { File.expand_path("index.md", markdown_path) }
170
+ let(:endpoint_file) do
171
+ File.expand_path("add-PUT.md", markdown_path)
172
+ end
173
+ it_behaves_like "when there is no meta service fdoc"
174
+ end
175
+ end
176
+
139
177
  end
140
178
  end
141
179
 
@@ -203,12 +241,21 @@ describe Fdoc::Cli do
203
241
 
204
242
  describe "#html_options" do
205
243
  let(:html_path) { "/a/great/place/to/keep/html"}
244
+ let(:template_path) { '/a/great/place/to/keep/templates' }
206
245
 
207
- before { subject.destination_root = html_path }
246
+ before do
247
+ subject.origin_path = fdoc_path
248
+ subject.destination_root = html_path
249
+ end
208
250
 
209
251
  its(:html_options) { should include(:static_html => true) }
210
252
  its(:html_options) { should include(:html_directory => html_path) }
211
253
 
254
+ context "when a template_directory is provided" do
255
+ let(:options) { { :format => 'html', :templates => template_path } }
256
+ its(:html_options) { should include(:template_directory => template_path) }
257
+ end
258
+
212
259
  context "when url_base_path is not provided" do
213
260
  its(:html_options) { should include(:url_base_path => nil) }
214
261
  end
@@ -222,7 +269,7 @@ describe Fdoc::Cli do
222
269
  end
223
270
 
224
271
  describe "#inside_service" do
225
- let(:presenter) { cli.service_presenters.first }
272
+ let(:presenter) { subject.service_presenters.first }
226
273
 
227
274
  before do
228
275
  subject.origin_path = fdoc_path
@@ -236,7 +283,7 @@ describe Fdoc::Cli do
236
283
  end
237
284
 
238
285
  it "leaves the output directory" do
239
- cli.inside_service_presenter(presenter) do
286
+ subject.inside_service_presenter(presenter) do
240
287
  Dir.pwd.should =~ %r|#{html_path}/members_api$|
241
288
  end
242
289
  end
@@ -248,7 +295,7 @@ describe Fdoc::Cli do
248
295
  end
249
296
 
250
297
  it "does not leave the output directory" do
251
- cli.inside_service_presenter(presenter) do
298
+ subject.inside_service_presenter(presenter) do
252
299
  Dir.pwd.should =~ /#{html_path}$/
253
300
  end
254
301
  end