json-streamer 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/json/streamer/json_streamer.rb +84 -57
- data/lib/json/streamer/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 928cc40a89ddc3be04f541abaed833e0fa89757a
|
4
|
+
data.tar.gz: ed5bc1ab4c5b00a6369b76a0e008d86ff7000bb1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: afaba7db14dea5fe606b04711adcd3c9d04521f4ae4a7c9dc65f1d91debecc7b41c76a733f10c6d3e4bcb95f4690c5379d4ab9ac9d028f0d9ebf835353268298
|
7
|
+
data.tar.gz: a31a925947007fba4c4367e3869276f3d818294dc1afaee66f877e7153d034848bb2a87d45d151025570c7576b958e45efc49511d32def4fbd39510b40303bcf
|
@@ -13,10 +13,9 @@ module Json
|
|
13
13
|
@file_io = file_io
|
14
14
|
@chunk_size = chunk_size
|
15
15
|
|
16
|
-
@
|
17
|
-
@current_key = nil
|
16
|
+
@current_level = -1
|
18
17
|
@aggregator = {}
|
19
|
-
@
|
18
|
+
@aggregator_keys = {}
|
20
19
|
|
21
20
|
@parser.start_object {start_object}
|
22
21
|
@parser.start_array {start_array}
|
@@ -25,87 +24,115 @@ module Json
|
|
25
24
|
|
26
25
|
# Callbacks containing `yield` have to be defined in the method called via block otherwise yield won't work
|
27
26
|
def get(nesting_level:-1, key:nil, yield_values:true)
|
28
|
-
|
29
|
-
|
27
|
+
@yield_level = nesting_level
|
28
|
+
@yield_key = key
|
29
|
+
@yield_values = yield_values
|
30
30
|
|
31
31
|
@parser.value do |v|
|
32
|
-
|
33
|
-
if yield_values and yield_value?(yield_nesting_level)
|
34
|
-
yield v
|
35
|
-
else
|
36
|
-
@aggregator[@current_nesting_level] << v
|
37
|
-
end
|
38
|
-
else
|
39
|
-
@aggregator[@current_nesting_level][@current_key] = v
|
40
|
-
if yield_values and yield_value?(yield_nesting_level, wanted_key)
|
41
|
-
yield v
|
42
|
-
end
|
43
|
-
end
|
32
|
+
value(v) { |desired_object| yield desired_object }
|
44
33
|
end
|
45
34
|
|
46
35
|
@parser.end_object do
|
47
|
-
|
48
|
-
yield @aggregator[@current_nesting_level].clone
|
49
|
-
@aggregator[@current_nesting_level] = {}
|
50
|
-
else
|
51
|
-
merge_up
|
52
|
-
end
|
53
|
-
|
54
|
-
@current_nesting_level -= 1
|
36
|
+
end_level(Hash.new) { |desired_object| yield desired_object }
|
55
37
|
end
|
56
38
|
|
57
39
|
@parser.end_array do
|
58
|
-
|
59
|
-
yield @aggregator[@current_nesting_level].clone
|
60
|
-
@aggregator[@current_nesting_level] = []
|
61
|
-
else
|
62
|
-
merge_up
|
63
|
-
end
|
64
|
-
|
65
|
-
@current_nesting_level -= 1
|
40
|
+
end_level(Array.new) { |desired_object| yield desired_object }
|
66
41
|
end
|
67
42
|
|
68
|
-
if @file_io
|
69
|
-
|
70
|
-
|
71
|
-
|
43
|
+
@file_io.each(@chunk_size) { |chunk| @parser << chunk } if @file_io
|
44
|
+
end
|
45
|
+
|
46
|
+
def start_object
|
47
|
+
new_level(Hash.new)
|
48
|
+
end
|
49
|
+
|
50
|
+
def start_array
|
51
|
+
new_level(Array.new)
|
52
|
+
end
|
53
|
+
|
54
|
+
def key(k)
|
55
|
+
@current_key = k
|
56
|
+
end
|
57
|
+
|
58
|
+
def value(value)
|
59
|
+
reset_current_key if array_level?(@current_level)
|
60
|
+
yield value if yield_value?
|
61
|
+
add_value(value)
|
62
|
+
end
|
63
|
+
|
64
|
+
def add_value(value)
|
65
|
+
if array_level?(@current_level)
|
66
|
+
@aggregator[@current_level] << value
|
67
|
+
else
|
68
|
+
@aggregator[@current_level][@current_key] = value
|
72
69
|
end
|
73
70
|
end
|
74
71
|
|
75
|
-
def
|
76
|
-
|
72
|
+
def end_level(type)
|
73
|
+
if yield_object?
|
74
|
+
yield @aggregator[@current_level].clone
|
75
|
+
reset_current_level(type)
|
76
|
+
else
|
77
|
+
merge_up
|
78
|
+
end
|
79
|
+
|
80
|
+
@current_level -= 1
|
77
81
|
end
|
78
82
|
|
79
|
-
def
|
80
|
-
|
83
|
+
def yield_object?
|
84
|
+
@current_level.eql?(@yield_level) or (not @yield_key.nil? and @yield_key == previous_key)
|
81
85
|
end
|
82
86
|
|
83
|
-
def
|
84
|
-
@
|
85
|
-
@current_nesting_level += 1
|
86
|
-
@aggregator[@current_nesting_level] = {}
|
87
|
+
def yield_value?
|
88
|
+
@yield_values and ((next_level).eql?(@yield_level) or (not @yield_key.nil? and @yield_key == @current_key))
|
87
89
|
end
|
88
90
|
|
89
|
-
def
|
90
|
-
|
91
|
-
|
91
|
+
def new_level(type)
|
92
|
+
reset_current_key if array_level?(@current_level)
|
93
|
+
set_aggregator_key
|
94
|
+
@current_level += 1
|
95
|
+
reset_current_level(type)
|
92
96
|
end
|
93
97
|
|
94
|
-
def
|
95
|
-
@
|
98
|
+
def reset_current_level(type)
|
99
|
+
@aggregator[@current_level] = type
|
100
|
+
end
|
101
|
+
|
102
|
+
def set_aggregator_key
|
103
|
+
@aggregator_keys[@current_level] = @current_key
|
104
|
+
end
|
105
|
+
|
106
|
+
def reset_current_key
|
107
|
+
@current_key = nil
|
108
|
+
end
|
109
|
+
|
110
|
+
def array_level?(nesting_level)
|
111
|
+
@aggregator[nesting_level].is_a?(Array)
|
96
112
|
end
|
97
113
|
|
98
114
|
def merge_up
|
99
|
-
return if @
|
100
|
-
|
101
|
-
if
|
102
|
-
@aggregator[
|
115
|
+
return if @current_level.zero?
|
116
|
+
|
117
|
+
if array_level?(previous_level)
|
118
|
+
@aggregator[previous_level] << @aggregator[@current_level]
|
103
119
|
else
|
104
|
-
@aggregator[
|
120
|
+
@aggregator[previous_level][previous_key] = @aggregator[@current_level]
|
105
121
|
end
|
106
122
|
|
107
|
-
@aggregator.delete(@
|
108
|
-
|
123
|
+
@aggregator.delete(@current_level)
|
124
|
+
end
|
125
|
+
|
126
|
+
def previous_level
|
127
|
+
@current_level - 1
|
128
|
+
end
|
129
|
+
|
130
|
+
def next_level
|
131
|
+
@current_level + 1
|
132
|
+
end
|
133
|
+
|
134
|
+
def previous_key
|
135
|
+
@aggregator_keys[previous_level]
|
109
136
|
end
|
110
137
|
end
|
111
138
|
end
|