api_docs 0.0.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/Gemfile +8 -0
  2. data/{LICENSE.txt → LICENSE} +0 -0
  3. data/README.md +67 -148
  4. data/Rakefile +29 -14
  5. data/VERSION +1 -1
  6. data/api_docs.gemspec +66 -25
  7. data/app/assets/javascripts/api_docs.js +11 -0
  8. data/app/assets/stylesheets/api_docs.css +62 -0
  9. data/app/controllers/api_docs/docs_controller.rb +8 -0
  10. data/app/views/api_docs/docs/_action.html.erb +41 -0
  11. data/app/views/api_docs/docs/_request_params.html.erb +16 -0
  12. data/app/views/api_docs/docs/index.html.erb +32 -0
  13. data/config/routes.rb +3 -0
  14. data/lib/api_docs/configuration.rb +16 -11
  15. data/lib/api_docs/engine.rb +3 -6
  16. data/lib/api_docs/test_helper.rb +81 -0
  17. data/lib/api_docs.rb +4 -26
  18. data/script/rails +8 -0
  19. data/test/api_docs_test.rb +15 -0
  20. data/test/docs_controller_test.rb +11 -0
  21. data/test/dummy/README.rdoc +261 -0
  22. data/test/dummy/Rakefile +7 -0
  23. data/test/dummy/app/assets/images/glyphicons-halflings-white.png +0 -0
  24. data/test/dummy/app/assets/images/glyphicons-halflings.png +0 -0
  25. data/test/dummy/app/assets/javascripts/application.js +16 -0
  26. data/test/dummy/app/assets/javascripts/bootstrap.min.js +6 -0
  27. data/test/dummy/app/assets/stylesheets/application.css +14 -0
  28. data/test/dummy/app/assets/stylesheets/bootstrap.min.css +9 -0
  29. data/test/dummy/app/controllers/application_controller.rb +25 -0
  30. data/test/dummy/app/helpers/application_helper.rb +2 -0
  31. data/test/dummy/app/mailers/.gitkeep +0 -0
  32. data/test/dummy/app/models/.gitkeep +0 -0
  33. data/test/dummy/app/views/layouts/application.html.erb +16 -0
  34. data/test/dummy/config/application.rb +65 -0
  35. data/test/dummy/config/boot.rb +10 -0
  36. data/test/dummy/config/environment.rb +5 -0
  37. data/test/dummy/config/environments/development.rb +31 -0
  38. data/test/dummy/config/environments/production.rb +64 -0
  39. data/test/dummy/config/environments/test.rb +35 -0
  40. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  41. data/test/dummy/config/initializers/inflections.rb +15 -0
  42. data/test/dummy/config/initializers/mime_types.rb +5 -0
  43. data/test/dummy/config/initializers/secret_token.rb +7 -0
  44. data/test/dummy/config/initializers/session_store.rb +8 -0
  45. data/test/dummy/config/initializers/wrap_parameters.rb +10 -0
  46. data/test/dummy/config/locales/en.yml +5 -0
  47. data/test/dummy/config/routes.rb +4 -0
  48. data/test/dummy/config.ru +4 -0
  49. data/test/dummy/lib/assets/.gitkeep +0 -0
  50. data/test/dummy/log/.gitkeep +0 -0
  51. data/test/dummy/public/404.html +26 -0
  52. data/test/dummy/public/422.html +26 -0
  53. data/test/dummy/public/500.html +25 -0
  54. data/test/dummy/public/favicon.ico +0 -0
  55. data/test/dummy/script/rails +6 -0
  56. data/test/test_helper.rb +14 -0
  57. data/test/test_helper_test.rb +104 -0
  58. metadata +119 -79
  59. data/app/assets/javascripts/api_docs.js.coffee +0 -37
  60. data/app/assets/javascripts/prettify.js +0 -28
  61. data/app/assets/stylesheets/prettify.css +0 -53
  62. data/app/views/api_docs/_api_docs.html.haml +0 -11
  63. data/app/views/api_docs/_curl.html.haml +0 -4
  64. data/app/views/api_docs/_form.html.haml +0 -18
  65. data/app/views/api_docs/_panel.html.haml +0 -33
  66. data/app/views/api_docs/_params.html.haml +0 -15
  67. data/app/views/api_docs/_response.html.haml +0 -16
  68. data/lib/api_docs/railtie.rb +0 -12
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'rails', '>=3.1.0'
4
+ gem 'jquery-rails'
5
+
6
+ group :development do
7
+ gem 'jeweler'
8
+ end
File without changes
data/README.md CHANGED
@@ -1,166 +1,82 @@
1
- # API docs
2
-
3
- A tool to help you generate documentation for you API
1
+ # API Docs [![Build Status](https://secure.travis-ci.org/twg/api_docs.png)](http://travis-ci.org/twg/api_docs)
2
+ A tool to help you generate documentation for your API using integration tests in Rails 3.
4
3
 
