csv_plus_plus 0.1.0 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -1
  3. data/README.md +18 -62
  4. data/lib/csv_plus_plus/benchmarked_compiler.rb +62 -0
  5. data/lib/csv_plus_plus/can_define_references.rb +88 -0
  6. data/lib/csv_plus_plus/can_resolve_references.rb +8 -0
  7. data/lib/csv_plus_plus/cell.rb +3 -3
  8. data/lib/csv_plus_plus/cli.rb +24 -7
  9. data/lib/csv_plus_plus/color.rb +12 -6
  10. data/lib/csv_plus_plus/compiler.rb +156 -0
  11. data/lib/csv_plus_plus/data_validation.rb +138 -0
  12. data/lib/csv_plus_plus/{language → entities}/ast_builder.rb +5 -7
  13. data/lib/csv_plus_plus/entities/boolean.rb +31 -0
  14. data/lib/csv_plus_plus/{language → entities}/builtins.rb +2 -4
  15. data/lib/csv_plus_plus/entities/cell_reference.rb +60 -0
  16. data/lib/csv_plus_plus/entities/date.rb +30 -0
  17. data/lib/csv_plus_plus/entities/entity.rb +84 -0
  18. data/lib/csv_plus_plus/entities/function.rb +33 -0
  19. data/lib/csv_plus_plus/entities/function_call.rb +35 -0
  20. data/lib/csv_plus_plus/entities/number.rb +34 -0
  21. data/lib/csv_plus_plus/entities/runtime_value.rb +26 -0
  22. data/lib/csv_plus_plus/entities/string.rb +29 -0
  23. data/lib/csv_plus_plus/entities/variable.rb +25 -0
  24. data/lib/csv_plus_plus/entities.rb +33 -0
  25. data/lib/csv_plus_plus/error/error.rb +10 -0
  26. data/lib/csv_plus_plus/error/formula_syntax_error.rb +36 -0
  27. data/lib/csv_plus_plus/error/modifier_syntax_error.rb +27 -0
  28. data/lib/csv_plus_plus/error/modifier_validation_error.rb +49 -0
  29. data/lib/csv_plus_plus/{language → error}/syntax_error.rb +6 -14
  30. data/lib/csv_plus_plus/error/writer_error.rb +9 -0
  31. data/lib/csv_plus_plus/error.rb +9 -2
  32. data/lib/csv_plus_plus/expand.rb +3 -1
  33. data/lib/csv_plus_plus/google_api_client.rb +4 -0
  34. data/lib/csv_plus_plus/lexer/lexer.rb +19 -11
  35. data/lib/csv_plus_plus/modifier/conditional_formatting.rb +17 -0
  36. data/lib/csv_plus_plus/modifier.rb +73 -70
  37. data/lib/csv_plus_plus/options.rb +3 -0
  38. data/lib/csv_plus_plus/parser/cell_value.tab.rb +305 -0
  39. data/lib/csv_plus_plus/parser/code_section.tab.rb +410 -0
  40. data/lib/csv_plus_plus/parser/modifier.tab.rb +484 -0
  41. data/lib/csv_plus_plus/references.rb +68 -0
  42. data/lib/csv_plus_plus/row.rb +0 -3
  43. data/lib/csv_plus_plus/runtime.rb +199 -0
  44. data/lib/csv_plus_plus/scope.rb +196 -0
  45. data/lib/csv_plus_plus/template.rb +21 -5
  46. data/lib/csv_plus_plus/validated_modifier.rb +164 -0
  47. data/lib/csv_plus_plus/version.rb +1 -1
  48. data/lib/csv_plus_plus/writer/file_backer_upper.rb +6 -4
  49. data/lib/csv_plus_plus/writer/google_sheet_builder.rb +24 -29
  50. data/lib/csv_plus_plus/writer/google_sheet_modifier.rb +33 -12
  51. data/lib/csv_plus_plus/writer/rubyxl_builder.rb +3 -6
  52. data/lib/csv_plus_plus.rb +41 -16
  53. metadata +34 -24
  54. data/lib/csv_plus_plus/code_section.rb +0 -68
  55. data/lib/csv_plus_plus/language/benchmarked_compiler.rb +0 -65
  56. data/lib/csv_plus_plus/language/cell_value.tab.rb +0 -332
  57. data/lib/csv_plus_plus/language/code_section.tab.rb +0 -442
  58. data/lib/csv_plus_plus/language/compiler.rb +0 -157
  59. data/lib/csv_plus_plus/language/entities/boolean.rb +0 -33
  60. data/lib/csv_plus_plus/language/entities/cell_reference.rb +0 -33
  61. data/lib/csv_plus_plus/language/entities/entity.rb +0 -86
  62. data/lib/csv_plus_plus/language/entities/function.rb +0 -35
  63. data/lib/csv_plus_plus/language/entities/function_call.rb +0 -26
  64. data/lib/csv_plus_plus/language/entities/number.rb +0 -36
  65. data/lib/csv_plus_plus/language/entities/runtime_value.rb +0 -28
  66. data/lib/csv_plus_plus/language/entities/string.rb +0 -31
  67. data/lib/csv_plus_plus/language/entities/variable.rb +0 -25
  68. data/lib/csv_plus_plus/language/entities.rb +0 -28
  69. data/lib/csv_plus_plus/language/references.rb +0 -70
  70. data/lib/csv_plus_plus/language/runtime.rb +0 -205
  71. data/lib/csv_plus_plus/language/scope.rb +0 -188
  72. data/lib/csv_plus_plus/modifier.tab.rb +0 -907
