Class: TestBench::Session::Output::Writer::Buffer::Interactive

Inherits:
Object
  • Object
show all
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

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#bufferingObject

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

#deviceObject



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_stderrObject

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_pipeObject

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

#viewportObject

Returns the value of attribute viewport.



7
8
9
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 7

def viewport
  @viewport
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

Returns:

  • (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 = viewport.write(text)

  write_text = text.byteslice(0, bytes_written)
  device.write(write_text)

  if not viewport.capacity?
    if not buffering?
      buffering_message = "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_cursorObject



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 = viewport.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.viewport = nil
end

#save_cursorObject



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 = 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_bufferObject



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_bufferObject



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

    viewport.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?

Returns:

  • (Boolean)


130
131
132
# File 'lib/test_bench/session/output/writer/buffer/interactive.rb', line 130

def viewport?
  !viewport.nil?
end