5
4
 
6
5
  ## Installation
6
+ Add gem definition to your Gemfile and `bundle install`:
7
7
 
8
- Add gem definition to your Gemfile:
9
-
10
- ``` ruby
8
+ ```
11
9
  gem 'api_docs'
12
10
  ```
13
-
14
- Bundle it:
15
-
16
- bundle install
17
11
 
18
- Add [Twitter bootstrap](http://twitter.github.com/bootstrap) and [Google code pretifyer](http://google-code-prettify.googlecode.com/svn/trunk/README.html) to you CSS manifest file
12
+ To access generated docs mount it to a path in your `routes.rb` like this:
19
13
 
20
- ``` js
21
- //= require bootstrap
22
- //= require prettify
14
+ ``` ruby
15
+ mount ApiDocs::Engine => '/api-docs'
23
16
  ```
24
17
 
25
- Here's what you Javascript manifest file should look like
18
+ You may also want to add js/css to your asset pipeline manifests:
26
19
 
27
- ``` js
28
- //= require jquery
29
- //= require jquery_ujs
30
- //= require bootstrap
31
- //= require prettify
32
- //= require api_docs
33
20
  ```
21
+ require api_docs
22
+ ```
23
+
24
+ Documents view is made to work with [Twitter Bootstrap](http://twitter.github.com/bootstrap) css and js libraries.
34
25
 
35
- Add your API documentation files to the /doc/api folder and in your view do:
26
+ ## Generating Api Docs
27
+ Documentation is automatically generated into yaml files from tests you create to test your api controllers. To start, let's create integration test by running `rails g integration_test users`. This will create a file for you to work with. Here's a simple test we can do:
36
28
 
37
29
  ``` ruby
