lib/json/streamer.rb in json-streamer-0.5.0 vs lib/json/streamer.rb in json-streamer-0.6.0

- old
+ new

@@ -1,111 +1,7 @@ -require "json/streamer/version" -require "json/stream" - -module Json - module Streamer - class JsonStreamer - - attr_reader :aggregator - - def initialize(file_io, chunk_size = 1000) - @parser = JSON::Stream::Parser.new - - @file_io = file_io - @chunk_size = chunk_size - - @current_nesting_level = -1 - @current_key = nil - @aggregator = {} - @temp_aggregator_keys = {} - - @parser.start_object {start_object} - @parser.start_array {start_array} - @parser.key {|k| key(k)} - - end - - # Callbacks containing yield has be defined in the method called via block - def get(nesting_level:-1, key:nil, yield_values:true) - @yield_nesting_level = nesting_level - @wanted_key = key - @yield_values = yield_values - - @parser.value do |v| - if @aggregator[@current_nesting_level].kind_of? Array - @aggregator[@current_nesting_level] << v - else - @aggregator[@current_nesting_level][@current_key] = v - if @yield_values and yield_value? - yield v - end - end - end - - @parser.end_object do - if yield_object? - yield @aggregator[@current_nesting_level].clone - # TODO probably can be faster than reject!{true} - @aggregator[@current_nesting_level].reject!{true} - else - merge_up - end - - @current_nesting_level -= 1 - end - - @parser.end_array do - if yield_object? - yield @aggregator[@current_nesting_level].clone - # TODO probably can be faster than reject!{true} - @aggregator[@current_nesting_level].reject!{true} - else - merge_up - end - - @current_nesting_level -= 1 - end - - @file_io.each(@chunk_size) do |chunk| - @parser << chunk - end - end - - def yield_object? - @current_nesting_level.eql? @yield_nesting_level or (not @wanted_key.nil? and @wanted_key == @temp_aggregator_keys[@current_nesting_level-1]) - end - - def yield_value? - (@current_nesting_level + 1).eql? @yield_nesting_level or @wanted_key == @current_key - end - - def start_object - @temp_aggregator_keys[@current_nesting_level] = @current_key - @current_nesting_level += 1 - @aggregator[@current_nesting_level] = {} - end - - def start_array - @temp_aggregator_keys[@current_nesting_level] = @current_key - @current_nesting_level += 1 - @aggregator[@current_nesting_level] = [] - end - - def key(k) - @current_key = k - end - - def merge_up - return if @current_nesting_level == 0 - previous_nesting_level = @current_nesting_level - 1 - if @aggregator[previous_nesting_level].kind_of? Array - @aggregator[previous_nesting_level] << @aggregator[@current_nesting_level] - else - @aggregator[previous_nesting_level][@temp_aggregator_keys[previous_nesting_level]] = @aggregator[@current_nesting_level] - end - - @aggregator.delete(@current_nesting_level) - @aggregator - end - end - end -end +require_relative "streamer/json_streamer" + +module Json + module Streamer + + end +end