json 1.8.3 → 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.
Files changed (83) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +2 -0
  3. data/.travis.yml +9 -12
  4. data/{CHANGES → CHANGES.md} +219 -90
  5. data/Gemfile +10 -6
  6. data/{COPYING-json-jruby → LICENSE} +5 -6
  7. data/{README-json-jruby.markdown → README-json-jruby.md} +0 -0
  8. data/{README.rdoc → README.md} +201 -134
  9. data/Rakefile +35 -113
  10. data/VERSION +1 -1
  11. data/ext/json/ext/fbuffer/fbuffer.h +0 -3
  12. data/ext/json/ext/generator/generator.c +255 -101
  13. data/ext/json/ext/generator/generator.h +12 -4
  14. data/ext/json/ext/parser/extconf.rb +28 -0
  15. data/ext/json/ext/parser/parser.c +410 -462
  16. data/ext/json/ext/parser/parser.h +5 -5
  17. data/ext/json/ext/parser/parser.rl +166 -181
  18. data/ext/json/extconf.rb +1 -1
  19. data/java/src/json/ext/ByteListTranscoder.java +1 -2
  20. data/java/src/json/ext/Generator.java +39 -36
  21. data/java/src/json/ext/GeneratorMethods.java +1 -2
  22. data/java/src/json/ext/GeneratorService.java +1 -2
  23. data/java/src/json/ext/GeneratorState.java +33 -56
  24. data/java/src/json/ext/OptionsReader.java +2 -3
  25. data/java/src/json/ext/Parser.java +146 -417
  26. data/java/src/json/ext/Parser.rl +62 -126
  27. data/java/src/json/ext/ParserService.java +1 -2
  28. data/java/src/json/ext/RuntimeInfo.java +1 -6
  29. data/java/src/json/ext/StringDecoder.java +1 -2
  30. data/java/src/json/ext/StringEncoder.java +13 -2
  31. data/java/src/json/ext/Utils.java +1 -2
  32. data/json-java.gemspec +22 -7
  33. data/json.gemspec +0 -0
  34. data/json_pure.gemspec +22 -29
  35. data/lib/json/add/bigdecimal.rb +3 -2
  36. data/lib/json/add/complex.rb +4 -4
  37. data/lib/json/add/core.rb +1 -0
  38. data/lib/json/add/date.rb +1 -1
  39. data/lib/json/add/date_time.rb +1 -1
  40. data/lib/json/add/exception.rb +1 -1
  41. data/lib/json/add/ostruct.rb +3 -3
  42. data/lib/json/add/range.rb +1 -1
  43. data/lib/json/add/rational.rb +3 -3
  44. data/lib/json/add/regexp.rb +3 -3
  45. data/lib/json/add/set.rb +29 -0
  46. data/lib/json/add/struct.rb +1 -1
  47. data/lib/json/add/symbol.rb +1 -1
  48. data/lib/json/add/time.rb +1 -1
  49. data/lib/json/common.rb +350 -152
  50. data/lib/json/ext.rb +0 -6
  51. data/lib/json/generic_object.rb +5 -4
  52. data/lib/json/pure/generator.rb +83 -126
  53. data/lib/json/pure/parser.rb +62 -84
  54. data/lib/json/pure.rb +2 -8
  55. data/lib/json/version.rb +2 -1
  56. data/lib/json.rb +550 -29
  57. data/references/rfc7159.txt +899 -0
  58. data/tests/fixtures/obsolete_fail1.json +1 -0
  59. data/tests/{test_json_addition.rb → json_addition_test.rb} +28 -25
  60. data/tests/json_common_interface_test.rb +169 -0
  61. data/tests/json_encoding_test.rb +107 -0
  62. data/tests/json_ext_parser_test.rb +15 -0
  63. data/tests/{test_json_fixtures.rb → json_fixtures_test.rb} +13 -8
  64. data/tests/{test_json_generate.rb → json_generator_test.rb} +134 -39
  65. data/tests/{test_json_generic_object.rb → json_generic_object_test.rb} +15 -8
  66. data/tests/json_parser_test.rb +497 -0
  67. data/tests/json_string_matching_test.rb +38 -0
  68. data/tests/test_helper.rb +17 -0
  69. data/tools/diff.sh +18 -0
  70. data/tools/fuzz.rb +1 -9
  71. metadata +47 -53
  72. data/COPYING +0 -58
  73. data/GPL +0 -340
  74. data/TODO +0 -1
  75. data/data/example.json +0 -1
  76. data/data/index.html +0 -38
  77. data/data/prototype.js +0 -4184
  78. data/tests/fixtures/fail1.json +0 -1
  79. data/tests/setup_variant.rb +0 -11
  80. data/tests/test_json.rb +0 -553
  81. data/tests/test_json_encoding.rb +0 -65
  82. data/tests/test_json_string_matching.rb +0 -39
  83. data/tests/test_json_unicode.rb +0 -72
