excel_to_code 0.3.17 → 0.3.18.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +67 -34
  3. data/bin/excel_to_c +8 -78
  4. data/bin/excel_to_go +41 -0
  5. data/bin/excel_to_ruby +2 -69
  6. data/src/commands.rb +2 -0
  7. data/src/commands/common_command_line_options.rb +81 -0
  8. data/src/commands/excel_to_c.rb +3 -0
  9. data/src/commands/excel_to_go.rb +91 -0
  10. data/src/commands/excel_to_x.rb +77 -11
  11. data/src/compile.rb +1 -0
  12. data/src/compile/c/a.out +0 -0
  13. data/src/compile/c/a.out.dSYM/Contents/Resources/DWARF/a.out +0 -0
  14. data/src/compile/c/compile_to_c.rb +2 -0
  15. data/src/compile/c/excel_to_c_runtime.c +691 -145
  16. data/src/compile/c/excel_to_c_runtime_test.c +226 -20
  17. data/src/compile/c/map_formulae_to_c.rb +62 -23
  18. data/src/compile/c/run_c_unit_tests +3 -0
  19. data/src/compile/cd.rb +6 -0
  20. data/src/compile/go.rb +3 -0
  21. data/src/compile/go/compile_to_go.rb +85 -0
  22. data/src/compile/go/compile_to_go_test.rb +73 -0
  23. data/src/compile/go/excel.go +171 -0
  24. data/src/compile/go/excel_test.go +54 -0
  25. data/src/compile/go/map_values_to_go.rb +67 -0
  26. data/src/compile/ruby/map_formulae_to_ruby.rb +30 -12
  27. data/src/excel/excel_functions.rb +26 -1
  28. data/src/excel/excel_functions/ceiling.rb +23 -0
  29. data/src/excel/excel_functions/countif.rb +15 -0
  30. data/src/excel/excel_functions/countifs.rb +10 -0
  31. data/src/excel/excel_functions/floor.rb +14 -0
  32. data/src/excel/excel_functions/hyperlink.rb +9 -0
  33. data/src/excel/excel_functions/na.rb +7 -0
  34. data/src/excel/excel_functions/not.rb +13 -0
  35. data/src/excel/excel_functions/or.rb +30 -0
  36. data/src/excel/excel_functions/product.rb +8 -0
  37. data/src/excel/excel_functions/rate.rb +16 -0
  38. data/src/excel/excel_functions/replace.rb +13 -0
  39. data/src/excel/excel_functions/scurve.rb +73 -0
  40. data/src/excel/excel_functions/sqrt.rb +11 -0
  41. data/src/excel/excel_functions/string_argument.rb +37 -0
  42. data/src/excel/excel_functions/sumifs.rb +19 -8
  43. data/src/excel/excel_functions/text.rb +3 -3
  44. data/src/excel/formula_peg.rb +1 -1
  45. data/src/excel/formula_peg.txt +2 -3
  46. data/src/excel/table.rb +15 -15
  47. data/src/excel_to_code.rb +1 -4
  48. data/src/extract/extract_data_from_worksheet.rb +8 -1
  49. data/src/rewrite/ast_expand_array_formulae.rb +4 -0
  50. data/src/rewrite/caching_formula_parser.rb +16 -11
  51. data/src/simplify.rb +1 -0
  52. data/src/simplify/inline_formulae.rb +16 -0
  53. data/src/simplify/replace_arithmetic_on_ranges.rb +14 -1
  54. data/src/simplify/replace_arrays_with_single_cells.rb +42 -15
  55. data/src/simplify/replace_cell_addresses_with_references.rb +70 -0
  56. data/src/simplify/replace_column_with_column_number.rb +8 -1
  57. data/src/simplify/replace_table_references.rb +40 -19
  58. data/src/simplify/simplify_arithmetic.rb +15 -10
  59. data/src/version.rb +4 -0
  60. metadata +115 -43
  61. data/TODO +0 -25
