json 2.3.0 → 2.4.0
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 +4 -5
- data/CHANGES.md +33 -0
- data/README.md +16 -0
- data/Rakefile +8 -87
- data/VERSION +1 -1
- data/ext/json/ext/generator/generator.c +119 -6
- data/ext/json/ext/generator/generator.h +5 -2
- data/ext/json/ext/parser/extconf.rb +25 -0
- data/ext/json/ext/parser/parser.c +99 -71
- data/ext/json/ext/parser/parser.h +1 -0
- data/ext/json/ext/parser/parser.rl +29 -1
- data/ext/json/extconf.rb +1 -0
- data/java/src/json/ext/Generator.java +11 -30
- data/java/src/json/ext/GeneratorState.java +30 -0
- data/java/src/json/ext/Parser.java +85 -73
- data/java/src/json/ext/Parser.rl +14 -2
- data/java/src/json/ext/StringEncoder.java +8 -2
- data/json-java.gemspec +22 -21
- data/json.gemspec +0 -0
- data/json_pure.gemspec +8 -13
- data/lib/json/add/complex.rb +0 -1
- data/lib/json/add/rational.rb +0 -1
- data/lib/json/common.rb +339 -113
- data/lib/json/pure/generator.rb +29 -9
- data/lib/json/pure/parser.rb +22 -4
- data/lib/json/version.rb +1 -1
- data/lib/json.rb +549 -29
- data/tests/json_addition_test.rb +0 -4
- data/tests/json_common_interface_test.rb +43 -0
- data/tests/json_fixtures_test.rb +9 -1
- data/tests/json_generator_test.rb +13 -2
- data/tests/json_parser_test.rb +25 -0
- data/tests/test_helper.rb +3 -3
- metadata +23 -12
data/tests/json_fixtures_test.rb
CHANGED
@@ -3,13 +3,14 @@ require 'test_helper'
|
|
3
3
|
|
4
4
|
class JSONFixturesTest < Test::Unit::TestCase
|
5
5
|
def setup
|
6
|
-
fixtures = File.join(File.dirname(__FILE__), 'fixtures/{fail,pass}
|
6
|
+
fixtures = File.join(File.dirname(__FILE__), 'fixtures/{fail,pass}*.json')
|
7
7
|
passed, failed = Dir[fixtures].partition { |f| f['pass'] }
|
8
8
|
@passed = passed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
|
9
9
|
@failed = failed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_passing
|
13
|
+
verbose_bak, $VERBOSE = $VERBOSE, nil
|
13
14
|
for name, source in @passed
|
14
15
|
begin
|
15
16
|
assert JSON.parse(source),
|
@@ -19,6 +20,8 @@ class JSONFixturesTest < Test::Unit::TestCase
|
|
19
20
|
raise e
|
20
21
|
end
|
21
22
|
end
|
23
|
+
ensure
|
24
|
+
$VERBOSE = verbose_bak
|
22
25
|
end
|
23
26
|
|
24
27
|
def test_failing
|
@@ -29,4 +32,9 @@ class JSONFixturesTest < Test::Unit::TestCase
|
|
29
32
|
end
|
30
33
|
end
|
31
34
|
end
|
35
|
+
|
36
|
+
def test_sanity
|
37
|
+
assert(@passed.size > 5)
|
38
|
+
assert(@failed.size > 20)
|
39
|
+
end
|
32
40
|
end
|
@@ -49,7 +49,6 @@ EOT
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def test_remove_const_segv
|
52
|
-
return if RUBY_ENGINE == 'jruby'
|
53
52
|
stress = GC.stress
|
54
53
|
const = JSON::SAFE_STATE_PROTOTYPE.dup
|
55
54
|
|
@@ -76,7 +75,7 @@ EOT
|
|
76
75
|
silence do
|
77
76
|
JSON.const_set :SAFE_STATE_PROTOTYPE, const
|
78
77
|
end
|
79
|
-
end if JSON.const_defined?("Ext")
|
78
|
+
end if JSON.const_defined?("Ext") && RUBY_ENGINE != 'jruby'
|
80
79
|
|
81
80
|
def test_generate
|
82
81
|
json = generate(@hash)
|
@@ -93,6 +92,11 @@ EOT
|
|
93
92
|
end
|
94
93
|
|
95
94
|
def test_generate_pretty
|
95
|
+
json = pretty_generate({})
|
96
|
+
assert_equal(<<'EOT'.chomp, json)
|
97
|
+
{
|
98
|
+
}
|
99
|
+
EOT
|
96
100
|
json = pretty_generate(@hash)
|
97
101
|
# hashes aren't (insertion) ordered on every ruby implementation
|
98
102
|
# assert_equal(@json3, json)
|
@@ -174,6 +178,7 @@ EOT
|
|
174
178
|
:ascii_only => false,
|
175
179
|
:buffer_initial_length => 1024,
|
176
180
|
:depth => 0,
|
181
|
+
:escape_slash => false,
|
177
182
|
:indent => " ",
|
178
183
|
:max_nesting => 100,
|
179
184
|
:object_nl => "\n",
|
@@ -190,6 +195,7 @@ EOT
|
|
190
195
|
:ascii_only => false,
|
191
196
|
:buffer_initial_length => 1024,
|
192
197
|
:depth => 0,
|
198
|
+
:escape_slash => false,
|
193
199
|
:indent => "",
|
194
200
|
:max_nesting => 100,
|
195
201
|
:object_nl => "",
|
@@ -206,6 +212,7 @@ EOT
|
|
206
212
|
:ascii_only => false,
|
207
213
|
:buffer_initial_length => 1024,
|
208
214
|
:depth => 0,
|
215
|
+
:escape_slash => false,
|
209
216
|
:indent => "",
|
210
217
|
:max_nesting => 0,
|
211
218
|
:object_nl => "",
|
@@ -394,6 +401,10 @@ EOT
|
|
394
401
|
json = '["/"]'
|
395
402
|
assert_equal json, generate(data)
|
396
403
|
#
|
404
|
+
data = [ '/' ]
|
405
|
+
json = '["\/"]'
|
406
|
+
assert_equal json, generate(data, :escape_slash => true)
|
407
|
+
#
|
397
408
|
data = ['"']
|
398
409
|
json = '["\""]'
|
399
410
|
assert_equal json, generate(data)
|
data/tests/json_parser_test.rb
CHANGED
@@ -218,6 +218,17 @@ class JSONParserTest < Test::Unit::TestCase
|
|
218
218
|
end
|
219
219
|
end
|
220
220
|
|
221
|
+
def test_freeze
|
222
|
+
assert_predicate parse('{}', :freeze => true), :frozen?
|
223
|
+
assert_predicate parse('[]', :freeze => true), :frozen?
|
224
|
+
assert_predicate parse('"foo"', :freeze => true), :frozen?
|
225
|
+
|
226
|
+
if string_deduplication_available?
|
227
|
+
assert_same(-'foo', parse('"foo"', :freeze => true))
|
228
|
+
assert_same(-'foo', parse('{"foo": 1}', :freeze => true).keys.first)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
221
232
|
def test_parse_comments
|
222
233
|
json = <<EOT
|
223
234
|
{
|
@@ -293,6 +304,10 @@ EOT
|
|
293
304
|
json = '["\\\'"]'
|
294
305
|
data = ["'"]
|
295
306
|
assert_equal data, parse(json)
|
307
|
+
|
308
|
+
json = '["\/"]'
|
309
|
+
data = [ '/' ]
|
310
|
+
assert_equal data, parse(json)
|
296
311
|
end
|
297
312
|
|
298
313
|
class SubArray < Array
|
@@ -464,6 +479,16 @@ EOT
|
|
464
479
|
|
465
480
|
private
|
466
481
|
|
482
|
+
def string_deduplication_available?
|
483
|
+
r1 = rand.to_s
|
484
|
+
r2 = r1.dup
|
485
|
+
begin
|
486
|
+
(-r1).equal?(-r2)
|
487
|
+
rescue NoMethodError
|
488
|
+
false # No String#-@
|
489
|
+
end
|
490
|
+
end
|
491
|
+
|
467
492
|
def assert_equal_float(expected, actual, delta = 1e-2)
|
468
493
|
Array === expected and expected = expected.first
|
469
494
|
Array === actual and actual = actual.first
|
data/tests/test_helper.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
case ENV['JSON']
|
2
2
|
when 'pure'
|
3
|
-
$:.unshift 'lib'
|
3
|
+
$:.unshift File.join(__dir__, '../lib')
|
4
4
|
require 'json/pure'
|
5
5
|
when 'ext'
|
6
|
-
$:.unshift 'ext', 'lib'
|
6
|
+
$:.unshift File.join(__dir__, '../ext'), File.join(__dir__, '../lib')
|
7
7
|
require 'json/ext'
|
8
8
|
else
|
9
|
-
$:.unshift 'ext', 'lib'
|
9
|
+
$:.unshift File.join(__dir__, '../ext'), File.join(__dir__, '../lib')
|
10
10
|
require 'json'
|
11
11
|
end
|
12
12
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Frank
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -28,16 +28,22 @@ dependencies:
|
|
28
28
|
name: test-unit
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '2.0'
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '4.0'
|
34
37
|
type: :development
|
35
38
|
prerelease: false
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
37
40
|
requirements:
|
38
|
-
- - "
|
41
|
+
- - ">="
|
39
42
|
- !ruby/object:Gem::Version
|
40
43
|
version: '2.0'
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '4.0'
|
41
47
|
description: This is a JSON implementation as a Ruby extension in C.
|
42
48
|
email: flori@ping.de
|
43
49
|
executables: []
|
@@ -48,7 +54,6 @@ extensions:
|
|
48
54
|
extra_rdoc_files:
|
49
55
|
- README.md
|
50
56
|
files:
|
51
|
-
- "./tests/test_helper.rb"
|
52
57
|
- ".gitignore"
|
53
58
|
- ".travis.yml"
|
54
59
|
- CHANGES.md
|
@@ -158,8 +163,14 @@ files:
|
|
158
163
|
homepage: http://flori.github.com/json
|
159
164
|
licenses:
|
160
165
|
- Ruby
|
161
|
-
metadata:
|
162
|
-
|
166
|
+
metadata:
|
167
|
+
bug_tracker_uri: https://github.com/flori/json/issues
|
168
|
+
changelog_uri: https://github.com/flori/json/blob/master/CHANGES.md
|
169
|
+
documentation_uri: http://flori.github.io/json/doc/index.html
|
170
|
+
homepage_uri: http://flori.github.io/json/
|
171
|
+
source_code_uri: https://github.com/flori/json
|
172
|
+
wiki_uri: https://github.com/flori/json/wiki
|
173
|
+
post_install_message:
|
163
174
|
rdoc_options:
|
164
175
|
- "--title"
|
165
176
|
- JSON implemention for Ruby
|
@@ -171,16 +182,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
171
182
|
requirements:
|
172
183
|
- - ">="
|
173
184
|
- !ruby/object:Gem::Version
|
174
|
-
version: '
|
185
|
+
version: '2.0'
|
175
186
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
176
187
|
requirements:
|
177
188
|
- - ">="
|
178
189
|
- !ruby/object:Gem::Version
|
179
190
|
version: '0'
|
180
191
|
requirements: []
|
181
|
-
rubygems_version: 3.
|
182
|
-
signing_key:
|
192
|
+
rubygems_version: 3.1.4
|
193
|
+
signing_key:
|
183
194
|
specification_version: 4
|
184
195
|
summary: JSON Implementation for Ruby
|
185
196
|
test_files:
|
186
|
-
-
|
197
|
+
- tests/test_helper.rb
|