oj 3.13.9 → 3.16.1

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 (161) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +101 -0
  3. data/README.md +13 -2
  4. data/ext/oj/buf.h +11 -6
  5. data/ext/oj/cache.c +25 -24
  6. data/ext/oj/cache8.c +10 -9
  7. data/ext/oj/circarray.c +8 -6
  8. data/ext/oj/circarray.h +2 -2
  9. data/ext/oj/code.c +19 -33
  10. data/ext/oj/code.h +2 -2
  11. data/ext/oj/compat.c +20 -60
  12. data/ext/oj/custom.c +76 -155
  13. data/ext/oj/debug.c +3 -9
  14. data/ext/oj/dump.c +203 -213
  15. data/ext/oj/dump.h +26 -12
  16. data/ext/oj/dump_compat.c +565 -642
  17. data/ext/oj/dump_leaf.c +17 -63
  18. data/ext/oj/dump_object.c +59 -181
  19. data/ext/oj/dump_strict.c +24 -48
  20. data/ext/oj/encoder.c +43 -0
  21. data/ext/oj/err.c +2 -13
  22. data/ext/oj/err.h +9 -12
  23. data/ext/oj/extconf.rb +18 -7
  24. data/ext/oj/fast.c +83 -108
  25. data/ext/oj/intern.c +52 -50
  26. data/ext/oj/intern.h +4 -8
  27. data/ext/oj/mem.c +318 -0
  28. data/ext/oj/mem.h +53 -0
  29. data/ext/oj/mimic_json.c +104 -81
  30. data/ext/oj/object.c +50 -67
  31. data/ext/oj/odd.c +89 -67
  32. data/ext/oj/odd.h +15 -15
  33. data/ext/oj/oj.c +171 -106
  34. data/ext/oj/oj.h +96 -74
  35. data/ext/oj/parse.c +169 -189
  36. data/ext/oj/parse.h +23 -24
  37. data/ext/oj/parser.c +89 -34
  38. data/ext/oj/parser.h +20 -9
  39. data/ext/oj/rails.c +86 -151
  40. data/ext/oj/rails.h +1 -1
  41. data/ext/oj/reader.c +12 -15
  42. data/ext/oj/reader.h +4 -2
  43. data/ext/oj/resolve.c +3 -4
  44. data/ext/oj/rxclass.c +6 -5
  45. data/ext/oj/rxclass.h +1 -1
  46. data/ext/oj/saj.c +21 -32
  47. data/ext/oj/saj2.c +329 -93
  48. data/ext/oj/saj2.h +23 -0
  49. data/ext/oj/scp.c +3 -14
  50. data/ext/oj/sparse.c +26 -70
  51. data/ext/oj/stream_writer.c +12 -22
  52. data/ext/oj/strict.c +20 -52
  53. data/ext/oj/string_writer.c +21 -22
  54. data/ext/oj/trace.h +31 -4
  55. data/ext/oj/usual.c +105 -150
  56. data/ext/oj/usual.h +68 -0
  57. data/ext/oj/util.h +1 -1
  58. data/ext/oj/val_stack.c +1 -1
  59. data/ext/oj/val_stack.h +8 -7
  60. data/ext/oj/validate.c +21 -26
  61. data/ext/oj/wab.c +32 -69
  62. data/lib/oj/active_support_helper.rb +1 -3
  63. data/lib/oj/bag.rb +7 -1
  64. data/lib/oj/easy_hash.rb +4 -5
  65. data/lib/oj/error.rb +0 -1
  66. data/lib/oj/json.rb +162 -150
  67. data/lib/oj/mimic.rb +6 -2
  68. data/lib/oj/saj.rb +20 -6
  69. data/lib/oj/state.rb +9 -6
  70. data/lib/oj/version.rb +1 -2
  71. data/lib/oj.rb +2 -0
  72. data/pages/Compatibility.md +1 -1
  73. data/pages/InstallOptions.md +20 -0
  74. data/pages/JsonGem.md +15 -0
  75. data/pages/Modes.md +6 -3
  76. data/pages/Options.md +10 -0
  77. data/pages/Rails.md +12 -0
  78. data/test/_test_active.rb +8 -9
  79. data/test/_test_active_mimic.rb +7 -8
  80. data/test/_test_mimic_rails.rb +17 -20
  81. data/test/activerecord/result_test.rb +5 -6
  82. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  83. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  84. data/test/{activesupport5 → activesupport7}/encoding_test.rb +20 -34
  85. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  86. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  87. data/test/files.rb +15 -15
  88. data/test/foo.rb +15 -15
  89. data/test/helper.rb +11 -8
  90. data/test/isolated/shared.rb +3 -2
  91. data/test/json_gem/json_addition_test.rb +2 -2
  92. data/test/json_gem/json_common_interface_test.rb +8 -6
  93. data/test/json_gem/json_encoding_test.rb +0 -0
  94. data/test/json_gem/json_ext_parser_test.rb +1 -0
  95. data/test/json_gem/json_fixtures_test.rb +3 -2
  96. data/test/json_gem/json_generator_test.rb +49 -37
  97. data/test/json_gem/json_generic_object_test.rb +11 -11
  98. data/test/json_gem/json_parser_test.rb +54 -47
  99. data/test/json_gem/json_string_matching_test.rb +9 -9
  100. data/test/json_gem/test_helper.rb +7 -3
  101. data/test/mem.rb +13 -12
  102. data/test/perf.rb +21 -26
  103. data/test/perf_compat.rb +31 -33
  104. data/test/perf_dump.rb +50 -0
  105. data/test/perf_fast.rb +80 -82
  106. data/test/perf_file.rb +27 -29
  107. data/test/perf_object.rb +65 -69
  108. data/test/perf_once.rb +12 -11
  109. data/test/perf_parser.rb +42 -48
  110. data/test/perf_saj.rb +46 -54
  111. data/test/perf_scp.rb +57 -69
  112. data/test/perf_simple.rb +41 -39
  113. data/test/perf_strict.rb +68 -70
  114. data/test/perf_wab.rb +67 -69
  115. data/test/prec.rb +3 -3
  116. data/test/sample/change.rb +0 -1
  117. data/test/sample/dir.rb +0 -1
  118. data/test/sample/doc.rb +0 -1
  119. data/test/sample/file.rb +0 -1
  120. data/test/sample/group.rb +0 -1
  121. data/test/sample/hasprops.rb +0 -1
  122. data/test/sample/layer.rb +0 -1
  123. data/test/sample/rect.rb +0 -1
  124. data/test/sample/shape.rb +0 -1
  125. data/test/sample/text.rb +0 -1
  126. data/test/sample.rb +16 -16
  127. data/test/sample_json.rb +8 -8
  128. data/test/test_compat.rb +95 -43
  129. data/test/test_custom.rb +72 -51
  130. data/test/test_debian.rb +7 -10
  131. data/test/test_fast.rb +102 -87
  132. data/test/test_file.rb +41 -30
  133. data/test/test_gc.rb +16 -5
  134. data/test/test_generate.rb +5 -5
  135. data/test/test_hash.rb +4 -4
  136. data/test/test_integer_range.rb +9 -9
  137. data/test/test_null.rb +20 -20
  138. data/test/test_object.rb +85 -96
  139. data/test/test_parser.rb +6 -22
  140. data/test/test_parser_debug.rb +27 -0
  141. data/test/test_parser_saj.rb +115 -23
  142. data/test/test_parser_usual.rb +6 -6
  143. data/test/test_rails.rb +2 -2
  144. data/test/test_saj.rb +10 -8
  145. data/test/test_scp.rb +37 -39
  146. data/test/test_strict.rb +40 -32
  147. data/test/test_various.rb +163 -84
  148. data/test/test_wab.rb +48 -44
  149. data/test/test_writer.rb +47 -47
  150. data/test/tests.rb +13 -5
  151. data/test/tests_mimic.rb +12 -3
  152. data/test/tests_mimic_addition.rb +12 -3
  153. metadata +34 -144
  154. data/test/activesupport4/decoding_test.rb +0 -108
  155. data/test/activesupport4/encoding_test.rb +0 -531
  156. data/test/activesupport4/test_helper.rb +0 -41
  157. data/test/activesupport5/test_helper.rb +0 -72
  158. data/test/bar.rb +0 -16
  159. data/test/baz.rb +0 -16
  160. data/test/bug.rb +0 -16
  161. data/test/zoo.rb +0 -13
