yaji 0.3.5-x86-mingw32 → 0.3.6-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -3
- data/Gemfile +2 -2
- data/HISTORY.markdown +5 -0
- data/ext/yaji/parser_ext.c +8 -0
- data/ext/yaji/parser_ext.h +1 -0
- data/lib/yaji.rb +2 -2
- data/lib/yaji/version.rb +1 -1
- data/tasks/compile.rake +21 -24
- data/test/test_parser.rb +175 -135
- data/yaji.gemspec +10 -9
- metadata +26 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 640ff9e360b8b813aa3b1564977f1907f6b34a5a
|
4
|
+
data.tar.gz: 76bcf067016bd3c2b0e5ef6da63e0f3d7e9ecd03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 305dc999b1fbbac91f0258d15ef16f4e631df880b8057d393b41ae76919e6f155d14b33b05323656d48af37c8fe235bc69446e2e7a5fce4060a452ca292548ce
|
7
|
+
data.tar.gz: 7962c15386a7b798b8a4aec125b26f26feec2b449fafa0f9a353d017898902edb1324d301a5ec68cce9babb86d872ec6102dcf0e51673e46ac8752dd81c812b5
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/HISTORY.markdown
CHANGED
data/ext/yaji/parser_ext.c
CHANGED
@@ -99,6 +99,7 @@ static int yaji_hash_key(void *ctx, const unsigned char *val, unsigned int len)
|
|
99
99
|
VALUE key, rv;
|
100
100
|
YAJI_TO_STR((const char *)val, len, key);
|
101
101
|
key = p->symbolize_keys ? ID2SYM(rb_to_id(key)) : key;
|
102
|
+
p->empty_hash = 0;
|
102
103
|
if (p->key_in_use) {
|
103
104
|
rb_ary_pop(p->path);
|
104
105
|
} else {
|
@@ -118,6 +119,7 @@ static int yaji_start_hash(void *ctx)
|
|
118
119
|
{
|
119
120
|
yaji_parser* p = (yaji_parser*) DATA_PTR(ctx);
|
120
121
|
p->key_in_use = 0;
|
122
|
+
p->empty_hash = 1;
|
121
123
|
VALUE rv = rb_ary_new3(3, p->path_str, sym_start_hash, Qnil);
|
122
124
|
rb_ary_push(p->events, rv);
|
123
125
|
return STATUS_CONTINUE;
|
@@ -126,6 +128,12 @@ static int yaji_start_hash(void *ctx)
|
|
126
128
|
static int yaji_end_hash(void *ctx)
|
127
129
|
{
|
128
130
|
yaji_parser* p = (yaji_parser*) DATA_PTR(ctx);
|
131
|
+
if (p->empty_hash) {
|
132
|
+
p->path_str = rb_ary_join(p->path, rb_str_new2("/"));
|
133
|
+
VALUE rv = rb_ary_new3(3, p->path_str, sym_end_hash, Qnil);
|
134
|
+
rb_ary_push(p->events, rv);
|
135
|
+
}
|
136
|
+
p->empty_hash = 0;
|
129
137
|
rb_ary_pop(p->path);
|
130
138
|
p->path_str = rb_ary_join(p->path, rb_str_new2("/"));
|
131
139
|
VALUE rv = rb_ary_new3(3, p->path_str, sym_end_hash, Qnil);
|
data/ext/yaji/parser_ext.h
CHANGED
data/lib/yaji.rb
CHANGED
data/lib/yaji/version.rb
CHANGED
data/tasks/compile.rake
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
gem 'rake-compiler', '>= 0.7.5'
|
2
|
-
require
|
2
|
+
require 'rake/extensiontask'
|
3
3
|
|
4
4
|
def gemspec
|
5
5
|
@clean_gemspec ||= eval(File.read(File.expand_path('../../yaji.gemspec', __FILE__)))
|
6
6
|
end
|
7
7
|
|
8
8
|
require 'rubygems/package_task'
|
9
|
-
Gem::PackageTask.new(gemspec)
|
10
|
-
pkg.need_tar = true
|
11
|
-
end
|
9
|
+
Gem::PackageTask.new(gemspec) { |_pkg| }
|
12
10
|
|
13
|
-
version_router =
|
11
|
+
version_router = proc do |t|
|
14
12
|
File.open(t.name, 'wb') do |f|
|
15
13
|
f.write <<-RUBY
|
16
14
|
require "yaji/\#{RUBY_VERSION.sub(/\\.\\d+$/, '')}/parser_ext"
|
@@ -35,46 +33,45 @@ class Platform
|
|
35
33
|
|
36
34
|
def short_versions
|
37
35
|
res = []
|
38
|
-
each_version do |
|
36
|
+
each_version do |_long, short|
|
39
37
|
res << short
|
40
38
|
end
|
41
39
|
res
|
42
40
|
end
|
43
41
|
end
|
44
42
|
|
45
|
-
recent = "2.0.0-p353"
|
46
43
|
CROSS_PLATFORMS = [
|
47
|
-
Platform.new(:
|
48
|
-
Platform.new(:
|
49
|
-
]
|
50
|
-
|
44
|
+
Platform.new(name: 'x64-mingw32', host: 'x86_64-w64-mingw32', versions: %w(2.0.0-p645 2.1.6 2.2.2 2.3.0 2.4.0)),
|
45
|
+
Platform.new(name: 'x86-mingw32', host: 'i686-w64-mingw32', versions: %w(2.0.0-p645 2.1.6 2.2.2 2.3.0 2.4.0))
|
46
|
+
].freeze
|
47
|
+
|
48
|
+
Rake::ExtensionTask.new('parser_ext', gemspec) do |ext|
|
51
49
|
ext.ext_dir = File.join('ext', 'yaji')
|
52
50
|
|
53
51
|
ext.cross_compile = true
|
54
52
|
ext.cross_platform = ENV['TARGET']
|
55
|
-
if ENV['RUBY_CC_VERSION']
|
56
|
-
ext.lib_dir = "lib/yaji"
|
57
|
-
end
|
53
|
+
ext.lib_dir = 'lib/yaji' if ENV['RUBY_CC_VERSION']
|
58
54
|
ext.cross_compiling do |spec|
|
59
|
-
spec.files.delete(
|
60
|
-
spec.files.push(
|
55
|
+
spec.files.delete('lib/yaji/parser_ext.so')
|
56
|
+
spec.files.push('lib/parser_ext.rb', Dir['lib/yaji/*/parser_ext.so'])
|
61
57
|
file "#{ext.tmp_dir}/#{ext.cross_platform}/stage/lib/parser_ext.rb", &version_router
|
62
58
|
end
|
63
59
|
|
64
60
|
# clean compiled extension
|
65
61
|
CLEAN.include "#{ext.lib_dir}/*.#{RbConfig::CONFIG['DLEXT']}"
|
66
62
|
end
|
63
|
+
CLEAN.include Dir['lib/yaji/*/parser_ext.so']
|
67
64
|
|
68
|
-
file
|
69
|
-
task :
|
65
|
+
file 'lib/parser_ext.rb', &version_router
|
66
|
+
task cross: 'lib/parser_ext.rb'
|
70
67
|
|
71
|
-
desc
|
72
|
-
task
|
68
|
+
desc 'Package gem for windows'
|
69
|
+
task 'package:windows' => :package do
|
73
70
|
CROSS_PLATFORMS.each do |platform|
|
74
|
-
|
75
|
-
|
76
|
-
sh("env RUBY_CC_VERSION=#{short} RBENV_VERSION=#{long} rbenv exec rake cross compile")
|
71
|
+
platform.each_version do |_long, short|
|
72
|
+
sh("TARGET=#{platform.name} RUBY_CC_VERSION=#{short} rake cross compile")
|
77
73
|
end
|
78
|
-
sh("
|
74
|
+
sh("TARGET=#{platform.name} RUBY_CC_VERSION=#{platform.short_versions.join(':')} rake cross native gem")
|
75
|
+
sh('rake clean')
|
79
76
|
end
|
80
77
|
end
|
data/test/test_parser.rb
CHANGED
@@ -3,7 +3,6 @@ require 'yaji'
|
|
3
3
|
require 'curb'
|
4
4
|
|
5
5
|
class TestParser < MiniTest::Unit::TestCase
|
6
|
-
|
7
6
|
class Generator
|
8
7
|
def initialize(data, options = {})
|
9
8
|
@callback = nil
|
@@ -19,9 +18,7 @@ class TestParser < MiniTest::Unit::TestCase
|
|
19
18
|
|
20
19
|
def on_body
|
21
20
|
old = @callback
|
22
|
-
if block_given?
|
23
|
-
@callback = Proc.new
|
24
|
-
end
|
21
|
+
@callback = Proc.new if block_given?
|
25
22
|
old
|
26
23
|
end
|
27
24
|
|
@@ -42,46 +39,46 @@ class TestParser < MiniTest::Unit::TestCase
|
|
42
39
|
events << [p, e, v]
|
43
40
|
end
|
44
41
|
expected = [
|
45
|
-
[
|
46
|
-
[
|
47
|
-
[
|
48
|
-
[
|
49
|
-
[
|
50
|
-
[
|
51
|
-
[
|
52
|
-
[
|
53
|
-
[
|
54
|
-
[
|
55
|
-
[
|
56
|
-
[
|
57
|
-
[
|
58
|
-
[
|
59
|
-
[
|
60
|
-
[
|
61
|
-
[
|
62
|
-
[
|
63
|
-
[
|
64
|
-
[
|
65
|
-
[
|
66
|
-
[
|
67
|
-
[
|
68
|
-
[
|
69
|
-
[
|
70
|
-
[
|
71
|
-
[
|
72
|
-
[
|
73
|
-
[
|
74
|
-
[
|
75
|
-
[
|
76
|
-
[
|
77
|
-
[
|
78
|
-
[
|
79
|
-
[
|
80
|
-
[
|
81
|
-
[
|
82
|
-
[
|
83
|
-
[
|
84
|
-
[
|
42
|
+
['', :start_hash, nil],
|
43
|
+
['', :hash_key, 'total_rows'],
|
44
|
+
['/total_rows', :number, 2],
|
45
|
+
['', :hash_key, 'rows'],
|
46
|
+
['/rows', :start_array, nil],
|
47
|
+
['/rows/', :start_hash, nil],
|
48
|
+
['/rows/', :hash_key, 'id'],
|
49
|
+
['/rows//id', :string, 'buzz'],
|
50
|
+
['/rows/', :hash_key, 'props'],
|
51
|
+
['/rows//props', :start_hash, nil],
|
52
|
+
['/rows//props', :hash_key, 'humanoid'],
|
53
|
+
['/rows//props/humanoid', :boolean, true],
|
54
|
+
['/rows//props', :hash_key, 'armed'],
|
55
|
+
['/rows//props/armed', :boolean, true],
|
56
|
+
['/rows//props', :end_hash, nil],
|
57
|
+
['/rows/', :hash_key, 'movies'],
|
58
|
+
['/rows//movies', :start_array, nil],
|
59
|
+
['/rows//movies/', :number, 1],
|
60
|
+
['/rows//movies/', :number, 2],
|
61
|
+
['/rows//movies/', :number, 3],
|
62
|
+
['/rows//movies', :end_array, nil],
|
63
|
+
['/rows/', :end_hash, nil],
|
64
|
+
['/rows/', :start_hash, nil],
|
65
|
+
['/rows/', :hash_key, 'id'],
|
66
|
+
['/rows//id', :string, 'barbie'],
|
67
|
+
['/rows/', :hash_key, 'props'],
|
68
|
+
['/rows//props', :start_hash, nil],
|
69
|
+
['/rows//props', :hash_key, 'humanoid'],
|
70
|
+
['/rows//props/humanoid', :boolean, true],
|
71
|
+
['/rows//props', :hash_key, 'armed'],
|
72
|
+
['/rows//props/armed', :boolean, false],
|
73
|
+
['/rows//props', :end_hash, nil],
|
74
|
+
['/rows/', :hash_key, 'movies'],
|
75
|
+
['/rows//movies', :start_array, nil],
|
76
|
+
['/rows//movies/', :number, 2],
|
77
|
+
['/rows//movies/', :number, 3],
|
78
|
+
['/rows//movies', :end_array, nil],
|
79
|
+
['/rows/', :end_hash, nil],
|
80
|
+
['/rows', :end_array, nil],
|
81
|
+
['', :end_hash, nil]
|
85
82
|
]
|
86
83
|
assert_equal expected, events
|
87
84
|
end
|
@@ -89,10 +86,10 @@ class TestParser < MiniTest::Unit::TestCase
|
|
89
86
|
def test_it_yields_enumerator
|
90
87
|
parser = YAJI::Parser.new('{"hello":"world"}')
|
91
88
|
e = parser.parse
|
92
|
-
assert_equal [
|
93
|
-
assert_equal [
|
94
|
-
assert_equal [
|
95
|
-
assert_equal [
|
89
|
+
assert_equal ['', :start_hash, nil], e.next
|
90
|
+
assert_equal ['', :hash_key, 'hello'], e.next
|
91
|
+
assert_equal ['/hello', :string, 'world'], e.next
|
92
|
+
assert_equal ['', :end_hash, nil], e.next
|
96
93
|
assert_raises(StopIteration) { e.next }
|
97
94
|
end
|
98
95
|
|
@@ -100,10 +97,10 @@ class TestParser < MiniTest::Unit::TestCase
|
|
100
97
|
parser = YAJI::Parser.new('{"hello":"world"}', :symbolize_keys => true)
|
101
98
|
e = parser.parse
|
102
99
|
expected = [
|
103
|
-
[
|
104
|
-
[
|
105
|
-
[
|
106
|
-
[
|
100
|
+
['', :start_hash, nil],
|
101
|
+
['', :hash_key, :hello],
|
102
|
+
['/hello', :string, 'world'],
|
103
|
+
['', :end_hash, nil]
|
107
104
|
]
|
108
105
|
assert_equal expected, e.to_a
|
109
106
|
end
|
@@ -114,17 +111,17 @@ class TestParser < MiniTest::Unit::TestCase
|
|
114
111
|
parser.each do |o|
|
115
112
|
objects << o
|
116
113
|
end
|
117
|
-
expected = [{
|
118
|
-
|
114
|
+
expected = [{'total_rows' => 2,
|
115
|
+
'rows' => [
|
119
116
|
{
|
120
|
-
|
121
|
-
|
122
|
-
|
117
|
+
'id' => 'buzz',
|
118
|
+
'props' => {'humanoid' => true, 'armed' => true},
|
119
|
+
'movies' => [1, 2, 3]
|
123
120
|
},
|
124
121
|
{
|
125
|
-
|
126
|
-
|
127
|
-
|
122
|
+
'id' => 'barbie',
|
123
|
+
'props' => {'humanoid' => true, 'armed' => false},
|
124
|
+
'movies' => [2, 3]
|
128
125
|
}
|
129
126
|
]}]
|
130
127
|
assert_equal expected, objects
|
@@ -133,114 +130,138 @@ class TestParser < MiniTest::Unit::TestCase
|
|
133
130
|
def test_it_yields_whole_array
|
134
131
|
parser = YAJI::Parser.new(toys_json_str)
|
135
132
|
objects = []
|
136
|
-
parser.each(
|
133
|
+
parser.each('/rows') do |o|
|
137
134
|
objects << o
|
138
135
|
end
|
139
|
-
expected = [
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
136
|
+
expected = [
|
137
|
+
[
|
138
|
+
{
|
139
|
+
'id' => 'buzz',
|
140
|
+
'props' => {'humanoid' => true, 'armed' => true},
|
141
|
+
'movies' => [1, 2, 3]
|
142
|
+
},
|
143
|
+
{
|
144
|
+
'id' => 'barbie',
|
145
|
+
'props' => {'humanoid' => true, 'armed' => false},
|
146
|
+
'movies' => [2, 3]
|
147
|
+
}
|
148
|
+
]
|
149
|
+
]
|
149
150
|
assert_equal expected, objects
|
150
151
|
end
|
151
152
|
|
152
153
|
def test_it_yeilds_array_contents_row_by_row
|
153
154
|
parser = YAJI::Parser.new(toys_json_str)
|
154
155
|
objects = []
|
155
|
-
parser.each(
|
156
|
+
parser.each('/rows/') do |o|
|
156
157
|
objects << o
|
157
158
|
end
|
158
|
-
expected = [
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
159
|
+
expected = [
|
160
|
+
{
|
161
|
+
'id' => 'buzz',
|
162
|
+
'props' => {'humanoid' => true, 'armed' => true},
|
163
|
+
'movies' => [1, 2, 3]
|
164
|
+
},
|
165
|
+
{
|
166
|
+
'id' => 'barbie',
|
167
|
+
'props' => {'humanoid' => true, 'armed' => false},
|
168
|
+
'movies' => [2, 3]
|
169
|
+
}
|
170
|
+
]
|
168
171
|
assert_equal expected, objects
|
169
172
|
end
|
170
173
|
|
171
174
|
def test_it_could_curb_async_approach
|
172
|
-
curl = Curl::Easy.new('
|
175
|
+
curl = Curl::Easy.new('https://avsej.net/test.json')
|
173
176
|
parser = YAJI::Parser.new(curl)
|
174
177
|
object = parser.each.to_a.first
|
175
|
-
expected = {
|
178
|
+
expected = {'foo' => 'bar', 'baz' => {'nums' => [42, 3.1415]}}
|
176
179
|
assert_equal expected, object
|
177
180
|
end
|
178
181
|
|
179
182
|
def test_it_allow_several_selectors
|
180
183
|
parser = YAJI::Parser.new(toys_json_str)
|
181
184
|
objects = []
|
182
|
-
parser.each([
|
185
|
+
parser.each(['/total_rows', '/rows/']) do |o|
|
183
186
|
objects << o
|
184
187
|
end
|
185
|
-
expected = [
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
188
|
+
expected = [
|
189
|
+
2,
|
190
|
+
{
|
191
|
+
'id' => 'buzz',
|
192
|
+
'props' => {'humanoid' => true, 'armed' => true},
|
193
|
+
'movies' => [1, 2, 3]
|
194
|
+
},
|
195
|
+
{
|
196
|
+
'id' => 'barbie',
|
197
|
+
'props' => {'humanoid' => true, 'armed' => false},
|
198
|
+
'movies' => [2, 3]
|
199
|
+
}
|
200
|
+
]
|
196
201
|
assert_equal expected, objects
|
197
202
|
end
|
198
203
|
|
199
204
|
def test_it_optionally_yields_object_path
|
200
205
|
parser = YAJI::Parser.new(toys_json_str)
|
201
206
|
objects = []
|
202
|
-
parser.each([
|
207
|
+
parser.each(['/total_rows', '/rows/'], :with_path => true) do |o|
|
203
208
|
objects << o
|
204
209
|
end
|
205
|
-
expected = [
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
210
|
+
expected = [
|
211
|
+
['/total_rows', 2],
|
212
|
+
[
|
213
|
+
'/rows/',
|
214
|
+
{
|
215
|
+
'id' => 'buzz',
|
216
|
+
'props' => {'humanoid' => true, 'armed' => true},
|
217
|
+
'movies' => [1, 2, 3]
|
218
|
+
}
|
219
|
+
],
|
220
|
+
[
|
221
|
+
'/rows/',
|
222
|
+
{
|
223
|
+
'id' => 'barbie',
|
224
|
+
'props' => {'humanoid' => true, 'armed' => false},
|
225
|
+
'movies' => [2, 3]
|
226
|
+
}
|
227
|
+
]
|
228
|
+
]
|
216
229
|
assert_equal expected, objects
|
217
230
|
end
|
218
231
|
|
219
232
|
def test_it_allows_to_specify_filter_and_options_at_initialization
|
220
233
|
parser = YAJI::Parser.new(toys_json_str,
|
221
|
-
:filter => [
|
234
|
+
:filter => ['/total_rows', '/rows/'],
|
222
235
|
:with_path => true)
|
223
236
|
objects = []
|
224
237
|
parser.each do |o|
|
225
238
|
objects << o
|
226
239
|
end
|
227
|
-
expected = [
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
240
|
+
expected = [
|
241
|
+
['/total_rows', 2],
|
242
|
+
[
|
243
|
+
'/rows/',
|
244
|
+
{
|
245
|
+
'id' => 'buzz',
|
246
|
+
'props' => {'humanoid' => true, 'armed' => true},
|
247
|
+
'movies' => [1, 2, 3]
|
248
|
+
}
|
249
|
+
],
|
250
|
+
[
|
251
|
+
'/rows/',
|
252
|
+
{
|
253
|
+
'id' => 'barbie',
|
254
|
+
'props' => {'humanoid' => true, 'armed' => false},
|
255
|
+
'movies' => [2, 3]
|
256
|
+
}
|
257
|
+
]
|
258
|
+
]
|
238
259
|
assert_equal expected, objects
|
239
260
|
end
|
240
261
|
|
241
262
|
def test_it_doesnt_raise_exception_on_empty_input
|
242
|
-
YAJI::Parser.new(
|
243
|
-
YAJI::Parser.new(
|
263
|
+
YAJI::Parser.new('').parse
|
264
|
+
YAJI::Parser.new(' ').parse
|
244
265
|
YAJI::Parser.new("\n").parse
|
245
266
|
YAJI::Parser.new(" \n\n ").parse
|
246
267
|
end
|
@@ -257,7 +278,7 @@ class TestParser < MiniTest::Unit::TestCase
|
|
257
278
|
parser.parse
|
258
279
|
end
|
259
280
|
assert_raises(ArgumentError) do
|
260
|
-
parser.each{|
|
281
|
+
parser.each { |_x| }
|
261
282
|
end
|
262
283
|
end
|
263
284
|
|
@@ -305,22 +326,24 @@ class TestParser < MiniTest::Unit::TestCase
|
|
305
326
|
JSON
|
306
327
|
parser << data
|
307
328
|
|
308
|
-
expected = [
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
329
|
+
expected = [
|
330
|
+
{
|
331
|
+
'id' => 'buzz',
|
332
|
+
'props' => {'humanoid' => true, 'armed' => true},
|
333
|
+
'movies' => [1, 2, 3]
|
334
|
+
},
|
335
|
+
{
|
336
|
+
'id' => 'barbie',
|
337
|
+
'props' => {'humanoid' => true, 'armed' => false},
|
338
|
+
'movies' => [2, 3]
|
339
|
+
}
|
340
|
+
]
|
318
341
|
assert_equal expected, objects
|
319
342
|
end
|
320
343
|
|
321
344
|
def test_it_parses_chunked_data
|
322
345
|
generator = Generator.new(['{"total_rows":', '0,"offset":0,"rows":[]', '}'])
|
323
|
-
iter = YAJI::Parser.new(generator).each([
|
346
|
+
iter = YAJI::Parser.new(generator).each(['total_rows', '/rows/', '/errors/'], :with_path => true)
|
324
347
|
begin
|
325
348
|
loop do
|
326
349
|
iter.next
|
@@ -331,7 +354,7 @@ class TestParser < MiniTest::Unit::TestCase
|
|
331
354
|
|
332
355
|
def test_it_skips_empty_chunks
|
333
356
|
generator = Generator.new(['{"total_rows":', '0,"offset":0,"rows":[]', '}', '', nil])
|
334
|
-
iter = YAJI::Parser.new(generator).each([
|
357
|
+
iter = YAJI::Parser.new(generator).each(['total_rows', '/rows/', '/errors/'], :with_path => true)
|
335
358
|
begin
|
336
359
|
loop do
|
337
360
|
iter.next
|
@@ -340,6 +363,23 @@ class TestParser < MiniTest::Unit::TestCase
|
|
340
363
|
end
|
341
364
|
end
|
342
365
|
|
366
|
+
def test_it_correctly_handles_empty_hashes
|
367
|
+
chunks = ['{"rows":[{"value":{}}]}']
|
368
|
+
|
369
|
+
parser = YAJI::Parser.new(:filter => '/rows/')
|
370
|
+
|
371
|
+
objects = []
|
372
|
+
parser.on_object do |obj|
|
373
|
+
objects << obj
|
374
|
+
end
|
375
|
+
|
376
|
+
chunks.each do |chunk|
|
377
|
+
parser.write(chunk)
|
378
|
+
end
|
379
|
+
|
380
|
+
assert_equal 1, objects.size
|
381
|
+
end
|
382
|
+
|
343
383
|
protected
|
344
384
|
|
345
385
|
def toys_json_str
|
data/yaji.gemspec
CHANGED
@@ -1,24 +1,25 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
|
-
|
2
|
+
|
3
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
4
|
+
require 'yaji/version'
|
4
5
|
|
5
6
|
Gem::Specification.new do |s|
|
6
|
-
s.name =
|
7
|
+
s.name = 'yaji'
|
7
8
|
s.version = YAJI::VERSION
|
8
9
|
s.author = 'Couchbase'
|
9
10
|
s.email = 'info@couchbase.com'
|
10
11
|
s.license = 'ASL-2'
|
11
|
-
s.homepage =
|
12
|
-
s.summary =
|
13
|
-
s.description =
|
12
|
+
s.homepage = 'https://github.com/avsej/yaji'
|
13
|
+
s.summary = 'Yet another JSON iterator'
|
14
|
+
s.description = 'YAJI is a ruby wrapper to YAJL providing iterator interface to streaming JSON parser'
|
14
15
|
|
15
|
-
s.rubyforge_project =
|
16
|
+
s.rubyforge_project = 'yaji'
|
16
17
|
|
17
18
|
s.files = `git ls-files`.split("\n")
|
18
19
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
20
21
|
s.extensions = `git ls-files -- ext/**/extconf.rb`.split("\n")
|
21
|
-
s.require_paths = [
|
22
|
+
s.require_paths = ['lib']
|
22
23
|
|
23
24
|
s.add_development_dependency 'rake'
|
24
25
|
s.add_development_dependency 'rake-compiler'
|
metadata
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yaji
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.6
|
5
5
|
platform: x86-mingw32
|
6
6
|
authors:
|
7
7
|
- Couchbase
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake-compiler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: curb
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
description: YAJI is a ruby wrapper to YAJL providing iterator interface to streaming
|
@@ -73,8 +73,8 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
-
- .gitignore
|
77
|
-
- .travis.yml
|
76
|
+
- ".gitignore"
|
77
|
+
- ".travis.yml"
|
78
78
|
- Gemfile
|
79
79
|
- HISTORY.markdown
|
80
80
|
- LICENSE
|
@@ -101,7 +101,13 @@ files:
|
|
101
101
|
- ext/yaji/yajl_parser.c
|
102
102
|
- ext/yaji/yajl_parser.h
|
103
103
|
- ext/yaji/yajl_version.c
|
104
|
+
- lib/parser_ext.rb
|
104
105
|
- lib/yaji.rb
|
106
|
+
- lib/yaji/2.0/parser_ext.so
|
107
|
+
- lib/yaji/2.1/parser_ext.so
|
108
|
+
- lib/yaji/2.2/parser_ext.so
|
109
|
+
- lib/yaji/2.3/parser_ext.so
|
110
|
+
- lib/yaji/2.4/parser_ext.so
|
105
111
|
- lib/yaji/version.rb
|
106
112
|
- tasks/compile.rake
|
107
113
|
- tasks/test.rake
|
@@ -109,11 +115,6 @@ files:
|
|
109
115
|
- test/fixture.json
|
110
116
|
- test/test_parser.rb
|
111
117
|
- yaji.gemspec
|
112
|
-
- lib/yaji/1.8/parser_ext.so
|
113
|
-
- lib/yaji/1.9/parser_ext.so
|
114
|
-
- lib/yaji/2.0/parser_ext.so
|
115
|
-
- lib/yaji/2.1/parser_ext.so
|
116
|
-
- lib/parser_ext.rb
|
117
118
|
homepage: https://github.com/avsej/yaji
|
118
119
|
licenses:
|
119
120
|
- ASL-2
|
@@ -124,20 +125,21 @@ require_paths:
|
|
124
125
|
- lib
|
125
126
|
required_ruby_version: !ruby/object:Gem::Requirement
|
126
127
|
requirements:
|
127
|
-
- -
|
128
|
+
- - ">="
|
128
129
|
- !ruby/object:Gem::Version
|
129
|
-
version: '0'
|
130
|
+
version: '2.0'
|
131
|
+
- - "<"
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '2.5'
|
130
134
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
135
|
requirements:
|
132
|
-
- -
|
136
|
+
- - ">="
|
133
137
|
- !ruby/object:Gem::Version
|
134
138
|
version: '0'
|
135
139
|
requirements: []
|
136
140
|
rubyforge_project: yaji
|
137
|
-
rubygems_version: 2.
|
141
|
+
rubygems_version: 2.6.8
|
138
142
|
signing_key:
|
139
143
|
specification_version: 4
|
140
144
|
summary: Yet another JSON iterator
|
141
|
-
test_files:
|
142
|
-
- test/fixture.json
|
143
|
-
- test/test_parser.rb
|
145
|
+
test_files: []
|