@@ -0,0 +1,70 @@
1
+ class ReplaceCellAddressesWithReferencesAst
2
+
3
+ attr_accessor :count_replaced
4
+ attr_accessor :replacement_made
5
+
6
+ def initialize
7
+ @count_replaced = 0
8
+ end
9
+
10
+ def replace(ast)
11
+ @replacement_made = false
12
+ map(ast)
13
+ @replacement_made
14
+ end
15
+
16
+ def map(ast)
17
+ return ast unless ast.is_a?(Array)
18
+ function(ast) if ast[0] == :function
19
+ ast.each { |a| map(a) }
20
+ ast
21
+ end
22
+
23
+ def function(ast)
24
+ _, name, info, ref = *ast
25
+ return unless name == :CELL
26
+ return unless info.first == :string
27
+ return unless info.last.downcase == "address"
28
+ replace_with_reference(ast, ref)
29
+ end
30
+
31
+ def replace_with_reference(ast, ref)
32
+ case ref.first
33
+ when :cell
34
+ ast.replace([:cell, Reference.for(ref.last).unfix])
35
+ when :sheet_reference
36
+ replace_with_reference(ref.last, ref.last)
37
+ ast.replace(ref)
38
+ when :area
39
+ ast.replace([:cell, Reference.for(ref[1]).unfix])
40
+ else
41
+ ast.replace([:error, "#VALUE!"])
42
+ end
43
+ end
44
+
45
+ end
46
+
47
+
48
+ class ReplaceCellAddressesWithReferences
49
+
50
+
51
+ def self.replace(*args)
52
+ self.new.replace(*args)
53
+ end
54
+
55
+ attr_accessor :count_replaced
56
+
57
+ def replace(input,output)
58
+ rewriter = ReplaceCellAddressesWithReferencesAst.new
59
+ input.each_line do |line|
60
+ # Looks to match lines with cell
61
+ if line =~ /:CELL/
62
+ ref, ast = line.split("\t")
63
+ output.puts "#{ref}\t#{rewriter.map(eval(ast)).inspect}"
64
+ else
65
+ output.puts line
66
+ end
67
+ end
68
+ @count_replaced = rewriter.count_replaced
69
+ end
70
+ end
@@ -26,8 +26,15 @@ class ReplaceColumnAndRowFunctionsAST
26
26
  def function(ast)
27
27
  return unless (ast[1] == :COLUMN || ast[1] == :ROW)
28
28
  if ast[2]
29
- if ast[2][0] == :cell
29
+ if ast[2][0] == :cell || ast[2][0] == :area
30
30
  reference = Reference.for(ast[2][1])
31
+ elsif ast[2][0] == :array && ast[2][1][0] == :row
32
+ r = ast[2][1][1]
33
+ if r[0] == :cell || r[0] == :area
34
+ reference = Reference.for(r[1])
35
+ elsif r[0] == :sheet_reference
36
+ reference = Reference.for(r[2][1])
37
+ end
31
38
  elsif ast[2][0] == :sheet_reference
32
39
  reference = Reference.for(ast[2][2][1])
33
40
  else
@@ -1,29 +1,50 @@
1
1
  class ReplaceTableReferenceAst
2
-
3
- attr_accessor :tables, :worksheet, :referring_cell
4
-
2
+
3
+ attr_accessor :tables, :worksheet, :referring_cell, :function_needs_area
4
+
5
5
  def initialize(tables, worksheet = nil, referring_cell = nil)
6
6
  @tables, @worksheet, @referring_cell = tables, worksheet, referring_cell
7
+ @function_needs_area = false
7
8
  end
8
-
9
+
9
10
  def map(ast)
10
11
  return ast unless ast.is_a?(Array)
11
12
  case ast[0]
12
- when :table_reference; table_reference(ast)
13
- when :local_table_reference; local_table_reference(ast)
13
+ when :function;
14
+ check_function_needs_area(ast)
15
+ when :table_reference;
16
+ table_reference(ast)
17
+ when :local_table_reference;
18
+ local_table_reference(ast)
19
+ else
20
+ ast.each { |a| map(a) }
21
+ end
22
+ ast
23
+ end
24
+
25
+ def check_function_needs_area(ast)
26
+ if ast[1] == :MATCH
27
+ @function_needs_area = false
28
+ map(ast[2])
29
+ @function_needs_area = true
30
+ map(ast[3])
31
+ @function_needs_area = false
32
+ ast[4..-1].each { |a| map(a) }
33
+ else
34
+ @function_needs_area = false
35
+ ast.each { |a| map(a) }
14
36
  end
