minitest-reporters-json_reporter 0.1.1 → 0.2.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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.rubocop.yml +9 -2
  4. data/Announcement.txt +131 -0
  5. data/README.md +80 -9
  6. data/Rakefile +11 -0
  7. data/doc/Minitest.html +126 -0
  8. data/doc/Minitest/Reporters.html +126 -0
  9. data/doc/Minitest/Reporters/ErrorDetail.html +390 -0
  10. data/doc/Minitest/Reporters/FailDetail.html +248 -0
  11. data/doc/Minitest/Reporters/FaultDetail.html +374 -0
  12. data/doc/Minitest/Reporters/JsonReporter.html +799 -0
  13. data/doc/Minitest/Reporters/PassDetail.html +235 -0
  14. data/doc/Minitest/Reporters/SkipDetail.html +220 -0
  15. data/doc/Minitest/Reporters/TestDetail.html +509 -0
  16. data/doc/_index.html +237 -0
  17. data/doc/class_list.html +58 -0
  18. data/doc/css/common.css +1 -0
  19. data/doc/css/full_list.css +57 -0
  20. data/doc/css/style.css +339 -0
  21. data/doc/file.README.html +142 -0
  22. data/doc/file_list.html +60 -0
  23. data/doc/frames.html +26 -0
  24. data/doc/index.html +142 -0
  25. data/doc/js/app.js +219 -0
  26. data/doc/js/full_list.js +181 -0
  27. data/doc/js/jquery.js +4 -0
  28. data/doc/method_list.html +195 -0
  29. data/doc/top-level-namespace.html +112 -0
  30. data/lib/minitest/reporters/json_reporter.rb +67 -62
  31. data/lib/minitest/reporters/json_reporter/error_detail.rb +25 -0
  32. data/lib/minitest/reporters/json_reporter/fail_detail.rb +16 -0
  33. data/lib/minitest/reporters/json_reporter/fault_detail.rb +39 -0
  34. data/lib/minitest/reporters/json_reporter/pass_detail.rb +16 -0
  35. data/lib/minitest/reporters/json_reporter/skip_detail.rb +16 -0
  36. data/lib/minitest/reporters/json_reporter/test_detail.rb +43 -0
  37. data/lib/minitest/reporters/json_reporter/version.rb +6 -6
  38. data/minitest-reporters-json_reporter.gemspec +3 -2
  39. metadata +35 -5
@@ -1,4 +1,4 @@
1
- # json_reporter.rb - class MiniTest::Reporters::JsonReporter
1
+ # json_reporter.rb - class Minitest::Reporters::JsonReporter
2
2
 
3
3
  require 'json'
4
4
  require 'time'
@@ -6,15 +6,21 @@ require 'minitest'
6
6
  require 'minitest/reporters'
7
7
 
8
8
  require_relative 'json_reporter/version'
9
-
10
- # MiniTest namespace - plugins must live here
11
- module MiniTest
12
- # MiniTest::Reporters from minitest-reporters gem: See: https://github.com/kern/minitest-reporters
9
+ require_relative 'json_reporter/test_detail'
10
+ require_relative 'json_reporter/pass_detail'
11
+ require_relative 'json_reporter/fault_detail'
12
+ require_relative 'json_reporter/skip_detail'
13
+ require_relative 'json_reporter/error_detail'
14
+ require_relative 'json_reporter/fail_detail'
15
+
16
+ # Minitest namespace - plugins must live here
17
+ module Minitest
18
+ # Minitest::Reporters from minitest-reporters gem: See: https://github.com/kern/minitest-reporters
13
19
  module Reporters
14
- # MiniTest Reporter that produces a JSON output for interface in IDEs, editor
20
+ # Minitest Reporter that produces a JSON output for interface in IDEs, editor
15
21
  class JsonReporter < BaseReporter
16
- def initialize(opts = {})
17
- super(opts)
22
+ def initialize(my_options = {})
23
+ super my_options
18
24
  @skipped = 0
