mongo-ejson 0.2.2 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b1a8b0a13a6a23d0d082bbdc5c9c5ba6ed6b642831bd6d4ed06477c43a0dbb9
4
- data.tar.gz: 9d2cbdd8fd9da0154d34f3cb196438e41edb1dbb1ab5ebc019cacf9b250361b4
3
+ metadata.gz: 5a49c9eb4244ffbc3e86d08db3c5ed6d2d5a01df835beecef11200fa221234cd
4
+ data.tar.gz: 84caa949ebdf44a5a13dfcf82453c5be1b7e5367c5d705421b6b4d3bce6dfd5d
5
5
  SHA512:
6
- metadata.gz: b3e75374ea2acd4d42e9fda8f87f2f367995d3d314f714d354be6973b99d7479ac5c6d096a3107570e96974f9473f9af09114a98842ed26c9a1633ac90223823
7
- data.tar.gz: 056d295d55e218c3b9813e59bb1af30e845eda19cf494f8cf5a0451224a622e7a675313958c990b0d3b907c5f9a148c8fc8b9424154f8381674a903007ff1892
6
+ metadata.gz: 36895e58e393acff8d26cfa07fa39c995a4db289c121cba1e0fa9066d3dcc3b5fb6957a6d67f9eb0f4ecac1adfa18c1a05a0b0feb70b192c388de0bdc0176f22
7
+ data.tar.gz: 6ccba4c55fd658d828eaceca7d482551f3a4278be4054ca27eada96f6c8001f13db9752edd3dfdd24761e602a5c4a3d86943ff89e9dca38a52705eaa9d6dd6f5
@@ -1,15 +1,13 @@
1
- ---
2
1
  sudo: false
3
2
  language: ruby
4
3
  cache: bundler
5
4
  rvm:
5
+ - 2.7
6
6
  - 2.6
7
7
  - 2.5
8
8
  - jruby-9.2
9
-
10
9
  before_install:
11
10
  - gem install bundler -v 2.0.1
12
-
13
11
  script:
14
12
  - bundle exec rspec
15
13
  - bundle exec rubocop
@@ -11,12 +11,13 @@ GEM
11
11
  bson (4.4.2-java)
12
12
  diff-lcs (1.3)
13
13
  jaro_winkler (1.5.2)
14
+ jaro_winkler (1.5.2-java)
14
15
  parallel (1.13.0)
15
16
  parser (2.6.0.0)
16
17
  ast (~> 2.4.0)
17
18
  powerpack (0.1.2)
18
19
  rainbow (3.0.0)
19
- rake (10.5.0)
20
+ rake (13.0.1)
20
21
  rspec (3.8.0)
21
22
  rspec-core (~> 3.8.0)
22
23
  rspec-expectations (~> 3.8.0)
@@ -49,7 +50,7 @@ DEPENDENCIES
49
50
  bson
50
51
  bundler (~> 2.0)
51
52
  mongo-ejson!
52
- rake (~> 10.0)
53
+ rake (~> 13.0)
53
54
  rspec (~> 3.0)
54
55
  rubocop (~> 0.63)
55
56
 
data/README.md CHANGED
@@ -42,50 +42,40 @@ Just add it to your `application.js`
42
42
  ## Requirements
43
43
 
44
44
  Runtime:
45
- * Ruby 2.5+
46
- * JRuby 9.2+
45
+
46
+ - Ruby 2.5+
47
+ - JRuby 9.2+
47
48
 
48
49
  Development:
