class MultiProcess::Logger

Can create pipes and multiplex pipe content to put into given IO objects e.g. multiple output from multiple processes to current stdout.

Public Class Methods

new(*args) click to toggle source

Create new logger.

@param out [IO] IO to push formatted output from

default created logger pipes.

@param err [IO] IO to push formatted output from

error sources.
Calls superclass method
# File lib/multi_process/logger.rb, line 14
def initialize(*args)
  @opts  = Hash === args.last ? args.pop : {}
  @out   = args[0] || $stdout
  @err   = args[1] || $stderr

  @colwidth = 0

  super()
end

Private Class Methods

global() click to toggle source
# File lib/multi_process/logger.rb, line 76
def global
  @global ||= new $stdout, $stderr
end

Protected Instance Methods

collapse?() click to toggle source
# File lib/multi_process/logger.rb, line 45
def collapse?
  @opts[:collapse].nil? || @opts[:collapse]
end
connected(process, _) click to toggle source
# File lib/multi_process/logger.rb, line 37
def connected(process, _)
  @colwidth = [process.title.to_s.length, @colwidth].max
end
read(pipe) click to toggle source
# File lib/multi_process/logger.rb, line 41
def read(pipe)
  pipe.gets
end
received(process, name, line) click to toggle source
# File lib/multi_process/logger.rb, line 26
def received(process, name, line)
  case name
  when :err, :stderr
    output process, line, io: @err, delimiter: 'E>'
  when :out, :stdout
    output process, line
  when :sys
    output(process, line, delimiter: '$>') if @opts[:sys]
  end
end

Private Instance Methods

output(process, line, opts = {}) click to toggle source
# File lib/multi_process/logger.rb, line 51
def output(process, line, opts = {})
  opts[:delimiter]   ||= ' |'
  name = if opts[:name]
           opts[:name].to_s.dup
         else
           if process
             process.title.to_s.rjust(@colwidth, ' ')
           else
             (' ' * @colwidth)
           end
         end

  io = opts[:io] || @out
  if @last_name == name && collapse?
    io.print " #{' ' * name.length} #{opts[:delimiter]} "
  else
    io.print " #{name} #{opts[:delimiter]} "
  end
  io.puts line
  io.flush

  @last_name = name
end