rapidjson 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9399c5d53ffb32742313e2ad6016a63329dd28a8095aa07946997c500c5ea073
4
- data.tar.gz: 36af0427268da02dc2d58c6ba2f18d68e559992f7793e1761cf448f3094bd96c
3
+ metadata.gz: 4824f0636d8f801de840ebf32bd639258ce1e21a063228beaabd2b4ad6e1760a
4
+ data.tar.gz: 04bdbf36fdfd8b2ef289d8ba6e68b9d34c731cd1ffae61c154dd276ed56dc35e
5
5
  SHA512:
6
- metadata.gz: 231d6b2853f377ce7771e6602a1f1eb320dced2330f149b3b0b3ee0d42000ecf7511e7262aea67a02f0e4f2ecfa59f1e3a7009c79f1327816744fe59e6da1a73
7
- data.tar.gz: b8e2c77b789a41ce104e29c830bc4281e492e1d05113f8e4cb3497a8c89f2a7dbd6e1d2f95ebdb145c5f7f30a625bf7963e97c27cc3032613a2bbfda45807ee7
6
+ metadata.gz: 74f3d0a620d505b0aa55601830f294794e8a938ee087d9fcc228fc6a83452c2b255b1ddf9c0b3aea1d086808259e6f75744fcd6fb9528361090d2bea9d35a612
7
+ data.tar.gz: cff30c2bafab60f467ee59cf8a63691f93dd2de1fb5f07573e54a1303f3f279f9100ec9e1c6991cf5c9e874c25df3f6dd52b3e549aef3e510d0d068ce50f9877
data/README.md CHANGED
@@ -73,13 +73,10 @@ Many of these optimization can be found in all popular Ruby JSON libraries
73
73
  yajl 35.510 (± 2.8%) i/s - 180.000 in 5.070803s
74
74
  json 22.105 (± 0.0%) i/s - 112.000 in 5.067063s
75
75
  oj 15.163 (± 6.6%) i/s - 76.000 in 5.042864s
76
- fast_jsonparser 10.791 (± 0.0%) i/s - 54.000 in 5.004290s
77
76
  rapidjson 148.263 (± 2.0%) i/s - 742.000 in 5.006370s
