fdoc 0.2.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.
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