class Commander::UI::ProgressBar
def completed?
def completed? @step == @total_steps end
def erase_line
def erase_line # highline does not expose the output stream HighLine.default_instance.instance_variable_get('@output').print "\r\e[K" end
def finished?
def finished? @step == @total_steps + 1 end
def generate_tokens
def generate_tokens { title: @title, percent_complete: percent_complete, progress_bar: progress_bar, step: @step, steps_remaining: steps_remaining, total_steps: @total_steps, time_elapsed: format('%0.2fs', time_elapsed), time_remaining: @step.positive? ? format('%0.2fs', time_remaining) : '', }.merge! @tokens end
def increment(tokens = {})
def increment(tokens = {}) @step += 1 @tokens.merge! tokens if tokens.is_a? Hash show end
def initialize(total, options = {})
def initialize(total, options = {}) @total_steps, @step, @start_time = total, 0, Time.now @title = options.fetch :title, 'Progress' @width = options.fetch :width, 25 @progress_str = options.fetch :progress_str, '=' @incomplete_str = options.fetch :incomplete_str, '.' @complete_message = options.fetch :complete_message, 'Process complete' @format = options.fetch :format, ':title |:progress_bar| :percent_complete% complete ' @tokens = options.fetch :tokens, {} end
def percent_complete
def percent_complete if @total_steps.zero? 100 else @step * 100 / @total_steps end end
def progress_bar
def progress_bar (@progress_str * (@width * percent_complete / 100)).ljust @width, @incomplete_str end
def show
def show return if finished? erase_line if completed? HighLine.default_instance.say UI.replace_tokens(@complete_message, generate_tokens) if @complete_message.is_a? String else HighLine.default_instance.say UI.replace_tokens(@format, generate_tokens) << ' ' end end
def steps_remaining
def steps_remaining @total_steps - @step end
def time_elapsed
def time_elapsed Time.now - @start_time end
def time_remaining
def time_remaining (time_elapsed / @step) * steps_remaining end