fdoc 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/Gemfile +2 -0
  2. data/README.md +120 -0
  3. data/Rakefile +7 -0
  4. data/bin/fdoc_to_html +77 -0
  5. data/fdoc.gemspec +36 -0
  6. data/lib/endpoint-schema.yaml +30 -0
  7. data/lib/fdoc.rb +46 -0
  8. data/lib/fdoc/endpoint.rb +110 -0
  9. data/lib/fdoc/endpoint_scaffold.rb +132 -0
  10. data/lib/fdoc/meta_service.rb +46 -0
  11. data/lib/fdoc/presenters/endpoint_presenter.rb +152 -0
  12. data/lib/fdoc/presenters/html_presenter.rb +58 -0
  13. data/lib/fdoc/presenters/meta_service_presenter.rb +65 -0
  14. data/lib/fdoc/presenters/response_code_presenter.rb +32 -0
  15. data/lib/fdoc/presenters/schema_presenter.rb +138 -0
  16. data/lib/fdoc/presenters/service_presenter.rb +56 -0
  17. data/lib/fdoc/service.rb +88 -0
  18. data/lib/fdoc/spec_watcher.rb +48 -0
  19. data/lib/fdoc/templates/endpoint.html.erb +75 -0
  20. data/lib/fdoc/templates/meta_service.html.erb +60 -0
  21. data/lib/fdoc/templates/service.html.erb +54 -0
  22. data/lib/fdoc/templates/styles.css +63 -0
  23. data/spec/fdoc/endpoint_scaffold_spec.rb +242 -0
  24. data/spec/fdoc/endpoint_spec.rb +243 -0
  25. data/spec/fdoc/presenters/endpoint_presenter_spec.rb +93 -0
  26. data/spec/fdoc/presenters/service_presenter_spec.rb +18 -0
  27. data/spec/fdoc/service_spec.rb +63 -0
  28. data/spec/fixtures/members/add-PUT.fdoc +20 -0
  29. data/spec/fixtures/members/draft-POST.fdoc +5 -0
  30. data/spec/fixtures/members/list/GET.fdoc +50 -0
  31. data/spec/fixtures/members/list/complex-params-GET.fdoc +94 -0
  32. data/spec/fixtures/members/list/filter-GET.fdoc +60 -0
  33. data/spec/fixtures/members/members.fdoc.service +11 -0
  34. data/spec/fixtures/sample_group.fdoc.meta +9 -0
  35. data/spec/spec_helper.rb +2 -0
  36. metadata +174 -0