19
25
  @failed = 0
20
26
  @errored = 0
@@ -22,19 +28,21 @@ module MiniTest
22
28
  @storage = init_status
23
29
  end
24
30
 
31
+ attr_reader :storage
32
+
25
33
  def metadata_h
26
34
  {
27
35
  generated_by: self.class.name,
28
- version: MiniTest::Reporters::JsonReporter::VERSION,
36
+ version: Minitest::Reporters::JsonReporter::VERSION,
29
37
  time: Time.now.utc.iso8601
30
38
  }
31
39
  end
32
40
 
33
41
  def init_status
34
42
  {
35
- status: red_status,
43
+ status: green_status,
36
44
  metadata: metadata_h,
37
- statistics: {},
45
+ statistics: statistics_h,
38
46
  fails: [],
39
47
  skips: []
40
48
  }
@@ -47,15 +55,15 @@ module MiniTest
47
55
 
48
56
  def report
49
57
  super
50
- set_status # sets the sucess or failure and color in the status object
51
- @storage[:statistics][:total] = @passed + @skipped + @failed + @errored
52
- @storage[:statistics][:failed] = @failed
53
- @storage[:statistics][:errored] = @errored
54
- @storage[:statistics][:skipped] = @skipped
55
- @storage[:statistics][:passed] = @passed
56
58
 
57
- # output JSON
58
- output($stdout, @storage)
59
+ set_status # sets the success or failure and color in the status object
60
+ # options only exists once test run starts
61
+ @storage[:metadata][:options] = transform_store(options)
62
+ @storage[:statistics] = statistics_h
63
+ # Only add this if not already added and verbose option is set
64
+ @storage[:passes] ||= [] if options[:verbose]
65
+
66
+ io.write(JSON.dump(@storage))
59
67
  end
60
68
 
61
69
  def yellow?
@@ -73,11 +81,13 @@ module MiniTest
73
81
  private
74
82
 
75
83
  def set_status
76
- if yellow?
77
- @storage[:status] = yellow_status
78
- elsif green?
79
- @storage[:status] = green_status
80
- end
84
+ @storage[:status] = if red?
85
+ red_status
86
+ elsif yellow?
87
+ yellow_status
88
+ else
89
+ green_status
90
+ end
81
91
  end
82
92
 
83
93
  def color_h(code, color)
@@ -96,65 +106,60 @@ module MiniTest
96
106
  color_h('Success', 'green')
97
107
  end
98
108
 
99
- def location(exception)
100
- last_before_assertion = ''
101
-
102
- exception.backtrace.reverse_each do |s|
103
- break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/
104
- last_before_assertion = s
105
- end
106
-
107
- last_before_assertion.sub(/:in .*$/, '')
108
- end
109
-
110
- def fault_h(type, test, e)
109
+ def statistics_h
111
110
  {
112
- type: type,
113
- class: test.class.name,
114
- name: test.name,
115
- message: e.message,
116
- location: location(e)
111
+ total: @failed + @errored + @skipped + @passed,
112
+ failed: @failed,
113
+ errored: @errored,
114
+ skipped: @skipped,
115
+ passed: @passed
117
116
  }
118
117
  end
119
118
 
120
- def status(type, test, msg, &_blk)
121
- result = test.send(msg)
122
- if result
123
- e = fault_h(type, test, test.failure)
124
- yield(e)
125
- end
126
-
127
- result
128
- end
129
-
130
119
  def skipped(test)
131
- status('skipped', test, :skipped?) do |e|
132
- @storage[:skips] << e
120
+ Minitest::Reporters::SkipDetail.new(test).query do |d|
133
121
  @skipped += 1
122
+ @storage[:skips] << d.to_h
134
123
  end
135
124
  end
136
125
 
137
126
  def errored(test)
