Class: VivlioStarter::CLI::Spinner

Inherits:
Object
  • Object
show all
Defined in:
lib/vivlio_starter/cli/spinner.rb

Overview

TTY 向けの簡易スピナー

Constant Summary collapse

FRAMES =
%w[         ].freeze
INTERVAL =
0.08
CLEAR_LINE =

行頭へ戻って行末まで消す(描画済みの残骸を残さない)

"\r\e[K"

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(label, output: $stdout) ⇒ Spinner

Returns a new instance of Spinner.



48
49
50
51
52
53
54
# File 'lib/vivlio_starter/cli/spinner.rb', line 48

def initialize(label, output: $stdout)
  @label = label
  @output = output
  # 描画スレッドとログ出力スレッドから同じ行を触るため排他する
  @mutex = Mutex.new
  @drawn = false
end

Class Attribute Details

.activeObject

現在描画中のスピナー。ログ出力側が行を消すために参照する



39
40
41
# File 'lib/vivlio_starter/cli/spinner.rb', line 39

def active
  @active
end

Class Method Details

.clear_active_lineObject

ログを出す直前に呼ぶ。消さないとスピナーの残骸とログが同じ行に重なる



45
# File 'lib/vivlio_starter/cli/spinner.rb', line 45

def clear_active_line = active&.clear_line

.while(label, output: $stdout) ⇒ Object

スピナーを回しながらブロックを実行する



42
# File 'lib/vivlio_starter/cli/spinner.rb', line 42

def while(label, output: $stdout, &) = new(label, output: output).run(&)

Instance Method Details

#clear_lineObject

描画済みの行を消す。ログ出力の割り込み時にも呼ばれる



68
69
70
71
72
73
74
75
76
# File 'lib/vivlio_starter/cli/spinner.rb', line 68

def clear_line
  @mutex.synchronize do
    return unless @drawn

    @output.print(CLEAR_LINE)
    @output.flush
    @drawn = false
  end
end

#runObject



56
57
58
59
60
61
62
63
64
65
# File 'lib/vivlio_starter/cli/spinner.rb', line 56

def run
  @enabled = enabled?
  return yield unless @enabled

  start
  yield
ensure
  # 例外時も必ず行を消す(残骸で 🔴 メッセージを汚さない)
  stop
end