class Vagrant::Util::LineBuffer

Constants

MAX_LINE_LENGTH

Maximum number of characters to buffer before sending to callback without detecting a new line

Public Class Methods

new(&callback) click to toggle source

Create a new line buffer. The registered block will be called when a new line is encountered on provided input, or the max line length is reached

# File lib/vagrant/util/line_buffer.rb, line 12
def initialize(&callback)
  raise ArgumentError,
    "Expected callback but received none" if callback.nil?
  @mu = Mutex.new
  @callback = callback
  @buffer = ""
end

Public Instance Methods

<<(str) click to toggle source

Add string data to output

@param [String] str String of data to output @return [self]

# File lib/vagrant/util/line_buffer.rb, line 24
def <<(str)
  @mu.synchronize do
    while i = str.index("\n")
      @callback.call((@buffer + str[0, i+1]).rstrip)
      @buffer.clear
      str = str[i+1, str.length].to_s
    end

    @buffer << str.to_s

    if @buffer.length > MAX_LINE_LENGTH
      @callback.call(@buffer.dup)
      @buffer.clear
    end
  end
  self
end
close() click to toggle source

Closes the buffer. Any remaining data that has been buffered will be given to the callback. Once closed the instance will no longer be usable.

@return [self]

# File lib/vagrant/util/line_buffer.rb, line 47
def close
  @mu.synchronize do
    # Send any remaining output on the buffer
    @callback.call(@buffer.dup) if !@buffer.empty?
    # Disable this buffer instance
    @callback = nil
    @buffer.clear
    @buffer.freeze
  end
  self
end