json 2.2.0

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.

Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.travis.yml +23 -0
  4. data/CHANGES.md +391 -0
  5. data/Gemfile +14 -0
  6. data/README-json-jruby.md +33 -0
  7. data/README.md +409 -0
  8. data/Rakefile +408 -0
  9. data/VERSION +1 -0
  10. data/diagrams/.keep +0 -0
  11. data/ext/json/ext/fbuffer/fbuffer.h +187 -0
  12. data/ext/json/ext/generator/depend +1 -0
  13. data/ext/json/ext/generator/extconf.rb +4 -0
  14. data/ext/json/ext/generator/generator.c +1444 -0
  15. data/ext/json/ext/generator/generator.h +171 -0
  16. data/ext/json/ext/parser/depend +1 -0
  17. data/ext/json/ext/parser/extconf.rb +6 -0
  18. data/ext/json/ext/parser/parser.c +2131 -0
  19. data/ext/json/ext/parser/parser.h +91 -0
  20. data/ext/json/ext/parser/parser.rl +891 -0
  21. data/ext/json/extconf.rb +2 -0
  22. data/install.rb +23 -0
  23. data/java/src/json/ext/ByteListTranscoder.java +166 -0
  24. data/java/src/json/ext/Generator.java +443 -0
  25. data/java/src/json/ext/GeneratorMethods.java +231 -0
  26. data/java/src/json/ext/GeneratorService.java +42 -0
  27. data/java/src/json/ext/GeneratorState.java +490 -0
  28. data/java/src/json/ext/OptionsReader.java +113 -0
  29. data/java/src/json/ext/Parser.java +2362 -0
  30. data/java/src/json/ext/Parser.rl +893 -0
  31. data/java/src/json/ext/ParserService.java +34 -0
  32. data/java/src/json/ext/RuntimeInfo.java +116 -0
  33. data/java/src/json/ext/StringDecoder.java +166 -0
  34. data/java/src/json/ext/StringEncoder.java +111 -0
  35. data/java/src/json/ext/Utils.java +88 -0
  36. data/json-java.gemspec +38 -0
  37. data/json.gemspec +0 -0
  38. data/json_pure.gemspec +38 -0
  39. data/lib/json.rb +63 -0
  40. data/lib/json/add/bigdecimal.rb +29 -0
  41. data/lib/json/add/complex.rb +29 -0
  42. data/lib/json/add/core.rb +12 -0
  43. data/lib/json/add/date.rb +34 -0
  44. data/lib/json/add/date_time.rb +50 -0
  45. data/lib/json/add/exception.rb +31 -0
  46. data/lib/json/add/ostruct.rb +31 -0
  47. data/lib/json/add/range.rb +29 -0
  48. data/lib/json/add/rational.rb +28 -0
  49. data/lib/json/add/regexp.rb +30 -0
  50. data/lib/json/add/set.rb +29 -0
  51. data/lib/json/add/struct.rb +30 -0
  52. data/lib/json/add/symbol.rb +25 -0
  53. data/lib/json/add/time.rb +38 -0
  54. data/lib/json/common.rb +456 -0
  55. data/lib/json/ext.rb +15 -0
  56. data/lib/json/ext/.keep +0 -0
  57. data/lib/json/generic_object.rb +71 -0
  58. data/lib/json/pure.rb +15 -0
  59. data/lib/json/pure/generator.rb +458 -0
  60. data/lib/json/pure/parser.rb +311 -0
  61. data/lib/json/version.rb +9 -0
  62. data/references/rfc7159.txt +899 -0
  63. data/tests/fixtures/fail10.json +1 -0
  64. data/tests/fixtures/fail11.json +1 -0
  65. data/tests/fixtures/fail12.json +1 -0
  66. data/tests/fixtures/fail13.json +1 -0
  67. data/tests/fixtures/fail14.json +1 -0
  68. data/tests/fixtures/fail18.json +1 -0
  69. data/tests/fixtures/fail19.json +1 -0
  70. data/tests/fixtures/fail2.json +1 -0
  71. data/tests/fixtures/fail20.json +1 -0
  72. data/tests/fixtures/fail21.json +1 -0
  73. data/tests/fixtures/fail22.json +1 -0
  74. data/tests/fixtures/fail23.json +1 -0
  75. data/tests/fixtures/fail24.json +1 -0
  76. data/tests/fixtures/fail25.json +1 -0
  77. data/tests/fixtures/fail27.json +2 -0
  78. data/tests/fixtures/fail28.json +2 -0
  79. data/tests/fixtures/fail3.json +1 -0
  80. data/tests/fixtures/fail4.json +1 -0
  81. data/tests/fixtures/fail5.json +1 -0
  82. data/tests/fixtures/fail6.json +1 -0
  83. data/tests/fixtures/fail7.json +1 -0
  84. data/tests/fixtures/fail8.json +1 -0
  85. data/tests/fixtures/fail9.json +1 -0
  86. data/tests/fixtures/obsolete_fail1.json +1 -0
  87. data/tests/fixtures/pass1.json +56 -0
  88. data/tests/fixtures/pass15.json +1 -0
  89. data/tests/fixtures/pass16.json +1 -0
  90. data/tests/fixtures/pass17.json +1 -0
  91. data/tests/fixtures/pass2.json +1 -0
  92. data/tests/fixtures/pass26.json +1 -0
  93. data/tests/fixtures/pass3.json +6 -0
  94. data/tests/json_addition_test.rb +203 -0
  95. data/tests/json_common_interface_test.rb +126 -0
  96. data/tests/json_encoding_test.rb +107 -0
  97. data/tests/json_ext_parser_test.rb +15 -0
  98. data/tests/json_fixtures_test.rb +32 -0
  99. data/tests/json_generator_test.rb +377 -0
  100. data/tests/json_generic_object_test.rb +82 -0
  101. data/tests/json_parser_test.rb +472 -0
  102. data/tests/json_string_matching_test.rb +38 -0
  103. data/tests/test_helper.rb +17 -0
  104. data/tools/diff.sh +18 -0
  105. data/tools/fuzz.rb +131 -0
  106. data/tools/server.rb +62 -0
  107. metadata +185 -0
