json 2.3.1 → 2.6.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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +38 -5
  3. data/LICENSE +56 -0
  4. data/README.md +3 -3
  5. data/VERSION +1 -1
  6. data/ext/json/ext/generator/generator.c +61 -22
  7. data/ext/json/ext/generator/generator.h +5 -2
  8. data/ext/json/ext/parser/extconf.rb +26 -0
  9. data/ext/json/ext/parser/parser.c +2980 -1770
  10. data/ext/json/ext/parser/parser.h +6 -1
  11. data/ext/json/ext/parser/parser.rl +127 -38
  12. data/ext/json/extconf.rb +1 -0
  13. data/json.gemspec +8 -80
  14. data/lib/json/add/complex.rb +0 -1
  15. data/lib/json/add/rational.rb +0 -1
  16. data/lib/json/common.rb +240 -228
  17. data/lib/json/pure/generator.rb +28 -8
  18. data/lib/json/pure/parser.rb +21 -3
  19. data/lib/json/version.rb +1 -1
  20. data/lib/json.rb +172 -1
  21. metadata +8 -110
  22. data/.gitignore +0 -18
  23. data/.travis.yml +0 -26
  24. data/Gemfile +0 -14
  25. data/README-json-jruby.md +0 -33
  26. data/Rakefile +0 -334
  27. data/diagrams/.keep +0 -0
  28. data/install.rb +0 -23
  29. data/java/src/json/ext/ByteListTranscoder.java +0 -166
  30. data/java/src/json/ext/Generator.java +0 -466
  31. data/java/src/json/ext/GeneratorMethods.java +0 -231
  32. data/java/src/json/ext/GeneratorService.java +0 -42
  33. data/java/src/json/ext/GeneratorState.java +0 -490
  34. data/java/src/json/ext/OptionsReader.java +0 -113
  35. data/java/src/json/ext/Parser.java +0 -2362
  36. data/java/src/json/ext/Parser.rl +0 -893
  37. data/java/src/json/ext/ParserService.java +0 -34
  38. data/java/src/json/ext/RuntimeInfo.java +0 -116
  39. data/java/src/json/ext/StringDecoder.java +0 -166
  40. data/java/src/json/ext/StringEncoder.java +0 -111
  41. data/java/src/json/ext/Utils.java +0 -88
  42. data/json-java.gemspec +0 -37
  43. data/json_pure.gemspec +0 -33
  44. data/lib/json/ext/.keep +0 -0
  45. data/references/rfc7159.txt +0 -899
  46. data/tests/fixtures/fail10.json +0 -1
  47. data/tests/fixtures/fail11.json +0 -1
  48. data/tests/fixtures/fail12.json +0 -1
  49. data/tests/fixtures/fail13.json +0 -1
  50. data/tests/fixtures/fail14.json +0 -1
  51. data/tests/fixtures/fail18.json +0 -1
  52. data/tests/fixtures/fail19.json +0 -1
  53. data/tests/fixtures/fail2.json +0 -1
  54. data/tests/fixtures/fail20.json +0 -1
  55. data/tests/fixtures/fail21.json +0 -1
  56. data/tests/fixtures/fail22.json +0 -1
  57. data/tests/fixtures/fail23.json +0 -1
  58. data/tests/fixtures/fail24.json +0 -1
  59. data/tests/fixtures/fail25.json +0 -1
  60. data/tests/fixtures/fail27.json +0 -2
  61. data/tests/fixtures/fail28.json +0 -2
  62. data/tests/fixtures/fail3.json +0 -1
  63. data/tests/fixtures/fail4.json +0 -1
  64. data/tests/fixtures/fail5.json +0 -1
  65. data/tests/fixtures/fail6.json +0 -1
  66. data/tests/fixtures/fail7.json +0 -1
  67. data/tests/fixtures/fail8.json +0 -1
  68. data/tests/fixtures/fail9.json +0 -1
  69. data/tests/fixtures/obsolete_fail1.json +0 -1
  70. data/tests/fixtures/pass1.json +0 -56
  71. data/tests/fixtures/pass15.json +0 -1
  72. data/tests/fixtures/pass16.json +0 -1
  73. data/tests/fixtures/pass17.json +0 -1
  74. data/tests/fixtures/pass2.json +0 -1
  75. data/tests/fixtures/pass26.json +0 -1
  76. data/tests/fixtures/pass3.json +0 -6
  77. data/tests/json_addition_test.rb +0 -203
  78. data/tests/json_common_interface_test.rb +0 -126
  79. data/tests/json_encoding_test.rb +0 -107
  80. data/tests/json_ext_parser_test.rb +0 -15
  81. data/tests/json_fixtures_test.rb +0 -37
  82. data/tests/json_generator_test.rb +0 -421
  83. data/tests/json_generic_object_test.rb +0 -82
  84. data/tests/json_parser_test.rb +0 -472
  85. data/tests/json_string_matching_test.rb +0 -38
  86. data/tests/test_helper.rb +0 -17
  87. data/tools/diff.sh +0 -18
  88. data/tools/fuzz.rb +0 -131
  89. data/tools/server.rb +0 -62
