json 1.0.0 → 2.7.2

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.
Files changed (109) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES.md +503 -0
  3. data/LICENSE +56 -0
  4. data/README.md +416 -0
  5. data/ext/json/ext/fbuffer/fbuffer.h +187 -0
  6. data/ext/json/ext/generator/depend +1 -0
  7. data/ext/json/ext/generator/extconf.rb +2 -7
  8. data/ext/json/ext/generator/generator.c +1312 -338
  9. data/ext/json/ext/generator/generator.h +177 -0
  10. data/ext/json/ext/parser/depend +1 -0
  11. data/ext/json/ext/parser/extconf.rb +28 -5
  12. data/ext/json/ext/parser/parser.c +1349 -689
  13. data/ext/json/ext/parser/parser.h +96 -0
  14. data/ext/json/ext/parser/parser.rl +644 -188
  15. data/ext/json/extconf.rb +3 -0
  16. data/json.gemspec +68 -0
  17. data/lib/json/add/bigdecimal.rb +58 -0
  18. data/lib/json/add/complex.rb +51 -0
  19. data/lib/json/add/core.rb +12 -0
  20. data/lib/json/add/date.rb +54 -0
  21. data/lib/json/add/date_time.rb +67 -0
  22. data/lib/json/add/exception.rb +49 -0
  23. data/lib/json/add/ostruct.rb +54 -0
  24. data/lib/json/add/range.rb +54 -0
  25. data/lib/json/add/rational.rb +49 -0
  26. data/lib/json/add/regexp.rb +48 -0
  27. data/lib/json/add/set.rb +48 -0
  28. data/lib/json/add/struct.rb +52 -0
  29. data/lib/json/add/symbol.rb +48 -0
  30. data/lib/json/add/time.rb +59 -0
  31. data/lib/json/common.rb +588 -74
  32. data/lib/json/ext.rb +3 -1
  33. data/lib/json/generic_object.rb +75 -0
  34. data/lib/json/pure/generator.rb +311 -119
  35. data/lib/json/pure/parser.rb +182 -55
  36. data/lib/json/pure.rb +5 -65
  37. data/lib/json/version.rb +2 -1
  38. data/lib/json.rb +583 -196
  39. metadata +78 -137
  40. data/CHANGES +0 -25
  41. data/GPL +0 -340
  42. data/README +0 -77
  43. data/Rakefile +0 -250
  44. data/TODO +0 -1
  45. data/VERSION +0 -1
  46. data/benchmarks/benchmark.txt +0 -133
  47. data/benchmarks/benchmark_generator.rb +0 -44
  48. data/benchmarks/benchmark_parser.rb +0 -22
  49. data/benchmarks/benchmark_rails.rb +0 -26
  50. data/bin/edit_json.rb +0 -11
  51. data/data/example.json +0 -1
  52. data/data/index.html +0 -37
  53. data/data/prototype.js +0 -2515
  54. data/ext/json/ext/generator/Makefile +0 -149
  55. data/ext/json/ext/generator/unicode.c +0 -184
  56. data/ext/json/ext/generator/unicode.h +0 -40
  57. data/ext/json/ext/parser/Makefile +0 -149
  58. data/ext/json/ext/parser/unicode.c +0 -156
  59. data/ext/json/ext/parser/unicode.h +0 -44
  60. data/install.rb +0 -26
  61. data/lib/json/Array.xpm +0 -21
  62. data/lib/json/FalseClass.xpm +0 -21
  63. data/lib/json/Hash.xpm +0 -21
  64. data/lib/json/Key.xpm +0 -73
  65. data/lib/json/NilClass.xpm +0 -21
  66. data/lib/json/Numeric.xpm +0 -28
  67. data/lib/json/String.xpm +0 -96
  68. data/lib/json/TrueClass.xpm +0 -21
  69. data/lib/json/editor.rb +0 -1207
  70. data/lib/json/json.xpm +0 -1499
  71. data/tests/fixtures/fail1.json +0 -1
  72. data/tests/fixtures/fail10.json +0 -1
  73. data/tests/fixtures/fail11.json +0 -1
  74. data/tests/fixtures/fail12.json +0 -1
  75. data/tests/fixtures/fail13.json +0 -1
  76. data/tests/fixtures/fail14.json +0 -1
  77. data/tests/fixtures/fail15.json +0 -1
  78. data/tests/fixtures/fail16.json +0 -1
  79. data/tests/fixtures/fail17.json +0 -1
  80. data/tests/fixtures/fail19.json +0 -1
  81. data/tests/fixtures/fail2.json +0 -1
  82. data/tests/fixtures/fail20.json +0 -1
  83. data/tests/fixtures/fail21.json +0 -1
  84. data/tests/fixtures/fail22.json +0 -1
  85. data/tests/fixtures/fail23.json +0 -1
  86. data/tests/fixtures/fail24.json +0 -1
  87. data/tests/fixtures/fail25.json +0 -1
  88. data/tests/fixtures/fail26.json +0 -1
  89. data/tests/fixtures/fail27.json +0 -2
  90. data/tests/fixtures/fail28.json +0 -2
  91. data/tests/fixtures/fail3.json +0 -1
  92. data/tests/fixtures/fail4.json +0 -1
  93. data/tests/fixtures/fail5.json +0 -1
  94. data/tests/fixtures/fail6.json +0 -1
  95. data/tests/fixtures/fail7.json +0 -1
  96. data/tests/fixtures/fail8.json +0 -1
  97. data/tests/fixtures/fail9.json +0 -1
  98. data/tests/fixtures/pass1.json +0 -56
  99. data/tests/fixtures/pass18.json +0 -1
  100. data/tests/fixtures/pass2.json +0 -1
  101. data/tests/fixtures/pass3.json +0 -6
  102. data/tests/runner.rb +0 -24
  103. data/tests/test_json.rb +0 -235
  104. data/tests/test_json_addition.rb +0 -94
  105. data/tests/test_json_fixtures.rb +0 -30
  106. data/tests/test_json_generate.rb +0 -81
  107. data/tests/test_json_unicode.rb +0 -55
  108. data/tools/fuzz.rb +0 -133
  109. data/tools/server.rb +0 -62