data/lib/oj/json.rb CHANGED
@@ -1,176 +1,188 @@
1
-
2
1
  require 'ostruct'
3
2
  require 'oj/state'
4
3
 
5
- module JSON
6
- NaN = 0.0/0.0 unless defined?(::JSON::NaN)
7
- Infinity = 1.0/0.0 unless defined?(::JSON::Infinity)
8
- MinusInfinity = -1.0/0.0 unless defined?(::JSON::MinusInfinity)
9
- # Taken from the unit test. Note that items like check_circular? are not
10
- # present.
11
- PRETTY_STATE_PROTOTYPE = Ext::Generator::State.from_state({
12
- :allow_nan => false,
13
- :array_nl => "\n",
14
- :ascii_only => false,
15
- :buffer_initial_length => 1024,
16
- :depth => 0,
17
- :indent => " ",
18
- :max_nesting => 100,
19
- :object_nl => "\n",
20
- :space => " ",
21
- :space_before => "",
22
- }) unless defined?(::JSON::PRETTY_STATE_PROTOTYPE)
23
- SAFE_STATE_PROTOTYPE = Ext::Generator::State.from_state({
24
- :allow_nan => false,
25
- :array_nl => "",
26
- :ascii_only => false,
27
- :buffer_initial_length => 1024,
28
- :depth => 0,
29
- :indent => "",
30
- :max_nesting => 100,
31
- :object_nl => "",
32
- :space => "",
33
- :space_before => "",
34
- }) unless defined?(::JSON::SAFE_STATE_PROTOTYPE)
35
- FAST_STATE_PROTOTYPE = Ext::Generator::State.from_state({
36
- :allow_nan => false,
37
- :array_nl => "",
38
- :ascii_only => false,
39
- :buffer_initial_length => 1024,
40
- :depth => 0,
41
- :indent => "",
42
- :max_nesting => 0,
43
- :object_nl => "",
44
- :space => "",
45
- :space_before => "",
46
- }) unless defined?(::JSON::FAST_STATE_PROTOTYPE)
47
-
48
- def self.dump_default_options
49
- Oj::MimicDumpOption.new
50
- end
51
-
52
- def self.dump_default_options=(h)
53
- m = Oj::MimicDumpOption.new
54
- h.each do |k,v|
55
- m[k] = v
4
+ if defined?(JSON::PRETTY_STATE_PROTOTYPE)
5
+ # There are enough people that try to use both the json gen and oj in mimic
6
+ # mode so don't display the warning.
7
+
8
+ # warn "WARNING: oj/json is a compatability shim used by Oj. Requiring the file explicitly is not recommended."
9
+ end
10
+
11
+ unless defined?(JSON::PRETTY_STATE_PROTOTYPE)
12
+ module JSON
13
+ NaN = 0.0/0.0 unless defined?(::JSON::NaN)
14
+ Infinity = 1.0/0.0 unless defined?(::JSON::Infinity)
15
+ MinusInfinity = -1.0/0.0 unless defined?(::JSON::MinusInfinity)
16
+ # Taken from the unit test. Note that items like check_circular? are not
17
+ # present.
18
+ PRETTY_STATE_PROTOTYPE = Ext::Generator::State.from_state({
19
+ :allow_nan => false,
20
+ :array_nl => "\n",
21
+ :ascii_only => false,
22
+ :buffer_initial_length => 1024,
23
+ :depth => 0,
24
+ :indent => " ",
25
+ :max_nesting => 100,
26
+ :object_nl => "\n",
27
+ :space => " ",
28
+ :space_before => "",
29
+ }) unless defined?(::JSON::PRETTY_STATE_PROTOTYPE)
30
+ SAFE_STATE_PROTOTYPE = Ext::Generator::State.from_state({
31
+ :allow_nan => false,
32
+ :array_nl => "",
33
+ :ascii_only => false,
34
+ :buffer_initial_length => 1024,
35
+ :depth => 0,
36
+ :indent => "",
37
+ :max_nesting => 100,
38
+ :object_nl => "",
39
+ :space => "",
40
+ :space_before => "",
41
+ }) unless defined?(::JSON::SAFE_STATE_PROTOTYPE)
42
+ FAST_STATE_PROTOTYPE = Ext::Generator::State.from_state({
43
+ :allow_nan => false,
44
+ :array_nl => "",
45
+ :ascii_only => false,
46
+ :buffer_initial_length => 1024,
47
+ :depth => 0,
48
+ :indent => "",
49
+ :max_nesting => 0,
50
+ :object_nl => "",
51
+ :space => "",
52
+ :space_before => "",
53
+ }) unless defined?(::JSON::FAST_STATE_PROTOTYPE)
54
+
55
+ def self.dump_default_options
56
+ Oj::MimicDumpOption.new
56
57
  end
