class Chef::Formatters::IndentableOutputStream

Handles basic indentation and colorization tasks

Attributes

current_stream[RW]
err[R]
indent[RW]
line_started[R]
out[R]
semaphore[R]

Public Class Methods

new(out, err) click to toggle source
# File lib/chef/formatters/indentable_output_stream.rb, line 13
def initialize(out, err)
  @out, @err = out, err
  @indent = 0
  @line_started = false
  @semaphore = Mutex.new
end

Public Instance Methods

<<(obj) click to toggle source

Print a raw chunk

# File lib/chef/formatters/indentable_output_stream.rb, line 57
def <<(obj)
  print(obj)
end
pastel() click to toggle source

pastel.decorate is a lightweight replacement for highline.color

# File lib/chef/formatters/indentable_output_stream.rb, line 21
def pastel
  @pastel ||= begin
    require "pastel" unless defined?(Pastel)
    Pastel.new
  end
end
print(string, *args) click to toggle source

Print a string.

Arguments

string: string to print. options: a hash with these possible options:

  • :stream => OBJ: unique identifier for a stream. If two prints have

    different streams, they will print on separate lines.
    Otherwise, they will stay together.
  • :start_line => BOOLEAN: if true, print will begin on a blank (indented) line.

  • :end_line => BOOLEAN: if true, current line will be ended.

  • :name => STRING: a name to prefix in front of a stream. It will be printed

    once (with the first line of the stream) and subsequent lines
    will be indented to match.

Alternative

You may also call print(‘string’, :red) (github.com/piotrmurach/pastel#3-supported-colors)

puts(string, *args) click to toggle source

Print a line. This will continue from the last start_line or print, or start a new line and indent if necessary.

@param string [String] @param args [Array<Hash,Symbol>]

# File lib/chef/formatters/indentable_output_stream.rb, line 43
def puts(string, *args)
  print(string, from_args(args, end_line: true))
end
puts_line(string, *args) click to toggle source

Print an entire line from start to end. This will terminate any existing lines and cause indentation.

@param string [String] @param args [Array<Hash,Symbol>]

# File lib/chef/formatters/indentable_output_stream.rb, line 52
def puts_line(string, *args)
  print(string, from_args(args, start_line: true, end_line: true))
end
start_line(string, *args) click to toggle source

Print the start of a new line. This will terminate any existing lines and cause indentation but will not move to the next line yet (future ‘print’ and ‘puts’ statements will stay on this line).

@param string [String] @param args [Array<Hash,Symbol>]

# File lib/chef/formatters/indentable_output_stream.rb, line 34
def start_line(string, *args)
  print(string, from_args(args, start_line: true))
end

Private Instance Methods

from_args(colors, merge_options = {}) click to toggle source
# File lib/chef/formatters/indentable_output_stream.rb, line 105
def from_args(colors, merge_options = {})
  if colors.size == 1 && colors[0].is_a?(Hash)
    merge_options.merge(colors[0])
  else
    merge_options.merge({ colors: colors })
  end
end
indent_line(options) click to toggle source
# File lib/chef/formatters/indentable_output_stream.rb, line 147
def indent_line(options)
  unless @line_started

    # Print indents.  If there is a stream name, either print it (if we're
    # switching streams) or print enough blanks to match
    # the indents.
    if options[:name]
      if @current_stream != options[:stream]
        @out.print "#{(" " * indent)}[#{options[:name]}] "
      else
        @out.print " " * (indent + 3 + options[:name].size)
      end
    else
      # Otherwise, just print indents.
      @out.print " " * indent
    end

    if @current_stream != options[:stream]
      @current_stream = options[:stream]
    end

    @line_started = true
  end
end
move_to_next_line() click to toggle source
# File lib/chef/formatters/indentable_output_stream.rb, line 140
def move_to_next_line
  if @line_started
    @out.puts ""
    @line_started = false
  end
end
print_line(line, options) click to toggle source
print_string(string, options) click to toggle source
should_end_line?(options) click to toggle source
# File lib/chef/formatters/indentable_output_stream.rb, line 101
def should_end_line?(options)
  options[:end_line] && @line_started
end
should_start_line?(options) click to toggle source
# File lib/chef/formatters/indentable_output_stream.rb, line 97
def should_start_line?(options)
  options[:start_line] || @current_stream != options[:stream]
end