excel_to_code 0.2.24 → 0.2.25

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
  SHA1:
3
- metadata.gz: cb603a0eac62f0611930a0d26b0d2b7ce01da651
4
- data.tar.gz: 7c294156828d74582d15e48654ab5b815f6b908a
3
+ metadata.gz: 3d72318213cf0081f534b5f4831a7a1e1835dbd3
4
+ data.tar.gz: 2700a1eef57c8edbc96432fa4140713b6a15c37f
5
5
  SHA512:
6
- metadata.gz: da2b38c8ceda26be3f746aed440dc7ce8d375a7b7ba2050ca7345141315e6506ef7205d3902c5796872359733f88bf7acbf4c68c14b0fc8a07cc18981eedcb1d
7
- data.tar.gz: ace94f63560ed912c29d5f6094f9ed6a757791e17c79cc388ce652edb0a37aa78e6dae2ad84bf152d0a400bc0244691686c35d545e74528c273f32a2854669b3
6
+ metadata.gz: f2796806f37fff89494e84f60cc73305ab9cdcc19e44540954fbe9f9961d73914c82af786bafc01936aa1e1e2553fbc1b23fd9902950e70cefcafd007ada22ca
7
+ data.tar.gz: 9a15536fd266ac59fea374200645ff395b11dff32f45ae7acb85c158aa90dcb8486f1e03c8ba8312c034086606bbef41a8884fc0a65e91c713f9f3470e27aedf
data/src/compile/c/a.out CHANGED
Binary file
@@ -74,6 +74,7 @@ static ExcelValue left_1(ExcelValue string_v);
74
74
  static ExcelValue len(ExcelValue string_v);
75
75
  static ExcelValue excel_log(ExcelValue number);
76
76
  static ExcelValue excel_log_2(ExcelValue number, ExcelValue base);
77
+ static ExcelValue ln(ExcelValue number);
77
78
  static ExcelValue excel_exp(ExcelValue number);
78
79
  static ExcelValue max(int number_of_arguments, ExcelValue *arguments);
79
80
  static ExcelValue min(int number_of_arguments, ExcelValue *arguments);
@@ -333,6 +334,16 @@ static ExcelValue excel_log_2(ExcelValue number_v, ExcelValue base_v) {
333
334
  return new_excel_number(log(n)/log(b));
334
335
  }
335
336
 