57
- end
58
58
 
59
- def self.parser=(p)
60
- @@parser = p
61
- end
59
+ def self.dump_default_options=(h)
60
+ m = Oj::MimicDumpOption.new
61
+ h.each do |k, v|
62
+ m[k] = v
63
+ end
64
+ end
62
65
 
63
- def self.parser()
64
- @@parser
65
- end
66
+ def self.parser=(p)
67
+ @@parser = p
68
+ end
66
69
 
67
- def self.generator=(g)
68
- @@generator = g
69
- end
70
+ def self.parser()
71
+ @@parser
72
+ end
70
73
 
71
- def self.generator()
72
- @@generator
73
- end
74
+ def self.generator=(g)
75
+ @@generator = g
76
+ end
74
77
 
75
- module Ext
76
- class Parser
77
- def initialize(src)
78
- raise TypeError.new("already initialized") unless @source.nil?
79
- @source = src
80
- end
78
+ def self.generator()
79
+ @@generator
80
+ end
81
81
 
82
- def source()
83
- raise TypeError.new("already initialized") if @source.nil?
84
- @source
85
- end
86
-
87
- def parse()
88
- raise TypeError.new("already initialized") if @source.nil?
89
- JSON.parse(@source)
90
- end
91
-
92
- end # Parser
93
- end # Ext
94
-
95
- State = ::JSON::Ext::Generator::State unless defined?(::JSON::State)
96
-
97
- begin
98
- send(:remove_const, :Parser)
99
- rescue
100
- end
101
- Parser = ::JSON::Ext::Parser unless defined?(::JSON::Parser)
102
- self.parser = ::JSON::Ext::Parser
103
- self.generator = ::JSON::Ext::Generator
104
-
105
- # Taken directly from the json gem. Shamelessly copied. It is similar in
106
- # some ways to the Oj::Bag class or the Oj::EasyHash class.
107
- class GenericObject < OpenStruct
108
- class << self
109
- alias [] new
110
-
111
- def json_creatable?
112
- @json_creatable
113
- end
82
+ module Ext
83
+ class Parser
84
+ def initialize(src)
85
+ raise TypeError.new("already initialized") unless @source.nil?
114
86
 