@@ -13,6 +13,10 @@
13
13
  #include "st.h"
14
14
  #endif
15
15
 
16
+ #ifndef MAYBE_UNUSED
17
+ # define MAYBE_UNUSED(x) x
18
+ #endif
19
+
16
20
  #define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key))
17
21
 
18
22
  /* unicode */
@@ -37,6 +41,7 @@ typedef struct JSON_ParserStruct {
37
41
  int allow_nan;
38
42
  int parsing_name;
39
43
  int symbolize_names;
44
+ int freeze;
40
45
  VALUE object_class;
41
46
  VALUE array_class;
42
47
  VALUE decimal_class;
@@ -62,7 +67,7 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul
62
67
  static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result);
63
68
  static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result);
64
69
  static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting);
65
- static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd);
70
+ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int symbolize);
66
71
  static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result);
67
72
  static VALUE convert_encoding(VALUE source);
68
73
  static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self);
@@ -89,13 +89,12 @@ static int convert_UTF32_to_UTF8(char *buf, UTF32 ch)
89
89
 
90
90
  static VALUE mJSON, mExt, cParser, eParserError, eNestingError;
91
91
  static VALUE CNaN, CInfinity, CMinusInfinity;
92
- static VALUE cBigDecimal = Qundef;
93
92
 
94
93
  static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
95
94
  i_chr, i_max_nesting, i_allow_nan, i_symbolize_names,
96
95
  i_object_class, i_array_class, i_decimal_class, i_key_p,
97
96
  i_deep_const_get, i_match, i_match_string, i_aset, i_aref,
98
- i_leftshift, i_new, i_BigDecimal;
97
+ i_leftshift, i_new, i_try_convert, i_freeze, i_uminus;
99
98
 
100
99
  %%{
101
100
  machine JSON_common;
@@ -290,6 +289,10 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul
290
289
  %% write init;
291
290
  %% write exec;
292
291
 
292
+ if (json->freeze) {
293
+ OBJ_FREEZE(*result);
294
+ }
295
+
293
296
  if (cs >= JSON_value_first_final) {
294
297
  return p;
295
298
  } else {
@@ -341,19 +344,6 @@ static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *res
341
344
  ) (^[0-9Ee.\-]? @exit );
342
345
  }%%
343
346
 
344
- static int is_bigdecimal_class(VALUE obj)
345
- {
346
- if (cBigDecimal == Qundef) {
347
- if (rb_const_defined(rb_cObject, i_BigDecimal)) {
348
- cBigDecimal = rb_const_get_at(rb_cObject, i_BigDecimal);
349
- }
350
- else {
351
- return 0;
352
- }
353
- }
354
- return obj == cBigDecimal;
355
- }
356
-
357
347
  static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
