fdoc 0.3.0 → 0.3.1
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/README.md +15 -0
- data/lib/fdoc.rb +2 -1
- data/lib/fdoc/cli.rb +53 -15
- data/lib/fdoc/meta_service.rb +1 -1
- data/lib/fdoc/presenters/{html_presenter.rb → base_presenter.rb} +12 -17
- data/lib/fdoc/presenters/endpoint_presenter.rb +22 -24
- data/lib/fdoc/presenters/json_presenter.rb +31 -0
- data/lib/fdoc/presenters/meta_service_presenter.rb +25 -6
- data/lib/fdoc/presenters/response_code_presenter.rb +13 -4
- data/lib/fdoc/presenters/schema_presenter.rb +36 -4
- data/lib/fdoc/presenters/service_presenter.rb +25 -6
- data/lib/fdoc/templates/endpoint.html.erb +5 -5
- data/lib/fdoc/templates/endpoint.md.erb +40 -0
- data/lib/fdoc/templates/meta_service.html.erb +3 -1
- data/lib/fdoc/templates/meta_service.md.erb +20 -0
- data/lib/fdoc/templates/service.html.erb +4 -2
- data/lib/fdoc/templates/service.md.erb +18 -0
- data/lib/fdoc/templates/shared/endpoint_name.html.erb +8 -0
- data/lib/fdoc/templates/shared/endpoint_name.md.erb +1 -0
- data/lib/fdoc/templates/styles.css +1 -1
- data/spec/fdoc/cli_spec.rb +87 -40
- data/spec/fdoc/endpoint_scaffold_spec.rb +5 -5
- data/spec/fdoc/endpoint_spec.rb +18 -18
- data/spec/fdoc/presenters/base_presenter_spec.rb +28 -0
- data/spec/fdoc/presenters/endpoint_presenter_spec.rb +8 -1
- data/spec/fdoc/presenters/meta_service_presenter_spec.rb +38 -0
- data/spec/fdoc/presenters/schema_presenter_spec.rb +34 -0
- data/spec/fdoc/presenters/service_presenter_spec.rb +24 -1
- data/spec/fixtures/members/list/complex-params-GET.fdoc +20 -20
- data/spec/spec_helper.rb +1 -0
- metadata +14 -2
@@ -81,9 +81,9 @@ describe Fdoc::EndpointScaffold do
|
|
81
81
|
subject.request_parameters["properties"].should have_key "with_symbol"
|
82
82
|
subject.request_parameters["properties"].should_not have_key :with_symbol
|
83
83
|
subject.request_parameters["properties"].should have_key "with_string"
|
84
|
-
subject.request_parameters["properties"].should_not have_key :with_string
|
84
|
+
subject.request_parameters["properties"].should_not have_key :with_string
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
it "uses strings (not symbols) for keys of nested hashes" do
|
88
88
|
mixed_params = {
|
89
89
|
"nested_object" => {
|
@@ -95,14 +95,14 @@ describe Fdoc::EndpointScaffold do
|
|
95
95
|
subject.consume_request(mixed_params)
|
96
96
|
subject.request_parameters["properties"]["nested_object"]["properties"].keys.sort.should == ["with_string", "with_symbol"]
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
99
|
it "uses strings (not symbols) for nested hashes inside arrays" do
|
100
100
|
mixed_params = {
|
101
101
|
"nested_array" => [
|
102
102
|
{
|
103
103
|
:with_symbol => false,
|
104
104
|
"with_string" => true
|
105
|
-
}
|
105
|
+
}
|
106
106
|
]
|
107
107
|
}
|
108
108
|
|
@@ -214,7 +214,7 @@ describe Fdoc::EndpointScaffold do
|
|
214
214
|
subject.response_parameters["properties"].should have_key "with_symbol"
|
215
215
|
subject.response_parameters["properties"].should_not have_key :with_symbol
|
216
216
|
subject.response_parameters["properties"].should have_key "with_string"
|
217
|
-
subject.response_parameters["properties"].should_not have_key :with_string
|
217
|
+
subject.response_parameters["properties"].should_not have_key :with_string
|
218
218
|
end
|
219
219
|
|
220
220
|
it "produces a valid JSON schema for the response" do
|
data/spec/fdoc/endpoint_spec.rb
CHANGED
@@ -5,7 +5,7 @@ describe Fdoc::Endpoint do
|
|
5
5
|
let(:fdoc_fixture) { ["GET", "members/list"] }
|
6
6
|
let (:test_service) { Fdoc::Service.new('spec/fixtures') }
|
7
7
|
subject { endpoint }
|
8
|
-
|
8
|
+
|
9
9
|
def remove_optional(obj)
|
10
10
|
case obj
|
11
11
|
when Hash
|
@@ -42,7 +42,7 @@ describe Fdoc::Endpoint do
|
|
42
42
|
"order_by" => "name"
|
43
43
|
}
|
44
44
|
}
|
45
|
-
|
45
|
+
|
46
46
|
context "with a well-behaved request" do
|
47
47
|
it "returns true" do
|
48
48
|
subject.should be_true
|
@@ -67,12 +67,12 @@ describe Fdoc::Endpoint do
|
|
67
67
|
|
68
68
|
context "when the response encounters an object of an known type" do
|
69
69
|
before { params.merge!("offset" => "woot") }
|
70
|
-
|
70
|
+
|
71
71
|
it "should have the Ruby type in the error message" do
|
72
72
|
expect { subject }.to raise_exception(JSON::Schema::ValidationError, /String/)
|
73
73
|
end
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
context "complex examples" do
|
77
77
|
let(:fdoc_fixture) { ["GET", "/members/list/complex-params"] }
|
78
78
|
let(:params) {
|
@@ -83,7 +83,7 @@ describe Fdoc::Endpoint do
|
|
83
83
|
"required_param" => "here",
|
84
84
|
"optional_param" => "here"
|
85
85
|
}
|
86
|
-
],
|
86
|
+
],
|
87
87
|
"required_nested_array" => [
|
88
88
|
{
|
89
89
|
"required_param" => "here",
|
@@ -93,7 +93,7 @@ describe Fdoc::Endpoint do
|
|
93
93
|
"optional_param" => "here"
|
94
94
|
}
|
95
95
|
},
|
96
|
-
],
|
96
|
+
],
|
97
97
|
"optional_nested_object" => {
|
98
98
|
"required_param" => "here",
|
99
99
|
"optional_param" => "here"
|
@@ -108,30 +108,30 @@ describe Fdoc::Endpoint do
|
|
108
108
|
},
|
109
109
|
}
|
110
110
|
}
|
111
|
-
|
111
|
+
|
112
112
|
it "is successful" do
|
113
113
|
subject.should be_true
|
114
114
|
end
|
115
|
-
|
116
|
-
context "with no optional keys" do
|
115
|
+
|
116
|
+
context "with no optional keys" do
|
117
117
|
before { remove_optional(params) }
|
118
118
|
|
119
119
|
it "does not contain optional keys" do
|
120
120
|
params.keys.sort.should == ["required_nested_array", "required_nested_object", "toplevel_param"]
|
121
121
|
end
|
122
|
-
|
122
|
+
|
123
123
|
it "is successful" do
|
124
124
|
subject.should be_true
|
125
|
-
end
|
125
|
+
end
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
context "non documented field added" do
|
129
129
|
before { params.merge!("non_documented" => true) }
|
130
130
|
it "raises an error" do
|
131
131
|
expect { subject }.to raise_exception(JSON::Schema::ValidationError, /non_documented/)
|
132
132
|
end
|
133
133
|
end
|
134
|
-
|
134
|
+
|
135
135
|
context "non document field in an optional array" do
|
136
136
|
before { params["optional_nested_array"][0].merge!("non_documented" => true) }
|
137
137
|
|
@@ -139,7 +139,7 @@ describe Fdoc::Endpoint do
|
|
139
139
|
expect { subject }.to raise_exception(JSON::Schema::ValidationError, /non_documented/)
|
140
140
|
end
|
141
141
|
end
|
142
|
-
|
142
|
+
|
143
143
|
context "non document field in a required array" do
|
144
144
|
before { params["required_nested_array"][0].merge!("non_documented" => true) }
|
145
145
|
|
@@ -163,7 +163,7 @@ describe Fdoc::Endpoint do
|
|
163
163
|
expect { subject }.to raise_exception(JSON::Schema::ValidationError, /non_documented/)
|
164
164
|
end
|
165
165
|
end
|
166
|
-
|
166
|
+
|
167
167
|
context "non document field in a deeply nested object" do
|
168
168
|
before { params["required_nested_object"]["optional_second_nested_object"].merge!("non_documented" => true) }
|
169
169
|
|
@@ -171,7 +171,7 @@ describe Fdoc::Endpoint do
|
|
171
171
|
expect { subject }.to raise_exception(JSON::Schema::ValidationError, /non_documented/)
|
172
172
|
end
|
173
173
|
end
|
174
|
-
|
174
|
+
|
175
175
|
context "required field in a deeply nested object is missing" do
|
176
176
|
before { params["required_nested_object"]["optional_second_nested_object"].delete("required_param") }
|
177
177
|
|
@@ -179,7 +179,7 @@ describe Fdoc::Endpoint do
|
|
179
179
|
expect { subject }.to raise_exception(JSON::Schema::ValidationError, /required_param/)
|
180
180
|
end
|
181
181
|
end
|
182
|
-
|
182
|
+
|
183
183
|
context "non document field in a deeply nested object in an array" do
|
184
184
|
before { params["required_nested_array"][0]["optional_second_nested_object"].merge!("non_documented" => true) }
|
185
185
|
|
@@ -187,7 +187,7 @@ describe Fdoc::Endpoint do
|
|
187
187
|
expect { subject }.to raise_exception(JSON::Schema::ValidationError, /non_documented/)
|
188
188
|
end
|
189
189
|
end
|
190
|
-
|
190
|
+
|
191
191
|
context "required field in a deeply nested object is missing" do
|
192
192
|
before { params["required_nested_array"][0]["optional_second_nested_object"].delete("required_param") }
|
193
193
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
describe Fdoc::BasePresenter do
|
5
|
+
class Fdoc::SamplePresenter < Fdoc::BasePresenter
|
6
|
+
def to_html
|
7
|
+
render_erb('test.html.erb')
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
subject {
|
12
|
+
Fdoc::SamplePresenter.new template_directory: 'templates'
|
13
|
+
}
|
14
|
+
|
15
|
+
context "#render_erb" do
|
16
|
+
it "renders a default template" do
|
17
|
+
File.should_receive(:exists?).with('templates/test.html.erb').and_return(false)
|
18
|
+
File.stub(:read).and_return('test content')
|
19
|
+
subject.to_html
|
20
|
+
end
|
21
|
+
|
22
|
+
it "renders from local template directory" do
|
23
|
+
File.should_receive(:exists?).with('templates/test.html.erb').and_return(true)
|
24
|
+
File.should_receive(:read).with('templates/test.html.erb').and_return('test content')
|
25
|
+
subject.to_html
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -19,6 +19,13 @@ describe Fdoc::EndpointPresenter do
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
context "#to_markdown" do
|
23
|
+
it "should generate markdown" do
|
24
|
+
markdown = subject.to_markdown
|
25
|
+
markdown.should include "# GET spec​/fixtures​/members​/list"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
22
29
|
context "#example_from_schema" do
|
23
30
|
example_schema_yaml = <<-EOS
|
24
31
|
properties:
|
@@ -90,4 +97,4 @@ describe Fdoc::EndpointPresenter do
|
|
90
97
|
subject.example_from_schema(example_schema).should == expected_example
|
91
98
|
end
|
92
99
|
end
|
93
|
-
end
|
100
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
describe Fdoc::MetaServicePresenter do
|
5
|
+
subject {
|
6
|
+
Fdoc::MetaServicePresenter.new(Fdoc::MetaService.new('spec/fixtures'))
|
7
|
+
}
|
8
|
+
|
9
|
+
context "#to_html" do
|
10
|
+
it "should generate valid HTML" do
|
11
|
+
html = subject.to_html
|
12
|
+
|
13
|
+
expect {
|
14
|
+
Nokogiri::HTML(html) { |config| config.strict }
|
15
|
+
}.to_not raise_exception
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "#to_markdown" do
|
20
|
+
it "should generate markdown" do
|
21
|
+
markdown = subject.to_markdown
|
22
|
+
markdown.should include "* PUT [https:​/​/api.sample.com​/members​/add](members_api/add-PUT.md)"
|
23
|
+
markdown.should include "* POST [https:​/​/api.sample.com​/members​/draft](members_api/draft-POST.md)"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "#relative_service_path" do
|
28
|
+
let(:service) { subject.services.first }
|
29
|
+
|
30
|
+
it "returns relative path" do
|
31
|
+
subject.relative_service_path(service).should == "members_api"
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should join relative path if passed in a filename" do
|
35
|
+
subject.relative_service_path(service, 'index.md').should == "members_api/index.md"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
describe Fdoc::SchemaPresenter do
|
5
|
+
let(:schema) {
|
6
|
+
{
|
7
|
+
'description' => 'Some description text',
|
8
|
+
'example' => 'an example'
|
9
|
+
}
|
10
|
+
}
|
11
|
+
subject {
|
12
|
+
Fdoc::SchemaPresenter.new(schema, {})
|
13
|
+
}
|
14
|
+
|
15
|
+
context '#to_html' do
|
16
|
+
it 'should generate valid HTML' do
|
17
|
+
html = subject.to_html
|
18
|
+
|
19
|
+
html.should include 'Some description text'
|
20
|
+
html.should include 'an example'
|
21
|
+
expect {
|
22
|
+
Nokogiri::HTML(html) { |config| config.strict }
|
23
|
+
}.to_not raise_exception
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "#to_markdown" do
|
28
|
+
it "should generate markdown" do
|
29
|
+
markdown = subject.to_markdown
|
30
|
+
markdown.should include 'Some description text'
|
31
|
+
markdown.should include 'an example'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -3,7 +3,7 @@ require 'nokogiri'
|
|
3
3
|
|
4
4
|
describe Fdoc::ServicePresenter do
|
5
5
|
subject {
|
6
|
-
Fdoc::ServicePresenter.new(Fdoc::Service.new('spec/fixtures'))
|
6
|
+
Fdoc::ServicePresenter.new(Fdoc::Service.new('spec/fixtures/members'))
|
7
7
|
}
|
8
8
|
|
9
9
|
context "#to_html" do
|
@@ -15,4 +15,27 @@ describe Fdoc::ServicePresenter do
|
|
15
15
|
}.to_not raise_exception
|
16
16
|
end
|
17
17
|
end
|
18
|
+
|
19
|
+
context "#to_markdown" do
|
20
|
+
it "should generate markdown" do
|
21
|
+
markdown = subject.to_markdown
|
22
|
+
markdown.should include "* PUT [https:​/​/api.sample.com​/members​/add](add-PUT.md)"
|
23
|
+
markdown.should include "* POST [https:​/​/api.sample.com​/members​/draft](draft-POST.md)"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "#relative_meta_service_path" do
|
28
|
+
let(:meta_service) { Fdoc::MetaServicePresenter.new(Fdoc::MetaService.new('spec/fixtures')) }
|
29
|
+
before do
|
30
|
+
subject.service.meta_service = meta_service
|
31
|
+
end
|
32
|
+
|
33
|
+
its(:relative_meta_service_path) { should == "../"}
|
34
|
+
|
35
|
+
context "pass in filename" do
|
36
|
+
it "should join with filename" do
|
37
|
+
subject.relative_meta_service_path('index.md').should == "../index.md"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
18
41
|
end
|
@@ -4,84 +4,84 @@ requestParameters:
|
|
4
4
|
toplevel_param:
|
5
5
|
type: string
|
6
6
|
description: A paramater as normal
|
7
|
-
required:
|
7
|
+
required: yes
|
8
8
|
optional_nested_array:
|
9
9
|
type: array
|
10
|
-
required:
|
10
|
+
required: no
|
11
11
|
items:
|
12
12
|
type: object
|
13
13
|
properties:
|
14
14
|
required_param:
|
15
|
-
required:
|
15
|
+
required: yes
|
16
16
|
description: It's required
|
17
17
|
type: string
|
18
18
|
optional_param:
|
19
|
-
required:
|
19
|
+
required: yes
|
20
20
|
description: It's optional
|
21
21
|
type: string
|
22
22
|
required_nested_array:
|
23
23
|
type: array
|
24
|
-
required:
|
24
|
+
required: yes
|
25
25
|
items:
|
26
26
|
type: object
|
27
27
|
properties:
|
28
28
|
required_param:
|
29
|
-
required:
|
29
|
+
required: yes
|
30
30
|
description: It's required
|
31
31
|
type: string
|
32
32
|
optional_param:
|
33
|
-
required:
|
33
|
+
required: no
|
34
34
|
description: It's optional
|
35
35
|
type: string
|
36
36
|
optional_second_nested_object:
|
37
|
-
required:
|
37
|
+
required: no
|
38
38
|
type: object
|
39
39
|
description: It's a bug
|
40
40
|
properties:
|
41
41
|
required_param:
|
42
|
-
required:
|
42
|
+
required: yes
|
43
43
|
description: It's required
|
44
44
|
type: string
|
45
45
|
optional_param:
|
46
|
-
required:
|
46
|
+
required: no
|
47
47
|
description: It's optional
|
48
48
|
type: string
|
49
|
-
|
49
|
+
|
50
50
|
optional_nested_object:
|
51
51
|
type: object
|
52
|
-
required:
|
52
|
+
required: no
|
53
53
|
properties:
|
54
54
|
required_param:
|
55
|
-
required:
|
55
|
+
required: yes
|
56
56
|
description: It's required
|
57
57
|
type: string
|
58
58
|
optional_param:
|
59
|
-
required:
|
59
|
+
required: no
|
60
60
|
description: It's optional
|
61
61
|
type: string
|
62
62
|
required_nested_object:
|
63
63
|
type: object
|
64
|
-
required:
|
64
|
+
required: yes
|
65
65
|
properties:
|
66
66
|
required_param:
|
67
|
-
required:
|
67
|
+
required: yes
|
68
68
|
description: It's required
|
69
69
|
type: string
|
70
70
|
optional_param:
|
71
|
-
required:
|
71
|
+
required: no
|
72
72
|
description: It's optional
|
73
73
|
type: string
|
74
74
|
optional_second_nested_object:
|
75
|
-
required:
|
75
|
+
required: no
|
76
76
|
type: object
|
77
77
|
description: It's a bug
|
78
78
|
properties:
|
79
79
|
required_param:
|
80
|
-
required:
|
80
|
+
required: yes
|
81
81
|
description: It's required
|
82
82
|
type: string
|
83
83
|
optional_param:
|
84
|
-
required:
|
84
|
+
required: no
|
85
85
|
description: It's optional
|
86
86
|
type: string
|
87
87
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fdoc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -170,8 +170,9 @@ files:
|
|
170
170
|
- lib/fdoc/endpoint.rb
|
171
171
|
- lib/fdoc/endpoint_scaffold.rb
|
172
172
|
- lib/fdoc/meta_service.rb
|
173
|
+
- lib/fdoc/presenters/base_presenter.rb
|
173
174
|
- lib/fdoc/presenters/endpoint_presenter.rb
|
174
|
-
- lib/fdoc/presenters/
|
175
|
+
- lib/fdoc/presenters/json_presenter.rb
|
175
176
|
- lib/fdoc/presenters/meta_service_presenter.rb
|
176
177
|
- lib/fdoc/presenters/response_code_presenter.rb
|
177
178
|
- lib/fdoc/presenters/schema_presenter.rb
|
@@ -179,14 +180,22 @@ files:
|
|
179
180
|
- lib/fdoc/service.rb
|
180
181
|
- lib/fdoc/spec_watcher.rb
|
181
182
|
- lib/fdoc/templates/endpoint.html.erb
|
183
|
+
- lib/fdoc/templates/endpoint.md.erb
|
182
184
|
- lib/fdoc/templates/meta_service.html.erb
|
185
|
+
- lib/fdoc/templates/meta_service.md.erb
|
183
186
|
- lib/fdoc/templates/service.html.erb
|
187
|
+
- lib/fdoc/templates/service.md.erb
|
188
|
+
- lib/fdoc/templates/shared/endpoint_name.html.erb
|
189
|
+
- lib/fdoc/templates/shared/endpoint_name.md.erb
|
184
190
|
- lib/fdoc/templates/styles.css
|
185
191
|
- lib/fdoc.rb
|
186
192
|
- spec/fdoc/cli_spec.rb
|
187
193
|
- spec/fdoc/endpoint_scaffold_spec.rb
|
188
194
|
- spec/fdoc/endpoint_spec.rb
|
195
|
+
- spec/fdoc/presenters/base_presenter_spec.rb
|
189
196
|
- spec/fdoc/presenters/endpoint_presenter_spec.rb
|
197
|
+
- spec/fdoc/presenters/meta_service_presenter_spec.rb
|
198
|
+
- spec/fdoc/presenters/schema_presenter_spec.rb
|
190
199
|
- spec/fdoc/presenters/service_presenter_spec.rb
|
191
200
|
- spec/fdoc/service_spec.rb
|
192
201
|
- spec/fdoc/spec_watcher_spec.rb
|
@@ -233,7 +242,10 @@ test_files:
|
|
233
242
|
- spec/fdoc/cli_spec.rb
|
234
243
|
- spec/fdoc/endpoint_scaffold_spec.rb
|
235
244
|
- spec/fdoc/endpoint_spec.rb
|
245
|
+
- spec/fdoc/presenters/base_presenter_spec.rb
|
236
246
|
- spec/fdoc/presenters/endpoint_presenter_spec.rb
|
247
|
+
- spec/fdoc/presenters/meta_service_presenter_spec.rb
|
248
|
+
- spec/fdoc/presenters/schema_presenter_spec.rb
|
237
249
|
- spec/fdoc/presenters/service_presenter_spec.rb
|
238
250
|
- spec/fdoc/service_spec.rb
|
239
251
|
- spec/fdoc/spec_watcher_spec.rb
|