-
-
Notifications
You must be signed in to change notification settings - Fork 763
/
json_formatter.rb
95 lines (82 loc) · 2.87 KB
/
json_formatter.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
require 'rspec/core/formatters/base_formatter'
require 'json'
module RSpec
module Core
module Formatters
class JsonFormatter < BaseFormatter
Formatters.register self, :message, :dump_summary, :stop, :close,
:dump_profile
attr_reader :output_hash
def initialize(output)
super
@output_hash = {}
end
def message(notification)
(@output_hash[:messages] ||= []) << notification.message
end
def dump_summary(summary)
@output_hash[:summary] = {
:duration => summary.duration,
:example_count => summary.example_count,
:failure_count => summary.failure_count,
:pending_count => summary.pending_count
}
@output_hash[:summary_line] = summary.summary_line
dump_profile unless mute_profile_output?(summary.failure_count)
end
def stop(notification)
@output_hash[:examples] = examples.map do |example|
format_example(example).tap do |hash|
if e=example.exception
hash[:exception] = {
:class => e.class.name,
:message => e.message,
:backtrace => e.backtrace,
}
end
end
end
end
def close(notification)
output.write @output_hash.to_json
output.close if IO === output && output != $stdout
end
def dump_profile
@output_hash[:profile] = {}
dump_profile_slowest_examples
dump_profile_slowest_example_groups
end
# @api private
def dump_profile_slowest_examples
@output_hash[:profile] = {}
sorted_examples = slowest_examples
@output_hash[:profile][:examples] = sorted_examples[:examples].map do |example|
format_example(example).tap do |hash|
hash[:run_time] = example.execution_result[:run_time]
end
end
@output_hash[:profile][:slowest] = sorted_examples[:slows]
@output_hash[:profile][:total] = sorted_examples[:total]
end
# @api private
def dump_profile_slowest_example_groups
@output_hash[:profile] ||= {}
@output_hash[:profile][:groups] = slowest_groups.map do |loc, hash|
hash.update(:location => loc)
end
end
private
def format_example(example)
{
:description => example.description,
:full_description => example.full_description,
:status => example.execution_result[:status],
:file_path => example.metadata[:file_path],
:line_number => example.metadata[:line_number],
:run_time => example.execution_result[:run_time]
}
end
end
end
end
end