Class: Json::Streamer::JsonStreamer
- Inherits:
-
Object
- Object
- Json::Streamer::JsonStreamer
- Defined in:
- lib/json/streamer/json_streamer.rb
Instance Attribute Summary collapse
-
#aggregator ⇒ Object
readonly
Returns the value of attribute aggregator.
-
#parser ⇒ Object
readonly
Returns the value of attribute parser.
Instance Method Summary collapse
- #<<(data) ⇒ Object
- #add_value(value) ⇒ Object
- #array_level?(nesting_level) ⇒ Boolean
- #end_level(type) ⇒ Object
-
#get(nesting_level: -1,, key: nil, yield_values: true, symbolize_keys: false) ⇒ Object
Callbacks containing ‘yield` have to be defined in the method called via block otherwise yield won’t work.
-
#initialize(file_io = nil, chunk_size = 1000) ⇒ JsonStreamer
constructor
A new instance of JsonStreamer.
- #key(k) ⇒ Object
- #merge_up ⇒ Object
- #new_level(type) ⇒ Object
- #next_level ⇒ Object
- #previous_key ⇒ Object
- #previous_level ⇒ Object
- #reset_current_key ⇒ Object
- #reset_current_level(type) ⇒ Object
- #set_aggregator_key ⇒ Object
- #start_array ⇒ Object
- #start_object ⇒ Object
- #value(value) {|value| ... } ⇒ Object
- #yield_object? ⇒ Boolean
- #yield_value? ⇒ Boolean
Constructor Details
#initialize(file_io = nil, chunk_size = 1000) ⇒ JsonStreamer
Returns a new instance of JsonStreamer.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/json/streamer/json_streamer.rb', line 10 def initialize(file_io = nil, chunk_size = 1000) @parser = JSON::Stream::Parser.new @file_io = file_io @chunk_size = chunk_size @current_level = -1 @aggregator = {} @aggregator_keys = {} @parser.start_object {start_object} @parser.start_array {start_array} @parser.key {|k| key(k)} end |
Instance Attribute Details
#aggregator ⇒ Object (readonly)
Returns the value of attribute aggregator.
7 8 9 |
# File 'lib/json/streamer/json_streamer.rb', line 7 def aggregator @aggregator end |
#parser ⇒ Object (readonly)
Returns the value of attribute parser.
8 9 10 |
# File 'lib/json/streamer/json_streamer.rb', line 8 def parser @parser end |
Instance Method Details
#<<(data) ⇒ Object
25 26 27 |
# File 'lib/json/streamer/json_streamer.rb', line 25 def <<(data) @parser << data end |
#add_value(value) ⇒ Object
69 70 71 72 73 74 75 |
# File 'lib/json/streamer/json_streamer.rb', line 69 def add_value(value) if array_level?(@current_level) @aggregator[@current_level] << value else @aggregator[@current_level][@current_key] = value end end |
#array_level?(nesting_level) ⇒ Boolean
115 116 117 |
# File 'lib/json/streamer/json_streamer.rb', line 115 def array_level?(nesting_level) @aggregator[nesting_level].is_a?(Array) end |
#end_level(type) ⇒ Object
77 78 79 80 81 82 83 84 85 86 |
# File 'lib/json/streamer/json_streamer.rb', line 77 def end_level(type) if yield_object? yield @aggregator[@current_level].clone reset_current_level(type) else merge_up end @current_level -= 1 end |
#get(nesting_level: -1,, key: nil, yield_values: true, symbolize_keys: false) ⇒ Object
Callbacks containing ‘yield` have to be defined in the method called via block otherwise yield won’t work
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/json/streamer/json_streamer.rb', line 30 def get(nesting_level: -1, key: nil, yield_values: true, symbolize_keys: false) @yield_level = nesting_level @yield_key = key @yield_values = yield_values @symbolize_keys = symbolize_keys @parser.value do |v| value(v) { |desired_object| yield desired_object } end @parser.end_object do end_level(Hash.new) { |desired_object| yield desired_object } end @parser.end_array do end_level(Array.new) { |desired_object| yield desired_object } end @file_io.each(@chunk_size) { |chunk| @parser << chunk } if @file_io end |
#key(k) ⇒ Object
59 60 61 |
# File 'lib/json/streamer/json_streamer.rb', line 59 def key(k) @current_key = @symbolize_keys ? k.to_sym : k end |
#merge_up ⇒ Object
119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/json/streamer/json_streamer.rb', line 119 def merge_up return if @current_level.zero? if array_level?(previous_level) @aggregator[previous_level] << @aggregator[@current_level] else @aggregator[previous_level][previous_key] = @aggregator[@current_level] end @aggregator.delete(@current_level) end |
#new_level(type) ⇒ Object
96 97 98 99 100 101 |
# File 'lib/json/streamer/json_streamer.rb', line 96 def new_level(type) reset_current_key if array_level?(@current_level) set_aggregator_key @current_level += 1 reset_current_level(type) end |
#next_level ⇒ Object
135 136 137 |
# File 'lib/json/streamer/json_streamer.rb', line 135 def next_level @current_level + 1 end |
#previous_key ⇒ Object
139 140 141 |
# File 'lib/json/streamer/json_streamer.rb', line 139 def previous_key @aggregator_keys[previous_level] end |
#previous_level ⇒ Object
131 132 133 |
# File 'lib/json/streamer/json_streamer.rb', line 131 def previous_level @current_level - 1 end |
#reset_current_key ⇒ Object
111 112 113 |
# File 'lib/json/streamer/json_streamer.rb', line 111 def reset_current_key @current_key = nil end |
#reset_current_level(type) ⇒ Object
103 104 105 |
# File 'lib/json/streamer/json_streamer.rb', line 103 def reset_current_level(type) @aggregator[@current_level] = type end |
#set_aggregator_key ⇒ Object
107 108 109 |
# File 'lib/json/streamer/json_streamer.rb', line 107 def set_aggregator_key @aggregator_keys[@current_level] = @current_key end |
#start_array ⇒ Object
55 56 57 |
# File 'lib/json/streamer/json_streamer.rb', line 55 def start_array new_level(Array.new) end |
#start_object ⇒ Object
51 52 53 |
# File 'lib/json/streamer/json_streamer.rb', line 51 def start_object new_level(Hash.new) end |
#value(value) {|value| ... } ⇒ Object
63 64 65 66 67 |
# File 'lib/json/streamer/json_streamer.rb', line 63 def value(value) reset_current_key if array_level?(@current_level) yield value if yield_value? add_value(value) end |
#yield_object? ⇒ Boolean
88 89 90 |
# File 'lib/json/streamer/json_streamer.rb', line 88 def yield_object? @current_level.eql?(@yield_level) or (not @yield_key.nil? and @yield_key == previous_key) end |
#yield_value? ⇒ Boolean
92 93 94 |
# File 'lib/json/streamer/json_streamer.rb', line 92 def yield_value? @yield_values and ((next_level).eql?(@yield_level) or (not @yield_key.nil? and @yield_key == @current_key)) end |