dox 1.0.0 → 1.3.0
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.
- checksums.yaml +4 -4
- data/CHANGES.md +44 -0
- data/Gemfile +1 -1
- data/README.md +48 -5
- data/dox.gemspec +3 -1
- data/lib/dox.rb +5 -0
- data/lib/dox/dsl/action.rb +1 -1
- data/lib/dox/entities/action.rb +2 -1
- data/lib/dox/entities/example.rb +24 -6
- data/lib/dox/formatter.rb +14 -3
- data/lib/dox/formatters/base.rb +19 -0
- data/lib/dox/formatters/json.rb +14 -0
- data/lib/dox/formatters/multipart.rb +21 -0
- data/lib/dox/formatters/plain.rb +9 -0
- data/lib/dox/formatters/xml.rb +14 -0
- data/lib/dox/printers/example_printer.rb +5 -15
- data/lib/dox/version.rb +1 -1
- metadata +22 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb133ea037943a10f5732ebcb2418ff01eb3664d
|
4
|
+
data.tar.gz: be31d122d267c510391b7813a662e2a8eb212d9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1deea6577862b637989fc13e783434a5120cfa6fd4c1b6d004fc25bcdc045316b45386f060eea5be0f0273655f2cd56ba0acee22e50a183eaf54422083fb729
|
7
|
+
data.tar.gz: e52dce445ee7da4fbad81137af4b8c6eb3a77e1b3700b45a11290c80d87ca8dfe1fa519c313c2ced88c293eac23b0dc410a20535715015d0293bfbec53b3bf59
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,49 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## Version 1.3.0
|
4
|
+
|
5
|
+
Released on March 26, 2021
|
6
|
+
|
7
|
+
Add:
|
8
|
+
- 'activesupport' as a runtime dependency
|
9
|
+
|
10
|
+
Drop:
|
11
|
+
- 'rails' as a runtime dependency
|
12
|
+
|
13
|
+
## Version 1.2.0
|
14
|
+
|
15
|
+
Released on November 27, 2019
|
16
|
+
|
17
|
+
New:
|
18
|
+
- Support Multipart payload with pretty formatting (based on `content-type` header)
|
19
|
+
|
20
|
+
Fix:
|
21
|
+
- Explicit passing of an empty hash for `params` in actions now works as expected
|
22
|
+
|
23
|
+
|
24
|
+
## Version 1.1.0
|
25
|
+
|
26
|
+
Released on February 19, 2018
|
27
|
+
|
28
|
+
New:
|
29
|
+
- Full RSpec failure dump to stderr if any test fails when running tests with Dox::Formatter
|
30
|
+
- Support any payload format with pretty formatting for JSON and XML (based on `content-type` header)
|
31
|
+
|
32
|
+
Fix:
|
33
|
+
- Ignore subdomain request header in headers output
|
34
|
+
|
35
|
+
|
36
|
+
## Version 1.0.1
|
37
|
+
|
38
|
+
Released on June 10, 2017
|
39
|
+
|
40
|
+
New:
|
41
|
+
- Add Rake tasks for generating documentation to Readme
|
42
|
+
|
43
|
+
Fix:
|
44
|
+
- Fix printing request body for test examples
|
45
|
+
|
46
|
+
|
3
47
|
## Version 1.0.0
|
4
48
|
|
5
49
|
Released on May 6, 2017
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
# Dox
|
6
6
|
|
7
|
-
Automate your documentation writing
|
7
|
+
Automate your documentation writing process! Dox generates API documentation from Rspec controller/request specs in a Rails application. It formats the test's output in the [API Blueprint](https://apiblueprint.org) format. Choose one of the [renderers](#renderers) to convert it to HTML or host it on [Apiary.io](https://apiary.io)
|
8
8
|
|
9
9
|
Here's a [demo app](https://github.com/infinum/dox-demo) and here are some examples:
|
10
10
|
|
@@ -19,7 +19,7 @@ Add this line to your application's Gemfile:
|
|
19
19
|
|
20
20
|
```ruby
|
21
21
|
group :test do
|
22
|
-
gem 'dox', require:
|
22
|
+
gem 'dox', require: false
|
23
23
|
end
|
24
24
|
```
|
25
25
|
|
@@ -47,7 +47,7 @@ $ gem install dox
|
|
47
47
|
and configure rspec with this:
|
48
48
|
|
49
49
|
``` ruby
|
50
|
-
|
50
|
+
RSpec.configure do |config|
|
51
51
|
config.after(:each, :dox) do |example|
|
52
52
|
example.metadata[:request] = request
|
53
53
|
example.metadata[:response] = response
|
@@ -242,13 +242,46 @@ end
|
|
242
242
|
### Generate documentation
|
243
243
|
Documentation is generated in 2 steps:
|
244
244
|
|
245
|
-
1. generate API Blueprint markdown
|
246
|
-
```bundle exec
|
245
|
+
1. generate API Blueprint markdown:
|
246
|
+
```bundle exec rspec spec/controllers/api/v1 -f Dox::Formatter --order defined --tag dox --out docs.md```
|
247
247
|
|
248
248
|
2. render HTML with some renderer, for example, with Aglio:
|
249
249
|
```aglio -i docs.md -o docs.html```
|
250
250
|
|
251
251
|
|
252
|
+
#### Use rake tasks
|
253
|
+
It's recommendable to write a few rake tasks to make things easier. Here's an example:
|
254
|
+
|
255
|
+
```ruby
|
256
|
+
namespace :api do
|
257
|
+
namespace :doc do
|
258
|
+
desc 'Generate API documentation markdown'
|
259
|
+
task :md do
|
260
|
+
require 'rspec/core/rake_task'
|
261
|
+
|
262
|
+
RSpec::Core::RakeTask.new(:api_spec) do |t|
|
263
|
+
t.pattern = 'spec/controllers/api/v1/'
|
264
|
+
t.rspec_opts = "-f Dox::Formatter --order defined --tag dox --out public/api/docs/v1/apispec.md"
|
265
|
+
end
|
266
|
+
|
267
|
+
Rake::Task['api_spec'].invoke
|
268
|
+
end
|
269
|
+
|
270
|
+
task html: :md do
|
271
|
+
`aglio -i public/api/docs/v1/apispec.md -o public/api/docs/v1/index.html`
|
272
|
+
end
|
273
|
+
|
274
|
+
task open: :html do
|
275
|
+
`open public/api/docs/v1/index.html`
|
276
|
+
end
|
277
|
+
|
278
|
+
task publish: :md do
|
279
|
+
`apiary publish --path=public/api/docs/v1/apispec.md --api-name=doxdemo`
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
```
|
284
|
+
|
252
285
|
#### Renderers
|
253
286
|
You can render the HTML yourself with one of the renderers:
|
254
287
|
|
@@ -264,6 +297,16 @@ Or you can just take your generated markdown and host your documentation on [Api
|
|
264
297
|
|
265
298
|
You might experience some strange issues when generating the documentation. Here are a few examples of what we've encountered so far.
|
266
299
|
|
300
|
+
#### Uninitialized constant errors
|
301
|
+
|
302
|
+
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
|
+
|
304
|
+
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
|
+
|
267
310
|
#### Wrap parameters issue
|
268
311
|
Rails wraps JSON parameters on all requests by default, which results with documented requests looking like this:
|
269
312
|
|
data/dox.gemspec
CHANGED
@@ -13,6 +13,8 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.homepage = 'https://github.com/infinum/dox'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
16
|
+
spec.required_ruby_version = '>=2.0.0'
|
17
|
+
|
16
18
|
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
17
19
|
# delete this section to allow pushing this gem to any host.
|
18
20
|
if spec.respond_to?(:metadata)
|
@@ -26,6 +28,7 @@ Gem::Specification.new do |spec|
|
|
26
28
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
29
|
spec.require_paths = ['lib']
|
28
30
|
|
31
|
+
spec.add_runtime_dependency 'activesupport', '>= 4.0'
|
29
32
|
spec.add_development_dependency 'bundler', '~> 1.11'
|
30
33
|
spec.add_development_dependency 'rake', '~> 10.0'
|
31
34
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
@@ -33,5 +36,4 @@ Gem::Specification.new do |spec|
|
|
33
36
|
spec.add_development_dependency 'simplecov'
|
34
37
|
spec.add_development_dependency 'codeclimate-test-reporter'
|
35
38
|
spec.add_runtime_dependency 'rspec-core'
|
36
|
-
spec.add_runtime_dependency 'rails', '>= 4.0'
|
37
39
|
end
|
data/lib/dox.rb
CHANGED
@@ -19,6 +19,11 @@ require 'dox/errors/invalid_action_error'
|
|
19
19
|
require 'dox/errors/invalid_resource_error'
|
20
20
|
require 'dox/errors/invalid_resource_group_error'
|
21
21
|
require 'dox/formatter'
|
22
|
+
require 'dox/formatters/base'
|
23
|
+
require 'dox/formatters/json'
|
24
|
+
require 'dox/formatters/multipart'
|
25
|
+
require 'dox/formatters/plain'
|
26
|
+
require 'dox/formatters/xml'
|
22
27
|
require 'dox/printers/base_printer'
|
23
28
|
require 'dox/printers/action_printer'
|
24
29
|
require 'dox/printers/document_printer'
|
data/lib/dox/dsl/action.rb
CHANGED
data/lib/dox/entities/action.rb
CHANGED
@@ -30,7 +30,8 @@ module Dox
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def path_params
|
33
|
-
@path_params ||=
|
33
|
+
@path_params ||=
|
34
|
+
request.path_parameters.symbolize_keys.except(:action, :controller, :format, :subdomain)
|
34
35
|
end
|
35
36
|
|
36
37
|
def template_path_params
|
data/lib/dox/entities/example.rb
CHANGED
@@ -5,7 +5,6 @@ module Dox
|
|
5
5
|
|
6
6
|
def_delegator :response, :status, :response_status
|
7
7
|
def_delegator :response, :content_type, :response_content_type
|
8
|
-
def_delegator :response, :body, :response_body
|
9
8
|
def_delegator :request, :content_type, :request_content_type
|
10
9
|
def_delegator :request, :method, :request_method
|
11
10
|
|
@@ -15,10 +14,12 @@ module Dox
|
|
15
14
|
@response = response
|
16
15
|
end
|
17
16
|
|
18
|
-
def
|
19
|
-
request
|
20
|
-
|
21
|
-
|
17
|
+
def request_body
|
18
|
+
@request_body ||= format_content(request, request_content_type)
|
19
|
+
end
|
20
|
+
|
21
|
+
def response_body
|
22
|
+
@response_body ||= format_content(response, response_content_type)
|
22
23
|
end
|
23
24
|
|
24
25
|
def request_identifier
|
@@ -44,9 +45,26 @@ module Dox
|
|
44
45
|
|
45
46
|
private
|
46
47
|
|
48
|
+
def format_content(http_env, content_type)
|
49
|
+
formatter(content_type).new(http_env).format
|
50
|
+
end
|
51
|
+
|
52
|
+
def formatter(content_type)
|
53
|
+
case content_type
|
54
|
+
when %r{application\/.*json}
|
55
|
+
Dox::Formatters::Json
|
56
|
+
when /xml/
|
57
|
+
Dox::Formatters::Xml
|
58
|
+
when /multipart/
|
59
|
+
Dox::Formatters::Multipart
|
60
|
+
else
|
61
|
+
Dox::Formatters::Plain
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
47
65
|
# Rails 5.0.2 returns "" for request.path
|
48
66
|
def request_path
|
49
|
-
request.path.presence || request.fullpath.split(
|
67
|
+
request.path.presence || request.fullpath.split('?')[0]
|
50
68
|
end
|
51
69
|
|
52
70
|
attr_reader :desc, :request, :response
|
data/lib/dox/formatter.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'rspec/core'
|
2
2
|
require 'rspec/core/formatters/base_formatter'
|
3
|
+
require 'rspec/core/formatters/console_codes'
|
3
4
|
|
4
5
|
module Dox
|
5
6
|
class Formatter < RSpec::Core::Formatters::BaseFormatter
|
6
7
|
extend Forwardable
|
7
8
|
|
8
|
-
RSpec::Core::Formatters.register self, :example_passed, :stop
|
9
|
+
RSpec::Core::Formatters.register self, :example_passed, :stop, :dump_summary
|
9
10
|
|
10
11
|
def initialize(output)
|
11
12
|
super
|
@@ -17,8 +18,18 @@ module Dox
|
|
17
18
|
move_example_to_passed if current_example.document?
|
18
19
|
end
|
19
20
|
|
20
|
-
def stop(
|
21
|
-
|
21
|
+
def stop(notification)
|
22
|
+
if notification.failed_examples.any?
|
23
|
+
$stderr.puts(notification.fully_formatted_failed_examples)
|
24
|
+
else
|
25
|
+
printer.print(passed_examples)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def dump_summary(summary)
|
30
|
+
return if summary.failed_examples.none?
|
31
|
+
$stderr.puts(summary.fully_formatted)
|
32
|
+
exit(-1)
|
22
33
|
end
|
23
34
|
|
24
35
|
private
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Dox
|
2
|
+
module Formatters
|
3
|
+
class Base
|
4
|
+
def initialize(http_env)
|
5
|
+
@http_env = http_env
|
6
|
+
http_env_body = http_env.body
|
7
|
+
@body = http_env_body.respond_to?(:read) ? http_env_body.read : http_env_body
|
8
|
+
end
|
9
|
+
|
10
|
+
def format
|
11
|
+
raise 'no format method defined in formatter'
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
attr_reader :http_env, :body
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Dox
|
2
|
+
module Formatters
|
3
|
+
class Json < Dox::Formatters::Base
|
4
|
+
def format
|
5
|
+
# in cases where the body isn't valid JSON
|
6
|
+
# and the headers specify the Content-Type is application/json
|
7
|
+
# an error should be raised
|
8
|
+
return '' if body.nil? || body.length < 2
|
9
|
+
|
10
|
+
JSON.pretty_generate(JSON.parse(body))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Dox
|
2
|
+
module Formatters
|
3
|
+
class Multipart
|
4
|
+
def initialize(http_env)
|
5
|
+
@http_env = http_env
|
6
|
+
end
|
7
|
+
|
8
|
+
def format
|
9
|
+
JSON.pretty_generate(extracted_multipart)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def extracted_multipart
|
15
|
+
Rack::Multipart.extract_multipart(http_env)
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader :http_env
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Dox
|
2
|
+
module Formatters
|
3
|
+
class Xml < Dox::Formatters::Base
|
4
|
+
def format
|
5
|
+
doc = REXML::Document.new(body)
|
6
|
+
formatter = REXML::Formatters::Pretty.new
|
7
|
+
formatter.compact = true
|
8
|
+
result = ''
|
9
|
+
formatter.write(doc, result)
|
10
|
+
result
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
|
1
3
|
module Dox
|
2
4
|
module Printers
|
3
5
|
class ExamplePrinter < BasePrinter
|
@@ -14,7 +16,7 @@ module Dox
|
|
14
16
|
def print_example_request
|
15
17
|
@output.puts example_request_title
|
16
18
|
@output.puts example_request_headers
|
17
|
-
return unless example.
|
19
|
+
return unless example.request_body.present?
|
18
20
|
|
19
21
|
@output.puts example_request_body
|
20
22
|
end
|
@@ -52,7 +54,7 @@ module Dox
|
|
52
54
|
|
53
55
|
+ Body
|
54
56
|
|
55
|
-
#{indent_lines(12,
|
57
|
+
#{indent_lines(12, example.request_body)}
|
56
58
|
HEREDOC
|
57
59
|
end
|
58
60
|
|
@@ -77,22 +79,10 @@ module Dox
|
|
77
79
|
|
78
80
|
+ Body
|
79
81
|
|
80
|
-
#{indent_lines(12,
|
82
|
+
#{indent_lines(12, example.response_body)}
|
81
83
|
HEREDOC
|
82
84
|
end
|
83
85
|
|
84
|
-
def safe_json_parse(json_string)
|
85
|
-
json_string.length >= 2 ? JSON.parse(json_string) : nil
|
86
|
-
end
|
87
|
-
|
88
|
-
def pretty_json(json_string)
|
89
|
-
if json_string.present?
|
90
|
-
JSON.pretty_generate(json_string)
|
91
|
-
else
|
92
|
-
''
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
86
|
def print_headers(headers)
|
97
87
|
headers.map do |key, value|
|
98
88
|
"#{key}: #{value}"
|
data/lib/dox/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Melita Kokot
|
@@ -9,8 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-03-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '4.0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '4.0'
|
14
28
|
- !ruby/object:Gem::Dependency
|
15
29
|
name: bundler
|
16
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,20 +123,6 @@ dependencies:
|
|
109
123
|
- - ">="
|
110
124
|
- !ruby/object:Gem::Version
|
111
125
|
version: '0'
|
112
|
-
- !ruby/object:Gem::Dependency
|
113
|
-
name: rails
|
114
|
-
requirement: !ruby/object:Gem::Requirement
|
115
|
-
requirements:
|
116
|
-
- - ">="
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
version: '4.0'
|
119
|
-
type: :runtime
|
120
|
-
prerelease: false
|
121
|
-
version_requirements: !ruby/object:Gem::Requirement
|
122
|
-
requirements:
|
123
|
-
- - ">="
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: '4.0'
|
126
126
|
description:
|
127
127
|
email:
|
128
128
|
- melita.kokot@gmail.com
|
@@ -166,6 +166,11 @@ files:
|
|
166
166
|
- lib/dox/errors/invalid_resource_error.rb
|
167
167
|
- lib/dox/errors/invalid_resource_group_error.rb
|
168
168
|
- lib/dox/formatter.rb
|
169
|
+
- lib/dox/formatters/base.rb
|
170
|
+
- lib/dox/formatters/json.rb
|
171
|
+
- lib/dox/formatters/multipart.rb
|
172
|
+
- lib/dox/formatters/plain.rb
|
173
|
+
- lib/dox/formatters/xml.rb
|
169
174
|
- lib/dox/printers/action_printer.rb
|
170
175
|
- lib/dox/printers/base_printer.rb
|
171
176
|
- lib/dox/printers/document_printer.rb
|
@@ -187,7 +192,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
187
192
|
requirements:
|
188
193
|
- - ">="
|
189
194
|
- !ruby/object:Gem::Version
|
190
|
-
version:
|
195
|
+
version: 2.0.0
|
191
196
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
192
197
|
requirements:
|
193
198
|
- - ">="
|