/
utilities.rb
69 lines (60 loc) · 2 KB
/
utilities.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
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