data/Rakefile CHANGED
@@ -23,12 +23,13 @@ class UndocumentedTestTask < Rake::TestTask
23
23
  def desc(*) end
24
24
  end
25
25
 
26
- def skip_sdoc(src)
27
- src.gsub(/^.*sdoc.*/) { |s| s + ' if RUBY_VERSION > "1.8.6"' }
28
- end
26
+ which = lambda { |c|
27
+ w = `which #{c}`
28
+ break w.chomp unless w.empty?
29
+ }
29
30
 
30
- MAKE = ENV['MAKE'] || %w[gmake make].find { |c| system(c, '-v') }
31
- BUNDLE = ENV['BUNDLE'] || %w[bundle].find { |c| system(c, '-v') }
31
+ MAKE = ENV['MAKE'] || %w[gmake make].find(&which)
32
+ BUNDLE = ENV['BUNDLE'] || %w[bundle].find(&which)
32
33
  PKG_NAME = 'json'
33
34
  PKG_TITLE = 'JSON Implementation for Ruby'
34
35
  PKG_VERSION = File.read('VERSION').chomp
@@ -51,8 +52,8 @@ JAVA_CLASSES = []
51
52
  JRUBY_PARSER_JAR = File.expand_path("lib/json/ext/parser.jar")
52
53
  JRUBY_GENERATOR_JAR = File.expand_path("lib/json/ext/generator.jar")
53
54
 
54
- RAGEL_CODEGEN = %w[rlcodegen rlgen-cd ragel].find { |c| system(c, '-v') }
55
- RAGEL_DOTGEN = %w[rlgen-dot rlgen-cd ragel].find { |c| system(c, '-v') }
55
+ RAGEL_CODEGEN = %w[rlcodegen rlgen-cd ragel].find(&which)
56
+ RAGEL_DOTGEN = %w[rlgen-dot rlgen-cd ragel].find(&which)
56
57
 
57
58
  desc "Installing library (pure)"
58
59
  task :install_pure => :version do
@@ -77,90 +78,12 @@ task :install_ext => [ :compile, :install_pure, :install_ext_really ]
77
78
  desc "Installing library (extension)"
78
79
  task :install => :install_ext
79
80
 
