Class: CLI::UI::Progress

Inherits:
Object
  • Object
show all
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

Constructor Details

#initialize(width: Terminal.width) ⇒ Progress

Initialize a progress bar. Typically used in a Progress.progress block

Options

One of the follow can be used, but not both together

  • :width - The width of the terminal


50
51
52
53
# File 'lib/cli/ui/progress.rb', line 50

def initialize(width: Terminal.width)
  @percent_done = 0
  @max_width = width
end

Class Method Details

.progress(width: Terminal.width) ⇒ Object

Add a progress bar to the terminal output

Example Usage:

Set the percent to X

CLI::UI::Progress.progress do |bar|
  bar.tick(set_percent: percent)
end

Increase the percent by 1 percent

CLI::UI::Progress.progress do |bar|
  bar.tick
end

Increase the percent by X

CLI::UI::Progress.progress do |bar|
  bar.tick(percent: 5)
end

31
32
33
34
35
36
37
38
39
40
41
# File 'lib/cli/ui/progress.rb', line 31

def self.progress(width: Terminal.width)
  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)
    puts(ANSI.previous_line + ANSI.end_of_line)
  end
end

Instance Method Details

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

Set the progress of the bar. Typically used in a Progress.progress block

Options

One of the follow can be used, but not both together

  • :percent - Increment progress by a specific percent amount

  • :set_percent - Set progress to a specific percent

Raises:

  • (ArgumentError)

63
64
65
66
67
68
69
70
71
72
# File 'lib/cli/ui/progress.rb', line 63

def tick(percent: 0.01, set_percent: nil)
  raise ArgumentError, 'percent and set_percent cannot both be specified' if percent != 0.01 && set_percent
  @percent_done += percent
  @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
  print CLI::UI::ANSI.end_of_line + "\n"
end

#to_sObject

Format the progress bar to be printed to terminal


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

def to_s
  suffix = " #{(@percent_done * 100).round(2)}%"
  workable_width = @max_width - Frame.prefix_width - suffix.size
  filled = (@percent_done * workable_width.to_f).ceil
  unfilled = workable_width - filled

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