138
- status('error', test, :error?) do |e|
139
- @storage[:fails] << e
127
+ Minitest::Reporters::ErrorDetail.new(test).query do |d|
128
+ d.backtrace = filter_backtrace(d.backtrace)
129
+ @storage[:fails] << d.to_h
140
130
  @errored += 1
141
131
  end
142
132
  end
143
133
 
144
134
  def failed(test)
145
- status('failure', test, :failure) do |e|
146
- @storage[:fails] << e
135
+ Minitest::Reporters::FailDetail.new(test).query do |d|
136
+ @storage[:fails] << d.to_h
147
137
  @failed += 1
148
138
  end
149
139
  end
150
140
 
151
- def passed(_test)
152
- @passed += 1
141
+ # If it is increments @passed and optionally adds PassDetail object
142
+ # to .passes array
143
+ # if options[:verbose] == true
144
+ def passed(test)
145
+ Minitest::Reporters::PassDetail.new(test).query do |d|
146
+ @passed += 1
147
+ if options[:verbose]
148
+ @storage[:passes] ||= []
149
+ @storage[:passes] << d.to_h
150
+ end
151
+ end
153
152
  end
154
153
 
155
- # I/O
156
- def output(io, body)
157
- io.write(JSON.dump(body))
154
+ # transform_store options: make pretty object for our JSON [metadata.options]
155
+ # If :io is the IO class and == $stdout: "STDOUT"
156
+ # Delete key: total_count
157
+ def transform_store(opts)
158
+ o = opts.clone
159
+ o[:io] = o[:io].class.name
160
+ o[:io] = 'STDOUT' if opts[:io] == $stdout
161
+ o.delete(:total_count)
162
+ o
158
163
  end
159
164
  end
160
165
  end