115
- attr_writer :json_creatable
87
+ @source = src
88
+ end
116
89
 
117
- def json_create(data)
118
- data = data.dup
119
- data.delete JSON.create_id
120
- self[data]
121
- end
90
+ def source()
91
+ raise TypeError.new("already initialized") if @source.nil?
122
92
 
123
- def from_hash(object)
124
- case
125
- when object.respond_to?(:to_hash)
126
- result = new
127
- object.to_hash.each do |key, value|
128
- result[key] = from_hash(value)
129
- end
130
- result
131
- when object.respond_to?(:to_ary)
132
- object.to_ary.map { |a| from_hash(a) }
133
- else
134
- object
93
+ @source
135
94
  end
136
- end
137
95
 
138
- def load(source, proc = nil, opts = {})
139
- result = ::JSON.load(source, proc, opts.merge(:object_class => self))
140
- result.nil? ? new : result
141
- end
96
+ def parse()
97
+ raise TypeError.new("already initialized") if @source.nil?
142
98
 
143
- def dump(obj, *args)
144
- ::JSON.dump(obj, *args)
145
- end
99
+ JSON.parse(@source)
100
+ end
146
101
 
147
- end # self
102
+ end # Parser
103
+ end # Ext
148
104
 
149
- self.json_creatable = false
105
+ State = ::JSON::Ext::Generator::State unless defined?(::JSON::State)
150
106
 