38
- = render_api_docs %w{login users overview}
30
+ class UsersTest < ActionDispatch::IntegrationTest
31
+ def test_get_user
32
+ user = users(:default)
33
+ api_call(:get, '/users/:id', :id => user.to_param) do |doc|
34
+ assert_response :success
35
+ assert_equal ({
36
+ 'id' => user.id,
37
+ 'name' => user.name
38
+ }), JSON.parse(response.body)
39
+ end
40
+ end
41
+
42
+ def test_get_user_failure
43
+ api_call(:get, '/users/:id', :id => 'invalid') do |doc|
44
+ doc.description = 'When bad user id is passed'
45
+ assert_response :not_found
46
+ assert_equal ({
47
+ 'message' => 'User not found'
48
+ }), JSON.parse(response.body)
49
+ end
50
+ end
51
+ end
39
52
  ```
40
53
 
41
- ## The API documentation files
42
-
43
- Here's a sample API for users
44
-
45
- ``` yaml
46
- 'List':
47
- url: '/users'
48
- method: GET
49
- description: Returns a list of users
50
- params:
51
- api_key:
52
- keyword: "a string of one or more words used to filter the users by first_name, last_name and email (optional)"
53
- success:
54
- response: 'HTTP/1.1 200 OK'
55
- data: |
56
- {
57
- "users": [
58
- {
59
- "id": 27,
60
- "first_name": "John",
61
- "last_name": "Smith",
62
- "created_at": "2011-06-13T00:28:36-04:00",
63
- "updated_at": "2012-04-26T20:21:43-04:00"
64
- },
65
- {
66
- "id": 3,
67
- "first_name": "Anna",
68
- "last_name": "Brown",
69
- "created_at": "2011-06-13T00:28:36-04:00",
70
- "updated_at": "2012-04-26T20:21:43-04:00"
71
- },
72
- ...
73
- ]
74
- }
75
- fail:
76
- response: 'HTTP/1.1 422 Unprocessable Entity'
77
- data: |
78
- {
79
- "message": "Failed to create User",
80
- "errors" : {
81
- "email": "Email is invalid",
82
- ...
83
- }
84
- }
85
-
86
- curl: curl -i :api_url/users?api_key=7gR9hZt3DBqcuzi2mZKN
87
-
88
- # ------------------------------
89
-
90
- 'Show':
91
- url: '/users/:id'
92
- method: GET
93
- description: |
94
- Returns profile details for a specified user.
95
- <span class=label>NOTE</span> If showing details of another user the email is ommited
96
- params:
97
- api_key:
98
- id: the id of a user
99
- success:
100
- response: 'HTTP/1.1 200 OK'
101
- data: |
102
- {
103
- "user": {
104
- "id": 917,
105
- "api_key": "7gR9hZt3DBqcuzi2mZKN",
106
- "email": "john_smith@gmail.com",
107
- "first_name": "John",
108
- "last_name": "Smith",
109
- "created_at": "2011-06-13T00:28:36-04:00",
110
- "updated_at": "2012-04-26T20:21:43-04:00"
111
- }
112
- }
113
- fail:
114
- response: 'HTTP/1.1 404 Not Found'
115
- data: |
116
- {
117
- "message": "User not found"
118
- }
119
- curl: curl -i :api_url/users/197?api_key=2a10K5ipBd2qapJsPvCso90kMO
120
-
121
- # ------------------------------
122
-
123
- 'Create':
124
- url: '/users'
125
- method: POST
126
- description: Create a user
127
- params:
128
- user[first_name]:
129
- user[last_name]:
130
- user[email]:
131
- user[password]:
132
- success:
133
- response: 'HTTP/1.1 201 Created'
134
- data: |
135
- {
136
- "user": {
137
- "id": 917,
138
- "api_key": "7gR9hZt3DBqcuzi2mZKN",
139
- "email": "john_smith@gmail.com",
140
- "first_name": "John",
141
- "last_name": "Smith",
142
- "created_at": "2011-06-13T00:28:36-04:00",
143
- "updated_at": "2012-04-26T20:21:43-04:00"
144
- }
145
- }
146
- fail:
147
- response: 'HTTP/1.1 422 Unprocessable Entity'
148
- data: |
149
- {
150
- "message": "Failed to create User",
151
- "errors" : {
152
- "email": "Email is invalid",
153
- ...
154
- }
155
- }
156
- curl: |
157
- curl -i :api_url/v1/users \
158
- -d "user[first_name]=John" \
159
- -d "user[last_name]=Smith" \
160
- -d "user[email]=john_smith@twg.ca" \
161
- -d "user[password]=passpass"
54
+ Assuming that tests pass their details are doing to be recorded into `docs/api/users.yml` and they will look like this:
55
+
56
+ ``` yml
57
+ show:
58
+ 1YGvw8qQDy0Te4oEAxFdTEiS3eQ=:
59
+ method: GET
60
+ path: /users/:id
61
+ params:
62
+ id: 12345
63
+ status: 200
64
+ body:
65
+ id: 12345
66
+ name: John Doe
67
+ YaEdGJRDZy0nsljmpJmOtcLxdUg=:
68
+ description: When bad user id is passed
69
+ method: GET
70
+ path: /users/:id
71
+ params:
72
+ id: invalid
73
+ status: 404
74
+ body:
75
+ message: User not found
162
76
  ```
163
77
 
78
+ ## Usage
79
+ Just navigate to the path you mounted *api_docs* to. Perhaps `http://yourapp/api-docs`.
164
80
 
165
81
  ## Configuration
166
82
 
@@ -168,12 +84,15 @@ You can change the default configuration of this gem by adding the following cod
168
84
 
