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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
class RSpecJUnitFormatter < RSpec::Core::Formatters::BaseFormatter
RSpec::Core::Formatters.register self,
:start,
:stop,
:dump_summary
def start(notification)
@start_notification = notification
@started = Time.now
super
end
def stop(notification)
@examples_notification = notification
end
def dump_summary(notification)
@summary_notification = notification
without_color { xml_dump }
end
private
attr_reader :started
def example_count
@summary_notification.example_count
end
def pending_count
@summary_notification.pending_count
end
def failure_count
@summary_notification.failure_count
end
def duration
@summary_notification.duration
end
def examples
@examples_notification.notifications
end
def result_of(notification)
notification.example.execution_result.status
end
def example_group_file_path_for(notification)
metadata = notification.example.metadata[:example_group]
while parent_metadata = metadata[:parent_example_group]
metadata = parent_metadata
end
metadata[:file_path]
end
def classname_for(notification)
fp = example_group_file_path_for(notification)
fp.sub(%r{\.[^/]*\Z}, "").gsub("/", ".").gsub(%r{\A\.+|\.+\Z}, "")
end
def duration_for(notification)
notification.example.execution_result.run_time
end
def description_for(notification)
notification.example.full_description
end
def failure_type_for(example)
exception_for(example).class.name
end
def failure_message_for(example)
strip_diff_colors(exception_for(example).to_s)
end
def failure_for(notification)
strip_diff_colors(notification.message_lines.join("\n")) << "\n" << notification.formatted_backtrace.join("\n")
end
def exception_for(notification)
notification.example.execution_result.exception
end
# rspec makes it really difficult to swap in configuration temporarily due to
# the way it cascades defaults, command line arguments, and user
# configuration. This method makes sure configuration gets swapped in
# correctly, but also that the original state is definitely restored.
def swap_rspec_configuration(key, value)
unset = Object.new
force = RSpec.configuration.send(:value_for, key) { unset }
if unset.equal?(force)
previous = RSpec.configuration.send(key)
RSpec.configuration.send(:"#{key}=", value)
else
RSpec.configuration.force({key => value})
end
yield
ensure
if unset.equal?(force)
RSpec.configuration.send(:"#{key}=", previous)
else
RSpec.configuration.force({key => force})
end
end
# Completely gross hack for absolutely forcing off colorising for the
# duration of a block.
if RSpec.configuration.respond_to?(:color_mode=)
def without_color(&block)
swap_rspec_configuration(:color_mode, :off, &block)
end
elsif RSpec.configuration.respond_to?(:color=)
def without_color(&block)
swap_rspec_configuration(:color, false, &block)
end
else
warn 'rspec_junit_formatter cannot prevent colorising due to an unexpected RSpec.configuration format'
def without_color
yield
end
end
def stdout_for(example_notification)
example_notification.example.metadata[:stdout]
end
def stderr_for(example_notification)
example_notification.example.metadata[:stderr]
end
end
# rspec-core 3.0.x forgot to mark this as a module function which causes:
#
# NoMethodError: undefined method `wrap' for RSpec::Core::Notifications::NullColorizer:Class
# .../rspec-core-3.0.4/lib/rspec/core/notifications.rb:229:in `add_shared_group_line'
# .../rspec-core-3.0.4/lib/rspec/core/notifications.rb:157:in `message_lines'
#
if defined?(RSpec::Core::Notifications::NullColorizer) && RSpec::Core::Notifications::NullColorizer.is_a?(Class) && !RSpec::Core::Notifications::NullColorizer.respond_to?(:wrap)
RSpec::Core::Notifications::NullColorizer.class_eval do
def self.wrap(*args)
new.wrap(*args)
end
end
end
|