@@ -0,0 +1,38 @@
1
+ #frozen_string_literal: false
2
+ require 'test_helper'
3
+ require 'time'
4
+
5
+ class JSONStringMatchingTest < Test::Unit::TestCase
6
+ include JSON
7
+
8
+ class TestTime < ::Time
9
+ def self.json_create(string)
10
+ Time.parse(string)
11
+ end
12
+
13
+ def to_json(*)
14
+ %{"#{strftime('%FT%T%z')}"}
15
+ end
16
+
17
+ def ==(other)
18
+ to_i == other.to_i
19
+ end
20
+ end
21
+
22
+ def test_match_date
23
+ t = TestTime.new
24
+ t_json = [ t ].to_json
25
+ time_regexp = /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/
26
+ assert_equal [ t ],
27
+ parse(
28
+ t_json,
29
+ :create_additions => true,
30
+ :match_string => { time_regexp => TestTime }
31
+ )
32
+ assert_equal [ t.strftime('%FT%T%z') ],
33
+ parse(
34
+ t_json,
35
+ :match_string => { time_regexp => TestTime }
36
+ )
37
+ end
38
+ end
@@ -0,0 +1,17 @@
1
+ case ENV['JSON']
2
+ when 'pure'
3
+ $:.unshift 'lib'
4
+ require 'json/pure'
5
+ when 'ext'
6
+ $:.unshift 'ext', 'lib'
7
+ require 'json/ext'
8
+ else
9
+ $:.unshift 'ext', 'lib'
10
+ require 'json'
11
+ end
12
+
13
+ require 'test/unit'
14
+ begin
15
+ require 'byebug'
16
+ rescue LoadError
17
+ end
@@ -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
@@ -0,0 +1,131 @@
1
+ require 'json'
2
+
3
+ class Fuzzer
4
+ def initialize(n, freqs = {})
5
+ sum = freqs.inject(0.0) { |s, x| s + x.last }
6
+ freqs.each_key { |x| freqs[x] /= sum }
7
+ s = 0.0
8
+ freqs.each_key do |x|
9
+ freqs[x] = s .. (s + t = freqs[x])
10
+ s += t
11
+ end
12
+ @freqs = freqs
13
+ @n = n
14
+ @alpha = (0..0xff).to_a
15
+ end
16
+
17
+ def random_string
18
+ s = ''
19
+ 30.times { s << @alpha[rand(@alpha.size)] }
20
+ s
21
+ end
22
+
23
+ def pick
24
+ r = rand
25
+ found = @freqs.find { |k, f| f.include? rand }
26
+ found && found.first
27
+ end
28
+
29
+ def make_pick
30
+ k = pick
31
+ case
32
+ when k == Hash, k == Array
33
+ k.new
34
+ when k == true, k == false, k == nil
35
+ k
36
+ when k == String
37
+ random_string
38
+ when k == Fixnum
39
+ rand(2 ** 30) - 2 ** 29
40
+ when k == Bignum
41
+ rand(2 ** 70) - 2 ** 69
42
+ end
43
+ end
44
+
45
+ def fuzz(current = nil)
46
+ if @n > 0
47
+ case current
48
+ when nil
49
+ @n -= 1
50
+ current = fuzz [ Hash, Array ][rand(2)].new
51
+ when Array
52
+ while @n > 0
53
+ @n -= 1
54
+ current << case p = make_pick
55
+ when Array, Hash
56
+ fuzz(p)
57
+ else
58
+ p
59
+ end
60
+ end
61
+ when Hash
62
+ while @n > 0
63
+ @n -= 1
64
+ current[random_string] = case p = make_pick
65
+ when Array, Hash
66
+ fuzz(p)
67
+ else
68
+ p
69
+ end
70
+ end
71
+ end
72
+ end
73
+ current
74
+ end
75
+ end
76
+
77
+ class MyState < JSON.state
78
+ WS = " \r\t\n"
79
+
80
+ def initialize
81
+ super(
82
+ :indent => make_spaces,
83
+ :space => make_spaces,
84
+ :space_before => make_spaces,
85
+ :object_nl => make_spaces,
86
+ :array_nl => make_spaces,
87
+ :max_nesting => false
88
+ )
89
+ end
90
+
91
+ def make_spaces
92
+ s = ''
93
+ rand(1).times { s << WS[rand(WS.size)] }
94
+ s
95
+ end
96
+ end
97
+
98
+ n = (ARGV.shift || 500).to_i
99
+ loop do
100
+ fuzzer = Fuzzer.new(n,
101
+ Hash => 25,
102
+ Array => 25,
103
+ String => 10,
104
+ Fixnum => 10,
105
+ Bignum => 10,
106
+ nil => 5,
107
+ true => 5,
108
+ false => 5
109
+ )
110
+ o1 = fuzzer.fuzz
111
+ json = JSON.generate o1, MyState.new
112
+ if $DEBUG
113
+ puts "-" * 80
114
+ puts json, json.size
115
+ else
116
+ puts json.size
117
+ end
118
+ begin
119
+ o2 = JSON.parse(json, :max_nesting => false)
120
+ rescue JSON::ParserError => e
121
+ puts "Caught #{e.class}: #{e.message}\n#{e.backtrace * "\n"}"
122
+ puts "o1 = #{o1.inspect}", "json = #{json}", "json_str = #{json.inspect}"
123
+ puts "locals = #{local_variables.inspect}"
124
+ exit
125
+ end
126
+ if o1 != o2
127
+ puts "mismatch", "o1 = #{o1.inspect}", "o2 = #{o2.inspect}",
128
+ "json = #{json}", "json_str = #{json.inspect}"
129
+ puts "locals = #{local_variables.inspect}"
130
+ end
131
+ end
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require 'webrick'
5
+ include WEBrick
6
+ $:.unshift 'ext'
7
+ $:.unshift 'lib'
8
+ require 'json'
9
+
10
+ class JSONServlet < HTTPServlet::AbstractServlet
11
+ @@count = 1
12
+
13
+ def do_GET(req, res)
14
+ obj = {
15
+ "TIME" => Time.now.strftime("%FT%T"),
16
+ "foo" => "Bär",
17
+ "bar" => "© ≠ €!",
18
+ 'a' => 2,
19
+ 'b' => 3.141,
20
+ 'COUNT' => @@count += 1,
21
+ 'c' => 'c',
22
+ 'd' => [ 1, "b", 3.14 ],
23
+ 'e' => { 'foo' => 'bar' },
24
+ 'g' => "松本行弘",
25
+ 'h' => 1000.0,
26
+ 'i' => 0.001,
27
+ 'j' => "\xf0\xa0\x80\x81",
28
+ }
29
+ res.body = JSON.generate obj
30
+ res['Content-Type'] = "application/json"
31
+ end
32
+ end
33
+
34
+ def create_server(err, dir, port)
35
+ dir = File.expand_path(dir)
36
+ err.puts "Surf to:", "http://#{Socket.gethostname}:#{port}"
37
+
38
+ s = HTTPServer.new(
39
+ :Port => port,
40
+ :DocumentRoot => dir,
41
+ :Logger => WEBrick::Log.new(err),
42
+ :AccessLog => [
43
+ [ err, WEBrick::AccessLog::COMMON_LOG_FORMAT ],
44
+ [ err, WEBrick::AccessLog::REFERER_LOG_FORMAT ],
45
+ [ err, WEBrick::AccessLog::AGENT_LOG_FORMAT ]
46
+ ]
47
+ )
48
+ s.mount("/json", JSONServlet)
49
+ s
50
+ end
51
+
52
+ default_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', 'data'))
53
+ dir = ARGV.shift || default_dir
54
+ port = (ARGV.shift || 6666).to_i
55
+ s = create_server(STDERR, dir, 6666)
56
+ t = Thread.new { s.start }
57
+ trap(:INT) do
58
+ s.shutdown
59
+ t.join
60
+ exit
61
+ end
62
+ sleep
metadata ADDED
@@ -0,0 +1,185 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: json
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Florian Frank
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-02-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: test-unit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ description: This is a JSON implementation as a Ruby extension in C.
42
+ email: flori@ping.de
43
+ executables: []
44
+ extensions:
45
+ - ext/json/ext/generator/extconf.rb
46
+ - ext/json/ext/parser/extconf.rb
47
+ - ext/json/extconf.rb
48
+ extra_rdoc_files:
49
+ - README.md
50
+ files:
51
+ - "./tests/test_helper.rb"
52
+ - ".gitignore"
53
+ - ".travis.yml"
54
+ - CHANGES.md
55
+ - Gemfile
56
+ - README-json-jruby.md
57
+ - README.md
58
+ - Rakefile
59
+ - VERSION
60
+ - diagrams/.keep
61
+ - ext/json/ext/fbuffer/fbuffer.h
62
+ - ext/json/ext/generator/depend
63
+ - ext/json/ext/generator/extconf.rb
64
+ - ext/json/ext/generator/generator.c
65
+ - ext/json/ext/generator/generator.h
66
+ - ext/json/ext/parser/depend
67
+ - ext/json/ext/parser/extconf.rb
68
+ - ext/json/ext/parser/parser.c
69
+ - ext/json/ext/parser/parser.h
70
+ - ext/json/ext/parser/parser.rl
71
+ - ext/json/extconf.rb
72
+ - install.rb
73
+ - java/src/json/ext/ByteListTranscoder.java
74
+ - java/src/json/ext/Generator.java
75
+ - java/src/json/ext/GeneratorMethods.java
76
+ - java/src/json/ext/GeneratorService.java
77
+ - java/src/json/ext/GeneratorState.java
78
+ - java/src/json/ext/OptionsReader.java
79
+ - java/src/json/ext/Parser.java
80
+ - java/src/json/ext/Parser.rl
81
+ - java/src/json/ext/ParserService.java
82
+ - java/src/json/ext/RuntimeInfo.java
83
+ - java/src/json/ext/StringDecoder.java
84
+ - java/src/json/ext/StringEncoder.java
85
+ - java/src/json/ext/Utils.java
86
+ - json-java.gemspec
87
+ - json.gemspec
88
+ - json_pure.gemspec
89
+ - lib/json.rb
90
+ - lib/json/add/bigdecimal.rb
91
+ - lib/json/add/complex.rb
92
+ - lib/json/add/core.rb
93
+ - lib/json/add/date.rb
94
+ - lib/json/add/date_time.rb
95
+ - lib/json/add/exception.rb
96
+ - lib/json/add/ostruct.rb
97
+ - lib/json/add/range.rb
98
+ - lib/json/add/rational.rb
99
+ - lib/json/add/regexp.rb
100
+ - lib/json/add/set.rb
101
+ - lib/json/add/struct.rb
102
+ - lib/json/add/symbol.rb
103
+ - lib/json/add/time.rb
104
+ - lib/json/common.rb
105
+ - lib/json/ext.rb
106
+ - lib/json/ext/.keep
107
+ - lib/json/generic_object.rb
108
+ - lib/json/pure.rb
109
+ - lib/json/pure/generator.rb
110
+ - lib/json/pure/parser.rb
111
+ - lib/json/version.rb
112
+ - references/rfc7159.txt
113
+ - tests/fixtures/fail10.json
114
+ - tests/fixtures/fail11.json
115
+ - tests/fixtures/fail12.json
116
+ - tests/fixtures/fail13.json
117
+ - tests/fixtures/fail14.json
118
+ - tests/fixtures/fail18.json
119
+ - tests/fixtures/fail19.json
120
+ - tests/fixtures/fail2.json
121
+ - tests/fixtures/fail20.json
122
+ - tests/fixtures/fail21.json
123
+ - tests/fixtures/fail22.json
124
+ - tests/fixtures/fail23.json
125
+ - tests/fixtures/fail24.json
126
+ - tests/fixtures/fail25.json
127
+ - tests/fixtures/fail27.json
128
+ - tests/fixtures/fail28.json
129
+ - tests/fixtures/fail3.json
130
+ - tests/fixtures/fail4.json
131
+ - tests/fixtures/fail5.json
132
+ - tests/fixtures/fail6.json
133
+ - tests/fixtures/fail7.json
134
+ - tests/fixtures/fail8.json
135
+ - tests/fixtures/fail9.json
136
+ - tests/fixtures/obsolete_fail1.json
137
+ - tests/fixtures/pass1.json
138
+ - tests/fixtures/pass15.json
139
+ - tests/fixtures/pass16.json
140
+ - tests/fixtures/pass17.json
141
+ - tests/fixtures/pass2.json
142
+ - tests/fixtures/pass26.json
143
+ - tests/fixtures/pass3.json
144
+ - tests/json_addition_test.rb
145
+ - tests/json_common_interface_test.rb
146
+ - tests/json_encoding_test.rb
147
+ - tests/json_ext_parser_test.rb
148
+ - tests/json_fixtures_test.rb
149
+ - tests/json_generator_test.rb
150
+ - tests/json_generic_object_test.rb
151
+ - tests/json_parser_test.rb
152
+ - tests/json_string_matching_test.rb
153
+ - tests/test_helper.rb
154
+ - tools/diff.sh
155
+ - tools/fuzz.rb
156
+ - tools/server.rb
157
+ homepage: http://flori.github.com/json
158
+ licenses:
159
+ - Ruby
160
+ metadata: {}
161
+ post_install_message:
162
+ rdoc_options:
163
+ - "--title"
164
+ - JSON implemention for Ruby
165
+ - "--main"
166
+ - README.md
167
+ require_paths:
168
+ - lib
169
+ required_ruby_version: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '1.9'
174
+ required_rubygems_version: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
179
+ requirements: []
180
+ rubygems_version: 3.0.2
181
+ signing_key:
182
+ specification_version: 4
183
+ summary: JSON Implementation for Ruby
184
+ test_files:
185
+ - "./tests/test_helper.rb"