151
- def to_hash
152
- table
107
+ begin
108
+ send(:remove_const, :Parser)
109
+ rescue
110
+ # ignore and move on
153
111
  end
112
+ Parser = ::JSON::Ext::Parser unless defined?(::JSON::Parser)
113
+ self.parser = ::JSON::Ext::Parser
114
+ self.generator = ::JSON::Ext::Generator
115
+
116
+ # Taken directly from the json gem. Shamelessly copied. It is similar in
117
+ # some ways to the Oj::Bag class or the Oj::EasyHash class.
118
+ class GenericObject < OpenStruct
119
+ class << self
120
+ alias [] new
121
+
122
+ def json_creatable?
123
+ @json_creatable
124
+ end
154
125
 
155
- def [](name)
156
- __send__(name)
157
- end unless method_defined?(:[])
126
+ attr_writer :json_creatable
158
127
 
159
- def []=(name, value)
160
- __send__("#{name}=", value)
161
- end unless method_defined?(:[]=)
128
+ def json_create(data)
129
+ data = data.dup
130
+ data.delete JSON.create_id
131
+ self[data]
132
+ end
162
133
 
163
- def |(other)
164
- self.class[other.to_hash.merge(to_hash)]
165
- end
134
+ def from_hash(object)
135
+ case
136
+ when object.respond_to?(:to_hash)
137
+ result = new
138
+ object.to_hash.each do |key, value|
139
+ result[key] = from_hash(value)
140
+ end
141
+ result
142
+ when object.respond_to?(:to_ary)
143
+ object.to_ary.map { |a| from_hash(a) }
144
+ else
145
+ object
146
+ end
147
+ end
166
148
 
167
- def as_json(*)
168
- { JSON.create_id => self.class.name }.merge to_hash
169
- end
149
+ def load(source, proc = nil, opts = {})
150
+ result = ::JSON.load(source, proc, opts.merge(:object_class => self))
151
+ result.nil? ? new : result
152
+ end
170
153
 
171
- def to_json(*a)
172
- as_json.to_json(*a)
154
+ def dump(obj, *args)
155
+ ::JSON.dump(obj, *args)
156
+ end
157
+
158
+ end # self
159
+
160
+ self.json_creatable = false
161
+
162
+ def to_hash
163
+ table
164
+ end
165
+
166
+ def [](name)
167
+ __send__(name)
168
+ end unless method_defined?(:[])
169
+
170
+ def []=(name, value)
171
+ __send__("#{name}=", value)
172
+ end unless method_defined?(:[]=)
173
+
174
+ def |(other)
175
+ self.class[other.to_hash.merge(to_hash)]
176
+ end
177
+
178
+ def as_json(*)
179
+ { JSON.create_id => self.class.name }.merge to_hash
180
+ end
181
+
182
+ def to_json(*a)
183
+ as_json.to_json(*a)
184
+ end
173
185
  end
174
- end
175
-
176
- end # JSON
186
+
187
+ end # JSON
188
+ end
data/lib/oj/mimic.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: false
1
2
 
2
3
  require 'bigdecimal'
3
4
  begin
