Skip to content

Commit

Permalink
Extracts aggregator
Browse files Browse the repository at this point in the history
  • Loading branch information
thisismydesign committed Sep 18, 2017
1 parent 899085f commit aff4476
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 27 deletions.
1 change: 1 addition & 0 deletions lib/json/streamer.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
require_relative "streamer/json_streamer"
require_relative "streamer/conditions"
require_relative "streamer/callbacks"
require_relative "streamer/aggregator"

module Json
module Streamer
Expand Down
56 changes: 56 additions & 0 deletions lib/json/streamer/aggregator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
require 'forwardable'

module Json
module Streamer
class Aggregator
extend Forwardable
def_delegators :@aggregator, :pop, :push, :empty?

def initialize
@aggregator = []
end

def get
@aggregator
end

def level
@aggregator.size
end

def key
@aggregator.last[:key] unless @aggregator.last.nil?
end

def key=(k)
@aggregator.last[:key] = k
end

def value
@aggregator.last[:value]
end

def value=(d)
if array_level?
value << d
else
value[key] = d
end
end

def key_for_level(level)
@aggregator[level][:key] unless @aggregator[level].nil?
end

def value_for_level(level)
@aggregator[level][:key] unless @aggregator[level].nil?
end

private

def array_level?
value.is_a?(Array)
end
end
end
end
34 changes: 7 additions & 27 deletions lib/json/streamer/callbacks.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ class Callbacks

def initialize(conditions)
@conditions = conditions
@aggregator = []
@aggregator = Aggregator.new
end

def start_object
Expand All @@ -17,11 +17,11 @@ def start_array
end

def key(k, symbolize_keys)
@aggregator.last[:key] = symbolize_keys ? k.to_sym : k
@aggregator.key = symbolize_keys ? k.to_sym : k
end

def value(value)
if @conditions.yield_value?(current_level, current_key)
if @conditions.yield_value?(@aggregator.level, @aggregator.key)
yield value
else
add_value(value)
Expand All @@ -36,46 +36,26 @@ def end_array
end_level { |obj| yield obj }
end

def current_level
@aggregator.size
end

def current_key
key_for_level(current_level - 1)
end

def key_for_level(level)
@aggregator[level][:key] unless @aggregator[level].nil?
end

private

def end_level
data = @aggregator.last[:data].clone
data = @aggregator.value.clone

@aggregator.pop

if @conditions.yield?(current_level, current_key)
if @conditions.yield?(@aggregator.level, @aggregator.key)
yield data
else
add_value(data) unless @aggregator.empty?
end
end

def add_value(value)
if array_level?
@aggregator.last[:data] << value
else
@aggregator.last[:data][current_key] = value
end
@aggregator.value = value
end

def new_level(type)
@aggregator.push(data: type)
end

def array_level?
@aggregator.last[:data].is_a?(Array)
@aggregator.push(value: type)
end
end
end
Expand Down

0 comments on commit aff4476

Please sign in to comment.