Class: CLI::UI::Progress

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/cli/ui/progress.rb

Constant Summary collapse

FILLED_BAR =

A Cyan filled block

"\e[46m"
UNFILLED_BAR =

A bright white block

"\e[1;47m"

Class Method Summary collapse

Instance Method Summary collapse

Methods included from T::Sig

sig

Constructor Details

#initialize(width: Terminal.width) ⇒ Progress

Returns a new instance of Progress.


59
60
61
62
# File 'lib/cli/ui/progress.rb', line 59

def initialize(width: Terminal.width)
  @percent_done = T.let(0, Numeric)
  @max_width = width
end

Class Method Details

.progress(width: Terminal.width, &block) ⇒ Object


40
41
42
43
44
45
46
47
48
49
# File 'lib/cli/ui/progress.rb', line 40

def self.progress(width: Terminal.width, &block)
  bar = Progress.new(width: width)
  print(CLI::UI::ANSI.hide_cursor)
  yield(bar)
ensure
  puts bar.to_s
  CLI::UI.raw do
    print(ANSI.show_cursor)
  end
end

Instance Method Details

#tick(percent: nil, set_percent: nil) ⇒ Object

Raises:

  • (ArgumentError)

75
76
77
78
79
80
81
82
83
84
# File 'lib/cli/ui/progress.rb', line 75

def tick(percent: nil, set_percent: nil)
  raise ArgumentError, 'percent and set_percent cannot both be specified' if percent && set_percent

  @percent_done += percent || 0.01
  @percent_done = set_percent if set_percent
  @percent_done = [@percent_done, 1.0].min # Make sure we can't go above 1.0

  print(to_s)
  print(CLI::UI::ANSI.previous_line + "\n")
end

#to_sObject


89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/cli/ui/progress.rb', line 89

def to_s
  suffix = " #{(@percent_done * 100).floor}%".ljust(5)
  workable_width = @max_width - Frame.prefix_width - suffix.size
  filled = [(@percent_done * workable_width.to_f).ceil, 0].max
  unfilled = [workable_width - filled, 0].max

  CLI::UI.resolve_text([
    FILLED_BAR + ' ' * filled,
    UNFILLED_BAR + ' ' * unfilled,
    CLI::UI::Color::RESET.code + suffix,
  ].join)
end