358
348
  {
359
349
  int cs = EVIL;
@@ -363,21 +353,46 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
363
353
  %% write exec;
364
354
 
365
355
  if (cs >= JSON_float_first_final) {
356
+ VALUE mod = Qnil;
357
+ ID method_id = 0;
358
+ if (rb_respond_to(json->decimal_class, i_try_convert)) {
359
+ mod = json->decimal_class;
360
+ method_id = i_try_convert;
361
+ } else if (rb_respond_to(json->decimal_class, i_new)) {
362
+ mod = json->decimal_class;
363
+ method_id = i_new;
364
+ } else if (RB_TYPE_P(json->decimal_class, T_CLASS)) {
365
+ VALUE name = rb_class_name(json->decimal_class);
366
+ const char *name_cstr = RSTRING_PTR(name);
367
+ const char *last_colon = strrchr(name_cstr, ':');
368
+ if (last_colon) {
369
+ const char *mod_path_end = last_colon - 1;
370
+ VALUE mod_path = rb_str_substr(name, 0, mod_path_end - name_cstr);
371
+ mod = rb_path_to_class(mod_path);
372
+
373
+ const char *method_name_beg = last_colon + 1;
374
+ long before_len = method_name_beg - name_cstr;
375
+ long len = RSTRING_LEN(name) - before_len;
376
+ VALUE method_name = rb_str_substr(name, before_len, len);
377
+ method_id = SYM2ID(rb_str_intern(method_name));
378
+ } else {
379
+ mod = rb_mKernel;
380
+ method_id = SYM2ID(rb_str_intern(name));
381
+ }
382
+ }
383
+
366
384
  long len = p - json->memo;
367
385
  fbuffer_clear(json->fbuffer);
368
386
  fbuffer_append(json->fbuffer, json->memo, len);
369
387
  fbuffer_append_char(json->fbuffer, '\0');
370
- if (NIL_P(json->decimal_class)) {
371
- *result = rb_float_new(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
388
+
389
+ if (method_id) {
390
+ VALUE text = rb_str_new2(FBUFFER_PTR(json->fbuffer));
391
+ *result = rb_funcallv(mod, method_id, 1, &text);
372
392
  } else {
373
- VALUE text;
374
- text = rb_str_new2(FBUFFER_PTR(json->fbuffer));
375
- if (is_bigdecimal_class(json->decimal_class)) {
376
- *result = rb_funcall(Qnil, i_BigDecimal, 1, text);
377
- } else {
378
- *result = rb_funcall(json->decimal_class, i_new, 1, text);
379
- }
393
+ *result = DBL2NUM(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
380
394
  }
395
+
381
396
  return p + 1;
382
397
  } else {
383
398
  return NULL;
@@ -437,17 +452,37 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul
437
452
  }
438
453
  }
439
454
 
440
- static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
455
+ static const size_t MAX_STACK_BUFFER_SIZE = 128;
456
+ static VALUE json_string_unescape(char *string, char *stringEnd, int intern, int symbolize)
441
457
  {
442
- char *p = string, *pe = string, *unescape;
458
+ VALUE result = Qnil;
459
+ size_t bufferSize = stringEnd - string;
460
+ char *p = string, *pe = string, *unescape, *bufferStart, *buffer;
443
461
  int unescape_len;
444
462
  char buf[4];
445
463
 
464
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
465
+ # ifdef HAVE_RB_ENC_INTERNED_STR
466
+ bufferStart = buffer = ALLOC_N(char, bufferSize ? bufferSize : 1);
467
+ # else
468
+ bufferStart = buffer = ALLOC_N(char, bufferSize);
469
+ # endif
470
+ } else {
471
+ # ifdef HAVE_RB_ENC_INTERNED_STR
472
+ bufferStart = buffer = ALLOCA_N(char, bufferSize ? bufferSize : 1);
473
+ # else
474
+ bufferStart = buffer = ALLOCA_N(char, bufferSize);
475
+ # endif
476
+ }
477
+
446
478
  while (pe < stringEnd) {
447
479
  if (*pe == '\\') {
448
480
  unescape = (char *) "?";
449
481
  unescape_len = 1;
450
- if (pe > p) rb_str_buf_cat(result, p, pe - p);
482
+ if (pe > p) {
483
+ MEMCPY(buffer, p, char, pe - p);
484
+ buffer += pe - p;
485
+ }
451
486
  switch (*++pe) {
452
487
  case 'n':
453
488
  unescape = (char *) "\n";
@@ -472,6 +507,9 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
472
507
  break;
473
508
  case 'u':
474
509
  if (pe > stringEnd - 4) {
510
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
511
+ free(bufferStart);
512
+ }
475
513
  rb_enc_raise(
476
514
  EXC_ENCODING eParserError,
477
515
  "%u: incomplete unicode character escape sequence at '%s'", __LINE__, p
@@ -482,6 +520,9 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
482
520
  if (UNI_SUR_HIGH_START == (ch & 0xFC00)) {
483
521
  pe++;
484
522
  if (pe > stringEnd - 6) {
523
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
524
+ free(bufferStart);
525
+ }
485
526
  rb_enc_raise(
486
527
  EXC_ENCODING eParserError,
487
528
  "%u: incomplete surrogate pair at '%s'", __LINE__, p
@@ -505,13 +546,55 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
505
546
  p = pe;
506
547
  continue;
507
548
  }
508
- rb_str_buf_cat(result, unescape, unescape_len);
549
+ MEMCPY(buffer, unescape, char, unescape_len);
550
+ buffer += unescape_len;
509
551
  p = ++pe;
510
552
  } else {
511
553
  pe++;
512
554
  }
513
555
  }
514
- rb_str_buf_cat(result, p, pe - p);
556
+
557
+ if (pe > p) {
558
+ MEMCPY(buffer, p, char, pe - p);
559
+ buffer += pe - p;
560
+ }
561
+
562
+ # ifdef HAVE_RB_ENC_INTERNED_STR
563
+ if (intern) {
564
+ result = rb_enc_interned_str(bufferStart, (long)(buffer - bufferStart), rb_utf8_encoding());
565
+ } else {
566
+ result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart));
567
+ }
568
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
569
+ free(bufferStart);
570
+ }
571
+ # else
572
+ result = rb_utf8_str_new(bufferStart, (long)(buffer - bufferStart));
573
+
574
+ if (bufferSize > MAX_STACK_BUFFER_SIZE) {
575
+ free(bufferStart);
576
+ }
577
+
578
+ if (intern) {
579
+ # if STR_UMINUS_DEDUPE_FROZEN
580
+ // Starting from MRI 2.8 it is preferable to freeze the string
581
+ // before deduplication so that it can be interned directly
582
+ // otherwise it would be duplicated first which is wasteful.
583
+ result = rb_funcall(rb_str_freeze(result), i_uminus, 0);
584
+ # elif STR_UMINUS_DEDUPE
585
+ // MRI 2.5 and older do not deduplicate strings that are already
586
+ // frozen.
587
+ result = rb_funcall(result, i_uminus, 0);
588
+ # else
589
+ result = rb_str_freeze(result);
590
+ # endif
591
+ }
592
+ # endif
593
+
594
+ if (symbolize) {
595
+ result = rb_str_intern(result);
596
+ }
597
+
515
598
  return result;
516
599
  }
517
600
 
@@ -522,12 +605,11 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
522
605
  write data;
523
606
 
524
607
  action parse_string {
525
- *result = json_string_unescape(*result, json->memo + 1, p);
608
+ *result = json_string_unescape(json->memo + 1, p, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
526
609
  if (NIL_P(*result)) {
527
610
  fhold;
528
611
  fbreak;
529
612
  } else {
530
- FORCE_UTF8(*result);
531
613
  fexec p + 1;
532
614
  }
533
615
  }
@@ -554,7 +636,6 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
554
636
  int cs = EVIL;
555
637
  VALUE match_string;
556
638
 
557
- *result = rb_str_buf_new(0);
558
639
  %% write init;
559
640
  json->memo = p;
560
641
  %% write exec;
@@ -570,11 +651,6 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
570
651
  }
571
652
  }
572
653
 
573
- if (json->symbolize_names && json->parsing_name) {
574
- *result = rb_str_intern(*result);
575
- } else if (RB_TYPE_P(*result, T_STRING)) {
576
- rb_str_resize(*result, RSTRING_LEN(*result));
577
- }
578
654
  if (cs >= JSON_string_first_final) {
579
655
  return p + 1;
580
656
  } else {
@@ -681,6 +757,12 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
681
757
  } else {
682
758
  json->symbolize_names = 0;
683
759
  }
760
+ tmp = ID2SYM(i_freeze);
761
+ if (option_given_p(opts, tmp)) {
762
+ json->freeze = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0;
763
+ } else {
764
+ json->freeze = 0;
765
+ }
684
766
  tmp = ID2SYM(i_create_additions);
685
767
  if (option_given_p(opts, tmp)) {
686
768
  json->create_additions = RTEST(rb_hash_aref(opts, tmp));
@@ -765,6 +847,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
765
847
  *
766
848
  * Parses the current JSON text _source_ and returns the complete data
767
849
  * structure as a result.
850
+ * It raises JSON::ParseError if fail to parse.
768
851
  */
769
852
  static VALUE cParser_parse(VALUE self)
770
853
  {
@@ -843,6 +926,10 @@ static VALUE cParser_source(VALUE self)
843
926
 
844
927
  void Init_parser(void)
845
928
  {
929
+ #ifdef HAVE_RB_EXT_RACTOR_SAFE
930
+ rb_ext_ractor_safe(true);
931
+ #endif
932
+
846
933
  #undef rb_intern
847
934
  rb_require("json/common");
848
935
  mJSON = rb_define_module("JSON");
@@ -885,7 +972,9 @@ void Init_parser(void)
885
972
  i_aref = rb_intern("[]");
886
973
  i_leftshift = rb_intern("<<");
887
974
  i_new = rb_intern("new");
888
- i_BigDecimal = rb_intern("BigDecimal");
975
+ i_try_convert = rb_intern("try_convert");
976
+ i_freeze = rb_intern("freeze");
977
+ i_uminus = rb_intern("-@");
889
978
  }
890
979
 
891
980
  /*
data/ext/json/extconf.rb CHANGED
@@ -1,2 +1,3 @@
1
1
  require 'mkmf'
2
+
2
3
  create_makefile('json')
data/json.gemspec CHANGED
@@ -2,25 +2,22 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "json"
5
- s.version = File.read('VERSION').chomp
5
+ s.version = File.read(File.expand_path('../VERSION', __FILE__)).chomp
6
6
 
7
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
- s.require_paths = ["lib"]
9
- s.authors = ["Florian Frank"]
7
+ s.summary = "JSON Implementation for Ruby"
10
8
  s.description = "This is a JSON implementation as a Ruby extension in C."
9
+ s.licenses = ["Ruby"]
10
+ s.authors = ["Florian Frank"]
11
11
  s.email = "flori@ping.de"
12
+
12
13
  s.extensions = ["ext/json/ext/generator/extconf.rb", "ext/json/ext/parser/extconf.rb", "ext/json/extconf.rb"]
13
14
  s.extra_rdoc_files = ["README.md"]
15
+ s.rdoc_options = ["--title", "JSON implementation for Ruby", "--main", "README.md"]
14
16
  s.files = [
15
- ".gitignore",
16
- ".travis.yml",
17
17
  "CHANGES.md",
18
- "Gemfile",
19
- "README-json-jruby.md",
18
+ "LICENSE",
20
19
  "README.md",
21
- "Rakefile",
22
20
  "VERSION",
23
- "diagrams/.keep",
24
21
  "ext/json/ext/fbuffer/fbuffer.h",
25
22
  "ext/json/ext/generator/depend",
26
23
  "ext/json/ext/generator/extconf.rb",
@@ -32,23 +29,7 @@ Gem::Specification.new do |s|
32
29
  "ext/json/ext/parser/parser.h",
33
30
  "ext/json/ext/parser/parser.rl",
34
31
  "ext/json/extconf.rb",
35
- "install.rb",
36
- "java/src/json/ext/ByteListTranscoder.java",
37
- "java/src/json/ext/Generator.java",
38
- "java/src/json/ext/GeneratorMethods.java",
39
- "java/src/json/ext/GeneratorService.java",
40
- "java/src/json/ext/GeneratorState.java",
41
- "java/src/json/ext/OptionsReader.java",
42
- "java/src/json/ext/Parser.java",
43
- "java/src/json/ext/Parser.rl",
44
- "java/src/json/ext/ParserService.java",
45
- "java/src/json/ext/RuntimeInfo.java",
46
- "java/src/json/ext/StringDecoder.java",
47
- "java/src/json/ext/StringEncoder.java",
48
- "java/src/json/ext/Utils.java",
49
- "json-java.gemspec",
50
32
  "json.gemspec",
51
- "json_pure.gemspec",
52
33
  "lib/json.rb",
53
34
  "lib/json/add/bigdecimal.rb",
54
35
  "lib/json/add/complex.rb",
@@ -66,58 +47,11 @@ Gem::Specification.new do |s|
66
47
  "lib/json/add/time.rb",
67
48
  "lib/json/common.rb",
68
49
  "lib/json/ext.rb",
69
- "lib/json/ext/.keep",
70
50
  "lib/json/generic_object.rb",
71
51
  "lib/json/pure.rb",
72
52
  "lib/json/pure/generator.rb",
73
53
  "lib/json/pure/parser.rb",
74
54
  "lib/json/version.rb",
75
- "references/rfc7159.txt",
76
- "tests/fixtures/fail10.json",
77
- "tests/fixtures/fail11.json",
78
- "tests/fixtures/fail12.json",
79
- "tests/fixtures/fail13.json",
80
- "tests/fixtures/fail14.json",
81
- "tests/fixtures/fail18.json",
82
- "tests/fixtures/fail19.json",
83
- "tests/fixtures/fail2.json",
84
- "tests/fixtures/fail20.json",
85
- "tests/fixtures/fail21.json",
86
- "tests/fixtures/fail22.json",
87
- "tests/fixtures/fail23.json",
88
- "tests/fixtures/fail24.json",
89
- "tests/fixtures/fail25.json",
90
- "tests/fixtures/fail27.json",
91
- "tests/fixtures/fail28.json",
92
- "tests/fixtures/fail3.json",
93
- "tests/fixtures/fail4.json",
94
- "tests/fixtures/fail5.json",
95
- "tests/fixtures/fail6.json",
96
- "tests/fixtures/fail7.json",
97
- "tests/fixtures/fail8.json",
98
- "tests/fixtures/fail9.json",
99
- "tests/fixtures/obsolete_fail1.json",
100
- "tests/fixtures/pass1.json",
101
- "tests/fixtures/pass15.json",
102
- "tests/fixtures/pass16.json",
103
- "tests/fixtures/pass17.json",
104
- "tests/fixtures/pass2.json",
105
- "tests/fixtures/pass26.json",
106
- "tests/fixtures/pass3.json",
107
- "tests/json_addition_test.rb",
108
- "tests/json_common_interface_test.rb",
109
- "tests/json_encoding_test.rb",
110
- "tests/json_ext_parser_test.rb",
111
- "tests/json_fixtures_test.rb",
112
- "tests/json_generator_test.rb",
113
- "tests/json_generic_object_test.rb",
114
- "tests/json_parser_test.rb",
115
- "tests/json_string_matching_test.rb",
116
- "tests/test_helper.rb",
117
- "tests/test_helper.rb",
118
- "tools/diff.sh",
119
- "tools/fuzz.rb",
120
- "tools/server.rb",
121
55
  ]
122
56
  s.homepage = "http://flori.github.com/json"
123
57
  s.metadata = {
@@ -128,12 +62,6 @@ Gem::Specification.new do |s|
128
62
  'source_code_uri' => 'https://github.com/flori/json',
129
63
  'wiki_uri' => 'https://github.com/flori/json/wiki'
130
64
  }
131
- s.licenses = ["Ruby"]
132
- s.rdoc_options = ["--title", "JSON implemention for Ruby", "--main", "README.md"]
133
- s.required_ruby_version = Gem::Requirement.new(">= 2.0")
134
- s.summary = "JSON Implementation for Ruby"
135
- s.test_files = ["tests/test_helper.rb"]
136
65
 
137
- s.add_development_dependency("rake", [">= 0"])
138
- s.add_development_dependency("test-unit", [">= 2.0", "< 4.0"])
66
+ s.required_ruby_version = Gem::Requirement.new(">= 2.3")
139
67
  end
@@ -2,7 +2,6 @@
2
2
  unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
3
3
  require 'json'
4
4
  end
5
- defined?(::Complex) or require 'complex'
6
5
 
7
6
  class Complex
8
7
 
@@ -2,7 +2,6 @@
2
2
  unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
3
3
  require 'json'
4
4
  end
5
- defined?(::Rational) or require 'rational'
6
5
 
7
6
  class Rational
8
7
  # Deserializes JSON string by converting numerator value <tt>n</tt>,