jiffy 1.0.4 → 1.1.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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +13 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +27 -28
  5. data/Rakefile +17 -0
  6. data/bin/jiffy +28 -3
  7. data/jiffy.gemspec +15 -66
  8. data/lib/jiffy.rb +27 -27
  9. data/lib/jiffy/array_mimicking_io.rb +1 -1
  10. data/lib/jiffy/outputter.rb +85 -0
  11. data/lib/jiffy/outputters/json.rb +35 -0
  12. data/lib/jiffy/outputters/ruby.rb +35 -0
  13. data/lib/jiffy/parser.rb +17 -0
  14. data/lib/jiffy/parsers/json.rb +18 -42
  15. data/lib/jiffy/parsers/json.rl +10 -22
  16. data/lib/jiffy/parsers/json_array.rb +22 -29
  17. data/lib/jiffy/parsers/json_array.rl +11 -12
  18. data/lib/jiffy/parsers/json_float.rb +39 -21
  19. data/lib/jiffy/parsers/json_float.rl +15 -7
  20. data/lib/jiffy/parsers/json_object.rb +30 -49
  21. data/lib/jiffy/parsers/json_object.rl +13 -20
  22. data/lib/jiffy/parsers/json_string.rb +70 -27
  23. data/lib/jiffy/parsers/json_string.rl +21 -6
  24. data/lib/jiffy/parsers/json_value.rb +33 -52
  25. data/lib/jiffy/parsers/json_value.rl +15 -34
  26. data/lib/jiffy/version.rb +1 -1
  27. data/test/jiffy_test.rb +261 -34
  28. data/test/outputter_test.rb +155 -0
  29. data/test/outputters/json_test.rb +22 -0
  30. metadata +9 -60
  31. data/lib/jiffy/json_outputter.rb +0 -62
  32. data/test/negative-examples/hexadecimal.json +0 -3
  33. data/test/negative-examples/infinity-value.json +0 -3
  34. data/test/negative-examples/leading-comma.json +0 -3
  35. data/test/negative-examples/leading-zero.json +0 -3
  36. data/test/negative-examples/line-break.json +0 -4
  37. data/test/negative-examples/missing-colon.json +0 -3
  38. data/test/negative-examples/nan-value,json +0 -3
  39. data/test/negative-examples/positive-float.json +0 -3
  40. data/test/negative-examples/positive-integer.json +0 -3
  41. data/test/negative-examples/single-quote.json +0 -3
  42. data/test/negative-examples/string-as-root.json +0 -1
  43. data/test/negative-examples/tab-character.json +0 -3
  44. data/test/negative-examples/trailing-array-seperator.json +0 -3
  45. data/test/negative-examples/trailing-object-seperator.json +0 -3
  46. data/test/negative-examples/true-as-root.json +0 -1
  47. data/test/negative-examples/unclosed-array.json +0 -2
  48. data/test/negative-examples/unclosed-object.json +0 -2
  49. data/test/positive-examples/array-as-root.json +0 -3
  50. data/test/positive-examples/array-nested-inside-array.json +0 -5
  51. data/test/positive-examples/array-nested-inside-object.json +0 -5
  52. data/test/positive-examples/false-value.json +0 -3
  53. data/test/positive-examples/null-value.json +0 -3
  54. data/test/positive-examples/number-1.json +0 -3
  55. data/test/positive-examples/number-10.json +0 -3
  56. data/test/positive-examples/number-11.json +0 -3
  57. data/test/positive-examples/number-12.json +0 -3
  58. data/test/positive-examples/number-13.json +0 -3
  59. data/test/positive-examples/number-14.json +0 -3
  60. data/test/positive-examples/number-15.json +0 -3
  61. data/test/positive-examples/number-16.json +0 -3
  62. data/test/positive-examples/number-17.json +0 -3
  63. data/test/positive-examples/number-18.json +0 -3
  64. data/test/positive-examples/number-19.json +0 -3
  65. data/test/positive-examples/number-2.json +0 -3
  66. data/test/positive-examples/number-20.json +0 -3
  67. data/test/positive-examples/number-3.json +0 -3
  68. data/test/positive-examples/number-4.json +0 -3
  69. data/test/positive-examples/number-5.json +0 -3
  70. data/test/positive-examples/number-6.json +0 -3
  71. data/test/positive-examples/number-7.json +0 -3
  72. data/test/positive-examples/number-8.json +0 -3
  73. data/test/positive-examples/number-9.json +0 -3
  74. data/test/positive-examples/object-as-root.json +0 -3
  75. data/test/positive-examples/object-nested-inside-array.json +0 -5
  76. data/test/positive-examples/object-nested-inside-object.json +0 -5
  77. data/test/positive-examples/seperated-array-values.json +0 -4
  78. data/test/positive-examples/seperated-object-properties.json +0 -4
  79. data/test/positive-examples/string-backspace.json +0 -3
  80. data/test/positive-examples/string-carriage-return.json +0 -3
  81. data/test/positive-examples/string-formfeed.json +0 -3
  82. data/test/positive-examples/string-horizontal-tab.json +0 -3
  83. data/test/positive-examples/string-newline.json +0 -3
  84. data/test/positive-examples/string-quotation.json +0 -3
  85. data/test/positive-examples/string-reverse-solidus.json +0 -3
  86. data/test/positive-examples/string-solidus.json +0 -3
  87. data/test/positive-examples/string-trivial.json +0 -3
  88. data/test/positive-examples/string-unicode.json +0 -3
  89. data/test/positive-examples/true-value.json +0 -3