@@ -64,6 +65,8 @@ module Oj
64
65
  self.store(:allow_nan, true)
65
66
  self.store(:quirks_mode, oo[:quirks_mode])
66
67
  self.store(:ascii_only, (:ascii == oo[:escape_mode]))
68
+
69
+ super
67
70
  end
68
71
 
69
72
  def []=(key, value)
@@ -102,6 +105,7 @@ module Oj
102
105
  def as_json(*)
103
106
  name = self.class.name.to_s
104
107
  raise JSON::JSONError, "Only named structs are supported!" if 0 == name.length
108
+
105
109
  { JSON.create_id => name, 't' => table }
106
110
  end
107
111
  end
@@ -232,6 +236,7 @@ module Oj
232
236
  def as_json(*)
233
237
  name = self.class.name.to_s
234
238
  raise JSON::JSONError, "Only named structs are supported!" if 0 == name.length
239
+
235
240
  { JSON.create_id => name, 'v' => values }
236
241
  end
237
242
  end
@@ -263,7 +268,7 @@ module Oj
263
268
  end
264
269
  end
265
270
  def self.json_create(h)
266
- if usec = h.delete('u')
271
+ if (usec = h.delete('u'))
267
272
  h['n'] = usec * 1000
268
273
  end
269
274
  if instance_methods.include?(:tv_nsec)
@@ -273,7 +278,6 @@ module Oj
273
278
  end
274
279
  end
275
280
  end
276
-
277
281
  end # self.mimic_loaded
278
282
 
279
283
  end # Oj
data/lib/oj/saj.rb CHANGED
@@ -1,11 +1,17 @@
1
1
  module Oj
2
- # A SAX style parse handler for JSON hence the acronym SAJ for Simple API for
3
- # JSON. The Oj::Saj handler class should be subclassed and then used with the
4
- # Oj::Saj key_parse() method. The Saj methods will then be called as the file
5
- # is parsed.
2
+ # A SAX style parse handler for JSON hence the acronym SAJ for Simple API
3
+ # for JSON. The Oj::Saj handler class can be subclassed and then used with
4
+ # the Oj::Saj key_parse() method or with the more resent
5
+ # Oj::Parser.new(:saj). The Saj methods will then be called as the file is
6
+ # parsed.
7
+ #
8
+ # With Oj::Parser.new(:saj) each method can also include a line and column
9
+ # argument so hash_start(key) could also be hash_start(key, line,
10
+ # column). The error() method is no used with Oj::Parser.new(:saj) so it
11
+ # will never be called.
6
12
  #
7
13
  # @example
8
- #
14
+ #
9
15
  # require 'oj'
10
16
  #
11
17
  # class MySaj < ::Oj::Saj
@@ -23,6 +29,14 @@ module Oj
23
29
  # Oj.saj_parse(cnt, f)
24
30
  # end
25
31
  #
32
+ # or
33
+ #
34
+ # p = Oj::Parser.new(:saj)
35
+ # p.handler = MySaj.new()
36
+ # File.open('any.json', 'r') do |f|
37
+ # p.parse(f.read)
38
+ # end
39
+ #
26
40
  # To make the desired methods active while parsing the desired method should
27
41
  # be made public in the subclasses. If the methods remain private they will
28
42
  # not be called during parsing.
@@ -61,6 +75,6 @@ module Oj
61
75
 
62
76
  def error(message, line, column)
63
77
  end
64
-
78
+
65
79
  end # Saj
66
80
  end # Oj
data/lib/oj/state.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  module JSON
3
2
  module Ext
4
3
  module Generator
@@ -59,6 +58,7 @@ module JSON
59
58
 
60
59
  def configure(opts)
61
60
  raise TypeError.new('expected a Hash') unless opts.respond_to?(:to_h)
61
+
62
62
  @attrs.merge!(opts.to_h)
63
63
  end
64
64
 
@@ -80,10 +80,11 @@ module JSON
80
80
  # @param [Symbol] m method symbol
81
81
  # @return [Boolean] true for any method that matches an instance
82
82
  # variable reader, otherwise false.
