Class: VivlioStarter::CLI::Spinner
- Inherits:
-
Object
- Object
- VivlioStarter::CLI::Spinner
- 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
-
.active ⇒ Object
現在描画中のスピナー。ログ出力側が行を消すために参照する.
Class Method Summary collapse
-
.clear_active_line ⇒ Object
ログを出す直前に呼ぶ。消さないとスピナーの残骸とログが同じ行に重なる.
-
.while(label, output: $stdout) ⇒ Object
スピナーを回しながらブロックを実行する.
Instance Method Summary collapse
-
#clear_line ⇒ Object
描画済みの行を消す。ログ出力の割り込み時にも呼ばれる.
-
#initialize(label, output: $stdout) ⇒ Spinner
constructor
A new instance of Spinner.
- #run ⇒ Object
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
.active ⇒ Object
現在描画中のスピナー。ログ出力側が行を消すために参照する
39 40 41 |
# File 'lib/vivlio_starter/cli/spinner.rb', line 39 def active @active end |
Class Method Details
.clear_active_line ⇒ Object
ログを出す直前に呼ぶ。消さないとスピナーの残骸とログが同じ行に重なる
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_line ⇒ Object
描画済みの行を消す。ログ出力の割り込み時にも呼ばれる
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 |
#run ⇒ Object
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 |