oj 3.16.6 → 3.17.3

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 (130) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +81 -0
  3. data/README.md +0 -16
  4. data/ext/oj/compat.c +3 -3
  5. data/ext/oj/custom.c +17 -11
  6. data/ext/oj/dump.c +592 -81
  7. data/ext/oj/dump.h +9 -2
  8. data/ext/oj/dump_compat.c +15 -9
  9. data/ext/oj/dump_leaf.c +1 -1
  10. data/ext/oj/dump_object.c +32 -17
  11. data/ext/oj/dump_strict.c +20 -14
  12. data/ext/oj/extconf.rb +10 -7
  13. data/ext/oj/fast.c +40 -23
  14. data/ext/oj/intern.c +1 -1
  15. data/ext/oj/mimic_json.c +11 -7
  16. data/ext/oj/object.c +8 -8
  17. data/ext/oj/oj.c +256 -10
  18. data/ext/oj/oj.h +55 -52
  19. data/ext/oj/parse.c +243 -46
  20. data/ext/oj/parser.c +113 -37
  21. data/ext/oj/parser.h +2 -0
  22. data/ext/oj/rails.c +41 -36
  23. data/ext/oj/rxclass.c +1 -1
  24. data/ext/oj/rxclass.h +1 -1
  25. data/ext/oj/safe.c +230 -0
  26. data/ext/oj/safe.h +79 -0
  27. data/ext/oj/saj.c +13 -8
  28. data/ext/oj/scp.c +3 -6
  29. data/ext/oj/simd.h +219 -0
  30. data/ext/oj/sparse.c +6 -3
  31. data/ext/oj/stream_writer.c +3 -13
  32. data/ext/oj/strict.c +2 -4
  33. data/ext/oj/string_writer.c +5 -7
  34. data/ext/oj/usual.c +20 -7
  35. data/ext/oj/wab.c +5 -4
  36. data/lib/oj/version.rb +1 -1
  37. data/pages/Encoding.md +1 -1
  38. metadata +22 -114
  39. data/test/_test_active.rb +0 -75
  40. data/test/_test_active_mimic.rb +0 -95
  41. data/test/_test_mimic_rails.rb +0 -123
  42. data/test/activerecord/result_test.rb +0 -31
  43. data/test/activesupport6/abstract_unit.rb +0 -44
  44. data/test/activesupport6/decoding_test.rb +0 -133
  45. data/test/activesupport6/encoding_test.rb +0 -542
  46. data/test/activesupport6/encoding_test_cases.rb +0 -98
  47. data/test/activesupport6/test_common.rb +0 -17
  48. data/test/activesupport6/test_helper.rb +0 -163
  49. data/test/activesupport6/time_zone_test_helpers.rb +0 -39
  50. data/test/activesupport7/abstract_unit.rb +0 -52
  51. data/test/activesupport7/decoding_test.rb +0 -125
  52. data/test/activesupport7/encoding_test.rb +0 -536
  53. data/test/activesupport7/encoding_test_cases.rb +0 -104
  54. data/test/activesupport7/time_zone_test_helpers.rb +0 -47
  55. data/test/files.rb +0 -29
  56. data/test/foo.rb +0 -26
  57. data/test/helper.rb +0 -39
  58. data/test/isolated/shared.rb +0 -309
  59. data/test/isolated/test_mimic_after.rb +0 -13
  60. data/test/isolated/test_mimic_alone.rb +0 -12
  61. data/test/isolated/test_mimic_as_json.rb +0 -45
  62. data/test/isolated/test_mimic_before.rb +0 -13
  63. data/test/isolated/test_mimic_define.rb +0 -28
  64. data/test/isolated/test_mimic_rails_after.rb +0 -22
  65. data/test/isolated/test_mimic_rails_before.rb +0 -21
  66. data/test/isolated/test_mimic_redefine.rb +0 -15
  67. data/test/json_gem/json_addition_test.rb +0 -216
  68. data/test/json_gem/json_common_interface_test.rb +0 -155
  69. data/test/json_gem/json_encoding_test.rb +0 -107
  70. data/test/json_gem/json_ext_parser_test.rb +0 -21
  71. data/test/json_gem/json_fixtures_test.rb +0 -36
  72. data/test/json_gem/json_generator_test.rb +0 -413
  73. data/test/json_gem/json_generic_object_test.rb +0 -90
  74. data/test/json_gem/json_parser_test.rb +0 -477
  75. data/test/json_gem/json_string_matching_test.rb +0 -42
  76. data/test/json_gem/test_helper.rb +0 -30
  77. data/test/mem.rb +0 -34
  78. data/test/perf.rb +0 -102
  79. data/test/perf_compat.rb +0 -128
  80. data/test/perf_dump.rb +0 -50
  81. data/test/perf_fast.rb +0 -162
  82. data/test/perf_file.rb +0 -62
  83. data/test/perf_object.rb +0 -134
  84. data/test/perf_once.rb +0 -59
  85. data/test/perf_parser.rb +0 -183
  86. data/test/perf_saj.rb +0 -101
  87. data/test/perf_scp.rb +0 -140
  88. data/test/perf_simple.rb +0 -289
  89. data/test/perf_strict.rb +0 -137
  90. data/test/perf_wab.rb +0 -129
  91. data/test/prec.rb +0 -23
  92. data/test/sample/change.rb +0 -13
  93. data/test/sample/dir.rb +0 -18
  94. data/test/sample/doc.rb +0 -35
  95. data/test/sample/file.rb +0 -47
  96. data/test/sample/group.rb +0 -15
  97. data/test/sample/hasprops.rb +0 -15
  98. data/test/sample/layer.rb +0 -11
  99. data/test/sample/line.rb +0 -20
  100. data/test/sample/oval.rb +0 -10
  101. data/test/sample/rect.rb +0 -9
  102. data/test/sample/shape.rb +0 -34
  103. data/test/sample/text.rb +0 -19
  104. data/test/sample.rb +0 -54
  105. data/test/sample_json.rb +0 -37
  106. data/test/test_compat.rb +0 -567
  107. data/test/test_custom.rb +0 -555
  108. data/test/test_debian.rb +0 -50
  109. data/test/test_fast.rb +0 -526
  110. data/test/test_file.rb +0 -250
  111. data/test/test_gc.rb +0 -60
  112. data/test/test_generate.rb +0 -21
  113. data/test/test_hash.rb +0 -39
  114. data/test/test_integer_range.rb +0 -72
  115. data/test/test_null.rb +0 -376
  116. data/test/test_object.rb +0 -1030
  117. data/test/test_parser.rb +0 -11
  118. data/test/test_parser_debug.rb +0 -27
  119. data/test/test_parser_saj.rb +0 -337
  120. data/test/test_parser_usual.rb +0 -251
  121. data/test/test_rails.rb +0 -35
  122. data/test/test_saj.rb +0 -188
  123. data/test/test_scp.rb +0 -431
  124. data/test/test_strict.rb +0 -441
  125. data/test/test_various.rb +0 -801
  126. data/test/test_wab.rb +0 -311
  127. data/test/test_writer.rb +0 -380
  128. data/test/tests.rb +0 -33
  129. data/test/tests_mimic.rb +0 -23
  130. data/test/tests_mimic_addition.rb +0 -16
