Module: Commiti::Spinner

Defined in:
lib/services/helpers/spinner.rb

Constant Summary collapse

FRAMES =
['|', '/', '-', '\\'].freeze
INTERVAL_SECONDS =
0.1

Class Method Summary collapse

Class Method Details

.run(message, &block) ⇒ Object



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
# File 'lib/services/helpers/spinner.rb', line 8

def self.run(message, &block)
  return run_without_spinner(message, &block) unless $stdout.tty?

  done = false
  error = nil
  result = nil

  spinner_thread = Thread.new do
    index = 0
    until done
      frame = Commiti::TerminalUI.color(FRAMES[index % FRAMES.length], :cyan)
      print "\r#{frame} #{message}"
      $stdout.flush
      index += 1
      sleep INTERVAL_SECONDS
    end
  end

  begin
    result = block.call
  rescue StandardError => e
    error = e
  ensure
    done = true
    spinner_thread.join

    print "\r#{final_status_line(error, message)}\n"
    $stdout.flush
  end

  raise error unless error.nil?

  result
end