@@ -4,32 +4,40 @@
4
4
 
5
5
  action exit { fhold; fbreak; }
6
6
 
7
- action char { o.t :char, [data[p]].pack("c*") }
8
- action number { o.t :number, [data[p]].pack("c*").to_i }
7
+ action char { y << [:char, [data[p]].pack("c*")] }
8
+ action number { y << [:number, [data[p]].pack("c*").to_i] }
9
+ action exponent { y << :exponent }
10
+ action minus { y << :minus }
11
+ action plus { y << :plus }
9
12
 
10
- significand = '-'? @char ('0' >number | [1-9] >char [0-9]* $number) ('.' >char [0-9]+ $number)?;
13
+ significand = '-'? @minus ('0' >number | [1-9] >number [0-9]* $number) ('.' >char [0-9]+ $number)?;
11
14
 
12
- exponent = [Ee] >char [+\-]? @char [0-9]+ $number;
15
+ exponent = [Ee] >exponent ( '-' >minus | '+' >plus )? [0-9]+ $number;
13
16
 
14
17
  main := (significand exponent?) (^[0-9Ee.\-]? @exit );
15
18
  }%%
16
19
 
17
20
  class Jiffy
18
21
  module Parsers
19
- module JsonFloat
22
+ class JsonFloat < Parser
20
23
  def initialize(*args)
21
24
  %% write data;
25
+
22
26
  super
23
27
  end
24
28
 
25
- def parse_json_float(p, pe)
26
- t_p = p
29
+ def parse
30
+ pe = :ignored
31
+ eof = :ignored
32
+ p = self.p
27
33
 
28
34
  %% write init;
29
35
  %% write exec;
30
36
 
31
37
  if cs >= json_float_first_final
32
38
  p
39
+ else
40
+ raise_unparseable p
33
41
  end
34
42
  end
35
43
  end
@@ -1,12 +1,12 @@
1
1
 
2
2
  # line 1 "json_object.rl"
3
3
 
4
- # line 36 "json_object.rl"
4
+ # line 24 "json_object.rl"
5
5
 
6
6
 
7
7
  class Jiffy
8
8
  module Parsers
9
- module JsonObject
9
+ class JsonObject < Parser
10
10
  def initialize(*args)
11
11
 
12
12
  # line 13 "json_object.rb"
@@ -140,22 +140,27 @@ end
140
140
  self.json_object_en_main = 1;
141
141
 
142
142
 
143
- # line 43 "json_object.rl"
143
+ # line 31 "json_object.rl"
144
+
144
145
  super
145
146
  end
146
147
 
147
- def parse_json_object(p, pe)
148
+ def parse
149
+ pe = :ignored
150
+ eof = :ignored
151
+ p = self.p
152
+
148
153
 
149
- # line 150 "json_object.rb"
154
+ # line 155 "json_object.rb"
150
155
  begin
151
156
  p ||= 0
152
157
  pe ||= data.length
153
158
  cs = json_object_start
154
159
  end
155
160
 
156
- # line 48 "json_object.rl"
161
+ # line 41 "json_object.rl"
157
162
 
158
- # line 159 "json_object.rb"
163
+ # line 164 "json_object.rb"
159
164
  begin
160
165
  _klen, _trans, _keys, _acts, _nacts = nil
161
166
  _goto_level = 0
@@ -240,42 +245,18 @@ when 0 then
240
245
  # line 5 "json_object.rl"
241
246
  begin
