yaji 0.3.5-x64-mingw32 → 0.3.6-x64-mingw32
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/.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 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f745372c9c21ec4b2715ed337edb78730d18b4d
|
4
|
+
data.tar.gz: 91f4953dcc9fe505d85f563abb556233413cd932
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 531c01429e61d79316adc10f05034c0a97c30a60d4f77221f701a95870a050174fd6be9e0dc92b3c0d00db92aefafa02a6fe8a7750727a436a7293994674c9b7
|
7
|
+
data.tar.gz: 5a4fe960f95f712050a4a062dcc20bafc5616ea69da80b30cf451ba9eb9bb5eddce9d855d1c31d91e9400736b6d2c16d19aae923bd619561904e3a835c6ad101
|
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: x64-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,10 +115,6 @@ files:
|
|
109
115
|
- test/fixture.json
|
110
116
|
- test/test_parser.rb
|
111
117
|
- yaji.gemspec
|
112
|
-
- lib/yaji/1.9/parser_ext.so
|
113
|
-
- lib/yaji/2.0/parser_ext.so
|
114
|
-
- lib/yaji/2.1/parser_ext.so
|
115
|
-
- lib/parser_ext.rb
|
116
118
|
homepage: https://github.com/avsej/yaji
|
117
119
|
licenses:
|
118
120
|
- ASL-2
|
@@ -123,20 +125,21 @@ require_paths:
|
|
123
125
|
- lib
|
124
126
|
required_ruby_version: !ruby/object:Gem::Requirement
|
125
127
|
requirements:
|
126
|
-
- -
|
128
|
+
- - ">="
|
127
129
|
- !ruby/object:Gem::Version
|
128
|
-
version: '0'
|
130
|
+
version: '2.0'
|
131
|
+
- - "<"
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '2.5'
|
129
134
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
135
|
requirements:
|
131
|
-
- -
|
136
|
+
- - ">="
|
132
137
|
- !ruby/object:Gem::Version
|
133
138
|
version: '0'
|
134
139
|
requirements: []
|
135
140
|
rubyforge_project: yaji
|
136
|
-
rubygems_version: 2.
|
141
|
+
rubygems_version: 2.6.8
|
137
142
|
signing_key:
|
138
143
|
specification_version: 4
|
139
144
|
summary: Yet another JSON iterator
|
140
|
-
test_files:
|
141
|
-
- test/fixture.json
|
142
|
-
- test/test_parser.rb
|
145
|
+
test_files: []
|