minitest-reporters-json_reporter 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
  - - ">="