@@ -0,0 +1,25 @@
1
+
2
+ # error_detail.rb - class Minitest::Reporters::ErrorDetail
3
+
4
+ # Minitest Namespace for all things Minitest
5
+ module Minitest
6
+ # Reporters Namespace for Minitest::Reporters reporters
7
+ module Reporters
8
+ # How to handle an error detail
9
+ class ErrorDetail < FaultDetail
10
+ def initialize(test)
11
+ super
12
+ @type = 'error'
13
+ @predicate = :error?
14
+ end
15
+
16
+ attr_accessor :backtrace
17
+
18
+ def to_h
19
+ h = super
20
+ h[:backtrace] = @backtrace
21
+ h
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ # fail_detail.rb - class Minitest::Reporters::FailDetail
2
+
3
+ # Minitest Namespace for all things Minitest
4
+ module Minitest
5
+ # Reporters Extensible reporting framework for Minitest runs
6
+ module Reporters
7
+ # FailDetail Detail of failed test
8
+ class FailDetail < FaultDetail
9
+ def initialize(test)
10
+ super
11
+ @type = 'failure'
12
+ @predicate = :failure
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,39 @@
1
+ # fault_detail.rb - class Minitest::Reporters::FaultDetail
2
+
3
+ # Minitest Base namespace for Minitest related objects
4
+ module Minitest
5
+ # Reporters - Extensible Reporting framework for Minitest
6
+ module Reporters
7
+ # superclass for SkipDetail, FailDetail and ErrorDetail
8
+ class FaultDetail < TestDetail
9
+ def initialize(test)
10
+ # Initialize for FaultDetail - sets up
11
+ # exception stuff: message, location and backtrace
12
+ super test
13
+ end
14
+
15
+ # returns string of found location of this test from backtrace
16
+ def location
17
+ @backtrace.reverse.reduce('') do |a, e|
18
+ break a if e =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/
19
+ e.sub(/:in .*$/, '')
20
+ end
21
+ end
22
+
23
+ def to_h
24
+ h = super
25
+ h[:message] = @message
26
+ h[:location] = location
27
+ h
28
+ end
29
+
30
+ protected
31
+
32
+ def setup_state
33
+ @exception = @test_obj.failure
34
+ @message = @exception.message
35
+ @backtrace = @exception.backtrace
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ # pass_detail.rb - class Minitest::Reporters::PassDetail
2
+
3
+ # Minitest Namespace for all things Minitest
4
+ module Minitest
5
+ # Reporters Extensible framework for custom Minitest reporters
6
+ module Reporters
7
+ # Handler for detail of passed tests
8
+ class PassDetail < Minitest::Reporters::TestDetail
9
+ def initialize(test)
10
+ super
11
+ @type = 'passed'
12
+ @predicate = :passed?
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # skip_detail.rb - class Minitest::Reporters::SkipDetail
2
+
3
+ # Minitest Namespace for all things Minitest
4
+ module Minitest
5
+ # Reporters - Extensible reporting framework for Minitest
6
+ module Reporters
7
+ # How to handle a skipped test.
8
+ class SkipDetail < Minitest::Reporters::FaultDetail
9
+ def initialize(test)
10
+ super
11
+ @type = 'skipped'
12
+ @predicate = :skipped?
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,43 @@
1
+ # test_detail.rb - class Minitest::Reporters::TestDetail
2
+
3
+ # Minitest Namespace for all things Minitest
4
+ module Minitest
5
+ # Reporters Extensible framework for custom Minitest reporters
6
+ module Reporters
7
+ # Base class for detail handlers
8
+ class TestDetail
9
+ def initialize(test)
10
+ @type = 'unknown'
11
+ @class_name = test.class.name
12
+ @name = test.name
13
+ @predicate = :nil?
14
+ @test_obj = test
15
+ end
16
+
17
+ attr_reader :test_obj, :predicate
18
+
19
+ def query(&_blk)
20
+ # force result to be boolean because of failure in Test is not a predicate ?
21
+ result = (@test_obj.send(@predicate) ? true : false)
22
+ if result
23
+ setup_state
24
+ yield self if block_given?
25
+ end
26
+ result
27
+ end
28
+
29
+ def to_h
30
+ {
31
+ type: @type,
32
+ class: @class_name,
33
+ name: @name
34
+ }
35
+ end
36
+
37
+ protected
38
+
39
+ def setup_state
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,12 +1,12 @@
1
- # version.rb - version constant: MiniTest::Reporters::JsonReporter::VERSION
1
+ # version.rb - version constant: Minitest::Reporters::JsonReporter::VERSION
2
2
 
3
- # MiniTest namespace - plugins must live here
4
- module MiniTest
5
- # MiniTest::Reporters from minitest-reporters gem: See: https://github.com/kern/minitest-reporters
3
+ # Minitest namespace - plugins must live here
4
+ module Minitest
5
+ # Minitest::Reporters from minitest-reporters gem: See: https://github.com/kern/minitest-reporters
6
6
  module Reporters
7
- # MiniTest Reporter that produces a JSON output for interface in IDEs, editor.
7
+ # Minitest Reporter that produces a JSON output for interface in IDEs, editor.
8
8
  class JsonReporter < BaseReporter
9
- VERSION = '0.1.1'.freeze
9
+ VERSION = '0.2.0'.freeze
10
10
  end
11
11
  end
12
12
  end
@@ -12,15 +12,16 @@ Gem::Specification.new do |spec|
12
12
  spec.email = ['ed.howland@gmail.com']
13
13
 
14
14
  spec.summary = 'JSON Reporter format for minitest-reporters gem.'
15
- spec.description = ' Formats the output of a MiniTest run as JSON. Useful for interfacing MiniTest or MiniSpec to IDEs or programming text editors, such as the Atom editor.
15
+ spec.description = ' Formats the output of a Minitest run as JSON. Useful for interfacing Minitest or MiniSpec to IDEs or programming text editors, such as the Atom editor.
16
16
  See: https://atom.io. Originally written to interface with the Viper Audible editor for blind programmers. See https://github.com/edhowland/viper'
