Module: CLI::UI::Spinner

Defined in:
lib/cli/ui/spinner.rb,
lib/cli/ui/spinner/async.rb,
lib/cli/ui/spinner/spin_group.rb

Defined Under Namespace

Classes: Async, SpinGroup

Constant Summary collapse

PERIOD =

seconds

0.1
TASK_FAILED =
:task_failed
RUNES =
CLI::UI::OS.current.supports_emoji? ? %w(         ).freeze : %w(\\ | / - \\ | / -).freeze

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.indexObject

Returns the value of attribute index


22
23
24
# File 'lib/cli/ui/spinner.rb', line 22

def index
  @index
end

Class Method Details

.current_runeObject

We use this from CLI::UI::Widgets::Status to render an additional spinner next to the “working” element. While this global state looks a bit repulsive at first, it's worth realizing that:

  • It's managed by the SpinGroup#wait method, not individual tasks; and

  • It would be complete insanity to run two separate but concurrent SpinGroups.

While it would be possible to stitch through some connection between the SpinGroup and the Widgets included in its title, this is simpler in practice and seems unlikely to cause issues in practice.


34
35
36
# File 'lib/cli/ui/spinner.rb', line 34

def current_rune
  RUNES[index || 0]
end

.spin(title, auto_debrief: true, &block) ⇒ Object

Adds a single spinner Uses an interactive session to allow the user to pick an answer Can use arrows, y/n, numbers (1/2), and vim bindings to control

Attributes

  • title - Title of the spinner to use

Options

  • :auto_debrief - Automatically debrief exceptions? Default to true

Block

  • *spinner+ - Instance of the spinner. Can call update_title to update the user of changes

Example Usage:

CLI::UI::Spinner.spin('Title') { sleep 1.0 }

61
62
63
64
65
# File 'lib/cli/ui/spinner.rb', line 61

def self.spin(title, auto_debrief: true, &block)
  sg = SpinGroup.new(auto_debrief: auto_debrief)
  sg.add(title, &block)
  sg.wait
end