169
85
  ``` ruby
170
86
  ApiDocs.configure do |config|
171
- config.yaml_docs_folder = '/some/other/folder ' # the default folder is /doc/api
87
+ # folder path where api docs are saved to
88
+ config.docs_path = Rails.root.join('doc/api')
89
+
90
+ # controller that ApiDocs controller inherits from.
91
+ # Useful for hiding it behind admin controller.
92
+ config.base_controller = 'ApplicationController'
172
93
  end
173
94
  ```
174
95
 
175
-
176
96
  ---
177
97
 
178
- Copyright 2012 Jack Neto, [The Working Group, Inc](http://www.theworkinggroup.ca)
179
-
98
+ Copyright 2012 Oleg Khabarov, Jack Neto, [The Working Group, Inc](http://twg.ca)
data/Rakefile CHANGED
@@ -1,16 +1,31 @@
1
- require 'rubygems'
2
- require 'rake'
3
- require 'jeweler'
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ begin
8
+ require 'jeweler'
9
+ Jeweler::Tasks.new do |gem|
10
+ gem.name = 'api_docs'
11
+ gem.homepage = 'http://github.com/twg/api_docs'
12
+ gem.license = 'MIT'
13
+ gem.summary = 'Generate API documentation using integration tests in Ruby on Rails 3'
14
+ gem.description = 'Generate API documentation using integration tests in Ruby on Rails 3'
15
+ gem.email = 'jack@twg.ca'
16
+ gem.authors = ['Oleg Khabarov', 'Jack Neto', 'The Working Group Inc.']
17
+ end
18
+ Jeweler::RubygemsDotOrgTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
21
+ end
22
+
4
23
 
5
- Jeweler::Tasks.new do |gem|
6
- gem.name = "api_docs"
7
- gem.homepage = "http://github.com/twg/api_docs"
8
- gem.license = "MIT"
9
- gem.summary = "A tool to help you generate documentation for you API"
10
- gem.description = ''
11
- gem.email = "jack@twg.ca"
12
- gem.authors = ["Jack Neto", 'The Working Group Inc.']
13
- gem.add_dependency('rails', '>=3.1.0')
14
- gem.add_dependency('bootstrap_builder', '>=0.2.6')
24
+ require 'rake/testtask'
25
+ Rake::TestTask.new(:test) do |t|
26
+ t.libs << 'lib'
27
+ t.libs << 'test'
28
+ t.pattern = 'test/**/*_test.rb'
29
+ t.verbose = false
15
30
  end
16
- Jeweler::RubygemsDotOrgTasks.new
31
+ task :default => :test
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 1.0.0
data/api_docs.gemspec CHANGED
@@ -4,58 +4,99 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{api_docs}
8
- s.version = "0.0.4"
7
+ s.name = "api_docs"
8
+ s.version = "1.0.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Jack Neto", "The Working Group Inc."]
12
- s.date = %q{2012-05-03}
13
- s.description = %q{}
14
- s.email = %q{jack@twg.ca}
11
+ s.authors = ["Oleg Khabarov", "Jack Neto", "The Working Group Inc."]
12
+ s.date = "2012-09-11"
13
+ s.description = "Generate API documentation using integration tests in Ruby on Rails 3"
14
+ s.email = "jack@twg.ca"
15
15
  s.extra_rdoc_files = [
16
- "LICENSE.txt",
16
+ "LICENSE",
17
17
  "README.md"
18
18
  ]
19
19
  s.files = [
20
- "LICENSE.txt",
20
+ "Gemfile",
21
+ "LICENSE",
21
22
  "README.md",
22
23
  "Rakefile",
23
24
  "VERSION",
24
25
  "api_docs.gemspec",
25
- "app/assets/javascripts/api_docs.js.coffee",
26
- "app/assets/javascripts/prettify.js",
27
- "app/assets/stylesheets/prettify.css",
28
- "app/views/api_docs/_api_docs.html.haml",
29
- "app/views/api_docs/_curl.html.haml",
30
- "app/views/api_docs/_form.html.haml",
31
- "app/views/api_docs/_panel.html.haml",
32
- "app/views/api_docs/_params.html.haml",
33
- "app/views/api_docs/_response.html.haml",
26
+ "app/assets/javascripts/api_docs.js",
27
+ "app/assets/stylesheets/api_docs.css",
28
+ "app/controllers/api_docs/docs_controller.rb",
29
+ "app/views/api_docs/docs/_action.html.erb",
30
+ "app/views/api_docs/docs/_request_params.html.erb",
31
+ "app/views/api_docs/docs/index.html.erb",
32
+ "config/routes.rb",
34
33
  "lib/api_docs.rb",
35
34
  "lib/api_docs/configuration.rb",
36
35
  "lib/api_docs/engine.rb",
37
- "lib/api_docs/railtie.rb"
36
+ "lib/api_docs/test_helper.rb",
37
+ "script/rails",
38
+ "test/api_docs_test.rb",
39
+ "test/docs_controller_test.rb",
40
+ "test/dummy/README.rdoc",
41
+ "test/dummy/Rakefile",
42
+ "test/dummy/app/assets/images/glyphicons-halflings-white.png",
43
+ "test/dummy/app/assets/images/glyphicons-halflings.png",
44
+ "test/dummy/app/assets/javascripts/application.js",
45
+ "test/dummy/app/assets/javascripts/bootstrap.min.js",
46
+ "test/dummy/app/assets/stylesheets/application.css",
47
+ "test/dummy/app/assets/stylesheets/bootstrap.min.css",
48
+ "test/dummy/app/controllers/application_controller.rb",
49
+ "test/dummy/app/helpers/application_helper.rb",
50
+ "test/dummy/app/mailers/.gitkeep",
51
+ "test/dummy/app/models/.gitkeep",
52
+ "test/dummy/app/views/layouts/application.html.erb",
53
+ "test/dummy/config.ru",
54
+ "test/dummy/config/application.rb",
55
+ "test/dummy/config/boot.rb",
56
+ "test/dummy/config/environment.rb",
57
+ "test/dummy/config/environments/development.rb",
58
+ "test/dummy/config/environments/production.rb",
59
+ "test/dummy/config/environments/test.rb",
60
+ "test/dummy/config/initializers/backtrace_silencers.rb",
61
+ "test/dummy/config/initializers/inflections.rb",
62
+ "test/dummy/config/initializers/mime_types.rb",
63
+ "test/dummy/config/initializers/secret_token.rb",
64
+ "test/dummy/config/initializers/session_store.rb",
65
+ "test/dummy/config/initializers/wrap_parameters.rb",
66
+ "test/dummy/config/locales/en.yml",
67
+ "test/dummy/config/routes.rb",
68
+ "test/dummy/lib/assets/.gitkeep",
69
+ "test/dummy/log/.gitkeep",
70
+ "test/dummy/public/404.html",
71
+ "test/dummy/public/422.html",
72
+ "test/dummy/public/500.html",
73
+ "test/dummy/public/favicon.ico",
74
+ "test/dummy/script/rails",
75
+ "test/test_helper.rb",
76
+ "test/test_helper_test.rb"
38
77
  ]
39
- s.homepage = %q{http://github.com/twg/api_docs}
78
+ s.homepage = "http://github.com/twg/api_docs"
40
79
  s.licenses = ["MIT"]
41
80
  s.require_paths = ["lib"]
42
- s.rubygems_version = %q{1.3.7}
43
- s.summary = %q{A tool to help you generate documentation for you API}
81
+ s.rubygems_version = "1.8.23"
82
+ s.summary = "Generate API documentation using integration tests in Ruby on Rails 3"
44
83
 
45
84
  if s.respond_to? :specification_version then
46
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
47
85
  s.specification_version = 3
48
86
 
49
87
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
50
88
  s.add_runtime_dependency(%q<rails>, [">= 3.1.0"])
51
- s.add_runtime_dependency(%q<bootstrap_builder>, [">= 0.2.6"])
89
+ s.add_runtime_dependency(%q<jquery-rails>, [">= 0"])
90
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
52
91
  else
53
92
  s.add_dependency(%q<rails>, [">= 3.1.0"])
54
- s.add_dependency(%q<bootstrap_builder>, [">= 0.2.6"])
93
+ s.add_dependency(%q<jquery-rails>, [">= 0"])
94
+ s.add_dependency(%q<jeweler>, [">= 0"])
55
95
  end
56
96
  else
57
97
  s.add_dependency(%q<rails>, [">= 3.1.0"])
58
- s.add_dependency(%q<bootstrap_builder>, [">= 0.2.6"])
98
+ s.add_dependency(%q<jquery-rails>, [">= 0"])
99
+ s.add_dependency(%q<jeweler>, [">= 0"])
59
100
  end
60
101
  end
61
102
 
@@ -0,0 +1,11 @@
1
+ // This is a manifest file that'll be compiled into including all the files listed below.
2
+ // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
3
+ // be included in the compiled file accessible from http://example.com/assets/application.js
4
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
+ // the compiled file.
6
+ //
7
+ //= require jquery
8
+ //= require jquery_ujs
9
+ //= require_self
10
+
11
+
@@ -0,0 +1,62 @@
1
+ /*
2
+ * This is a manifest file that'll automatically include all the stylesheets available in this directory
3
+ * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
4
+ * the top of the compiled file, but it's generally better to create a new file per style scope.
5
+ *= require_self
6
+ */
7
+
8
+ ul#api-doc-nav {
9
+ box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.067);
10
+ border-radius: 6px;
11
+ }
12
+ ul#api-doc-nav li {
13
+ font: 14px/20px 'Helvetica Neue', Helvetica, Arial, sans-serif;
14
+ }
15
+ ul#api-doc-nav li.nav-header {
16
+ background-color: #e5e5e5;
17
+ margin-top: 0px;
18
+ padding-top: 5px;
19
+ }
20
+ ul#api-doc-nav a {
21
+ border: 1px solid #e5e5e5;
22
+ padding: 8px 14px;
23
+ margin-top: -1px;
24
+ text-align: right;
25
+ }
26
+ ul#api-doc-nav > li:first-child {
27
+ border-radius: 6px 6px 0px 0px;
28
+ }
29
+ ul#api-doc-nav > li:last-child > a {
30
+ border-radius: 0px 0px 6px 6px;
31
+ }
32
+
33
+ table#api-doc-table th {
34
+ text-align: right;
35
+ min-width: 100px;
36
+ }
37
+ table#api-doc-table td {
38
+ width: 100%;
39
+ }
40
+ table#api-doc-table tr.info th {
41
+ background-color: #D9EDF7 !important;
42
+ }
43
+ table#api-doc-table tr.info td {
44
+ background-color: #F0F8FC !important;
45
+ }
46
+ table#api-doc-table tr.info td code {
47
+ color: #3A87AD !important;
48
+ }
49
+ table#api-doc-table td pre {
50
+ margin-bottom: 0px;
51
+ }
52
+ table#api-doc-table td table {
53
+ width: auto;
54
+ }
55
+ table#api-doc-table td table th {
56
+ width: auto;
57
+ min-width: 0px;
58
+ border-left: 0px;
59
+ }
60
+ table#api-doc-table td table td {
61
+ width: auto;
62
+ }
@@ -0,0 +1,8 @@
1
+ class ApiDocs::DocsController < ApiDocs.config.base_controller.to_s.constantize
2
+ def index
3
+ @api_controllers = { }
4
+ Dir.glob(ApiDocs.config.docs_path.join('*.yml')).each do |file_path|
5
+ @api_controllers[File.basename(file_path, '.yml')] = YAML.load_file(file_path)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,41 @@
1
+ <table class='table table-bordered table-condensed' id='api-doc-table'>
2
+
3
+ <tr class='info'>
4
+ <th>Request</th>
5
+ <td>
6
+ <span class='label label-info'><%= action['method']%></span>
7
+ <code><%= action['path']%></code>
8
+ </td>
9
+ </tr>
10
+
11
+ <% if action['description'].present? %>
12
+ <tr>
13
+ <th>Description</th>
14
+ <td><%= action['description']%></td>
15
+ </tr>
16
+ <% end %>
17
+
18
+ <% if action['params'].is_a?(Hash) %>
19
+ <tr>
20
+ <th>Parameters</th>
21
+ <td>
22
+ <%= render :partial => 'request_params', :object => action['params'] %>
23
+ </td>
24
+ </tr>
25
+ <% end %>
26
+
27
+ <tr class='info'>
28
+ <th>Response</th>
29
+ <td>
30
+ <span class='label <%= action['status'].to_s[0] == '4' ? 'label-important' : 'label-success' %>'>
31
+ <%= action['status'] %>
32
+ </span>
33
+ </td>
34
+ </tr>
35
+
36
+ <tr>
37
+ <th>Body</th>
38
+ <td><pre><%= JSON.pretty_generate(action['body']) %></pre></td>
39
+ </tr>
40
+
41
+ </table>
@@ -0,0 +1,16 @@
1
+ <table>
2
+ <% request_params.each do |key, value| %>
3
+ <tr>
4
+ <th><%= key %></th>
5
+ <td>
6
+ <%=
7
+ if value.is_a?(Hash)
8
+ render :partial => 'request_params', :object => value
9
+ else
10
+ value
11
+ end
12
+ %>
13
+ </td>
14
+ </tr>
15
+ <% end %>
16
+ </table>
@@ -0,0 +1,32 @@
1
+ <div class='row'>
2
+ <div class='span3'>
3
+ <ul class='nav nav-list' id='api-doc-nav'>
4
+ <% @api_controllers.each_with_index do |(controller, actions), ci| %>
5
+ <li class='nav-header'>
6
+ <%= controller.gsub(/\W/, '_').humanize.titleize %>
7
+ </li>
8
+ <% actions.each_with_index do |(action, data), ai| %>
9
+ <li class='<%= ci == 0 && ai == 0 ? 'active' : '' %>'>
10
+ <% tab_id = "#{controller.gsub(/\W/, '_')}_#{action}" %>
11
+ <%= link_to action.humanize.titleize, "##{tab_id}", :data => {:toggle => 'tab'} %>
12
+ </li>
13
+ <% end %>
14
+ <% end %>
15
+ </ul>
16
+ </div>
17
+
18
+ <div class="span9">
19
+ <div class='tab-content'>
20
+ <% @api_controllers.each_with_index do |(controller, actions), ci| %>
21
+ <% actions.each_with_index do |(action, data), ai| %>
22
+ <% tab_id = "#{controller.gsub(/\W/, '_')}_#{action}" %>
23
+ <div class='tab-pane <%= ci == 0 && ai == 0 ? 'active' : '' %>' id='<%= tab_id %>'>
24
+ <% data.each do |key, data| %>
25
+ <%= render :partial => 'action', :object => data %>
26
+ <% end %>
27
+ </div>
28
+ <% end %>
29
+ <% end %>
30
+ </div>
31
+ </div>
32
+ </div>
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ ApiDocs::Engine.routes.draw do
2
+ root :to => 'docs#index'
3
+ end
@@ -1,14 +1,19 @@
1
- module ApiDocs
2
- class Configuration
3
-
4
- # Where to find the folder with the yaml docs
5
- attr_accessor :yaml_docs_folder, :api_url
6
-
7
- # Configuration defaults
8
- def initialize
9
- @yaml_docs_folder = '/doc'
10
- @api_url = 'http://localhost:3000'
11
- end
1
+ class ApiDocs::Configuration
2
+
3
+ # Where to find the folder with documentation files
4
+ attr_accessor :docs_path
5
+
6
+ # Controller that ApiDocs::DocsController inherits from
7
+ attr_accessor :base_controller
8
+
9
+ # Array of ignored attributes. Attributes that don't really change
10
+ # the content like timestamps.
11
+ attr_accessor :ignored_attributes
12
12
 
13
+ # Configuration defaults
14
+ def initialize
15
+ @docs_path = Rails.root.join('doc/api')
16
+ @base_controller = 'ApplicationController'
17
+ @ignored_attributes = %w(created_at updated_at)
13
18
  end
14
19
  end
@@ -1,8 +1,5 @@
1
- require "api_docs"
2
- require "rails"
3
-
4
1
  module ApiDocs
5
- class Engine < Rails::Engine
6
-
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace ApiDocs
7
4
  end
8
- end
5
+ end