dox 1.2.0 → 2.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +6 -3
- data/.ruby-version +1 -1
- data/.travis.yml +7 -11
- data/CHANGES.md +17 -0
- data/Gemfile +1 -1
- data/README.md +90 -108
- data/Rakefile +3 -3
- data/bin/console +3 -3
- data/dox.gemspec +14 -13
- data/lib/dox.rb +9 -1
- data/lib/dox/config.rb +38 -5
- data/lib/dox/dsl/action.rb +10 -4
- data/lib/dox/dsl/documentation.rb +4 -0
- data/lib/dox/dsl/syntax.rb +1 -0
- data/lib/dox/entities/action.rb +33 -13
- data/lib/dox/entities/example.rb +11 -1
- data/lib/dox/entities/resource.rb +4 -5
- data/lib/dox/entities/resource_group.rb +2 -3
- data/lib/dox/formatter.rb +10 -11
- data/lib/dox/printers/action_printer.rb +18 -27
- data/lib/dox/printers/base_printer.rb +36 -17
- data/lib/dox/printers/document_printer.rb +27 -7
- data/lib/dox/printers/example_request_printer.rb +69 -0
- data/lib/dox/printers/example_response_printer.rb +86 -0
- data/lib/dox/printers/resource_group_printer.rb +7 -7
- data/lib/dox/printers/resource_printer.rb +12 -7
- data/lib/dox/util/http.rb +64 -0
- data/lib/dox/version.rb +1 -1
- metadata +90 -34
- data/lib/dox/printers/example_printer.rb +0 -100
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 577100012c2891a9091b7d4f74e5fafee22b34cf06a24556b97f198fc6494a9b
|
4
|
+
data.tar.gz: beba05a5c7da69be18710b909c6d652694c3f02b0d73b256fa4f78ba19f22b9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ade817bb2361ba7560de8b2c67e51cdd3775adbdb310d87f91ec08d894d4e4cd9ad3e04138c5a6536a4fa5d9c875522c16a86c419524b9ba6fc49874be45368f
|
7
|
+
data.tar.gz: 715f4f73fa4547b2ae9b83e8ec7040cf11408dace456bed776ab39b64997c7bb78b498fa689c3d7cb3f50e8d1cfaf3c80f15c97104dee1ba96e99e0590e9cc85
|
data/.rubocop.yml
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.5.5
|
data/.travis.yml
CHANGED
@@ -1,20 +1,16 @@
|
|
1
1
|
language: ruby
|
2
|
-
before_install: gem install bundler -v 1.
|
2
|
+
# before_install: gem install bundler -v 1.17.3
|
3
3
|
|
4
4
|
matrix:
|
5
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
6
|
- rvm: 2.4.0
|
17
7
|
env: "RAILS_VERSION=5.0.0"
|
8
|
+
- rvm: 2.5.0
|
9
|
+
env: "RAILS_VERSION=5.0.0"
|
10
|
+
- rvm: 2.6.0
|
11
|
+
env: "RAILS_VERSION=6.0.0"
|
12
|
+
- rvm: 2.7.0
|
13
|
+
env: "RAILS_VERSION=6.0.0"
|
18
14
|
|
19
15
|
addons:
|
20
16
|
code_climate:
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## Version 2.0.0
|
4
|
+
|
5
|
+
Released on August 8, 2020
|
6
|
+
|
7
|
+
Change:
|
8
|
+
- BREAKING CHANGE The API description format changed from API-blueprint to OpenAPI.
|
9
|
+
- BREAKING CHANGE Base structure is now defined in .json format
|
10
|
+
- BREAKING CHANGE Output is written to a .json file
|
11
|
+
- BREAKING CHANGE Html is rendered with Redoc instead of Aglio
|
12
|
+
- Renamed Dox.config.desc_folder_path -> Dox.config.descriptions_location
|
13
|
+
- Depricated Dox.config.header_file_path
|
14
|
+
|
15
|
+
New:
|
16
|
+
- Added Dox.config.title
|
17
|
+
- Added Dox.config.header_description
|
18
|
+
- Added Dox.config.version
|
19
|
+
|
3
20
|
## Version 1.2.0
|
4
21
|
|
5
22
|
Released on November 27, 2019
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -4,13 +4,9 @@
|
|
4
4
|
|
5
5
|
# Dox
|
6
6
|
|
7
|
-
Automate your documentation writing process! Dox generates API documentation from Rspec controller/request specs in a Rails application. It formats the
|
7
|
+
Automate your documentation writing process! Dox generates API documentation from Rspec controller/request specs in a Rails application. It formats the tests output in the [OpenApi](https://www.openapis.org/) format. Use the ReDoc renderer for generating and displaying the documentation as HTML.
|
8
8
|
|
9
|
-
Here's a [demo app](https://github.com/infinum/dox-demo)
|
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)
|
9
|
+
Here's a [demo app](https://github.com/infinum/dox-demo).
|
14
10
|
|
15
11
|
|
16
12
|
## Installation
|
@@ -44,39 +40,33 @@ $ gem install dox
|
|
44
40
|
require 'dox'
|
45
41
|
```
|
46
42
|
|
47
|
-
and configure rspec with this:
|
48
|
-
|
49
|
-
``` ruby
|
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
43
|
### Configure it
|
59
|
-
Set these
|
44
|
+
Set these optional options in the rails_helper:
|
60
45
|
|
61
46
|
| Option | Value | Description |
|
62
47
|
| -- | -- | -- |
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
|
70
|
-
|
|
48
|
+
| descriptions_location | Pathname instance or fullpath string | Folder containing markdown descriptions of resources. |
|
49
|
+
| schema_request_folder_path | Pathname instance or fullpath string | Folder with request schemas of resources. |
|
50
|
+
| schema_response_folder_path | Pathname instance or fullpath string | Folder with response schemas of resources. |
|
51
|
+
| schema_response_fail_file_path | Pathname instance or fullpath string | Json file that contains the default schema of a failed response. |
|
52
|
+
| openapi_version | string | Openapi version (default: '3.0.0' ) |
|
53
|
+
| api_version | string | Api Version (default: '1.0') |
|
54
|
+
| title | string | Documentation title (default: 'API Documentation') |
|
55
|
+
| header_description | Pathname instance or string | Description (header) of the documentation (default: ''). If pathname ends with `.md`, the file is looked in `descriptions_location` folder |
|
71
56
|
| 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
57
|
|
73
58
|
Example:
|
74
59
|
|
75
60
|
``` ruby
|
76
61
|
Dox.configure do |config|
|
77
|
-
config.
|
78
|
-
config.
|
62
|
+
config.descriptions_location = Rails.root.join('spec/docs/v1/descriptions')
|
63
|
+
config.schema_request_folder_path = Rails.root.join('spec/docs/v1/schemas')
|
64
|
+
config.schema_response_folder_path = Rails.root.join('spec/support/v1/schemas')
|
65
|
+
config.schema_response_fail_file_path = Rails.root.join('spec/support/v1/schemas/error.json')
|
79
66
|
config.headers_whitelist = ['Accept', 'X-Auth-Token']
|
67
|
+
config.title = 'API'
|
68
|
+
config.api_version = '2.0'
|
69
|
+
config.header_description = 'api_description.md'
|
80
70
|
end
|
81
71
|
```
|
82
72
|
|
@@ -95,6 +85,7 @@ module Docs
|
|
95
85
|
resource 'Bids' do
|
96
86
|
endpoint '/bids'
|
97
87
|
group 'Bids'
|
88
|
+
desc 'bids.md'
|
98
89
|
end
|
99
90
|
end
|
100
91
|
|
@@ -138,34 +129,41 @@ And [generate the documentation](#generate-documentation).
|
|
138
129
|
|
139
130
|
### Advanced options
|
140
131
|
|
141
|
-
Before running into any more details, here's roughly how
|
142
|
-
|
143
|
-
-
|
144
|
-
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
-
|
150
|
-
|
151
|
-
|
152
|
-
-
|
153
|
-
|
154
|
-
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
132
|
+
Before running into any more details, here's roughly how the generated OpenApi document is structured:
|
133
|
+
|
134
|
+
- openapi
|
135
|
+
- info
|
136
|
+
- paths
|
137
|
+
- action 1
|
138
|
+
- tag1
|
139
|
+
- example 1
|
140
|
+
- example 2
|
141
|
+
- action 2
|
142
|
+
- tag2
|
143
|
+
- example 3
|
144
|
+
- x-tagGroups
|
145
|
+
- tags1
|
146
|
+
- tag 1
|
147
|
+
- tag 2
|
148
|
+
- tags2
|
149
|
+
- tag 3
|
150
|
+
- tag 4
|
151
|
+
- tags
|
152
|
+
- tag1
|
153
|
+
- tag2
|
154
|
+
|
155
|
+
|
156
|
+
OpenApi and info are defined in a json file as mentioned before. Examples are concrete test examples (you can have multiple examples for both happy and fail paths). They are completely automatically generated from the request/response objects.
|
160
157
|
And you can customize the following in the descriptors:
|
161
158
|
|
162
|
-
-
|
163
|
-
- resource
|
159
|
+
- x-tagGroup (**resourceGroup**)
|
160
|
+
- tag (**resource**)
|
164
161
|
- action
|
162
|
+
- example
|
165
163
|
|
166
|
-
####
|
164
|
+
#### ResourceGroup
|
167
165
|
|
168
|
-
|
166
|
+
ResourceGroup contains related resources and is defined with:
|
169
167
|
- **name** (required)
|
170
168
|
- desc (optional, inline string or relative filepath)
|
171
169
|
|
@@ -198,7 +196,7 @@ document :bids do
|
|
198
196
|
end
|
199
197
|
```
|
200
198
|
|
201
|
-
Usually you'll want to define
|
199
|
+
Usually you'll want to define resourceGroup and resource together, so you don't have to include 2 modules with common data per spec file:
|
202
200
|
|
203
201
|
``` ruby
|
204
202
|
document :bids_common do
|
@@ -215,12 +213,16 @@ end
|
|
215
213
|
```
|
216
214
|
|
217
215
|
#### Action
|
218
|
-
Action is defined with:
|
216
|
+
Action contains examples and is defined with:
|
219
217
|
- **name** (required)
|
220
218
|
- path* (optional)
|
221
219
|
- verb* (optional)
|
222
|
-
- params
|
220
|
+
- params (optional; _depricated_)
|
221
|
+
- query_params (optional; [more info](https://swagger.io/docs/specification/describing-parameters/#query-parameters))
|
223
222
|
- desc (optional; inline string or relative filepath)
|
223
|
+
- request_schema (optional; inline string or relative filepath)
|
224
|
+
- response_schema_success (optional; inline string or relative filepath)
|
225
|
+
- response_schema_fail (optional; inline string or relative filepath)
|
224
226
|
|
225
227
|
\* these optional attributes are guessed (if not defined) from the request object of the test example and you can override them.
|
226
228
|
|
@@ -228,13 +230,37 @@ Example:
|
|
228
230
|
|
229
231
|
``` ruby
|
230
232
|
show_params = { id: { type: :number, required: :required, value: 1, description: 'bid id' } }
|
233
|
+
query_params = [ {
|
234
|
+
"in": "query",
|
235
|
+
"name": "filter",
|
236
|
+
"required": false,
|
237
|
+
"style": "deepObject",
|
238
|
+
"explode": true,
|
239
|
+
"schema": {
|
240
|
+
"type": "object",
|
241
|
+
"required": ["updated_at_gt"],
|
242
|
+
"example": {
|
243
|
+
"updated_at_gt": "2018-02-03 10:30:00"
|
244
|
+
},
|
245
|
+
"properties": {
|
246
|
+
"updated_at_gt": {
|
247
|
+
"type": "string",
|
248
|
+
"title": "date"
|
249
|
+
}
|
250
|
+
}
|
251
|
+
}
|
252
|
+
]
|
231
253
|
|
232
254
|
document :action do
|
233
255
|
action 'Get bid' do
|
234
256
|
path '/bids/{id}'
|
235
257
|
verb 'GET'
|
236
258
|
params show_params
|
259
|
+
query_params query_params
|
237
260
|
desc 'Some description for get bid action'
|
261
|
+
request_schema 'namespace/bids'
|
262
|
+
response_schema_success 'namespace/bids_s'
|
263
|
+
response_schema_fail 'namespace/bids_f'
|
238
264
|
end
|
239
265
|
end
|
240
266
|
```
|
@@ -242,11 +268,11 @@ end
|
|
242
268
|
### Generate documentation
|
243
269
|
Documentation is generated in 2 steps:
|
244
270
|
|
245
|
-
1. generate
|
246
|
-
```bundle exec rspec
|
271
|
+
1. generate OpenApi json file:
|
272
|
+
```bundle exec rspec --tag apidoc -f Dox::Formatter --order defined --tag dox --out spec/api_doc/v1/schemas/docs.json```
|
247
273
|
|
248
|
-
2. render HTML with
|
249
|
-
```
|
274
|
+
2. render HTML with Redoc:
|
275
|
+
```redoc-cli bundle -o public/api/docs/v2/docs.html spec/api_doc/v1/schemas/docs.json```
|
250
276
|
|
251
277
|
|
252
278
|
#### Use rake tasks
|
@@ -256,42 +282,32 @@ It's recommendable to write a few rake tasks to make things easier. Here's an ex
|
|
256
282
|
namespace :api do
|
257
283
|
namespace :doc do
|
258
284
|
desc 'Generate API documentation markdown'
|
259
|
-
task :
|
285
|
+
task :json do
|
260
286
|
require 'rspec/core/rake_task'
|
261
287
|
|
262
288
|
RSpec::Core::RakeTask.new(:api_spec) do |t|
|
263
289
|
t.pattern = 'spec/controllers/api/v1/'
|
264
|
-
t.rspec_opts = "-f Dox::Formatter --order defined --tag dox --out public/api/docs/v1/
|
290
|
+
t.rspec_opts = "-f Dox::Formatter --order defined --tag dox --out public/api/docs/v1/docs.json"
|
265
291
|
end
|
266
292
|
|
267
293
|
Rake::Task['api_spec'].invoke
|
268
294
|
end
|
269
295
|
|
270
|
-
task html: :
|
271
|
-
`
|
296
|
+
task html: :json do
|
297
|
+
`redoc-cli bundle -o public/api/docs/v2/index.html spec/api_doc/v1/schemas/docs.json`
|
272
298
|
end
|
273
299
|
|
274
300
|
task open: :html do
|
275
301
|
`open public/api/docs/v1/index.html`
|
276
302
|
end
|
277
|
-
|
278
|
-
task publish: :md do
|
279
|
-
`apiary publish --path=public/api/docs/v1/apispec.md --api-name=doxdemo`
|
280
|
-
end
|
281
303
|
end
|
282
304
|
end
|
283
305
|
```
|
284
306
|
|
285
307
|
#### Renderers
|
286
|
-
You can render the HTML yourself with
|
287
|
-
|
288
|
-
- [Aglio](https://github.com/danielgtaylor/aglio)
|
289
|
-
- [Snowboard](https://github.com/subosito/snowboard)
|
290
|
-
|
291
|
-
Both support multiple themes and template customization.
|
292
|
-
|
293
|
-
Or you can just take your generated markdown and host your documentation on [Apiary.io](https://apiary.io).
|
308
|
+
You can render the HTML yourself with ReDoc:
|
294
309
|
|
310
|
+
- [Redoc](https://github.com/Redocly/redoc)
|
295
311
|
|
296
312
|
### Common issues
|
297
313
|
|
@@ -302,39 +318,6 @@ You might experience some strange issues when generating the documentation. Here
|
|
302
318
|
There seems to be a problem with **rspec-rails** versions 3.7 and later not automatically requiring the project's rails_helper.rb when run with the `--format` flag.
|
303
319
|
|
304
320
|
To fix this issue, generate your documentation with `--require rails_helper`:
|
305
|
-
|
306
|
-
```
|
307
|
-
bundle exec rspec -f Dox::Formatter --order defined --tag dox --out docs.md --require rails_helper
|
308
|
-
```
|
309
|
-
|
310
|
-
#### Wrap parameters issue
|
311
|
-
Rails wraps JSON parameters on all requests by default, which results with documented requests looking like this:
|
312
|
-
|
313
|
-
```
|
314
|
-
+ Request get pokemons
|
315
|
-
{
|
316
|
-
"pokemon": {}
|
317
|
-
}
|
318
|
-
```
|
319
|
-
|
320
|
-
To disable wrapping parameters with a resource name, turn off this feature in `config/initializers/wrap_parameters.rb`:
|
321
|
-
|
322
|
-
``` ruby
|
323
|
-
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
|
324
|
-
ActiveSupport.on_load(:action_controller) do
|
325
|
-
wrap_parameters format: []
|
326
|
-
end
|
327
|
-
```
|
328
|
-
|
329
|
-
#### Rendering warnings with Aglio
|
330
|
-
You might get the following warnings when rendering HTML with Aglio:
|
331
|
-
|
332
|
-
* `no headers specified (warning code 3)`
|
333
|
-
* `empty request message-body (warning code 6)`
|
334
|
-
|
335
|
-
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`.
|
336
|
-
|
337
|
-
|
338
321
|
## Development
|
339
322
|
|
340
323
|
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.
|
@@ -354,4 +337,3 @@ Dox is maintained and sponsored by [Infinum](https://infinum.co).
|
|
354
337
|
## License
|
355
338
|
|
356
339
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
357
|
-
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'dox'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "dox"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/dox.gemspec
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
require 'dox/version'
|
5
4
|
|
@@ -9,31 +8,33 @@ Gem::Specification.new do |spec|
|
|
9
8
|
spec.authors = ['Melita Kokot', 'Vedran Hrnčić']
|
10
9
|
spec.email = ['melita.kokot@gmail.com', 'vrabac266@gmail.com']
|
11
10
|
|
12
|
-
spec.summary = 'Generates API documentation for rspec in
|
11
|
+
spec.summary = 'Generates API documentation for rspec in OpenAPI format.'
|
13
12
|
spec.homepage = 'https://github.com/infinum/dox'
|
14
13
|
spec.license = 'MIT'
|
15
14
|
|
16
|
-
spec.required_ruby_version = '>=2.0.0'
|
15
|
+
spec.required_ruby_version = '>= 2.0.0'
|
17
16
|
|
18
17
|
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
19
18
|
# delete this section to allow pushing this gem to any host.
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
|
24
|
-
end
|
19
|
+
raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.' unless spec.respond_to?(:metadata)
|
20
|
+
|
21
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
25
22
|
|
26
23
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
27
24
|
spec.bindir = 'exe'
|
28
25
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
29
26
|
spec.require_paths = ['lib']
|
30
27
|
|
31
|
-
spec.add_development_dependency 'bundler'
|
28
|
+
spec.add_development_dependency 'bundler'
|
29
|
+
spec.add_development_dependency 'codeclimate-test-reporter'
|
30
|
+
spec.add_development_dependency 'json'
|
31
|
+
spec.add_development_dependency 'pry-nav'
|
32
|
+
spec.add_development_dependency 'pry-rails'
|
33
|
+
spec.add_development_dependency 'pry-stack_explorer'
|
34
|
+
spec.add_runtime_dependency 'rails', '>= 4.0'
|
32
35
|
spec.add_development_dependency 'rake', '~> 10.0'
|
33
36
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
34
|
-
spec.add_development_dependency '
|
37
|
+
spec.add_development_dependency 'rubocop'
|
35
38
|
spec.add_development_dependency 'simplecov'
|
36
|
-
spec.add_development_dependency 'codeclimate-test-reporter'
|
37
39
|
spec.add_runtime_dependency 'rspec-core'
|
38
|
-
spec.add_runtime_dependency 'rails', '>= 4.0'
|
39
40
|
end
|