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
|
module RSpec
module Core
module Bisect
# @private
ExampleSetDescriptor = Struct.new(:all_example_ids, :failed_example_ids)
# @private
class BisectFailedError < StandardError
def self.for_failed_spec_run(spec_output)
new("Failed to get results from the spec run. Spec run output:\n\n" +
spec_output)
end
end
# Wraps a `formatter` providing a simple means to notify it in place
# of an `RSpec::Core::Reporter`, without involving configuration in
# any way.
# @private
class Notifier
def initialize(formatter)
@formatter = formatter
end
def publish(event, *args)
return unless @formatter.respond_to?(event)
notification = Notifications::CustomNotification.for(*args)
@formatter.__send__(event, notification)
end
end
# Wraps a pipe to support sending objects between a child and
# parent process. Where supported, encoding is explicitly
# set to ensure binary data is able to pass from child to
# parent.
# @private
class Channel
if String.method_defined?(:encoding)
MARSHAL_DUMP_ENCODING = Marshal.dump("").encoding
end
def initialize
@read_io, @write_io = IO.pipe
if defined?(MARSHAL_DUMP_ENCODING) && IO.method_defined?(:set_encoding)
# Ensure the pipe can send any content produced by Marshal.dump
@write_io.set_encoding MARSHAL_DUMP_ENCODING
end
end
def send(message)
packet = Marshal.dump(message)
@write_io.write("#{packet.bytesize}\n#{packet}")
end
# rubocop:disable Security/MarshalLoad
def receive
packet_size = Integer(@read_io.gets)
Marshal.load(@read_io.read(packet_size))
end
# rubocop:enable Security/MarshalLoad
def close
@read_io.close
@write_io.close
end
end
end
end
end
|