@@ -1,442 +0,0 @@
1
- #
2
- # DO NOT MODIFY!!!!
3
- # This file is automatically generated by Racc 1.6.2
4
- # from Racc grammar file "".
5
- #
6
-
7
- require 'racc/parser.rb'
8
-
9
- require_relative '../lexer'
10
- require_relative '../code_section'
11
-
12
- module CSVPlusPlus
13
- module Language
14
- class CodeSectionParser < Racc::Parser
15
-
16
- module_eval(<<'...end code_section.y/module_eval...', 'code_section.y', 67)
17
- include ::CSVPlusPlus::Lexer
18
-
19
- def initialize
20
- super
21
- @code_section = CodeSection.new
22
- end
23
-
24
- protected
25
-
26
- def anything_to_parse?(input)
27
- @rest = input.strip
28
-
29
- return !@rest.index(::CSVPlusPlus::Lexer::END_OF_CODE_SECTION).nil?
30
- end
31
-
32
- def parse_subject
33
- 'code section'
34
- end
35
-
36
- def tokenizer
37
- ::CSVPlusPlus::Lexer::Tokenizer.new(
38
- catchall: /[\(\)\{\}\/\*\+\-,=&]/,
39
- ignore: /\s+|\#[^\n]+\n/,
40
- stop_fn: lambda do |scanner|
41
- return false unless scanner.scan(/#{::CSVPlusPlus::Lexer::END_OF_CODE_SECTION}/)
42
-
43
- @tokens << [:END_OF_CODE, scanner.matched]
44
- @rest = scanner.rest.strip
45
- true
46
- end,
47
- tokens: [
48
- [/\n/, :EOL],
49
- [/:=/, :ASSIGN],
50
- [/\bdef\b/, :FN_DEF],
51
- [/\bTRUE\b/i, :TRUE],
52
- [/\bFALSE\b/i, :FALSE],
53
- [/"(?:[^"\\]|\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4}))*"/, :STRING],
54
- [/-?[\d.]+/, :NUMBER],
55
- [/\$\$/, :VAR_REF],
56
- [/[!:\w_]+/, :ID],
57
- ],
58
- )
59
- end
60
-
61
- def return_value
62
- [@code_section, @rest]
63
- end
64
-
65
- private
66
-
67
- def e(type, *entity_args)
68
- ::CSVPlusPlus::Language::TYPES[type].new(*entity_args)
69
- end
70
-
71
- def def_function(id, arguments, body)
72
- fn_def = e(:function, id, arguments, body)
73
- @code_section.def_function(fn_def.id, fn_def)
74
- end
75
-
76
- def def_variable(id, ast)
77
- @code_section.def_variable(id, ast)
78
- end
79
- ...end code_section.y/module_eval...
80
- ##### State transition tables begin ###
81
-
82
- racc_action_table = [
83
- 45, 27, 3, 37, 51, 7, 38, 52, 28, 9,
84
- 19, 8, 29, 30, 31, 32, 33, 24, 25, 22,
85
- 21, 23, 20, 19, 29, 30, 31, 32, 33, 19,
86
- 24, 25, 22, 21, 23, 20, 24, 25, 22, 21,
87
- 23, 20, 19, 29, 30, 31, 32, 33, 19, 24,
88
- 25, 22, 21, 23, 20, 24, 25, 22, 21, 23,
89
- 20, 19, 29, 30, 31, 32, 33, 19, 24, 25,
90
- 22, 21, 23, 20, 24, 25, 22, 21, 23, 20,
91
- 19, 29, 30, 31, 32, 33, 12, 24, 25, 22,
92
- 21, 23, 20, 19, 48, 13, 14, 15, 35, 19,
93
- 24, 25, 22, 21, 23, 20, 24, 25, 22, 21,
94
- 23, 20, 19, 29, 30, 31, 32, 33, 36, 24,
95
- 25, 22, 21, 23, 20, 10, 50, nil, 7, 29,
96
- 30, 31, 32, 33, 8, 29, 30, 31, 32, 33,
97
- 29, 30, 31, 32, 33, 29, 30, 31, 32, 33,
98
- 29, 30, 31, 32, 33 ]
99
-
100
- racc_action_check = [
101
- 34, 15, 0, 26, 47, 0, 26, 47, 15, 1,
102
- 13, 0, 34, 34, 34, 34, 34, 13, 13, 13,
103
- 13, 13, 13, 19, 16, 16, 16, 16, 16, 27,
104
- 19, 19, 19, 19, 19, 19, 27, 27, 27, 27,
105
- 27, 27, 29, 39, 39, 39, 39, 39, 30, 29,
106
- 29, 29, 29, 29, 29, 30, 30, 30, 30, 30,
107
- 30, 31, 40, 40, 40, 40, 40, 32, 31, 31,
108
- 31, 31, 31, 31, 32, 32, 32, 32, 32, 32,
109
- 33, 41, 41, 41, 41, 41, 7, 33, 33, 33,
110
- 33, 33, 33, 36, 36, 8, 9, 12, 20, 37,
111
- 36, 36, 36, 36, 36, 36, 37, 37, 37, 37,
112
- 37, 37, 52, 42, 42, 42, 42, 42, 25, 52,
113
- 52, 52, 52, 52, 52, 2, 38, nil, 2, 43,
114
- 43, 43, 43, 43, 2, 44, 44, 44, 44, 44,
115
- 46, 46, 46, 46, 46, 49, 49, 49, 49, 49,
116
- 53, 53, 53, 53, 53 ]
117
-
118
- racc_action_pointer = [
119
- 0, 9, 123, nil, nil, nil, nil, 75, 89, 96,
120
- nil, nil, 94, 7, nil, -3, 8, nil, nil, 20,
121
- 87, nil, nil, nil, nil, 115, -1, 26, nil, 39,
122
- 45, 58, 64, 77, -4, nil, 90, 96, 115, 27,
123
- 46, 65, 97, 113, 119, nil, 124, 0, nil, 129,
124
- nil, nil, 109, 134 ]
125
-
126
- racc_action_default = [
127
- -30, -30, -30, -2, -4, -5, -6, -30, -30, -30,
128
- -1, -3, -30, -30, 54, -30, -11, -12, -13, -30,
129
- -30, -16, -17, -18, -19, -20, -30, -30, -10, -30,
130
- -30, -30, -30, -30, -30, -15, -30, -30, -30, -8,
131
- -21, -22, -23, -24, -25, -14, -29, -30, -27, -7,
132
- -9, -26, -30, -28 ]
133
-
134
- racc_goto_table = [
135
- 16, 4, 1, 11, 2, 26, 34, 47, nil, nil,
136
- nil, nil, nil, nil, 39, nil, 40, 41, 42, 43,
137
- 44, nil, nil, 46, 49, nil, nil, nil, nil, nil,
138
- nil, nil, nil, nil, nil, nil, nil, nil, nil, 53 ]
139
-
140
- racc_goto_check = [
141
- 7, 3, 1, 3, 2, 6, 7, 10, nil, nil,
142
- nil, nil, nil, nil, 7, nil, 7, 7, 7, 7,
143
- 7, nil, nil, 7, 7, nil, nil, nil, nil, nil,
144
- nil, nil, nil, nil, nil, nil, nil, nil, nil, 7 ]
145
-
146
- racc_goto_pointer = [
147
- nil, 2, 4, 1, nil, nil, -10, -13, nil, nil,
148
- -29 ]
149
-
150
- racc_goto_default = [
151
- nil, nil, nil, nil, 5, 6, nil, nil, 17, 18,
152
- nil ]
153
-
154
- racc_reduce_table = [
155
- 0, 0, :racc_error,
156
- 2, 22, :_reduce_none,
157
- 1, 22, :_reduce_none,
158
- 2, 23, :_reduce_none,
159
- 1, 23, :_reduce_none,
160
- 1, 24, :_reduce_none,
161
- 1, 24, :_reduce_none,
162
- 6, 25, :_reduce_7,
163
- 5, 25, :_reduce_8,
164
- 3, 27, :_reduce_9,
165
- 1, 27, :_reduce_10,
166
- 3, 26, :_reduce_11,
167
- 1, 28, :_reduce_none,
168
- 1, 28, :_reduce_none,
169
- 3, 28, :_reduce_14,
170
- 2, 28, :_reduce_15,
171
- 1, 28, :_reduce_16,
172
- 1, 28, :_reduce_17,
173
- 1, 28, :_reduce_18,
174
- 1, 28, :_reduce_19,
175
- 1, 28, :_reduce_20,
176
- 3, 30, :_reduce_21,
177
- 3, 30, :_reduce_22,
178
- 3, 30, :_reduce_23,
179
- 3, 30, :_reduce_24,
180
- 3, 30, :_reduce_25,
181
- 4, 29, :_reduce_26,
182
- 3, 29, :_reduce_27,
183
- 3, 31, :_reduce_28,
184
- 1, 31, :_reduce_29 ]
185
-
186
- racc_reduce_n = 30
187
-
188
- racc_shift_n = 54
189
-
190
- racc_token_table = {
191
- false => 0,
192
- :error => 1,
193
- :END_OF_CODE => 2,
194
- "(" => 3,
195
- ")" => 4,
196
- :FN_DEF => 5,
197
- :ASSIGN => 6,
198
- "," => 7,
199
- :CELL_REF => 8,
200
- :EOL => 9,
201
- :FALSE => 10,
202
- :ID => 11,
203
- :NUMBER => 12,
204
- :STRING => 13,
205
- :TRUE => 14,
206
- :VAR_REF => 15,
207
- "&" => 16,
208
- "*" => 17,
209
- "+" => 18,
210
- "-" => 19,
211
- "/" => 20 }
212
-
213
- racc_nt_base = 21
214
-
215
- racc_use_result_var = true
216
-
217
- Racc_arg = [
218
- racc_action_table,
219
- racc_action_check,
220
- racc_action_default,
221
- racc_action_pointer,
222
- racc_goto_table,
223
- racc_goto_check,
224
- racc_goto_default,
225
- racc_goto_pointer,
226
- racc_nt_base,
227
- racc_reduce_table,
228
- racc_token_table,
229
- racc_shift_n,
230
- racc_reduce_n,
231
- racc_use_result_var ]
232
-
233
- Racc_token_to_s_table = [
234
- "$end",
235
- "error",
236
- "END_OF_CODE",
237
- "\"(\"",
238
- "\")\"",
239
- "FN_DEF",
240
- "ASSIGN",
241
- "\",\"",
242
- "CELL_REF",
243
- "EOL",
244
- "FALSE",
245
- "ID",
246
- "NUMBER",
247
- "STRING",
248
- "TRUE",
249
- "VAR_REF",
250
- "\"&\"",
251
- "\"*\"",
252
- "\"+\"",
253
- "\"-\"",
254
- "\"/\"",
255
- "$start",
256
- "code_section",
257
- "code",
258
- "def",
259
- "fn_def",
260
- "var_def",
261
- "fn_def_args",
262
- "exp",
263
- "fn_call",
264
- "infix_fn_call",
265
- "fn_call_args" ]
266
-
267
- Racc_debug_parser = false
268
-
269
- ##### State transition tables end #####
270
-
271
- # reduce 0 omitted
272
-
273
- # reduce 1 omitted
274
-
275
- # reduce 2 omitted
276
-
277
- # reduce 3 omitted
278
-
279
- # reduce 4 omitted
280
-
281
- # reduce 5 omitted
282
-
283
- # reduce 6 omitted
284
-
285
- module_eval(<<'.,.,', 'code_section.y', 29)
286
- def _reduce_7(val, _values, result)
287
- def_function(val[1], val[3], val[5])
288
- result
289
- end
290
- .,.,
291
-
292
- module_eval(<<'.,.,', 'code_section.y', 30)
293
- def _reduce_8(val, _values, result)
294
- def_function(val[1], [], val[4])
295
- result
296
- end
297
- .,.,
298
-
299
- module_eval(<<'.,.,', 'code_section.y', 32)
300
- def _reduce_9(val, _values, result)
301
- result = val[0] << val[2]
302
- result
303
- end
304
- .,.,
305
-
306
- module_eval(<<'.,.,', 'code_section.y', 33)
307
- def _reduce_10(val, _values, result)
308
- result = [val[0]]
309
- result
310
- end
311
- .,.,
312
-
313
- module_eval(<<'.,.,', 'code_section.y', 35)
314
- def _reduce_11(val, _values, result)
315
- def_variable(val[0], val[2])
316
- result
317
- end
318
- .,.,
319
-
320
- # reduce 12 omitted
321
-
322
- # reduce 13 omitted
323
-
324
- module_eval(<<'.,.,', 'code_section.y', 39)
325
- def _reduce_14(val, _values, result)
326
- result = val[1]
327
- result
328
- end
329
- .,.,
330
-
331
- module_eval(<<'.,.,', 'code_section.y', 40)
332
- def _reduce_15(val, _values, result)
333
- result = e(:variable, val[1])
334
- result
335
- end
336
- .,.,
337
-
338
- module_eval(<<'.,.,', 'code_section.y', 41)
339
- def _reduce_16(val, _values, result)
340
- result = e(:string, val[0])
341
- result
342
- end
343
- .,.,
344
-
345
- module_eval(<<'.,.,', 'code_section.y', 42)
346
- def _reduce_17(val, _values, result)
347
- result = e(:number, val[0])
348
- result
349
- end
350
- .,.,
351
-
352
- module_eval(<<'.,.,', 'code_section.y', 43)
353
- def _reduce_18(val, _values, result)
354
- result = e(:boolean, true)
355
- result
356
- end
357
- .,.,
358
-
359
- module_eval(<<'.,.,', 'code_section.y', 44)
360
- def _reduce_19(val, _values, result)
361
- result = e(:boolean, false)
362
- result
363
- end
364
- .,.,
365
-
366
- module_eval(<<'.,.,', 'code_section.y', 45)
367
- def _reduce_20(val, _values, result)
368
- result = e(:cell_reference, val[0])
369
- result
370
- end
371
- .,.,
372
-
373
- module_eval(<<'.,.,', 'code_section.y', 47)
374
- def _reduce_21(val, _values, result)
375
- result = e(:function_call, :concat, [val[0], val[2]])
376
- result
377
- end
378
- .,.,
379
-
380
- module_eval(<<'.,.,', 'code_section.y', 48)
381
- def _reduce_22(val, _values, result)
382
- result = e(:function_call, :multiply, [val[0], val[2]])
383
- result
384
- end
385
- .,.,
386
-
387
- module_eval(<<'.,.,', 'code_section.y', 49)
388
- def _reduce_23(val, _values, result)
389
- result = e(:function_call, :add, [val[0], val[2]])
390
- result
391
- end
392
- .,.,
393
-
394
- module_eval(<<'.,.,', 'code_section.y', 50)
395
- def _reduce_24(val, _values, result)
396
- result = e(:function_call, :minus, [val[0], val[2]])
397
- result
398
- end
399
- .,.,
400
-
401
- module_eval(<<'.,.,', 'code_section.y', 51)
402
- def _reduce_25(val, _values, result)
403
- result = e(:function_call, :divide, [val[0], val[2]])
404
- result
405
- end
406
- .,.,
407
-
408
- module_eval(<<'.,.,', 'code_section.y', 53)
409
- def _reduce_26(val, _values, result)
410
- result = e(:function_call, val[0], val[2])
411
- result
412
- end
413
- .,.,
414
-
415
- module_eval(<<'.,.,', 'code_section.y', 54)
416
- def _reduce_27(val, _values, result)
417
- result = e(:function_call, val[0], [])
418
- result
419
- end
420
- .,.,
421
-
422
- module_eval(<<'.,.,', 'code_section.y', 56)
423
- def _reduce_28(val, _values, result)
424
- result = val[0] << val[2]
425
- result
426
- end
427
- .,.,
428
-
429
- module_eval(<<'.,.,', 'code_section.y', 57)
430
- def _reduce_29(val, _values, result)
431
- result = [val[0]]
432
- result
433
- end
434
- .,.,
435
-
436
- def _reduce_none(val, _values, result)
437
- val[0]
438
- end
439
-
440
- end # class CodeSectionParser
441
- end # module Language
442
- end # module CSVPlusPlus
@@ -1,157 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'csv'
4
- # TODO: move some of these out to csv_plus_plus.rb
5
- require_relative '../cell'
6
- require_relative '../modifier'
7
- require_relative '../modifier.tab'
8
- require_relative '../row'
9
- require_relative '../template'
10
- require_relative 'benchmarked_compiler'
11
- require_relative 'code_section.tab'
12
- require_relative 'entities'
13
- require_relative 'runtime'
14
- require_relative 'scope'
15
-
16
- module CSVPlusPlus
17
- module Language
18
- # Encapsulates the parsing and building of objects (+Template+ -> +Row+ -> +Cell+). Variable resolution is delegated
19
- # to the +Scope+
20
- #
21
- # @attr_reader options [Options] The +Options+ to compile with
22
- # @attr_reader runtime [Runtime] The runtime execution
23
- # @attr_reader scope [Scope] +Scope+ for variable resolution
24
- class Compiler
25
- attr_reader :timings, :benchmark, :options, :runtime, :scope
26
-
27
- # Create a compiler and make sure it gets cleaned up
28
- #
29
- # @param runtime [Runtime] The initial +Runtime+ for the compiler
30
- # @param options [Options]
31
- def self.with_compiler(runtime:, options:, &block)
32
- compiler = new(options:, runtime:)
33
- if options.verbose
34
- ::CSVPlusPlus::Language::BenchmarkedCompiler.with_benchmarks(compiler) do |c|
35
- block.call(c)
36
- end
37
- else
38
- yield(compiler)
39
- end
40
- ensure
41
- runtime.cleanup!
42
- end
43
-
44
- # @param runtime [Runtime]
45
- # @param options [Options]
46
- # @param scope [Scope, nil]
47
- def initialize(runtime:, options:, scope: nil)
48
- @options = options
49
- @runtime = runtime
50
- @scope = scope || ::CSVPlusPlus::Language::Scope.new(runtime:)
51
- end
52
-
53
- # Write the compiled results
54
- def outputting!
55
- @runtime.start_at_csv!
56
- yield
57
- end
58
-
59
- # Compile a template and return a +::CSVPlusPlus::Template+ instance ready to be written with a +Writer+
60
- #
61
- # @return [Template]
62
- def compile_template
63
- parse_code_section!
64
- rows = parse_csv_section!
65
-
66
- ::CSVPlusPlus::Template.new(rows:).tap do |t|
67
- t.validate_infinite_expands(@runtime)
68
- expanding { t.expand_rows! }
69
- resolve_all_cells!(t)
70
- end
71
- end
72
-
73
- # @return [String]
74
- def to_s
75
- "Compiler(options: #{@options}, runtime: #{@runtime}, scope: #{@scope})"
76
- end
77
-
78
- protected
79
-
80
- # Parses the input file and returns a +CodeSection+
81
- #
82
- # @return [CodeSection]
83
- def parse_code_section!
84
- @runtime.start!
85
- parsing_code_section do |input|
86
- code_section, csv_section = ::CSVPlusPlus::Language::CodeSectionParser.new.parse(input, self)
87
- # TODO: infer a type
88
- # allow user-supplied key/values to override anything global or from the code section
89
- code_section.def_variables(
90
- options.key_values.transform_values { |v| ::CSVPlusPlus::Language::Entities::String.new(v.to_s) }
91
- )
92
- @scope.code_section = code_section
93
-
94
- # return the csv_section to the caller because they're gonna re-write input with it
95
- next csv_section
96
- end
97
- @scope.code_section
98
- end
99
-
100
- # Parse the CSV section and return an array of +Row+s
101
- #
102
- # @return [Array<Row>]
103
- def parse_csv_section!
104
- @runtime.start_at_csv!
105
- @runtime.map_rows(::CSV.new(runtime.input)) do |csv_row|
106
- parse_row(csv_row)
107
- end
108
- ensure
109
- # we're done with the file and everything is in memory
110
- @runtime.cleanup!
111
- end
112
-
113
- # Iterates through each cell of each row and resolves it's variable and function references.
114
- #
115
- # @param template [Template]
116
- # @return [Array<Entity>]
117
- def resolve_all_cells!(template)
118
- @runtime.start_at_csv!
119
- @runtime.map_rows(template.rows, cells_too: true) do |cell|
120
- cell.ast = @scope.resolve_cell_value if cell.ast
121
- end
122
- end
123
-
124
- # Expanding rows
125
- def expanding
126
- @runtime.start_at_csv!
127
- yield
128
- end
129
-
130
- private
131
-
132
- def parsing_code_section
133
- csv_section = yield(@runtime.input.read)
134
- @runtime.rewrite_input!(csv_section)
135
- end
136
-
137
- # Using the current +@runtime+ and the given +csv_row+ parse it into a +Row+ of +Cell+s
138
- # +csv_row+ should have already been run through a CSV parser and is an array of strings
139
- #
140
- # @param csv_row [Array<Array<String>>]
141
- # @return [Row]
142
- def parse_row(csv_row)
143
- row_modifier = ::CSVPlusPlus::Modifier.new(row_level: true)
144
-
145
- cells =
146
- @runtime.map_row(csv_row) do |value, _cell_index|
147
- cell_modifier = ::CSVPlusPlus::Modifier.new
148
- parsed_value = ::CSVPlusPlus::ModifierParser.new(row_modifier:, cell_modifier:).parse(value, @runtime)
149
-
150
- ::CSVPlusPlus::Cell.parse(parsed_value, runtime:, modifier: cell_modifier)
151
- end
152
-
153
- ::CSVPlusPlus::Row.new(@runtime.row_index, cells, row_modifier)
154
- end
155
- end
156
- end
157
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative './entity'
4
-
5
- module CSVPlusPlus
6
- module Language
7
- module Entities
8
- # A boolean value
9
- #
10
- # @attr_reader value [true, false]
11
- class Boolean < Entity
12
- attr_reader :value
13
-
14
- # @param value [String, Boolean]
15
- def initialize(value)
16
- super(:boolean)
17
- # TODO: probably can do a lot better in general on type validation
18
- @value = value.is_a?(::String) ? (value.downcase == 'true') : value
19
- end
20
-
21
- # @return [String]
22
- def to_s
23
- @value.to_s.upcase
24
- end
25
-
26
- # @return [boolean]
27
- def ==(other)
28
- super && value == other.value
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative './entity'
4
-
5
- module CSVPlusPlus
6
- module Language
7
- module Entities
8
- # A reference to a cell
9
- #
10
- # @attr_reader cell_reference [String] The cell reference in A1 format
11
- class CellReference < Entity
12
- attr_reader :cell_reference
13
-
14
- # @param cell_reference [String] The cell reference in A1 format
15
- def initialize(cell_reference)
16
- super(:cell_reference)
17
-
18
- @cell_reference = cell_reference
19
- end
20
-
21
- # @return [String]
22
- def to_s
23
- @cell_reference
24
- end
25
-
26
- # @return [Boolean]
27
- def ==(other)
28
- super && @cell_reference == other.cell_reference
29
- end
30
- end
31
- end
32
- end
33
- end