oj 3.16.9 → 3.16.11

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 (119) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/ext/oj/custom.c +10 -9
  4. data/ext/oj/dump.c +319 -20
  5. data/ext/oj/dump.h +7 -2
  6. data/ext/oj/dump_compat.c +9 -8
  7. data/ext/oj/dump_leaf.c +1 -1
  8. data/ext/oj/dump_object.c +27 -17
  9. data/ext/oj/dump_strict.c +7 -6
  10. data/ext/oj/fast.c +4 -7
  11. data/ext/oj/mimic_json.c +3 -6
  12. data/ext/oj/object.c +8 -8
  13. data/ext/oj/oj.c +12 -9
  14. data/ext/oj/parse.c +15 -5
  15. data/ext/oj/parser.c +1 -1
  16. data/ext/oj/parser.h +2 -0
  17. data/ext/oj/rails.c +20 -19
  18. data/ext/oj/saj.c +3 -6
  19. data/ext/oj/scp.c +3 -6
  20. data/ext/oj/simd.h +10 -0
  21. data/ext/oj/stream_writer.c +1 -7
  22. data/ext/oj/strict.c +2 -4
  23. data/ext/oj/string_writer.c +1 -3
  24. data/ext/oj/wab.c +4 -3
  25. data/lib/oj/version.rb +1 -1
  26. data/pages/Encoding.md +1 -1
  27. metadata +4 -98
  28. data/test/_test_active.rb +0 -75
  29. data/test/_test_active_mimic.rb +0 -95
  30. data/test/_test_mimic_rails.rb +0 -123
  31. data/test/activerecord/result_test.rb +0 -31
  32. data/test/activesupport6/abstract_unit.rb +0 -44
  33. data/test/activesupport6/decoding_test.rb +0 -133
  34. data/test/activesupport6/encoding_test.rb +0 -542
  35. data/test/activesupport6/encoding_test_cases.rb +0 -98
  36. data/test/activesupport6/test_common.rb +0 -17
  37. data/test/activesupport6/test_helper.rb +0 -163
  38. data/test/activesupport6/time_zone_test_helpers.rb +0 -39
  39. data/test/activesupport7/abstract_unit.rb +0 -52
  40. data/test/activesupport7/decoding_test.rb +0 -125
  41. data/test/activesupport7/encoding_test.rb +0 -536
  42. data/test/activesupport7/encoding_test_cases.rb +0 -104
  43. data/test/activesupport7/time_zone_test_helpers.rb +0 -47
  44. data/test/files.rb +0 -29
  45. data/test/foo.rb +0 -26
  46. data/test/helper.rb +0 -39
  47. data/test/isolated/shared.rb +0 -309
  48. data/test/isolated/test_mimic_after.rb +0 -13
  49. data/test/isolated/test_mimic_alone.rb +0 -12
  50. data/test/isolated/test_mimic_as_json.rb +0 -45
  51. data/test/isolated/test_mimic_before.rb +0 -13
  52. data/test/isolated/test_mimic_define.rb +0 -28
  53. data/test/isolated/test_mimic_rails_after.rb +0 -22
  54. data/test/isolated/test_mimic_rails_before.rb +0 -21
  55. data/test/isolated/test_mimic_redefine.rb +0 -15
  56. data/test/json_gem/json_addition_test.rb +0 -216
  57. data/test/json_gem/json_common_interface_test.rb +0 -155
  58. data/test/json_gem/json_encoding_test.rb +0 -107
  59. data/test/json_gem/json_ext_parser_test.rb +0 -21
  60. data/test/json_gem/json_fixtures_test.rb +0 -36
  61. data/test/json_gem/json_generator_test.rb +0 -413
  62. data/test/json_gem/json_generic_object_test.rb +0 -90
  63. data/test/json_gem/json_parser_test.rb +0 -477
  64. data/test/json_gem/json_string_matching_test.rb +0 -42
  65. data/test/json_gem/test_helper.rb +0 -30
  66. data/test/mem.rb +0 -34
  67. data/test/perf.rb +0 -102
  68. data/test/perf_compat.rb +0 -128
  69. data/test/perf_dump.rb +0 -50
  70. data/test/perf_fast.rb +0 -162
  71. data/test/perf_file.rb +0 -62
  72. data/test/perf_object.rb +0 -134
  73. data/test/perf_once.rb +0 -59
  74. data/test/perf_parser.rb +0 -183
  75. data/test/perf_saj.rb +0 -101
  76. data/test/perf_scp.rb +0 -140
  77. data/test/perf_simple.rb +0 -289
  78. data/test/perf_strict.rb +0 -137
  79. data/test/perf_wab.rb +0 -129
  80. data/test/prec.rb +0 -23
  81. data/test/sample/change.rb +0 -13
  82. data/test/sample/dir.rb +0 -18
  83. data/test/sample/doc.rb +0 -35
  84. data/test/sample/file.rb +0 -47
  85. data/test/sample/group.rb +0 -15
  86. data/test/sample/hasprops.rb +0 -15
  87. data/test/sample/layer.rb +0 -11
  88. data/test/sample/line.rb +0 -20
  89. data/test/sample/oval.rb +0 -10
  90. data/test/sample/rect.rb +0 -9
  91. data/test/sample/shape.rb +0 -34
  92. data/test/sample/text.rb +0 -19
  93. data/test/sample.rb +0 -54
  94. data/test/sample_json.rb +0 -37
  95. data/test/test_compat.rb +0 -567
  96. data/test/test_custom.rb +0 -555
  97. data/test/test_debian.rb +0 -50
  98. data/test/test_fast.rb +0 -526
  99. data/test/test_file.rb +0 -250
  100. data/test/test_gc.rb +0 -60
  101. data/test/test_generate.rb +0 -21
  102. data/test/test_hash.rb +0 -39
  103. data/test/test_integer_range.rb +0 -72
  104. data/test/test_null.rb +0 -376
  105. data/test/test_object.rb +0 -1030
  106. data/test/test_parser.rb +0 -11
  107. data/test/test_parser_debug.rb +0 -27
  108. data/test/test_parser_saj.rb +0 -337
  109. data/test/test_parser_usual.rb +0 -255
  110. data/test/test_rails.rb +0 -35
  111. data/test/test_saj.rb +0 -188
  112. data/test/test_scp.rb +0 -431
  113. data/test/test_strict.rb +0 -441
  114. data/test/test_various.rb +0 -801
  115. data/test/test_wab.rb +0 -311
  116. data/test/test_writer.rb +0 -396
  117. data/test/tests.rb +0 -33
  118. data/test/tests_mimic.rb +0 -23
  119. data/test/tests_mimic_addition.rb +0 -16
