dox 1.0.0.alpha → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9535d1b95849fc4c0dddff91c5ed6a35879d6505
4
- data.tar.gz: c84f5af01e5de1524b533175a6141d67b995bee3
3
+ metadata.gz: e3696fee9fddea2f824f129a0a25e61383b01cec
4
+ data.tar.gz: c69809b3ce6618fc593dd8897938e5f34d8788c9
5
5
  SHA512:
6
- metadata.gz: a7ee68d768d9fbbf34708e1cbb901fee9dd532d09807cbd9ffa0abb60d08d80c08114014280390f8532788b68e517d29dc70ebdb6ab678057e0dbfc51566ad3d
7
- data.tar.gz: 900ec7205240057d71ae6f8c1753aabe9d03d66375dbf167336b7444f2d5840969b1ed510cf25011963807c382c051976a7fb6189178ebe1335ed96370fab653
6
+ metadata.gz: 28f6f85ab7471792a741658f83a1a1b522359da8bed3e4bd5f9e9a4cf71d9e28e80fe1a087fc459bd9c4c58afbde4cb797ceb0732d7a3980556c2c973bf7838e
7
+ data.tar.gz: 2e71c5e388fc0c7bb727f057219e6376b4a2fe80a645738fef539ced75d1099227a27c8ac786b2c8c160c98e99fc99b22a2e0404dc414d7b3a0f2276b1e9bd7a
data/.gitignore CHANGED
@@ -7,3 +7,5 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+
11
+ *.gem
@@ -0,0 +1,14 @@
1
+ LineLength:
2
+ Max: 120
3
+
4
+ Documentation:
5
+ Enabled: False
6
+
7
+ WordArray:
8
+ Enabled: False
9
+
10
+ AllCops:
11
+ TargetRubyVersion: 2.3
12
+
13
+ Style/FrozenStringLiteralComment:
14
+ Enabled: false
@@ -0,0 +1 @@
1
+ 2.3.1
@@ -1,4 +1,25 @@
1
1
  language: ruby
2
- rvm:
3
- - 2.3.0
4
2
  before_install: gem install bundler -v 1.11.2
3
+
4
+ matrix:
5
+ include:
6
+ - rvm: 2.0.0
7
+ env: "RAILS_VERSION=4.0.0"
8
+ - rvm: 2.1.2
9
+ env: "RAILS_VERSION=4.1.0"
10
+ - rvm: 2.2.0
11
+ env: "RAILS_VERSION=4.2.0"
12
+ - rvm: 2.2.2
13
+ env: "RAILS_VERSION=5.0.0"
14
+ - rvm: 2.3.0
15
+ env: "RAILS_VERSION=5.0.0"
16
+ - rvm: 2.4.0
17
+ env: "RAILS_VERSION=5.0.0"
18
+
19
+ addons:
20
+ code_climate:
21
+ repo_token:
22
+ secure: "LsnC+ru4oLhNOo0YFUfQeVvnCLkfeOv7xN9xSaBO2J1K2qZCadjsX/gnV6BRU5wmAxyXR2xQGnI+9wi4dqlPcuXlTIbE4Ge91WoTU+DNjA8RBrYePfVGsNeuT5wos6I0nBmnNYujBS6Rk0ntc1WEV2nq+3K4dpiTNcAYtS1f8zwV7qXBU63hc3urL0tO6DQUIYOi1rlse2EO5vhBlm3dH24TqEz32RROxh0kkuNLPmoq9NHCZQuJl1I0D3ovW+NRcOYDcgALX4HMRk8+4Hoqz3gyalLNvFujBdwnObL6kiMdRuUO8SGIc2crVMdckAnDBOkYYO4GQUwPv4qzaSX15i8Hrdxz16Rh9saqmX7qacornatt85j0aXA7nDPTD2zxG749XPu1DsUz0VC/2vWbCFhk9VysVtiY/grcUXg1CC/uh0+xbrnZol4rlInXyuXxmWOKThzMeSPjR0aCkQwqpRWG9ck0VTQIcC2mPGIF4o6fsMYe6iDtwPixNsCHBTPa/Ack0rgnxCvb5SH59VK0p4bTgzY/st85mBht1t46sqkbhdDI0S/oJu0NgmpyBAB6RL/kjNlVHvSi4plQxhW2N0FyQpwnLGkvxidIRwqnd1YalJxja2RDe7LaB82zusX+GLl0T79tW4VGEm8PqC7i3COMsWji8P75eiVzvwISN8w="
23
+
24
+ after_success:
25
+ - bundle exec codeclimate-test-reporter
@@ -0,0 +1,51 @@
1
+ # Changelog
2
+
3
+ ## Version 1.0.0
4
+
5
+ Released on May 6, 2017
6
+
7
+ New:
8
+ - Guess path params for URI definition from example's request object
9
+ - Validate HTTP verbs specified in the descriptors' actions
10
+ - Document only examples whitelisted with `dox` tag
11
+ - Added option for whitelisting additional HTTP headers for examples
12
+ - Show request HTTP verb and fullpath for each action request
13
+ - Dox executable
14
+
15
+ Fix:
16
+ - Ignore body in query params (Rails 4 issue) for example request URL
17
+ - Pull request and response objects from example metadata
18
+
19
+ ## Version 1.0.0.alpha
20
+
21
+ Released on October 18, 2016
22
+
23
+ - Updated the dependencies
24
+
25
+ New:
26
+ - Raise errors on missing required dox attributes in descriptors
27
+ - `extend Dox::DSL::Syntax` instead of `include Dox::DSL::Syntax` in descriptors
28
+
29
+
30
+ ## Version 0.0.3
31
+
32
+ Released on June 22, 2016
33
+
34
+ Fix:
35
+ - Fixed example identifier for examples with query params
36
+
37
+
38
+ ## Version 0.0.2
39
+
40
+
41
+ Released on June 14, 2016
42
+
43
+ - Created core classes and a DSL for manipulating the examples in specs
44
+ - Added usage to readme
45
+
46
+
47
+ ## Version 0.0.1
48
+
49
+ Released on June 06, 2016
50
+
51
+ - First release of the dox gem where the initial gem skeleton has been created
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in dox.gemspec
4
4
  gemspec