15
- ast.each { |a| map(a) }
16
37
  ast
17
38
  end
18
-
39
+
19
40
  # Of the format [:table_reference, table_name, table_reference]
20
41
  def table_reference(ast)
21
42
  table_name = ast[1]
22
43
  table_reference = ast[2]
23
44
  return ast.replace([:error, :"#REF!"]) unless tables.has_key?(table_name.downcase)
24
- ast.replace(tables[table_name.downcase].reference_for(table_name,table_reference,worksheet,referring_cell))
45
+ ast.replace(tables[table_name.downcase].reference_for(table_name,table_reference,worksheet,referring_cell, @function_needs_area))
25
46
  end
26
-
47
+
27
48
  # Of the format [:local_table_reference, table_reference]
28
49
  def local_table_reference(ast)
29
50
  table_reference = ast[1]
@@ -31,29 +52,29 @@ class ReplaceTableReferenceAst
31
52
  table.includes?(worksheet,referring_cell)
32
53
  end
33
54
  return ast.replace([:error, :"#REF!"]) unless table
34
- ast.replace(table.reference_for(table.name,table_reference,worksheet,referring_cell))
55
+ ast.replace(table.reference_for(table.name,table_reference,worksheet,referring_cell, @function_needs_area))
35
56
  end
36
-
57
+
37
58
  end
38
59
 
39
60
 
40
61
  class ReplaceTableReferences
41
-
62
+
42
63
  attr_accessor :sheet_name
43
-
64
+
44
65
  def self.replace(*args)
45
66
  self.new.replace(*args)
46
67
  end
47
-
68
+
48
69
  def replace(input,table_data,output)
49
70
  tables = {}
50
71
  table_data.each do |line|
51
72
  table = Table.new(*line.strip.split("\t"))
52
73
  tables[table.name.downcase] = table
53
74
  end
54
-
75
+
55
76
  rewriter = ReplaceTableReferenceAst.new(tables,sheet_name)
56
-
77
+
57
78
  input.each_line do |line|
58
79
  # Looks to match shared string lines
59
80
  begin
@@ -69,8 +90,8 @@ class ReplaceTableReferences
69
90
  rescue Exception => e
70
91
  puts "Exception at line #{line}"
71
92
  raise
72
- end
93
+ end
73
94
  end
74
95
  end
75
-
96
+
76
97
  end
@@ -1,15 +1,15 @@
1
1
  class SimplifyArithmeticAst
2
-
2
+
3
3
  def map(ast)
4
4
  @brackets_to_remove = []
5
5
  simplify_arithmetic(ast)
6
- remove_brackets
6
+ remove_brackets(ast)
7
7
  ast
8
8
  end
9
9
 
10
10
  def simplify_arithmetic(ast)
11
11
  return ast unless ast.is_a?(Array)
12
- ast.each do |a|
12
+ ast.each do |a|
13
13
  simplify_arithmetic(a) if a.is_a?(Array)
14
14
  end
15
15
  case ast[0]
@@ -17,9 +17,14 @@ class SimplifyArithmeticAst
17
17
  when :brackets; @brackets_to_remove << ast
18
18
  end
19
19
  end
20
-
21
- def remove_brackets
22
- @brackets_to_remove.uniq.each do |ast|
20
+
21
+ def remove_brackets(ast)
22
+ return ast unless ast.is_a?(Array)
23
+ ast.each do |a|
24
+ remove_brackets(a) if a.is_a?(Array)
25
+ end
26
+ case ast[0]
27
+ when :brackets
23
28
  raise NotSupportedException.new("Multiple arguments not supported in brackets #{ast.inspect}") if ast.size > 2
24
29
  ast.replace(ast[1])
25
30
  end
@@ -31,7 +36,7 @@ class SimplifyArithmeticAst
31
36
  {:'*' => 2,:'/' => 2},
32
37
  {:'+' => 3,:'-' => 3}