242
247
 
243
- np = parse_json_value(p, pe)
244
-
245
- if np
246
- begin p = (( np))-1; end
247
-
248
- else
249
- p = p - 1; begin
250
- p += 1
251
- _trigger_goto = true
252
- _goto_level = _out
253
- break
254
- end
248
+ begin p = (( JsonValue.new(p: p, data: data, yielder: yielder).parse))-1; end
255
249
 
256
- end
257
250
  end
258
251
  when 1 then
259
- # line 15 "json_object.rl"
252
+ # line 9 "json_object.rl"
260
253
  begin
261
254
 
262
- np = parse_json_string(p, pe)
255
+ begin p = (( JsonString.new(p: p, data: data, yielder: yielder).parse))-1; end
263
256
 
264
- if np
265
- begin p = (( np))-1; end
266
-
267
- else
268
- p = p - 1; begin
269
- p += 1
270
- _trigger_goto = true
271
- _goto_level = _out
272
- break
273
- end
274
-
275
- end
276
257
  end
277
258
  when 2 then
278
- # line 25 "json_object.rl"
259
+ # line 13 "json_object.rl"
279
260
  begin
280
261
  p = p - 1; begin
281
262
  p += 1
@@ -285,30 +266,30 @@ when 2 then
285
266
  end
286
267
  end
287
268
  when 3 then
288
- # line 27 "json_object.rl"
269
+ # line 15 "json_object.rl"
289
270
  begin
290
- o.t :begin_string end
271
+ y << :begin_name end
291
272
  when 4 then
292
- # line 27 "json_object.rl"
273
+ # line 15 "json_object.rl"
293
274
  begin
294
- o.t :end_string end
275
+ y << :end_name end
295
276
  when 5 then
296
- # line 27 "json_object.rl"
277
+ # line 15 "json_object.rl"
297
278
  begin
298
- o.t :name_separator end
279
+ y << :name_separator end
299
280
  when 6 then
300
- # line 29 "json_object.rl"
281
+ # line 17 "json_object.rl"
301
282
  begin
302
- o.t :value_separator end
283
+ y << :value_separator end
303
284
  when 7 then
304
- # line 32 "json_object.rl"
285
+ # line 20 "json_object.rl"
305
286
  begin
306
- o.t :begin_object end
287
+ y << :begin_object end
307
288
  when 8 then
308
- # line 34 "json_object.rl"
289
+ # line 22 "json_object.rl"
309
290
  begin
310
- o.t :end_object end
311
- # line 312 "json_object.rb"
291
+ y << :end_object end
292
+ # line 293 "json_object.rb"
312
293
  end # action switch
313
294
  end
314
295
  end
@@ -335,7 +316,7 @@ when 8 then
335
316
  end
336
317
  end
337
318
 
338
- # line 49 "json_object.rl"
319
+ # line 42 "json_object.rl"
339
320
 
340
321
  if cs >= json_object_first_final
341
322
  p + 1
@@ -3,47 +3,40 @@
3
3
  include json_common "json_common.rl";
4
4
 
5
5
  action parse_value {
6
- np = parse_json_value(fpc, pe)
7
-
8
- if np
9
- fexec np;
10
- else
11
- fhold; fbreak;
12
- end
6
+ fexec JsonValue.new(p: p, data: data, yielder: yielder).parse;
13
7
  }
14
8
 
15
9
  action parse_name {
16
- np = parse_json_string(fpc, pe)
17
-
18
- if np
19
- fexec np;
20
- else
21
- fhold; fbreak;
22
- end
10
+ fexec JsonString.new(p: p, data: data, yielder: yielder).parse;
23
11
  }
24
12
 
25
13
  action exit { fhold; fbreak; }
26
14
 
27
- pair = ignore* begin_name >{ o.t :begin_string } >parse_name @{ o.t :end_string } ignore* name_separator >{ o.t :name_separator } ignore* begin_value >parse_value;
15
+ pair = ignore* begin_name >{ y << :begin_name } >parse_name @{ y << :end_name } ignore* name_separator >{ y << :name_separator } ignore* begin_value >parse_value;
28
16
 
29
- next_pair = ignore* value_separator >{ o.t :value_separator } pair;
17
+ next_pair = ignore* value_separator >{ y << :value_separator } pair;
30
18
 
31
19
  main := (
32
- begin_object >{ o.t :begin_object }
20
+ begin_object >{ y << :begin_object }
33
21
  (pair (next_pair)*)? ignore*
34
- end_object >{ o.t :end_object }
22
+ end_object >{ y << :end_object }
35
23
  ) @exit;