5
+
6
+ rails_version = ENV['RAILS_VERSION'] || '5.0.1'
7
+
8
+ gem 'rails', "~> #{rails_version}"
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2016 Melita Kokot
3
+ Copyright (c) 2017 Infinum
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,114 +1,297 @@
1
+ [![Build Status](https://travis-ci.org/infinum/dox.svg?branch=master)](https://travis-ci.org/infinum/dox)
2
+ [![Code Climate](https://codeclimate.com/github/infinum/dox/badges/gpa.svg)](https://codeclimate.com/github/infinum/dox)
3
+ [![Test Coverage](https://codeclimate.com/github/infinum/dox/badges/coverage.svg)](https://codeclimate.com/github/infinum/dox/coverage)
4
+
1
5
  # Dox
2
6
 
3
- Dox formats the rspec output in the [api blueprint](https://apiblueprint.org/) format.
7
+ Automate your documentation writing proces! Dox generates API documentation from Rspec controller/request specs in a Rails application. It formats the tests output in the [API Blueprint](https://apiblueprint.org) format. Choose one of the [renderes](#renderers) to convert it to HTML or host it on [Apiary.io](https://apiary.io)
8
+
9
+ Here's a [demo app](https://github.com/infinum/dox-demo) and here are some examples:
10
+
11
+ - [Dox demo - Apiary](http://docs.doxdemo.apiary.io/#reference/books/books)
12
+ - [Dox demo - Aglio](https://infinum.github.io/dox-demo/aglio)
13
+ - [Dox demo - Snowboard](https://infinum.github.io/dox-demo/snowboard)
14
+
4
15
 
5
16
  ## Installation
6
17
 
7
18
  Add this line to your application's Gemfile:
8
19
 
9
20
  ```ruby
10
- gem 'dox'
21
+ group :test do
22
+ gem 'dox', require: 'false'
23
+ end
11
24
  ```
12
25
 
13
26
  And then execute:
14
27
 
15
- $ bundle
28
+ ```
29
+ $ bundle
30
+ ```
16
31
 
17
32
  Or install it yourself as:
18
33
 
19
- $ gem install dox
34
+ ```
35
+ $ gem install dox
36
+ ```
20
37
 
21
38
  ## Usage
22
39
 
23
- ### Code example
40
+ ### Require it
41
+ Require Dox in the rails_helper:
24
42
 
25
- Example documentation module for a resource:
43
+ ``` ruby
44
+ require 'dox'
45
+ ```
46
+
47
+ and configure rspec with this:
26
48
 
27
49
  ``` ruby
28
- module ApiDoc
50
+ Rspec.configure do |config|
51
+ config.after(:each, :dox) do |example|
52
+ example.metadata[:request] = request
53
+ example.metadata[:response] = response
54
+ end
55
+ end
56
+ ```
57
+
58
+ ### Configure it
59
+ Set these mandatory options in the rails_helper:
60
+
61
+ | Option | Value | Description |
62
+ | -- | -- | -- |
63
+ | header_file_path | Pathname instance or fullpath string | Markdown file that will be included at the top of the documentation. It should contain title and some basic info about the api. |
64
+ | desc_folder_path | Pathname instance or fullpath string | Folder with markdown descriptions. |
65
+
66
+
67
+ Optional settings:
68
+
69
+ | Option | Value| Description |
70
+ | -- | -- | -- |
71
+ | headers_whitelist | Array of headers (strings) | Requests and responses will by default list only `Content-Type` header. To list other http headers, you must whitelist them.|
72
+
73
+ Example:
74
+
75
+ ``` ruby
76
+ Dox.configure do |config|
77
+ config.header_file_path = Rails.root.join('spec/docs/v1/descriptions/header.md')
78
+ config.desc_folder_path = Rails.root.join('spec/docs/v1/descriptions')
79
+ config.headers_whitelist = ['Accept', 'X-Auth-Token']
80
+ end
81
+ ```
82
+
83
+ ### Basic example
84
+
85
+ Define a descriptor module for a resource using Dox DSL:
86
+
87
+ ``` ruby
88
+ module Docs
29
89
  module V1
30
90
  module Bids
31
- include Dox::DSL::Syntax
91
+ extend Dox::DSL::Syntax
32
92
 
93
+ # define common resource data for each action
33
94
  document :api do
34
- group do
35
- name 'Bids'
36
- end
37
-
38
- resource do
39
- name 'Bids'
95
+ resource 'Bids' do
40
96
  endpoint '/bids'
41
97
  group 'Bids'
42
- desc 'bid_resource.md'
43
98
  end
44
99
  end
45
100
 
101
+ # define data for specific action
46
102
  document :index do
47
- action do
48
- name 'Get bids'
49
- verb 'GET'
50
- path '/bids'
51
- desc 'Returns list of user bids'
52
- end
53
- end
54
-
55
- document :create do
56
- action do
57
- name 'Post bids'
58
- verb 'POST'
59
- path '/bids'
60
- desc 'Creates bid'
61
- end
103
+ action 'Get bids'
62
104
  end
63
105
  end
64
106
  end
65
107
  end
108
+
109
+ ```
110
+ <small>You can define the descriptors for example in specs/docs folder, just make sure you load them in the rails_helper.rb:
111
+
112
+ ``` ruby
113
+ Dir[Rails.root.join('spec/docs/**/*.rb')].each { |f| require f }
66
114
  ```
67
- Description can be included inline or relative path of a markdown file with the description (relative to configured folder for markdown descriptions).
115
+ </small>
68
116
 
69
- Including the documentation module in a controller:
117
+ Include the descriptor modules in a controller and tag the specs you want to document with **dox**:
70
118
 
71
119
  ``` ruby
72
120
  describe Api::V1::BidsController, type: :controller do
73
- include ApiDoc::V1::Bids::Api
121
+ # include resource module
122
+ include Docs::V1::Bids::Api
74
123
 
75
124
  describe 'GET #index' do
76
- include ApiDoc::V1::Bids::Index
125
+ # include action module
126
+ include Docs::V1::Bids::Index
77
127
 
78
- it 'returns a list of bids' do
128
+ it 'returns a list of bids', :dox do
79
129
  get :index
80
130
  expect(response).to have_http_status(:ok)
81
131
  end
132
+ end
133
+ end
134
+ ```
135
+
136
+ And [generate the documentation](#generate-documentation).
137
+
138
+
139
+ ### Advanced options
140
+
141
+ Before running into any more details, here's roughly how is the generated API Blueprint document structured:
82
142
 
143
+ - header
144
+ - resource group
145
+ - resource
146
+ - action
147
+ - example 1
148
+ - example 2
149
+ - action
150
+ - ...
151
+ - resource
152
+ - action
153
+ - ...
154
+ - resource group
155
+ - resource
156
+ - action
157
+
158
+
159
+ Header is defined in a markdown file as mentioned before. Examples are concrete test examples (you can have 2 examples for create 1 happy path, 1 fail path). They are completely automatically generated from the request/response objects.
160
+ And you can customize the following in the descriptors:
161
+
162
+ - resource group
163
+ - resource
164
+ - action
165
+
166
+ #### Resource group
167
+
168
+ Resource group contains related resources and is defined with:
169
+ - **name** (required)
170
+ - desc (optional, inline string or relative filepath)
171
+
172
+ Example:
173
+ ``` ruby
174
+ document :bids_group do
175
+ group 'Bids' do
176
+ desc 'Here are all bid related resources'
177
+ end
178
+ end
179
+ ```
180
+
181
+ You can omit defining the resource group, if you don't have any description for it. Related resources will be linked in a group by the group option at the resource definition.
182
+
183
+ #### Resource
184
+ Resource contains actions and is defined with:
185
+ - **name** (required)
186
+ - **endpoint** (required)
187
+ - **group** (required; to associate it with the related group)
188
+ - desc (optional; inline string or relative filepath)
189
+
190
+ Example:
191
+ ``` ruby
192
+ document :bids do
193
+ resource 'Bids' do
194
+ endpoint '/bids'
195
+ group 'Bids'
196
+ desc 'bids/bids.md'
83
197
  end
84
198
  end
85
199
  ```
86
200
 
87
- ### Configuration
201
+ Usually you'll want to define resource and resource group together, so you don't have to include 2 modules with common data per spec file:
88
202
 
89
- You have to specify **root api file** and **descriptions folder**.
203
+ ``` ruby
204
+ document :bids_common do
205
+ group 'Bids' do
206
+ desc 'Here are all bid related resources'
207
+ end
90
208
 
91
- Root api file is a markdown file that will be included in the top of the documentation. It should contain title and some basic info about the api.
209
+ resource 'Bids' do
210
+ endpoint '/bids'
211
+ group 'Bids'
212
+ desc 'bids/bids.md'
213
+ end
214
+ end
215
+ ```
216
+
217
+ #### Action
218
+ Action is defined with:
219
+ - **name** (required)
220
+ - path* (optional)
221
+ - verb* (optional)
222
+ - params* (optional)
223
+ - desc (optional; inline string or relative filepath)
92
224
 
93
- Descriptions folder is a fullpath of a folder that contains markdown files with descriptions which behave like partials and are included in the final concatenated markdown. Root api file should also be in this folder.
225
+ \* these optional attributes are guessed (if not defined) from the request object of the test example and you can override them.
226
+
227
+ Example:
94
228
 
95
229
  ``` ruby
96
- Dox.configure do |config|
97
- config.header_file_path = 'api.md'
98
- config.desc_folder_path = Rails.root.join('spec/support/api_doc/v1/markdown_descriptions')
230
+ show_params = { id: { type: :number, required: :required, value: 1, description: 'bid id' } }
231
+
232
+ document :action do
233
+ action 'Get bid' do
234
+ path '/bids/{id}'
235
+ verb 'GET'
236
+ params show_params
237
+ desc 'Some description for get bid action'
238
+ end
99
239
  end
100
240
  ```
101
241
 
102
- ### Generate HTML documentation
103
- You have to install [aglio](https://www.npmjs.com/package/aglio).
242
+ ### Generate documentation
243
+ Documentation is generated in 2 steps:
244
+
245
+ 1. generate API Blueprint markdown with dox command:
246
+ ```bundle exec dox spec/controllers/api/v1 > docs.md```
247
+
248
+ 2. render HTML with some renderer, for example, with Aglio:
249
+ ```aglio -i docs.md -o docs.html```
250
+
251
+
252
+ #### Renderers
253
+ You can render the HTML yourself with one of the renderers:
254
+
255
+ - [Aglio](https://github.com/danielgtaylor/aglio)
256
+ - [Snowboard](https://github.com/subosito/snowboard)
257
+
258
+ Both support multiple themes and template customization.
259
+
260
+ Or you can just take your generated markdown and host your documentation on [Apiary.io](https://apiary.io).
261
+
262
+
263
+ ### Common issues
264
+
265
+ You might experience some strange issues when generating the documentation. Here are a few examples of what we've encountered so far.
104
266
 
105
- Rake task for generating HTML:
267
+ #### Wrap parameters issue
268
+ Rails wraps JSON parameters on all requests by default, which results with documented requests looking like this:
269
+
270
+ ```
271
+ + Request get pokemons
272
+ {
273
+ "pokemon": {}
274
+ }
275
+ ```
276
+
277
+ To disable wrapping parameters with a resource name, turn off this feature in `config/initializers/wrap_parameters.rb`:
106
278
 
107
279
  ``` ruby
108
- `bundle exec rspec spec --tag apidoc -f Dox::Formatter --order defined --out spec/apispec.md`
109
- `aglio --include-path / -i spec/apispec.md -o public/api/docs/index.html`
280
+ # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
281
+ ActiveSupport.on_load(:action_controller) do
282
+ wrap_parameters format: []
283
+ end
110
284
  ```
111
285
 
286
+ #### Rendering warnings with Aglio
287
+ You might get the following warnings when rendering HTML with Aglio:
288
+
289
+ * `no headers specified (warning code 3)`
290
+ * `empty request message-body (warning code 6)`
291
+
292
+ This usually happens on GET requests examples when there are no headers. To solve this issue, add at least one header to the tests' requests, like `Accept: application/json`.
293
+
294
+
112
295
  ## Development
113
296
 
114
297
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -117,8 +300,13 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
117
300
 
118
301
  ## Contributing
119
302
 
120
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/dox. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
303
+ Bug reports and pull requests are welcome on GitHub at https://github.com/infinum/dox. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
304
+
305
+
306
+ ## Credits
307
+ Dox is maintained and sponsored by [Infinum](https://infinum.co).
121
308
 
309
+ <a href="https://infinum.co"><img alt="Infinum" src="infinum.png" width="250"></a>
122
310
 
123
311
  ## License
124
312