minitest_apidoc 0.0.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 +7 -0
- data/lib/minitest/api_doc_plugin.rb +54 -0
- data/lib/minitest/document.rb +29 -0
- data/lib/minitest/holder/test.rb +79 -0
- data/lib/minitest/markdown.rb +32 -0
- data/lib/minitest/test_case_extension.rb +33 -0
- data/lib/minitest_apidoc.rb +13 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0c9526c1cad962bec6b662954fb434d38523b759
|
4
|
+
data.tar.gz: 591f9e60c2d776fed70620a7b9e7cdcdd1b62065
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 514371eaf5ccf57c4e48507b45bc7bda70e575a3fb571f6fbb9b1cfadfd717fa8288053332144000d2e89f47131e5686ab0226c5c48633aa79b07fccf0834024
|
7
|
+
data.tar.gz: 395ebc533f727bb1dabc55b34680692fbd74feb073cfa7201ed1111805edaff729592b40496495af132b3ec3ccbd6b4dc05b3996b5518b4d41323792f8a66498
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require_relative 'markdown'
|
2
|
+
require_relative 'holder/test'
|
3
|
+
require_relative 'document'
|
4
|
+
require_relative 'test_case_extension'
|
5
|
+
module Minitest
|
6
|
+
ActionController::TestCase.include TestCase::Extension
|
7
|
+
|
8
|
+
def self.plugin_api_doc_init(options)
|
9
|
+
Minitest.reporter << ApiDocReporter.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.plugin_api_doc_options(opts, options)
|
13
|
+
end
|
14
|
+
|
15
|
+
class ApiDocReporter < AbstractReporter
|
16
|
+
attr_accessor :test_holders
|
17
|
+
def initialize
|
18
|
+
@test_holders = []
|
19
|
+
end
|
20
|
+
|
21
|
+
def record result
|
22
|
+
return unless valid_for_doc? result
|
23
|
+
klass = result.class
|
24
|
+
holder =
|
25
|
+
find_holder(klass) ||
|
26
|
+
new_holder(klass, klass.test_class_desc)
|
27
|
+
holder.perform(result)
|
28
|
+
end
|
29
|
+
|
30
|
+
def report
|
31
|
+
Document.new(test_holders).print
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def valid_for_doc? result
|
37
|
+
result.class < ActionController::TestCase &&
|
38
|
+
result.test_desc.present? &&
|
39
|
+
result.class.test_class_desc.present?
|
40
|
+
end
|
41
|
+
|
42
|
+
def find_holder klass
|
43
|
+
test_holders.find do |holder|
|
44
|
+
holder.klass == klass
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def new_holder klass, klass_desc
|
49
|
+
Holder::Test.new(klass, klass_desc).tap do |h|
|
50
|
+
test_holders << h
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Document
|
2
|
+
attr_accessor :holders, :md
|
3
|
+
def initialize holders
|
4
|
+
self.holders = holders
|
5
|
+
end
|
6
|
+
def print
|
7
|
+
# TODO italic markdown
|
8
|
+
File.open("api_documentation.md", "wt") do |f|
|
9
|
+
@md = Markdown.new
|
10
|
+
holders.each do |holder|
|
11
|
+
f.puts md.header(holder.klass_desc)
|
12
|
+
holder.units.each do |unit|
|
13
|
+
f.puts md.sub_header unit.name
|
14
|
+
f.puts md.default(unit.test_desc)
|
15
|
+
f.puts md.sub_sub_header unit.path_title
|
16
|
+
f.puts md.italic unit.path
|
17
|
+
f.puts md.sub_sub_header unit.method_title
|
18
|
+
f.puts md.italic unit.method
|
19
|
+
f.puts md.sub_sub_header unit.params_title
|
20
|
+
f.puts md.code unit.params
|
21
|
+
f.puts md.sub_sub_header unit.body_title
|
22
|
+
f.puts md.code(unit.body)
|
23
|
+
f.puts md.sub_sub_header unit.status_title
|
24
|
+
f.puts md.italic unit.status
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Holder
|
2
|
+
class Test
|
3
|
+
attr_accessor :klass, :klass_desc, :units
|
4
|
+
def initialize klass, klass_desc
|
5
|
+
Markdown
|
6
|
+
@klass = klass
|
7
|
+
@klass_desc = klass_desc
|
8
|
+
@units = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def perform result
|
12
|
+
units << Unit.new(result).tap(&:perform )
|
13
|
+
end
|
14
|
+
end
|
15
|
+
class Unit
|
16
|
+
attr_accessor :test_desc, :result, :path, :method, :params,
|
17
|
+
:body, :status, :header, :name
|
18
|
+
def initialize result
|
19
|
+
@result = result
|
20
|
+
end
|
21
|
+
|
22
|
+
def perform
|
23
|
+
self.name = humanize_name
|
24
|
+
@test_desc = result.test_desc
|
25
|
+
hold_request
|
26
|
+
hold_response
|
27
|
+
end
|
28
|
+
|
29
|
+
def params
|
30
|
+
@params.presence || {}
|
31
|
+
end
|
32
|
+
|
33
|
+
def body
|
34
|
+
@body.presence || {}
|
35
|
+
end
|
36
|
+
|
37
|
+
def path_title
|
38
|
+
'path'
|
39
|
+
end
|
40
|
+
|
41
|
+
def method_title
|
42
|
+
'method'
|
43
|
+
end
|
44
|
+
|
45
|
+
def params_title
|
46
|
+
'parameter'
|
47
|
+
end
|
48
|
+
|
49
|
+
def status_title
|
50
|
+
'status'
|
51
|
+
end
|
52
|
+
|
53
|
+
def body_title
|
54
|
+
'body'
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def hold_request
|
60
|
+
request = result.request
|
61
|
+
self.path = request.path
|
62
|
+
self.method = request.method
|
63
|
+
self.params = request.env["action_dispatch.request.request_parameters"].presence ||
|
64
|
+
request.env["action_dispatch.request.query_parameters"].presence
|
65
|
+
end
|
66
|
+
|
67
|
+
def hold_response
|
68
|
+
response = result.response
|
69
|
+
self.body = response.body
|
70
|
+
self.status = response.status
|
71
|
+
self.header = response.header['Content-Type']
|
72
|
+
end
|
73
|
+
|
74
|
+
def humanize_name
|
75
|
+
result.name.sub('test_', '').humanize
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class Markdown
|
2
|
+
def header text
|
3
|
+
'# ' + text
|
4
|
+
end
|
5
|
+
|
6
|
+
def sub_header text
|
7
|
+
'## ' + text
|
8
|
+
end
|
9
|
+
|
10
|
+
def sub_sub_header text
|
11
|
+
'### ' + text
|
12
|
+
end
|
13
|
+
|
14
|
+
def default text
|
15
|
+
text
|
16
|
+
end
|
17
|
+
|
18
|
+
def next_line
|
19
|
+
''
|
20
|
+
end
|
21
|
+
|
22
|
+
def code text
|
23
|
+
text = text.is_a?(Hash) ? text : eval(text.gsub('null', 'nil'))
|
24
|
+
"```json \n " +
|
25
|
+
JSON.pretty_generate(text) + "\n" +
|
26
|
+
"```"
|
27
|
+
end
|
28
|
+
|
29
|
+
def italic text
|
30
|
+
"*#{text}*"
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module TestCase
|
2
|
+
module Extension
|
3
|
+
def self.included base
|
4
|
+
def base.inherited subclass
|
5
|
+
super subclass
|
6
|
+
subclass.extend ClassMethods
|
7
|
+
subclass.include InstanceMethods
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
def desc description
|
13
|
+
@test_class_desc = description
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_class_desc
|
17
|
+
@test_class_desc
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
module InstanceMethods
|
23
|
+
extend ActiveSupport::Concern
|
24
|
+
included do
|
25
|
+
attr_reader :test_desc
|
26
|
+
end
|
27
|
+
|
28
|
+
def desc description
|
29
|
+
@test_desc = description
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: minitest_apidoc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alexander Ibrahim
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-08-12 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: simple api documentation of minitest
|
14
|
+
email: alxibra@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/minitest/api_doc_plugin.rb
|
20
|
+
- lib/minitest/document.rb
|
21
|
+
- lib/minitest/holder/test.rb
|
22
|
+
- lib/minitest/markdown.rb
|
23
|
+
- lib/minitest/test_case_extension.rb
|
24
|
+
- lib/minitest_apidoc.rb
|
25
|
+
homepage: http://rubygems.org/gems/hola
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 2.6.2
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: simple api documentation of minitest
|
49
|
+
test_files: []
|