@@ -0,0 +1,93 @@
1
+ require 'spec_helper'
2
+ require 'nokogiri'
3
+
4
+ describe Fdoc::EndpointPresenter do
5
+ subject {
6
+ described_class.new(endpoint)
7
+ }
8
+
9
+ let (:test_service) { Fdoc::Service.new('spec/fixtures') }
10
+ let (:endpoint) { Fdoc::Endpoint.new("spec/fixtures/members/list/GET.fdoc", test_service) }
11
+
12
+ context "#to_html" do
13
+ it "should generate valid HTML" do
14
+ html = subject.to_html
15
+
16
+ expect {
17
+ Nokogiri::HTML(html) { |config| config.strict }
18
+ }.to_not raise_exception
19
+ end
20
+ end
21
+
22
+ context "#example_from_schema" do
23
+ example_schema_yaml = <<-EOS
24
+ properties:
25
+ name:
26
+ type: string
27
+ example: Bobby Brown
28
+ achievements:
29
+ type: array
30
+ items:
31
+ type: string
32
+ example: Most Bugs Squashed
33
+ check_in_count:
34
+ type: integer
35
+ example: 52
36
+ friends:
37
+ type: array
38
+ items:
39
+ properties:
40
+ name:
41
+ type: string
42
+ example: Freddy Friend
43
+ id:
44
+ type: integer
45
+ example: 12345
46
+ email:
47
+ type: string
48
+ address:
49
+ properties:
50
+ street_number:
51
+ type: integer
52
+ example: 1234
53
+ street_name:
54
+ type: string
55
+ example: Main St.
56
+ state:
57
+ type: string
58
+ example: CA
59
+ zip:
60
+ type: integer
61
+ example: 91234
62
+ homepage_url:
63
+ type: ['string', 'null']
64
+ format: uri
65
+ example: http://my.website.com
66
+ EOS
67
+ example_schema = YAML.load(example_schema_yaml)
68
+
69
+ expected_example = {
70
+ "name" => "Bobby Brown",
71
+ "achievements" => ["Most Bugs Squashed"],
72
+ "check_in_count" => 52,
73
+ "email" => "",
74
+ "friends" => [
75
+ {
76
+ "name" => "Freddy Friend",
77
+ "id" => 12345
78
+ }
79
+ ],
80
+ "address" => {
81
+ "street_number" => 1234,
82
+ "street_name" => "Main St.",
83
+ "state" => "CA",
84
+ "zip" => 91234
85
+ },
86
+ "homepage_url" => "http://my.website.com"
87
+ }
88
+
89
+ it "should generate an example response from the contents of the schema" do
90
+ subject.example_from_schema(example_schema).should == expected_example
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ require 'nokogiri'
3
+
4
+ describe Fdoc::ServicePresenter do
5
+ subject {
6
+ Fdoc::ServicePresenter.new(Fdoc::Service.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
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fdoc::Service do
4
+ subject { described_class.new('spec/fixtures') }
5
+
6
+ let(:verb) { 'GET' }
7
+ let(:path) { 'members/list' }
8
+
9
+ describe "#open" do
10
+ let(:scaffold_mode) { false }
11
+ context "in regular mode" do
12
+ it "returns an Endpoint object" do
13
+ endpoint = subject.open(verb, path, scaffold_mode)
14
+ endpoint.should be_kind_of(Fdoc::Endpoint)
15
+ endpoint.should_not be_kind_of(Fdoc::EndpointScaffold)
16
+ end
17
+ end
18
+
19
+ context "in scaffold mode" do
20
+ let(:scaffold_mode) { true }
21
+
22
+ it "returns an EndpointScaffold object" do
23
+ subject.open(verb, path, scaffold_mode).should be_kind_of(Fdoc::EndpointScaffold)
24
+ end
25
+ end
26
+ end
27
+
28
+ describe "#path_for" do
29
+ let(:flat_file_name) { File.expand_path('spec/fixtures/members/list-GET.fdoc') }
30
+ let(:nested_file_name) { File.expand_path('spec/fixtures/members/list/GET.fdoc') }
31
+
32
+ context "when a flat named filename exists" do
33
+ before do
34
+ File.should_receive(:exist?).with(flat_file_name).and_return(true)
35
+ end
36
+
37
+ it "returns the flat named file path" do
38
+ subject.path_for(verb, path).should == flat_file_name
39
+ end
40
+ end
41
+
42
+ context "when a no flat named named file exists, but a nested path does" do
43
+ before do
44
+ File.should_receive(:exist?).with(flat_file_name).and_return(false)
45
+ File.should_receive(:exist?).with(nested_file_name).and_return(true)
46
+ end
47
+
48
+ it "returns the nested named file path" do
49
+ subject.path_for(verb, path).should == nested_file_name
50
+ end
51
+ end
52
+
53
+ context "when no file exists" do
54
+ before do
55
+ File.stub(:exist?).and_return(false)
56
+ end
57
+
58
+ it "returns the flat named file path" do
59
+ subject.path_for(verb, path).should == flat_file_name
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,20 @@
1
+ description: Add a new member
2
+ requestParameters:
3
+ properties:
4
+ name:
5
+ type: string
6
+ required: yes
7
+ description: The name of the member to add, must be unique.
8
+ example: Max Power
9
+ email:
10
+ type: string
11
+ required: no
12
+ description: The email of the member to add
13
+ example: mpower@example.com
14
+ responseCodes:
15
+ - status: 200 OK
16
+ successful: yes
17
+ description: Returns the member just added
18
+ - status: 400 Bad Request
19
+ successful: no
20
+ description: Member already exists
@@ -0,0 +1,5 @@
1
+ scaffold: yes
2
+ description: Hypothetical endpoint, for testing scaffolding
3
+ responseCodes:
4
+ - status: 200 OK
5
+ successful: yes
@@ -0,0 +1,50 @@
1
+ description: The list of members.
2
+ requestParameters:
3
+ properties:
4
+ limit:
5
+ type: integer
6
+ required: no
7
+ default: 50
8
+ description: Limits the number of results returned, used for paging.
9
+ offset:
10
+ type: integer
11
+ required: no
12
+ default: 0
13
+ description: Offsets the results returned, used for paging.
14
+ order_by:
15
+ type: string
16
+ enum:
17
+ - name
18
+ - email
19
+ - member_since
20
+ responseParameters:
21
+ properties:
22
+ members:
23
+ type: array
24
+ items:
25
+ title: member
26
+ description: Representation of a member
27
+ type: object
28
+ properties:
29
+ name:
30
+ description: Member's name
31
+ type: string
32
+ required: yes
33
+ example: Captain Smellypants
34
+ email:
35
+ description: Member's email
36
+ type: string
37
+ required: no
38
+ example: smelly@pants.com
39
+ member_since:
40
+ description: The date the member joined
41
+ type: string
42
+ format: date-time
43
+ example: 2012-01-01T13:00:00Z
44
+ responseCodes:
45
+ - status: 200 OK
46
+ successful: yes
47
+ description: A list of current members
48
+ - status: 400 Bad Request
49
+ successful: no
50
+ description: Indicates malformed parameters
@@ -0,0 +1,94 @@
1
+ requestParameters:
2
+ type: object
3
+ properties:
4
+ toplevel_param:
5
+ type: string
6
+ description: A paramater as normal
7
+ required: Yes
8
+ optional_nested_array:
9
+ type: array
10
+ required: No
11
+ items:
12
+ type: object
13
+ properties:
14
+ required_param:
15
+ required: Yes
16
+ description: It's required
17
+ type: string
18
+ optional_param:
19
+ required: Yes
20
+ description: It's optional
21
+ type: string
22
+ required_nested_array:
23
+ type: array
24
+ required: Yes
25
+ items:
26
+ type: object
27
+ properties:
28
+ required_param:
29
+ required: Yes
30
+ description: It's required
31
+ type: string
32
+ optional_param:
33
+ required: No
34
+ description: It's optional
35
+ type: string
36
+ optional_second_nested_object:
37
+ required: No
38
+ type: object
39
+ description: It's a bug
40
+ properties:
41
+ required_param:
42
+ required: Yes
43
+ description: It's required
44
+ type: string
45
+ optional_param:
46
+ required: No
47
+ description: It's optional
48
+ type: string
49
+
50
+ optional_nested_object:
51
+ type: object
52
+ required: No
53
+ properties:
54
+ required_param:
55
+ required: Yes
56
+ description: It's required
57
+ type: string
58
+ optional_param:
59
+ required: No
60
+ description: It's optional
61
+ type: string
62
+ required_nested_object:
63
+ type: object
64
+ required: Yes
65
+ properties:
66
+ required_param:
67
+ required: Yes
68
+ description: It's required
69
+ type: string
70
+ optional_param:
71
+ required: No
72
+ description: It's optional
73
+ type: string
74
+ optional_second_nested_object:
75
+ required: No
76
+ type: object
77
+ description: It's a bug
78
+ properties:
79
+ required_param:
80
+ required: Yes
81
+ description: It's required
82
+ type: string
83
+ optional_param:
84
+ required: No
85
+ description: It's optional
86
+ type: string
87
+
88
+ responseParameters:
89
+ type: string
90
+ description: Nothing important
91
+ responseCodes:
92
+ - status: 200 OK
93
+ successful: yes
94
+ description: A list of current members
@@ -0,0 +1,60 @@
1
+ description: The list of members, filtered by params
2
+ requestParameters:
3
+ type: object
4
+ properties:
5
+ limit:
6
+ type: integer
7
+ required: no
8
+ default: 50
9
+ description: Limits the number of results returned, used for paging.
10
+ offset:
11
+ type: integer
12
+ required: no
13
+ default: 0
14
+ description: Offsets the results returned, used for paging.
15
+ older_than:
16
+ type: string
17
+ format: date-time
18
+ required: no
19
+ description: |
20
+ If provided, results returned will only be updated before
21
+ the given date (exclusive)
22
+ newer_than:
23
+ type: string
24
+ format: date-time
25
+ required: no
26
+ description: |
27
+ If provided, results returned will only be updated after
28
+ the given date (inclusive)
29
+ responseParameters:
30
+ type: object
31
+ properties:
32
+ members:
33
+ type: array
34
+ items:
35
+ title: member
36
+ description: Representation of a member
37
+ type: object
38
+ properties:
39
+ name:
40
+ description: Member's name
41
+ type: string
42
+ required: yes
43
+ example: Captain Smellypants
44
+ email:
45
+ description: Member's email
46
+ type: string
47
+ required: no
48
+ example: smelly@pants.com
49
+ member_since:
50
+ description: The date the member joined
51
+ type: string
52
+ format: date-time
53
+ example: 2012-01-01T13:00:00Z
54
+ responseCodes:
55
+ - status: 200 OK
56
+ successful: yes
57
+ description: A list of current members
58
+ - status: 400 Bad Request
59
+ successful: no
60
+ description: Indicates malformed parameters
@@ -0,0 +1,11 @@
1
+ name: Members API
2
+ basePath: https://api.sample.com/members
3
+ description: |
4
+ This service is used for lots of fun things
5
+
6
+ * It would not make for a very exciting REST API, but
7
+ that's perfectly acceptable for a fixture file.
8
+ * These bullets are mostly to demonstrate Markdown interpolation
9
+ discussion: |
10
+ This is room at the bottom of the page for more details about
11
+ this service.
@@ -0,0 +1,9 @@
1
+ name: fdoc Sample API
2
+ description: |
3
+ This is a sample meta service, it encompasses only one service
4
+ for now.
5
+ discussion: |
6
+ This is room at the bottom of the page for more details about
7
+ this service.
8
+ services:
9
+ - ./members
@@ -0,0 +1,2 @@
1
+ require 'fdoc'
2
+ require 'rspec'
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fdoc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matt Wilson
9
+ - Zach Margolis
10
+ - Sean Sorrell
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2011-11-07 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: json
18
+ requirement: &70339438797600 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: '0'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *70339438797600
27
+ - !ruby/object:Gem::Dependency
28
+ name: json-schema
29
+ requirement: &70339438796920 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: 1.0.1
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: *70339438796920
38
+ - !ruby/object:Gem::Dependency
39
+ name: kramdown
40
+ requirement: &70339438796340 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ type: :runtime
47
+ prerelease: false
48
+ version_requirements: *70339438796340
49
+ - !ruby/object:Gem::Dependency
50
+ name: rake
51
+ requirement: &70339438792260 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: *70339438792260
60
+ - !ruby/object:Gem::Dependency
61
+ name: rspec
62
+ requirement: &70339438791760 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ~>
66
+ - !ruby/object:Gem::Version
67
+ version: '2.5'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: *70339438791760
71
+ - !ruby/object:Gem::Dependency
72
+ name: nokogiri
73
+ requirement: &70339438791300 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: *70339438791300
82
+ - !ruby/object:Gem::Dependency
83
+ name: cane
84
+ requirement: &70339438790760 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: *70339438790760
93
+ description: A tool for documenting API endpoints.
94
+ email: support@squareup.com
95
+ executables:
96
+ - fdoc_to_html
97
+ extensions: []
98
+ extra_rdoc_files:
99
+ - README.md
100
+ files:
101
+ - lib/endpoint-schema.yaml
102
+ - lib/fdoc/endpoint.rb
103
+ - lib/fdoc/endpoint_scaffold.rb
104
+ - lib/fdoc/meta_service.rb
105
+ - lib/fdoc/presenters/endpoint_presenter.rb
106
+ - lib/fdoc/presenters/html_presenter.rb
107
+ - lib/fdoc/presenters/meta_service_presenter.rb
108
+ - lib/fdoc/presenters/response_code_presenter.rb
109
+ - lib/fdoc/presenters/schema_presenter.rb
110
+ - lib/fdoc/presenters/service_presenter.rb
111
+ - lib/fdoc/service.rb
112
+ - lib/fdoc/spec_watcher.rb
113
+ - lib/fdoc/templates/endpoint.html.erb
114
+ - lib/fdoc/templates/meta_service.html.erb
115
+ - lib/fdoc/templates/service.html.erb
116
+ - lib/fdoc/templates/styles.css
117
+ - lib/fdoc.rb
118
+ - spec/fdoc/endpoint_scaffold_spec.rb
119
+ - spec/fdoc/endpoint_spec.rb
120
+ - spec/fdoc/presenters/endpoint_presenter_spec.rb
121
+ - spec/fdoc/presenters/service_presenter_spec.rb
122
+ - spec/fdoc/service_spec.rb
123
+ - spec/fixtures/members/add-PUT.fdoc
124
+ - spec/fixtures/members/draft-POST.fdoc
125
+ - spec/fixtures/members/list/complex-params-GET.fdoc
126
+ - spec/fixtures/members/list/filter-GET.fdoc
127
+ - spec/fixtures/members/list/GET.fdoc
128
+ - spec/fixtures/members/members.fdoc.service
129
+ - spec/fixtures/sample_group.fdoc.meta
130
+ - spec/spec_helper.rb
131
+ - fdoc.gemspec
132
+ - Rakefile
133
+ - README.md
134
+ - Gemfile
135
+ - bin/fdoc_to_html
136
+ homepage: http://github.com/square/fdoc
137
+ licenses: []
138
+ post_install_message:
139
+ rdoc_options:
140
+ - --charset=UTF-8
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ none: false
145
+ requirements:
146
+ - - ! '>='
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - ! '>='
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ requirements: []
156
+ rubyforge_project:
157
+ rubygems_version: 1.8.15
158
+ signing_key:
159
+ specification_version: 3
160
+ summary: A tool for documenting API endpoints.
161
+ test_files:
162
+ - spec/fdoc/endpoint_scaffold_spec.rb
163
+ - spec/fdoc/endpoint_spec.rb
164
+ - spec/fdoc/presenters/endpoint_presenter_spec.rb
165
+ - spec/fdoc/presenters/service_presenter_spec.rb
166
+ - spec/fdoc/service_spec.rb
167
+ - spec/fixtures/members/add-PUT.fdoc
168
+ - spec/fixtures/members/draft-POST.fdoc
169
+ - spec/fixtures/members/list/complex-params-GET.fdoc
170
+ - spec/fixtures/members/list/filter-GET.fdoc
171
+ - spec/fixtures/members/list/GET.fdoc
172
+ - spec/fixtures/members/members.fdoc.service
173
+ - spec/fixtures/sample_group.fdoc.meta
174
+ - spec/spec_helper.rb