ConsoleSourceConsoleTerminalFormatterProgress

class Progress

Format a progress event, including the current progress and total.

Definitions

KEY = :progress

The key used to identify this formatter.

BLOCK = [...]

The block characters used to render the progress bar.

Implementation

BLOCK = [
	" ",
	"▏",
	"▎",
	"▍",
	"▌",
	"▋",
	"▊",
	"▉",
	"█",
]

def initialize(terminal)

Create a new progress formatter.

Implementation

def initialize(terminal)
	@terminal = terminal
	@terminal[:progress_bar] ||= terminal.style(:blue, :white)
end

def format(event, stream, verbose: false, width: 80)

Format the given event.

Signature

parameter event Hash

The event to format.

parameter stream IO

The stream to write the formatted event to.

parameter verbose Boolean

Whether to include additional information.

parameter width Integer

The width of the progress bar.

Implementation

def format(event, stream, verbose: false, width: 80)
	current = event[:current].to_f
	total = event[:total].to_f
	value = current / total
	
	# Clamp value to 1.0 to avoid rendering issues:
	if value > 1.0
		value = 1.0
	end
	
	stream.puts "#{@terminal[:progress_bar]}#{self.bar(value, width-10)}#{@terminal.reset} #{sprintf('%6.2f', value * 100)}%"
end

def bar(value, width)

Render a progress bar with the given value and width.

Implementation

def bar(value, width)
	blocks = width * value
	full_blocks = blocks.floor
	partial_block = ((blocks - full_blocks) * BLOCK.size).floor
	
	if partial_block.zero?
		BLOCK.last * full_blocks
	else
		"#{BLOCK.last * full_blocks}#{BLOCK[partial_block]}"
	end.ljust(width)
end