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 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: []