yaji 0.0.8 → 0.0.9
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.
- data/HISTORY.markdown +4 -0
- data/ext/yaji/parser_ext.c +20 -4
- data/ext/yaji/parser_ext.h +1 -1
- data/lib/yaji/version.rb +1 -1
- data/test/test_parser.rb +20 -0
- metadata +11 -11
data/HISTORY.markdown
CHANGED
data/ext/yaji/parser_ext.c
CHANGED
@@ -296,6 +296,7 @@ static VALUE rb_yaji_each_iter(VALUE chunk, VALUE* params_p)
|
|
296
296
|
VALUE proc = params[0];
|
297
297
|
VALUE stack = params[1];
|
298
298
|
VALUE query = params[2];
|
299
|
+
VALUE with_path = params[3];
|
299
300
|
VALUE last_entry, object, container, key, hash;
|
300
301
|
|
301
302
|
if (NIL_P(query) || rb_yaji_str_start_with(path, query)) {
|
@@ -317,7 +318,11 @@ static VALUE rb_yaji_each_iter(VALUE chunk, VALUE* params_p)
|
|
317
318
|
} else if (event == sym_end_hash || event == sym_end_array) {
|
318
319
|
object = rb_ary_pop(stack);
|
319
320
|
if (RARRAY_LEN(stack) == 0) {
|
320
|
-
|
321
|
+
if (with_path == Qnil || with_path == Qfalse) {
|
322
|
+
rb_funcall(proc, id_call, 1, object);
|
323
|
+
} else {
|
324
|
+
rb_funcall(proc, id_call, 1, rb_ary_new3(2, path, object));
|
325
|
+
}
|
321
326
|
}
|
322
327
|
} else {
|
323
328
|
last_entry = rb_ary_entry(stack, -1);
|
@@ -331,7 +336,11 @@ static VALUE rb_yaji_each_iter(VALUE chunk, VALUE* params_p)
|
|
331
336
|
rb_ary_push(last_entry, value);
|
332
337
|
break;
|
333
338
|
case T_NIL:
|
334
|
-
|
339
|
+
if (with_path == Qnil || with_path == Qfalse) {
|
340
|
+
rb_funcall(proc, id_call, 1, value);
|
341
|
+
} else {
|
342
|
+
rb_funcall(proc, id_call, 1, rb_ary_new3(2, path, value));
|
343
|
+
}
|
335
344
|
break;
|
336
345
|
}
|
337
346
|
}
|
@@ -341,12 +350,18 @@ static VALUE rb_yaji_each_iter(VALUE chunk, VALUE* params_p)
|
|
341
350
|
|
342
351
|
static VALUE rb_yaji_parser_each(int argc, VALUE* argv, VALUE self)
|
343
352
|
{
|
344
|
-
VALUE query, proc, params[
|
345
|
-
rb_scan_args(argc, argv, "01&", &query, &proc);
|
353
|
+
VALUE query, proc, options, params[4];
|
346
354
|
RETURN_ENUMERATOR(self, argc, argv);
|
355
|
+
rb_scan_args(argc, argv, "02&", &query, &options, &proc);
|
347
356
|
params[0] = proc; // callback
|
348
357
|
params[1] = rb_ary_new(); // stack
|
349
358
|
params[2] = query;
|
359
|
+
if (options != Qnil) {
|
360
|
+
Check_Type(options, T_HASH);
|
361
|
+
params[3] = rb_hash_aref(options, sym_with_path);
|
362
|
+
} else {
|
363
|
+
params[3] = Qnil;
|
364
|
+
}
|
350
365
|
rb_block_call(self, id_parse, 0, NULL, rb_yaji_each_iter, (VALUE)params);
|
351
366
|
return Qnil;
|
352
367
|
}
|
@@ -401,6 +416,7 @@ void Init_parser_ext() {
|
|
401
416
|
sym_check_utf8 = ID2SYM(rb_intern("check_utf8"));
|
402
417
|
sym_symbolize_keys = ID2SYM(rb_intern("symbolize_keys"));
|
403
418
|
sym_read_buffer_size = ID2SYM(rb_intern("read_buffer_size"));
|
419
|
+
sym_with_path = ID2SYM(rb_intern("with_path"));
|
404
420
|
sym_null = ID2SYM(rb_intern("null"));
|
405
421
|
sym_boolean = ID2SYM(rb_intern("boolean"));
|
406
422
|
sym_number = ID2SYM(rb_intern("number"));
|
data/ext/yaji/parser_ext.h
CHANGED
@@ -42,7 +42,7 @@ static rb_encoding *utf8_encoding;
|
|
42
42
|
static VALUE m_yaji, c_yaji_parser, c_parse_error, c_stringio;
|
43
43
|
|
44
44
|
static ID id_call, id_read, id_parse, id_perform, id_on_body, id_bytesize, id_strip;
|
45
|
-
static ID sym_allow_comments, sym_check_utf8, sym_symbolize_keys,
|
45
|
+
static ID sym_allow_comments, sym_check_utf8, sym_symbolize_keys, sym_with_path,
|
46
46
|
sym_read_buffer_size, sym_null, sym_boolean, sym_number, sym_string,
|
47
47
|
sym_hash_key, sym_start_hash, sym_end_hash, sym_start_array,
|
48
48
|
sym_end_array;
|
data/lib/yaji/version.rb
CHANGED
data/test/test_parser.rb
CHANGED
@@ -165,6 +165,26 @@ class TestParser < MiniTest::Unit::TestCase
|
|
165
165
|
assert_equal expected, objects
|
166
166
|
end
|
167
167
|
|
168
|
+
def test_it_optionally_yeilds_object_path
|
169
|
+
parser = YAJI::Parser.new(toys_json_str)
|
170
|
+
objects = []
|
171
|
+
parser.each(["total_rows", "rows/"], :with_path => true) do |o|
|
172
|
+
objects << o
|
173
|
+
end
|
174
|
+
expected = [["total_rows", 2],
|
175
|
+
["rows/", {
|
176
|
+
"id" => "buzz",
|
177
|
+
"props" => { "humanoid"=> true, "armed"=> true },
|
178
|
+
"movies" => [1,2,3]
|
179
|
+
}],
|
180
|
+
["rows/", {
|
181
|
+
"id" => "barbie",
|
182
|
+
"props" => { "humanoid"=> true, "armed"=> false },
|
183
|
+
"movies" => [2,3]
|
184
|
+
}]]
|
185
|
+
assert_equal expected, objects
|
186
|
+
end
|
187
|
+
|
168
188
|
def test_it_doesnt_raise_exception_on_empty_input
|
169
189
|
YAJI::Parser.new("").parse
|
170
190
|
YAJI::Parser.new(" ").parse
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yaji
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-09-01 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake-compiler
|
16
|
-
requirement: &
|
16
|
+
requirement: &13939240 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *13939240
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: minitest
|
27
|
-
requirement: &
|
27
|
+
requirement: &13938660 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *13938660
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: curb
|
38
|
-
requirement: &
|
38
|
+
requirement: &13938080 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *13938080
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: ruby-debug19
|
49
|
-
requirement: &
|
49
|
+
requirement: &13937360 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *13937360
|
58
58
|
description: YAJI is a ruby wrapper to YAJL providing iterator interface to streaming
|
59
59
|
JSON parser
|
60
60
|
email: info@couchbase.com
|
@@ -119,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
119
|
version: '0'
|
120
120
|
requirements: []
|
121
121
|
rubyforge_project: yaji
|
122
|
-
rubygems_version: 1.8.
|
122
|
+
rubygems_version: 1.8.7
|
123
123
|
signing_key:
|
124
124
|
specification_version: 3
|
125
125
|
summary: Yet another JSON iterator
|