33
38
  ]
34
-
39
+
35
40
  def arithmetic(ast)
36
41
  # If smaller than 4, will only be a simple operation (e.g., 1+1 or 2*4)
37
42
  # If more than 4, will be like 1+2*3 and so needs turning into 1+(2*3)
@@ -54,14 +59,14 @@ class SimplifyArithmeticAst
54
59
  end
55
60
  end
56
61
  end
57
-
62
+
58
63
 
59
64
  class SimplifyArithmetic
60
-
65
+
61
66
  def self.replace(*args)
62
67
  self.new.replace(*args)
63
68
  end
64
-
69
+
65
70
  def replace(input,output)
66
71
  rewriter = SimplifyArithmeticAst.new
67
72
  input.each_line do |line|
data/src/version.rb ADDED
@@ -0,0 +1,4 @@
1
+ class ExcelToCode
2
+ def self.version() "0.3.18.beta.1" end
3
+ end
4
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: excel_to_code
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.17
4
+ version: 0.3.18.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Counsell, Green on Black Ltd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-14 00:00:00.000000000 Z
11
+ date: 2018-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubypeg
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.0.4
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,89 +27,133 @@ dependencies:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
29
  version: '0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.0.4
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rspec
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '2.7'
39
+ version: '3.7'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.7'
47
+ - !ruby/object:Gem::Dependency
48
+ name: ffi
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.9'
34
54
  - - ">="
35
55
  - !ruby/object:Gem::Version
36
- version: 2.7.0
56
+ version: 1.9.18
37
57
  type: :runtime
38
58
  prerelease: false
39
59
  version_requirements: !ruby/object:Gem::Requirement
40
60
  requirements:
41
61
  - - "~>"
42
62
  - !ruby/object:Gem::Version
43
- version: '2.7'
63
+ version: '1.9'
44
64
  - - ">="
45
65
  - !ruby/object:Gem::Version
46
- version: 2.7.0
66
+ version: 1.9.18
47
67
  - !ruby/object:Gem::Dependency
48
- name: ffi
68
+ name: ox
49
69
  requirement: !ruby/object:Gem::Requirement
50
70
  requirements:
51
71
  - - "~>"
52
72
  - !ruby/object:Gem::Version
53
- version: '1.0'
73
+ version: '2.8'
54
74
  - - ">="
55
75
  - !ruby/object:Gem::Version
56
- version: 1.0.11
76
+ version: 2.8.2
57
77
  type: :runtime
58
78
  prerelease: false
59
79
  version_requirements: !ruby/object:Gem::Requirement
60
80
  requirements:
61
81
  - - "~>"
62
82
  - !ruby/object:Gem::Version
63
- version: '1.0'
83
+ version: '2.8'
64
84
  - - ">="
65
85
  - !ruby/object:Gem::Version
66
- version: 1.0.11
86
+ version: 2.8.2
67
87
  - !ruby/object:Gem::Dependency
68
- name: ox
88
+ name: minitest
69
89
  requirement: !ruby/object:Gem::Requirement
70
90
  requirements:
71
91
  - - "~>"
72
92
  - !ruby/object:Gem::Version
73
- version: '2.0'
93
+ version: '5.11'
74
94
  - - ">="
75
95
  - !ruby/object:Gem::Version
76
- version: 2.0.12
96
+ version: 5.11.1
77
97
  type: :runtime
78
98
  prerelease: false
79
99
  version_requirements: !ruby/object:Gem::Requirement
80
100
  requirements:
81
101
  - - "~>"
82
102
  - !ruby/object:Gem::Version
83
- version: '2.0'
103
+ version: '5.11'
84
104
  - - ">="
85
105
  - !ruby/object:Gem::Version