36
24
  }%%
37
25
 
38
26
  class Jiffy
39
27
  module Parsers
40
- module JsonObject
28
+ class JsonObject < Parser
41
29
  def initialize(*args)
42
30
  %% write data;
31
+
43
32
  super
44
33
  end
45
34
 
46
- def parse_json_object(p, pe)
35
+ def parse
36
+ pe = :ignored
37
+ eof = :ignored
38
+ p = self.p
39
+
47
40
  %% write init;
48
41
  %% write exec;
49
42
 
@@ -1,12 +1,12 @@
1
1
 
2
2
  # line 1 "json_string.rl"
3
3
 
4
- # line 17 "json_string.rl"
4
+ # line 29 "json_string.rl"
5
5
 
6
6
 
7
7
  class Jiffy
8
8
  module Parsers
9
- module JsonString
9
+ class JsonString < Parser
10
10
  def initialize(*args)
11
11
 
12
12
  # line 13 "json_string.rb"
@@ -15,7 +15,10 @@ class << self
15
15
  private :_json_string_actions, :_json_string_actions=
16
16
  end
17
17
  self._json_string_actions = [
18
- 0, 1, 0, 1, 1
18
+ 0, 1, 0, 1, 1, 1, 2, 1,
19
+ 3, 1, 4, 1, 5, 1, 6, 1,
20
+ 7, 1, 8, 1, 9, 1, 10, 1,
21
+ 11, 2, 11, 12
19
22
  ]
20
23
 
21
24
  class << self
@@ -66,25 +69,16 @@ self._json_string_index_offsets = [
66
69
  32
67
70
  ]
68
71
 
69
- class << self
70
- attr_accessor :_json_string_indicies
71
- private :_json_string_indicies, :_json_string_indicies=
72
- end
73
- self._json_string_indicies = [
74
- 0, 1, 3, 4, 1, 2, 2, 2,
75
- 2, 2, 2, 2, 2, 2, 5, 1,
76
- 6, 6, 6, 1, 7, 7, 7, 1,
77
- 8, 8, 8, 1, 2, 2, 2, 1,
78
- 1, 0
79
- ]
80
-
81
72
  class << self
82
73
  attr_accessor :_json_string_trans_targs
83
74
  private :_json_string_trans_targs, :_json_string_trans_targs=
84
75
  end
85
76
  self._json_string_trans_targs = [
86
- 2, 0, 2, 8, 3, 4, 5, 6,
87
- 7
77
+ 2, 0, 8, 3, 0, 2, 2, 2,
78
+ 2, 2, 2, 2, 2, 2, 4, 0,
79
+ 5, 5, 5, 0, 6, 6, 6, 0,
80
+ 7, 7, 7, 0, 2, 2, 2, 0,
81
+ 0, 0
88
82
  ]
89
83
 
90
84
  class << self
@@ -92,8 +86,11 @@ class << self
92
86
  private :_json_string_trans_actions, :_json_string_trans_actions=
93
87
  end
94
88
  self._json_string_trans_actions = [
95
- 0, 0, 3, 1, 3, 3, 3, 3,
96
- 3
89
+ 0, 0, 1, 21, 0, 3, 5, 9,
90
+ 7, 11, 13, 15, 17, 19, 0, 0,
91
+ 23, 23, 23, 0, 23, 23, 23, 0,
92
+ 23, 23, 23, 0, 25, 25, 25, 0,
93
+ 0, 0
97
94
  ]
98
95
 
99
96
  class << self
@@ -115,12 +112,15 @@ end
115
112
  self.json_string_en_main = 1;
116
113
 
117
114
 
118
- # line 24 "json_string.rl"
115
+ # line 36 "json_string.rl"
116
+
119
117
  super
120
118
  end
121
119
 
122
- def parse_json_string(p, pe)
123
- t_p = p + 1
120
+ def parse
121
+ pe = :ignored
122
+ eof = :ignored
123
+ p = self.p
124
124
 
125
125
 
126
126
  # line 127 "json_string.rb"
@@ -130,7 +130,7 @@ begin
130
130
  cs = json_string_start
131
131
  end
132
132
 
133
- # line 31 "json_string.rl"
133
+ # line 46 "json_string.rl"
134
134
 
135
135
  # line 136 "json_string.rb"
136
136
  begin
@@ -203,7 +203,6 @@ begin
203
203
  _trans += _klen
204
204
  end
205
205
  end while false