@@ -1,55 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'test/unit'
4
- require 'json'
5
-
6
- class TC_JSONUnicode < Test::Unit::TestCase
7
- include JSON
8
-
9
- def setup
10
- $KCODE = 'UTF8'
11
- end
12
-
13
- def test_unicode
14
- assert_equal '""', ''.to_json
15
- assert_equal '"\\b"', "\b".to_json
16
- assert_equal '"\u0001"', 0x1.chr.to_json
17
- assert_equal '"\u001f"', 0x1f.chr.to_json
18
- assert_equal '" "', ' '.to_json
19
- assert_equal "\"#{0x7f.chr}\"", 0x7f.chr.to_json
20
- utf8 = [ "© ≠ €! \01" ]
21
- json = '["\u00a9 \u2260 \u20ac! \u0001"]'
22
- assert_equal json, utf8.to_json
23
- assert_equal utf8, parse(json)
24
- utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
25
- json = "[\"\\u3042\\u3044\\u3046\\u3048\\u304a\"]"
26
- assert_equal json, utf8.to_json
27
- assert_equal utf8, parse(json)
28
- utf8 = ['საქართველო']
29
- json = "[\"\\u10e1\\u10d0\\u10e5\\u10d0\\u10e0\\u10d7\\u10d5\\u10d4\\u10da\\u10dd\"]"
30
- assert_equal json, utf8.to_json
31
- assert_equal utf8, parse(json)
32
- assert_equal '["\\u00c3"]', JSON.generate(["Ã"])
33
- assert_equal ["€"], JSON.parse('["\u20ac"]')
34
- utf8 = ["\xf0\xa0\x80\x81"]
35
- json = '["\ud840\udc01"]'
36
- assert_equal json, JSON.generate(utf8)
37
- assert_equal utf8, JSON.parse(json)
38
- end
39
-
40
- def test_chars
41
- (0..0x7f).each do |i|
42
- json = '["\u%04x"]' % i
43
- assert_equal i, JSON.parse(json).first[0]
44
- if [?\b, ?\n, ?\r, ?\t, ?\f].include?(i)
45
- assert_equal '[' << ('' << i).dump << ']', JSON.generate(["" << i])
46
- elsif i < 0x20
47
- assert_equal json, JSON.generate(["" << i])
48
- end
49
- end
50
- assert_raises(JSON::GeneratorError) do
51
- JSON.generate(["" << 0x80])
52
- end
53
- assert_equal "\302\200", JSON.parse('["\u0080"]').first
54
- end
55
- end
data/tools/fuzz.rb DELETED
@@ -1,133 +0,0 @@
1
- $KCODE='UTF8'
2
- require 'json'
3
- require 'irb'
4
- require 'pp'
5
-
6
- class Fuzzer
7
- def initialize(n, freqs = {})
8
- sum = freqs.inject(0.0) { |s, x| s + x.last }
9
- freqs.each_key { |x| freqs[x] /= sum }
10
- s = 0.0
11
- freqs.each_key do |x|
12
- freqs[x] = s .. (s + t = freqs[x])
13
- s += t
14
- end
15
- @freqs = freqs
16
- @n = n
17
- @alpha = (0..0x7f).to_a
18
- end
19
-
20
- def random_string
21
- s = ''
22
- 30.times { s << @alpha[rand(@alpha.size)] }
23
- s
24
- end
25
-
26
- def pick
27
- r = rand
28
- found = @freqs.find { |k, f| f.include? rand }
29
- found && found.first
30
- end
31
-
32
- def make_pick
33
- k = pick
34
- case
35
- when k == Hash, k == Array
36
- k.new
37
- when k == true, k == false, k == nil
38
- k
39
- when k == String
40
- random_string
41
- when k == Fixnum
42
- rand(2 ** 30) - 2 ** 29
43
- when k == Bignum
44
- rand(2 ** 70) - 2 ** 69
45
- end
46
- end
47
-
48
- def fuzz(current = nil)
49
- if @n > 0
50
- case current
51
- when nil
52
- @n -= 1
53
- current = fuzz [ Hash, Array ][rand(2)].new
54
- when Array
55
- while @n > 0
56
- @n -= 1
57
- current << case p = make_pick
58
- when Array, Hash
59
- fuzz(p)
60
- else
61
- p
62
- end
63
- end
64
- when Hash
65
- while @n > 0
66
- @n -= 1
67
- current[random_string] = case p = make_pick
68
- when Array, Hash
69
- fuzz(p)
70
- else
71
- p
72
- end
73
- end
74
- end
75
- end
76
- current
77
- end
78
- end
79
-
80
- class MyState < JSON.state
81
- WS = " \r\t\n"
82
-
83
- def initialize
84
- super(
85
- :indent => make_spaces,
86
- :space => make_spaces,
87
- :space_before => make_spaces,
88
- :object_nl => make_spaces,
89
- :array_nl => make_spaces
90
- )
91
- end
92
-
93
- def make_spaces
94
- s = ''
95
- rand(1).times { s << WS[rand(WS.size)] }
96
- s
97
- end
98
- end
99
-
100
- n = (ARGV.shift || 500).to_i
101
- loop do
102
- fuzzer = Fuzzer.new(n,
103
- Hash => 25,
104
- Array => 25,
105
- String => 10,
106
- Fixnum => 10,
107
- Bignum => 10,
108
- nil => 5,
109
- true => 5,
110
- false => 5
111
- )
112
- o1 = fuzzer.fuzz
113
- json = JSON.generate o1, MyState.new
114
- if $DEBUG
115
- puts "-" * 80
116
- puts json, json.size
117
- else
118
- puts json.size
119
- end
120
- begin
121
- o2 = JSON.parse(json)
122
- rescue JSON::ParserError => e
123
- puts "Caught #{e.class}: #{e.message}\n#{e.backtrace * "\n"}"
124
- puts "o1 = #{o1.inspect}", "json = #{json}", "json_str = #{json.inspect}"
125
- puts "locals = #{local_variables.inspect}"
126
- exit
127
- end
128
- if o1 != o2
129
- puts "mismatch", "o1 = #{o1.inspect}", "o2 = #{o2.inspect}",
130
- "json = #{json}", "json_str = #{json.inspect}"
131
- puts "locals = #{local_variables.inspect}"
132
- end
133
- end
data/tools/server.rb DELETED
@@ -1,62 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- $KCODE='UTF8'
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