86
- version: 2.0.12
87
- description: "# excel_to_code\n\nConverts some excel spreadsheets (.xlsx, not .xls)
88
- into some other programming languages (currently ruby or c).\nThis allows the excel
89
- spreadsheets to be run programatically, without excel.\n\nIts cannonical source
90
- is at http://github.com/tamc/excel_to_code\n\n# Running excel_to_code\n\nTo just
91
- have a go:\n\n\t./bin/excel_to_c <excel_file_name>\n\t\nNB:For small spreadsheets
92
- this will take a minute or so. For large spreadsheets it is best to run it overnight.\n\t\nfor
93
- more detail:\n\t\n\t./bin/excel_to_c --compile --run-tests --settable <name of input
94
- worksheet> --prune-except <name of output worksheet> <excel file name> \n\t\nthis
95
- should work:\n\n\t./bin/excel_to_c --help\n\n# Testing excel_to_code\n\n1. Make
96
- sure you have ruby 1.9.2 or later installed\n2. gem install bundler # May need to
97
- use sudo\n3. bundle\n4. rspec spec/*\n\nTo test the C runtime:\n1. cd src/compile/c\n2.
98
- cc excel_to_c_runtime\n3. ./a.out\n\n# Hacking excel_to_code\n\nThere are some how
99
- to guides in the doc folder. \n\n# Limitations\n\n1. Not tested at all on Windows\n2.
100
- INDIRECT and OFFSET formula must be convertable at runtime into a standard formula\n3.
101
- Doesn't implement all functions (see doc/Which_functions_are_implemented.md)\n4.
106
+ version: 5.11.1
107
+ - !ruby/object:Gem::Dependency
108
+ name: rake
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '12'
114
+ type: :development
115
+ prerelease: false
116
+ version_requirements: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '12'
121
+ description: "# Excel to Code\n\n[![Tests Passing](https://travis-ci.org/tamc/excel_to_code.svg?branch=master)](https://travis-ci.org/tamc/excel_to_code)\n\nexcel_to_c
122
+ - roughly translate some Excel files into C.\n\nexcel_to_ruby - roughly translate
123
+ some Excel files into Ruby.\n\nThis allows spreadsheets to be:\n\n1. Embedded in
124
+ other programs, such as web servers, or optimisers\n2. Without depending on any
125
+ Microsoft code\n\nFor example, running [these commands](examples/simple/compile.sh)
126
+ turns [this spreadsheet](examples/simple/simple.xlsx) into [this Ruby code](examples/simple/ruby/simple.rb)
127
+ or [this C code](examples/simple/c/simple.c).\n\n# Install\n\nRequires Ruby. Install
128
+ by:\n\n gem install excel_to_code\n\n# Run\n\nTo just have a go:\n\n\texcel_to_c
129
+ <excel_file_name>\n\nThis will produce a file called excelspreadsheet.c\n\nFor a
130
+ more complex spreadsheet:\n\t\n\texcel_to_c --compile --run-tests --settable <name
131
+ of input worksheet> --prune-except <name of output worksheet> <excel file name>
132
+ \n\t\nSee the full list of options:\n\n\texcel_to_c --help\n\n# Gotchas, limitations
133
+ and bugs\n\n0. No custom functions, no macros for generating results\n1. Results
134
+ are cached. So you must call reset(), then set values, then read values.\n2. It
135
+ must be possible to replace INDIRECT and OFFSET formula with standard references
136
+ at compile time (e.g., INDIRECT(\"A\"&\"1\") is fine, INDIRECT(userInput&\"3\")
137
+ is not.\n3. Doesn't implement all functions. [See which functions are implemented](docs/Which_functions_are_implemented.md).\n4.
102
138
  Doesn't implement references that involve range unions and lists (but does implement
103
139
  standard ranges)\n5. Sometimes gives cells as being empty, when excel would give
104
140
  the cell as having a numeric value of zero\n6. The generated C version does not
105
- multithread and will give bad results if you try\n7. The generated code uses floating
106
- point, rather than fully precise arithmetic, so results can differ slightly\n8.
141
+ multithread and will give bad results if you try.\n7. The generated code uses floating
142
+ point, rather than fully precise arithmetic, so results can differ slightly.\n8.
107
143
  The generated code uses the sprintf approach to rounding (even-odd) rather than
108
- excel's 0.5 rounds away from zero.\n90. Ranges like this: Sheet1!A10:Sheet1!B20
109
- and 3D ranges don't work\n"
144
+ excel's 0.5 rounds away from zero.\n9. Ranges like this: Sheet1!A10:Sheet1!B20 and
145
+ 3D ranges don't work.\n\nReport bugs: <https://github.com/tamc/excel_to_code/issues>\n\n#
146
+ Changelog\n\nSee [Changes](CHANGES.md).\n\n# License\n\nSee [License](LICENSE.md)\n\n#
147
+ Hacking\n\nSource code: <https://github.com/tamc/excel_to_code>\n\nDocumentation:\n\n*
148
+ [Installing from source](docs/installing_from_source.md)\n* [Structure of this project](docs/structure_of_this_project.md)\n*
149
+ [How does the calculation work](docs/how_does_the_calculation_work.md)\n* [How to
150
+ fix parsing errors](docs/How_to_fix_parsing_errors.md)\n* [How to implement a new
151
+ Excel function](docs/How_to_add_a_missing_function.md)\n\nSome notes on how Excel
152
+ works under the hood:\n\n* [The Excel file structure](docs/implementation/excel_file_structure.md)\n*
153
+ [Relationships](docs/implementation/relationships.md)\n* [Workbooks](docs/implementation/workbook.md)\n*
154
+ [Worksheets](docs/implementation/worksheets.md)\n* [Cells](docs/implementation/cell.md)\n*
155
+ [Tables](docs/implementation/tables.md)\n* [Shared Strings](docs/implementation/shared_strings.md)\n*
156
+ [Array formulae](docs/implementation/array_formulae.md)\n\n"
110
157
  email: tamc@greenonblack.com
111
158
  executables:
112
159
  - excel_to_c
@@ -115,11 +162,13 @@ extensions: []
115
162
  extra_rdoc_files: []
116
163
  files:
117
164
  - README.md
118
- - TODO
119
165
  - bin/excel_to_c
166
+ - bin/excel_to_go
120
167
  - bin/excel_to_ruby
121
168
  - src/commands.rb
169
+ - src/commands/common_command_line_options.rb
122
170
  - src/commands/excel_to_c.rb
171
+ - src/commands/excel_to_go.rb
123
172
  - src/commands/excel_to_ruby.rb
124
173
  - src/commands/excel_to_test.rb
125
174
  - src/commands/excel_to_x.rb
@@ -138,6 +187,14 @@ files:
138
187
  - src/compile/c/map_sheet_names_to_c_names.rb
139
188
  - src/compile/c/map_values_to_c.rb
140
189
  - src/compile/c/map_values_to_c_structs.rb
190
+ - src/compile/c/run_c_unit_tests
191
+ - src/compile/cd.rb
192
+ - src/compile/go.rb
193
+ - src/compile/go/compile_to_go.rb
194
+ - src/compile/go/compile_to_go_test.rb
195
+ - src/compile/go/excel.go
196
+ - src/compile/go/excel_test.go
197
+ - src/compile/go/map_values_to_go.rb
141
198
  - src/compile/ruby.rb
142
199
  - src/compile/ruby/compile_to_ruby.rb
143
200
  - src/compile/ruby/compile_to_ruby_unit_test.rb
@@ -155,12 +212,15 @@ files:
155
212
  - src/excel/excel_functions/apply_to_range.rb
156
213
  - src/excel/excel_functions/average.rb
157
214
  - src/excel/excel_functions/averageifs.rb
215
+ - src/excel/excel_functions/ceiling.rb
158
216
  - src/excel/excel_functions/cell.rb
159
217
  - src/excel/excel_functions/char.rb
160
218
  - src/excel/excel_functions/choose.rb
161
219
  - src/excel/excel_functions/cosh.rb
162
220
  - src/excel/excel_functions/count.rb
163
221
  - src/excel/excel_functions/counta.rb
222
+ - src/excel/excel_functions/countif.rb
223
+ - src/excel/excel_functions/countifs.rb
164
224
  - src/excel/excel_functions/divide.rb
165
225
  - src/excel/excel_functions/ensure_is_number.rb
166
226
  - src/excel/excel_functions/excel_equal.rb
@@ -168,8 +228,10 @@ files:
168
228
  - src/excel/excel_functions/excel_match.rb
169
229
  - src/excel/excel_functions/exp.rb
170
230
  - src/excel/excel_functions/find.rb
231
+ - src/excel/excel_functions/floor.rb
171
232
  - src/excel/excel_functions/forecast.rb
172
233
  - src/excel/excel_functions/hlookup.rb
234
+ - src/excel/excel_functions/hyperlink.rb
173
235
  - src/excel/excel_functions/iferror.rb
174
236
  - src/excel/excel_functions/index.rb
175
237
  - src/excel/excel_functions/int.rb
@@ -193,21 +255,30 @@ files:
193
255
  - src/excel/excel_functions/more_than.rb
194
256
  - src/excel/excel_functions/more_than_or_equal.rb
195
257
  - src/excel/excel_functions/multiply.rb
258
+ - src/excel/excel_functions/na.rb
196
259
  - src/excel/excel_functions/negative.rb
260
+ - src/excel/excel_functions/not.rb
197
261
  - src/excel/excel_functions/not_equal.rb
198
262
  - src/excel/excel_functions/npv.rb
199
263
  - src/excel/excel_functions/number_argument.rb
200
264
  - src/excel/excel_functions/number_or_zero.rb
265
+ - src/excel/excel_functions/or.rb
201
266
  - src/excel/excel_functions/pi.rb
202
267
  - src/excel/excel_functions/pmt.rb
203
268
  - src/excel/excel_functions/power.rb
269
+ - src/excel/excel_functions/product.rb
204
270
  - src/excel/excel_functions/pv.rb
205
271
  - src/excel/excel_functions/rank.rb
272
+ - src/excel/excel_functions/rate.rb
273
+ - src/excel/excel_functions/replace.rb
206
274
  - src/excel/excel_functions/reset.rb
207
275
  - src/excel/excel_functions/right.rb
208
276
  - src/excel/excel_functions/round.rb
209
277
  - src/excel/excel_functions/rounddown.rb
210
278
  - src/excel/excel_functions/roundup.rb
279
+ - src/excel/excel_functions/scurve.rb
280
+ - src/excel/excel_functions/sqrt.rb
281
+ - src/excel/excel_functions/string_argument.rb
211
282
  - src/excel/excel_functions/string_join.rb
212
283
  - src/excel/excel_functions/substitute.rb
213
284
  - src/excel/excel_functions/subtotal.rb
@@ -258,6 +329,7 @@ files:
258
329
  - src/simplify/remove_cells.rb
259
330
  - src/simplify/replace_arithmetic_on_ranges.rb
260
331
  - src/simplify/replace_arrays_with_single_cells.rb
332
+ - src/simplify/replace_cell_addresses_with_references.rb
261
333
  - src/simplify/replace_column_with_column_number.rb
262
334
  - src/simplify/replace_common_elements_in_formulae.rb
263
335
  - src/simplify/replace_indirects_with_references.rb
@@ -276,6 +348,7 @@ files:
276
348
  - src/util.rb
277
349
  - src/util/not_supported_exception.rb
278
350
  - src/util/try.rb
351
+ - src/version.rb
279
352
  homepage: http://github.com/tamc/excel_to_code
280
353
  licenses:
281
354
  - MIT
@@ -288,18 +361,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
288
361
  requirements:
289
362
  - - ">="
290
363
  - !ruby/object:Gem::Version
291
- version: 1.9.1
364
+ version: 2.3.0
292
365
  required_rubygems_version: !ruby/object:Gem::Requirement
293
366
  requirements:
294
- - - ">="
367
+ - - ">"
295
368
  - !ruby/object:Gem::Version
296
- version: '0'
369
+ version: 1.3.1
297
370
  requirements: []
298
371
  rubyforge_project:
299
- rubygems_version: 2.2.2
372
+ rubygems_version: 2.7.6
300
373
  signing_key:
301
374
  specification_version: 4
302
- summary: Converts .xlxs files into pure ruby 1.9 code or pure C code so that they
303
- can be executed without excel
375
+ summary: Convert many .xlsx and .xlsm files into equivalent Ruby or C code that can
376
+ be executed without Excel
304
377
  test_files: []
305
- has_rdoc: false