class CliSpinnable::Writer

Constants

REFRESH_DELAY_IN_SECONDS

Attributes

line[R]
output[R]
queue[R]
session[R]

Public Class Methods

new(output, line) click to toggle source
# File lib/cli_spinnable/writer.rb, line 7
def initialize(output, line)
  @output = output
  @line = line
  @queue = Queue.new
  @session = start_session
end

Public Instance Methods

failure() click to toggle source
# File lib/cli_spinnable/writer.rb, line 27
def failure
  push(:sign=, :fail)
  push(:newline=, true)
  push(:str=, '')
  self
end
finalize() click to toggle source
# File lib/cli_spinnable/writer.rb, line 34
def finalize
  push(:sign=, :blank)
  finalize_session
  self
end
print(str) click to toggle source
tick() click to toggle source
# File lib/cli_spinnable/writer.rb, line 20
def tick
  push(:sign=, :tick)
  push(:newline=, true)
  push(:str=, '')
  self
end

Private Instance Methods

finalize_session() click to toggle source
# File lib/cli_spinnable/writer.rb, line 67
def finalize_session
  session[:finalize] = true
  session.join
end
push(attr, val) click to toggle source
# File lib/cli_spinnable/writer.rb, line 44
def push(attr, val)
  raise Error, 'Session finalized' unless session.status
  queue.push([attr, val])
end
reload_line() click to toggle source
# File lib/cli_spinnable/writer.rb, line 62
def reload_line
  line.public_send(*queue.pop) unless queue.empty?
  line
end
start_session() click to toggle source
# File lib/cli_spinnable/writer.rb, line 49
def start_session
  Thread.new do
    loop do
      loop do
        output.write reload_line.to_s_resetting_newline
        break if queue.empty?
      end
      break if Thread.current[:finalize]
      sleep REFRESH_DELAY_IN_SECONDS
    end
  end
end