Class: LogParser::Buffer
- Inherits:
-
Object
- Object
- LogParser::Buffer
- Defined in:
- lib/log_parser/buffer.rb
Overview
Log buffers provide line after line from a given source, and only store as many lines as necessary:
* Read lines from `log` lazily, i.e. only if {find_index} or {[]} are called.
* Drop lines that are no longer needed, i.e. when {forward} is called.
Instance Method Summary collapse
-
#[](offset, length = nil) ⇒ String+
Retrieves the next ‘length` many log lines starting from index `offset`.
-
#buffer_size ⇒ Integer
The current size of this buffer, that is the number of lines currently stored.
-
#close ⇒ void
Closes the ‘IO` this buffer reads from, if any.
-
#empty? ⇒ true, false
Determines whether there are more lines in this log (buffer).
-
#find_index(starting_from = 0) {|line| ... } ⇒ Integer?
Finds the first index of an element that fulfills a predicate.
-
#first ⇒ String?
The first available line, if any.
-
#forward(offset = 1) ⇒ void
Moves the front of this buffer forwards by ‘offset` elements.
-
#initialize(log) ⇒ Buffer
constructor
Creates a new buffer that reads lines from the given source.
Constructor Details
#initialize(log) ⇒ Buffer
Creates a new buffer that reads lines from the given source.
15 16 17 18 19 20 21 |
# File 'lib/log_parser/buffer.rb', line 15 def initialize(log) @buffer = [] @stream = nil @buffer = log if log.is_a?(Array) @stream = log if log.is_a?(IO) || log.is_a?(StringIO) end |
Instance Method Details
#[](offset, length = nil) ⇒ String+
Retrieves the next ‘length` many log lines starting from index `offset`.
84 85 86 87 88 89 90 91 92 |
# File 'lib/log_parser/buffer.rb', line 84 def [](offset, length = nil) base_length = length || 1 while offset + base_length > @buffer.size return (length.nil? ? nil : @buffer[offset, @buffer.size]) if stream_is_done? @buffer.push(@stream.readline.rstrip) end length.nil? ? @buffer[offset] : @buffer[offset, length] end |
#buffer_size ⇒ Integer
The current size of this buffer, that is the number of lines currently stored.
33 34 35 |
# File 'lib/log_parser/buffer.rb', line 33 def buffer_size @buffer.size end |
#close ⇒ void
This method returns an undefined value.
Closes the ‘IO` this buffer reads from, if any.
115 116 117 |
# File 'lib/log_parser/buffer.rb', line 115 def close @stream.close unless @stream.nil? || @stream.closed? end |
#empty? ⇒ true, false
Determines whether there are more lines in this log (buffer).
26 27 28 |
# File 'lib/log_parser/buffer.rb', line 26 def empty? @buffer.empty? && stream_is_done? end |
#find_index(starting_from = 0) {|line| ... } ⇒ Integer?
Finds the first index of an element that fulfills a predicate.
61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/log_parser/buffer.rb', line 61 def find_index(starting_from = 0) index = starting_from element = self[index] until element.nil? return index if yield(element) index += 1 element = self[index] end nil end |
#first ⇒ String?
The first available line, if any.
Note: Will read from the source if necessary.
42 43 44 |
# File 'lib/log_parser/buffer.rb', line 42 def first self[0] end |
#forward(offset = 1) ⇒ void
This method returns an undefined value.
Moves the front of this buffer forwards by ‘offset` elements.
That is, the following code returns ‘true`: “`ruby before = buffer buffer.forward after = buffer.first before == after “`
107 108 109 110 |
# File 'lib/log_parser/buffer.rb', line 107 def forward(offset = 1) self[offset] @buffer.slice!(0, offset) end |