axlsx 1.2.0 → 2.0.0

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.
Files changed (208) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +3 -2
  3. data/.yardopts_guide +19 -0
  4. data/CHANGELOG.md +64 -1
  5. data/README.md +105 -87
  6. data/Rakefile +0 -5
  7. data/examples/2010_comments.rb +17 -0
  8. data/examples/anchor_swapping.rb +28 -0
  9. data/examples/auto_filter.rb +16 -0
  10. data/examples/basic_charts.rb +4 -0
  11. data/examples/colored_links.rb +59 -0
  12. data/examples/conditional_formatting/example_conditional_formatting.rb +4 -2
  13. data/examples/example.rb +569 -258
  14. data/examples/ios_preview.rb +14 -0
  15. data/examples/page_setup.rb +11 -0
  16. data/examples/pivot_table.rb +39 -0
  17. data/examples/skydrive/real_example.rb +8 -8
  18. data/examples/styles.rb +66 -0
  19. data/examples/underline.rb +13 -0
  20. data/examples/wrap_text.rb +21 -0
  21. data/lib/axlsx/content_type/abstract_content_type.rb +32 -0
  22. data/lib/axlsx/content_type/content_type.rb +1 -1
  23. data/lib/axlsx/content_type/default.rb +6 -37
  24. data/lib/axlsx/content_type/override.rb +6 -38
  25. data/lib/axlsx/doc_props/app.rb +10 -7
  26. data/lib/axlsx/doc_props/core.rb +6 -1
  27. data/lib/axlsx/drawing/axes.rb +61 -0
  28. data/lib/axlsx/drawing/axis.rb +20 -17
  29. data/lib/axlsx/drawing/bar_3D_chart.rb +31 -22
  30. data/lib/axlsx/drawing/cat_axis.rb +2 -10
  31. data/lib/axlsx/drawing/chart.rb +33 -6
  32. data/lib/axlsx/drawing/d_lbls.rb +21 -31
  33. data/lib/axlsx/drawing/drawing.rb +11 -17
  34. data/lib/axlsx/drawing/graphic_frame.rb +3 -3
  35. data/lib/axlsx/drawing/hyperlink.rb +42 -36
  36. data/lib/axlsx/drawing/line_3D_chart.rb +28 -70
  37. data/lib/axlsx/drawing/line_chart.rb +99 -0
  38. data/lib/axlsx/drawing/line_series.rb +20 -2
  39. data/lib/axlsx/drawing/marker.rb +38 -18
  40. data/lib/axlsx/drawing/num_data.rb +6 -6
  41. data/lib/axlsx/drawing/num_data_source.rb +17 -16
  42. data/lib/axlsx/drawing/one_cell_anchor.rb +28 -21
  43. data/lib/axlsx/drawing/pic.rb +43 -45
  44. data/lib/axlsx/drawing/picture_locking.rb +12 -44
  45. data/lib/axlsx/drawing/pie_3D_chart.rb +2 -1
  46. data/lib/axlsx/drawing/scaling.rb +13 -13
  47. data/lib/axlsx/drawing/scatter_chart.rb +32 -21
  48. data/lib/axlsx/drawing/ser_axis.rb +15 -16
  49. data/lib/axlsx/drawing/series.rb +3 -6
  50. data/lib/axlsx/drawing/str_data.rb +3 -3
  51. data/lib/axlsx/drawing/str_val.rb +7 -8
  52. data/lib/axlsx/drawing/two_cell_anchor.rb +7 -27
  53. data/lib/axlsx/drawing/val_axis.rb +14 -13
  54. data/lib/axlsx/drawing/view_3D.rb +52 -38
  55. data/lib/axlsx/drawing/vml_shape.rb +20 -79
  56. data/lib/axlsx/package.rb +58 -28
  57. data/lib/axlsx/rels/relationship.rb +75 -9
  58. data/lib/axlsx/rels/relationships.rb +8 -1
  59. data/lib/axlsx/stylesheet/border.rb +29 -20
  60. data/lib/axlsx/stylesheet/border_pr.rb +5 -4
  61. data/lib/axlsx/stylesheet/cell_alignment.rb +55 -29
  62. data/lib/axlsx/stylesheet/cell_protection.rb +7 -4
  63. data/lib/axlsx/stylesheet/cell_style.rb +19 -14
  64. data/lib/axlsx/stylesheet/color.rb +20 -17
  65. data/lib/axlsx/stylesheet/dxf.rb +4 -4
  66. data/lib/axlsx/stylesheet/font.rb +22 -22
  67. data/lib/axlsx/stylesheet/gradient_fill.rb +45 -21
  68. data/lib/axlsx/stylesheet/num_fmt.rb +23 -14
  69. data/lib/axlsx/stylesheet/pattern_fill.rb +12 -21
  70. data/lib/axlsx/stylesheet/styles.rb +37 -22
  71. data/lib/axlsx/stylesheet/table_style.rb +17 -16
  72. data/lib/axlsx/stylesheet/table_style_element.rb +15 -11
  73. data/lib/axlsx/stylesheet/table_styles.rb +14 -11
  74. data/lib/axlsx/stylesheet/xf.rb +28 -26
  75. data/lib/axlsx/util/accessors.rb +64 -0
  76. data/lib/axlsx/util/constants.rb +127 -6
  77. data/lib/axlsx/util/options_parser.rb +15 -0
  78. data/lib/axlsx/util/serialized_attributes.rb +79 -0
  79. data/lib/axlsx/util/simple_typed_list.rb +50 -15
  80. data/lib/axlsx/util/validators.rb +51 -16
  81. data/lib/axlsx/version.rb +2 -2
  82. data/lib/axlsx/workbook/defined_name.rb +14 -59
  83. data/lib/axlsx/workbook/shared_strings_table.rb +13 -4
  84. data/lib/axlsx/workbook/workbook.rb +85 -6
  85. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -0
  86. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -0
  87. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +246 -0
  88. data/lib/axlsx/workbook/worksheet/break.rb +37 -0
  89. data/lib/axlsx/workbook/worksheet/cell.rb +109 -107
  90. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +144 -0
  91. data/lib/axlsx/workbook/worksheet/cfvo.rb +15 -15
  92. data/lib/axlsx/workbook/worksheet/cfvos.rb +15 -0
  93. data/lib/axlsx/workbook/worksheet/col.rb +43 -29
  94. data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -0
  95. data/lib/axlsx/workbook/worksheet/color_scale.rb +62 -28
  96. data/lib/axlsx/workbook/worksheet/comment.rb +28 -37
  97. data/lib/axlsx/workbook/worksheet/comments.rb +3 -3
  98. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +11 -11
  99. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +31 -27
  100. data/lib/axlsx/workbook/worksheet/data_bar.rb +75 -41
  101. data/lib/axlsx/workbook/worksheet/data_validation.rb +61 -62
  102. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +6 -5
  103. data/lib/axlsx/workbook/worksheet/dimension.rb +0 -1
  104. data/lib/axlsx/workbook/worksheet/header_footer.rb +54 -0
  105. data/lib/axlsx/workbook/worksheet/icon_set.rb +20 -20
  106. data/lib/axlsx/workbook/worksheet/page_margins.rb +21 -19
  107. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -0
  108. data/lib/axlsx/workbook/worksheet/page_setup.rb +152 -23
  109. data/lib/axlsx/workbook/worksheet/pane.rb +48 -51
  110. data/lib/axlsx/workbook/worksheet/pivot_table.rb +273 -0
  111. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +66 -0
  112. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -0
  113. data/lib/axlsx/workbook/worksheet/print_options.rb +8 -30
  114. data/lib/axlsx/workbook/worksheet/protected_range.rb +16 -13
  115. data/lib/axlsx/workbook/worksheet/row.rb +59 -83
  116. data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -0
  117. data/lib/axlsx/workbook/worksheet/selection.rb +30 -38
  118. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -0
  119. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +60 -0
  120. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +49 -4
  121. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +51 -155
  122. data/lib/axlsx/workbook/worksheet/sheet_view.rb +68 -234
  123. data/lib/axlsx/workbook/worksheet/table.rb +25 -19
  124. data/lib/axlsx/workbook/worksheet/table_style_info.rb +51 -0
  125. data/lib/axlsx/workbook/worksheet/tables.rb +1 -1
  126. data/lib/axlsx/workbook/worksheet/worksheet.rb +174 -35
  127. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +6 -5
  128. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +4 -10
  129. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -0
  130. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -0
  131. data/lib/axlsx.rb +55 -5
  132. data/lib/schema/sml.xsd +4 -0
  133. data/test/axlsx.qcachegrind +2226 -0
  134. data/test/benchmark.rb +2 -3
  135. data/test/content_type/tc_default.rb +0 -11
  136. data/test/content_type/tc_override.rb +0 -13
  137. data/test/doc_props/tc_core.rb +7 -0
  138. data/test/drawing/tc_axes.rb +8 -0
  139. data/test/drawing/tc_axis.rb +15 -17
  140. data/test/drawing/tc_bar_3D_chart.rb +6 -0
  141. data/test/drawing/tc_cat_axis.rb +9 -9
  142. data/test/drawing/tc_chart.rb +20 -0
  143. data/test/drawing/tc_d_lbls.rb +14 -4
  144. data/test/drawing/tc_drawing.rb +0 -5
  145. data/test/drawing/tc_graphic_frame.rb +5 -3
  146. data/test/drawing/tc_hyperlink.rb +0 -4
  147. data/test/drawing/tc_line_chart.rb +39 -0
  148. data/test/drawing/tc_line_series.rb +8 -2
  149. data/test/drawing/tc_pic.rb +14 -3
  150. data/test/drawing/tc_ser_axis.rb +13 -12
  151. data/test/drawing/tc_two_cell_anchor.rb +3 -3
  152. data/test/drawing/tc_val_axis.rb +6 -6
  153. data/test/drawing/tc_vml_shape.rb +9 -3
  154. data/test/profile.rb +11 -21
  155. data/test/rels/tc_relationship.rb +32 -9
  156. data/test/rels/tc_relationships.rb +12 -1
  157. data/test/stylesheet/tc_color.rb +6 -0
  158. data/test/stylesheet/tc_styles.rb +15 -2
  159. data/test/tc_axlsx.rb +35 -2
  160. data/test/tc_helper.rb +7 -1
  161. data/test/tc_package.rb +44 -5
  162. data/test/util/tc_serialized_attributes.rb +19 -0
  163. data/test/util/tc_validators.rb +26 -1
  164. data/test/workbook/tc_defined_name.rb +2 -2
  165. data/test/workbook/tc_shared_strings_table.rb +6 -0
  166. data/test/workbook/tc_workbook.rb +38 -1
  167. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +38 -0
  168. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +76 -0
  169. data/test/workbook/worksheet/auto_filter/tc_filters.rb +50 -0
  170. data/test/workbook/worksheet/tc_break.rb +49 -0
  171. data/test/workbook/worksheet/tc_cell.rb +40 -6
  172. data/test/workbook/worksheet/tc_col.rb +11 -1
  173. data/test/workbook/worksheet/tc_color_scale.rb +31 -2
  174. data/test/workbook/worksheet/tc_comment.rb +21 -6
  175. data/test/workbook/worksheet/tc_comments.rb +2 -2
  176. data/test/workbook/worksheet/tc_conditional_formatting.rb +7 -0
  177. data/test/workbook/worksheet/tc_data_bar.rb +7 -0
  178. data/test/workbook/worksheet/tc_date_time_converter.rb +3 -11
  179. data/test/workbook/worksheet/tc_header_footer.rb +151 -0
  180. data/test/workbook/worksheet/tc_page_set_up_pr.rb +15 -0
  181. data/test/workbook/worksheet/tc_page_setup.rb +6 -1
  182. data/test/workbook/worksheet/tc_pane.rb +5 -45
  183. data/test/workbook/worksheet/tc_pivot_table.rb +120 -0
  184. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +54 -0
  185. data/test/workbook/worksheet/tc_row.rb +4 -4
  186. data/test/workbook/worksheet/tc_selection.rb +9 -48
  187. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +18 -0
  188. data/test/workbook/worksheet/tc_sheet_format_pr.rb +88 -0
  189. data/test/workbook/worksheet/tc_sheet_pr.rb +27 -0
  190. data/test/workbook/worksheet/tc_sheet_view.rb +39 -39
  191. data/test/workbook/worksheet/{table/tc_table.rb → tc_table.rb} +8 -3
  192. data/test/workbook/worksheet/tc_table_style_info.rb +53 -0
  193. data/test/workbook/worksheet/tc_worksheet.rb +131 -16
  194. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +55 -0
  195. metadata +97 -64
  196. data/examples/example.xlsx +0 -0
  197. data/examples/example_streamed.xlsx +0 -0
  198. data/examples/extractive.pdf +0 -0
  199. data/examples/image1.gif +0 -0
  200. data/examples/image1.jpg +0 -0
  201. data/examples/image1.png +0 -0
  202. data/examples/no-use_autowidth.xlsx +0 -0
  203. data/examples/sample.png +0 -0
  204. data/examples/scraping_html.rb +0 -91
  205. data/examples/shared_strings_example.xlsx +0 -0
  206. data/examples/sheet_view.rb +0 -34
  207. data/examples/two_cell_anchor_image.rb +0 -11
  208. data/lib/axlsx/workbook/worksheet/auto_filter.rb +0 -34