data/ext/oj/saj.c CHANGED
@@ -94,8 +94,7 @@ inline static void call_add_value(VALUE handler, VALUE value, const char *key) {
94
94
  if (0 == key) {
95
95
  k = Qnil;
96
96
  } else {
97
- k = rb_str_new2(key);
98
- k = oj_encode(k);
97
+ k = rb_utf8_str_new_cstr(key);
99
98
  }
100
99
  rb_funcall(handler, oj_add_value_id, 2, value, k);
101
100
  }
@@ -106,8 +105,7 @@ inline static void call_no_value(VALUE handler, ID method, const char *key) {
106
105
  if (0 == key) {
107
106
  k = Qnil;
108
107
  } else {
109
- k = rb_str_new2(key);
110
- k = oj_encode(k);
108
+ k = rb_utf8_str_new_cstr(key);
111
109
  }
112
110
  rb_funcall(handler, method, 1, k);
113
111
  }
@@ -257,9 +255,8 @@ static void read_str(ParseInfo pi, const char *key) {
257
255
 
258
256
  text = read_quoted_value(pi);
259
257
  if (pi->has_add_value) {
260
- VALUE s = rb_str_new2(text);
258
+ VALUE s = rb_utf8_str_new_cstr(text);
261
259
 
262
- s = oj_encode(s);
263
260
  call_add_value(pi->handler, s, key);
264
261
  }
265
262
  }