17
- spec.homepage = "https://github.com/edhowland/minitest-reporters-json_reporter"
17
+ spec.homepage = 'https://github.com/edhowland/minitest-reporters-json_reporter'
18
18
  spec.license = 'MIT'
19
19
 
20
20
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
21
  spec.bindir = 'exe'
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ['lib']
24
+ spec.required_ruby_version = '~> 2.0'
24
25
  spec.add_runtime_dependency 'minitest', '~> 5.7'
25
26
  spec.add_runtime_dependency 'minitest-reporters', '~> 1.1.8'
26
27
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minitest-reporters-json_reporter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - edhowland
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-04-07 00:00:00.000000000 Z
11
+ date: 2016-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '10.0'
69
69
  description: |2-
70
- Formats the output of a MiniTest run as JSON. Useful for interfacing MiniTest or MiniSpec to IDEs or programming text editors, such as the Atom editor.
70
+ Formats the output of a Minitest run as JSON. Useful for interfacing Minitest or MiniSpec to IDEs or programming text editors, such as the Atom editor.
71
71
  See: https://atom.io. Originally written to interface with the Viper Audible editor for blind programmers. See https://github.com/edhowland/viper
72
72
  email:
73
73
  - ed.howland@gmail.com
@@ -78,13 +78,43 @@ files:
78
78
  - ".gitignore"
79
79
  - ".rubocop.yml"
80
80
  - ".travis.yml"
81
+ - Announcement.txt
81
82
  - CODE_OF_CONDUCT.md
82
83
  - Gemfile
83
84
  - LICENSE.txt
84
85
  - README.md
85
86
  - Rakefile
86
87
  - TODO.txt
88
+ - doc/Minitest.html
89
+ - doc/Minitest/Reporters.html
90
+ - doc/Minitest/Reporters/ErrorDetail.html
91
+ - doc/Minitest/Reporters/FailDetail.html
92
+ - doc/Minitest/Reporters/FaultDetail.html
93
+ - doc/Minitest/Reporters/JsonReporter.html
94
+ - doc/Minitest/Reporters/PassDetail.html
95
+ - doc/Minitest/Reporters/SkipDetail.html
96
+ - doc/Minitest/Reporters/TestDetail.html
97
+ - doc/_index.html
98
+ - doc/class_list.html
99
+ - doc/css/common.css
100
+ - doc/css/full_list.css
101
+ - doc/css/style.css
102
+ - doc/file.README.html
103
+ - doc/file_list.html
104
+ - doc/frames.html
105
+ - doc/index.html
106
+ - doc/js/app.js
107
+ - doc/js/full_list.js
108
+ - doc/js/jquery.js
109
+ - doc/method_list.html
110
+ - doc/top-level-namespace.html
87
111
  - lib/minitest/reporters/json_reporter.rb
112
+ - lib/minitest/reporters/json_reporter/error_detail.rb
113
+ - lib/minitest/reporters/json_reporter/fail_detail.rb
114
+ - lib/minitest/reporters/json_reporter/fault_detail.rb
115
+ - lib/minitest/reporters/json_reporter/pass_detail.rb
116
+ - lib/minitest/reporters/json_reporter/skip_detail.rb
117
+ - lib/minitest/reporters/json_reporter/test_detail.rb
88
118
  - lib/minitest/reporters/json_reporter/version.rb
89
119
  - minitest-reporters-json_reporter.gemspec
90
120
  homepage: https://github.com/edhowland/minitest-reporters-json_reporter
@@ -97,9 +127,9 @@ require_paths:
97
127
  - lib
98
128
  required_ruby_version: !ruby/object:Gem::Requirement
99
129
  requirements:
100
- - - ">="
130
+ - - "~>"
101
131
  - !ruby/object:Gem::Version
102
- version: '0'
132
+ version: '2.0'
103
133
  required_rubygems_version: !ruby/object:Gem::Requirement
104
134
  requirements:
105
135
  - - ">="