rubyfromexcel 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (188) hide show
  1. data/README +22 -0
  2. data/bin/rubyfromexcel +20 -0
  3. data/examples/create_and_test_examples.rb +37 -0
  4. data/examples/ruby-versions/array-formulas-ruby/sheets/sheet1.rb +59 -0
  5. data/examples/ruby-versions/array-formulas-ruby/sheets/sheet2.rb +9 -0
  6. data/examples/ruby-versions/array-formulas-ruby/specs/sheet1_rspec.rb +156 -0
  7. data/examples/ruby-versions/array-formulas-ruby/specs/sheet2_rspec.rb +8 -0
  8. data/examples/ruby-versions/array-formulas-ruby/spreadsheet.rb +9 -0
  9. data/examples/ruby-versions/complex-test-ruby/sheets/sheet1.rb +305 -0
  10. data/examples/ruby-versions/complex-test-ruby/sheets/sheet2.rb +147 -0
  11. data/examples/ruby-versions/complex-test-ruby/specs/sheet1_rspec.rb +876 -0
  12. data/examples/ruby-versions/complex-test-ruby/specs/sheet2_rspec.rb +412 -0
  13. data/examples/ruby-versions/complex-test-ruby/spreadsheet.rb +9 -0
  14. data/examples/ruby-versions/namedReferenceTest-ruby/sheets/sheet1.rb +9 -0
  15. data/examples/ruby-versions/namedReferenceTest-ruby/sheets/sheet2.rb +8 -0
  16. data/examples/ruby-versions/namedReferenceTest-ruby/specs/sheet1_rspec.rb +16 -0
  17. data/examples/ruby-versions/namedReferenceTest-ruby/specs/sheet2_rspec.rb +16 -0
  18. data/examples/ruby-versions/namedReferenceTest-ruby/spreadsheet.rb +9 -0
  19. data/examples/ruby-versions/pruning-ruby/sheets/sheet1.rb +11 -0
  20. data/examples/ruby-versions/pruning-ruby/sheets/sheet2.rb +14 -0
  21. data/examples/ruby-versions/pruning-ruby/sheets/sheet3.rb +7 -0
  22. data/examples/ruby-versions/pruning-ruby/specs/sheet1_rspec.rb +20 -0
  23. data/examples/ruby-versions/pruning-ruby/specs/sheet2_rspec.rb +20 -0
  24. data/examples/ruby-versions/pruning-ruby/specs/sheet3_rspec.rb +8 -0
  25. data/examples/ruby-versions/pruning-ruby/spreadsheet.rb +9 -0
  26. data/examples/ruby-versions/sharedFormulaTest-ruby/sheets/sheet1.rb +15 -0
  27. data/examples/ruby-versions/sharedFormulaTest-ruby/specs/sheet1_rspec.rb +44 -0
  28. data/examples/ruby-versions/sharedFormulaTest-ruby/spreadsheet.rb +9 -0
  29. data/examples/ruby-versions/table-test-ruby/sheets/sheet1.rb +17 -0
  30. data/examples/ruby-versions/table-test-ruby/sheets/sheet2.rb +5 -0
  31. data/examples/ruby-versions/table-test-ruby/sheets/sheet3.rb +5 -0
  32. data/examples/ruby-versions/table-test-ruby/specs/sheet1_rspec.rb +20 -0
  33. data/examples/ruby-versions/table-test-ruby/specs/sheet2_rspec.rb +8 -0
  34. data/examples/ruby-versions/table-test-ruby/specs/sheet3_rspec.rb +8 -0
  35. data/examples/ruby-versions/table-test-ruby/spreadsheet.rb +9 -0
  36. data/examples/sheets/array-formulas.xlsx +0 -0
  37. data/examples/sheets/complex-test.xlsx +0 -0
  38. data/examples/sheets/namedReferenceTest.xlsx +0 -0
  39. data/examples/sheets/pruning.xlsx +0 -0
  40. data/examples/sheets/sharedFormulaTest.xlsx +0 -0
  41. data/examples/sheets/table-test.xlsx +0 -0
  42. data/examples/sheets/~$array-formulas.xlsx +0 -0
  43. data/examples/unzipped-sheets/array-formulas/[Content_Types].xml +2 -0
  44. data/examples/unzipped-sheets/array-formulas/docProps/app.xml +2 -0
  45. data/examples/unzipped-sheets/array-formulas/docProps/core.xml +2 -0
  46. data/examples/unzipped-sheets/array-formulas/docProps/thumbnail.jpeg +0 -0
  47. data/examples/unzipped-sheets/array-formulas/xl/_rels/workbook.xml.rels +2 -0
  48. data/examples/unzipped-sheets/array-formulas/xl/calcChain.xml +2 -0
  49. data/examples/unzipped-sheets/array-formulas/xl/sharedStrings.xml +2 -0
  50. data/examples/unzipped-sheets/array-formulas/xl/styles.xml +2 -0
  51. data/examples/unzipped-sheets/array-formulas/xl/theme/theme1.xml +2 -0
  52. data/examples/unzipped-sheets/array-formulas/xl/workbook.xml +2 -0
  53. data/examples/unzipped-sheets/array-formulas/xl/worksheets/sheet1.xml +2 -0
  54. data/examples/unzipped-sheets/array-formulas/xl/worksheets/sheet2.xml +2 -0
  55. data/examples/unzipped-sheets/complex-test/[Content_Types].xml +2 -0
  56. data/examples/unzipped-sheets/complex-test/docProps/app.xml +2 -0
  57. data/examples/unzipped-sheets/complex-test/docProps/core.xml +2 -0
  58. data/examples/unzipped-sheets/complex-test/xl/_rels/workbook.xml.rels +2 -0
  59. data/examples/unzipped-sheets/complex-test/xl/calcChain.xml +2 -0
  60. data/examples/unzipped-sheets/complex-test/xl/charts/chart1.xml +2 -0
  61. data/examples/unzipped-sheets/complex-test/xl/charts/chart2.xml +2 -0
  62. data/examples/unzipped-sheets/complex-test/xl/comments1.xml +5 -0
  63. data/examples/unzipped-sheets/complex-test/xl/comments2.xml +5 -0
  64. data/examples/unzipped-sheets/complex-test/xl/drawings/_rels/drawing1.xml.rels +2 -0
  65. data/examples/unzipped-sheets/complex-test/xl/drawings/_rels/drawing2.xml.rels +2 -0
  66. data/examples/unzipped-sheets/complex-test/xl/drawings/drawing1.xml +2 -0
  67. data/examples/unzipped-sheets/complex-test/xl/drawings/drawing2.xml +2 -0
  68. data/examples/unzipped-sheets/complex-test/xl/drawings/vmlDrawing1.vml +46 -0
  69. data/examples/unzipped-sheets/complex-test/xl/drawings/vmlDrawing2.vml +46 -0
  70. data/examples/unzipped-sheets/complex-test/xl/sharedStrings.xml +2 -0
  71. data/examples/unzipped-sheets/complex-test/xl/styles.xml +2 -0
  72. data/examples/unzipped-sheets/complex-test/xl/theme/theme1.xml +2 -0
  73. data/examples/unzipped-sheets/complex-test/xl/workbook.xml +2 -0
  74. data/examples/unzipped-sheets/complex-test/xl/worksheets/_rels/sheet1.xml.rels +2 -0
  75. data/examples/unzipped-sheets/complex-test/xl/worksheets/_rels/sheet2.xml.rels +2 -0
  76. data/examples/unzipped-sheets/complex-test/xl/worksheets/sheet1.xml +2 -0
  77. data/examples/unzipped-sheets/complex-test/xl/worksheets/sheet2.xml +2 -0
  78. data/examples/unzipped-sheets/namedReferenceTest/[Content_Types].xml +2 -0
  79. data/examples/unzipped-sheets/namedReferenceTest/docProps/app.xml +2 -0
  80. data/examples/unzipped-sheets/namedReferenceTest/docProps/core.xml +2 -0
  81. data/examples/unzipped-sheets/namedReferenceTest/docProps/thumbnail.jpeg +0 -0
  82. data/examples/unzipped-sheets/namedReferenceTest/xl/_rels/workbook.xml.rels +2 -0
  83. data/examples/unzipped-sheets/namedReferenceTest/xl/calcChain.xml +2 -0
  84. data/examples/unzipped-sheets/namedReferenceTest/xl/styles.xml +2 -0
  85. data/examples/unzipped-sheets/namedReferenceTest/xl/theme/theme1.xml +2 -0
  86. data/examples/unzipped-sheets/namedReferenceTest/xl/workbook.xml +2 -0
  87. data/examples/unzipped-sheets/namedReferenceTest/xl/worksheets/sheet1.xml +2 -0
  88. data/examples/unzipped-sheets/namedReferenceTest/xl/worksheets/sheet2.xml +2 -0
  89. data/examples/unzipped-sheets/pruning/[Content_Types].xml +2 -0
  90. data/examples/unzipped-sheets/pruning/docProps/app.xml +2 -0
  91. data/examples/unzipped-sheets/pruning/docProps/core.xml +2 -0
  92. data/examples/unzipped-sheets/pruning/docProps/thumbnail.jpeg +0 -0
  93. data/examples/unzipped-sheets/pruning/xl/_rels/workbook.xml.rels +2 -0
  94. data/examples/unzipped-sheets/pruning/xl/calcChain.xml +2 -0
  95. data/examples/unzipped-sheets/pruning/xl/sharedStrings.xml +2 -0
  96. data/examples/unzipped-sheets/pruning/xl/styles.xml +2 -0
  97. data/examples/unzipped-sheets/pruning/xl/theme/theme1.xml +2 -0
  98. data/examples/unzipped-sheets/pruning/xl/workbook.xml +2 -0
  99. data/examples/unzipped-sheets/pruning/xl/worksheets/sheet1.xml +2 -0
  100. data/examples/unzipped-sheets/pruning/xl/worksheets/sheet2.xml +2 -0
  101. data/examples/unzipped-sheets/pruning/xl/worksheets/sheet3.xml +2 -0
  102. data/examples/unzipped-sheets/sharedFormulaTest/[Content_Types].xml +2 -0
  103. data/examples/unzipped-sheets/sharedFormulaTest/docProps/app.xml +2 -0
  104. data/examples/unzipped-sheets/sharedFormulaTest/docProps/core.xml +2 -0
  105. data/examples/unzipped-sheets/sharedFormulaTest/docProps/thumbnail.jpeg +0 -0
  106. data/examples/unzipped-sheets/sharedFormulaTest/xl/_rels/workbook.xml.rels +2 -0
  107. data/examples/unzipped-sheets/sharedFormulaTest/xl/calcChain.xml +2 -0
  108. data/examples/unzipped-sheets/sharedFormulaTest/xl/styles.xml +2 -0
  109. data/examples/unzipped-sheets/sharedFormulaTest/xl/theme/theme1.xml +2 -0
  110. data/examples/unzipped-sheets/sharedFormulaTest/xl/workbook.xml +2 -0
  111. data/examples/unzipped-sheets/sharedFormulaTest/xl/worksheets/sheet1.xml +2 -0
  112. data/examples/unzipped-sheets/table-test/[Content_Types].xml +2 -0
  113. data/examples/unzipped-sheets/table-test/docProps/app.xml +2 -0
  114. data/examples/unzipped-sheets/table-test/docProps/core.xml +2 -0
  115. data/examples/unzipped-sheets/table-test/xl/_rels/workbook.xml.rels +2 -0
  116. data/examples/unzipped-sheets/table-test/xl/calcChain.xml +2 -0
  117. data/examples/unzipped-sheets/table-test/xl/printerSettings/printerSettings1.bin +0 -0
  118. data/examples/unzipped-sheets/table-test/xl/sharedStrings.xml +2 -0
  119. data/examples/unzipped-sheets/table-test/xl/styles.xml +2 -0
  120. data/examples/unzipped-sheets/table-test/xl/tables/table1.xml +2 -0
  121. data/examples/unzipped-sheets/table-test/xl/theme/theme1.xml +2 -0
  122. data/examples/unzipped-sheets/table-test/xl/workbook.xml +2 -0
  123. data/examples/unzipped-sheets/table-test/xl/worksheets/_rels/sheet1.xml.rels +2 -0
  124. data/examples/unzipped-sheets/table-test/xl/worksheets/sheet1.xml +2 -0
  125. data/examples/unzipped-sheets/table-test/xl/worksheets/sheet2.xml +2 -0
  126. data/examples/unzipped-sheets/table-test/xl/worksheets/sheet3.xml +2 -0
  127. data/lib/cells/array/array_formula_builder.rb +58 -0
  128. data/lib/cells/array/array_formula_cell.rb +27 -0
  129. data/lib/cells/array/arraying_formula_cell.rb +67 -0
  130. data/lib/cells/array/single_cell_array_formula_builder.rb +9 -0
  131. data/lib/cells/array/single_cell_array_formula_cell.rb +11 -0
  132. data/lib/cells/cell.rb +98 -0
  133. data/lib/cells/cells.rb +9 -0
  134. data/lib/cells/formula/formula_cell.rb +18 -0
  135. data/lib/cells/formula/simple_formula_cell.rb +4 -0
  136. data/lib/cells/shared/shared_formula_builder.rb +15 -0
  137. data/lib/cells/shared/shared_formula_cell.rb +20 -0
  138. data/lib/cells/shared/sharing_formula_cell.rb +36 -0
  139. data/lib/cells/value/value_cell.rb +24 -0
  140. data/lib/excelfile/excelfile.rb +6 -0
  141. data/lib/excelfile/relationships.rb +24 -0
  142. data/lib/excelfile/shared_strings.rb +21 -0
  143. data/lib/excelfile/sheet_names.rb +6 -0
  144. data/lib/excelfile/table.rb +116 -0
  145. data/lib/excelfile/workbook.rb +108 -0
  146. data/lib/excelfile/worksheet.rb +122 -0
  147. data/lib/formulae/compile/formula_builder.rb +316 -0
  148. data/lib/formulae/formulae.rb +6 -0
  149. data/lib/formulae/parse/formula_peg.rb +213 -0
  150. data/lib/formulae/parse/formula_peg.txt +40 -0
  151. data/lib/formulae/run/excel_functions.rb +375 -0
  152. data/lib/formulae/run/excel_matrix.rb +114 -0
  153. data/lib/formulae/run/excel_range.rb +256 -0
  154. data/lib/formulae/run/reference.rb +79 -0
  155. data/lib/optimiser/dependency_builder.rb +86 -0
  156. data/lib/optimiser/optimiser.rb +3 -0
  157. data/lib/optimiser/shared_formula_dependency_builder.rb +43 -0
  158. data/lib/optimiser/workbook_pruner.rb +80 -0
  159. data/lib/rubyfromexcel.rb +105 -0
  160. data/lib/runtime/runtime_formula_builder.rb +32 -0
  161. data/spec/array_formula_builder_spec.rb +35 -0
  162. data/spec/array_formula_cell_spec.rb +17 -0
  163. data/spec/arraying_formula_cell_spec.rb +38 -0
  164. data/spec/dependency_builder_spec.rb +71 -0
  165. data/spec/excel_functions_spec.rb +381 -0
  166. data/spec/excel_matrix_spec.rb +92 -0
  167. data/spec/excel_range_spec.rb +161 -0
  168. data/spec/formula_builder_spec.rb +230 -0
  169. data/spec/formula_peg_spec.rb +165 -0
  170. data/spec/reference_spec.rb +72 -0
  171. data/spec/relationships_spec.rb +51 -0
  172. data/spec/runtime_formula_builder_spec.rb +55 -0
  173. data/spec/shared_formula_builder_spec.rb +29 -0
  174. data/spec/shared_formula_cell_spec.rb +23 -0
  175. data/spec/shared_formula_dependency_builder_spec.rb +48 -0
  176. data/spec/shared_strings_spec.rb +14 -0
  177. data/spec/sharing_formula_cell_spec.rb +79 -0
  178. data/spec/simple_formula_cell_spec.rb +78 -0
  179. data/spec/single_cell_array_formula_builder_spec.rb +19 -0
  180. data/spec/single_cell_array_formula_cell_spec.rb +25 -0
  181. data/spec/spec_helper.rb +2 -0
  182. data/spec/table_spec.rb +100 -0
  183. data/spec/value_cell_spec.rb +49 -0
  184. data/spec/workbook_pruner_spec.rb +27 -0
  185. data/spec/workbook_spec.rb +283 -0
  186. data/spec/worksheet_failiures_spec.rb +41 -0
  187. data/spec/worksheet_spec.rb +486 -0
  188. metadata +291 -0
