Class: TestBench::Session::Output::Writer::Buffer::Interactive
- Inherits:
-
Object
- Object
- TestBench::Session::Output::Writer::Buffer::Interactive
- Defined in:
- lib/test_bench/session/output/writer/buffer/interactive.rb,
lib/test_bench/session/output/writer/buffer/interactive/viewport.rb
Defined Under Namespace
Classes: Viewport
Instance Attribute Summary collapse
-
#buffering ⇒ Object
Returns the value of attribute buffering.
- #device ⇒ Object
-
#raw_stderr ⇒ Object
Returns the value of attribute raw_stderr.
-
#stderr_pipe ⇒ Object
Returns the value of attribute stderr_pipe.
-
#viewport ⇒ Object
Returns the value of attribute viewport.
Class Method Summary collapse
Instance Method Summary collapse
- #buffering? ⇒ Boolean
- #flush(*_devices) ⇒ Object
- #receive(text) ⇒ Object
- #restore_cursor ⇒ Object
- #save_cursor ⇒ Object
- #stderr_buffer ⇒ Object
- #update_stderr_buffer ⇒ Object
- #viewport? ⇒ Boolean (also: #cursor_saved?)
Instance Attribute Details
#buffering ⇒ Object
Returns the value of attribute buffering.
22 23 24 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 22 def buffering @buffering end |
#device ⇒ Object
17 18 19 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 17 def device @device ||= TestBench::Output::Device::Substitute.build end |
#raw_stderr ⇒ Object
Returns the value of attribute raw_stderr.
9 10 11 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 9 def raw_stderr @raw_stderr end |
#stderr_pipe ⇒ Object
Returns the value of attribute stderr_pipe.
11 12 13 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 11 def stderr_pipe @stderr_pipe end |
#viewport ⇒ Object
Returns the value of attribute viewport.
7 8 9 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 7 def end |
Class Method Details
.build(device = nil) ⇒ Object
25 26 27 28 29 30 31 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 25 def self.build(device=nil) device ||= Defaults.device instance = new instance.device = device instance end |
.configure(receiver, device: nil, attr_name: nil) ⇒ Object
33 34 35 36 37 38 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 33 def self.configure(receiver, device: nil, attr_name: nil) attr_name ||= :buffer instance = build(device) receiver.public_send(:"#{attr_name}=", instance) end |
Instance Method Details
#buffering? ⇒ Boolean
23 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 23 def buffering? = !!buffering |
#flush(*_devices) ⇒ Object
65 66 67 68 69 70 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 65 def flush(*_devices) if cursor_saved? update_stderr_buffer restore_cursor end end |
#receive(text) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 40 def receive(text) if not cursor_saved? save_cursor end bytes_written = .write(text) write_text = text.byteslice(0, bytes_written) device.write(write_text) if not .capacity? if not buffering? = "Output is buffering" device.write("\e[0G\e[2m#{buffering_message}\e[22m") self.buffering = true end end update_stderr_buffer bytes_written end |
#restore_cursor ⇒ Object
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 89 def restore_cursor stderr_pipe.close device.write("\e[u") rows_scrolled = .rows_scrolled if not rows_scrolled.zero? upward_movements = rows_scrolled device.write("\e[#{upward_movements}F") end stderr_buffer.each_line do |line| raw_stderr.write("\e[0K") raw_stderr.write(line) end STDERR.reopen(raw_stderr) self.raw_stderr = nil self. = nil end |
#save_cursor ⇒ Object
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 72 def save_cursor self. = Viewport.get self.raw_stderr = STDERR.dup reader, writer = IO.pipe new_stderr = writer STDERR.reopen(new_stderr) stderr_buffer.clear self.stderr_pipe = reader device.write("\e[s") end |
#stderr_buffer ⇒ Object
13 14 15 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 13 def stderr_buffer @stderr_buffer ||= String.new end |
#update_stderr_buffer ⇒ Object
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 112 def update_stderr_buffer loop do stderr_text = stderr_pipe.read_nonblock(4096, exception: false) if stderr_text == :wait_readable break end .write(stderr_text) if not buffering? raw_stderr.write(stderr_text) end self.stderr_buffer << stderr_text end end |
#viewport? ⇒ Boolean Also known as: cursor_saved?
130 131 132 |
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 130 def !.nil? end |