fast_jsonparser 0.4.0 → 0.5.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b9a3639a83aa2f68468df13dcc8922b244c727c00b2e040a7dd94f9b3832698
4
- data.tar.gz: 49e6c154239a25e2ecc695288166914ee60a1500d7e2773ef25d05e39eddfa4d
3
+ metadata.gz: a696c8dcde3ac2ec599ab0d45bc3ef0f13da2823cbddacd13842337e50cd6200
4
+ data.tar.gz: 8be657884315230f3010b4713c9646150f95db5468f3fbc12124406df51b69a4
5
5
  SHA512:
6
- metadata.gz: '08ebbd273a4180261ab78c50874e7a5cf28afa7c1718be05fbc8bec93bd6652097c88ad2b0ac7eba184f4755a209cc0e9256551d04e1350ac1139d4141a50412'
7
- data.tar.gz: 6400ba1f5f0f0083b4c2a75f947888ab782695c66c676a1bb35011efde40b7ce2b1ab38d0fbbfc76eda50e80cef6194cc8bf495e3f8cb6b1aef0c8855bf2ed76
6
+ metadata.gz: 744771f5df6f8259ad6e75d631f8af6ba59ab6d00d94df78abbc0341d995045ba6bf5a32cffc1f476a9b48a5bce45d803c8f91c13c1fe840a2c6f931c8e549be
7
+ data.tar.gz: d14e73c088cd61d073a03d787075ea461750d7df3e1628c28398bc4f51ada3da4e6c4d036af2b9f81f16ede1ca28948fcd0fe49966b4756ee9c9f72ab63af81c
@@ -0,0 +1,35 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on:
11
+ push:
12
+ branches: [ master ]
13
+ pull_request:
14
+ branches: [ master ]
15
+
16
+ jobs:
17
+ test:
18
+
19
+ runs-on: ubuntu-latest
20
+
21
+ steps:
22
+ - uses: actions/checkout@v2
23
+ - name: Set up Ruby
24
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
25
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
26
+ # uses: ruby/setup-ruby@v1
27
+ uses: ruby/setup-ruby@ec106b438a1ff6ff109590de34ddc62c540232e0
28
+ with:
29
+ ruby-version: 2.6
30
+ - name: Install dependencies
31
+ run: bundle install
32
+ - name: Compile
33
+ run: bundle exec rake compile
34
+ - name: Run tests
35
+ run: bundle exec rake
@@ -1,3 +1,6 @@
1
+ # 0.5.0
2
+ * Handle concurrent use of the parser in [Issue #15](https://github.com/anilmaurya/fast_jsonparser/pull/15), thanks to [casperisfine](https://github.com/casperisfine)
3
+
1
4
  # 0.4.0
2
5
  * load_many accept batch_size parameter to parse documents larger than 1 MB in [PR #5](https://github.com/anilmaurya/fast_jsonparser/pull/5), thanks to [casperisfine](https://github.com/casperisfine)
3
6
  * Add option for symbolize_keys, default to true in [PR #9](https://github.com/anilmaurya/fast_jsonparser/pull/9), thanks to [casperisfine](https://github.com/casperisfine)
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fast_jsonparser (0.3.0)
4
+ fast_jsonparser (0.4.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -128,6 +128,15 @@ FastJsonparser.parse('{"one": 1, "two": 2}', symbolize_keys: false)
128
128
  FastJsonparser.parse("123: 1") # FastJsonparser::ParseError (parse error)
129
129
  ```
130
130
 
131
+ ### Known Incompatibilities with stdlib JSON
132
+
133
+ `FastJsonparser` behaves mostly like stdlib's `JSON`, but there are a few corner cases:
134
+
135
+ - `FastJsonparser` will use symbols for hash keys by default. You can pass `symbolize_names: false` to have strings instead like `JSON`.
136
+ - `FastJsonparser` will raise on integers outside of the 64bits range (`-9223372036854775808..18446744073709551615`), `JSON` will parse them fine.
137
+ - `FastJsonparser` will raise on invalid string escapings (`"\x15"`), `JSON` will often handle some of them.
138
+ - `FastJsonparser` will raise on `/**/` comments. `JSON` will sometimes ignore them, sometimes raise.
139
+
131
140
  ### Example
132
141
 
133
142
  ```
@@ -6,6 +6,38 @@ VALUE rb_eFastJsonparserUnknownError, rb_eFastJsonparserParseError;
6
6
 
7
7
  using namespace simdjson;
8
8
 
9
+ typedef struct {
10
+ dom::parser *parser;
11
+ } parser_t;
12
+
13
+ static void Parser_delete(void *ptr) {
14
+ parser_t *data = (parser_t*) ptr;
15
+ delete data->parser;
16
+ }
17
+
18
+ static size_t Parser_memsize(const void *parser) {
19
+ return sizeof(dom::parser); // TODO: low priority, figure the real size, e.g. internal buffers etc.
20
+ }
21
+
22
+ static const rb_data_type_t parser_data_type = {
23
+ "Parser",
24
+ { 0, Parser_delete, Parser_memsize, },
25
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY
26
+ };
27
+
28
+ static VALUE parser_allocate(VALUE klass) {
29
+ parser_t *data;
30
+ VALUE obj = TypedData_Make_Struct(klass, parser_t, &parser_data_type, data);
31
+ data->parser = new dom::parser;
32
+ return obj;
33
+ }
34
+
35
+ static inline dom::parser * get_parser(VALUE self) {
36
+ parser_t *data;
37
+ TypedData_Get_Struct(self, parser_t, &parser_data_type, data);
38
+ return data->parser;
39
+ }
40
+
9
41
  // Convert tape to Ruby's Object
10
42
  static VALUE make_ruby_object(dom::element element, bool symbolize_keys)
11
43
  {
@@ -70,9 +102,9 @@ static VALUE make_ruby_object(dom::element element, bool symbolize_keys)
70
102
  static VALUE rb_fast_jsonparser_parse(VALUE self, VALUE arg, VALUE symbolize_keys)
71
103
  {
72
104
  Check_Type(arg, T_STRING);
105
+ dom::parser *parser = get_parser(self);
73
106
 
74
- dom::parser parser;
75
- auto [doc, error] = parser.parse(RSTRING_PTR(arg), RSTRING_LEN(arg));
107
+ auto [doc, error] = parser->parse(RSTRING_PTR(arg), RSTRING_LEN(arg));
76
108
  if (error != SUCCESS)
77
109
  {
78
110
  rb_raise(rb_eFastJsonparserParseError, "%s", error_message(error));
@@ -83,9 +115,9 @@ static VALUE rb_fast_jsonparser_parse(VALUE self, VALUE arg, VALUE symbolize_key
83
115
  static VALUE rb_fast_jsonparser_load(VALUE self, VALUE arg, VALUE symbolize_keys)
84
116
  {
85
117
  Check_Type(arg, T_STRING);
118
+ dom::parser *parser = get_parser(self);
86
119
 
87
- dom::parser parser;
88
- auto [doc, error] = parser.load(RSTRING_PTR(arg));
120
+ auto [doc, error] = parser->load(RSTRING_PTR(arg));
89
121
  if (error != SUCCESS)
90
122
  {
91
123
  rb_raise(rb_eFastJsonparserParseError, "%s", error_message(error));
@@ -97,11 +129,10 @@ static VALUE rb_fast_jsonparser_load_many(VALUE self, VALUE arg, VALUE symbolize
97
129
  {
98
130
  Check_Type(arg, T_STRING);
99
131
  Check_Type(batch_size, T_FIXNUM);
132
+ dom::parser *parser = get_parser(self);
100
133
 
101
- try
102
- {
103
- dom::parser parser;
104
- auto [docs, error] = parser.load_many(RSTRING_PTR(arg), FIX2INT(batch_size));
134
+ try {
135
+ auto [docs, error] = parser->load_many(RSTRING_PTR(arg), FIX2INT(batch_size));
105
136
  if (error != SUCCESS)
106
137
  {
107
138
  rb_raise(rb_eFastJsonparserParseError, "%s", error_message(error));
@@ -126,10 +157,12 @@ extern "C"
126
157
  void Init_fast_jsonparser(void)
127
158
  {
128
159
  VALUE rb_mFastJsonparser = rb_const_get(rb_cObject, rb_intern("FastJsonparser"));
160
+ VALUE rb_cFastJsonparserNative = rb_const_get(rb_mFastJsonparser, rb_intern("Native"));
129
161
 
130
- rb_define_module_function(rb_mFastJsonparser, "_parse", reinterpret_cast<VALUE (*)(...)>(rb_fast_jsonparser_parse), 2);
131
- rb_define_module_function(rb_mFastJsonparser, "_load", reinterpret_cast<VALUE (*)(...)>(rb_fast_jsonparser_load), 2);
132
- rb_define_module_function(rb_mFastJsonparser, "_load_many", reinterpret_cast<VALUE (*)(...)>(rb_fast_jsonparser_load_many), 3);
162
+ rb_define_alloc_func(rb_cFastJsonparserNative, parser_allocate);
163
+ rb_define_method(rb_cFastJsonparserNative, "_parse", reinterpret_cast<VALUE (*)(...)>(rb_fast_jsonparser_parse), 2);
164
+ rb_define_method(rb_cFastJsonparserNative, "_load", reinterpret_cast<VALUE (*)(...)>(rb_fast_jsonparser_load), 2);
165
+ rb_define_method(rb_cFastJsonparserNative, "_load_many", reinterpret_cast<VALUE (*)(...)>(rb_fast_jsonparser_load_many), 3);
133
166
 
134
167
  rb_eFastJsonparserParseError = rb_const_get(rb_mFastJsonparser, rb_intern("ParseError"));
135
168
  rb_global_variable(&rb_eFastJsonparserParseError);
@@ -2308,7 +2308,7 @@ using ErrorValues [[deprecated("This is an alias and will be removed, use error_
2308
2308
  * @deprecated Error codes should be stored and returned as `error_code`, use `error_message()` instead.
2309
2309
  */
2310
2310
  [[deprecated("Error codes should be stored and returned as `error_code`, use `error_message()` instead.")]]
2311
- inline const std::string &error_message(int error) noexcept;
2311
+ inline const std::string error_message(int error) noexcept;
2312
2312
 
2313
2313
  } // namespace simdjson
2314
2314
 
@@ -6367,7 +6367,7 @@ namespace internal {
6367
6367
  // We store the error code so we can validate the error message is associated with the right code
6368
6368
  struct error_code_info {
6369
6369
  error_code code;
6370
- std::string message;
6370
+ const char* message;
6371
6371
  };
6372
6372
  // These MUST match the codes in error_code. We check this constraint in basictests.
6373
6373
  extern SIMDJSON_DLLIMPORTEXPORT const error_code_info error_codes[];
@@ -6376,10 +6376,10 @@ namespace internal {
6376
6376
 
6377
6377
  inline const char *error_message(error_code error) noexcept {
6378
6378
  // If you're using error_code, we're trusting you got it from the enum.
6379
- return internal::error_codes[int(error)].message.c_str();
6379
+ return internal::error_codes[int(error)].message;
6380
6380
  }
6381
6381
 
6382
- inline const std::string &error_message(int error) noexcept {
6382
+ inline const std::string error_message(int error) noexcept {
6383
6383
  if (error < 0 || error >= error_code::NUM_ERROR_CODES) {
6384
6384
  return internal::error_codes[UNEXPECTED_ERROR].message;
6385
6385
  }
@@ -12,15 +12,15 @@ module FastJsonparser
12
12
 
13
13
  class << self
14
14
  def parse(source, symbolize_keys: true)
15
- _parse(source, symbolize_keys)
15
+ parser._parse(source, symbolize_keys)
16
16
  end
17
17
 
18
18
  def load(source, symbolize_keys: true)
19
- _load(source, symbolize_keys)
19
+ parser._load(source, symbolize_keys)
20
20
  end
21
21
 
22
22
  def load_many(source, symbolize_keys: true, batch_size: DEFAULT_BATCH_SIZE, &block)
23
- _load_many(source, symbolize_keys, batch_size, &block)
23
+ Native.new._load_many(source, symbolize_keys, batch_size, &block)
24
24
  rescue UnknownError => error
25
25
  case error.message
26
26
  when "This parser can't support a document that big"
@@ -30,7 +30,17 @@ module FastJsonparser
30
30
  end
31
31
  end
32
32
 
33
- require "fast_jsonparser/fast_jsonparser" # loads cpp extension
34
- private :_parse, :_load, :_load_many
33
+ private
34
+
35
+ def parser
36
+ @parser ||= Native.new
37
+ end
38
+ end
39
+
40
+ class Native
35
41
  end
42
+
43
+ require "fast_jsonparser/fast_jsonparser" # loads cpp extension
44
+
45
+ private_constant :Native
36
46
  end
@@ -1,3 +1,3 @@
1
1
  module FastJsonparser
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_jsonparser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anil Maurya
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-22 00:00:00.000000000 Z
11
+ date: 2020-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -102,6 +102,7 @@ extensions:
102
102
  - ext/fast_jsonparser/extconf.rb
103
103
  extra_rdoc_files: []
104
104
  files:
105
+ - ".github/workflows/ruby.yml"
105
106
  - ".gitignore"
106
107
  - ".travis.yml"
107
108
  - CHANGELOG.md