337
+ static ExcelValue ln(ExcelValue number_v) {
338
+ CHECK_FOR_PASSED_ERROR(number_v)
339
+ NUMBER(number_v, n)
340
+ CHECK_FOR_CONVERSION_ERROR
341
+
342
+ if(n<=0) { return NUM; }
343
+
344
+ return new_excel_number(log(n));
345
+ }
346
+
336
347
  static ExcelValue excel_exp(ExcelValue number_v) {
337
348
  CHECK_FOR_PASSED_ERROR(number_v)
338
349
  NUMBER(number_v, n)
@@ -685,6 +685,12 @@ int test_functions() {
685
685
  assert(excel_log_2(new_excel_number(8),new_excel_number(2)).number == 3.0);
686
686
  assert(excel_log_2(new_excel_number(8),new_excel_number(0)).type == ExcelError);
687
687
 
688
+ // Test LN
689
+ assert(ln(new_excel_number(10)).number == 2.302585092994046);
690
+ assert(ln(new_excel_number(8)).number == 2.0794415416798357);
691
+ assert(ln(new_excel_number(0)).type == ExcelError);
692
+ assert(ln(new_excel_number(-1)).type == ExcelError);
693
+
688
694
  // Test MMULT (Matrix multiplication)
689
695
  ExcelValue mmult_1[] = { ONE, TWO, THREE, FOUR};
690
696
  ExcelValue mmult_2[] = { FOUR, THREE, TWO, ONE};
@@ -55,6 +55,7 @@ class MapFormulaeToC < MapValuesToC
55
55
  :'LEFT1' => 'left_1',
56
56
  :'LEFT2' => 'left',
57
57
  :'LEN' => 'len',
58
+ :'LN' => 'ln',
58
59
  :'LOG1' => 'excel_log',
59
60
  :'LOG2' => 'excel_log_2',
60
61
  :'MATCH2' => 'excel_match_2',
@@ -40,6 +40,7 @@ class MapFormulaeToRuby < MapValuesToRuby
40
40
  :'LARGE' => 'large',
41
41
  :'LEFT' => 'left',
42
42
  :'LEN' => 'len',
43
+ :'LN' => 'ln',
43
44
  :'LOG' => 'log',
44
45
  :'LOWER' => 'lower',
45
46
  :'MATCH' => 'excel_match',
@@ -109,3 +109,5 @@ require_relative 'excel_functions/forecast'
109
109
  require_relative 'excel_functions/ensure_is_number'
110
110
 
111
111
  require_relative 'excel_functions/value'
112
+
113
+ require_relative 'excel_functions/ln'
@@ -0,0 +1,14 @@
1
+ module ExcelFunctions
2
+
3
+ def ln(a)
4
+ a = number_argument(a)
5
+
6
+ return a if a.is_a?(Symbol)
7
+
8
+ return :num if a <= 0
9
+
10
+ Math.log(a)
11
+
12
+ end
13
+
14
+ end
data/src/excel_to_code.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  class ExcelToCode
2
- def self.version() "0.2.24" end
2
+ def self.version() "0.2.25" end
3
3
  end
4
4
 
5
5
  require_relative 'commands'
@@ -1,53 +1,72 @@
1
- require 'nokogiri'
1
+ require 'ox'
2
2
 
3
- class ExtractNamedReferences < Nokogiri::XML::SAX::Document
3
+ class ExtractNamedReferences < ::Ox::Sax
4
4
 
5
- attr_accessor :parsing, :input, :output
5
+ attr_accessor :named_references
6
+ attr_accessor :state
6
7
 
7
8
  def self.extract(input)
8
9
  self.new.extract(input)
9
10
  end
10
11
 
11
- def initialize
12
- super
13
- @sheet_names = []
12
+ def extract(input_xml)
13
+ @state = :not_parsing
14
+ @sheet_names = [] # This keeps track of the sheet names
15
+ @named_references = {}
16
+ @localSheetId = nil
17
+ @name = nil
18
+ @reference = []
19
+ Ox.sax_parse(self, input_xml, :convert_special => true)
20
+ @named_references
14
21
  end
15
22
 
16
- def extract(input)
17
- @input, @output = input, {}
18
- @sheet = nil
19
- @name = nil
20
- @reference = nil
21
- parser = Nokogiri::XML::SAX::Parser.new(self)
22
- parser.parse(@input)
23
- @output
23
+ def start_element(name)
24
+ case name
25
+ when :sheet
26
+ @state = :parsing_sheet_name
27
+ when :definedName
28
+ @state = :parsing_named_reference
29
+ end
24
30
  end
25
31
 
26
- def start_element(name,attributes)
27
- if name == "sheet"
28
- @sheet_names << attributes.assoc('name').last
29
- elsif name == "definedName"
30
- @sheet = attributes.assoc('localSheetId') && @sheet_names[attributes.assoc('localSheetId').last.to_i].downcase.to_sym
31
- @name = attributes.assoc('name').last.downcase.to_sym
32
- @reference = ""
32
+
33
+ def attr(name, value)
34
+ case state
35
+ when :parsing_sheet_name
36
+ @sheet_names << value if name == :name
37
+ when :parsing_named_reference
38
+ @localSheetId = value.to_i if name == :localSheetId
39
+ @name = value.downcase.to_sym if name == :name
33
40
  end
34
41
  end
35
42
 
36
43
  def end_element(name)
37
- return unless name == "definedName"
38
- if @sheet
39
- @output[[@sheet, @name]] = @reference.gsub('$', '')
40
- else
41
- @output[@name] = @reference.gsub('$', '')
44
+ case name
45
+ when :sheet
46
+ @state = :not_parsing
47
+ when :definedName
48
+ @state = :not_parsing
49
+
50
+ reference = @reference.join.gsub('$','')
51
+
52
+ @named_references[key] = reference
53
+
54
+ @localSheetId = nil
55
+ @name = nil
56
+ @reference = []
42
57
  end
43
- @sheet = nil
44
- @name = nil
45
- @reference = nil
46
58
  end
47
59
 
48
- def characters(string)
49
- return unless @reference
50
- @reference << string
60
+ def text(text)
61
+ return unless state == :parsing_named_reference
62
+ @reference << text
63
+ end
64
+
65
+
66
+ def key
67
+ return @name unless @localSheetId
68
+ sheet = @sheet_names[@localSheetId].downcase.to_sym
69
+ [sheet, @name]
51
70
  end
52
71
 
53
72
  end
@@ -2,7 +2,17 @@ class ReplaceArithmeticOnRangesAst
2
2
 
3
3
  def map(ast)
4
4
  return ast unless ast.is_a?(Array)
5
- ast.each { |a| map(a) }
5
+ ast.each do |a|
6
+ next unless a.is_a?(Array)
7
+ case ast.first
8
+ when :error, :null, :space, :prefix, :boolean_true, :boolean_false, :number, :string
9
+ next
10
+ when :sheet_reference, :table_reference, :local_table_reference
11
+ next
12
+ else
13
+ map(a)
14
+ end
15
+ end
6
16
  arithmetic(ast) if ast.first == :arithmetic
7
17
  comparison(ast) if ast.first == :comparison
8
18
  ast
@@ -112,25 +122,3 @@ class ReplaceArithmeticOnRangesAst
112
122
  end
113
123
 
114
124
  end
115
-
116
-
117
- class ReplaceArithmeticOnRanges
118
-
119
- def self.replace(*args)
120
- self.new.replace(*args)
121
- end
122
-
123
- def replace(input,output)
124
- rewriter = ReplaceArithmeticOnRangesAst.new
125
- input.each_line do |line|
126
- # Looks to match lines with references
127
- if line =~ /:arithmetic/ && line =~ /:array/
128
- content = line.split("\t")
129
- ast = eval(content.pop)
130
- output.puts "#{content.join("\t")}\t#{rewriter.map(ast).inspect}"
131
- else
132
- output.puts line
133
- end
134
- end
135
- end
136
- end
@@ -37,7 +37,7 @@ class ReplaceArraysWithSingleCellsAst
37
37
  right = try_and_convert_array(right)
38
38
  ast.replace([:arithmetic, left, op, right])
39
39
  else
40
- ast[1..-1].each { |a| do_map(a) }
40
+ map_if_required(ast)
41
41
  end
42
42
  when :string_join
43
43
  strings = ast[1..-1]
@@ -45,7 +45,7 @@ class ReplaceArraysWithSingleCellsAst
45
45
  strings = strings.map { |s| try_and_convert_array(s) }
46
46
  ast.replace([:string_join, *strings])
47
47
  else
48
- ast[1..-1].each { |a| do_map(a) }
48
+ map_if_required(strings)
49
49
  end
50
50
  when :function
51
51
  if ast[1] == :SUMIF && ast[3].first == :array
@@ -57,10 +57,27 @@ class ReplaceArraysWithSingleCellsAst
57
57
  elsif ast[1] == :INDIRECT && check_indirect(ast)
58
58
  # Replacement made in check function
59
59
  else
60
- ast[2..-1].each { |a| do_map(a) }
60
+ map_if_required(ast)
61
61
  end
62
62
  else
63
- ast[1..-1].each { |a| do_map(a) }
63
+ map_if_required(ast)
64
+ end
65
+ end
66
+
67
+ # This tries to speed up the process by not recursively
68
+ # checking arguments that we know won't be interesting
69
+ def map_if_required(arguments)
70
+ return arguments unless arguments.is_a?(Array)
71
+ arguments.each do |a|
72
+ next unless a.is_a?(Array)
73
+ case a.first
74
+ when :error, :null, :space, :prefix, :boolean_true, :boolean_false, :number, :string
75
+ next
76
+ when :sheet_reference, :table_reference, :local_table_reference
77
+ next
78
+ else
79
+ do_map(a)
80
+ end
64
81
  end
65
82
  end
66
83
 
@@ -2,8 +2,18 @@ class ReplaceStringJoinOnRangesAST
2
2
 
3
3
  def map(ast)
4
4
  return ast unless ast.is_a?(Array)
5
+ ast.each do |a|
6
+ next unless a.is_a?(Array)
7
+ case ast.first
8
+ when :error, :null, :space, :prefix, :boolean_true, :boolean_false, :number, :string
9
+ next
10
+ when :sheet_reference, :table_reference, :local_table_reference
11
+ next
12
+ else
13
+ map(a)
14
+ end
5
15
  string_join(ast) if ast[0] == :string_join
6
- ast.each { |a| map(a) }
16
+ end
7
17
  ast
8
18
  end
9
19
 
@@ -46,28 +56,4 @@ class ReplaceStringJoinOnRangesAST
46
56
  return [:error, "#VALUE!"] unless cell
47
57
  map(cell)
48
58
  end
49
-
50
-
51
- end
52
-
53
-
54
- class ReplaceStringJoinOnRanges
55
-
56
- def self.replace(*args)
57
- self.new.replace(*args)
58
- end
59
-
60
- def replace(input,output)
61
- rewriter = ReplaceStringJoinOnRangesAST.new
62
- input.each_line do |line|
63
- # Looks to match lines with references
64
- if line =~ /:string_join/ && line =~ /:array/
65
- content = line.split("\t")
66
- ast = eval(content.pop)
67
- output.puts "#{content.join("\t")}\t#{rewriter.map(ast).inspect}"
68
- else
69
- output.puts line
70
- end
71
- end
72
- end
73
59
  end
metadata CHANGED
@@ -1,33 +1,36 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: excel_to_code
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.24
4
+ version: 0.2.25
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: 2014-05-16 00:00:00.000000000 Z
11
+ date: 2014-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubypeg
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: nokogiri
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.5'
31
34
  - - ">="
32
35
  - !ruby/object:Gem::Version
33
36
  version: 1.5.0
@@ -35,6 +38,9 @@ dependencies:
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '1.5'
38
44
  - - ">="
39
45
  - !ruby/object:Gem::Version
40
46
  version: 1.5.0
@@ -42,6 +48,9 @@ dependencies:
42
48
  name: rspec
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.7'
45
54
  - - ">="
46
55
  - !ruby/object:Gem::Version
47
56
  version: 2.7.0
@@ -49,6 +58,9 @@ dependencies:
49
58
  prerelease: false
50
59
  version_requirements: !ruby/object:Gem::Requirement
51
60
  requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '2.7'
52
64
  - - ">="
53
65
  - !ruby/object:Gem::Version
54
66
  version: 2.7.0
@@ -56,6 +68,9 @@ dependencies:
56
68
  name: ffi
57
69
  requirement: !ruby/object:Gem::Requirement
58
70
  requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '1.0'
59
74
  - - ">="
60
75
  - !ruby/object:Gem::Version
61
76
  version: 1.0.11
@@ -63,6 +78,9 @@ dependencies:
63
78
  prerelease: false
64
79
  version_requirements: !ruby/object:Gem::Requirement
65
80
  requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '1.0'
66
84
  - - ">="
67
85
  - !ruby/object:Gem::Version
68
86
  version: 1.0.11
@@ -70,6 +88,9 @@ dependencies:
70
88
  name: ox
71
89
  requirement: !ruby/object:Gem::Requirement
72
90
  requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '2.0'
73
94
  - - ">="
74
95
  - !ruby/object:Gem::Version
75
96
  version: 2.0.12
@@ -77,6 +98,9 @@ dependencies:
77
98
  prerelease: false
78
99
  version_requirements: !ruby/object:Gem::Requirement
79
100
  requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.0'
80
104
  - - ">="
81
105
  - !ruby/object:Gem::Version
82
106
  version: 2.0.12
@@ -168,6 +192,7 @@ files:
168
192
  - src/excel/excel_functions/len.rb
169
193
  - src/excel/excel_functions/less_than.rb
170
194
  - src/excel/excel_functions/less_than_or_equal.rb
195
+ - src/excel/excel_functions/ln.rb
171
196
  - src/excel/excel_functions/log.rb
172
197
  - src/excel/excel_functions/lower.rb
173
198
  - src/excel/excel_functions/max.rb