excel_to_code 0.2.24 → 0.2.25

Sign up to get free protection for your applications and to get access to all the features.
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