80
- if defined?(Gem) and defined?(Gem::PackageTask)
81
- spec_pure = Gem::Specification.new do |s|
82
- s.name = 'json_pure'
83
- s.version = PKG_VERSION
84
- s.summary = PKG_TITLE
85
- s.description = "This is a JSON implementation in pure Ruby."
86
-
87
- s.files = PKG_FILES
88
-
89
- s.require_path = 'lib'
90
- s.add_development_dependency 'permutation'
91
- s.add_development_dependency 'sdoc', '~>0.3.16'
92
- s.add_development_dependency 'rake', '~>0.9.2'
93
-
94
- s.extra_rdoc_files << 'README.rdoc'
95
- s.rdoc_options <<
96
- '--title' << 'JSON implemention for ruby' << '--main' << 'README.rdoc'
97
- s.test_files.concat Dir['./tests/test_*.rb']
98
-
99
- s.author = "Florian Frank"
100
- s.email = "flori@ping.de"
101
- s.homepage = "http://flori.github.com/#{PKG_NAME}"
102
- s.license = 'Ruby'
103
- end
104
-
105
- desc 'Creates a json_pure.gemspec file'
106
- task :gemspec_pure => :version do
107
- File.open('json_pure.gemspec', 'w') do |gemspec|
108
- gemspec.write skip_sdoc(spec_pure.to_ruby)
109
- end
110
- end
111
-
112
- Gem::PackageTask.new(spec_pure) do |pkg|
113
- pkg.need_tar = true
114
- pkg.package_files = PKG_FILES
115
- end
116
-
117
- spec_ext = Gem::Specification.new do |s|
118
- s.name = 'json'
119
- s.version = PKG_VERSION
120
- s.summary = PKG_TITLE
121
- s.description = "This is a JSON implementation as a Ruby extension in C."
122
-
123
- s.files = PKG_FILES
124
-
125
- s.extensions = FileList['ext/**/extconf.rb']
126
-
127
- s.require_path = 'lib'
128
- s.add_development_dependency 'permutation'
129
- s.add_development_dependency 'sdoc', '~>0.3.16'
130
-
131
- s.extra_rdoc_files << 'README.rdoc'
132
- s.rdoc_options <<
133
- '--title' << 'JSON implemention for Ruby' << '--main' << 'README.rdoc'
134
- s.test_files.concat Dir['./tests/test_*.rb']
135
-
136
- s.author = "Florian Frank"
137
- s.email = "flori@ping.de"
138
- s.homepage = "http://flori.github.com/#{PKG_NAME}"
139
- s.license = 'Ruby'
140
- end
141
-
142
- desc 'Creates a json.gemspec file'
143
- task :gemspec_ext => :version do
144
- File.open('json.gemspec', 'w') do |gemspec|
145
- gemspec.write skip_sdoc(spec_ext.to_ruby)
146
- end
147
- end
148
-
149
- Gem::PackageTask.new(spec_ext) do |pkg|
150
- pkg.need_tar = true
151
- pkg.package_files = PKG_FILES
152
- end
153
-
154
-
155
- desc 'Create all gemspec files'
156
- task :gemspec => [ :gemspec_pure, :gemspec_ext ]
157
- end
158
-
159
81
  desc m = "Writing version information for #{PKG_VERSION}"
160
82
  task :version do
161
83
  puts m
162
84
  File.open(File.join('lib', 'json', 'version.rb'), 'w') do |v|
163
85
  v.puts <<EOT
86
+ # frozen_string_literal: false
164
87
  module JSON
165
88
  # JSON version
166
89
  VERSION = '#{PKG_VERSION}'
@@ -173,22 +96,24 @@ EOT
173
96
  end
174
97
  end
175
98
 
99
+ task :check_env do
100
+ ENV.key?('JSON') or fail "JSON env var is required"
101
+ end
102
+
176
103
  desc "Testing library (pure ruby)"
177
- task :test_pure => [ :clean, :do_test_pure ]
104
+ task :test_pure => [ :set_env_pure, :check_env, :do_test_pure ]
105
+ task(:set_env_pure) { ENV['JSON'] = 'pure' }
178
106
 
179
107
  UndocumentedTestTask.new do |t|
180
108
  t.name = 'do_test_pure'
181
- t.libs << 'lib'
182
- t.test_files = FileList['tests/test_*.rb']
109
+ t.libs << 'lib' << 'tests'
110
+ t.test_files = FileList['tests/*_test.rb']
183
111
  t.verbose = true
184
112
  t.options = '-v'
185
113
  end
186
114
 
187
115
  desc "Testing library (pure ruby and extension)"
188
- task :test do
189
- sh "env JSON=pure #{BUNDLE} exec rake test_pure" or exit 1
190
- sh "env JSON=ext #{BUNDLE} exec rake test_ext" or exit 1
191
- end
116
+ task :test => [ :test_pure, :test_ext ]
192
117
 
193
118
  namespace :gems do
194
119
  desc 'Install all development gems'
@@ -198,13 +123,11 @@ namespace :gems do
198
123
  end
199
124
 