data/test/benchmark.rb CHANGED
@@ -1,14 +1,13 @@
1
1
  #!/usr/bin/env ruby -s
2
- # -*- coding: utf-8 -*-
3
2
  $:.unshift "#{File.dirname(__FILE__)}/../lib"
4
3
  require 'axlsx'
5
4
  require 'csv'
6
5
  require 'benchmark'
7
-
6
+ Axlsx::trust_input = true
8
7
  row = []
9
8
  input = (32..126).to_a.pack('U*').chars.to_a
10
9
  20.times { row << input.shuffle.join}
11
- times = 2000
10
+ times = 3000
12
11
  Benchmark.bmbm(30) do |x|
13
12
 
14
13
  x.report('axlsx_noautowidth') {
@@ -3,14 +3,6 @@ require 'tc_helper.rb'
3
3
 
4
4
  class TestDefault < Test::Unit::TestCase
5
5
 
6
- def test_initialization_requires_Extension_and_ContentType
7
- assert_raise(ArgumentError, "raises argument error if Extension and/or ContentType are not specified") { Axlsx::Default.new }
8
- assert_raise(ArgumentError, "raises argument error if Extension and/or ContentType are not specified") { Axlsx::Default.new :Extension=>"xml" }
9
- assert_raise(ArgumentError, "raises argument error if Extension and/or ContentType are not specified") { Axlsx::Default.new :ContentType=>"asdf" }
10
-
11
- assert_nothing_raised {Axlsx::Default.new :Extension=>"foo", :ContentType=>Axlsx::XML_CT}
12
-
13
- end
14
6
  def test_content_type_restriction
15
7
  assert_raise(ArgumentError, "raises argument error if invlalid ContentType is") { Axlsx::Default.new :ContentType=>"asdf" }
16
8
  end
@@ -20,8 +12,5 @@ class TestDefault < Test::Unit::TestCase
20
12
  doc = Nokogiri::XML(type.to_xml_string)
21
13
  assert_equal(doc.xpath("Default[@ContentType='#{Axlsx::XML_CT}']").size, 1)
22
14
  assert_equal(doc.xpath("Default[@Extension='xml']").size, 1)
23
-
24
15
  end
25
-
26
-
27
16
  end
@@ -1,16 +1,6 @@
1
- # -*- coding: utf-8 -*-
2
1
  require 'tc_helper.rb'
3
-
4
2
  class TestOverride < Test::Unit::TestCase
5
3
 
6
- def test_initialization_requires_Extension_and_ContentType
7
- err = "requires PartName and ContentType options"
8
- assert_raise(ArgumentError, err) { Axlsx::Override.new }
9
- assert_raise(ArgumentError, err) { Axlsx::Override.new :PartName=>"xml" }
10
- assert_raise(ArgumentError, err) { Axlsx::Override.new :ContentType=>"asdf" }
11
- assert_nothing_raised {Axlsx::Override.new :PartName=>"foo", :ContentType=>Axlsx::CHART_CT}
12
- end
13
-
14
4
  def test_content_type_restriction
15
5
  assert_raise(ArgumentError, "requires known content type") { Axlsx::Override.new :ContentType=>"asdf" }
16
6
  end
@@ -20,8 +10,5 @@ class TestOverride < Test::Unit::TestCase
20
10
  doc = Nokogiri::XML(type.to_xml_string)
21
11
  assert_equal(doc.xpath("Override[@ContentType='#{Axlsx::CHART_CT}']").size, 1)
22
12
  assert_equal(doc.xpath("Override[@PartName='somechart.xml']").size, 1)
23
-
24
13
  end
25
-
26
-
27
14
  end
@@ -23,6 +23,13 @@ class TestCore < Test::Unit::TestCase
23
23
  assert_equal(@doc.xpath('//dcterms:created').text, @time, "dcterms:created incorrect")
24
24
  end
25
25
 
26
+ def test_created_as_option
27
+ time = Time.utc(2013, 1, 1, 12, 00)
28
+ c = Axlsx::Core.new :created => time
29
+ doc = Nokogiri::XML(c.to_xml_string)
30
+ assert_equal(doc.xpath('//dcterms:created').text, time.xmlschema, "dcterms:created incorrect")
31
+ end
32
+
26
33
  def test_populates_default_name
27
34
  assert_equal(@doc.xpath('//dc:creator').text, "axlsx", "Default name not populated")
28
35
  end
@@ -0,0 +1,8 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestAxes < Test::Unit::TestCase
4
+ def test_constructor_requires_cat_axis_first
5
+ assert_raise(ArgumentError) { Axlsx::Axes.new(:val_axis => Axlsx::ValAxis, :cat_axis => Axlsx::CatAxis) }
6
+ assert_nothing_raised { Axlsx::Axes.new(:cat_axis => Axlsx::CatAxis, :val_axis => Axlsx::ValAxis) }
7
+ end
8
+ end
@@ -2,25 +2,22 @@ require 'tc_helper.rb'
2
2
 
3
3
  class TestAxis < Test::Unit::TestCase
4
4
  def setup
5
-
6
- @axis = Axlsx::Axis.new 12345, 54321, :gridlines => false, :title => 'Foo'
5
+ @axis = Axlsx::Axis.new :gridlines => false, :title => 'Foo'
7
6
  end
8
7
 
9
- def teardown
10
- end
11
8
 
12
9
  def test_initialization
13
- assert_equal(@axis.axPos, :b, "axis position default incorrect")
14
- assert_equal(@axis.tickLblPos, :nextTo, "tick label position default incorrect")
15
- assert_equal(@axis.tickLblPos, :nextTo, "tick label position default incorrect")
10
+ assert_equal(@axis.ax_pos, :b, "axis position default incorrect")
11
+ assert_equal(@axis.tick_lbl_pos, :nextTo, "tick label position default incorrect")
12
+ assert_equal(@axis.tick_lbl_pos, :nextTo, "tick label position default incorrect")
16
13
  assert_equal(@axis.crosses, :autoZero, "tick label position default incorrect")
17
14
  assert(@axis.scaling.is_a?(Axlsx::Scaling) && @axis.scaling.orientation == :minMax, "scaling default incorrect")
18
- assert_raise(ArgumentError) { Axlsx::Axis.new( -1234, 'abcd') }
19
15
  assert_equal('Foo', @axis.title.text)
20
16
  end
21
17
 
22
18
  def test_color
23
19
  @axis.color = "00FF00"
20
+ @axis.cross_axis = Axlsx::CatAxis.new
24
21
  str = '<?xml version="1.0" encoding="UTF-8"?>'
25
22
  str << '<c:chartSpace xmlns:c="' << Axlsx::XML_NS_C << '" xmlns:a="' << Axlsx::XML_NS_A << '">'
26
23
  doc = Nokogiri::XML(@axis.to_xml_string(str))
@@ -35,15 +32,15 @@ class TestAxis < Test::Unit::TestCase
35
32
  sheet.add_row ['cat', 7, 9, 10]
36
33
  sheet.add_chart(Axlsx::Line3DChart) do |chart|
37
34
  chart.add_series :data => sheet['B2:D2'], :labels => sheet['B1']
38
- chart.valAxis.title = sheet['A1']
39
- assert_equal('battle victories', chart.valAxis.title.text)
35
+ chart.val_axis.title = sheet['A1']
36
+ assert_equal('battle victories', chart.val_axis.title.text)
40
37
  end
41
38
  end
42
39
  end
43
40
 
44
41
  def test_axis_position
45
- assert_raise(ArgumentError, "requires valid axis position") { @axis.axPos = :nowhere }
46
- assert_nothing_raised("accepts valid axis position") { @axis.axPos = :r }
42
+ assert_raise(ArgumentError, "requires valid axis position") { @axis.ax_pos = :nowhere }
43
+ assert_nothing_raised("accepts valid axis position") { @axis.ax_pos = :r }
47
44
  end
48
45
 
49
46
  def test_label_rotation
@@ -55,13 +52,13 @@ class TestAxis < Test::Unit::TestCase
55
52
  end
56
53
 
57
54
  def test_tick_label_position
58
- assert_raise(ArgumentError, "requires valid tick label position") { @axis.tickLblPos = :nowhere }
59
- assert_nothing_raised("accepts valid tick label position") { @axis.tickLblPos = :high }
55
+ assert_raise(ArgumentError, "requires valid tick label position") { @axis.tick_lbl_pos = :nowhere }
56
+ assert_nothing_raised("accepts valid tick label position") { @axis.tick_lbl_pos = :high }
60
57
  end
61
58
 
62
59
  def test_format_code
63
- assert_raise(ArgumentError, "requires valid format code") { @axis.format_code = 1 }
64
- assert_nothing_raised("accepts valid format code") { @axis.tickLblPos = :high }
60
+ assert_raise(ArgumentError, "requires valid format code") { @axis.format_code = :high }
61
+ assert_nothing_raised("accepts valid format code") { @axis.format_code = "00.##" }
65
62
  end
66
63
 
67
64
  def test_crosses
@@ -75,12 +72,13 @@ class TestAxis < Test::Unit::TestCase
75
72
  end
76
73
 
77
74
  def test_to_xml_string
75
+ @axis.cross_axis = Axlsx::CatAxis.new
78
76
  str = '<?xml version="1.0" encoding="UTF-8"?>'
79
77
  str << '<c:chartSpace xmlns:c="' << Axlsx::XML_NS_C << '" xmlns:a="' << Axlsx::XML_NS_A << '">'
80
78
  doc = Nokogiri::XML(@axis.to_xml_string(str))
81
79
  assert(doc.xpath('//a:noFill'))
82
80
  assert(doc.xpath("//c:crosses[@val='#{@axis.crosses.to_s}']"))
83
- assert(doc.xpath("//c:crossAx[@val='#{@axis.crossAx.to_s}']"))
81
+ assert(doc.xpath("//c:crossAx[@val='#{@axis.cross_axis.to_s}']"))
84
82
  assert(doc.xpath("//a:bodyPr[@rot='#{@axis.label_rotation.to_s}']"))
85
83
  assert(doc.xpath("//a:t[text()='Foo']"))
86
84
  end
@@ -62,4 +62,10 @@ class TestBar3DChart < Test::Unit::TestCase
62
62
  assert(errors.empty?, "error free validation")
63
63
  end
64
64
 
65
+ def test_to_xml_string_has_axes_in_correct_order
66
+ str = @chart.to_xml_string
67
+ cat_axis_position = str.index(@chart.axes[:cat_axis].id.to_s)
68
+ val_axis_position = str.index(@chart.axes[:val_axis].id.to_s)
69
+ assert(cat_axis_position < val_axis_position, "cat_axis must occur earlier than val_axis in the XML")
70
+ end
65
71
  end
@@ -2,15 +2,15 @@ require 'tc_helper.rb'
2
2
 
3
3
  class TestCatAxis < Test::Unit::TestCase
4
4
  def setup
5
- @axis = Axlsx::CatAxis.new 12345, 54321
5
+ @axis = Axlsx::CatAxis.new
6
6
  end
7
7
  def teardown
8
8
  end
9
9
 
10
10
  def test_initialization
11
11
  assert_equal(@axis.auto, 1, "axis auto default incorrect")
12
- assert_equal(@axis.lblAlgn, :ctr, "label align default incorrect")
13
- assert_equal(@axis.lblOffset, "100", "label offset default incorrect")
12
+ assert_equal(@axis.lbl_algn, :ctr, "label align default incorrect")
13
+ assert_equal(@axis.lbl_offset, "100", "label offset default incorrect")
14
14
  end
15
15
 
16
16
  def test_auto
@@ -18,14 +18,14 @@ class TestCatAxis < Test::Unit::TestCase
18
18
  assert_nothing_raised("accepts valid auto") { @axis.auto = false }
19
19
  end
20
20
 
21
- def test_lblAlgn
22
- assert_raise(ArgumentError, "requires valid label alignment") { @axis.lblAlgn = :nowhere }
23
- assert_nothing_raised("accepts valid label alignment") { @axis.lblAlgn = :r }
21
+ def test_lbl_algn
22
+ assert_raise(ArgumentError, "requires valid label alignment") { @axis.lbl_algn = :nowhere }
23
+ assert_nothing_raised("accepts valid label alignment") { @axis.lbl_algn = :r }
24
24
  end
25
25
 
26
- def test_lblOffset
27
- assert_raise(ArgumentError, "requires valid label offset") { @axis.lblOffset = 'foo' }
28
- assert_nothing_raised("accepts valid label offset") { @axis.lblOffset = "20" }
26
+ def test_lbl_offset
27
+ assert_raise(ArgumentError, "requires valid label offset") { @axis.lbl_offset = 'foo' }
28
+ assert_nothing_raised("accepts valid label offset") { @axis.lbl_offset = "20" }
29
29
  end
30
30
 
31
31
  end
@@ -37,6 +37,21 @@ class TestChart < Test::Unit::TestCase
37
37
  assert_nothing_raised { @chart.style = 2 }
38
38
  assert_equal(@chart.style, 2)
39
39
  end
40
+
41
+ def test_vary_colors
42
+ assert_equal(true, @chart.vary_colors)
43
+ assert_raise(ArgumentError) { @chart.vary_colors = 7 }
44
+ assert_nothing_raised { @chart.vary_colors = false }
45
+ assert_equal(false, @chart.vary_colors)
46
+ end
47
+
48
+ def test_display_blanks_as
49
+ assert_equal(:gap, @chart.display_blanks_as, "default is not :gap")
50
+ assert_raise(ArgumentError, "did not validate possible values") { @chart.display_blanks_as = :hole }
51
+ assert_nothing_raised { @chart.display_blanks_as = :zero }
52
+ assert_nothing_raised { @chart.display_blanks_as = :span }
53
+ assert_equal(:span, @chart.display_blanks_as)
54
+ end
40
55
 
41
56
  def test_start_at
42
57
  @chart.start_at 15, 25
@@ -87,4 +102,9 @@ class TestChart < Test::Unit::TestCase
87
102
  assert(errors.empty?, "error free validation")
88
103
  end
89
104
 
105
+ def test_to_xml_string_for_display_blanks_as
106
+ @chart.display_blanks_as = :span
107
+ doc = Nokogiri::XML(@chart.to_xml_string)
108
+ assert_equal("span", doc.xpath("//c:dispBlanksAs").attr("val").value, "did not use the display_blanks_as configuration")
109
+ end
90
110
  end
@@ -4,19 +4,29 @@ class TestDLbls < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
6
  @d_lbls = Axlsx::DLbls.new(Axlsx::Pie3DChart)
7
+ @boolean_attributes =[:show_legend_key,
8
+ :show_val,
9
+ :show_cat_name,
10
+ :show_ser_name,
11
+ :show_percent,
12
+ :show_bubble_size,
13
+ :show_leader_lines]
7
14
  end
8
15
 
9
16
  def test_initialization
10
17
  assert_equal(:bestFit, @d_lbls.d_lbl_pos)
11
- Axlsx::DLbls::BOOLEAN_ATTRIBUTES.each do |attr|
18
+ @boolean_attributes.each do |attr|
12
19
  assert_equal(false, @d_lbls.send(attr))
13
20
  end
14
21
  end
15
22
 
16
23
  def test_initialization_with_optoins
17
- options_hash = Hash[*[Axlsx::DLbls::BOOLEAN_ATTRIBUTES.map { |name| [name, true] }] ]
24
+
25
+ options_hash = Hash[*[@boolean_attributes.map { |name| [name, true] }] ]
26
+
18
27
  d_lbls = Axlsx::DLbls.new(Axlsx::Pie3DChart, options_hash.merge( { :d_lbl_pos => :t }))
19
- Axlsx::DLbls::BOOLEAN_ATTRIBUTES.each do |attr|
28
+
29
+ @boolean_attributes.each do |attr|
20
30
  assert_equal(true, d_lbls.send(attr), "boolean attributes set by options")
21
31
  end
22
32
  assert_equal(:t, d_lbls.d_lbl_pos, "d_lbl_pos set by options")
@@ -27,7 +37,7 @@ class TestDLbls < Test::Unit::TestCase
27
37
  end
28
38
 
29
39
  def test_boolean_attributes
30
- Axlsx::DLbls::BOOLEAN_ATTRIBUTES.each do |attr|
40
+ @boolean_attributes.each do |attr|
31
41
  assert_raise(ArgumentError, "rejects non boolean value for #{attr}") { @d_lbls.send("#{attr}=", :foo) }
32
42
  assert_nothing_raised("accepts boolean value for #{attr}") { @d_lbls.send("#{attr}=", true) }
33
43
  assert_nothing_raised("accepts boolean value for #{attr}") { @d_lbls.send("#{attr}=", false) }
@@ -53,11 +53,6 @@ class TestDrawing < Test::Unit::TestCase
53
53
  assert_equal(@ws.drawing.rels_pn, "drawings/_rels/drawing1.xml.rels")
54
54
  end
55
55
 
56
- def test_rId
57
- @ws.add_chart(Axlsx::Pie3DChart)
58
- assert_equal(@ws.drawing.rId, "rId1")
59
- end
60
-
61
56
  def test_index
62
57
  @ws.add_chart(Axlsx::Pie3DChart)
63
58
  assert_equal(@ws.drawing.index, @ws.workbook.drawings.index(@ws.drawing))
@@ -17,9 +17,11 @@ class TestGraphicFrame < Test::Unit::TestCase
17
17
  end
18
18
 
19
19
  def test_rId
20
- assert_equal(@frame.rId, "rId1")
21
- chart = @ws.add_chart Axlsx::Chart
22
- assert_equal(chart.graphic_frame.rId, "rId2")
20
+ assert_equal @ws.drawing.relationships.for(@chart).Id, @frame.rId
23
21
  end
24
22
 
23
+ def test_to_xml_has_correct_rId
24
+ doc = Nokogiri::XML(@frame.to_xml_string)
25
+ assert_equal @frame.rId, doc.xpath("//c:chart", doc.collect_namespaces).first["r:id"]
26
+ end
25
27
  end
@@ -51,10 +51,6 @@ class TestHyperlink < Test::Unit::TestCase
51
51
  assert_equal(@hyperlink.highlightClick, false )
52
52
  end
53
53
 
54
- def test_id
55
- assert_equal(@hyperlink.send(:id), 2)
56
- end
57
-
58
54
  def test_history
59
55
  assert_nothing_raised { @hyperlink.history = false }
60
56
  assert_raise(ArgumentError) {@hyperlink.history = "bob"}
@@ -0,0 +1,39 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestLineChart < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @p = Axlsx::Package.new
7
+ ws = @p.workbook.add_worksheet
8
+ @row = ws.add_row ["one", 1, Time.now]
9
+ @chart = ws.add_chart Axlsx::LineChart, :title => "fishery"
10
+ end
11
+
12
+ def teardown
13
+ end
14
+
15
+ def test_initialization
16
+ assert_equal(@chart.grouping, :standard, "grouping defualt incorrect")
17
+ assert_equal(@chart.series_type, Axlsx::LineSeries, "series type incorrect")
18
+ assert(@chart.cat_axis.is_a?(Axlsx::CatAxis), "category axis not created")
19
+ assert(@chart.val_axis.is_a?(Axlsx::ValAxis), "value access not created")
20
+ end
21
+
22
+ def test_grouping
23
+ assert_raise(ArgumentError, "require valid grouping") { @chart.grouping = :inverted }
24
+ assert_nothing_raised("allow valid grouping") { @chart.grouping = :stacked }
25
+ assert(@chart.grouping == :stacked)
26
+ end
27
+
28
+ def test_to_xml
29
+ schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
30
+ doc = Nokogiri::XML(@chart.to_xml_string)
31
+ errors = []
32
+ schema.validate(doc).each do |error|
33
+ errors.push error
34
+ puts error.message
35
+ end
36
+ assert(errors.empty?, "error free validation")
37
+ end
38
+
39
+ end
@@ -6,7 +6,7 @@ class TestLineSeries < Test::Unit::TestCase
6
6
  p = Axlsx::Package.new
7
7
  @ws = p.workbook.add_worksheet :name=>"hmmm"
8
8
  chart = @ws.add_chart Axlsx::Line3DChart, :title => "fishery"
9
- @series = chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob", :color => "#FF0000"
9
+ @series = chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob", :color => "#FF0000", :show_marker => true
10
10
  end
11
11
 
12
12
  def test_initialize
@@ -15,10 +15,16 @@ class TestLineSeries < Test::Unit::TestCase
15
15
  assert_equal(@series.data.class, Axlsx::NumDataSource)
16
16
 
17
17
  end
18
-
18
+
19
+ def test_show_marker
20
+ assert_equal(true, @series.show_marker)
21
+ @series.show_marker = false
22
+ assert_equal(false, @series.show_marker)
23
+ end
19
24
  def test_to_xml_string
20
25
  doc = Nokogiri::XML(@series.to_xml_string)
21
26
  assert(doc.xpath("//srgbClr[@val='#{@series.color}']"))
27
+ assert(doc.xpath("//marker"))
22
28
  end
23
29
  #TODO serialization testing
24
30
  end
@@ -6,6 +6,7 @@ class TestPic < Test::Unit::TestCase
6
6
  @p = Axlsx::Package.new
7
7
  ws = @p.workbook.add_worksheet
8
8
  @test_img = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
9
+ @test_img_up = File.dirname(__FILE__) + "/../../examples/IMAGE1UP.JPEG"
9
10
  @image = ws.add_image :image_src => @test_img, :hyperlink => 'https://github.com/randym', :tooltip => "What's up doc?"
10
11
  end
11
12
 
@@ -21,21 +22,21 @@ class TestPic < Test::Unit::TestCase
21
22
  def test_anchor_swapping
22
23
  #swap from one cell to two cell when end_at is specified
23
24
  assert(@image.anchor.is_a?(Axlsx::OneCellAnchor))
24
- start_at = @image.anchor.from
25
+ start_at = @image.anchor.from
25
26
  @image.end_at 10,5
26
27
  assert(@image.anchor.is_a?(Axlsx::TwoCellAnchor))
27
28
  assert_equal(start_at.col, @image.anchor.from.col)
28
29
  assert_equal(start_at.row, @image.anchor.from.row)
29
30
  assert_equal(10,@image.anchor.to.col)
30
31
  assert_equal(5, @image.anchor.to.row)
31
-
32
+
32
33
  #swap from two cell to one cell when width or height are specified
33
34
  @image.width = 200
34
35
  assert(@image.anchor.is_a?(Axlsx::OneCellAnchor))
35
36
  assert_equal(start_at.col, @image.anchor.from.col)
36
37
  assert_equal(start_at.row, @image.anchor.from.row)
37
38
  assert_equal(200, @image.width)
38
-
39
+
39
40
  end
40
41
  def test_hyperlink
41
42
  assert_equal(@image.hyperlink.href, "https://github.com/randym")
@@ -76,6 +77,10 @@ class TestPic < Test::Unit::TestCase
76
77
  assert_equal(@image.image_src, @test_img)
77
78
  end
78
79
 
80
+ def test_image_src_downcase
81
+ assert_nothing_raised { @image.image_src = @test_img_up }
82
+ end
83
+
79
84
  def test_descr
80
85
  assert_raise(ArgumentError) { @image.descr = 49 }
81
86
  assert_nothing_raised { @image.descr = "test" }
@@ -93,4 +98,10 @@ class TestPic < Test::Unit::TestCase
93
98
  assert(errors.empty?, "error free validation")
94
99
  end
95
100
 
101
+ def test_to_xml_has_correct_r_id
102
+ r_id = @image.anchor.drawing.relationships.for(@image).Id
103
+ doc = Nokogiri::XML(@image.anchor.drawing.to_xml_string)
104
+ assert_equal r_id, doc.xpath("//a:blip").first["r:embed"]
105
+ end
106
+
96
107
  end
@@ -2,29 +2,30 @@ require 'tc_helper.rb'
2
2
 
3
3
  class TestSerAxis < Test::Unit::TestCase
4
4
  def setup
5
- @axis = Axlsx::SerAxis.new 12345, 54321
5
+ @axis = Axlsx::SerAxis.new
6
6
  end
7
+
7
8
  def teardown
8
9
  end
9
10
 
10
11
  def test_options
11
- a = Axlsx::SerAxis.new 12345, 54321, :tickLblSkip => 9, :tickMarkSkip => 7
12
- assert_equal(a.tickLblSkip, 9)
13
- assert_equal(a.tickMarkSkip, 7)
12
+ a = Axlsx::SerAxis.new(:tick_lbl_skip => 9, :tick_mark_skip => 7)
13
+ assert_equal(a.tick_lbl_skip, 9)
14
+ assert_equal(a.tick_mark_skip, 7)
14
15
  end
15
16
 
16
17
 
17
- def test_tickLblSkip
18
- assert_raise(ArgumentError, "requires valid tickLblSkip") { @axis.tickLblSkip = -1 }
19
- assert_nothing_raised("accepts valid tickLblSkip") { @axis.tickLblSkip = 1 }
20
- assert_equal(@axis.tickLblSkip, 1)
18
+ def test_tick_lbl_skip
19
+ assert_raise(ArgumentError, "requires valid tick_lbl_skip") { @axis.tick_lbl_skip = -1 }
20
+ assert_nothing_raised("accepts valid tick_lbl_skip") { @axis.tick_lbl_skip = 1 }
21
+ assert_equal(@axis.tick_lbl_skip, 1)
21
22
  end
22
23
 
23
24
 
24
- def test_tickMarkSkip
25
- assert_raise(ArgumentError, "requires valid tickMarkSkip") { @axis.tickMarkSkip = :my_eyes }
26
- assert_nothing_raised("accepts valid tickMarkSkip") { @axis.tickMarkSkip = 2 }
27
- assert_equal(@axis.tickMarkSkip, 2)
25
+ def test_tick_mark_skip
26
+ assert_raise(ArgumentError, "requires valid tick_mark_skip") { @axis.tick_mark_skip = :my_eyes }
27
+ assert_nothing_raised("accepts valid tick_mark_skip") { @axis.tick_mark_skip = 2 }
28
+ assert_equal(@axis.tick_mark_skip, 2)
28
29
  end
29
30
 
30
31
  end
@@ -10,9 +10,6 @@ class TestTwoCellAnchor < Test::Unit::TestCase
10
10
  @anchor = chart.graphic_frame.anchor
11
11
  end
12
12
 
13
- def teardown
14
- end
15
-
16
13
  def test_initialization
17
14
  assert(@anchor.from.col == 0)
18
15
  assert(@anchor.from.row == 0)
@@ -20,6 +17,9 @@ class TestTwoCellAnchor < Test::Unit::TestCase
20
17
  assert(@anchor.to.row == 10)
21
18
  end
22
19
 
20
+ def test_index
21
+ assert_equal(@anchor.index, @anchor.drawing.anchors.index(@anchor))
22
+ end
23
23
 
24
24
  def test_options
25
25
  assert_raise(ArgumentError, 'invalid start_at') { @ws.add_chart Axlsx::Chart, :start_at=>"1" }
@@ -2,23 +2,23 @@ require 'tc_helper.rb'
2
2
 
3
3
  class TestValAxis < Test::Unit::TestCase
4
4
  def setup
5
- @axis = Axlsx::ValAxis.new 12345, 54321
5
+ @axis = Axlsx::ValAxis.new
6
6
  end
7
7
  def teardown
8
8
  end
9
9
 
10
10
  def test_initialization
11
- assert_equal(@axis.crossBetween, :between, "axis crossBetween default incorrect")
11
+ assert_equal(@axis.cross_between, :between, "axis crossBetween default incorrect")
12
12
  end
13
13
 
14
14
  def test_options
15
- a = Axlsx::ValAxis.new 2345, 4321, :crossBetween => :midCat
16
- assert_equal(a.crossBetween, :midCat)
15
+ a = Axlsx::ValAxis.new(:cross_between => :midCat)
16
+ assert_equal(:midCat, a.cross_between)
17
17
  end
18
18
 
19
19
  def test_crossBetween
20
- assert_raise(ArgumentError, "requires valid crossBetween") { @axis.crossBetween = :my_eyes }
21
- assert_nothing_raised("accepts valid crossBetween") { @axis.crossBetween = :midCat }
20
+ assert_raise(ArgumentError, "requires valid crossBetween") { @axis.cross_between = :my_eyes }
21
+ assert_nothing_raised("accepts valid crossBetween") { @axis.cross_between = :midCat }
22
22
  end
23
23
 
24
24
  end
@@ -6,8 +6,8 @@ class TestVmlShape < Test::Unit::TestCase
6
6
  p = Axlsx::Package.new
7
7
  wb = p.workbook
8
8
  @ws = wb.add_worksheet
9
- @ws.add_comment :ref => 'A1', :text => 'penut machine', :author => 'crank'
10
- @ws.add_comment :ref => 'C3', :text => 'rust bucket', :author => 'PO'
9
+ @ws.add_comment :ref => 'A1', :text => 'penut machine', :author => 'crank', :visible => true
10
+ @ws.add_comment :ref => 'C3', :text => 'rust bucket', :author => 'PO', :visible => false
11
11
  @comments = @ws.comments
12
12
  end
13
13
 
@@ -84,11 +84,17 @@ class TestVmlShape < Test::Unit::TestCase
84
84
  assert(shape.top_row == 3)
85
85
  assert_raise(ArgumentError) { shape.top_row = [] }
86
86
  end
87
-
87
+ def test_visible
88
+ shape = @comments.first.vml_shape
89
+ shape.visible = false
90
+ assert(shape.visible == false)
91
+ assert_raise(ArgumentError) { shape.visible = 'foo' }
92
+ end
88
93
  def test_to_xml_string
89
94
  str = @comments.vml_drawing.to_xml_string()
90
95
  doc = Nokogiri::XML(str)
91
96
  assert_equal(doc.xpath("//v:shape").size, 2)
97
+ assert_equal(1, doc.xpath("//x:Visible").size, 'ClientData/x:Visible element rendering')
92
98
  @comments.each do |comment|
93
99
  shape = comment.vml_shape
94
100
  assert(doc.xpath("//v:shape/x:ClientData/x:Row[text()='#{shape.row}']").size == 1)
data/test/profile.rb CHANGED
@@ -1,34 +1,24 @@
1
1
  #!/usr/bin/env ruby -s
2
- # -*- coding: utf-8 -*-
3
-
4
- # Usage:
5
- # > ruby test/profile.rb
6
- # > pprof.rb --gif /tmp/axlsx_noautowidth > /tmp/axlsx_noautowidth.gif
7
- # > open /tmp/axlsx_noautowidth.gif
8
2
 
9
3
  $:.unshift "#{File.dirname(__FILE__)}/../lib"
10
4
  require 'axlsx'
11
- require 'csv'
12
-
13
- # require 'benchmark'
14
- require 'perftools'
5
+ require 'ruby-prof'
6
+ #RubyProf.measure_mode = RubyProf::MEMORY
7
+ #
15
8
  row = []
9
+ # Taking worst case scenario of all string data
16
10
  input = (32..126).to_a.pack('U*').chars.to_a
17
11
  20.times { row << input.shuffle.join}
18
- times = 3000
19
12
 
20
- PerfTools::CpuProfiler.start("/tmp/axlsx_noautowidth") do
13
+ profile = RubyProf.profile do
21
14
  p = Axlsx::Package.new
22
- p.use_autowidth = false
23
- p.use_shared_strings = true
24
- wb = p.workbook
25
-
26
- #A Simple Workbook
27
-
28
- wb.add_worksheet do |sheet|
29
- times.times do
15
+ p.workbook.add_worksheet do |sheet|
16
+ 10000.times do
30
17
  sheet << row
31
18
  end
32
19
  end
33
- p.serialize("example.xlsx")
20
+ p.to_stream
34
21
  end
22
+
23
+ printer = RubyProf::FlatPrinter.new(profile)
24
+ printer.print(STDOUT, {})