minitest_apidoc 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,13 @@
1
+ require_relative 'minitest/test_case_extension'
2
+ require_relative 'minitest/api_doc_plugin'
3
+ class MinitestApidoc
4
+ VERSION = '0.0.0'.freeze
5
+
6
+ def self.version
7
+ VERSION
8
+ end
9
+
10
+ def self.hello
11
+ 'hello world'
12
+ end
13
+ 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: []