json 1.8.1 → 1.8.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.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/.travis.yml +10 -12
- data/CHANGES +23 -0
- data/Gemfile +1 -5
- data/{README.rdoc → README.md} +34 -47
- data/Rakefile +10 -20
- data/VERSION +1 -1
- data/ext/json/ext/fbuffer/fbuffer.h +10 -1
- data/ext/json/ext/generator/extconf.rb +0 -10
- data/ext/json/ext/generator/generator.c +85 -28
- data/ext/json/ext/generator/generator.h +34 -5
- data/ext/json/ext/parser/extconf.rb +0 -10
- data/ext/json/ext/parser/parser.c +166 -130
- data/ext/json/ext/parser/parser.h +19 -4
- data/ext/json/ext/parser/parser.rl +84 -48
- data/ext/json/extconf.rb +3 -0
- data/java/src/json/ext/ByteListTranscoder.java +1 -2
- data/java/src/json/ext/Generator.java +9 -7
- data/java/src/json/ext/GeneratorMethods.java +1 -2
- data/java/src/json/ext/GeneratorService.java +1 -2
- data/java/src/json/ext/GeneratorState.java +1 -2
- data/java/src/json/ext/OptionsReader.java +1 -2
- data/java/src/json/ext/Parser.java +87 -87
- data/java/src/json/ext/Parser.rl +7 -7
- data/java/src/json/ext/ParserService.java +1 -2
- data/java/src/json/ext/RuntimeInfo.java +1 -2
- data/java/src/json/ext/StringDecoder.java +1 -2
- data/java/src/json/ext/StringEncoder.java +5 -0
- data/java/src/json/ext/Utils.java +1 -2
- data/json-java.gemspec +16 -1
- data/json.gemspec +0 -0
- data/json_pure.gemspec +23 -26
- data/lib/json/add/complex.rb +7 -1
- data/lib/json/add/rational.rb +5 -0
- data/lib/json/add/time.rb +1 -1
- data/lib/json/common.rb +5 -5
- data/lib/json/pure/generator.rb +10 -2
- data/lib/json/version.rb +1 -1
- data/tests/test_json.rb +8 -34
- data/tests/test_json_generate.rb +34 -8
- data/tools/diff.sh +18 -0
- metadata +39 -39
- data/COPYING +0 -58
- data/COPYING-json-jruby +0 -57
- data/GPL +0 -340
data/java/src/json/ext/Parser.rl
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
3
|
*
|
4
|
-
* Distributed under the Ruby
|
5
|
-
* for details.
|
4
|
+
* Distributed under the Ruby license: https://www.ruby-lang.org/en/about/license.txt
|
6
5
|
*/
|
7
6
|
package json.ext;
|
8
7
|
|
@@ -128,7 +127,7 @@ public class Parser extends RubyObject {
|
|
128
127
|
*
|
129
128
|
* <dt><code>:create_additions</code>
|
130
129
|
* <dd>If set to <code>false</code>, the Parser doesn't create additions
|
131
|
-
* even if a
|
130
|
+
* even if a matching class and <code>create_id</code> was found. This option
|
132
131
|
* defaults to <code>true</code>.
|
133
132
|
*
|
134
133
|
* <dt><code>:object_class</code>
|
@@ -246,7 +245,7 @@ public class Parser extends RubyObject {
|
|
246
245
|
*/
|
247
246
|
@JRubyMethod
|
248
247
|
public IRubyObject parse(ThreadContext context) {
|
249
|
-
return new ParserSession(this, context).parse();
|
248
|
+
return new ParserSession(this, context, info).parse();
|
250
249
|
}
|
251
250
|
|
252
251
|
/**
|
@@ -302,6 +301,7 @@ public class Parser extends RubyObject {
|
|
302
301
|
private static class ParserSession {
|
303
302
|
private final Parser parser;
|
304
303
|
private final ThreadContext context;
|
304
|
+
private final RuntimeInfo info;
|
305
305
|
private final ByteList byteList;
|
306
306
|
private final ByteList view;
|
307
307
|
private final byte[] data;
|
@@ -313,9 +313,10 @@ public class Parser extends RubyObject {
|
|
313
313
|
// no idea about the origins of this value, ask Flori ;)
|
314
314
|
private static final int EVIL = 0x666;
|
315
315
|
|
316
|
-
private ParserSession(Parser parser, ThreadContext context) {
|
316
|
+
private ParserSession(Parser parser, ThreadContext context, RuntimeInfo info) {
|
317
317
|
this.parser = parser;
|
318
318
|
this.context = context;
|
319
|
+
this.info = info;
|
319
320
|
this.byteList = parser.checkAndGetSource().getByteList();
|
320
321
|
this.data = byteList.unsafeBytes();
|
321
322
|
this.view = new ByteList(data, false);
|
@@ -646,8 +647,7 @@ public class Parser extends RubyObject {
|
|
646
647
|
}
|
647
648
|
}
|
648
649
|
|
649
|
-
if (cs >= JSON_string_first_final && result != null) {
|
650
|
-
RuntimeInfo info = RuntimeInfo.forRuntime(context.getRuntime());
|
650
|
+
if (cs >= JSON_string_first_final && result != null) {
|
651
651
|
if (info.encodingsSupported() && result instanceof RubyString) {
|
652
652
|
((RubyString)result).force_encoding(context, info.utf8.get());
|
653
653
|
}
|
@@ -1,8 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
3
|
*
|
4
|
-
* Distributed under the Ruby
|
5
|
-
* for details.
|
4
|
+
* Distributed under the Ruby license: https://www.ruby-lang.org/en/about/license.txt
|
6
5
|
*/
|
7
6
|
package json.ext;
|
8
7
|
|
@@ -1,8 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
3
|
*
|
4
|
-
* Distributed under the Ruby
|
5
|
-
* for details.
|
4
|
+
* Distributed under the Ruby license: https://www.ruby-lang.org/en/about/license.txt
|
6
5
|
*/
|
7
6
|
package json.ext;
|
8
7
|
|
@@ -1,8 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
3
|
*
|
4
|
-
* Distributed under the Ruby
|
5
|
-
* for details.
|
4
|
+
* Distributed under the Ruby license: https://www.ruby-lang.org/en/about/license.txt
|
6
5
|
*/
|
7
6
|
package json.ext;
|
8
7
|
|
@@ -1,8 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
3
|
*
|
4
|
-
* Distributed under the Ruby
|
5
|
-
* for details.
|
4
|
+
* Distributed under the Ruby license: https://www.ruby-lang.org/en/about/license.txt
|
6
5
|
*/
|
7
6
|
package json.ext;
|
8
7
|
|
data/json-java.gemspec
CHANGED
@@ -11,9 +11,24 @@ spec = Gem::Specification.new do |s|
|
|
11
11
|
s.homepage = "http://json-jruby.rubyforge.org/"
|
12
12
|
s.platform = 'java'
|
13
13
|
s.rubyforge_project = "json-jruby"
|
14
|
-
s.
|
14
|
+
s.licenses = ["Ruby"]
|
15
15
|
|
16
16
|
s.files = Dir["{docs,lib,tests}/**/*"]
|
17
|
+
|
18
|
+
if s.respond_to? :specification_version then
|
19
|
+
s.specification_version = 4
|
20
|
+
|
21
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
22
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
23
|
+
s.add_development_dependency(%q<test-unit>, ["~> 2.0"])
|
24
|
+
else
|
25
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
26
|
+
s.add_dependency(%q<test-unit>, ["~> 2.0"])
|
27
|
+
end
|
28
|
+
else
|
29
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
30
|
+
s.add_dependency(%q<test-unit>, ["~> 2.0"])
|
31
|
+
end
|
17
32
|
end
|
18
33
|
|
19
34
|
if $0 == __FILE__
|
data/json.gemspec
CHANGED
Binary file
|
data/json_pure.gemspec
CHANGED
@@ -1,40 +1,37 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: json_pure 1.8.
|
2
|
+
# stub: json_pure 1.8.6 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
|
-
s.name = "json_pure"
|
6
|
-
s.version = "1.8.
|
5
|
+
s.name = "json_pure".freeze
|
6
|
+
s.version = "1.8.6"
|
7
7
|
|
8
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
|
-
s.
|
10
|
-
s.
|
11
|
-
s.
|
12
|
-
s.
|
13
|
-
s.
|
14
|
-
s.
|
15
|
-
s.
|
16
|
-
s.
|
17
|
-
s.
|
18
|
-
s.
|
19
|
-
s.rubygems_version = "2.
|
20
|
-
s.summary = "JSON Implementation for Ruby"
|
21
|
-
s.test_files = ["./tests/test_json.rb", "./tests/test_json_addition.rb", "./tests/test_json_encoding.rb", "./tests/test_json_fixtures.rb", "./tests/test_json_generate.rb", "./tests/test_json_generic_object.rb", "./tests/test_json_string_matching.rb", "./tests/test_json_unicode.rb"]
|
8
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
9
|
+
s.require_paths = ["lib".freeze]
|
10
|
+
s.authors = ["Florian Frank".freeze]
|
11
|
+
s.date = "2017-01-13"
|
12
|
+
s.description = "This is a JSON implementation in pure Ruby.".freeze
|
13
|
+
s.email = "flori@ping.de".freeze
|
14
|
+
s.extra_rdoc_files = ["README.md".freeze]
|
15
|
+
s.files = ["./tests/test_json.rb".freeze, "./tests/test_json_addition.rb".freeze, "./tests/test_json_encoding.rb".freeze, "./tests/test_json_fixtures.rb".freeze, "./tests/test_json_generate.rb".freeze, "./tests/test_json_generic_object.rb".freeze, "./tests/test_json_string_matching.rb".freeze, "./tests/test_json_unicode.rb".freeze, ".gitignore".freeze, ".travis.yml".freeze, "CHANGES".freeze, "Gemfile".freeze, "README-json-jruby.markdown".freeze, "README.md".freeze, "Rakefile".freeze, "TODO".freeze, "VERSION".freeze, "data/example.json".freeze, "data/index.html".freeze, "data/prototype.js".freeze, "diagrams/.keep".freeze, "ext/json/ext/fbuffer/fbuffer.h".freeze, "ext/json/ext/generator/depend".freeze, "ext/json/ext/generator/extconf.rb".freeze, "ext/json/ext/generator/generator.c".freeze, "ext/json/ext/generator/generator.h".freeze, "ext/json/ext/parser/depend".freeze, "ext/json/ext/parser/extconf.rb".freeze, "ext/json/ext/parser/parser.c".freeze, "ext/json/ext/parser/parser.h".freeze, "ext/json/ext/parser/parser.rl".freeze, "ext/json/extconf.rb".freeze, "install.rb".freeze, "java/src/json/ext/ByteListTranscoder.java".freeze, "java/src/json/ext/Generator.java".freeze, "java/src/json/ext/GeneratorMethods.java".freeze, "java/src/json/ext/GeneratorService.java".freeze, "java/src/json/ext/GeneratorState.java".freeze, "java/src/json/ext/OptionsReader.java".freeze, "java/src/json/ext/Parser.java".freeze, "java/src/json/ext/Parser.rl".freeze, "java/src/json/ext/ParserService.java".freeze, "java/src/json/ext/RuntimeInfo.java".freeze, "java/src/json/ext/StringDecoder.java".freeze, "java/src/json/ext/StringEncoder.java".freeze, "java/src/json/ext/Utils.java".freeze, "json-java.gemspec".freeze, "json.gemspec".freeze, "json_pure.gemspec".freeze, "lib/json.rb".freeze, "lib/json/add/bigdecimal.rb".freeze, "lib/json/add/complex.rb".freeze, "lib/json/add/core.rb".freeze, "lib/json/add/date.rb".freeze, "lib/json/add/date_time.rb".freeze, "lib/json/add/exception.rb".freeze, "lib/json/add/ostruct.rb".freeze, "lib/json/add/range.rb".freeze, "lib/json/add/rational.rb".freeze, "lib/json/add/regexp.rb".freeze, "lib/json/add/struct.rb".freeze, "lib/json/add/symbol.rb".freeze, "lib/json/add/time.rb".freeze, "lib/json/common.rb".freeze, "lib/json/ext.rb".freeze, "lib/json/ext/.keep".freeze, "lib/json/generic_object.rb".freeze, "lib/json/pure.rb".freeze, "lib/json/pure/generator.rb".freeze, "lib/json/pure/parser.rb".freeze, "lib/json/version.rb".freeze, "tests/fixtures/fail1.json".freeze, "tests/fixtures/fail10.json".freeze, "tests/fixtures/fail11.json".freeze, "tests/fixtures/fail12.json".freeze, "tests/fixtures/fail13.json".freeze, "tests/fixtures/fail14.json".freeze, "tests/fixtures/fail18.json".freeze, "tests/fixtures/fail19.json".freeze, "tests/fixtures/fail2.json".freeze, "tests/fixtures/fail20.json".freeze, "tests/fixtures/fail21.json".freeze, "tests/fixtures/fail22.json".freeze, "tests/fixtures/fail23.json".freeze, "tests/fixtures/fail24.json".freeze, "tests/fixtures/fail25.json".freeze, "tests/fixtures/fail27.json".freeze, "tests/fixtures/fail28.json".freeze, "tests/fixtures/fail3.json".freeze, "tests/fixtures/fail4.json".freeze, "tests/fixtures/fail5.json".freeze, "tests/fixtures/fail6.json".freeze, "tests/fixtures/fail7.json".freeze, "tests/fixtures/fail8.json".freeze, "tests/fixtures/fail9.json".freeze, "tests/fixtures/pass1.json".freeze, "tests/fixtures/pass15.json".freeze, "tests/fixtures/pass16.json".freeze, "tests/fixtures/pass17.json".freeze, "tests/fixtures/pass2.json".freeze, "tests/fixtures/pass26.json".freeze, "tests/fixtures/pass3.json".freeze, "tests/setup_variant.rb".freeze, "tests/test_json.rb".freeze, "tests/test_json_addition.rb".freeze, "tests/test_json_encoding.rb".freeze, "tests/test_json_fixtures.rb".freeze, "tests/test_json_generate.rb".freeze, "tests/test_json_generic_object.rb".freeze, "tests/test_json_string_matching.rb".freeze, "tests/test_json_unicode.rb".freeze, "tools/diff.sh".freeze, "tools/fuzz.rb".freeze, "tools/server.rb".freeze]
|
16
|
+
s.homepage = "http://flori.github.com/json".freeze
|
17
|
+
s.licenses = ["Ruby".freeze]
|
18
|
+
s.rdoc_options = ["--title".freeze, "JSON implemention for Ruby".freeze, "--main".freeze, "README.md".freeze]
|
19
|
+
s.rubygems_version = "2.6.8".freeze
|
20
|
+
s.summary = "JSON Implementation for Ruby".freeze
|
21
|
+
s.test_files = ["./tests/test_json.rb".freeze, "./tests/test_json_addition.rb".freeze, "./tests/test_json_encoding.rb".freeze, "./tests/test_json_fixtures.rb".freeze, "./tests/test_json_generate.rb".freeze, "./tests/test_json_generic_object.rb".freeze, "./tests/test_json_string_matching.rb".freeze, "./tests/test_json_unicode.rb".freeze]
|
22
22
|
|
23
23
|
if s.respond_to? :specification_version then
|
24
24
|
s.specification_version = 4
|
25
25
|
|
26
26
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
27
|
-
s.add_development_dependency(%q<
|
28
|
-
s.add_development_dependency(%q<
|
29
|
-
s.add_development_dependency(%q<rake>, ["~> 0.9.2"])
|
27
|
+
s.add_development_dependency(%q<rake>.freeze, [">= 0"])
|
28
|
+
s.add_development_dependency(%q<test-unit>.freeze, ["~> 2.0"])
|
30
29
|
else
|
31
|
-
s.add_dependency(%q<
|
32
|
-
s.add_dependency(%q<
|
33
|
-
s.add_dependency(%q<rake>, ["~> 0.9.2"])
|
30
|
+
s.add_dependency(%q<rake>.freeze, [">= 0"])
|
31
|
+
s.add_dependency(%q<test-unit>.freeze, ["~> 2.0"])
|
34
32
|
end
|
35
33
|
else
|
36
|
-
s.add_dependency(%q<
|
37
|
-
s.add_dependency(%q<
|
38
|
-
s.add_dependency(%q<rake>, ["~> 0.9.2"])
|
34
|
+
s.add_dependency(%q<rake>.freeze, [">= 0"])
|
35
|
+
s.add_dependency(%q<test-unit>.freeze, ["~> 2.0"])
|
39
36
|
end
|
40
37
|
end
|
data/lib/json/add/complex.rb
CHANGED
@@ -4,10 +4,15 @@ end
|
|
4
4
|
defined?(::Complex) or require 'complex'
|
5
5
|
|
6
6
|
class Complex
|
7
|
+
|
8
|
+
# Deserializes JSON string by converting Real value <tt>r</tt>, imaginary
|
9
|
+
# value <tt>i</tt>, to a Complex object.
|
7
10
|
def self.json_create(object)
|
8
11
|
Complex(object['r'], object['i'])
|
9
12
|
end
|
10
13
|
|
14
|
+
# Returns a hash, that will be turned into a JSON object and represent this
|
15
|
+
# object.
|
11
16
|
def as_json(*)
|
12
17
|
{
|
13
18
|
JSON.create_id => self.class.name,
|
@@ -16,7 +21,8 @@ class Complex
|
|
16
21
|
}
|
17
22
|
end
|
18
23
|
|
24
|
+
# Stores class name (Complex) along with real value <tt>r</tt> and imaginary value <tt>i</tt> as JSON string
|
19
25
|
def to_json(*)
|
20
26
|
as_json.to_json
|
21
27
|
end
|
22
|
-
end
|
28
|
+
end
|
data/lib/json/add/rational.rb
CHANGED
@@ -4,10 +4,14 @@ end
|
|
4
4
|
defined?(::Rational) or require 'rational'
|
5
5
|
|
6
6
|
class Rational
|
7
|
+
# Deserializes JSON string by converting numerator value <tt>n</tt>,
|
8
|
+
# denominator value <tt>d</tt>, to a Rational object.
|
7
9
|
def self.json_create(object)
|
8
10
|
Rational(object['n'], object['d'])
|
9
11
|
end
|
10
12
|
|
13
|
+
# Returns a hash, that will be turned into a JSON object and represent this
|
14
|
+
# object.
|
11
15
|
def as_json(*)
|
12
16
|
{
|
13
17
|
JSON.create_id => self.class.name,
|
@@ -16,6 +20,7 @@ class Rational
|
|
16
20
|
}
|
17
21
|
end
|
18
22
|
|
23
|
+
# Stores class name (Rational) along with numerator value <tt>n</tt> and denominator value <tt>d</tt> as JSON string
|
19
24
|
def to_json(*)
|
20
25
|
as_json.to_json
|
21
26
|
end
|
data/lib/json/add/time.rb
CHANGED
@@ -10,7 +10,7 @@ class Time
|
|
10
10
|
if usec = object.delete('u') # used to be tv_usec -> tv_nsec
|
11
11
|
object['n'] = usec * 1000
|
12
12
|
end
|
13
|
-
if
|
13
|
+
if method_defined?(:tv_nsec)
|
14
14
|
at(object['s'], Rational(object['n'], 1000))
|
15
15
|
else
|
16
16
|
at(object['s'], object['n'] / 1000)
|
data/lib/json/common.rb
CHANGED
@@ -148,7 +148,7 @@ module JSON
|
|
148
148
|
# the default.
|
149
149
|
# * *create_additions*: If set to false, the Parser doesn't create
|
150
150
|
# additions even if a matching class and create_id was found. This option
|
151
|
-
# defaults to
|
151
|
+
# defaults to false.
|
152
152
|
# * *object_class*: Defaults to Hash
|
153
153
|
# * *array_class*: Defaults to Array
|
154
154
|
def parse(source, opts = {})
|
@@ -169,7 +169,7 @@ module JSON
|
|
169
169
|
# to true.
|
170
170
|
# * *create_additions*: If set to false, the Parser doesn't create
|
171
171
|
# additions even if a matching class and create_id was found. This option
|
172
|
-
# defaults to
|
172
|
+
# defaults to false.
|
173
173
|
def parse!(source, opts = {})
|
174
174
|
opts = {
|
175
175
|
:max_nesting => false,
|
@@ -390,7 +390,7 @@ module JSON
|
|
390
390
|
end
|
391
391
|
end
|
392
392
|
opts = JSON.dump_default_options
|
393
|
-
|
393
|
+
opts = opts.merge(:max_nesting => limit) if limit
|
394
394
|
result = generate(obj, opts)
|
395
395
|
if anIO
|
396
396
|
anIO.write result
|
@@ -411,7 +411,7 @@ module JSON
|
|
411
411
|
string
|
412
412
|
end
|
413
413
|
|
414
|
-
#
|
414
|
+
# Shortcut for iconv.
|
415
415
|
if ::String.method_defined?(:encode)
|
416
416
|
# Encodes string using Ruby's _String.encode_
|
417
417
|
def self.iconv(to, from, string)
|
@@ -448,7 +448,7 @@ module ::Kernel
|
|
448
448
|
nil
|
449
449
|
end
|
450
450
|
|
451
|
-
#
|
451
|
+
# Outputs _objs_ to STDOUT as JSON strings in a pretty format, with
|
452
452
|
# indentation and over many lines.
|
453
453
|
def jj(*objs)
|
454
454
|
objs.each do |obj|
|
data/lib/json/pure/generator.rb
CHANGED
@@ -363,7 +363,11 @@ module JSON
|
|
363
363
|
result << state.space_before
|
364
364
|
result << ':'
|
365
365
|
result << state.space
|
366
|
-
|
366
|
+
if value.respond_to?(:to_json)
|
367
|
+
result << value.to_json(state)
|
368
|
+
else
|
369
|
+
result << %{"#{String(value)}"}
|
370
|
+
end
|
367
371
|
first = false
|
368
372
|
}
|
369
373
|
depth = state.depth -= 1
|
@@ -398,7 +402,11 @@ module JSON
|
|
398
402
|
each { |value|
|
399
403
|
result << delim unless first
|
400
404
|
result << state.indent * depth if indent
|
401
|
-
|
405
|
+
if value.respond_to?(:to_json)
|
406
|
+
result << value.to_json(state)
|
407
|
+
else
|
408
|
+
result << %{"#{String(value)}"}
|
409
|
+
end
|
402
410
|
first = false
|
403
411
|
}
|
404
412
|
depth = state.depth -= 1
|
data/lib/json/version.rb
CHANGED
data/tests/test_json.rb
CHANGED
@@ -7,20 +7,6 @@ require 'stringio'
|
|
7
7
|
require 'tempfile'
|
8
8
|
require 'ostruct'
|
9
9
|
|
10
|
-
unless Array.method_defined?(:permutation)
|
11
|
-
begin
|
12
|
-
require 'enumerator'
|
13
|
-
require 'permutation'
|
14
|
-
class Array
|
15
|
-
def permutation
|
16
|
-
Permutation.for(self).to_enum.map { |x| x.project }
|
17
|
-
end
|
18
|
-
end
|
19
|
-
rescue LoadError
|
20
|
-
warn "Skipping permutation tests."
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
10
|
class TestJSON < Test::Unit::TestCase
|
25
11
|
include JSON
|
26
12
|
|
@@ -146,26 +132,6 @@ class TestJSON < Test::Unit::TestCase
|
|
146
132
|
assert_raise(JSON::ParserError) { JSON.parse('[ 1, ]', :quirks_mode => true) }
|
147
133
|
end
|
148
134
|
|
149
|
-
if Array.method_defined?(:permutation)
|
150
|
-
def test_parse_more_complex_arrays
|
151
|
-
a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
|
152
|
-
a.permutation.each do |perm|
|
153
|
-
json = pretty_generate(perm)
|
154
|
-
assert_equal perm, parse(json)
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def test_parse_complex_objects
|
159
|
-
a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
|
160
|
-
a.permutation.each do |perm|
|
161
|
-
s = "a"
|
162
|
-
orig_obj = perm.inject({}) { |h, x| h[s.dup] = x; s = s.succ; h }
|
163
|
-
json = pretty_generate(orig_obj)
|
164
|
-
assert_equal orig_obj, parse(json)
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
135
|
def test_parse_arrays
|
170
136
|
assert_equal([1,2,3], parse('[1,2,3]'))
|
171
137
|
assert_equal([1.2,2,3], parse('[1.2,2,3]'))
|
@@ -491,6 +457,8 @@ EOT
|
|
491
457
|
assert_equal @hash, JSON.load(stringio)
|
492
458
|
assert_equal nil, JSON.load(nil)
|
493
459
|
assert_equal nil, JSON.load('')
|
460
|
+
ensure
|
461
|
+
tempfile.close!
|
494
462
|
end
|
495
463
|
|
496
464
|
def test_load_with_options
|
@@ -515,6 +483,12 @@ EOT
|
|
515
483
|
assert_equal too_deep, output.string
|
516
484
|
end
|
517
485
|
|
486
|
+
def test_dump_should_modify_defaults
|
487
|
+
max_nesting = JSON.dump_default_options[:max_nesting]
|
488
|
+
JSON.dump([], StringIO.new, 10)
|
489
|
+
assert_equal max_nesting, JSON.dump_default_options[:max_nesting]
|
490
|
+
end
|
491
|
+
|
518
492
|
def test_big_integers
|
519
493
|
json1 = JSON([orig = (1 << 31) - 1])
|
520
494
|
assert_equal orig, JSON[json1][0]
|
data/tests/test_json_generate.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# encoding: utf-8
|
3
|
+
# frozen_string_literal: false
|
3
4
|
|
4
5
|
require 'test/unit'
|
5
6
|
require File.join(File.dirname(__FILE__), 'setup_variant')
|
@@ -73,6 +74,19 @@ EOT
|
|
73
74
|
assert_equal '666', pretty_generate(666, :quirks_mode => true)
|
74
75
|
end
|
75
76
|
|
77
|
+
def test_generate_custom
|
78
|
+
state = State.new(:space_before => " ", :space => " ", :indent => "<i>", :object_nl => "\n", :array_nl => "<a_nl>")
|
79
|
+
json = generate({1=>{2=>3,4=>[5,6]}}, state)
|
80
|
+
assert_equal(<<'EOT'.chomp, json)
|
81
|
+
{
|
82
|
+
<i>"1" : {
|
83
|
+
<i><i>"2" : 3,
|
84
|
+
<i><i>"4" : [<a_nl><i><i><i>5,<a_nl><i><i><i>6<a_nl><i><i>]
|
85
|
+
<i>}
|
86
|
+
}
|
87
|
+
EOT
|
88
|
+
end
|
89
|
+
|
76
90
|
def test_fast_generate
|
77
91
|
json = fast_generate(@hash)
|
78
92
|
assert_equal(JSON.parse(@json2), JSON.parse(json))
|
@@ -215,16 +229,18 @@ EOT
|
|
215
229
|
end
|
216
230
|
|
217
231
|
def test_gc
|
218
|
-
|
219
|
-
|
220
|
-
|
232
|
+
if respond_to?(:assert_in_out_err)
|
233
|
+
assert_in_out_err(%w[-rjson --disable-gems], <<-EOS, [], [])
|
234
|
+
bignum_too_long_to_embed_as_string = 1234567890123456789012345
|
235
|
+
expect = bignum_too_long_to_embed_as_string.to_s
|
236
|
+
GC.stress = true
|
221
237
|
|
222
|
-
|
223
|
-
|
224
|
-
|
238
|
+
10.times do |i|
|
239
|
+
tmp = bignum_too_long_to_embed_as_string.to_json
|
240
|
+
raise "'\#{expect}' is expected, but '\#{tmp}'" unless tmp == expect
|
241
|
+
end
|
242
|
+
EOS
|
225
243
|
end
|
226
|
-
ensure
|
227
|
-
GC.stress = stress
|
228
244
|
end if GC.respond_to?(:stress=)
|
229
245
|
|
230
246
|
def test_configure_using_configure_and_merge
|
@@ -319,4 +335,14 @@ EOT
|
|
319
335
|
assert_equal true, JSON.generate(["\xea"])
|
320
336
|
end
|
321
337
|
end
|
338
|
+
|
339
|
+
def test_string_subclass
|
340
|
+
s = Class.new(String) do
|
341
|
+
def to_s; self; end
|
342
|
+
undef to_json
|
343
|
+
end
|
344
|
+
assert_nothing_raised(SystemStackError) do
|
345
|
+
assert_equal '["foo"]', JSON.generate([s.new('foo')])
|
346
|
+
end
|
347
|
+
end
|
322
348
|
end
|
data/tools/diff.sh
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
files=`find ext -name '*.[ch]' -o -name parser.rl`
|
4
|
+
|
5
|
+
for f in $files
|
6
|
+
do
|
7
|
+
b=`basename $f`
|
8
|
+
g=`find ../ruby/ext/json -name $b`
|
9
|
+
d=`diff -u $f $g`
|
10
|
+
test -z "$d" && continue
|
11
|
+
echo "$d"
|
12
|
+
read -p "Edit diff of $b? " a
|
13
|
+
case $a in
|
14
|
+
[yY]*)
|
15
|
+
vimdiff $f $g
|
16
|
+
;;
|
17
|
+
esac
|
18
|
+
done
|