78
77
  ```
79
78
  Notes: oj seems unusually bad at this test, and is usually faster than yajl and
80
79
  json, and comparable to rapidjson.
81
- `fast_jsonparser` has been slow since Ruby 3.0, likely a bug, if fixed I'd
82
- expect it to be the fasest JSON parser.
83
80
 
84
81
  Other libraries may include modes to avoid constructing all objects. Currently
85
82
  RapidJSON only focuses on the patterns and APIs users are likely to actually
@@ -91,6 +88,27 @@ I spent a week working on YAJL/yajl-ruby, and though I really liked the library,
91
88
 
92
89
  However, if you're happy with your current Ruby JSON library (including `json`) you should keep using it. They're all very good.
93
90
 
91
+ ## JSON gem compatibility
92
+
93
+ Contrary to some other JSON libraries, `RapidJSON` doesn't provice a monkey patch to entirely replace the stdlib JSON gem.
94
+
95
+ However it does provide a module that behave like the stdlib JSON gem and that can be used to monkey patch existing code.
96
+
97
+ ```ruby
98
+ module SomeLibrary
99
+ def do_stuff(payload)
100
+ JSON.parse(payload)
101
+ end
102
+ end
103
+ ```
104
+
105
+ ```ruby
106
+ SomeLibrary::JSON = RapidJSON::JSONGem
107
+ ```
108
+
109
+ Note that this module only use `RapidJSON` when it's certain it is safe to do so. If the JSON gem is called with
110
+ some options that `RapidJSON` doesn't support, it automatically fallbacks to calling the JSON gem.
111
+
94
112
  ## Development
95
113
 
96
114
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -8,6 +8,7 @@ class RubyStringBuffer {
8
8
 
9
9
  RubyStringBuffer() : used(0), capacity(INITIAL_SIZE) {
10
10
  ruby_string = rb_str_buf_new(INITIAL_SIZE);
11
+ rb_enc_associate(ruby_string, rb_utf8_encoding());
11
12
  mem = RSTRING_PTR(ruby_string);
12
13
  }
13
14
 
@@ -4,31 +4,32 @@
4
4
  #include "rapidjson/prettywriter.h"
5
5
  #include "rapidjson/error/en.h"
6
6
 
7
- static VALUE rb_mRapidjson;
8
7
  static VALUE rb_eParseError;
9
8
  static VALUE rb_eEncodeError;
10
-
11
- static ID id_to_json;
12
- static ID id_to_s;
9
+ static VALUE rb_cRapidJSONFragment;
13
10
 
14
11
  #include "encoder.hh"
15
12
  #include "parser.hh"
13
+ #include "json_escape.h"
16
14
 
17
15
  using namespace rapidjson;
18
16
 
19
17
  typedef RubyStringBuffer DefaultBuffer;
20
18
 
21
- VALUE encode(VALUE _self, VALUE obj) {
22
- RubyObjectEncoder<DefaultBuffer, Writer<DefaultBuffer> > encoder;
23
- return encoder.encode(obj);
24
- }
25
-
26
- VALUE pretty_encode(VALUE _self, VALUE obj) {
27
- RubyObjectEncoder<DefaultBuffer, PrettyWriter<DefaultBuffer> > encoder;
28
- return encoder.encode(obj);
19
+ static VALUE
20
+ dump(VALUE _self, VALUE obj, VALUE pretty, VALUE as_json, VALUE allow_nan) {
21
+ // NB: as_json here is not marked by the extension, but is always on the stack
22
+ if (RTEST(pretty)) {
23
+ RubyObjectEncoder<DefaultBuffer, PrettyWriter<DefaultBuffer> > encoder(as_json, RTEST(allow_nan));
24
+ return encoder.encode(obj);
25
+ } else {
26
+ RubyObjectEncoder<DefaultBuffer, Writer<DefaultBuffer> > encoder(as_json, RTEST(allow_nan));
27
+ return encoder.encode(obj);
28
+ }
29
29
  }
30
30
 
31
- VALUE parse(VALUE _self, VALUE string) {
31
+ static VALUE
32
+ load(VALUE _self, VALUE string) {
32
33
  RubyObjectHandler handler;
33
34
  Reader reader;
34
35
  char *cstring = StringValueCStr(string); // fixme?
@@ -43,7 +44,8 @@ VALUE parse(VALUE _self, VALUE string) {
43
44
  return handler.GetRoot();
44
45
  }
45
46
 
46
- VALUE valid_json_p(VALUE _self, VALUE string) {
47
+ static VALUE
48
+ valid_json_p(VALUE _self, VALUE string) {
47
49
  NullHandler handler;
48
50
  Reader reader;
49
51
  char *cstring = StringValueCStr(string); // fixme?
@@ -60,18 +62,18 @@ VALUE valid_json_p(VALUE _self, VALUE string) {
60
62
  extern "C" void
61
63
  Init_rapidjson(void)
62
64
  {
63
- id_to_s = rb_intern("to_s");
64
- id_to_json = rb_intern("to_json");
65
+ VALUE rb_mRapidJSON = rb_const_get(rb_cObject, rb_intern("RapidJSON"));
66
+ VALUE rb_cCoder = rb_const_get(rb_mRapidJSON, rb_intern("Coder"));
67
+ rb_cRapidJSONFragment = rb_const_get(rb_mRapidJSON, rb_intern("Fragment"));;
68
+ rb_global_variable(&rb_cRapidJSONFragment);
65
69
 
66
- rb_mRapidjson = rb_define_module("RapidJSON");
67
- rb_define_module_function(rb_mRapidjson, "encode", encode, 1);
68
- rb_define_module_function(rb_mRapidjson, "pretty_encode", pretty_encode, 1);
69
- rb_define_module_function(rb_mRapidjson, "dump", encode, 1);
70
+ rb_define_private_method(rb_cCoder, "_dump", dump, 4);
71
+ rb_define_method(rb_cCoder, "load", load, 1);
72
+ rb_define_method(rb_cCoder, "valid_json?", valid_json_p, 1);
70
73
 
71
- rb_define_module_function(rb_mRapidjson, "parse", parse, 1);
72
- rb_define_module_function(rb_mRapidjson, "load", parse, 1);
73
- rb_define_module_function(rb_mRapidjson, "valid_json?", valid_json_p, 1);
74
+ VALUE rb_eRapidJSONError = rb_const_get(rb_mRapidJSON, rb_intern("Error"));
75
+ rb_eParseError = rb_define_class_under(rb_mRapidJSON, "ParseError", rb_eRapidJSONError);
76
+ rb_eEncodeError = rb_define_class_under(rb_mRapidJSON, "EncodeError", rb_eRapidJSONError);
74
77
 
75
- rb_eParseError = rb_define_class_under(rb_mRapidjson, "ParseError", rb_eStandardError);
76
- rb_eEncodeError = rb_define_class_under(rb_mRapidjson, "EncodeError", rb_eStandardError);
78
+ rb_define_singleton_method(rb_mRapidJSON, "json_escape", escape_json, 1);
77
79
  }
@@ -9,33 +9,60 @@ template <typename B = RubyStringBuffer, typename W=Writer<B> >
9
9
  class RubyObjectEncoder {
10
10
  B buf;
11
11
  W writer;
12
+ VALUE as_json;
13
+ bool allow_nan;
12
14
 
13
15
  void encode_array(VALUE ary) {
14
16
  writer.StartArray();
15
17
  int length = RARRAY_LEN(ary);
16
18
  RARRAY_PTR_USE(ary, ptr, {
17
19
  for (int i = 0; i < length; i++) {
18
- encode_any(ptr[i]);
20
+ encode_any(ptr[i], true);
19
21
  }
20
22
  });
21
23
  writer.EndArray();
22
24
  }
23
25
 
26
+ static VALUE string_to_utf8_compatible(VALUE str) {
27
+ rb_encoding *enc = rb_enc_get(str);
28
+ if (enc == rb_utf8_encoding() || enc == rb_usascii_encoding()) {
29
+ return str;
30
+ } else {
31
+ return rb_str_export_to_enc(str, rb_utf8_encoding());
32
+ }
33
+ }
34
+
24
35
  void encode_key(VALUE key) {
25
36
  switch(rb_type(key)) {
37
+ case T_STRING:
38
+ break;
26
39
  case T_SYMBOL:
27
40
  key = rb_sym2str(key);
28
- /* FALLTHRU */
29
- case T_STRING:
30
- writer.Key(RSTRING_PTR(key), RSTRING_LEN(key), false);
31
- return;
41
+ break;
42
+ case T_FIXNUM:
43
+ case T_BIGNUM:
44
+ key = rb_String(key);
45
+ break;
32
46
  default:
33
- {
34
- VALUE str = rb_funcall(key, id_to_s, 0);
47
+ if (NIL_P(as_json)) {
48
+ rb_raise(rb_eTypeError, "Invalid object key type: %" PRIsVALUE, rb_obj_class(key));
49
+ UNREACHABLE_RETURN();
50
+ }
51
+
52
+ VALUE args[2] = { key, Qtrue };
53
+ key = rb_proc_call_with_block(as_json, 2, args, Qnil);
54
+ if (rb_obj_class(key) == rb_cRapidJSONFragment) {
55
+ VALUE str = rb_struct_aref(key, INT2FIX(0));
35
56
  Check_Type(str, T_STRING);
36
- encode_string(str);
57
+ return encode_raw_json_str(str);
37
58
  }
59
+
60
+ break;
38
61
  }
62
+
63
+ Check_Type(key, T_STRING);
64
+ key = string_to_utf8_compatible(key);
65
+ writer.Key(RSTRING_PTR(key), RSTRING_LEN(key), false);
39
66
  }
40
67
 
41
68
  static int encode_hash_i_cb(VALUE key, VALUE val, VALUE ctx) {
@@ -46,7 +73,7 @@ class RubyObjectEncoder {
46
73
 
47
74
  void encode_hash_i(VALUE key, VALUE val) {
48
75
  encode_key(key);
49
- encode_any(val);
76
+ encode_any(val, true);
50
77
  }
51
78
 
52
79
  void encode_hash(VALUE hash) {
@@ -60,27 +87,48 @@ class RubyObjectEncoder {
60
87
  }
61
88
 
62
89
  void encode_bignum(VALUE b) {
63
- b = rb_big_norm(b);
64
- if (FIXNUM_P(b)) {
65
- return encode_fixnum(b);
66
- }
67
-
68
- bool negative = rb_big_cmp(b, INT2FIX(0)) == INT2FIX(-1);
69
- if (negative) {
70
- long long ll = rb_big2ll(b);
71
- writer.Int64(ll);
72
- } else {
73
- unsigned long long ull = rb_big2ull(b);
74
- writer.Uint64(ull);
75
- }
90
+ // Some T_BIGNUM might be small enough to fit in long long or unsigned long long
91
+ // but this being the slow path, it's not really worth it.
92
+ VALUE str = rb_String(b);
93
+ Check_Type(str, T_STRING);
94
+
95
+ // We should be able to use RawNumber here, but it's buggy
96
+ // https://github.com/Tencent/rapidjson/issues/852
97
+ writer.RawValue(RSTRING_PTR(str), RSTRING_LEN(str), kNumberType);
76
98
  }
77
99
 
78
- void encode_float(VALUE v) {
100
+ void encode_float(VALUE v, bool generic) {
79
101
  double f = rb_float_value(v);
80
- writer.Double(f);
102
+ if (!isfinite(f)) {
103
+ if (!allow_nan && !NIL_P(as_json) && generic) {
104
+ return encode_generic(v);
105
+ }
106
+ if (f == (-1.0 / 0.0)) {
107
+ if (allow_nan) {
108
+ writer.RawValue("-Infinity", 9, kObjectType);
109
+ } else {
110
+ rb_raise(rb_eEncodeError, "-Float::INFINITY is not allowed in JSON");
111
+ }
112
+ } else if (isinf(f)) {
113
+ if (allow_nan) {
114
+ writer.RawValue("Infinity", 8, kObjectType);
115
+ } else {
116
+ rb_raise(rb_eEncodeError, "Float::INFINITY is not allowed in JSON");
117
+ }
118
+ } else if (isnan(f)) {
119
+ if (allow_nan) {
120
+ writer.RawValue("NaN", 3, kObjectType);
121
+ } else {
122
+ rb_raise(rb_eEncodeError, "Float::NAN is not allowed in JSON");
123
+ }
124
+ }
125
+ } else {
126
+ writer.Double(f);
127
+ }
81
128
  }
82
129
 
83
130
  void encode_string(VALUE v) {
131
+ v = string_to_utf8_compatible(v);
84
132
  writer.String(RSTRING_PTR(v), RSTRING_LEN(v), false);
85
133
  }
86
134
 
@@ -92,22 +140,20 @@ class RubyObjectEncoder {
92
140
  const char *cstr = RSTRING_PTR(s);
93
141
  size_t len = RSTRING_LEN(s);
94
142
 
95
- writer.RawValue(cstr, len, kObjectType);
143
+ writer.RawValue(cstr, len, kObjectType);
96
144
  }
97
145
 
98
146
  void encode_generic(VALUE obj) {
99
- if (rb_respond_to(obj, id_to_json)) {
100
- VALUE str = rb_funcall(obj, id_to_json, 0);
101
- Check_Type(str, T_STRING);
102
- encode_raw_json_str(str);
103
- } else {
104
- VALUE str = rb_funcall(obj, id_to_s, 0);
105
- Check_Type(str, T_STRING);
106
- encode_string(str);
147
+ if (NIL_P(as_json)) {
148
+ rb_raise(rb_eTypeError, "Don't know how to serialize %" PRIsVALUE " to JSON", rb_obj_class(obj));
149
+ UNREACHABLE_RETURN();
107
150
  }
151
+
152
+ VALUE args[2] = { obj, Qfalse };
153
+ encode_any(rb_proc_call_with_block(as_json, 2, args, Qnil), false);
108
154
  }
109
155
 
110
- void encode_any(VALUE v) {
156
+ void encode_any(VALUE v, bool generic) {
111
157
  switch(rb_type(v)) {
112
158
  case T_NIL:
113
159
  writer.Null();
@@ -123,7 +169,7 @@ class RubyObjectEncoder {
123
169
  case T_BIGNUM:
124
170
  return encode_bignum(v);
125
171
  case T_FLOAT:
126
- return encode_float(v);
172
+ return encode_float(v, generic);
127
173
  case T_HASH:
128
174
  return encode_hash(v);
129
175
  case T_ARRAY:
@@ -132,19 +178,32 @@ class RubyObjectEncoder {
132
178
  return encode_string(v);
133
179
  case T_SYMBOL:
134
180
  return encode_symbol(v);
181
+ case T_STRUCT:
182
+ if (rb_obj_class(v) == rb_cRapidJSONFragment) {
183
+ VALUE str = rb_struct_aref(v, INT2FIX(0));
184
+ Check_Type(str, T_STRING);
185
+ return encode_raw_json_str(str);
186
+ }
187
+ // fall through
135
188
  default:
136
- encode_generic(v);
189
+ if (generic) {
190
+ encode_generic(v);
191
+ } else {
192
+ rb_raise(rb_eTypeError, "Don't know how to serialize %" PRIsVALUE " to JSON", rb_obj_class(v));
193
+ }
137
194
  }
138
195
  }
139
196
 
140
197
  public:
141
- RubyObjectEncoder(): buf(), writer(buf), depth(0) {
198
+ RubyObjectEncoder(VALUE as_json_proc, bool allow_nan_): buf(), writer(buf), depth(0) {
199
+ as_json = as_json_proc;
200
+ allow_nan = allow_nan_;
142
201
  };
143
202
 
144
203
  int depth;
145
204
 
146
205
  VALUE encode(VALUE obj) {
147
- encode_any(obj);
206
+ encode_any(obj, true);
148
207
  return buf.GetRubyString();
149
208
  }
150
209
  };
@@ -14,6 +14,6 @@ $CXXFLAGS += " -fsanitize=address"
14
14
  $LDFLAGS += " -fsanitize=address"
15
15
  end
16
16
 
17
- have_func("rb_interned_str", "ruby.h")
17
+ have_func("rb_enc_interned_str", "ruby.h")
18
18
 
19
19
  create_makefile("rapidjson/rapidjson")
@@ -63,10 +63,10 @@ struct RubyObjectHandler : public BaseReaderHandler<UTF8<>, RubyObjectHandler> {
63
63
  }
64
64
 
65
65
  bool Key(const char* str, SizeType length, bool copy) {
66
- #ifdef HAVE_RB_INTERNED_STR
66
+ #ifdef HAVE_RB_ENC_INTERNED_STR
67
67
  VALUE val = rb_enc_interned_str(str, length, rb_utf8_encoding());
68
68
  #else
69
- VALUE val = rb_str_new(str, length);
69
+ VALUE val = rb_enc_str_new(str, length, rb_utf8_encoding());
70
70
  #endif
71
71
  return PutKey(val);
72
72
  }
@@ -0,0 +1,26 @@
1
+ module RapidJSON
2
+ class ActiveSupportEncoder
3
+ def initialize(options = nil)
4
+ @options = options
5
+ @coder = RapidJSON::Coder.new do |value, is_key|
6
+ if is_key
7
+ value.to_s
8
+ else
9
+ value.as_json
10
+ end
11
+ end
12
+ end
13
+
14
+ # Encode the given object into a JSON string
15
+ def encode(value)
16
+ if @options && !@options.empty?
17
+ value = value.as_json(@options.dup)
18
+ end
19
+ json = @coder.dump(value)
20
+ if ActiveSupport::JSON::Encoding.escape_html_entities_in_json
21
+ json = RapidJSON.json_escape(json)
22
+ end
23
+ json
24
+ end
25
+ end
26
+ end
@@ -1,36 +1,87 @@
1
- module ::Kernel
2
- def JSON(object, opts = {})
3
- if object.respond_to? :to_s
4
- JSON.parse(object.to_s)
5
- else
6
- JSON.generate(object, opts)
1
+ require "json"
2
+
3
+ module RapidJSON
4
+ module JSONGem
5
+ GeneratorError = RapidJSON::EncodeError
6
+
7
+ GEM = ::JSON
8
+ private_constant :GEM
9
+
10
+ STATE = ::JSON::State.new
11
+ private_constant :STATE
12
+
13
+ TO_JSON_PROC = lambda do |object, is_key|
14
+ if !is_key && object.respond_to?(:to_json)
15
+ if Float === object
16
+ # Avoid calling .to_json on NaN/Infinity/-Infinity
17
+ # Prefers our exception to one raised by ::JSON
18
+ object
19
+ else
20
+ Fragment.new(object.to_json(STATE))
21
+ end
22
+ elsif object.respond_to?(:to_s)
23
+ object.to_s
24
+ else
25
+ raise TypeError, "Can't serialize #{object.class} to JSON"
26
+ end
7
27
  end
8
- end
9
- end
28
+ private_constant :TO_JSON_PROC
10
29
 
11
- module JSON
12
- def self.generate(obj, opts=nil)
13
- RapidJSON.encode(obj)
14
- end
30
+ GENERATE_CODER = Coder.new(&TO_JSON_PROC)
31
+ private_constant :GENERATE_CODER
15
32
 
16
- def self.pretty_generate(obj, opts=nil)
17
- RapidJSON.pretty_encode(obj)
18
- end
33
+ DUMP_CODER = Coder.new(allow_nan: true, &TO_JSON_PROC)
34
+ private_constant :DUMP_CODER
19
35
 
20
- def self.dump(obj)
21
- RapidJSON.encode(obj)
22
- end
23
- end
36
+ PRETTY_CODER = Coder.new(pretty: true, &TO_JSON_PROC)
37
+ private_constant :PRETTY_CODER
24
38
 
25
- # to_json
26
- module RapidJSON
27
- module JSONGemCompact
28
- def to_json(opts=nil)
29
- RapidJSON.encode(self)
39
+ # Note, we very explictly fallback to the JSON gem when we receive unknown options.
40
+ # Unknown options may be required for security reasons (e.g. escape_slash: true)
41
+ # so ignoring them could lead to security vulnerabilities.
42
+ class << self
43
+ def load(string, proc = nil, options = nil)
44
+ if proc.nil? && options.nil?
45
+ DEFAULT_CODER.load(string)
46
+ else
47
+ GEM.load(string, proc, options)
48
+ end
49
+ end
50
+
51
+ def parse(string, opts = nil)
52
+ if opts.nil?
53
+ DEFAULT_CODER.load(string)
54
+ else
55
+ GEM.load(string, options)
56
+ end
57
+ end
58
+
59
+ def dump(object, anIO = nil, limit = nil)
60
+ if anIO.nil? && limit.nil?
61
+ DUMP_CODER.dump(object)
62
+ else
63
+ GEM.dump(object, anIO, limit)
64
+ end
65
+ end
66
+
67
+ def generate(object, opts = nil)
68
+ if opts.nil?
69
+ GENERATE_CODER.dump(object)
70
+ else
71
+ GEM.generate(object, opts)
72
+ end
73
+ end
74
+
75
+ private
76
+
77
+ def method_missing(name, *args)
78
+ GEM.public_send(name, *args)
79
+ end
80
+ ruby2_keywords :method_missing
81
+
82
+ def respond_to_missing?(name, include_private = false)
83
+ GEM.respond_to?(name, include_private)
84
+ end
30
85
  end
31
86
  end
32
87
  end
33
-
34
- [Hash, Array, String, Integer, Float, TrueClass, FalseClass, NilClass].each do |klass|
35
- klass.include RapidJSON::JSONGemCompact
36
- end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rapidjson
4
- VERSION = "0.1.1"
3
+ module RapidJSON
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/rapidjson.rb CHANGED
@@ -1,9 +1,54 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "rapidjson/version"
4
- require_relative "rapidjson/rapidjson"
5
4
 
6
- module Rapidjson
5
+ module RapidJSON
7
6
  class Error < StandardError; end
8
- # Your code goes here...
7
+
8
+ Fragment = Struct.new(:to_json)
9
+
10
+ class Coder
11
+ def initialize(pretty: false, allow_nan: false, &to_json)
12
+ @pretty = pretty
13
+ @to_json_proc = to_json
14
+ @allow_nan = allow_nan
15
+ end
16
+
17
+ def dump(object)
18
+ _dump(object, @pretty, @to_json_proc, @allow_nan)
19
+ end
20
+ end
21
+ end
22
+
23
+ require_relative "rapidjson/rapidjson"
24
+
25
+ module RapidJSON
26
+ class << self
27
+ def load(string)
28
+ DEFAULT_CODER.load(string)
29
+ end
30
+ alias_method :parse, :load
31
+
32
+ def dump(object)
33
+ DEFAULT_CODER.dump(object)
34
+ end
35
+ alias_method :encode, :dump
36
+
37
+ def pretty_encode(object)
38
+ PRETTY_CODER.dump(object)
39
+ end
40
+
41
+ def valid_json?(string)
42
+ DEFAULT_CODER.valid_json?(string)
43
+ end
44
+ end
45
+
46
+ DEFAULT_CODER = Coder.new
47
+ private_constant :DEFAULT_CODER
48
+
49
+ PRETTY_CODER = Coder.new(pretty: true)
50
+ private_constant :PRETTY_CODER
9
51
  end
52
+
53
+ require "rapidjson/json_gem"
54
+ require "rapidjson/active_support_encoder"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rapidjson
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Hawthorn
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-05 00:00:00.000000000 Z
11
+ date: 2023-06-27 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Fast JSON encoder/decoder based using RapidJSON
14
14
  email:
@@ -67,6 +67,7 @@ files:
67
67
  - ext/rapidjson/rapidjson/include/rapidjson/uri.h
68
68
  - ext/rapidjson/rapidjson/include/rapidjson/writer.h
69
69
  - lib/rapidjson.rb
70
+ - lib/rapidjson/active_support_encoder.rb
70
71
  - lib/rapidjson/json_gem.rb
71
72
  - lib/rapidjson/version.rb
72
73
  homepage: https://github.com/jhawthorn/rapidjson
@@ -91,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
92
  - !ruby/object:Gem::Version
92
93
  version: '0'
93
94
  requirements: []
94
- rubygems_version: 3.3.3
95
+ rubygems_version: 3.4.10
95
96
  signing_key:
96
97
  specification_version: 4
97
98
  summary: Fast JSON encoder/decoder based using RapidJSON