83
- def respond_to?(m)
83
+ def respond_to?(m, include_all = false)
84
84
  return true if super
85
85
  return true if has_key?(key)
86
86
  return true if has_key?(key.to_s)
87
+
87
88
  has_key?(key.to_sym)
88
89
  end
89
90
 
@@ -113,15 +114,17 @@ module JSON
113
114
  def method_missing(m, *args, &block)
114
115
  if m.to_s.end_with?('=')
115
116
  raise ArgumentError.new("wrong number of arguments (#{args.size} for 1 with #{m}) to method #{m}") if args.nil? or 1 != args.length
117
+
116
118
  m = m.to_s[0..-2]
117
119
  m = m.to_sym
118
120
  return @attrs.store(m, args[0])
119
- end
120
- if @attrs.has_key?(m.to_sym)
121
+ end
122
+ if @attrs.has_key?(m.to_sym)
121
123
  raise ArgumentError.new("wrong number of arguments (#{args.size} for 0 with #{m}) to method #{m}") unless args.nil? or args.empty?
124
+
122
125
  return @attrs[m.to_sym]
123
- end
124
- return @attrs.send(m, *args, &block)
126
+ end
127
+ return @attrs.send(m, *args, &block)
125
128
  end
126
129
 
127
130
  end # State
data/lib/oj/version.rb CHANGED
@@ -1,5 +1,4 @@
1
-
2
1
  module Oj
3
2
  # Current version of the module.
4
- VERSION = '3.13.9'
3
+ VERSION = '3.16.1'
5
4
  end
data/lib/oj.rb CHANGED
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
1
2
 
3
+ # Oj module is defined in oj.c.
2
4
  module Oj
3
5
  end
4
6
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Ruby**
4
4
 
5
- Oj is compatible with Ruby 2.0.0, 2.1, 2.2, 2.3, 2.4 and RBX.
5
+ Oj is compatible with Ruby 2.4+ and RBX.
6
6
  Support for JRuby has been removed as JRuby no longer supports C extensions and
7
7
  there are bugs in the older versions that are not being fixed.
8
8
 
@@ -0,0 +1,20 @@
1
+ # Oj Install Options
2
+
3
+ ### Enable trace log
4
+
5
+ ```
6
+ $ gem install oj -- --enable-trace-log
7
+ ```
8
+
9
+ To enable Oj trace feature, it uses `--enable-trace-log` option when installing the gem.
10
+ Then, the trace logs will be displayed when `:trace` option is set to `true`.
11
+
12
+
13
+ ### Enable SIMD instructions
14
+
15
+ ```
16
+ $ gem install oj -- --with-sse42
17
+ ```
18
+
19
+ To enable the use of SIMD instructions in Oj, it uses the `--with-sse42` option when installing the gem.
20
+ This will enable the use of the SSE4.2 instructions in the internal.
data/pages/JsonGem.md CHANGED
@@ -1,3 +1,18 @@
1
+ # JSON Quickstart
2
+
3
+ To have Oj universally "take over" many methods on the JSON constant (`load`, `parse`, etc.) with
4
+ their faster Oj counterparts, in a mode that is compatible with the json gem:
5
+
6
+ ```ruby
7
+ Oj.mimic_JSON()
8
+ ```
9
+
10
+ If the project does not already use the json gem, `JSON` will become available.
11
+ If the project does require the json gem, `Oj.mimic_JSON()` should be invoked after the
12
+ json gem has been required.
13
+
14
+ For more details and options, read on...
15
+
1
16
  # Oj JSON Gem Compatibility
2
17
 
3
18
  The `:compat` mode mimics the json gem. The json gem is built around the use
data/pages/Modes.md CHANGED
@@ -39,7 +39,8 @@ if a non-native type is encountered instead of raising an Exception.
39
39
  The `:compat` mode mimics the json gem. The json gem is built around the use
40
40
  of the `to_json(*)` method defined for a class. Oj attempts to provide the
41
41
  same functionality by being a drop in replacement with a few