200
125
  if defined?(RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
201
- if ENV.key?('JAVA_HOME')
202
- warn " *** JAVA_HOME was set to #{ENV['JAVA_HOME'].inspect}"
203
- elsif File.directory?(local_java = '/usr/local/java/jdk') ||
204
- File.directory?(local_java = '/usr/lib/jvm/java-6-openjdk')
205
- then
206
- ENV['JAVA_HOME'] = local_java
207
- end
126
+ ENV['JAVA_HOME'] ||= [
127
+ '/usr/local/java/jdk',
128
+ '/usr/lib/jvm/java-6-openjdk',
129
+ '/Library/Java/Home',
130
+ ].find { |c| File.directory?(c) }
208
131
  if ENV['JAVA_HOME']
209
132
  warn " *** JAVA_HOME is set to #{ENV['JAVA_HOME'].inspect}"
210
133
  ENV['PATH'] = ENV['PATH'].split(/:/).unshift(java_path = "#{ENV['JAVA_HOME']}/bin") * ':'
@@ -238,7 +161,7 @@ if defined?(RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
238
161
  classpath = (Dir['java/lib/*.jar'] << 'java/src' << JRUBY_JAR) * ':'
239
162
  obj = src.sub(/\.java\Z/, '.class')
240
163
  file obj => src do
241
- sh 'javac', '-classpath', classpath, '-source', '1.5', '-target', '1.5', src
164
+ sh 'javac', '-classpath', classpath, '-source', '1.6', '-target', '1.6', src
242
165
  end
243
166
  JAVA_CLASSES << obj
244
167
  end
@@ -257,12 +180,13 @@ if defined?(RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
257
180
  end
258
181
 
259
182
  desc "Testing library (jruby)"
260
- task :test_ext => [ :create_jar, :do_test_ext ]
183
+ task :test_ext => [ :set_env_ext, :create_jar, :check_env, :do_test_ext ]
184
+ task(:set_env_ext) { ENV['JSON'] = 'ext' }
261
185
 
262
186
  UndocumentedTestTask.new do |t|
263
187
  t.name = 'do_test_ext'
264
- t.libs << 'lib'
265
- t.test_files = FileList['tests/test_*.rb']
188
+ t.libs << 'lib' << 'tests'
189
+ t.test_files = FileList['tests/*_test.rb']
266
190
  t.verbose = true
267
191
  t.options = '-v'
268
192
  end
@@ -331,21 +255,16 @@ else
331
255
  end
332
256
 
333
257
  desc "Testing library (extension)"
334
- task :test_ext => [ :compile, :do_test_ext ]
258
+ task :test_ext => [ :check_env, :compile, :do_test_ext ]
335
259
 
336
260
  UndocumentedTestTask.new do |t|
337
261
  t.name = 'do_test_ext'
338
- t.libs << 'ext' << 'lib'
339
- t.test_files = FileList['tests/test_*.rb']
262
+ t.libs << 'ext' << 'lib' << 'tests'
263
+ t.test_files = FileList['tests/*_test.rb']
340
264
  t.verbose = true
341
265
  t.options = '-v'
342
266
  end
343
267
 
344
- desc "Create RDOC documentation"
345
- task :doc => [ :version, EXT_PARSER_SRC ] do
346
- sh "sdoc -o doc -t '#{PKG_TITLE}' -m README.rdoc README.rdoc lib/json.rb #{FileList['lib/json/**/*.rb']} #{EXT_PARSER_SRC} #{EXT_GENERATOR_SRC}"
347
- end
348
-
349
268
  desc "Generate parser with ragel"
350
269
  task :ragel => EXT_PARSER_SRC
351
270
 
@@ -367,6 +286,9 @@ else
367
286
  sh "ragel -x parser.rl | #{RAGEL_CODEGEN} -G2"
368
287
  end
369
288
  src = File.read("parser.c").gsub(/[ \t]+$/, '')
289
+ src.gsub!(/^static const int (JSON_.*=.*);$/, 'enum {\1};')
290
+ src.gsub!(/0 <= \(\*p\) && \(\*p\) <= 31/, "0 <= (signed char)(*p) && (*p) <= 31")
291
+ src[0, 0] = "/* This file is automatically generated from parser.rl by using ragel */"
370
292
  File.open("parser.c", "w") {|f| f.print src}
371
293
  end
372
294
  end
@@ -409,4 +331,4 @@ else
409
331
  end
410
332
 
411
333
  desc "Compile in the the source directory"
412
- task :default => [ :clean, :gemspec, :test ]
334
+ task :default => [ :clean, :test ]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.8.3
1
+ 2.4.0
@@ -12,9 +12,6 @@
12
12
  #define RFLOAT_VALUE(val) (RFLOAT(val)->value)
13
13
  #endif
14
14
 
15
- #ifndef RARRAY_PTR
16
- #define RARRAY_PTR(ARRAY) RARRAY(ARRAY)->ptr
17
- #endif
18
15
  #ifndef RARRAY_LEN
19
16
  #define RARRAY_LEN(ARRAY) RARRAY(ARRAY)->len
20
17
  #endif