@@ -0,0 +1,27 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe WorkbookPruner do
4
+
5
+ it "should initialize with a workbook and ensure that all the worksheets in that workbook check their dependencies" do
6
+ workbook = mock(:workbook)
7
+ WorkbookPruner.new(workbook)
8
+ end
9
+
10
+ it "should be able prune any cells not required" do
11
+ workbook = mock(:workbook)
12
+ workbook.should_receive(:work_out_dependencies)
13
+ sheet1 = mock(:worksheet)
14
+ workbook.should_receive(:worksheets).at_least(:once).and_return({'sheet1' => sheet1})
15
+ workbook.should_receive(:total_cells).and_return(2)
16
+ cell1 = mock(:cell)
17
+ sheet1.should_receive(:cells).at_least(:once).and_return({'a1' => cell1})
18
+ cell1.should_receive(:dependencies).and_return(['sheet1.a2'])
19
+ cell2 = mock(:cell)
20
+ workbook.should_receive(:cell).with('sheet1.a2').and_return(cell2)
21
+ cell2.should_receive(:dependencies).and_return([])
22
+ SheetNames.instance.clear
23
+ SheetNames.instance['Output Sheet'] = 'sheet1'
24
+ wb = WorkbookPruner.new(workbook)
25
+ wb.prune_cells_not_needed_for_output_sheets('Output Sheet')
26
+ end
27
+ end
@@ -0,0 +1,283 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe Workbook do
4
+
5
+ workbook_xml =<<END
6
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
7
+ <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
8
+ <fileVersion appName="xl" lastEdited="5" lowestEdited="5" rupBuild="9114"/>
9
+ <workbookPr defaultThemeVersion="124226"/>
10
+ <bookViews>
11
+ <workbookView xWindow="240" yWindow="90" windowWidth="9435" windowHeight="2070"/>
12
+ </bookViews>
13
+ <sheets>
14
+ <sheet name="First sheet" sheetId="1" r:id="rId1"/>
15
+ <sheet name="Sheet2" sheetId="2" r:id="rId2"/>
16
+ <sheet name="Sheet3" sheetId="3" r:id="rId3"/>
17
+ </sheets>
18
+ <definedNames>
19
+ <definedName name="OneAnd2">Sheet2!$A$2:$A$3</definedName>
20
+ <definedName name="Reference.2">Sheet2!$A$3</definedName>
21
+ <definedName name="ReferenceOne" localSheetId="1">'First sheet'!$A$1</definedName>
22
+ <definedName name="ReferenceOne">Sheet2!$A$2</definedName>
23
+ </definedNames>
24
+ <calcPr calcId="144315"/>
25
+ </workbook>
26
+ END
27
+
28
+ workbook_relationship_xml =<<END
29
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
30
+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
31
+ <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet3.xml"/>
32
+ <Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain" Target="calcChain.xml"/>
33
+ <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet2.xml"/>
34
+ <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>
35
+ <Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/>
36
+ <Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>
37
+ <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/>
38
+ </Relationships>
39
+ END
40
+
41
+ simple_worksheet_xml =<<END
42
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
43
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" mc:Ignorable="mv" mc:PreserveAttributes="mv:*">
44
+ <dimension ref="A1:A2"/>
45
+ <sheetViews>
46
+ <sheetView view="pageLayout" workbookViewId="0"/>
47
+ </sheetViews>
48
+ <sheetFormatPr baseColWidth="10" defaultRowHeight="13"/>
49
+ <sheetData>
50
+ <row r="1" spans="1:1">
51
+ <c r="A1" t="str">
52
+ <f>IF(A2="Hello","hello",Sheet2!B4)</f>
53
+ <v>hello</v>
54
+ </c>
55
+ </row>
56
+ <row r="2" spans="1:1">
57
+ <c r="A2" t="s">
58
+ <v>0</v>
59
+ </c>
60
+ </row>
61
+ </sheetData>
62
+ <sheetCalcPr fullCalcOnLoad="1"/>
63
+ <phoneticPr fontId="2" type="noConversion"/>
64
+ <pageMargins left="0.75" right="0.75" top="1" bottom="1" header="0.5" footer="0.5"/>
65
+ <pageSetup paperSize="10" orientation="portrait" horizontalDpi="4294967292" verticalDpi="4294967292"/>
66
+ <extLst>
67
+ <ext xmlns:mx="http://schemas.microsoft.com/office/mac/excel/2008/main" uri="http://schemas.microsoft.com/office/mac/excel/2008/main">
68
+ <mx:PLV Mode="1" OnePage="0" WScale="0"/>
69
+ </ext>
70
+ </extLst>
71
+ </worksheet>
72
+ END
73
+
74
+ simple_worksheet_ruby =<<END
75
+ # coding: utf-8
76
+ # First sheet
77
+ class Sheet1 < Spreadsheet
78
+ def a1; @a1 ||= excel_if(a2=="Hello","hello",sheet2.b4); end
79
+ def a2; "Hello"; end
80
+ end
81
+
82
+ END
83
+
84
+ shared_strings_xml =<<END
85
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
86
+ <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="1" uniqueCount="1">
87
+ <si>
88
+ <t>Hello</t>
89
+ <phoneticPr fontId="3" type="noConversion"/>
90
+ </si>
91
+ </sst>
92
+ END
93
+
94
+ workbook_ruby =<<END
95
+ # coding: utf-8
96
+ require 'rubyfromexcel'
97
+
98
+ class Spreadsheet
99
+ include RubyFromExcel::ExcelFunctions
100
+
101
+ def initialize
102
+ @worksheet_names = {"First sheet"=>"sheet1", "Sheet2"=>"sheet2", "Sheet3"=>"sheet3"}
103
+ @workbook_tables = {}
104
+ end
105
+
106
+ def one_and2; sheet2.a('a2','a3'); end
107
+ def reference_2; sheet2.a3; end
108
+ def reference_one; sheet2.a2; end
109
+ end
110
+
111
+ Dir[File.join(File.dirname(__FILE__),"sheets/","sheet*.rb")].each {|f| Spreadsheet.autoload(File.basename(f,".rb").capitalize,f)}
112
+ END
113
+
114
+ workbook_no_indirects_ruby =<<END
115
+ # coding: utf-8
116
+ require 'rubyfromexcel'
117
+
118
+ class Spreadsheet
119
+ include RubyFromExcel::ExcelFunctions
120
+
121
+ end
122
+
123
+ Dir[File.join(File.dirname(__FILE__),"sheets/","sheet*.rb")].each {|f| Spreadsheet.autoload(File.basename(f,".rb").capitalize,f)}
124
+ END
125
+
126
+
127
+ it "should load its relationships, and therefore create the requisite worksheets and shared strings" do
128
+ SharedStrings.instance.clear
129
+ Table.tables.clear
130
+ SheetNames.instance.clear
131
+ {
132
+ '/usr/local/excel/xl/workbook.xml' => workbook_xml,
133
+ '/usr/local/excel/xl/_rels/workbook.xml.rels' => workbook_relationship_xml,
134
+ '/usr/local/excel/xl/worksheets/sheet1.xml' => simple_worksheet_xml,
135
+ '/usr/local/excel/xl/worksheets/sheet2.xml' => simple_worksheet_xml,
136
+ '/usr/local/excel/xl/worksheets/sheet3.xml' => simple_worksheet_xml,
137
+ '/usr/local/excel/xl/sharedStrings.xml' => shared_strings_xml,
138
+ '/usr/local/excel/xl/worksheets/_rels/sheet1.xml.rels' => '',
139
+ '/usr/local/excel/xl/worksheets/_rels/sheet2.xml.rels' => '',
140
+ '/usr/local/excel/xl/worksheets/_rels/sheet3.xml.rels' => ''
141
+ }.each do |filename,xml|
142
+ File.should_receive(:open).with(filename).and_yield(StringIO.new(xml))
143
+ end
144
+ File.stub!(:exist?).and_return(true)
145
+ workbook = Workbook.new('/usr/local/excel/xl/workbook.xml')
146
+ workbook.worksheets['sheet1'].to_ruby.should == simple_worksheet_ruby
147
+ SheetNames.instance['First sheet'].should == 'sheet1'
148
+ workbook.to_ruby.should == workbook_no_indirects_ruby
149
+ workbook.indirects_used = true
150
+ workbook.to_ruby.should == workbook_ruby
151
+ end
152
+
153
+ end
154
+
155
+ describe Worksheet, "in pruning mode" do
156
+ pruning_workbook_xml =<<END
157
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
158
+ <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><fileVersion appName="xl" lastEdited="4" lowestEdited="4" rupBuild="4505"/><workbookPr date1904="1" showInkAnnotation="0" autoCompressPictures="0"/><bookViews><workbookView xWindow="-20" yWindow="-20" windowWidth="20760" windowHeight="14600" tabRatio="500"/></bookViews><sheets><sheet name="Outputs" sheetId="1" r:id="rId1"/><sheet name="Calcs" sheetId="2" r:id="rId2"/><sheet name="Inputs" sheetId="3" r:id="rId3"/></sheets><definedNames><definedName name="In_result">Inputs!$A$3</definedName></definedNames><calcPr calcId="130407" concurrentCalc="0"/><extLst><ext xmlns:mx="http://schemas.microsoft.com/office/mac/excel/2008/main" uri="http://schemas.microsoft.com/office/mac/excel/2008/main"><mx:ArchID Flags="2"/></ext></extLst></workbook>
159
+ END
160
+
161
+ pruning_workbook_relationships_xml =<<END
162
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
163
+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet3.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/><Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/><Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/><Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain" Target="calcChain.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet2.xml"/></Relationships>
164
+ END
165
+
166
+ pruning_shared_strings_xml =<<END
167
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
168
+ <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="7" uniqueCount="6"><si><t>Result</t><phoneticPr fontId="1" type="noConversion"/></si><si><t>Input</t><phoneticPr fontId="1" type="noConversion"/></si><si><t>Not in result</t><phoneticPr fontId="1" type="noConversion"/></si><si><t>In result</t><phoneticPr fontId="1" type="noConversion"/></si><si><t>Inputs</t><phoneticPr fontId="1" type="noConversion"/></si><si><t>Doesn't depend on an input</t><phoneticPr fontId="1" type="noConversion"/></si></sst>
169
+ END
170
+
171
+ pruning_output_sheet_xml =<<END
172
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
173
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" mc:Ignorable="mv" mc:PreserveAttributes="mv:*"><dimension ref="A1:B4"/><sheetViews><sheetView tabSelected="1" workbookViewId="0"><selection activeCell="B5" sqref="B5"/></sheetView></sheetViews><sheetFormatPr baseColWidth="10" defaultRowHeight="13"/><sheetData><row r="1" spans="1:2"><c r="A1" t="s"><v>0</v></c><c r="B1"><f>Calcs!A1</f><v>121</v></c></row><row r="2" spans="1:2"><c r="A2" t="s"><v>1</v></c><c r="B2"><f>Inputs!A1</f><v>99</v></c></row><row r="3" spans="1:2"><c r="B3" t="str"><f ca="1">Calcs!C9</f><v>In result</v></c></row><row r="4" spans="1:2"><c r="B4" t="str"><f>Calcs!C13</f><v>Doesn't depend on an input</v></c></row></sheetData><sheetCalcPr fullCalcOnLoad="1"/><phoneticPr fontId="1" type="noConversion"/><pageMargins left="0.75" right="0.75" top="1" bottom="1" header="0.5" footer="0.5"/><extLst><ext xmlns:mx="http://schemas.microsoft.com/office/mac/excel/2008/main" uri="http://schemas.microsoft.com/office/mac/excel/2008/main"><mx:PLV Mode="0" OnePage="0" WScale="0"/></ext></extLst></worksheet>
174
+ END
175
+
176
+ pruning_calc_sheet_xml =<<END
177
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
178
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" mc:Ignorable="mv" mc:PreserveAttributes="mv:*"><dimension ref="A1:D13"/><sheetViews><sheetView view="pageLayout" workbookViewId="0"><selection activeCell="C14" sqref="C14"/></sheetView></sheetViews><sheetFormatPr baseColWidth="10" defaultRowHeight="13"/><sheetData><row r="1" spans="1:4"><c r="A1"><f>SUM(A2:A7)</f><v>121</v></c></row><row r="2" spans="1:4"><c r="A2"><v>1</v></c><c r="C2" t="s"><v>2</v></c></row><row r="3" spans="1:4"><c r="A3"><v>2</v></c><c r="C3"><f>Inputs!A1*10</f><v>990</v></c></row><row r="4" spans="1:4"><c r="A4"><f>Inputs!A1</f><v>99</v></c></row><row r="5" spans="1:4"><c r="A5"><v>4</v></c></row><row r="6" spans="1:4"><c r="A6"><f>C6</f><v>10</v></c><c r="C6"><v>10</v></c></row><row r="7" spans="1:4"><c r="A7"><v>5</v></c></row><row r="8" spans="1:4"><c r="C8" t="s"><v>4</v></c></row><row r="9" spans="1:4"><c r="C9" t="str"><f ca="1">INDIRECT("'"&amp;C8&amp;"'!In_result")</f><v>In result</v></c></row><row r="10" spans="1:4"><c r="C10" t="str"><f ca="1">INDIRECT("'"&amp;C8&amp;"'!A2")</f><v>Not in result</v></c></row><row r="13" spans="1:4"><c r="C13" t="str"><f>D13</f><v>Doesn't depend on an input</v></c><c r="D13" t="s"><v>5</v></c></row></sheetData><sheetCalcPr fullCalcOnLoad="1"/><phoneticPr fontId="1" type="noConversion"/><pageMargins left="0.75" right="0.75" top="1" bottom="1" header="0.5" footer="0.5"/><pageSetup paperSize="10" orientation="portrait" horizontalDpi="4294967292" verticalDpi="4294967292"/><extLst><ext xmlns:mx="http://schemas.microsoft.com/office/mac/excel/2008/main" uri="http://schemas.microsoft.com/office/mac/excel/2008/main"><mx:PLV Mode="1" OnePage="0" WScale="0"/></ext></extLst></worksheet>
179
+ END
180
+
181
+ pruning_input_sheet_xml =<<END
182
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
183
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" mc:Ignorable="mv" mc:PreserveAttributes="mv:*"><dimension ref="A1:A3"/><sheetViews><sheetView view="pageLayout" workbookViewId="0"><selection activeCell="A3" sqref="A3"/></sheetView></sheetViews><sheetFormatPr baseColWidth="10" defaultRowHeight="13"/><sheetData><row r="1" spans="1:1"><c r="A1"><v>99</v></c></row><row r="2" spans="1:1"><c r="A2" t="s"><v>2</v></c></row><row r="3" spans="1:1"><c r="A3" t="s"><v>3</v></c></row></sheetData><sheetCalcPr fullCalcOnLoad="1"/><phoneticPr fontId="1" type="noConversion"/><pageMargins left="0.75" right="0.75" top="1" bottom="1" header="0.5" footer="0.5"/><pageSetup paperSize="10" orientation="portrait" horizontalDpi="4294967292" verticalDpi="4294967292"/><extLst><ext xmlns:mx="http://schemas.microsoft.com/office/mac/excel/2008/main" uri="http://schemas.microsoft.com/office/mac/excel/2008/main"><mx:PLV Mode="1" OnePage="0" WScale="0"/></ext></extLst></worksheet>
184
+ END
185
+
186
+ pruning_calc_sheet_ruby_no_prune =<<END
187
+ # coding: utf-8
188
+ # Calcs
189
+ class Sheet2 < Spreadsheet
190
+ def a1; @a1 ||= sum(a('a2','a7')); end
191
+ def a2; 1.0; end
192
+ def c2; "Not in result"; end
193
+ def a3; 2.0; end
194
+ def c3; @c3 ||= sheet3.a1*10.0; end
195
+ def a4; @a4 ||= sheet3.a1; end
196
+ def a5; 4.0; end
197
+ def a6; @a6 ||= c6; end
198
+ def c6; 10.0; end
199
+ def a7; 5.0; end
200
+ def c8; "Inputs"; end
201
+ def c9; @c9 ||= sheet3.a3; end
202
+ def c10; @c10 ||= sheet3.a2; end
203
+ def c13; @c13 ||= d13; end
204
+ def d13; "Doesn't depend on an input"; end
205
+ end
206
+
207
+ END
208
+
209
+ pruning_calc_sheet_ruby_output_prune =<<END
210
+ # coding: utf-8
211
+ # Calcs
212
+ class Sheet2 < Spreadsheet
213
+ def a1; @a1 ||= sum(a('a2','a7')); end
214
+ def a2; 1.0; end
215
+ def a3; 2.0; end
216
+ def a4; @a4 ||= sheet3.a1; end
217
+ def a5; 4.0; end
218
+ def a6; @a6 ||= c6; end
219
+ def c6; 10.0; end
220
+ def a7; 5.0; end
221
+ def c8; "Inputs"; end
222
+ def c9; @c9 ||= sheet3.a3; end
223
+ def c13; @c13 ||= d13; end
224
+ def d13; "Doesn't depend on an input"; end
225
+ end
226
+
227
+ END
228
+
229
+ pruning_calc_sheet_ruby_input_and_output_prune =<<END
230
+ # coding: utf-8
231
+ # Calcs
232
+ class Sheet2 < Spreadsheet
233
+ def a1; @a1 ||= sum(a('a2','a7')); end
234
+ def a2; 1.0; end
235
+ def a3; 2.0; end
236
+ def a4; @a4 ||= sheet3.a1; end
237
+ def a5; 4.0; end
238
+ def a6; 10.0; end
239
+ def a7; 5.0; end
240
+ def c8; "Inputs"; end
241
+ def c9; @c9 ||= sheet3.a3; end
242
+ end
243
+
244
+ END
245
+
246
+ before do
247
+ SharedStrings.instance.clear
248
+ Table.tables.clear
249
+ SheetNames.instance.clear
250
+ {
251
+ '/usr/local/excel/xl/workbook.xml' => pruning_workbook_xml,
252
+ '/usr/local/excel/xl/_rels/workbook.xml.rels' => pruning_workbook_relationships_xml,
253
+ '/usr/local/excel/xl/worksheets/sheet1.xml' => pruning_output_sheet_xml,
254
+ '/usr/local/excel/xl/worksheets/sheet2.xml' => pruning_calc_sheet_xml,
255
+ '/usr/local/excel/xl/worksheets/sheet3.xml' => pruning_input_sheet_xml,
256
+ '/usr/local/excel/xl/sharedStrings.xml' => pruning_shared_strings_xml,
257
+ '/usr/local/excel/xl/worksheets/_rels/sheet1.xml.rels' => '',
258
+ '/usr/local/excel/xl/worksheets/_rels/sheet2.xml.rels' => '',
259
+ '/usr/local/excel/xl/worksheets/_rels/sheet3.xml.rels' => ''
260
+ }.each do |filename,xml|
261
+ File.should_receive(:open).with(filename).and_yield(StringIO.new(xml))
262
+ end
263
+ File.stub!(:exist?).and_return(true)
264
+ @workbook = Workbook.new('/usr/local/excel/xl/workbook.xml')
265
+ end
266
+
267
+ it "should work normally when no output sheets are identified" do
268
+ @workbook.total_cells.should == 24
269
+ @workbook.worksheets['sheet2'].to_ruby.should == pruning_calc_sheet_ruby_no_prune
270
+ end
271
+
272
+ it "should prune any cells that aren't needed for the output sheet calculations when output sheets have been specified" do
273
+ @workbook.prune_cells_not_needed_for_output_sheets('Outputs')
274
+ @workbook.worksheets['sheet2'].to_ruby.should == pruning_calc_sheet_ruby_output_prune
275
+ end
276
+
277
+ it "should convert cells to values where they don't depend on inputs, and then prune" do
278
+ @workbook.prune_cells_not_needed_for_output_sheets('Outputs')
279
+ @workbook.convert_cells_to_values_when_independent_of_input_sheets('Inputs')
280
+ @workbook.worksheets['sheet2'].to_ruby.should == pruning_calc_sheet_ruby_input_and_output_prune
281
+ end
282
+
283
+ end
@@ -0,0 +1,41 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe "Worksheets that failed to compile" do
4
+ worksheet_1_xml =<<END
5
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
6
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
7
+ <sheetData>
8
+ <row r="9">
9
+ <c r="R9">
10
+ <f t="shared" ref="R9:R68" si="0">I9+J9+K9+P9+Q9</f>
11
+ <v>582.62431955664806</v>
12
+ </c>
13
+ </row>
14
+ <row r="10">
15
+ <c r="R10">
16
+ <f t="shared" si="0"/>
17
+ <v>436.4944796177661</v>
18
+ </c>
19
+ </row>
20
+ </sheetData>
21
+ </worksheet>
22
+ END
23
+
24
+ worksheet_1_ruby =<<END
25
+ # coding: utf-8
26
+ #
27
+ class Sheet1 < Spreadsheet
28
+ def r9; @r9 ||= i9+j9+k9+p9+q9; end
29
+ def r10; @r10 ||= i10+j10+k10+p10+q10; end
30
+ end
31
+
32
+ END
33
+ it "2050 failed sheet should compile" do
34
+ SheetNames.instance['Sheet2'] = 'sheet2'
35
+ # SharedStrings.instance[24] = 'A shared string'
36
+ worksheet = Worksheet.new(Nokogiri::XML(worksheet_1_xml))
37
+ worksheet.workbook = mock(:workbook,:indirects_used => true)
38
+ worksheet.name = "sheet1"
39
+ worksheet.to_ruby.should == worksheet_1_ruby
40
+ end
41
+ end