json 1.4.5 → 1.4.6
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of json might be problematic. Click here for more details.
- data/CHANGES +4 -0
- data/VERSION +1 -1
- data/ext/json/ext/generator/generator.c +5 -4
- data/lib/json/pure/generator.rb +57 -75
- data/lib/json/version.rb +1 -1
- data/tests/test_json_generate.rb +14 -0
- metadata +5 -17
data/CHANGES
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
2010-08-09 (1.4.6)
|
2
|
+
* Fixed oversight reported in http://github.com/flori/json/issues/closed#issue/23,
|
3
|
+
always create a new object from the state prototype.
|
4
|
+
* Made pure and ext api more similar again.
|
1
5
|
2010-08-07 (1.4.5)
|
2
6
|
* Manage data structure nesting depth in state object during generation. This
|
3
7
|
should reduce problems with to_json method definіtions that only have one
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.4.
|
1
|
+
1.4.6
|
@@ -14,7 +14,7 @@ static VALUE mJSON, mExt, mGenerator, cState, mGeneratorMethods, mObject,
|
|
14
14
|
static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before,
|
15
15
|
i_object_nl, i_array_nl, i_max_nesting, i_allow_nan, i_ascii_only,
|
16
16
|
i_pack, i_unpack, i_create_id, i_extend, i_key_p, i_aref, i_send,
|
17
|
-
i_respond_to_p, i_match, i_keys, i_depth;
|
17
|
+
i_respond_to_p, i_match, i_keys, i_depth, i_dup;
|
18
18
|
|
19
19
|
/*
|
20
20
|
* Copyright 2001-2004 Unicode, Inc.
|
@@ -748,7 +748,7 @@ static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_S
|
|
748
748
|
VALUE key, key_to_s, keys;
|
749
749
|
if (max_nesting != 0 && depth > max_nesting) {
|
750
750
|
fbuffer_free(buffer);
|
751
|
-
rb_raise(eNestingError, "nesting of %ld is too deep", depth);
|
751
|
+
rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth);
|
752
752
|
}
|
753
753
|
fbuffer_append_char(buffer, '{');
|
754
754
|
keys = rb_funcall(obj, i_keys, 0);
|
@@ -794,7 +794,7 @@ static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_St
|
|
794
794
|
int i, j;
|
795
795
|
if (max_nesting != 0 && depth > max_nesting) {
|
796
796
|
fbuffer_free(buffer);
|
797
|
-
rb_raise(eNestingError, "nesting of %ld is too deep", depth);
|
797
|
+
rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth);
|
798
798
|
}
|
799
799
|
fbuffer_append_char(buffer, '[');
|
800
800
|
if (array_nl) fbuffer_append(buffer, array_nl, array_nl_len);
|
@@ -1043,7 +1043,7 @@ static VALUE cState_from_state_s(VALUE self, VALUE opts)
|
|
1043
1043
|
if (NIL_P(CJSON_SAFE_STATE_PROTOTYPE)) {
|
1044
1044
|
CJSON_SAFE_STATE_PROTOTYPE = rb_const_get(mJSON, i_SAFE_STATE_PROTOTYPE);
|
1045
1045
|
}
|
1046
|
-
return CJSON_SAFE_STATE_PROTOTYPE;
|
1046
|
+
return rb_funcall(CJSON_SAFE_STATE_PROTOTYPE, i_dup, 0);
|
1047
1047
|
}
|
1048
1048
|
}
|
1049
1049
|
|
@@ -1406,6 +1406,7 @@ void Init_generator()
|
|
1406
1406
|
i_respond_to_p = rb_intern("respond_to?");
|
1407
1407
|
i_match = rb_intern("match");
|
1408
1408
|
i_keys = rb_intern("keys");
|
1409
|
+
i_dup = rb_intern("dup");
|
1409
1410
|
#ifdef HAVE_RUBY_ENCODING_H
|
1410
1411
|
CEncoding_UTF_8 = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-8"));
|
1411
1412
|
i_encoding = rb_intern("encoding");
|
data/lib/json/pure/generator.rb
CHANGED
@@ -112,7 +112,7 @@ module JSON
|
|
112
112
|
when Hash
|
113
113
|
new(opts)
|
114
114
|
else
|
115
|
-
SAFE_STATE_PROTOTYPE
|
115
|
+
SAFE_STATE_PROTOTYPE.dup
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
@@ -167,7 +167,7 @@ module JSON
|
|
167
167
|
# generated JSON.
|
168
168
|
attr_accessor :depth
|
169
169
|
|
170
|
-
def check_max_nesting
|
170
|
+
def check_max_nesting # :nodoc:
|
171
171
|
return if @max_nesting.zero?
|
172
172
|
current_nesting = depth + 1
|
173
173
|
current_nesting > @max_nesting and
|
@@ -252,51 +252,41 @@ module JSON
|
|
252
252
|
# _state_ is a JSON::State object, that can also be used to configure the
|
253
253
|
# produced JSON string output further.
|
254
254
|
# _depth_ is used to find out nesting depth, to indent accordingly.
|
255
|
-
def to_json(state = nil,
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
end
|
260
|
-
json_transform(state, depth)
|
255
|
+
def to_json(state = nil, *)
|
256
|
+
state = State.from_state(state)
|
257
|
+
state.check_max_nesting
|
258
|
+
json_transform(state)
|
261
259
|
end
|
262
260
|
|
263
261
|
private
|
264
262
|
|
265
|
-
def json_shift(state
|
266
|
-
state
|
267
|
-
state.indent * depth
|
263
|
+
def json_shift(state)
|
264
|
+
state.object_nl.empty? or return ''
|
265
|
+
state.indent * state.depth
|
268
266
|
end
|
269
267
|
|
270
|
-
def json_transform(state
|
268
|
+
def json_transform(state)
|
271
269
|
delim = ','
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
result << '}'
|
293
|
-
else
|
294
|
-
result = '{'
|
295
|
-
result << map { |key,value|
|
296
|
-
key.to_s.to_json << ':' << value.to_json
|
297
|
-
}.join(delim)
|
298
|
-
result << '}'
|
299
|
-
end
|
270
|
+
delim << state.object_nl
|
271
|
+
result = '{'
|
272
|
+
result << state.object_nl
|
273
|
+
depth = state.depth += 1
|
274
|
+
first = true
|
275
|
+
indent = !state.object_nl.empty?
|
276
|
+
each { |key,value|
|
277
|
+
result << delim unless first
|
278
|
+
result << state.indent * depth if indent
|
279
|
+
result << key.to_s.to_json(state)
|
280
|
+
result << state.space_before
|
281
|
+
result << ':'
|
282
|
+
result << state.space
|
283
|
+
result << value.to_json(state)
|
284
|
+
first = false
|
285
|
+
}
|
286
|
+
depth = state.depth -= 1
|
287
|
+
result << state.object_nl
|
288
|
+
result << state.indent * depth if indent if indent
|
289
|
+
result << '}'
|
300
290
|
result
|
301
291
|
end
|
302
292
|
end
|
@@ -306,39 +296,32 @@ module JSON
|
|
306
296
|
# this Array instance.
|
307
297
|
# _state_ is a JSON::State object, that can also be used to configure the
|
308
298
|
# produced JSON string output further.
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
state.check_max_nesting(depth)
|
314
|
-
end
|
315
|
-
json_transform(state, depth)
|
299
|
+
def to_json(state = nil, *)
|
300
|
+
state = State.from_state(state)
|
301
|
+
state.check_max_nesting
|
302
|
+
json_transform(state)
|
316
303
|
end
|
317
304
|
|
318
305
|
private
|
319
306
|
|
320
|
-
def json_transform(state
|
307
|
+
def json_transform(state)
|
321
308
|
delim = ','
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
result << delim unless first
|
331
|
-
result << state.indent * depth if indent
|
332
|
-
result << value.to_json(state, depth)
|
333
|
-
first = false
|
334
|
-
}
|
335
|
-
depth -= 1
|
336
|
-
result << state.array_nl
|
309
|
+
delim << state.array_nl
|
310
|
+
result = '['
|
311
|
+
result << state.array_nl
|
312
|
+
depth = state.depth += 1
|
313
|
+
first = true
|
314
|
+
indent = !state.array_nl.empty?
|
315
|
+
each { |value|
|
316
|
+
result << delim unless first
|
337
317
|
result << state.indent * depth if indent
|
338
|
-
result <<
|
339
|
-
|
340
|
-
|
341
|
-
|
318
|
+
result << value.to_json(state)
|
319
|
+
first = false
|
320
|
+
}
|
321
|
+
depth = state.depth -= 1
|
322
|
+
result << state.array_nl
|
323
|
+
result << state.indent * depth if indent
|
324
|
+
result << ']'
|
342
325
|
end
|
343
326
|
end
|
344
327
|
|
@@ -350,15 +333,16 @@ module JSON
|
|
350
333
|
module Float
|
351
334
|
# Returns a JSON string representation for this Float number.
|
352
335
|
def to_json(state = nil, *)
|
336
|
+
state = State.from_state(state)
|
353
337
|
case
|
354
338
|
when infinite?
|
355
|
-
if state
|
339
|
+
if state.allow_nan?
|
356
340
|
to_s
|
357
341
|
else
|
358
342
|
raise GeneratorError, "#{self} not allowed in JSON"
|
359
343
|
end
|
360
344
|
when nan?
|
361
|
-
if state
|
345
|
+
if state.allow_nan?
|
362
346
|
to_s
|
363
347
|
else
|
364
348
|
raise GeneratorError, "#{self} not allowed in JSON"
|
@@ -374,9 +358,8 @@ module JSON
|
|
374
358
|
# This string should be encoded with UTF-8 A call to this method
|
375
359
|
# returns a JSON string encoded with UTF16 big endian characters as
|
376
360
|
# \u????.
|
377
|
-
def to_json(*args)
|
378
|
-
state
|
379
|
-
state ||= State.from_state(state)
|
361
|
+
def to_json(state = nil, *args)
|
362
|
+
state = State.from_state(state)
|
380
363
|
if encoding == ::Encoding::UTF_8
|
381
364
|
string = self
|
382
365
|
else
|
@@ -392,9 +375,8 @@ module JSON
|
|
392
375
|
# This string should be encoded with UTF-8 A call to this method
|
393
376
|
# returns a JSON string encoded with UTF16 big endian characters as
|
394
377
|
# \u????.
|
395
|
-
def to_json(*args)
|
396
|
-
state
|
397
|
-
state ||= State.from_state(state)
|
378
|
+
def to_json(state = nil, *args)
|
379
|
+
state = State.from_state(state)
|
398
380
|
if state.ascii_only?
|
399
381
|
'"' << JSON.utf8_to_json_ascii(self) << '"'
|
400
382
|
else
|
data/lib/json/version.rb
CHANGED
data/tests/test_json_generate.rb
CHANGED
@@ -164,4 +164,18 @@ EOT
|
|
164
164
|
assert_raises(GeneratorError) { pretty_generate([JSON::MinusInfinity]) }
|
165
165
|
assert_equal "[\n -Infinity\n]", pretty_generate([JSON::MinusInfinity], :allow_nan => true)
|
166
166
|
end
|
167
|
+
|
168
|
+
def test_depth
|
169
|
+
ary = []; ary << ary
|
170
|
+
assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
|
171
|
+
assert_raises(JSON::NestingError) { JSON.generate(ary) }
|
172
|
+
assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
|
173
|
+
assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
|
174
|
+
assert_raises(JSON::NestingError) { JSON.pretty_generate(ary) }
|
175
|
+
assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
|
176
|
+
s = JSON.state.new
|
177
|
+
assert_equal 0, s.depth
|
178
|
+
assert_raises(JSON::NestingError) { ary.to_json(s) }
|
179
|
+
assert_equal 19, s.depth
|
180
|
+
end
|
167
181
|
end
|
metadata
CHANGED
@@ -1,13 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease: false
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 4
|
9
|
-
- 5
|
10
|
-
version: 1.4.5
|
4
|
+
version: 1.4.6
|
11
5
|
platform: ruby
|
12
6
|
authors:
|
13
7
|
- Florian Frank
|
@@ -15,7 +9,7 @@ autorequire:
|
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
11
|
|
18
|
-
date: 2010-08-
|
12
|
+
date: 2010-08-09 00:00:00 +02:00
|
19
13
|
default_executable: edit_json.rb
|
20
14
|
dependencies: []
|
21
15
|
|
@@ -161,27 +155,21 @@ require_paths:
|
|
161
155
|
- ext
|
162
156
|
- lib
|
163
157
|
required_ruby_version: !ruby/object:Gem::Requirement
|
164
|
-
none: false
|
165
158
|
requirements:
|
166
159
|
- - ">="
|
167
160
|
- !ruby/object:Gem::Version
|
168
|
-
hash: 3
|
169
|
-
segments:
|
170
|
-
- 0
|
171
161
|
version: "0"
|
162
|
+
version:
|
172
163
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
173
|
-
none: false
|
174
164
|
requirements:
|
175
165
|
- - ">="
|
176
166
|
- !ruby/object:Gem::Version
|
177
|
-
hash: 3
|
178
|
-
segments:
|
179
|
-
- 0
|
180
167
|
version: "0"
|
168
|
+
version:
|
181
169
|
requirements: []
|
182
170
|
|
183
171
|
rubyforge_project: json
|
184
|
-
rubygems_version: 1.3.
|
172
|
+
rubygems_version: 1.3.5
|
185
173
|
signing_key:
|
186
174
|
specification_version: 3
|
187
175
|
summary: JSON Implementation for Ruby
|