data/ext/oj/scp.c CHANGED
@@ -56,9 +56,8 @@ static void add_value(ParseInfo pi, VALUE val) {
56
56
  }
57
57
 
58
58
  static void add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
59
- volatile VALUE rstr = rb_str_new(str, len);
59
+ volatile VALUE rstr = rb_utf8_str_new(str, len);
60
60
 
61
- rstr = oj_encode(rstr);
62
61
  rb_funcall(pi->handler, oj_add_value_id, 1, rstr);
63
62
  }
64
63
 
@@ -87,9 +86,8 @@ static VALUE hash_key(ParseInfo pi, const char *key, size_t klen) {
87
86
  }
88
87
 
89
88
  static void hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, const char *orig) {
90
- volatile VALUE rstr = rb_str_new(str, len);
89
+ volatile VALUE rstr = rb_utf8_str_new(str, len);
91
90
 
92
- rstr = oj_encode(rstr);
93
91
  rb_funcall(pi->handler, oj_hash_set_id, 3, stack_peek(&pi->stack)->val, oj_calc_hash_key(pi, kval), rstr);
94
92
  }
95
93
 
@@ -107,9 +105,8 @@ static void hash_set_value(ParseInfo pi, Val kval, VALUE value) {
107
105
  }
108
106
 
109
107
  static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
110
- volatile VALUE rstr = rb_str_new(str, len);
108
+ volatile VALUE rstr = rb_utf8_str_new(str, len);
111
109
 
112
- rstr = oj_encode(rstr);
113
110
  rb_funcall(pi->handler, oj_array_append_id, 2, stack_peek(&pi->stack)->val, rstr);
114
111
  }
115
112
 
