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.

Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -0
  3. data/.travis.yml +10 -12
  4. data/CHANGES +23 -0
  5. data/Gemfile +1 -5
  6. data/{README.rdoc → README.md} +34 -47
  7. data/Rakefile +10 -20
  8. data/VERSION +1 -1
  9. data/ext/json/ext/fbuffer/fbuffer.h +10 -1
  10. data/ext/json/ext/generator/extconf.rb +0 -10
  11. data/ext/json/ext/generator/generator.c +85 -28
  12. data/ext/json/ext/generator/generator.h +34 -5
  13. data/ext/json/ext/parser/extconf.rb +0 -10
  14. data/ext/json/ext/parser/parser.c +166 -130
  15. data/ext/json/ext/parser/parser.h +19 -4
  16. data/ext/json/ext/parser/parser.rl +84 -48
  17. data/ext/json/extconf.rb +3 -0
  18. data/java/src/json/ext/ByteListTranscoder.java +1 -2
  19. data/java/src/json/ext/Generator.java +9 -7
  20. data/java/src/json/ext/GeneratorMethods.java +1 -2
  21. data/java/src/json/ext/GeneratorService.java +1 -2
  22. data/java/src/json/ext/GeneratorState.java +1 -2
  23. data/java/src/json/ext/OptionsReader.java +1 -2
  24. data/java/src/json/ext/Parser.java +87 -87
  25. data/java/src/json/ext/Parser.rl +7 -7
  26. data/java/src/json/ext/ParserService.java +1 -2
  27. data/java/src/json/ext/RuntimeInfo.java +1 -2
  28. data/java/src/json/ext/StringDecoder.java +1 -2
  29. data/java/src/json/ext/StringEncoder.java +5 -0
  30. data/java/src/json/ext/Utils.java +1 -2
  31. data/json-java.gemspec +16 -1
  32. data/json.gemspec +0 -0
  33. data/json_pure.gemspec +23 -26
  34. data/lib/json/add/complex.rb +7 -1
  35. data/lib/json/add/rational.rb +5 -0
  36. data/lib/json/add/time.rb +1 -1
  37. data/lib/json/common.rb +5 -5
  38. data/lib/json/pure/generator.rb +10 -2
  39. data/lib/json/version.rb +1 -1
  40. data/tests/test_json.rb +8 -34
  41. data/tests/test_json_generate.rb +34 -8
  42. data/tools/diff.sh +18 -0
  43. metadata +39 -39
  44. data/COPYING +0 -58
  45. data/COPYING-json-jruby +0 -57
  46. data/GPL +0 -340
@@ -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 and GPLv2 licenses; see COPYING and GPL files
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 matchin class and <code>create_id</code> was found. This option
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 and GPLv2 licenses; see COPYING and GPL files
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 and GPLv2 licenses; see COPYING and GPL files
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 and GPLv2 licenses; see COPYING and GPL files
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,3 +1,8 @@
1
+ /*
2
+ * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
3
+ *
4
+ * Distributed under the Ruby license: https://www.ruby-lang.org/en/about/license.txt
5
+ */
1
6
  package json.ext;
2
7
 
3
8
  import org.jruby.exceptions.RaiseException;