206
- _trans = _json_string_indicies[_trans]
207
206
  cs = _json_string_trans_targs[_trans]
208
207
  if _json_string_trans_actions[_trans] != 0
209
208
  _acts = _json_string_trans_actions[_trans]
@@ -226,8 +225,52 @@ when 0 then
226
225
  when 1 then
227
226
  # line 7 "json_string.rl"
228
227
  begin
229
- o.t :char, [data[p]].pack("c*") end
230
- # line 231 "json_string.rb"
228
+ y << [:char, [data[p]].pack("c*")] end
229
+ when 2 then
230
+ # line 13 "json_string.rl"
231
+ begin
232
+ y << :escaped_quotation_mark end
233
+ when 3 then
234
+ # line 14 "json_string.rl"
235
+ begin
236
+ y << :escaped_reverse_solidus end
237
+ when 4 then
238
+ # line 15 "json_string.rl"
239
+ begin
240
+ y << :escaped_solidus end
241
+ when 5 then
242
+ # line 16 "json_string.rl"
243
+ begin
244
+ y << :escaped_backspace end
245
+ when 6 then
246
+ # line 17 "json_string.rl"
247
+ begin
248
+ y << :escaped_formfeed end
249
+ when 7 then
250
+ # line 18 "json_string.rl"
251
+ begin
252
+ y << :escaped_newline end
253
+ when 8 then
254
+ # line 19 "json_string.rl"
255
+ begin
256
+ y << :escaped_carriage_return end
257
+ when 9 then
258
+ # line 20 "json_string.rl"
259
+ begin
260
+ y << :escaped_horizontal_tab end
261
+ when 10 then
262
+ # line 23 "json_string.rl"
263
+ begin
264
+ unicode_sequence = "" end
265
+ when 11 then
266
+ # line 23 "json_string.rl"
267
+ begin
268
+ unicode_sequence << [data[p]].pack("c*") end
269
+ when 12 then
270
+ # line 23 "json_string.rl"
271
+ begin
272
+ y << [:escaped_unicode, unicode_sequence.to_s] end
273
+ # line 274 "json_string.rb"
231
274
  end # action switch
232
275
  end
233
276
  end
@@ -254,7 +297,7 @@ when 1 then
254
297
  end
255
298
  end
256
299
 
257
- # line 32 "json_string.rl"
300
+ # line 47 "json_string.rl"
258
301
 
259
302
  if cs >= json_string_first_final
260
303
  p + 1
@@ -4,11 +4,23 @@
4
4
 
5
5
  action exit { fhold; fbreak; }
6
6
 
7
- action char { o.t :char, [data[p]].pack("c*") }
7
+ action char { y << [:char, [data[p]].pack("c*")] }
8
+ action unicode { y << [:unicode, data[(p-4)..p].pack("c*")] }
8
9
 
9
10
  character = ^([\"\\] | 0..0x1f) >char;
10
- sequence = '\\' >char [\"\\/bfnrt] >char;
11
- unicode = '\\' >char 'u' >char [0-9a-fA-F]{4} $char;
11
+
12
+ sequence = '\\' (
13
+ '"' >{ y << :escaped_quotation_mark } |
14
+ '\\' >{ y << :escaped_reverse_solidus } |
15
+ '/' >{ y << :escaped_solidus } |
16
+ 'b' >{ y << :escaped_backspace } |
17
+ 'f' >{ y << :escaped_formfeed } |
18
+ 'n' >{ y << :escaped_newline } |
19
+ 'r' >{ y << :escaped_carriage_return } |
20
+ 't' >{ y << :escaped_horizontal_tab }
21
+ );
22
+
23
+ unicode = '\\u' >{ unicode_sequence = "" } [0-9a-fA-F]{4} ${ unicode_sequence << [data[p]].pack("c*") } @{ y << [:escaped_unicode, unicode_sequence.to_s] };
12
24
 
13
25
  main := '"' (
14
26
  character | sequence | unicode
@@ -18,14 +30,17 @@
18
30
 
19
31
  class Jiffy
20
32
  module Parsers
21
- module JsonString
33
+ class JsonString < Parser
22
34
  def initialize(*args)
23
35
  %% write data;
36
+
24
37
  super
25
38
  end
26
39
 
27
- def parse_json_string(p, pe)
28
- t_p = p + 1
40
+ def parse
41
+ pe = :ignored
42
+ eof = :ignored
43
+ p = self.p
29
44
 
30
45
  %% write init;
31
46
  %% write exec;