data/ext/oj/simd.h ADDED
@@ -0,0 +1,10 @@
1
+ #ifndef OJ_SIMD_H
2
+ #define OJ_SIMD_H
3
+
4
+ #if defined(__ARM_NEON) || defined(__ARM_NEON__) || defined(__aarch64__) || defined(_M_ARM64)
5
+ #define HAVE_SIMD_NEON 1
6
+ #define SIMD_MINIMUM_THRESHOLD 6
7
+ #include <arm_neon.h>
8
+ #endif
9
+
10
+ #endif /* OJ_SIMD_H */
@@ -44,13 +44,7 @@ static void stream_writer_write(StreamWriter sw) {
44
44
  case STRING_IO:
45
45
  case STREAM_IO:
46
46
  case FILE_IO: {
47
- volatile VALUE rs = rb_str_new(sw->sw.out.buf, size);
48
-
49
- // Oddly enough, when pushing ASCII characters with UTF-8 encoding or
50
- // even ASCII-8BIT does not change the output encoding. Pushing any
51
- // non-ASCII no matter what the encoding changes the output encoding
52
- // to ASCII-8BIT if it the string is not forced to UTF-8 here.
53
- rs = oj_encode(rs);
47
+ volatile VALUE rs = rb_utf8_str_new(sw->sw.out.buf, size);
54
48
  rb_funcall(sw->stream, oj_write_id, 1, rs);
55
49
  break;
56
50
  }
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,9 +469,7 @@ 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
data/ext/oj/wab.c CHANGED
@@ -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.9'
3
+ VERSION = '3.16.11'
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.9
4
+ version: 3.16.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-12-28 00:00:00.000000000 Z
10
+ date: 2025-05-30 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: bigdecimal
@@ -163,6 +162,7 @@ files:
163
162
  - ext/oj/saj2.c
164
163
  - ext/oj/saj2.h
165
164
  - ext/oj/scp.c
165
+ - ext/oj/simd.h
166
166
  - ext/oj/sparse.c
167
167
  - ext/oj/stream_writer.c
168
168
  - ext/oj/strict.c
@@ -200,98 +200,6 @@ files:
200
200
  - pages/Rails.md
201
201
  - pages/Security.md
202
202
  - 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
203
  homepage: http://www.ohler.com/oj
296
204
  licenses:
297
205
  - MIT
@@ -303,7 +211,6 @@ metadata:
303
211
  source_code_uri: https://github.com/ohler55/oj
304
212
  wiki_uri: https://github.com/ohler55/oj/wiki
305
213
  rubygems_mfa_required: 'true'
306
- post_install_message:
307
214
  rdoc_options:
308
215
  - "--title"
309
216
  - Oj
@@ -322,8 +229,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
322
229
  - !ruby/object:Gem::Version
323
230
  version: '0'
324
231
  requirements: []
325
- rubygems_version: 3.5.11
326
- signing_key:
232
+ rubygems_version: 3.6.2
327
233
  specification_version: 4
328
234
  summary: A fast JSON parser and serializer.
329
235
  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
@@ -1,31 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- $: << File.dirname(__FILE__)
4
- $: << File.dirname(File.dirname(__FILE__))
5
-
6
- require 'helper'
7
- require "rails/all"
8
-
9
- Oj::Rails.set_encoder()
10
- Oj::Rails.optimize()
11
-
12
- Oj.default_options = { mode: :rails }
13
-
14
- class ActiveRecordResultTest < Minitest::Test
15
- def test_hash_rows
16
- result = ActiveRecord::Result.new(["one", "two"],
17
- [
18
- ["row 1 col 1", "row 1 col 2"],
19
- ["row 2 col 1", "row 2 col 2"],
20
- ["row 3 col 1", "row 3 col 2"],
21
- ])
22
- #puts "*** result: #{Oj.dump(result, indent: 2)}"
23
- json_result = if ActiveRecord.version >= Gem::Version.new("6")
24
- result.to_a
25
- else
26
- result.to_hash
27
- end
28
-
29
- assert_equal Oj.dump(result, mode: :rails), Oj.dump(json_result)
30
- end
31
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- ORIG_ARGV = ARGV.dup
4
-
5
- require "active_support/core_ext/kernel/reporting"
6
-
7
- silence_warnings do
8
- Encoding.default_internal = Encoding::UTF_8
9
- Encoding.default_external = Encoding::UTF_8
10
- end
11
-
12
- require "active_support/testing/autorun"
13
- require "active_support/testing/method_call_assertions"
14
-
15
- ENV["NO_RELOAD"] = "1"
16
- require "active_support"
17
-
18
- Thread.abort_on_exception = true
19
-
20
- # Show backtraces for deprecated behavior for quicker cleanup.
21
- ActiveSupport::Deprecation.debug = true
22
-
23
- # Default to old to_time behavior but allow running tests with new behavior
24
- ActiveSupport.to_time_preserves_timezone = ENV["PRESERVE_TIMEZONES"] == "1"
25
-
26
- # Disable available locale checks to avoid warnings running the test suite.
27
- I18n.enforce_available_locales = false
28
-
29
- class ActiveSupport::TestCase
30
- include ActiveSupport::Testing::MethodCallAssertions
31
-
32
- private
33
- # Skips the current run on Rubinius using Minitest::Assertions#skip
34
- def rubinius_skip(message = "")
35
- skip message if RUBY_ENGINE == "rbx"
36
- end
37
-
38
- # Skips the current run on JRuby using Minitest::Assertions#skip
39
- def jruby_skip(message = "")
40
- skip message if defined?(JRUBY_VERSION)
41
- end
42
- end
43
-
44
- require_relative "test_common"