42
- exceptions. [{file:JsonGem.md}](JsonGem.md) includes more details on
42
+ exceptions. To universally replace many `JSON` methods with their faster Oj counterparts,
43
+ simply run `Oj.mimic_json`. [{file:JsonGem.md}](JsonGem.md) includes more details on
43
44
  compatibility and use.
44
45
 
45
46
  ## :rails Mode
@@ -108,11 +109,11 @@ information.
108
109
  | :float_precision | Fixnum | x | x | | | | x | |
109
110
  | :hash_class | Class | | | x | x | | x | |
110
111
  | :ignore | Array | | | | | x | x | |
111
- | :indent | Integer | x | x | 3 | 4 | x | x | x |
112
+ | :indent | Integer | x | x | 4 | 4 | x | x | x |
112
113
  | :indent_str | String | | | x | x | | x | |
113
114
  | :integer_range | Range | x | x | x | x | x | x | x |
114
115
  | :match_string | Hash | | | x | x | | x | |
115
- | :max_nesting | Fixnum | 4 | 4 | x | | 5 | 4 | |
116
+ | :max_nesting | Fixnum | 5 | 5 | x | | 5 | 5 | |
116
117
  | :mode | Symbol | - | - | - | - | - | - | |
117
118
  | :nan | Symbol | | | | | | x | |
118
119
  | :nilnil | Boolean | | | | | | x | |
@@ -140,6 +141,8 @@ information.
140
141
  3. By default the bigdecimal_as decimal is not set and the default encoding
141
142
  for Rails is as a string. Setting the value to true will encode a
142
143
  BigDecimal as a number which breaks compatibility.
144
+ Note: after version 3.11.3 both `Oj.generate` and `JSON.generate`
145
+ will not honour this option in Rails Mode, detais on https://github.com/ohler55/oj/pull/716.
143
146
 
144
147
  4. The integer indent value in the default options will be honored by since
145
148
  the json gem expects a String type the indent in calls to 'to_json()',
data/pages/Options.md CHANGED
@@ -66,6 +66,10 @@ Determines how to load decimals.
66
66
 
67
67
  - `:auto` the most precise for the number of digits is used.
68
68
 
69
+ - `:fast` faster conversion to Float.
70
+
71
+ - `:ruby` convert to Float using the Ruby `to_f` conversion.
72
+
69
73
  This can also be set with `:decimal_class` when used as a load or
70
74
  parse option to match the JSON gem. In that case either `Float`,
71
75
  `BigDecimal`, or `nil` can be provided.
@@ -154,6 +158,8 @@ Determines the characters to escape when dumping. Only the :ascii and
154
158
 
155
159
  - `:json` follows the JSON specification. This is the default mode.
156
160
 
161
+ - `:slash` escapes `/` characters.
162
+
157
163
  - `:xss_safe` escapes HTML and XML characters such as `&` and `<`.
158
164
 
159
165
  - `:ascii` escapes all non-ascii or characters with the hi-bit set.
@@ -259,6 +265,10 @@ to true.
259
265
 
260
266
  The number of digits after the decimal when dumping the seconds of time.
261
267
 
268
+ ### :skip_null_byte [Boolean]
269
+
270
+ If true, null bytes in strings will be omitted when dumping.
271
+
262
272
  ### :space
263
273
 
264
274
  String inserted after the ':' character when dumping a JSON object. The
data/pages/Rails.md CHANGED
@@ -1,3 +1,15 @@
1
+ # Rails Quickstart
2
+
3
+ To universally replace Rails' use of the json gem with Oj, and also
4
+ have Oj "take over" many methods on the JSON constant (`load`, `parse`, etc.) with
5
+ their faster Oj counterparts, add this to an initializer:
6
+
7
+ ```ruby
8
+ Oj.optimize_rails()
9
+ ```
10
+
11
+ For more details and options, read on...
12
+
1
13
  # Oj Rails Compatibility
2
14
 
3
15
  The `:rails` mode mimics the ActiveSupport version 5 encoder. Rails and