@@ -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 and GPLv2 licenses; see COPYING and GPL files
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.license = "Ruby"
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.1 ruby lib
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.1"
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.authors = ["Florian Frank"]
10
- s.date = "2013-10-17"
11
- s.description = "This is a JSON implementation in pure Ruby."
12
- s.email = "flori@ping.de"
13
- s.extra_rdoc_files = ["README.rdoc"]
14
- s.files = [".gitignore", ".travis.yml", "CHANGES", "COPYING", "COPYING-json-jruby", "GPL", "Gemfile", "README-json-jruby.markdown", "README.rdoc", "Rakefile", "TODO", "VERSION", "data/example.json", "data/index.html", "data/prototype.js", "diagrams/.keep", "ext/json/ext/fbuffer/fbuffer.h", "ext/json/ext/generator/depend", "ext/json/ext/generator/extconf.rb", "ext/json/ext/generator/generator.c", "ext/json/ext/generator/generator.h", "ext/json/ext/parser/depend", "ext/json/ext/parser/extconf.rb", "ext/json/ext/parser/parser.c", "ext/json/ext/parser/parser.h", "ext/json/ext/parser/parser.rl", "install.rb", "java/src/json/ext/ByteListTranscoder.java", "java/src/json/ext/Generator.java", "java/src/json/ext/GeneratorMethods.java", "java/src/json/ext/GeneratorService.java", "java/src/json/ext/GeneratorState.java", "java/src/json/ext/OptionsReader.java", "java/src/json/ext/Parser.java", "java/src/json/ext/Parser.rl", "java/src/json/ext/ParserService.java", "java/src/json/ext/RuntimeInfo.java", "java/src/json/ext/StringDecoder.java", "java/src/json/ext/StringEncoder.java", "java/src/json/ext/Utils.java", "json-java.gemspec", "json.gemspec", "json_pure.gemspec", "lib/json.rb", "lib/json/add/bigdecimal.rb", "lib/json/add/complex.rb", "lib/json/add/core.rb", "lib/json/add/date.rb", "lib/json/add/date_time.rb", "lib/json/add/exception.rb", "lib/json/add/ostruct.rb", "lib/json/add/range.rb", "lib/json/add/rational.rb", "lib/json/add/regexp.rb", "lib/json/add/struct.rb", "lib/json/add/symbol.rb", "lib/json/add/time.rb", "lib/json/common.rb", "lib/json/ext.rb", "lib/json/ext/.keep", "lib/json/generic_object.rb", "lib/json/pure.rb", "lib/json/pure/generator.rb", "lib/json/pure/parser.rb", "lib/json/version.rb", "tests/fixtures/fail1.json", "tests/fixtures/fail10.json", "tests/fixtures/fail11.json", "tests/fixtures/fail12.json", "tests/fixtures/fail13.json", "tests/fixtures/fail14.json", "tests/fixtures/fail18.json", "tests/fixtures/fail19.json", "tests/fixtures/fail2.json", "tests/fixtures/fail20.json", "tests/fixtures/fail21.json", "tests/fixtures/fail22.json", "tests/fixtures/fail23.json", "tests/fixtures/fail24.json", "tests/fixtures/fail25.json", "tests/fixtures/fail27.json", "tests/fixtures/fail28.json", "tests/fixtures/fail3.json", "tests/fixtures/fail4.json", "tests/fixtures/fail5.json", "tests/fixtures/fail6.json", "tests/fixtures/fail7.json", "tests/fixtures/fail8.json", "tests/fixtures/fail9.json", "tests/fixtures/pass1.json", "tests/fixtures/pass15.json", "tests/fixtures/pass16.json", "tests/fixtures/pass17.json", "tests/fixtures/pass2.json", "tests/fixtures/pass26.json", "tests/fixtures/pass3.json", "tests/setup_variant.rb", "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", "tools/fuzz.rb", "tools/server.rb", "./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"]
15
- s.homepage = "http://flori.github.com/json"
16
- s.licenses = ["Ruby"]
17
- s.rdoc_options = ["--title", "JSON implemention for ruby", "--main", "README.rdoc"]
18
- s.require_paths = ["lib"]
19
- s.rubygems_version = "2.1.9"
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<permutation>, [">= 0"])
28
- s.add_development_dependency(%q<sdoc>, ["~> 0.3.16"]) if RUBY_VERSION > "1.8.6"
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<permutation>, [">= 0"])
32
- s.add_dependency(%q<sdoc>, ["~> 0.3.16"]) if RUBY_VERSION > "1.8.6"
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<permutation>, [">= 0"])
37
- s.add_dependency(%q<sdoc>, ["~> 0.3.16"]) if RUBY_VERSION > "1.8.6"
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
@@ -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
@@ -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 instance_methods.include?(:tv_nsec)
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 true.
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 true.
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
- limit and opts.update(:max_nesting => limit)
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
- # Shortuct for iconv.
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
- # Ouputs _objs_ to STDOUT as JSON strings in a pretty format, with
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|
@@ -363,7 +363,11 @@ module JSON
363
363
  result << state.space_before
364
364
  result << ':'
365
365
  result << state.space
366
- result << value.to_json(state)
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
- result << value.to_json(state)
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
@@ -1,6 +1,6 @@
1
1
  module JSON
2
2
  # JSON version
3
- VERSION = '1.8.1'
3
+ VERSION = '1.8.6'
4
4
  VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
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]
@@ -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
- bignum_too_long_to_embed_as_string = 1234567890123456789012345
219
- expect = bignum_too_long_to_embed_as_string.to_s
220
- stress, GC.stress = GC.stress, true
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
- 10.times do |i|
223
- tmp = bignum_too_long_to_embed_as_string.to_json
224
- assert_equal expect, tmp
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