data/ext/oj/strict.c CHANGED
@@ -19,8 +19,7 @@ VALUE oj_cstr_to_value(const char *str, size_t len, size_t cache_str) {
19
19
  if (len < cache_str) {
20
20
  rstr = oj_str_intern(str, len);
21
21
  } else {
22
- rstr = rb_str_new(str, len);
23
- rstr = oj_encode(rstr);
22
+ rstr = rb_utf8_str_new(str, len);
24
23
  }
25
24
  return rstr;
26
25
  }
@@ -35,8 +34,7 @@ VALUE oj_calc_hash_key(ParseInfo pi, Val parent) {
35
34
  if (Yes == pi->options.sym_key) {
36
35
  rkey = ID2SYM(rb_intern3(parent->key, parent->klen, oj_utf8_encoding));
37
36
  } else {
38
- rkey = rb_str_new(parent->key, parent->klen);
39
- rkey = oj_encode(rkey);
37
+ rkey = rb_utf8_str_new(parent->key, parent->klen);
40
38
  OBJ_FREEZE(rkey); // frozen when used as a Hash key anyway
41
39
  }
42
40
  return rkey;
@@ -469,22 +469,20 @@ static VALUE str_writer_reset(VALUE self) {
469
469
  static VALUE str_writer_to_s(VALUE self) {
470
470
  StrWriter sw;
471
471
  TypedData_Get_Struct(self, struct _strWriter, &oj_string_writer_type, sw);
472
- VALUE rstr = rb_str_new(sw->out.buf, sw->out.cur - sw->out.buf);
473
-
474
- return oj_encode(rstr);
472
+ return rb_utf8_str_new(sw->out.buf, sw->out.cur - sw->out.buf);
475
473
  }
476
474
 
477
475
  /* Document-method: as_json
478
- * call-seq: as_json()
476
+ * call-seq: as_json(*)
479
477
  *
480
478
  * Returns the contents of the writer as a JSON element. If called from inside
481
479
  * an array or hash by Oj the raw buffer will be used othersize a more
482
480
  * inefficient parse of the contents and a return of the result is
483
- * completed. The parse uses the strict mode.
481
+ * completed. The parse uses the strict mode. Optional arguments are ignored.
484
482
  *
485
483
  * *return* [_Hash_|_Array_|_String_|_Integer_|_Float_|_True_|_False_|_nil|)
486
484
  */
487
- static VALUE str_writer_as_json(VALUE self) {
485
+ static VALUE str_writer_as_json(int argc, VALUE *argv, VALUE self) {
488
486
  if (string_writer_optimized) {
489
487
  return self;
490
488
  }
@@ -515,5 +513,5 @@ void oj_string_writer_init(void) {
515
513
  rb_define_method(oj_string_writer_class, "reset", str_writer_reset, 0);
516
514
  rb_define_method(oj_string_writer_class, "to_s", str_writer_to_s, 0);
517
515
  rb_define_method(oj_string_writer_class, "raw_json", str_writer_to_s, 0);
518
- rb_define_method(oj_string_writer_class, "as_json", str_writer_as_json, 0);
516
+ rb_define_method(oj_string_writer_class, "as_json", str_writer_as_json, -1);
519
517
  }
data/ext/oj/usual.c CHANGED
@@ -63,7 +63,7 @@ static VALUE form_attr(const char *str, size_t len) {
63
63
  memcpy(b + 1, str, len);
64
64
  b[len + 1] = '\0';
65
65
 
66
- id = rb_intern3(buf, len + 1, oj_utf8_encoding);
66
+ id = rb_intern3(b, len + 1, oj_utf8_encoding);
67
67
  OJ_R_FREE(b);
68
68
  return id;
69
69
  }
@@ -200,7 +200,10 @@ static void push_key(ojParser p) {
200
200
  d->ktail = d->khead + pos;
201
201
  d->kend = d->khead + cap;
202
202
  }
203
- d->ktail->len = klen;
203
+ if (32000 < klen) {
204
+ rb_raise(oj_json_parser_error_class, "Key too long. Keys are limited to 32,000 bytes.");
205
+ }
206
+ d->ktail->len = (int16_t)klen;
204
207
  if (klen < sizeof(d->ktail->buf)) {
205
208
  memcpy(d->ktail->buf, key, klen);
206
209
  d->ktail->buf[klen] = '\0';
@@ -608,12 +611,16 @@ static void dfree(ojParser p) {
608
611
  Usual d = (Usual)p->ctx;
609
612
 
610
613
  cache_free(d->str_cache);
614
+ d->str_cache = NULL;
611
615
  cache_free(d->attr_cache);
616
+ d->attr_cache = NULL;
612
617
  if (NULL != d->sym_cache) {
613
618
  cache_free(d->sym_cache);
619
+ d->sym_cache = NULL;
614
620
  }
615
621
  if (NULL != d->class_cache) {
616
622
  cache_free(d->class_cache);
623
+ d->class_cache = NULL;
617
624
  }
618
625
  OJ_R_FREE(d->vhead);
619
626
  OJ_R_FREE(d->chead);
@@ -640,6 +647,12 @@ static void mark(ojParser p) {
640
647
  if (NULL != d->class_cache) {
641
648
  cache_mark(d->class_cache);
642
649
  }
650
+ if (Qnil != d->hash_class) {
651
+ rb_gc_mark(d->hash_class);
652
+ }
653
+ if (Qnil != d->array_class) {
654
+ rb_gc_mark(d->array_class);
655
+ }
643
656
  for (vp = d->vhead; vp < d->vtail; vp++) {
644
657
  if (Qundef != *vp) {
645
658
  rb_gc_mark(*vp);
@@ -834,8 +847,8 @@ static VALUE opt_create_id_set(ojParser p, VALUE value) {
834
847
  rb_check_type(value, T_STRING);
835
848
  size_t len = RSTRING_LEN(value);
836
849
 
837
- if (1 << sizeof(d->create_id_len) <= len) {
838
- rb_raise(rb_eArgError, "The create_id values is limited to %d bytes.", 1 << sizeof(d->create_id_len));
850
+ if (1 << (8 * sizeof(d->create_id_len)) <= len) {
851
+ rb_raise(rb_eArgError, "The create_id values is limited to %d bytes.", 1 << (8 * sizeof(d->create_id_len)));
839
852
  }
840
853
  d->create_id_len = (uint8_t)len;
841
854
  d->create_id = str_dup(RSTRING_PTR(value), len);
@@ -1050,10 +1063,10 @@ static VALUE opt_symbol_keys_set(ojParser p, VALUE value) {
1050
1063
  if (NULL != d->sym_cache) {
1051
1064
  cache_free(d->sym_cache);
1052
1065
  d->sym_cache = NULL;
1066
+ d->key_cache = NULL;
1053
1067
  }
1054
- if (!d->cache_keys) {
1055
- d->get_key = str_key;
1056
- }
1068
+ d->cache_keys = false;
1069
+ d->get_key = str_key;
1057
1070
  }
1058
1071
  return (NULL != d->sym_cache) ? Qtrue : Qfalse;
1059
1072
  }
data/ext/oj/wab.c CHANGED
@@ -19,7 +19,7 @@
19
19
  // Workaround in case INFINITY is not defined in math.h or if the OS is CentOS
20
20
  #define OJ_INFINITY (1.0 / 0.0)
21
21
 
22
- static char hex_chars[256] = "\
22
+ static char hex_chars[257] = "\
23
23
  ................................\
24
24
  ................xxxxxxxxxx......\
25
25
  .xxxxxx.........................\
@@ -111,10 +111,11 @@ static void dump_float(VALUE obj, int depth, Out out, bool as_ok) {
111
111
 
112
112
  static void dump_array(VALUE a, int depth, Out out, bool as_ok) {
113
113
  size_t size;
114
- int i, cnt;
114
+ size_t i;
115
+ size_t cnt;
115
116
  int d2 = depth + 1;
116
117
 
117
- cnt = (int)RARRAY_LEN(a);
118
+ cnt = RARRAY_LEN(a);
118
119
  *out->cur++ = '[';
119
120
  size = 2;
120
121
  assure_size(out, size);
@@ -226,7 +227,7 @@ static void dump_obj(VALUE obj, int depth, Out out, bool as_ok) {
226
227
  } else if (oj_bigdecimal_class == clas) {
227
228
  volatile VALUE rstr = oj_safe_string_convert(obj);
228
229
 
229
- oj_dump_raw(RSTRING_PTR(rstr), (int)RSTRING_LEN(rstr), out);
230
+ oj_dump_raw(RSTRING_PTR(rstr), RSTRING_LEN(rstr), out);
230
231
  } else if (resolve_wab_uuid_class() == clas) {
231
232
  oj_dump_str(oj_safe_string_convert(obj), depth, out, false);
232
233
  } else if (resolve_uri_http_class() == clas) {
data/lib/oj/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Oj
2
2
  # Current version of the module.
3
- VERSION = '3.16.6'
3
+ VERSION = '3.17.3'
4
4
  end
data/pages/Encoding.md CHANGED
@@ -15,7 +15,7 @@ in a JSON document. The formatting follows these rules.
15
15
  * The `'^'` character denotes a special key value when in a JSON Object sequence.
16
16
 
17
17
  * A Ruby String that starts with `':'`or the sequence `'^i'` or `'^r'` are
18
- encoded by excaping the first character so that it appears as `'\u005e'` or
18
+ encoded by escaping the first character so that it appears as `'\u005e'` or
19
19
  `'\u003a'` instead of `':'` or `'^'`.
20
20
 
21
21
  * A `"^c"` JSON Object key indicates the value should be converted to a Ruby
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oj
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.16.6
4
+ version: 3.17.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-09-09 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: bigdecimal
@@ -24,20 +23,6 @@ dependencies:
24
23
  - - ">="
25
24
  - !ruby/object:Gem::Version
26
25
  version: '3.0'
27
- - !ruby/object:Gem::Dependency
28
- name: ostruct
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0.2'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0.2'
41
26
  - !ruby/object:Gem::Dependency
42
27
  name: minitest
43
28
  requirement: !ruby/object:Gem::Requirement
@@ -86,15 +71,29 @@ dependencies:
86
71
  - - "~>"
87
72
  - !ruby/object:Gem::Version
88
73
  version: '3.0'
74
+ - !ruby/object:Gem::Dependency
75
+ name: ostruct
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0.2'
81
+ type: :runtime
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0.2'
89
88
  description: The fastest JSON parser and object serializer.
90
89
  email: peter@ohler.com
91
90
  executables: []
92
91
  extensions:
93
92
  - ext/oj/extconf.rb
94
93
  extra_rdoc_files:
95
- - README.md
96
- - LICENSE
97
94
  - CHANGELOG.md
95
+ - LICENSE
96
+ - README.md
98
97
  - RELEASE_NOTES.md
99
98
  - pages/Advanced.md
100
99
  - pages/Compatibility.md
@@ -159,10 +158,13 @@ files:
159
158
  - ext/oj/resolve.h
160
159
  - ext/oj/rxclass.c
161
160
  - ext/oj/rxclass.h
161
+ - ext/oj/safe.c
162
+ - ext/oj/safe.h
162
163
  - ext/oj/saj.c
163
164
  - ext/oj/saj2.c
164
165
  - ext/oj/saj2.h
165
166
  - ext/oj/scp.c
167
+ - ext/oj/simd.h
166
168
  - ext/oj/sparse.c
167
169
  - ext/oj/stream_writer.c
168
170
  - ext/oj/strict.c
@@ -200,98 +202,6 @@ files:
200
202
  - pages/Rails.md
201
203
  - pages/Security.md
202
204
  - pages/WAB.md
203
- - test/_test_active.rb
204
- - test/_test_active_mimic.rb
205
- - test/_test_mimic_rails.rb
206
- - test/activerecord/result_test.rb
207
- - test/activesupport6/abstract_unit.rb
208
- - test/activesupport6/decoding_test.rb
209
- - test/activesupport6/encoding_test.rb
210
- - test/activesupport6/encoding_test_cases.rb
211
- - test/activesupport6/test_common.rb
212
- - test/activesupport6/test_helper.rb
213
- - test/activesupport6/time_zone_test_helpers.rb
214
- - test/activesupport7/abstract_unit.rb
215
- - test/activesupport7/decoding_test.rb
216
- - test/activesupport7/encoding_test.rb
217
- - test/activesupport7/encoding_test_cases.rb
218
- - test/activesupport7/time_zone_test_helpers.rb
219
- - test/files.rb
220
- - test/foo.rb
221
- - test/helper.rb
222
- - test/isolated/shared.rb
223
- - test/isolated/test_mimic_after.rb
224
- - test/isolated/test_mimic_alone.rb
225
- - test/isolated/test_mimic_as_json.rb
226
- - test/isolated/test_mimic_before.rb
227
- - test/isolated/test_mimic_define.rb
228
- - test/isolated/test_mimic_rails_after.rb
229
- - test/isolated/test_mimic_rails_before.rb
230
- - test/isolated/test_mimic_redefine.rb
231
- - test/json_gem/json_addition_test.rb
232
- - test/json_gem/json_common_interface_test.rb
233
- - test/json_gem/json_encoding_test.rb
234
- - test/json_gem/json_ext_parser_test.rb
235
- - test/json_gem/json_fixtures_test.rb
236
- - test/json_gem/json_generator_test.rb
237
- - test/json_gem/json_generic_object_test.rb
238
- - test/json_gem/json_parser_test.rb
239
- - test/json_gem/json_string_matching_test.rb
240
- - test/json_gem/test_helper.rb
241
- - test/mem.rb
242
- - test/perf.rb
243
- - test/perf_compat.rb
244
- - test/perf_dump.rb
245
- - test/perf_fast.rb
246
- - test/perf_file.rb
247
- - test/perf_object.rb
248
- - test/perf_once.rb
249
- - test/perf_parser.rb
250
- - test/perf_saj.rb
251
- - test/perf_scp.rb
252
- - test/perf_simple.rb
253
- - test/perf_strict.rb
254
- - test/perf_wab.rb
255
- - test/prec.rb
256
- - test/sample.rb
257
- - test/sample/change.rb
258
- - test/sample/dir.rb
259
- - test/sample/doc.rb
260
- - test/sample/file.rb
261
- - test/sample/group.rb
262
- - test/sample/hasprops.rb
263
- - test/sample/layer.rb
264
- - test/sample/line.rb
265
- - test/sample/oval.rb
266
- - test/sample/rect.rb
267
- - test/sample/shape.rb
268
- - test/sample/text.rb
269
- - test/sample_json.rb
270
- - test/test_compat.rb
271
- - test/test_custom.rb
272
- - test/test_debian.rb
273
- - test/test_fast.rb
274
- - test/test_file.rb
275
- - test/test_gc.rb
276
- - test/test_generate.rb
277
- - test/test_hash.rb
278
- - test/test_integer_range.rb
279
- - test/test_null.rb
280
- - test/test_object.rb
281
- - test/test_parser.rb
282
- - test/test_parser_debug.rb
283
- - test/test_parser_saj.rb
284
- - test/test_parser_usual.rb
285
- - test/test_rails.rb
286
- - test/test_saj.rb
287
- - test/test_scp.rb
288
- - test/test_strict.rb
289
- - test/test_various.rb
290
- - test/test_wab.rb
291
- - test/test_writer.rb
292
- - test/tests.rb
293
- - test/tests_mimic.rb
294
- - test/tests_mimic_addition.rb
295
205
  homepage: http://www.ohler.com/oj
296
206
  licenses:
297
207
  - MIT
@@ -303,7 +213,6 @@ metadata:
303
213
  source_code_uri: https://github.com/ohler55/oj
304
214
  wiki_uri: https://github.com/ohler55/oj/wiki
305
215
  rubygems_mfa_required: 'true'
306
- post_install_message:
307
216
  rdoc_options:
308
217
  - "--title"
309
218
  - Oj
@@ -322,8 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
322
231
  - !ruby/object:Gem::Version
323
232
  version: '0'
324
233
  requirements: []
325
- rubygems_version: 3.5.11
326
- signing_key:
234
+ rubygems_version: 4.0.3
327
235
  specification_version: 4
328
236
  summary: A fast JSON parser and serializer.
329
237
  test_files: []
data/test/_test_active.rb DELETED
@@ -1,75 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- $LOAD_PATH << __dir__
5
- %w(lib ext test).each do |dir|
6
- $LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
7
- end
8
-
9
- require 'minitest'
10
- require 'minitest/autorun'
11
-
12
- require 'sqlite3'
13
- require 'active_record'
14
- require 'oj'
15
-
16
- # Oj.mimic_JSON()
17
- Oj.default_options = {mode: :compat, indent: 2}
18
-
19
- # ActiveRecord::Base.logger = Logger.new(STDERR)
20
-
21
- ActiveRecord::Base.establish_connection(
22
- :adapter => 'sqlite3',
23
- :database => ':memory:'
24
- )
25
-
26
- ActiveRecord::Schema.define do
27
- create_table :users do |table|
28
- table.column :first_name, :string
29
- table.column :last_name, :string
30
- table.column :email, :string
31
- end
32
- end
33
-
34
- class User < ActiveRecord::Base
35
- end
36
-
37
- class ActiveTest < Minitest::Test
38
-
39
- def test_active
40
- User.find_or_create_by(first_name: 'John', last_name: 'Smith', email: 'john@example.com')
41
- User.find_or_create_by(first_name: 'Joan', last_name: 'Smith', email: 'joan@example.com')
42
-
43
- # Single instance.
44
- assert_equal(%|{
45
- "id":1,
46
- "first_name":"John",
47
- "last_name":"Smith",
48
- "email":"john@example.com"
49
- }
50
- |, Oj.dump(User.first))
51
-
52
- # Array of instances.
53
- assert_equal(%|[
54
- {
55
- "id":1,
56
- "first_name":"John",
57
- "last_name":"Smith",
58
- "email":"john@example.com"
59
- },
60
- {
61
- "id":2,
62
- "first_name":"Joan",
63
- "last_name":"Smith",
64
- "email":"joan@example.com"
65
- }
66
- ]
67
- |, Oj.dump(User.all))
68
-
69
- # Single instance as json. (not Oj)
70
- assert_equal(%|{"id":1,"first_name":"John","last_name":"Smith","email":"john@example.com"}|, User.first.to_json)
71
-
72
- # Array of instances as json. (not Oj)
73
- assert_equal(%|[{"id":1,"first_name":"John","last_name":"Smith","email":"john@example.com"},{"id":2,"first_name":"Joan","last_name":"Smith","email":"joan@example.com"}]|, User.all.to_json)
74
- end
75
- end
@@ -1,95 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- $LOAD_PATH << __dir__
5
- %w(lib ext test).each do |dir|
6
- $LOAD_PATH.unshift File.expand_path("../../#{dir}", __FILE__)
7
- end
8
-
9
- require 'minitest'
10
- require 'minitest/autorun'
11
-
12
- require 'sqlite3'
13
- require 'active_record'
14
- require 'oj'
15
-
16
- Oj.mimic_JSON()
17
- Oj.default_options = {mode: :compat, indent: 2}
18
-
19
- # ActiveRecord::Base.logger = Logger.new(STDERR)
20
-
21
- ActiveRecord::Base.establish_connection(
22
- :adapter => 'sqlite3',
23
- :database => ':memory:'
24
- )
25
-
26
- ActiveRecord::Schema.define do
27
- create_table :users do |table|
28
- table.column :first_name, :string
29
- table.column :last_name, :string
30
- table.column :email, :string
31
- end
32
- end
33
-
34
- class User < ActiveRecord::Base
35
- end
36
-
37
- class ActiveTest < Minitest::Test
38
-
39
- def test_active
40
- User.find_or_create_by(first_name: 'John', last_name: 'Smith', email: 'john@example.com')
41
- User.find_or_create_by(first_name: 'Joan', last_name: 'Smith', email: 'joan@example.com')
42
-
43
- # Single instance.
44
- assert_equal(%|{
45
- "id":1,
46
- "first_name":"John",
47
- "last_name":"Smith",
48
- "email":"john@example.com"
49
- }
50
- |, Oj.dump(User.first))
51
-
52
- # Array of instances.
53
- assert_equal(%|[
54
- {
55
- "id":1,
56
- "first_name":"John",
57
- "last_name":"Smith",
58
- "email":"john@example.com"
59
- },
60
- {
61
- "id":2,
62
- "first_name":"Joan",
63
- "last_name":"Smith",
64
- "email":"joan@example.com"
65
- }
66
- ]
67
- |, Oj.dump(User.all))
68
-
69
- # Single instance as json. (not Oj)
70
- assert_equal(%|{
71
- "id":1,
72
- "first_name":"John",
73
- "last_name":"Smith",
74
- "email":"john@example.com"
75
- }
76
- |, User.first.to_json)
77
-
78
- # Array of instances as json. (not Oj)
79
- assert_equal(%|[
80
- {
81
- "id":1,
82
- "first_name":"John",
83
- "last_name":"Smith",
84
- "email":"john@example.com"
85
- },
86
- {
87
- "id":2,
88
- "first_name":"Joan",
89
- "last_name":"Smith",
90
- "email":"joan@example.com"
91
- }
92
- ]
93
- |, User.all.to_json)
94
- end
95
- end
@@ -1,123 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- $LOAD_PATH << __dir__
5
-
6
- require 'helper'
7
- # Oj.mimic_JSON
8
- require 'rails/all'
9
-
10
- require 'active_model'
11
- require 'active_model_serializers'
12
- require 'active_support/json'
13
- require 'active_support/time'
14
- require 'active_support/all'
15
-
16
- require 'oj/active_support_helper'
17
-
18
- Oj.mimic_JSON
19
-
20
- class Category
21
- include ActiveModel::Model
22
- include ActiveModel::SerializerSupport
23
-
24
- attr_accessor :id, :name
25
-
26
- def initialize(id, name)
27
- @id = id
28
- @name = name
29
- end
30
- end
31
-
32
- class CategorySerializer < ActiveModel::Serializer
33
- attributes :id, :name
34
- end
35
-
36
- class MimicRails < Minitest::Test
37
-
38
- def test_mimic_exception
39
- ActiveSupport::JSON.decode('{')
40
- puts 'Failed'
41
- rescue ActiveSupport::JSON.parse_error
42
- assert(true)
43
- rescue Exception
44
- assert(false, 'Expected a JSON::ParserError')
45
- end
46
-
47
- def test_dump_string
48
- Oj.default_options= {:indent => 2}
49
- json = ActiveSupport::JSON.encode([1, true, nil])
50
- assert_equal(%{[
51
- 1,
52
- true,
53
- null
54
- ]
55
- }, json)
56
- end
57
-
58
- def test_dump_rational
59
- Oj.default_options= {:indent => 2}
60
- json = ActiveSupport::JSON.encode([1, true, Rational(1)])
61
- assert_equal(%{[
62
- 1,
63
- true,
64
- "1/1"
65
- ]
66
- }, json)
67
- end
68
-
69
- def test_dump_range
70
- Oj.default_options= {:indent => 2}
71
- json = ActiveSupport::JSON.encode([1, true, '01'..'12'])
72
- assert_equal(%{[
73
- 1,
74
- true,
75
- "01..12"
76
- ]
77
- }, json)
78
- end
79
-
80
- def test_dump_object
81
- Oj.default_options= {:indent => 2}
82
- category = Category.new(1, 'test')
83
- serializer = CategorySerializer.new(category)
84
-
85
- serializer.to_json()
86
- puts "*** serializer.to_json() #{serializer.to_json()}"
87
- serializer.as_json()
88
- puts "*** serializer.as_json() #{serializer.as_json()}"
89
- JSON.dump(serializer)
90
- puts "*** JSON.dump(serializer) #{JSON.dump(serializer)}"
91
-
92
- puts "*** category.to_json() #{category.to_json()}"
93
- puts "*** category.as_json() #{category.as_json()}"
94
- puts "*** JSON.dump(serializer) #{JSON.dump(category)}"
95
- puts "*** Oj.dump(serializer) #{Oj.dump(category)}"
96
- end
97
-
98
- def test_dump_object_array
99
- Oj.default_options= {:indent => 2}
100
- cat1 = Category.new(1, 'test')
101
- cat2 = Category.new(2, 'test')
102
- a = Array.wrap([cat1, cat2])
103
-
104
- # serializer = CategorySerializer.new(a)
105
-
106
- puts "*** a.to_json() #{a.to_json()}"
107
- puts "*** a.as_json() #{a.as_json()}"
108
- puts "*** JSON.dump(a) #{JSON.dump(a)}"
109
- puts "*** Oj.dump(a) #{Oj.dump(a)}"
110
- end
111
-
112
- def test_dump_time
113
- Oj.default_options= {:indent => 2}
114
- now = ActiveSupport::TimeZone['America/Chicago'].parse('2014-11-01 13:20:47')
115
- json = Oj.dump(now, mode: :object, time_format: :xmlschema)
116
- # puts "*** json: #{json}"
117
-
118
- oj_dump = Oj.load(json, mode: :object, time_format: :xmlschema)
119
- # puts "Now: #{now}\n Oj: #{oj_dump}"
120
- assert_equal('2014-11-01T13:20:47-05:00', oj_dump.xmlschema)
121
- end
122
-
123
- end # MimicRails