49
- * [canopy](https://github.com/jcoglan/canopy) from master branch
50
+
51
+ - [canopy](https://github.com/jcoglan/canopy) from master branch
50
52
 
51
53
  ## Supported literals
52
54
 
53
- * `undefined`
54
- * `MinKey`
55
- * `MaxKey`
56
- * `ObjectId(<object_id_hex_string>)`
57
- * `BinData(<type_string>, <bindata_base64_string>)`
58
- * `BinData(<type_integer>, <base64_bindata>)`
59
- * `Timestamp(<time_interger>, <increment_integer>)`
60
- * `NumberLong(<value_string>)`
61
- * `NumberLong(<value_integer>)`
62
- * `NumberDecimal(<value_string>)`
63
- * `NumberDecimal(<value_number>)`
64
- * `ISODate(<time_iso8601_string>)`
65
- * `ISODate(<time_interger>)`
66
- * `new Date(<time_iso8601_string>)`
67
- * `new Date(<time_interger>)`
68
- * `/<regexp>/<options>`
69
- * `DBRef(<name_string>, <object_id_hex_string>)`
55
+ - `undefined`
56
+ - `MinKey`
57
+ - `MaxKey`
58
+ - `ObjectId(<object_id_hex_string>)`
59
+ - `BinData(<type_string>, <bindata_base64_string>)`
60
+ - `BinData(<type_integer>, <base64_bindata>)`
61
+ - `Timestamp(<time_interger>, <increment_integer>)`
62
+ - `NumberLong(<value_string>)`
63
+ - `NumberLong(<value_integer>)`
64
+ - `NumberDecimal(<value_string>)`
65
+ - `NumberDecimal(<value_number>)`
66
+ - `ISODate(<time_iso8601_string>)`
67
+ - `ISODate(<time_interger>)`
68
+ - `new Date(<time_iso8601_string>)`
69
+ - `new Date(<time_interger>)`
70
+ - `/<regexp>/<options>`
71
+ - `DBRef(<name_string>, <object_id_hex_string>)`
70
72
 
71
73
  ## Supported JSON extensions:
72
74
 
73
- * Single quoted strings
74
- * Single line comments `//`
75
+ - Single quoted strings
76
+ - Single line comments `//`
77
+ - Non-quoted key names: `{_id: 123}`
75
78
 
76
79
  ## Planned JSON extensions:
77
80
 
78
- * Non-quoted key names: `{_id: 123}`
79
- * Multi-line comments: `/* */`
80
-
81
- ## Issues
82
-
83
- * String: following not escaped chars should fail, but pass
84
-
85
- * Backspace (must be replaced with `\b`). no fixture
86
- * Form feed (must be replaced with `\f`), no fixture
87
- * Newline (must be replaced with `\n`)
88
- * Carriage return (must be replaced with `\r`), no fixture
89
- * Tab (must be replaced with `\t`)
90
-
91
-
81
+ - Multi-line comments: `/* */`
@@ -39,7 +39,7 @@ Gem::Specification.new do |spec|
39
39
  spec.require_paths = ['lib']
40
40
 
41
41
  spec.add_development_dependency 'bundler', '~> 2.0'
42
- spec.add_development_dependency 'rake', '~> 10.0'
42
+ spec.add_development_dependency 'rake', '~> 13.0'
43
43
  spec.add_development_dependency 'rspec', '~> 3.0'
44
44
  spec.add_development_dependency 'rubocop', '~> 0.63'
45
45
 
@@ -16,6 +16,9 @@ module ParserAction
16
16
  def make_string(input, starts_at, _ends_at, elements)
17
17
  end
18
18
 
19
+ def make_identifier(input, starts_at, _ends_at, elements)
20
+ end
21
+
19
22
  def make_array(input, starts_at, _ends_at, elements)
20
23
  end
21
24
 
@@ -37,6 +37,10 @@ module ParserAction
37
37
  quoted_string.encode('ASCII', fallback: UNICODE_ESCAPER).undump
38
38
  end
39
39
 
40
+ def make_identifier(input, starts_at, ends_at, _elements)
41
+ input[starts_at...ends_at]
42
+ end
43
+
40
44
  def make_numeric_string(_input, _starts_at, _ends_at, elements)
41
45
  elements.first
42
46
  end
@@ -1,3 +1,3 @@
1
1
  class EJSON
2
- VERSION = '0.2.2'.freeze
2
+ VERSION = '0.2.3'.freeze
3
3
  end
@@ -4,7 +4,7 @@ grammar ExtendedJSON
4
4
 
5
5
  object <- (non_empty_object / empty_object)
6
6
 
7
- pair <- @__ string @assignment value
7
+ pair <- @__ (string / identifier) @assignment value
8
8
  %make_pair
9
9
 
10
10
  non_empty_object <- @object_open
@@ -48,18 +48,35 @@ grammar ExtendedJSON
48
48
 
49
49
  string <- double_quote_string / single_quote_string
50
50
 
51
+ identifier <- (identifier_start identifier_part+)
52
+ %make_identifier
53
+
54
+ identifier_start <- unicode_letter / "$" / "_" / "\\" unicode_escape
55
+ identifier_part <- unicode_letter / unicode_digit / unicode_conn_punct
56
+
57
+ # Not fully compatible with a https://www.ecma-international.org/ecma-262/5.1/#sec-7.6
58
+ # but enough to cover most failing cases
59
+ unicode_combining <- unicode_non_spacing / unicode_comb_spacing
60
+
61
+ unicode_escape <- "u" hex_digit hex_digit hex_digit hex_digit
62
+
63
+ unicode_letter <- [a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
64
+ unicode_digit <- [0-9]
65
+ unicode_conn_punct <- [_\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F]
66
+
67
+ # https://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4
51
68
  double_quote_string <- @double_quote
52
- ("\\" . / [^"])*
69
+ ("\\" [^\b\t\n\v\f\r] / [^"\b\t\n\v\f\r])*
53
70
  @double_quote
54
71
  %make_string
55
72
 
56
73
  single_quote_string <- @single_quote
57
- ("\\" . / [^'])*
74
+ ("\\" [^\b\t\n\v\f\r] / [^'\b\t\n\v\f\r])*
58
75
  @single_quote
59
76
  %make_string
60
77
 
61
78
  hex_string <- hex_single_quote / hex_double_quote
62
- hex_value <- [a-fA-F0-9]+
79
+ hex_value <- hex_digit+
63
80
 
64
81
  hex_single_quote <- @single_quote
65
82
  hex_value
@@ -209,6 +226,8 @@ grammar ExtendedJSON
209
226
  space <- [\s]
210
227
  new_line <- [\n]
211
228
 
229
+ hex_digit <- [a-fA-F0-9]
230
+
212
231
  comment <- "//" [^\n]*
213
232
  __ <- (space / new_line / comment)*
214
233
 
@@ -18,11 +18,10 @@ module ExtendedJSON
18
18
  end
19
19
 
20
20
  class TreeNode1 < TreeNode
21
- attr_reader :string, :value
21
+ attr_reader :value
22
22
 
23
23
  def initialize(text, offset, elements)
24
24
  super
25
- @string = elements[0]
26
25
  @value = elements[1]
27
26
  end
28
27
  end
@@ -64,6 +63,33 @@ module ExtendedJSON
64
63
  end
65
64
 
66
65
  class TreeNode6 < TreeNode
66
+ attr_reader :identifier_start
67
+
68
+ def initialize(text, offset, elements)
69
+ super
70
+ @identifier_start = elements[0]
71
+ end
72
+ end
73
+
74
+ class TreeNode7 < TreeNode
75
+ attr_reader :unicode_escape
76
+
77
+ def initialize(text, offset, elements)
78
+ super
79
+ @unicode_escape = elements[1]
80
+ end
81
+ end
82
+
83
+ class TreeNode8 < TreeNode
84
+ attr_reader :hex_digit
85
+
86
+ def initialize(text, offset, elements)
87
+ super
88
+ @hex_digit = elements[4]
89
+ end
90
+ end
91
+
92
+ class TreeNode9 < TreeNode
67
93
  attr_reader :hex_value
68
94
 
69
95
  def initialize(text, offset, elements)
@@ -72,7 +98,7 @@ module ExtendedJSON
72
98
  end
73
99
  end
74
100
 
75
- class TreeNode7 < TreeNode
101
+ class TreeNode10 < TreeNode
76
102
  attr_reader :hex_value
77
103
 
78
104
  def initialize(text, offset, elements)
@@ -81,7 +107,7 @@ module ExtendedJSON
81
107
  end
82
108
  end
83
109
 
84
- class TreeNode8 < TreeNode
110
+ class TreeNode11 < TreeNode
85
111
  attr_reader :integer_number
86
112
 
87
113
  def initialize(text, offset, elements)
@@ -90,7 +116,7 @@ module ExtendedJSON
90
116
  end
91
117
  end
92
118
 
93
- class TreeNode9 < TreeNode
119
+ class TreeNode12 < TreeNode
94
120
  attr_reader :integer_number
95
121
 
96
122
  def initialize(text, offset, elements)
@@ -99,7 +125,7 @@ module ExtendedJSON
99
125
  end
100
126
  end
101
127
 
102
- class TreeNode10 < TreeNode
128
+ class TreeNode13 < TreeNode
103
129
  attr_reader :number
104
130
 
105
131
  def initialize(text, offset, elements)
@@ -108,7 +134,7 @@ module ExtendedJSON
108
134
  end
109
135
  end
110
136
 
111
- class TreeNode11 < TreeNode
137
+ class TreeNode14 < TreeNode
112
138
  attr_reader :number
113
139
 
114
140
  def initialize(text, offset, elements)
@@ -117,7 +143,7 @@ module ExtendedJSON
117
143
  end
118
144
  end
119
145
 
120
- class TreeNode12 < TreeNode
146
+ class TreeNode15 < TreeNode
121
147
  attr_reader :base64_value
122
148
 
123
149
  def initialize(text, offset, elements)
@@ -126,7 +152,7 @@ module ExtendedJSON
126
152
  end
127
153
  end
128
154
 
129
- class TreeNode13 < TreeNode
155
+ class TreeNode16 < TreeNode
130
156
  attr_reader :base64_value
131
157
 
132
158
  def initialize(text, offset, elements)
@@ -135,7 +161,7 @@ module ExtendedJSON
135
161
  end
136
162
  end
137
163
 
138
- class TreeNode14 < TreeNode
164
+ class TreeNode17 < TreeNode
139
165
  attr_reader :integer
140
166
 
141
167
  def initialize(text, offset, elements)
@@ -144,7 +170,7 @@ module ExtendedJSON
144
170
  end
145
171
  end
146
172
 
147
- class TreeNode15 < TreeNode
173
+ class TreeNode18 < TreeNode
148
174
  attr_reader :integer
149
175
 
150
176
  def initialize(text, offset, elements)
@@ -153,7 +179,7 @@ module ExtendedJSON
153
179
  end
154
180
  end
155
181
 
156
- class TreeNode16 < TreeNode
182
+ class TreeNode19 < TreeNode
157
183
  attr_reader :integer
158
184
 
159
185
  def initialize(text, offset, elements)
@@ -162,7 +188,7 @@ module ExtendedJSON
162
188
  end
163
189
  end
164
190
 
165
- class TreeNode17 < TreeNode
191
+ class TreeNode20 < TreeNode
166
192
  attr_reader :hex_string
167
193
 
168
194
  def initialize(text, offset, elements)
@@ -171,7 +197,7 @@ module ExtendedJSON
171
197
  end
172
198
  end
173
199
 
174
- class TreeNode18 < TreeNode
200
+ class TreeNode21 < TreeNode
175
201
  attr_reader :bin_data_type, :base64_string
176
202
 
177
203
  def initialize(text, offset, elements)
@@ -181,7 +207,7 @@ module ExtendedJSON
181
207
  end
182
208
  end
183
209
 
184
- class TreeNode19 < TreeNode
210
+ class TreeNode22 < TreeNode
185
211
  attr_reader :integer_number
186
212
 
187
213
  def initialize(text, offset, elements)
@@ -190,7 +216,7 @@ module ExtendedJSON
190
216
  end
191
217
  end
192
218
 
193
- class TreeNode20 < TreeNode
219
+ class TreeNode23 < TreeNode
194
220
  attr_reader :number_long_value
195
221
 
196
222
  def initialize(text, offset, elements)
@@ -199,7 +225,7 @@ module ExtendedJSON
199
225
  end
200
226
  end
201
227
 
202
- class TreeNode21 < TreeNode
228
+ class TreeNode24 < TreeNode
203
229
  attr_reader :number_decimal_value
204
230
 
205
231
  def initialize(text, offset, elements)
@@ -208,7 +234,7 @@ module ExtendedJSON
208
234
  end
209
235
  end
210
236
 
211
- class TreeNode22 < TreeNode
237
+ class TreeNode25 < TreeNode
212
238
  attr_reader :date_value
213
239
 
214
240
  def initialize(text, offset, elements)
@@ -217,7 +243,7 @@ module ExtendedJSON
217
243
  end
218
244
  end
219
245
 
220
- class TreeNode23 < TreeNode
246
+ class TreeNode26 < TreeNode
221
247
  attr_reader :string
222
248
 
223
249
  def initialize(text, offset, elements)
@@ -226,7 +252,7 @@ module ExtendedJSON
226
252
  end
227
253
  end
228
254
 
229
- class TreeNode24 < TreeNode
255
+ class TreeNode27 < TreeNode
230
256
  attr_reader :comma
231
257
 
232
258
  def initialize(text, offset, elements)
@@ -320,7 +346,15 @@ module ExtendedJSON
320
346
  address1 = _read___
321
347
  unless address1 == FAILURE
322
348
  address2 = FAILURE
349
+ index2 = @offset
323
350
  address2 = _read_string
351
+ if address2 == FAILURE
352
+ @offset = index2
353
+ address2 = _read_identifier
354
+ if address2 == FAILURE
355
+ @offset = index2
356
+ end
357
+ end
324
358
  unless address2 == FAILURE
325
359
  elements0 << address2
326
360
  address3 = FAILURE
@@ -856,6 +890,353 @@ module ExtendedJSON
856
890
  return address0
857
891
  end
858
892
 
893
+ def _read_identifier
894
+ address0, index0 = FAILURE, @offset
895
+ cached = @cache[:identifier][index0]
896
+ if cached
897
+ @offset = cached[1]
898
+ return cached[0]
899
+ end
900
+ index1, elements0 = @offset, []
901
+ address1 = FAILURE
902
+ address1 = _read_identifier_start
903
+ unless address1 == FAILURE
904
+ elements0 << address1
905
+ address2 = FAILURE
906
+ remaining0, index2, elements1, address3 = 1, @offset, [], true
907
+ until address3 == FAILURE
908
+ address3 = _read_identifier_part
909
+ unless address3 == FAILURE
910
+ elements1 << address3
911
+ remaining0 -= 1
912
+ end
913
+ end
914
+ if remaining0 <= 0
915
+ address2 = TreeNode.new(@input[index2...@offset], index2, elements1)
916
+ @offset = @offset
917
+ else
918
+ address2 = FAILURE
919
+ end
920
+ unless address2 == FAILURE
921
+ elements0 << address2
922
+ else
923
+ elements0 = nil
924
+ @offset = index1
925
+ end
926
+ else
927
+ elements0 = nil
928
+ @offset = index1
929
+ end
930
+ if elements0.nil?
931
+ address0 = FAILURE
932
+ else
933
+ address0 = @actions.make_identifier(@input, index1, @offset, elements0)
934
+ @offset = @offset
935
+ end
936
+ @cache[:identifier][index0] = [address0, @offset]
937
+ return address0
938
+ end
939
+
940
+ def _read_identifier_start
941
+ address0, index0 = FAILURE, @offset
942
+ cached = @cache[:identifier_start][index0]
943
+ if cached
944
+ @offset = cached[1]
945
+ return cached[0]
946
+ end
947
+ index1 = @offset
948
+ address0 = _read_unicode_letter
949
+ if address0 == FAILURE
950
+ @offset = index1
951
+ chunk0 = nil
952
+ if @offset < @input_size
953
+ chunk0 = @input[@offset...@offset + 1]
954
+ end
955
+ if chunk0 == "$"
956
+ address0 = TreeNode.new(@input[@offset...@offset + 1], @offset)
957
+ @offset = @offset + 1
958
+ else
959
+ address0 = FAILURE
960
+ if @offset > @failure
961
+ @failure = @offset
962
+ @expected = []
963
+ end
964
+ if @offset == @failure
965
+ @expected << "\"$\""
966
+ end
967
+ end
968
+ if address0 == FAILURE
969
+ @offset = index1
970
+ chunk1 = nil
971
+ if @offset < @input_size
972
+ chunk1 = @input[@offset...@offset + 1]
973
+ end
974
+ if chunk1 == "_"
975
+ address0 = TreeNode.new(@input[@offset...@offset + 1], @offset)
976
+ @offset = @offset + 1
977
+ else
978
+ address0 = FAILURE
979
+ if @offset > @failure
980
+ @failure = @offset
981
+ @expected = []
982
+ end
983
+ if @offset == @failure
984
+ @expected << "\"_\""
985
+ end
986
+ end
987
+ if address0 == FAILURE
988
+ @offset = index1
989
+ index2, elements0 = @offset, []
990
+ address1 = FAILURE
991
+ chunk2 = nil
992
+ if @offset < @input_size
993
+ chunk2 = @input[@offset...@offset + 1]
994
+ end
995
+ if chunk2 == "\\"
996
+ address1 = TreeNode.new(@input[@offset...@offset + 1], @offset)
997
+ @offset = @offset + 1
998
+ else
999
+ address1 = FAILURE
1000
+ if @offset > @failure
1001
+ @failure = @offset
1002
+ @expected = []
1003
+ end
1004
+ if @offset == @failure
1005
+ @expected << "\"\\\\\""
1006
+ end
1007
+ end
1008
+ unless address1 == FAILURE
1009
+ elements0 << address1
1010
+ address2 = FAILURE
1011
+ address2 = _read_unicode_escape
1012
+ unless address2 == FAILURE
1013
+ elements0 << address2
1014
+ else
1015
+ elements0 = nil
1016
+ @offset = index2
1017
+ end
1018
+ else
1019
+ elements0 = nil
1020
+ @offset = index2
1021
+ end
1022
+ if elements0.nil?
1023
+ address0 = FAILURE
1024
+ else
1025
+ address0 = TreeNode7.new(@input[index2...@offset], index2, elements0)
1026
+ @offset = @offset
1027
+ end
1028
+ if address0 == FAILURE
1029
+ @offset = index1
1030
+ end
1031
+ end
1032
+ end
1033
+ end
1034
+ @cache[:identifier_start][index0] = [address0, @offset]
1035
+ return address0
1036
+ end
1037
+
1038
+ def _read_identifier_part
1039
+ address0, index0 = FAILURE, @offset
1040
+ cached = @cache[:identifier_part][index0]
1041
+ if cached
1042
+ @offset = cached[1]
1043
+ return cached[0]
1044
+ end
1045
+ index1 = @offset
1046
+ address0 = _read_unicode_letter
1047
+ if address0 == FAILURE
1048
+ @offset = index1
1049
+ address0 = _read_unicode_digit
1050
+ if address0 == FAILURE
1051
+ @offset = index1
1052
+ address0 = _read_unicode_conn_punct
1053
+ if address0 == FAILURE
1054
+ @offset = index1
1055
+ end
1056
+ end
1057
+ end
1058
+ @cache[:identifier_part][index0] = [address0, @offset]
1059
+ return address0
1060
+ end
1061
+
1062
+ def _read_unicode_combining
1063
+ address0, index0 = FAILURE, @offset
1064
+ cached = @cache[:unicode_combining][index0]
1065
+ if cached
1066
+ @offset = cached[1]
1067
+ return cached[0]
1068
+ end
1069
+ index1 = @offset
1070
+ address0 = _read_unicode_non_spacing
1071
+ if address0 == FAILURE
1072
+ @offset = index1
1073
+ address0 = _read_unicode_comb_spacing
1074
+ if address0 == FAILURE
1075
+ @offset = index1
1076
+ end
1077
+ end
1078
+ @cache[:unicode_combining][index0] = [address0, @offset]
1079
+ return address0
1080
+ end
1081
+
1082
+ def _read_unicode_escape
1083
+ address0, index0 = FAILURE, @offset
1084
+ cached = @cache[:unicode_escape][index0]
1085
+ if cached
1086
+ @offset = cached[1]
1087
+ return cached[0]
1088
+ end
1089
+ index1, elements0 = @offset, []
1090
+ address1 = FAILURE
1091
+ chunk0 = nil
1092
+ if @offset < @input_size
1093
+ chunk0 = @input[@offset...@offset + 1]
1094
+ end
1095
+ if chunk0 == "u"
1096
+ address1 = TreeNode.new(@input[@offset...@offset + 1], @offset)
1097
+ @offset = @offset + 1
1098
+ else
1099
+ address1 = FAILURE
1100
+ if @offset > @failure
1101
+ @failure = @offset
1102
+ @expected = []
1103
+ end
1104
+ if @offset == @failure
1105
+ @expected << "\"u\""
1106
+ end
1107
+ end
1108
+ unless address1 == FAILURE
1109
+ elements0 << address1
1110
+ address2 = FAILURE
1111
+ address2 = _read_hex_digit
1112
+ unless address2 == FAILURE
1113
+ elements0 << address2
1114
+ address3 = FAILURE
1115
+ address3 = _read_hex_digit
1116
+ unless address3 == FAILURE
1117
+ elements0 << address3
1118
+ address4 = FAILURE
1119
+ address4 = _read_hex_digit
1120
+ unless address4 == FAILURE
1121
+ elements0 << address4
1122
+ address5 = FAILURE
1123
+ address5 = _read_hex_digit
1124
+ unless address5 == FAILURE
1125
+ elements0 << address5
1126
+ else
1127
+ elements0 = nil
1128
+ @offset = index1
1129
+ end
1130
+ else
1131
+ elements0 = nil
1132
+ @offset = index1
1133
+ end
1134
+ else
1135
+ elements0 = nil
1136
+ @offset = index1
1137
+ end
1138
+ else
1139
+ elements0 = nil
1140
+ @offset = index1
1141
+ end
1142
+ else
1143
+ elements0 = nil
1144
+ @offset = index1
1145
+ end
1146
+ if elements0.nil?
1147
+ address0 = FAILURE
1148
+ else
1149
+ address0 = TreeNode8.new(@input[index1...@offset], index1, elements0)
1150
+ @offset = @offset
1151
+ end
1152
+ @cache[:unicode_escape][index0] = [address0, @offset]
1153
+ return address0
1154
+ end
1155
+
1156
+ def _read_unicode_letter
1157
+ address0, index0 = FAILURE, @offset
1158
+ cached = @cache[:unicode_letter][index0]
1159
+ if cached
1160
+ @offset = cached[1]
1161
+ return cached[0]
1162
+ end
1163
+ chunk0 = nil
1164
+ if @offset < @input_size
1165
+ chunk0 = @input[@offset...@offset + 1]
1166
+ end
1167
+ if chunk0 =~ /\A[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]/
1168
+ address0 = TreeNode.new(@input[@offset...@offset + 1], @offset)
1169
+ @offset = @offset + 1
1170
+ else
1171
+ address0 = FAILURE
1172
+ if @offset > @failure
1173
+ @failure = @offset
1174
+ @expected = []
1175
+ end
1176
+ if @offset == @failure
1177
+ @expected << "[a-zA-Z\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]"
1178
+ end
1179
+ end
1180
+ @cache[:unicode_letter][index0] = [address0, @offset]
1181
+ return address0
1182
+ end
1183
+
1184
+ def _read_unicode_digit
1185
+ address0, index0 = FAILURE, @offset
1186
+ cached = @cache[:unicode_digit][index0]
1187
+ if cached
1188
+ @offset = cached[1]
1189
+ return cached[0]
1190
+ end
1191
+ chunk0 = nil
1192
+ if @offset < @input_size
1193
+ chunk0 = @input[@offset...@offset + 1]
1194
+ end
1195
+ if chunk0 =~ /\A[0-9]/
1196
+ address0 = TreeNode.new(@input[@offset...@offset + 1], @offset)
1197
+ @offset = @offset + 1
1198
+ else
1199
+ address0 = FAILURE
1200
+ if @offset > @failure
1201
+ @failure = @offset
1202
+ @expected = []
1203
+ end
1204
+ if @offset == @failure
1205
+ @expected << "[0-9]"
1206
+ end
1207
+ end
1208
+ @cache[:unicode_digit][index0] = [address0, @offset]
1209
+ return address0
1210
+ end
1211
+
1212
+ def _read_unicode_conn_punct
1213
+ address0, index0 = FAILURE, @offset
1214
+ cached = @cache[:unicode_conn_punct][index0]
1215
+ if cached
1216
+ @offset = cached[1]
1217
+ return cached[0]
1218
+ end
1219
+ chunk0 = nil
1220
+ if @offset < @input_size
1221
+ chunk0 = @input[@offset...@offset + 1]
1222
+ end
1223
+ if chunk0 =~ /\A[_\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F]/
1224
+ address0 = TreeNode.new(@input[@offset...@offset + 1], @offset)
1225
+ @offset = @offset + 1
1226
+ else
1227
+ address0 = FAILURE
1228
+ if @offset > @failure
1229
+ @failure = @offset
1230
+ @expected = []
1231
+ end
1232
+ if @offset == @failure
1233
+ @expected << "[_\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]"
1234
+ end
1235
+ end
1236
+ @cache[:unicode_conn_punct][index0] = [address0, @offset]
1237
+ return address0
1238
+ end
1239
+
859
1240
  def _read_double_quote_string
860
1241
  address0, index0 = FAILURE, @offset
861
1242
  cached = @cache[:double_quote_string][index0]
@@ -893,7 +1274,11 @@ module ExtendedJSON
893
1274
  unless address4 == FAILURE
894
1275
  elements2 << address4
895
1276
  address5 = FAILURE
1277
+ chunk1 = nil
896
1278
  if @offset < @input_size
1279
+ chunk1 = @input[@offset...@offset + 1]
1280
+ end
1281
+ if chunk1 =~ /\A[^\b\t\n\v\f\r]/
897
1282
  address5 = TreeNode.new(@input[@offset...@offset + 1], @offset)
898
1283
  @offset = @offset + 1
899
1284
  else
@@ -903,7 +1288,7 @@ module ExtendedJSON
903
1288
  @expected = []
904
1289
  end
905
1290
  if @offset == @failure
906
- @expected << "<any char>"
1291
+ @expected << "[^\\b\\t\\n\\v\\f\\r]"
907
1292
  end
908
1293
  end
909
1294
  unless address5 == FAILURE
@@ -924,11 +1309,11 @@ module ExtendedJSON
924
1309
  end
925
1310
  if address3 == FAILURE
926
1311
  @offset = index3
927
- chunk1 = nil
1312
+ chunk2 = nil
928
1313
  if @offset < @input_size
929
- chunk1 = @input[@offset...@offset + 1]
1314
+ chunk2 = @input[@offset...@offset + 1]
930
1315
  end
931
- if chunk1 =~ /\A[^"]/
1316
+ if chunk2 =~ /\A[^"\b\t\n\v\f\r]/
932
1317
  address3 = TreeNode.new(@input[@offset...@offset + 1], @offset)
933
1318
  @offset = @offset + 1
934
1319
  else
@@ -938,7 +1323,7 @@ module ExtendedJSON
938
1323
  @expected = []
939
1324
  end
940
1325
  if @offset == @failure
941
- @expected << "[^\"]"
1326
+ @expected << "[^\"\\b\\t\\n\\v\\f\\r]"
942
1327
  end
943
1328
  end
944
1329
  if address3 == FAILURE
@@ -1020,7 +1405,11 @@ module ExtendedJSON
1020
1405
  unless address4 == FAILURE
1021
1406
  elements2 << address4
1022
1407
  address5 = FAILURE
1408
+ chunk1 = nil
1023
1409
  if @offset < @input_size
1410
+ chunk1 = @input[@offset...@offset + 1]
1411
+ end
1412
+ if chunk1 =~ /\A[^\b\t\n\v\f\r]/
1024
1413
  address5 = TreeNode.new(@input[@offset...@offset + 1], @offset)
1025
1414
  @offset = @offset + 1
1026
1415
  else
@@ -1030,7 +1419,7 @@ module ExtendedJSON
1030
1419
  @expected = []
1031
1420
  end
1032
1421
  if @offset == @failure
1033
- @expected << "<any char>"
1422
+ @expected << "[^\\b\\t\\n\\v\\f\\r]"
1034
1423
  end
1035
1424
  end
1036
1425
  unless address5 == FAILURE
@@ -1051,11 +1440,11 @@ module ExtendedJSON
1051
1440
  end
1052
1441
  if address3 == FAILURE
1053
1442
  @offset = index3
1054
- chunk1 = nil
1443
+ chunk2 = nil
1055
1444
  if @offset < @input_size
1056
- chunk1 = @input[@offset...@offset + 1]
1445
+ chunk2 = @input[@offset...@offset + 1]
1057
1446
  end
1058
- if chunk1 =~ /\A[^']/
1447
+ if chunk2 =~ /\A[^'\b\t\n\v\f\r]/
1059
1448
  address3 = TreeNode.new(@input[@offset...@offset + 1], @offset)
1060
1449
  @offset = @offset + 1
1061
1450
  else
@@ -1065,7 +1454,7 @@ module ExtendedJSON
1065
1454
  @expected = []
1066
1455
  end
1067
1456
  if @offset == @failure
1068
- @expected << "[^']"
1457
+ @expected << "[^'\\b\\t\\n\\v\\f\\r]"
1069
1458
  end
1070
1459
  end
1071
1460
  if address3 == FAILURE
@@ -1139,23 +1528,7 @@ module ExtendedJSON
1139
1528
  end
1140
1529
  remaining0, index1, elements0, address1 = 1, @offset, [], true
1141
1530
  until address1 == FAILURE
1142
- chunk0 = nil
1143
- if @offset < @input_size
1144
- chunk0 = @input[@offset...@offset + 1]
1145
- end
1146
- if chunk0 =~ /\A[a-fA-F0-9]/
1147
- address1 = TreeNode.new(@input[@offset...@offset + 1], @offset)
1148
- @offset = @offset + 1
1149
- else
1150
- address1 = FAILURE
1151
- if @offset > @failure
1152
- @failure = @offset
1153
- @expected = []
1154
- end
1155
- if @offset == @failure
1156
- @expected << "[a-fA-F0-9]"
1157
- end
1158
- end
1531
+ address1 = _read_hex_digit
1159
1532
  unless address1 == FAILURE
1160
1533
  elements0 << address1
1161
1534
  remaining0 -= 1
@@ -3513,6 +3886,34 @@ module ExtendedJSON
3513
3886
  return address0
3514
3887
  end
3515
3888
 
3889
+ def _read_hex_digit
3890
+ address0, index0 = FAILURE, @offset
3891
+ cached = @cache[:hex_digit][index0]
3892
+ if cached
3893
+ @offset = cached[1]
3894
+ return cached[0]
3895
+ end
3896
+ chunk0 = nil
3897
+ if @offset < @input_size
3898
+ chunk0 = @input[@offset...@offset + 1]
3899
+ end
3900
+ if chunk0 =~ /\A[a-fA-F0-9]/
3901
+ address0 = TreeNode.new(@input[@offset...@offset + 1], @offset)
3902
+ @offset = @offset + 1
3903
+ else
3904
+ address0 = FAILURE
3905
+ if @offset > @failure
3906
+ @failure = @offset
3907
+ @expected = []
3908
+ end
3909
+ if @offset == @failure
3910
+ @expected << "[a-fA-F0-9]"
3911
+ end
3912
+ end
3913
+ @cache[:hex_digit][index0] = [address0, @offset]
3914
+ return address0
3915
+ end
3916
+
3516
3917
  def _read_comment
3517
3918
  address0, index0 = FAILURE, @offset
3518
3919
  cached = @cache[:comment][index0]
@@ -3662,7 +4063,7 @@ module ExtendedJSON
3662
4063
  if elements0.nil?
3663
4064
  address0 = FAILURE
3664
4065
  else
3665
- address0 = TreeNode24.new(@input[index1...@offset], index1, elements0)
4066
+ address0 = TreeNode27.new(@input[index1...@offset], index1, elements0)
3666
4067
  @offset = @offset
3667
4068
  end
3668
4069
  @cache[:delimiter][index0] = [address0, @offset]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo-ejson
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Bondar
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-10 00:00:00.000000000 Z
11
+ date: 2020-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -121,7 +121,7 @@ metadata:
121
121
  homepage_uri: https://gibhub.com/db-ai/mongo-ejson
122
122
  source_code_uri: https://gibhub.com/db-ai/mongo-ejson
123
123
  changelog_uri: https://gibhub.com/db-ai/mongo-ejson
124
- post_install_message:
124
+ post_install_message:
125
125
  rdoc_options: []
126
126
  require_paths:
127
127
  - lib
@@ -136,8 +136,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
136
  - !ruby/object:Gem::Version
137
137
  version: '0'
138
138
  requirements: []
139
- rubygems_version: 3.0.2
140
- signing_key:
139
+ rubygems_version: 3.1.2
140
+ signing_key:
141
141
  specification_version: 4
142
142
  summary: MongoDB Extended JS(ON) parser
143
143
  test_files: []