csv_plus_plus 0.1.0 → 0.1.2
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 +4 -4
- data/CHANGELOG.md +16 -1
- data/README.md +18 -62
- data/lib/csv_plus_plus/benchmarked_compiler.rb +62 -0
- data/lib/csv_plus_plus/can_define_references.rb +88 -0
- data/lib/csv_plus_plus/can_resolve_references.rb +8 -0
- data/lib/csv_plus_plus/cell.rb +3 -3
- data/lib/csv_plus_plus/cli.rb +24 -7
- data/lib/csv_plus_plus/color.rb +12 -6
- data/lib/csv_plus_plus/compiler.rb +156 -0
- data/lib/csv_plus_plus/data_validation.rb +138 -0
- data/lib/csv_plus_plus/{language → entities}/ast_builder.rb +5 -7
- data/lib/csv_plus_plus/entities/boolean.rb +31 -0
- data/lib/csv_plus_plus/{language → entities}/builtins.rb +2 -4
- data/lib/csv_plus_plus/entities/cell_reference.rb +60 -0
- data/lib/csv_plus_plus/entities/date.rb +30 -0
- data/lib/csv_plus_plus/entities/entity.rb +84 -0
- data/lib/csv_plus_plus/entities/function.rb +33 -0
- data/lib/csv_plus_plus/entities/function_call.rb +35 -0
- data/lib/csv_plus_plus/entities/number.rb +34 -0
- data/lib/csv_plus_plus/entities/runtime_value.rb +26 -0
- data/lib/csv_plus_plus/entities/string.rb +29 -0
- data/lib/csv_plus_plus/entities/variable.rb +25 -0
- data/lib/csv_plus_plus/entities.rb +33 -0
- data/lib/csv_plus_plus/error/error.rb +10 -0
- data/lib/csv_plus_plus/error/formula_syntax_error.rb +36 -0
- data/lib/csv_plus_plus/error/modifier_syntax_error.rb +27 -0
- data/lib/csv_plus_plus/error/modifier_validation_error.rb +49 -0
- data/lib/csv_plus_plus/{language → error}/syntax_error.rb +6 -14
- data/lib/csv_plus_plus/error/writer_error.rb +9 -0
- data/lib/csv_plus_plus/error.rb +9 -2
- data/lib/csv_plus_plus/expand.rb +3 -1
- data/lib/csv_plus_plus/google_api_client.rb +4 -0
- data/lib/csv_plus_plus/lexer/lexer.rb +19 -11
- data/lib/csv_plus_plus/modifier/conditional_formatting.rb +17 -0
- data/lib/csv_plus_plus/modifier.rb +73 -70
- data/lib/csv_plus_plus/options.rb +3 -0
- data/lib/csv_plus_plus/parser/cell_value.tab.rb +305 -0
- data/lib/csv_plus_plus/parser/code_section.tab.rb +410 -0
- data/lib/csv_plus_plus/parser/modifier.tab.rb +484 -0
- data/lib/csv_plus_plus/references.rb +68 -0
- data/lib/csv_plus_plus/row.rb +0 -3
- data/lib/csv_plus_plus/runtime.rb +199 -0
- data/lib/csv_plus_plus/scope.rb +196 -0
- data/lib/csv_plus_plus/template.rb +21 -5
- data/lib/csv_plus_plus/validated_modifier.rb +164 -0
- data/lib/csv_plus_plus/version.rb +1 -1
- data/lib/csv_plus_plus/writer/file_backer_upper.rb +6 -4
- data/lib/csv_plus_plus/writer/google_sheet_builder.rb +24 -29
- data/lib/csv_plus_plus/writer/google_sheet_modifier.rb +33 -12
- data/lib/csv_plus_plus/writer/rubyxl_builder.rb +3 -6
- data/lib/csv_plus_plus.rb +41 -16
- metadata +34 -24
- data/lib/csv_plus_plus/code_section.rb +0 -68
- data/lib/csv_plus_plus/language/benchmarked_compiler.rb +0 -65
- data/lib/csv_plus_plus/language/cell_value.tab.rb +0 -332
- data/lib/csv_plus_plus/language/code_section.tab.rb +0 -442
- data/lib/csv_plus_plus/language/compiler.rb +0 -157
- data/lib/csv_plus_plus/language/entities/boolean.rb +0 -33
- data/lib/csv_plus_plus/language/entities/cell_reference.rb +0 -33
- data/lib/csv_plus_plus/language/entities/entity.rb +0 -86
- data/lib/csv_plus_plus/language/entities/function.rb +0 -35
- data/lib/csv_plus_plus/language/entities/function_call.rb +0 -26
- data/lib/csv_plus_plus/language/entities/number.rb +0 -36
- data/lib/csv_plus_plus/language/entities/runtime_value.rb +0 -28
- data/lib/csv_plus_plus/language/entities/string.rb +0 -31
- data/lib/csv_plus_plus/language/entities/variable.rb +0 -25
- data/lib/csv_plus_plus/language/entities.rb +0 -28
- data/lib/csv_plus_plus/language/references.rb +0 -70
- data/lib/csv_plus_plus/language/runtime.rb +0 -205
- data/lib/csv_plus_plus/language/scope.rb +0 -188
- data/lib/csv_plus_plus/modifier.tab.rb +0 -907
@@ -25,12 +25,6 @@ module CSVPlusPlus
|
|
25
25
|
|
26
26
|
private
|
27
27
|
|
28
|
-
def sheets_ns
|
29
|
-
::Google::Apis::SheetsV4
|
30
|
-
end
|
31
|
-
|
32
|
-
def sheets_color(color); end
|
33
|
-
|
34
28
|
def set_extended_value_type!(extended_value, value)
|
35
29
|
v = value || ''
|
36
30
|
if v.start_with?('=')
|
@@ -45,7 +39,7 @@ module CSVPlusPlus
|
|
45
39
|
end
|
46
40
|
|
47
41
|
def build_cell_format(mod)
|
48
|
-
|
42
|
+
::Google::Apis::SheetsV4::CellFormat.new.tap do |cf|
|
49
43
|
cf.text_format = mod.text_format
|
50
44
|
|
51
45
|
cf.horizontal_alignment = mod.halign
|
@@ -56,7 +50,7 @@ module CSVPlusPlus
|
|
56
50
|
end
|
57
51
|
|
58
52
|
def grid_range_for_cell(cell)
|
59
|
-
|
53
|
+
::Google::Apis::SheetsV4::GridRange.new(
|
60
54
|
sheet_id: @sheet_id,
|
61
55
|
start_column_index: cell.index,
|
62
56
|
end_column_index: cell.index + 1,
|
@@ -72,7 +66,7 @@ module CSVPlusPlus
|
|
72
66
|
end
|
73
67
|
|
74
68
|
def build_cell_value(cell)
|
75
|
-
|
69
|
+
::Google::Apis::SheetsV4::ExtendedValue.new.tap do |xv|
|
76
70
|
value =
|
77
71
|
if cell.value.nil?
|
78
72
|
current_value(cell.row_index, cell.index)
|
@@ -87,7 +81,7 @@ module CSVPlusPlus
|
|
87
81
|
def build_cell_data(cell)
|
88
82
|
mod = ::CSVPlusPlus::Writer::GoogleSheetModifier.new(cell.modifier)
|
89
83
|
|
90
|
-
|
84
|
+
::Google::Apis::SheetsV4::CellData.new.tap do |cd|
|
91
85
|
cd.user_entered_format = build_cell_format(mod)
|
92
86
|
cd.note = mod.note if mod.note
|
93
87
|
|
@@ -97,13 +91,13 @@ module CSVPlusPlus
|
|
97
91
|
end
|
98
92
|
|
99
93
|
def build_row_data(row)
|
100
|
-
|
94
|
+
::Google::Apis::SheetsV4::RowData.new(values: row.cells.map { |cell| build_cell_data(cell) })
|
101
95
|
end
|
102
96
|
|
103
97
|
def build_update_cells_request(rows)
|
104
|
-
|
98
|
+
::Google::Apis::SheetsV4::UpdateCellsRequest.new(
|
105
99
|
fields: '*',
|
106
|
-
start:
|
100
|
+
start: ::Google::Apis::SheetsV4::GridCoordinate.new(
|
107
101
|
sheet_id: @sheet_id,
|
108
102
|
column_index: @column_index,
|
109
103
|
row_index: @row_index
|
@@ -113,29 +107,31 @@ module CSVPlusPlus
|
|
113
107
|
end
|
114
108
|
|
115
109
|
def build_border(cell)
|
116
|
-
mod = cell.modifier
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
top: mod.border_along?(
|
121
|
-
right: mod.border_along?(
|
122
|
-
left: mod.border_along?(
|
123
|
-
bottom: mod.border_along?(
|
110
|
+
mod = ::CSVPlusPlus::Writer::GoogleSheetModifier.new(cell.modifier)
|
111
|
+
border = mod.border
|
112
|
+
|
113
|
+
::Google::Apis::SheetsV4::UpdateBordersRequest.new(
|
114
|
+
top: mod.border_along?(:top) ? border : nil,
|
115
|
+
right: mod.border_along?(:right) ? border : nil,
|
116
|
+
left: mod.border_along?(:left) ? border : nil,
|
117
|
+
bottom: mod.border_along?(:bottom) ? border : nil,
|
124
118
|
range: grid_range_for_cell(cell)
|
125
119
|
)
|
126
120
|
end
|
127
121
|
|
128
122
|
def build_update_borders_request(cell)
|
129
|
-
|
123
|
+
::Google::Apis::SheetsV4::Request.new(update_borders: build_border(cell))
|
124
|
+
end
|
125
|
+
|
126
|
+
def chunked_requests(rows)
|
127
|
+
rows.each_slice(1000).to_a.map do |chunked_rows|
|
128
|
+
::Google::Apis::SheetsV4::Request.new(update_cells: build_update_cells_request(chunked_rows))
|
129
|
+
end
|
130
130
|
end
|
131
131
|
|
132
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
133
132
|
def build_batch_request(rows)
|
134
|
-
|
135
|
-
bu.requests =
|
136
|
-
rows.each_slice(1000).to_a.map do |chunked_rows|
|
137
|
-
sheets_ns::Request.new(update_cells: build_update_cells_request(chunked_rows))
|
138
|
-
end
|
133
|
+
::Google::Apis::SheetsV4::BatchUpdateSpreadsheetRequest.new.tap do |bu|
|
134
|
+
bu.requests = chunked_requests(rows)
|
139
135
|
|
140
136
|
rows.each do |row|
|
141
137
|
row.cells.filter { |c| c.modifier.any_border? }
|
@@ -145,7 +141,6 @@ module CSVPlusPlus
|
|
145
141
|
end
|
146
142
|
end
|
147
143
|
end
|
148
|
-
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
149
144
|
end
|
150
145
|
# rubocop:enable Metrics/ClassLength
|
151
146
|
end
|
@@ -4,44 +4,65 @@ module CSVPlusPlus
|
|
4
4
|
module Writer
|
5
5
|
# Decorate a Modifier so it can be written to the Google Sheets API
|
6
6
|
class GoogleSheetModifier < ::SimpleDelegator
|
7
|
-
# Format the
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
7
|
+
# Format the border for Google Sheets
|
8
|
+
#
|
9
|
+
# @return [Google::Apis::SheetsV4::Border]
|
10
|
+
def border
|
11
|
+
# TODO: allow different border styles per side
|
12
|
+
::Google::Apis::SheetsV4::Border.new(
|
13
|
+
color: bordercolor&.to_s || '#000000',
|
14
|
+
style: borderstyle&.to_s || 'solid'
|
15
|
+
)
|
15
16
|
end
|
16
17
|
|
17
18
|
# Format the color for Google Sheets
|
19
|
+
#
|
20
|
+
# @return [Google::Apis::SheetsV4::Color]
|
18
21
|
def color
|
19
22
|
google_sheets_color(super) if super
|
20
23
|
end
|
21
24
|
|
22
25
|
# Format the fontcolor for Google Sheets
|
26
|
+
#
|
27
|
+
# @return [Google::Apis::SheetsV4::Color]
|
23
28
|
def fontcolor
|
24
29
|
google_sheets_color(super) if super
|
25
30
|
end
|
26
31
|
|
32
|
+
# Format the halign for Google Sheets
|
33
|
+
#
|
34
|
+
# @return [String]
|
35
|
+
def halign
|
36
|
+
super&.to_s&.upcase
|
37
|
+
end
|
38
|
+
|
27
39
|
# Format the numberformat for Google Sheets
|
40
|
+
#
|
41
|
+
# @return [::Google::Apis::SheetsV4::NumberFormat]
|
28
42
|
def numberformat
|
29
43
|
::Google::Apis::SheetsV4::NumberFormat.new(type: super) if super
|
30
44
|
end
|
31
45
|
|
32
46
|
# Builds a SheetsV4::TextFormat with the underlying Modifier
|
47
|
+
#
|
48
|
+
# @return [::Google::Apis::SheetsV4::TextFormat]
|
33
49
|
def text_format
|
34
50
|
::Google::Apis::SheetsV4::TextFormat.new(
|
35
|
-
bold: formatted?(
|
36
|
-
italic: formatted?(
|
37
|
-
strikethrough: formatted?(
|
38
|
-
underline: formatted?(
|
51
|
+
bold: formatted?(:bold) || nil,
|
52
|
+
italic: formatted?(:italic) || nil,
|
53
|
+
strikethrough: formatted?(:strikethrough) || nil,
|
54
|
+
underline: formatted?(:underline) || nil,
|
39
55
|
font_family: fontfamily,
|
40
56
|
font_size: fontsize,
|
41
57
|
foreground_color: fontcolor
|
42
58
|
)
|
43
59
|
end
|
44
60
|
|
61
|
+
# Format the valign for Google Sheets
|
62
|
+
def valign
|
63
|
+
super&.to_s&.upcase
|
64
|
+
end
|
65
|
+
|
45
66
|
private
|
46
67
|
|
47
68
|
def google_sheets_color(color)
|
@@ -24,10 +24,7 @@ module CSVPlusPlus
|
|
24
24
|
#
|
25
25
|
# @return [RubyXL::Workbook]
|
26
26
|
def build_workbook
|
27
|
-
open_workbook.tap
|
28
|
-
@worksheet = workbook[@sheet_name]
|
29
|
-
build_workbook!
|
30
|
-
end
|
27
|
+
open_workbook.tap { build_workbook! }
|
31
28
|
end
|
32
29
|
|
33
30
|
private
|
@@ -107,11 +104,11 @@ module CSVPlusPlus
|
|
107
104
|
def open_workbook
|
108
105
|
if ::File.exist?(@input_filename)
|
109
106
|
::RubyXL::Parser.parse(@input_filename).tap do |workbook|
|
110
|
-
workbook
|
107
|
+
@worksheet = workbook[@sheet_name] || workbook.add_worksheet(@sheet_name)
|
111
108
|
end
|
112
109
|
else
|
113
110
|
::RubyXL::Workbook.new.tap do |workbook|
|
114
|
-
workbook.worksheets[0].sheet_name = @sheet_name
|
111
|
+
@worksheet = workbook.worksheets[0].tap { |w| w.sheet_name = @sheet_name }
|
115
112
|
end
|
116
113
|
end
|
117
114
|
end
|
data/lib/csv_plus_plus.rb
CHANGED
@@ -1,17 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'benchmark'
|
4
|
+
require 'csv'
|
5
|
+
require 'fileutils'
|
3
6
|
require 'google/apis/drive_v3'
|
4
7
|
require 'google/apis/sheets_v4'
|
5
8
|
require 'googleauth'
|
9
|
+
require 'pathname'
|
6
10
|
require 'rubyXL'
|
7
11
|
require 'rubyXL/convenience_methods'
|
12
|
+
require 'set'
|
13
|
+
require 'tempfile'
|
8
14
|
|
9
|
-
require_relative 'csv_plus_plus/
|
15
|
+
require_relative 'csv_plus_plus/entities'
|
10
16
|
require_relative 'csv_plus_plus/error'
|
11
|
-
|
12
|
-
require_relative 'csv_plus_plus/
|
13
|
-
require_relative 'csv_plus_plus/
|
17
|
+
|
18
|
+
require_relative 'csv_plus_plus/cell'
|
19
|
+
require_relative 'csv_plus_plus/cli'
|
20
|
+
require_relative 'csv_plus_plus/color'
|
21
|
+
|
22
|
+
require_relative 'csv_plus_plus/compiler'
|
23
|
+
require_relative 'csv_plus_plus/runtime'
|
24
|
+
|
25
|
+
require_relative 'csv_plus_plus/lexer'
|
26
|
+
require_relative 'csv_plus_plus/lexer/tokenizer'
|
27
|
+
require_relative 'csv_plus_plus/modifier'
|
14
28
|
require_relative 'csv_plus_plus/options'
|
29
|
+
require_relative 'csv_plus_plus/parser/modifier.tab'
|
30
|
+
require_relative 'csv_plus_plus/row'
|
31
|
+
require_relative 'csv_plus_plus/template'
|
32
|
+
require_relative 'csv_plus_plus/validated_modifier'
|
15
33
|
require_relative 'csv_plus_plus/writer'
|
16
34
|
|
17
35
|
# A programming language for writing rich CSV files
|
@@ -21,23 +39,30 @@ module CSVPlusPlus
|
|
21
39
|
# @param input [String] The csvpp input to compile
|
22
40
|
# @param filename [String, nil] The filename the input was read from. +nil+ if it is read from stdin.
|
23
41
|
# @param options [Options] The various options to compile with
|
24
|
-
#
|
25
|
-
# rubocop:disable Metrics/MethodLength
|
26
42
|
def self.apply_template_to_sheet!(input, filename, options)
|
27
43
|
warn(options.verbose_summary) if options.verbose
|
28
44
|
|
29
|
-
::CSVPlusPlus::
|
30
|
-
options:,
|
31
|
-
runtime: ::CSVPlusPlus::Language::Runtime.new(input:, filename:)
|
32
|
-
) do |c|
|
33
|
-
template = c.compile_template
|
45
|
+
runtime = ::CSVPlusPlus::Runtime.new(input:, filename:)
|
34
46
|
|
47
|
+
::CSVPlusPlus::Compiler.with_compiler(options:, runtime:) do |compiler|
|
48
|
+
template = compiler.compile_template
|
49
|
+
|
50
|
+
warn(template.verbose_summary) if options.verbose
|
51
|
+
|
52
|
+
write_template(template, compiler, options)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Write the results (and possibly make a backup) of a compiled +template+
|
57
|
+
#
|
58
|
+
# @param template [Template] The compiled template
|
59
|
+
# @param compiler [Compiler] The compiler currently in use
|
60
|
+
# @param options [Options] The options we're running with
|
61
|
+
def self.write_template(template, compiler, options)
|
62
|
+
compiler.outputting! do
|
35
63
|
output = ::CSVPlusPlus::Writer.writer(options)
|
36
|
-
|
37
|
-
|
38
|
-
output.write(template)
|
39
|
-
end
|
64
|
+
output.write_backup if options.backup
|
65
|
+
output.write(template)
|
40
66
|
end
|
41
67
|
end
|
42
|
-
# rubocop:enable Metrics/MethodLength
|
43
68
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csv_plus_plus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Patrick Carroll
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-03-
|
11
|
+
date: 2023-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-apis-drive_v3
|
@@ -123,44 +123,54 @@ files:
|
|
123
123
|
- bin/csv++
|
124
124
|
- bin/csvpp
|
125
125
|
- lib/csv_plus_plus.rb
|
126
|
+
- lib/csv_plus_plus/benchmarked_compiler.rb
|
127
|
+
- lib/csv_plus_plus/can_define_references.rb
|
128
|
+
- lib/csv_plus_plus/can_resolve_references.rb
|
126
129
|
- lib/csv_plus_plus/cell.rb
|
127
130
|
- lib/csv_plus_plus/cli.rb
|
128
131
|
- lib/csv_plus_plus/cli_flag.rb
|
129
|
-
- lib/csv_plus_plus/code_section.rb
|
130
132
|
- lib/csv_plus_plus/color.rb
|
133
|
+
- lib/csv_plus_plus/compiler.rb
|
134
|
+
- lib/csv_plus_plus/data_validation.rb
|
135
|
+
- lib/csv_plus_plus/entities.rb
|
136
|
+
- lib/csv_plus_plus/entities/ast_builder.rb
|
137
|
+
- lib/csv_plus_plus/entities/boolean.rb
|
138
|
+
- lib/csv_plus_plus/entities/builtins.rb
|
139
|
+
- lib/csv_plus_plus/entities/cell_reference.rb
|
140
|
+
- lib/csv_plus_plus/entities/date.rb
|
141
|
+
- lib/csv_plus_plus/entities/entity.rb
|
142
|
+
- lib/csv_plus_plus/entities/function.rb
|
143
|
+
- lib/csv_plus_plus/entities/function_call.rb
|
144
|
+
- lib/csv_plus_plus/entities/number.rb
|
145
|
+
- lib/csv_plus_plus/entities/runtime_value.rb
|
146
|
+
- lib/csv_plus_plus/entities/string.rb
|
147
|
+
- lib/csv_plus_plus/entities/variable.rb
|
131
148
|
- lib/csv_plus_plus/error.rb
|
149
|
+
- lib/csv_plus_plus/error/error.rb
|
150
|
+
- lib/csv_plus_plus/error/formula_syntax_error.rb
|
151
|
+
- lib/csv_plus_plus/error/modifier_syntax_error.rb
|
152
|
+
- lib/csv_plus_plus/error/modifier_validation_error.rb
|
153
|
+
- lib/csv_plus_plus/error/syntax_error.rb
|
154
|
+
- lib/csv_plus_plus/error/writer_error.rb
|
132
155
|
- lib/csv_plus_plus/expand.rb
|
133
156
|
- lib/csv_plus_plus/google_api_client.rb
|
134
157
|
- lib/csv_plus_plus/google_options.rb
|
135
158
|
- lib/csv_plus_plus/graph.rb
|
136
|
-
- lib/csv_plus_plus/language/ast_builder.rb
|
137
|
-
- lib/csv_plus_plus/language/benchmarked_compiler.rb
|
138
|
-
- lib/csv_plus_plus/language/builtins.rb
|
139
|
-
- lib/csv_plus_plus/language/cell_value.tab.rb
|
140
|
-
- lib/csv_plus_plus/language/code_section.tab.rb
|
141
|
-
- lib/csv_plus_plus/language/compiler.rb
|
142
|
-
- lib/csv_plus_plus/language/entities.rb
|
143
|
-
- lib/csv_plus_plus/language/entities/boolean.rb
|
144
|
-
- lib/csv_plus_plus/language/entities/cell_reference.rb
|
145
|
-
- lib/csv_plus_plus/language/entities/entity.rb
|
146
|
-
- lib/csv_plus_plus/language/entities/function.rb
|
147
|
-
- lib/csv_plus_plus/language/entities/function_call.rb
|
148
|
-
- lib/csv_plus_plus/language/entities/number.rb
|
149
|
-
- lib/csv_plus_plus/language/entities/runtime_value.rb
|
150
|
-
- lib/csv_plus_plus/language/entities/string.rb
|
151
|
-
- lib/csv_plus_plus/language/entities/variable.rb
|
152
|
-
- lib/csv_plus_plus/language/references.rb
|
153
|
-
- lib/csv_plus_plus/language/runtime.rb
|
154
|
-
- lib/csv_plus_plus/language/scope.rb
|
155
|
-
- lib/csv_plus_plus/language/syntax_error.rb
|
156
159
|
- lib/csv_plus_plus/lexer.rb
|
157
160
|
- lib/csv_plus_plus/lexer/lexer.rb
|
158
161
|
- lib/csv_plus_plus/lexer/tokenizer.rb
|
159
162
|
- lib/csv_plus_plus/modifier.rb
|
160
|
-
- lib/csv_plus_plus/modifier.
|
163
|
+
- lib/csv_plus_plus/modifier/conditional_formatting.rb
|
161
164
|
- lib/csv_plus_plus/options.rb
|
165
|
+
- lib/csv_plus_plus/parser/cell_value.tab.rb
|
166
|
+
- lib/csv_plus_plus/parser/code_section.tab.rb
|
167
|
+
- lib/csv_plus_plus/parser/modifier.tab.rb
|
168
|
+
- lib/csv_plus_plus/references.rb
|
162
169
|
- lib/csv_plus_plus/row.rb
|
170
|
+
- lib/csv_plus_plus/runtime.rb
|
171
|
+
- lib/csv_plus_plus/scope.rb
|
163
172
|
- lib/csv_plus_plus/template.rb
|
173
|
+
- lib/csv_plus_plus/validated_modifier.rb
|
164
174
|
- lib/csv_plus_plus/version.rb
|
165
175
|
- lib/csv_plus_plus/writer.rb
|
166
176
|
- lib/csv_plus_plus/writer/base_writer.rb
|
@@ -1,68 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative './language/code_section.tab'
|
4
|
-
require_relative './language/entities'
|
5
|
-
|
6
|
-
module CSVPlusPlus
|
7
|
-
# A representation of the code section part of a template (the variable and function definitions)
|
8
|
-
#
|
9
|
-
# @attr variables [Hash<Symbol, Variable>] All defined variables
|
10
|
-
# @attr_reader functions [Hash<Symbol, Function>] All defined functions
|
11
|
-
class CodeSection
|
12
|
-
attr_reader :functions
|
13
|
-
attr_accessor :variables
|
14
|
-
|
15
|
-
# @param variables [Hash<Symbol, Variable>] Initial variables
|
16
|
-
# @param functions [Hash<Symbol, Variable>] Initial functions
|
17
|
-
def initialize(variables: {}, functions: {})
|
18
|
-
@variables = variables
|
19
|
-
@functions = functions
|
20
|
-
end
|
21
|
-
|
22
|
-
# Define a (or re-define an existing) variable
|
23
|
-
#
|
24
|
-
# @param id [String, Symbol] The identifier for the variable
|
25
|
-
# @param entity [Entity] The value (entity) the variable holds
|
26
|
-
def def_variable(id, entity)
|
27
|
-
@variables[id.to_sym] = entity
|
28
|
-
end
|
29
|
-
|
30
|
-
# Define (or re-define existing) variables
|
31
|
-
#
|
32
|
-
# @param variables [Hash<Symbol, Variable>] Variables to define
|
33
|
-
def def_variables(variables)
|
34
|
-
variables.each { |id, entity| def_variable(id, entity) }
|
35
|
-
end
|
36
|
-
|
37
|
-
# Define a (or re-define an existing) function
|
38
|
-
#
|
39
|
-
# @param id [String, Symbol] The identifier for the function
|
40
|
-
# @param entity [Entities::Function] The defined function
|
41
|
-
def def_function(id, entity)
|
42
|
-
@functions[id.to_sym] = entity
|
43
|
-
end
|
44
|
-
|
45
|
-
# Is the variable defined?
|
46
|
-
#
|
47
|
-
# @param var_id [Symbol, String] The identifier of the variable
|
48
|
-
#
|
49
|
-
# @return [boolean]
|
50
|
-
def defined_variable?(var_id)
|
51
|
-
@variables.key?(var_id.to_sym)
|
52
|
-
end
|
53
|
-
|
54
|
-
# Is the function defined?
|
55
|
-
#
|
56
|
-
# @param fn_id [Symbol, String] The identifier of the function
|
57
|
-
#
|
58
|
-
# @return [boolean]
|
59
|
-
def defined_function?(fn_id)
|
60
|
-
@functions.key?(fn_id.to_sym)
|
61
|
-
end
|
62
|
-
|
63
|
-
# @return [String]
|
64
|
-
def to_s
|
65
|
-
"CodeSection(functions: #{@functions}, variables: #{@variables})"
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'benchmark'
|
4
|
-
|
5
|
-
module CSVPlusPlus
|
6
|
-
module Language
|
7
|
-
# Extend a +Compiler+ class and add benchmark timings
|
8
|
-
# @attr_reader timings [Array<Benchmark::Tms>] +Benchmark+ timings that have been accumulated by each step of
|
9
|
-
# compilation
|
10
|
-
# @attr_reader benchmark [Benchmark] A +Benchmark+ instance
|
11
|
-
module BenchmarkedCompiler
|
12
|
-
attr_reader :benchmark, :timings
|
13
|
-
|
14
|
-
# Wrap a +Compiler+ with our instance methods that add benchmarks
|
15
|
-
def self.with_benchmarks(compiler, &block)
|
16
|
-
::Benchmark.benchmark(::Benchmark::CAPTION, 25, ::Benchmark::FORMAT, '> Total') do |x|
|
17
|
-
# compiler = new(options:, runtime:, benchmark: x)
|
18
|
-
compiler.extend(self)
|
19
|
-
compiler.benchmark = x
|
20
|
-
|
21
|
-
block.call(compiler)
|
22
|
-
|
23
|
-
[compiler.timings.reduce(:+)]
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# @param benchmark [Benchmark] A +Benchmark+ instance
|
28
|
-
def benchmark=(benchmark)
|
29
|
-
@benchmark = benchmark
|
30
|
-
@timings = []
|
31
|
-
end
|
32
|
-
|
33
|
-
# Time the Compiler#outputting! stage
|
34
|
-
def outputting!
|
35
|
-
time_stage('Writing the spreadsheet') { super }
|
36
|
-
end
|
37
|
-
|
38
|
-
protected
|
39
|
-
|
40
|
-
def parse_code_section!
|
41
|
-
time_stage('Parsing code section') { super }
|
42
|
-
end
|
43
|
-
|
44
|
-
def parse_csv_section!
|
45
|
-
time_stage('Parsing CSV section') { super }
|
46
|
-
end
|
47
|
-
|
48
|
-
def expanding
|
49
|
-
time_stage('Expanding rows') { super }
|
50
|
-
end
|
51
|
-
|
52
|
-
def resolve_all_cells!(template)
|
53
|
-
time_stage('Resolving each cell') { super(template) }
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def time_stage(stage, &block)
|
59
|
-
ret = nil
|
60
|
-
@timings << @benchmark.report(stage) { ret = block.call }
|
61
|
-
ret
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|