test_bench-session 2.1.3.2 → 3.0.0.0.pre.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/test_bench/session/controls/backtrace/location.rb +46 -0
- data/lib/test_bench/session/controls/backtrace.rb +81 -0
- data/lib/test_bench/session/controls/comment_disposition.rb +15 -0
- data/lib/test_bench/session/controls/event.rb +27 -1
- data/lib/test_bench/session/controls/events/aborted.rb +49 -0
- data/lib/test_bench/session/controls/events/commented.rb +26 -76
- data/lib/test_bench/session/controls/events/context_finished.rb +68 -28
- data/lib/test_bench/session/controls/events/context_started.rb +17 -32
- data/lib/test_bench/session/controls/events/detailed.rb +26 -76
- data/lib/test_bench/session/controls/events/failed.rb +16 -24
- data/lib/test_bench/session/controls/events/file_executed.rb +99 -0
- data/lib/test_bench/session/controls/events/file_not_found.rb +39 -0
- data/lib/test_bench/session/controls/events/file_queued.rb +39 -0
- data/lib/test_bench/session/controls/events/skipped.rb +49 -0
- data/lib/test_bench/session/controls/events/test_finished.rb +48 -28
- data/lib/test_bench/session/controls/events/test_started.rb +17 -32
- data/lib/test_bench/session/controls/events.rb +19 -19
- data/lib/test_bench/session/controls/exception/message.rb +21 -0
- data/lib/test_bench/session/controls/exception/raise.rb +50 -0
- data/lib/test_bench/session/controls/exception.rb +55 -21
- data/lib/test_bench/session/controls/message.rb +41 -0
- data/lib/test_bench/session/controls/{time.rb → metadata.rb} +1 -1
- data/lib/test_bench/session/controls/path/apex_directory.rb +74 -0
- data/lib/test_bench/session/controls/path/file/create.rb +111 -0
- data/lib/test_bench/session/controls/path/file.rb +40 -0
- data/lib/test_bench/session/controls/path.rb +85 -0
- data/lib/test_bench/session/controls/random.rb +1 -1
- data/lib/test_bench/session/controls/result.rb +3 -11
- data/lib/test_bench/session/controls/{events/event_data.rb → sequence.rb} +4 -2
- data/lib/test_bench/session/controls/status.rb +90 -0
- data/lib/test_bench/session/controls/telemetry.rb +13 -0
- data/lib/test_bench/session/controls/telemetry_sink.rb +29 -1
- data/lib/test_bench/session/controls/text.rb +31 -0
- data/lib/test_bench/session/controls/title.rb +12 -12
- data/lib/test_bench/session/controls.rb +31 -26
- data/lib/test_bench/session/defaults.rb +15 -0
- data/lib/test_bench/session/events.rb +12 -15
- data/lib/test_bench/session/exception/format_backtrace/substitute.rb +32 -0
- data/lib/test_bench/session/exception/format_backtrace.rb +112 -0
- data/lib/test_bench/session/isolate/substitute.rb +43 -0
- data/lib/test_bench/session/isolate.rb +157 -0
- data/lib/test_bench/session/result.rb +42 -0
- data/lib/test_bench/session/session.rb +137 -164
- data/lib/test_bench/session/status.rb +58 -0
- data/lib/test_bench/session/substitute/sink.rb +30 -45
- data/lib/test_bench/session/substitute.rb +91 -52
- data/lib/test_bench/session/trace.rb +51 -0
- data/lib/test_bench/session.rb +15 -15
- metadata +53 -45
- data/lib/test_bench/session/controls/comment.rb +0 -105
- data/lib/test_bench/session/controls/detail.rb +0 -91
- data/lib/test_bench/session/controls/events/context_skipped.rb +0 -47
- data/lib/test_bench/session/controls/events/fixture_finished.rb +0 -53
- data/lib/test_bench/session/controls/events/fixture_started.rb +0 -47
- data/lib/test_bench/session/controls/events/test_skipped.rb +0 -47
- data/lib/test_bench/session/controls/failure.rb +0 -19
- data/lib/test_bench/session/controls/fixture.rb +0 -19
- data/lib/test_bench/session/controls/output/detail.rb +0 -29
- data/lib/test_bench/session/controls/output.rb +0 -55
- data/lib/test_bench/session/controls/process_id.rb +0 -7
- data/lib/test_bench/session/controls/substitute/path.rb +0 -33
- data/lib/test_bench/session/output/get.rb +0 -27
- data/lib/test_bench/session/output/writer/buffer/interactive/viewport.rb +0 -165
- data/lib/test_bench/session/output/writer/buffer/interactive.rb +0 -139
- data/lib/test_bench/session/output/writer/buffer.rb +0 -27
- data/lib/test_bench/session/output/writer/defaults.rb +0 -17
- data/lib/test_bench/session/output/writer/substitute.rb +0 -17
- data/lib/test_bench/session/output/writer.rb +0 -95
- data/lib/test_bench/session/output.rb +0 -384
- data/lib/test_bench/session/projection.rb +0 -28
- data/lib/test_bench/session/store.rb +0 -59
- data/lib/test_bench/session/substitute/path.rb +0 -63
@@ -1,53 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
module Controls
|
4
|
-
module Events
|
5
|
-
module FixtureFinished
|
6
|
-
extend EventData
|
7
|
-
|
8
|
-
def self.example(name: nil, result: nil, process_id: nil, time: nil)
|
9
|
-
name ||= self.name
|
10
|
-
result = self.result if result.nil?
|
11
|
-
process_id ||= self.process_id
|
12
|
-
time ||= self.time
|
13
|
-
|
14
|
-
Session::Events::FixtureFinished.build(name, result, process_id:, time:)
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.random
|
18
|
-
Random.example
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.name
|
22
|
-
Fixture::Name.example
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.result
|
26
|
-
Result.example
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.process_id
|
30
|
-
ProcessID.example
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.time
|
34
|
-
Time.example
|
35
|
-
end
|
36
|
-
|
37
|
-
module Random
|
38
|
-
extend EventData
|
39
|
-
|
40
|
-
def self.example(name: nil, result: nil, process_id: nil, time: nil)
|
41
|
-
name ||= Fixture::Name.random
|
42
|
-
result = Result.random if result.nil?
|
43
|
-
process_id ||= ProcessID.random
|
44
|
-
time ||= Time.random
|
45
|
-
|
46
|
-
FixtureFinished.example(name:, result:, process_id:, time:)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
module Controls
|
4
|
-
module Events
|
5
|
-
module FixtureStarted
|
6
|
-
extend EventData
|
7
|
-
|
8
|
-
def self.example(name: nil, process_id: nil, time: nil)
|
9
|
-
name ||= self.name
|
10
|
-
process_id ||= self.process_id
|
11
|
-
time ||= self.time
|
12
|
-
|
13
|
-
Session::Events::FixtureStarted.build(name, process_id:, time:)
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.random
|
17
|
-
Random.example
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.name
|
21
|
-
Fixture::Name.example
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.process_id
|
25
|
-
ProcessID.example
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.time
|
29
|
-
Time.example
|
30
|
-
end
|
31
|
-
|
32
|
-
module Random
|
33
|
-
extend EventData
|
34
|
-
|
35
|
-
def self.example(name: nil, process_id: nil, time: nil)
|
36
|
-
name ||= Fixture::Name.random
|
37
|
-
process_id ||= ProcessID.random
|
38
|
-
time ||= Time.random
|
39
|
-
|
40
|
-
FixtureStarted.example(name:, process_id:, time:)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
module Controls
|
4
|
-
module Events
|
5
|
-
module TestSkipped
|
6
|
-
extend EventData
|
7
|
-
|
8
|
-
def self.example(title: nil, process_id: nil, time: nil)
|
9
|
-
title ||= self.title
|
10
|
-
process_id ||= self.process_id
|
11
|
-
time ||= self.time
|
12
|
-
|
13
|
-
Session::Events::TestSkipped.build(title, process_id:, time:)
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.random
|
17
|
-
Random.example
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.title
|
21
|
-
Title::Test.example
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.process_id
|
25
|
-
ProcessID.example
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.time
|
29
|
-
Time.example
|
30
|
-
end
|
31
|
-
|
32
|
-
module Random
|
33
|
-
extend EventData
|
34
|
-
|
35
|
-
def self.example(title: nil, process_id: nil, time: nil)
|
36
|
-
process_id ||= ProcessID.random
|
37
|
-
time ||= Time.random
|
38
|
-
title ||= Title::Test.random
|
39
|
-
|
40
|
-
TestSkipped.example(title:, process_id:, time:)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
module Controls
|
4
|
-
module Failure
|
5
|
-
module Message
|
6
|
-
def self.example
|
7
|
-
"Some failure message"
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.random
|
11
|
-
suffix = Random.string
|
12
|
-
|
13
|
-
"#{example} #{suffix}"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
module Controls
|
4
|
-
module Fixture
|
5
|
-
module Name
|
6
|
-
def self.example
|
7
|
-
"SomeNamespace::SomeFixture"
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.random
|
11
|
-
suffix = Random.string
|
12
|
-
|
13
|
-
"#{example}_#{suffix}"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
module Controls
|
4
|
-
module Output
|
5
|
-
module Detail
|
6
|
-
def self.example
|
7
|
-
Session::Output::Detail.on
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.other_example
|
11
|
-
Session::Output::Detail.off
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.random
|
15
|
-
details = [
|
16
|
-
Session::Output::Detail.on,
|
17
|
-
Session::Output::Detail.off,
|
18
|
-
Session::Output::Detail.failure
|
19
|
-
]
|
20
|
-
|
21
|
-
index = Random.integer % details.count
|
22
|
-
|
23
|
-
details[index]
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
module Controls
|
4
|
-
module Output
|
5
|
-
Device = TestBench::Output::Controls::Device
|
6
|
-
Data = TestBench::Output::Controls::Data
|
7
|
-
Styling = TestBench::Output::Controls::Styling
|
8
|
-
Style = TestBench::Output::Controls::Style
|
9
|
-
Text = TestBench::Output::Controls::Text
|
10
|
-
|
11
|
-
def self.example(details: nil, styling: nil, mode: nil)
|
12
|
-
styling ||= false
|
13
|
-
|
14
|
-
output = Session::Output.new
|
15
|
-
|
16
|
-
if details == true
|
17
|
-
output.detail_policy = Session::Output::Detail.on
|
18
|
-
elsif details == false
|
19
|
-
output.detail_policy = Session::Output::Detail.off
|
20
|
-
else
|
21
|
-
output.detail_policy = Session::Output::Detail.failure
|
22
|
-
end
|
23
|
-
|
24
|
-
if styling
|
25
|
-
output.writer.styling!
|
26
|
-
end
|
27
|
-
|
28
|
-
if not mode.nil?
|
29
|
-
output.mode = mode
|
30
|
-
end
|
31
|
-
|
32
|
-
output
|
33
|
-
end
|
34
|
-
|
35
|
-
module Styling
|
36
|
-
def self.example
|
37
|
-
Output.example(styling:)
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.styling
|
41
|
-
true
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
module Pending
|
46
|
-
def self.example
|
47
|
-
output = Styling.example
|
48
|
-
output.pending_writer.buffer.limit = nil
|
49
|
-
output
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
module Controls
|
4
|
-
module Substitute
|
5
|
-
module Path
|
6
|
-
def self.example(segments=nil)
|
7
|
-
segments ||= Segment.examples
|
8
|
-
|
9
|
-
segments = segments.dup
|
10
|
-
|
11
|
-
path = TestBench::Session::Substitute::Path.new
|
12
|
-
path.segments = segments
|
13
|
-
path
|
14
|
-
end
|
15
|
-
|
16
|
-
module Segment
|
17
|
-
def self.examples
|
18
|
-
[example, Context.other_example, Test.example]
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.example
|
22
|
-
Context.example
|
23
|
-
end
|
24
|
-
|
25
|
-
Test = Title::Test
|
26
|
-
|
27
|
-
Context = Title::Context
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
class Output
|
4
|
-
module Get
|
5
|
-
def self.call(substitute_session, styling: nil)
|
6
|
-
styling = true if styling.nil?
|
7
|
-
|
8
|
-
session_sink = substitute_session.sink
|
9
|
-
|
10
|
-
output = Output.new
|
11
|
-
|
12
|
-
if styling
|
13
|
-
output.writer.styling!
|
14
|
-
end
|
15
|
-
|
16
|
-
session_sink.records.each do |record|
|
17
|
-
event_data = record.event_data
|
18
|
-
|
19
|
-
output.receive(event_data)
|
20
|
-
end
|
21
|
-
|
22
|
-
output.writer.written_text
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,165 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
class Output
|
4
|
-
class Writer
|
5
|
-
module Buffer
|
6
|
-
class Interactive
|
7
|
-
Viewport = Struct.new(:width, :height, :row, :column, :scroll_rows, :rows_scrolled) do
|
8
|
-
def self.build(width, height, row, column, scroll_rows=nil)
|
9
|
-
scroll_rows ||= 0
|
10
|
-
|
11
|
-
rows_scrolled = 0
|
12
|
-
|
13
|
-
new(width, height, row, column, scroll_rows, rows_scrolled)
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.null
|
17
|
-
build(0, 0, 0, 0)
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.get
|
21
|
-
width, height, row, column = nil
|
22
|
-
|
23
|
-
Kernel.require 'io/console'
|
24
|
-
STDIN.raw do |stdin|
|
25
|
-
height, width = stdin.winsize
|
26
|
-
|
27
|
-
row, column = stdin.cursor
|
28
|
-
end
|
29
|
-
|
30
|
-
scroll_rows = row
|
31
|
-
|
32
|
-
build(width, height, row, column, scroll_rows)
|
33
|
-
end
|
34
|
-
|
35
|
-
def write(text)
|
36
|
-
bytes_written = 0
|
37
|
-
|
38
|
-
escape_sequence_pattern = self.class.escape_sequence_pattern
|
39
|
-
|
40
|
-
until text.empty?
|
41
|
-
write_text, escape_sequence, text = text.partition(escape_sequence_pattern)
|
42
|
-
|
43
|
-
bytes_written += write!(write_text)
|
44
|
-
bytes_written += escape_sequence.bytesize
|
45
|
-
end
|
46
|
-
|
47
|
-
bytes_written
|
48
|
-
end
|
49
|
-
|
50
|
-
def write!(text)
|
51
|
-
newline = text.end_with?("\n")
|
52
|
-
|
53
|
-
if newline
|
54
|
-
text = text[0...-1]
|
55
|
-
end
|
56
|
-
|
57
|
-
bytes_written = write_text(text)
|
58
|
-
|
59
|
-
if newline
|
60
|
-
bytes_written += write_newline
|
61
|
-
end
|
62
|
-
|
63
|
-
bytes_written
|
64
|
-
end
|
65
|
-
|
66
|
-
def write_text(text)
|
67
|
-
if text.start_with?("\e")
|
68
|
-
return text.bytesize
|
69
|
-
end
|
70
|
-
|
71
|
-
written_text = text[0...capacity]
|
72
|
-
|
73
|
-
bytes_written = written_text.bytesize
|
74
|
-
|
75
|
-
row = self.row
|
76
|
-
column = self.column
|
77
|
-
|
78
|
-
text_rows, text_columns = bytes_written.divmod(width)
|
79
|
-
|
80
|
-
row += text_rows
|
81
|
-
|
82
|
-
columns_remaining = width - column
|
83
|
-
if columns_remaining > text_columns
|
84
|
-
column += text_columns
|
85
|
-
else
|
86
|
-
row += 1
|
87
|
-
column = text_columns - columns_remaining
|
88
|
-
end
|
89
|
-
|
90
|
-
if row >= height
|
91
|
-
final_row = height - 1
|
92
|
-
|
93
|
-
scroll_rows = row - final_row
|
94
|
-
self.rows_scrolled += scroll_rows
|
95
|
-
|
96
|
-
row = final_row
|
97
|
-
end
|
98
|
-
|
99
|
-
self.row = row
|
100
|
-
self.column = column
|
101
|
-
|
102
|
-
bytes_written
|
103
|
-
end
|
104
|
-
|
105
|
-
def write_newline
|
106
|
-
if bottom_row?
|
107
|
-
if scroll_rows_remaining.zero?
|
108
|
-
return 0
|
109
|
-
end
|
110
|
-
|
111
|
-
self.rows_scrolled += 1
|
112
|
-
else
|
113
|
-
self.row += 1
|
114
|
-
end
|
115
|
-
|
116
|
-
self.column = 0
|
117
|
-
|
118
|
-
1
|
119
|
-
end
|
120
|
-
|
121
|
-
def capacity?
|
122
|
-
if scroll_rows_remaining > 0
|
123
|
-
true
|
124
|
-
else
|
125
|
-
not bottom_row?
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def capacity
|
130
|
-
capacity = 0
|
131
|
-
|
132
|
-
rows_remaining = height + scroll_rows_remaining - row - 1
|
133
|
-
|
134
|
-
if rows_remaining > 0
|
135
|
-
capacity += (rows_remaining - 1) * width
|
136
|
-
|
137
|
-
final_row = width - column
|
138
|
-
capacity += final_row
|
139
|
-
end
|
140
|
-
|
141
|
-
capacity
|
142
|
-
end
|
143
|
-
|
144
|
-
def scroll_rows_remaining
|
145
|
-
scroll_rows - rows_scrolled
|
146
|
-
end
|
147
|
-
|
148
|
-
def bottom_row?
|
149
|
-
row == height - 1
|
150
|
-
end
|
151
|
-
|
152
|
-
def self.escape_sequence_pattern
|
153
|
-
initiator = %r{\e\[}
|
154
|
-
terminator = %r{[[:alpha:]]}
|
155
|
-
sequence = %r{[[:digit:]]+(?:;[[:digit:]]+)*}
|
156
|
-
|
157
|
-
%r{#{initiator}#{sequence}?#{terminator}}
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
end
|
@@ -1,139 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
class Output
|
4
|
-
class Writer
|
5
|
-
module Buffer
|
6
|
-
class Interactive
|
7
|
-
attr_accessor :viewport
|
8
|
-
|
9
|
-
attr_accessor :raw_stderr
|
10
|
-
|
11
|
-
attr_accessor :stderr_pipe
|
12
|
-
|
13
|
-
def stderr_buffer
|
14
|
-
@stderr_buffer ||= String.new
|
15
|
-
end
|
16
|
-
|
17
|
-
def device
|
18
|
-
@device ||= TestBench::Output::Device::Substitute.build
|
19
|
-
end
|
20
|
-
attr_writer :device
|
21
|
-
|
22
|
-
attr_accessor :buffering
|
23
|
-
def buffering? = !!buffering
|
24
|
-
|
25
|
-
def self.build(device=nil)
|
26
|
-
device ||= Defaults.device
|
27
|
-
|
28
|
-
instance = new
|
29
|
-
instance.device = device
|
30
|
-
instance
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.configure(receiver, device: nil, attr_name: nil)
|
34
|
-
attr_name ||= :buffer
|
35
|
-
|
36
|
-
instance = build(device)
|
37
|
-
receiver.public_send(:"#{attr_name}=", instance)
|
38
|
-
end
|
39
|
-
|
40
|
-
def receive(text)
|
41
|
-
if not cursor_saved?
|
42
|
-
save_cursor
|
43
|
-
end
|
44
|
-
|
45
|
-
bytes_written = viewport.write(text)
|
46
|
-
|
47
|
-
write_text = text.byteslice(0, bytes_written)
|
48
|
-
device.write(write_text)
|
49
|
-
|
50
|
-
if not viewport.capacity?
|
51
|
-
if not buffering?
|
52
|
-
buffering_message = "Output is buffering"
|
53
|
-
|
54
|
-
device.write("\e[0G\e[2m#{buffering_message}\e[22m")
|
55
|
-
|
56
|
-
self.buffering = true
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
update_stderr_buffer
|
61
|
-
|
62
|
-
bytes_written
|
63
|
-
end
|
64
|
-
|
65
|
-
def flush(*_devices)
|
66
|
-
if cursor_saved?
|
67
|
-
update_stderr_buffer
|
68
|
-
restore_cursor
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def save_cursor
|
73
|
-
self.viewport = Viewport.get
|
74
|
-
|
75
|
-
self.raw_stderr = STDERR.dup
|
76
|
-
|
77
|
-
reader, writer = IO.pipe
|
78
|
-
|
79
|
-
new_stderr = writer
|
80
|
-
STDERR.reopen(new_stderr)
|
81
|
-
|
82
|
-
stderr_buffer.clear
|
83
|
-
|
84
|
-
self.stderr_pipe = reader
|
85
|
-
|
86
|
-
device.write("\e[s")
|
87
|
-
end
|
88
|
-
|
89
|
-
def restore_cursor
|
90
|
-
stderr_pipe.close
|
91
|
-
|
92
|
-
device.write("\e[u")
|
93
|
-
|
94
|
-
rows_scrolled = viewport.rows_scrolled
|
95
|
-
|
96
|
-
if not rows_scrolled.zero?
|
97
|
-
upward_movements = rows_scrolled
|
98
|
-
device.write("\e[#{upward_movements}F")
|
99
|
-
end
|
100
|
-
|
101
|
-
stderr_buffer.each_line do |line|
|
102
|
-
raw_stderr.write("\e[0K")
|
103
|
-
raw_stderr.write(line)
|
104
|
-
end
|
105
|
-
|
106
|
-
STDERR.reopen(raw_stderr)
|
107
|
-
self.raw_stderr = nil
|
108
|
-
|
109
|
-
self.viewport = nil
|
110
|
-
end
|
111
|
-
|
112
|
-
def update_stderr_buffer
|
113
|
-
loop do
|
114
|
-
stderr_text = stderr_pipe.read_nonblock(4096, exception: false)
|
115
|
-
|
116
|
-
if stderr_text == :wait_readable
|
117
|
-
break
|
118
|
-
end
|
119
|
-
|
120
|
-
viewport.write(stderr_text)
|
121
|
-
|
122
|
-
if not buffering?
|
123
|
-
raw_stderr.write(stderr_text)
|
124
|
-
end
|
125
|
-
|
126
|
-
self.stderr_buffer << stderr_text
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
def viewport?
|
131
|
-
!viewport.nil?
|
132
|
-
end
|
133
|
-
alias :cursor_saved? :viewport?
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
class Output
|
4
|
-
class Writer
|
5
|
-
module Buffer
|
6
|
-
def self.configure(receiver, device: nil, experimental_output: nil, attr_name: nil)
|
7
|
-
device ||= Defaults.device
|
8
|
-
experimental_output ||= Defaults.experimental_output
|
9
|
-
attr_name ||= :buffer
|
10
|
-
|
11
|
-
if experimental_output
|
12
|
-
interactive = device.tty?
|
13
|
-
else
|
14
|
-
interactive = false
|
15
|
-
end
|
16
|
-
|
17
|
-
if interactive
|
18
|
-
Buffer::Interactive.configure(receiver, device:, attr_name:)
|
19
|
-
else
|
20
|
-
TestBench::Output::Writer::Buffer.configure(receiver, attr_name:)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
class Output
|
4
|
-
class Writer
|
5
|
-
module Defaults
|
6
|
-
def self.device
|
7
|
-
TestBench::Output::Writer::Defaults.device
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.experimental_output
|
11
|
-
ENV.fetch('TEST_BENCH_EXPERIMENTAL_OUTPUT', 'off') == 'on'
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|