caxlsx 3.1.1 → 3.2.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.
- checksums.yaml +4 -4
- data/.yardopts +9 -9
- data/.yardopts_guide +18 -18
- data/CHANGELOG.md +354 -343
- data/LICENSE +21 -21
- data/README.md +168 -172
- data/Rakefile +29 -29
- data/examples/generate.rb +15 -15
- data/lib/axlsx/content_type/abstract_content_type.rb +32 -32
- data/lib/axlsx/content_type/content_type.rb +26 -26
- data/lib/axlsx/content_type/default.rb +25 -25
- data/lib/axlsx/content_type/override.rb +25 -25
- data/lib/axlsx/doc_props/app.rb +235 -235
- data/lib/axlsx/doc_props/core.rb +39 -39
- data/lib/axlsx/drawing/area_chart.rb +99 -99
- data/lib/axlsx/drawing/area_series.rb +110 -110
- data/lib/axlsx/drawing/ax_data_source.rb +26 -26
- data/lib/axlsx/drawing/axes.rb +61 -61
- data/lib/axlsx/drawing/axis.rb +190 -190
- data/lib/axlsx/drawing/bar_3D_chart.rb +148 -148
- data/lib/axlsx/drawing/bar_chart.rb +138 -138
- data/lib/axlsx/drawing/bar_series.rb +97 -97
- data/lib/axlsx/drawing/bubble_chart.rb +59 -59
- data/lib/axlsx/drawing/bubble_series.rb +63 -63
- data/lib/axlsx/drawing/cat_axis.rb +85 -85
- data/lib/axlsx/drawing/chart.rb +276 -276
- data/lib/axlsx/drawing/d_lbls.rb +90 -90
- data/lib/axlsx/drawing/drawing.rb +167 -167
- data/lib/axlsx/drawing/graphic_frame.rb +54 -54
- data/lib/axlsx/drawing/hyperlink.rb +100 -100
- data/lib/axlsx/drawing/line_3D_chart.rb +68 -68
- data/lib/axlsx/drawing/line_chart.rb +99 -99
- data/lib/axlsx/drawing/line_series.rb +110 -110
- data/lib/axlsx/drawing/marker.rb +84 -84
- data/lib/axlsx/drawing/num_data.rb +52 -52
- data/lib/axlsx/drawing/num_data_source.rb +62 -62
- data/lib/axlsx/drawing/num_val.rb +34 -34
- data/lib/axlsx/drawing/one_cell_anchor.rb +99 -99
- data/lib/axlsx/drawing/pic.rb +211 -211
- data/lib/axlsx/drawing/picture_locking.rb +42 -42
- data/lib/axlsx/drawing/pie_3D_chart.rb +47 -47
- data/lib/axlsx/drawing/pie_series.rb +74 -74
- data/lib/axlsx/drawing/scaling.rb +60 -60
- data/lib/axlsx/drawing/scatter_chart.rb +74 -74
- data/lib/axlsx/drawing/scatter_series.rb +129 -98
- data/lib/axlsx/drawing/ser_axis.rb +45 -45
- data/lib/axlsx/drawing/series.rb +69 -69
- data/lib/axlsx/drawing/series_title.rb +25 -25
- data/lib/axlsx/drawing/str_data.rb +42 -42
- data/lib/axlsx/drawing/str_val.rb +34 -34
- data/lib/axlsx/drawing/title.rb +97 -97
- data/lib/axlsx/drawing/two_cell_anchor.rb +97 -97
- data/lib/axlsx/drawing/val_axis.rb +37 -37
- data/lib/axlsx/drawing/view_3D.rb +115 -115
- data/lib/axlsx/drawing/vml_drawing.rb +42 -42
- data/lib/axlsx/drawing/vml_shape.rb +66 -66
- data/lib/axlsx/package.rb +388 -388
- data/lib/axlsx/rels/relationship.rb +130 -130
- data/lib/axlsx/rels/relationships.rb +32 -32
- data/lib/axlsx/stylesheet/border.rb +73 -71
- data/lib/axlsx/stylesheet/border_pr.rb +71 -71
- data/lib/axlsx/stylesheet/cell_alignment.rb +132 -132
- data/lib/axlsx/stylesheet/cell_protection.rb +41 -41
- data/lib/axlsx/stylesheet/cell_style.rb +72 -72
- data/lib/axlsx/stylesheet/color.rb +76 -76
- data/lib/axlsx/stylesheet/dxf.rb +79 -79
- data/lib/axlsx/stylesheet/fill.rb +35 -35
- data/lib/axlsx/stylesheet/font.rb +156 -156
- data/lib/axlsx/stylesheet/gradient_fill.rb +103 -103
- data/lib/axlsx/stylesheet/gradient_stop.rb +37 -37
- data/lib/axlsx/stylesheet/num_fmt.rb +86 -86
- data/lib/axlsx/stylesheet/pattern_fill.rb +73 -73
- data/lib/axlsx/stylesheet/styles.rb +494 -420
- data/lib/axlsx/stylesheet/table_style.rb +54 -54
- data/lib/axlsx/stylesheet/table_style_element.rb +77 -77
- data/lib/axlsx/stylesheet/table_styles.rb +46 -46
- data/lib/axlsx/stylesheet/xf.rb +147 -147
- data/lib/axlsx/util/accessors.rb +64 -64
- data/lib/axlsx/util/constants.rb +410 -401
- data/lib/axlsx/util/mime_type_utils.rb +11 -11
- data/lib/axlsx/util/options_parser.rb +16 -16
- data/lib/axlsx/util/serialized_attributes.rb +89 -89
- data/lib/axlsx/util/simple_typed_list.rb +179 -179
- data/lib/axlsx/util/storage.rb +146 -146
- data/lib/axlsx/util/validators.rb +312 -312
- data/lib/axlsx/util/zip_command.rb +73 -73
- data/lib/axlsx/version.rb +5 -5
- data/lib/axlsx/workbook/defined_name.rb +128 -128
- data/lib/axlsx/workbook/defined_names.rb +21 -21
- data/lib/axlsx/workbook/shared_strings_table.rb +77 -77
- data/lib/axlsx/workbook/workbook.rb +395 -370
- data/lib/axlsx/workbook/workbook_view.rb +80 -80
- data/lib/axlsx/workbook/workbook_views.rb +22 -22
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -77
- data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -94
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +244 -244
- data/lib/axlsx/workbook/worksheet/break.rb +35 -35
- data/lib/axlsx/workbook/worksheet/cell.rb +506 -505
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +164 -164
- data/lib/axlsx/workbook/worksheet/cfvo.rb +60 -60
- data/lib/axlsx/workbook/worksheet/cfvos.rb +18 -18
- data/lib/axlsx/workbook/worksheet/col.rb +145 -145
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -35
- data/lib/axlsx/workbook/worksheet/color_scale.rb +110 -110
- data/lib/axlsx/workbook/worksheet/cols.rb +23 -23
- data/lib/axlsx/workbook/worksheet/comment.rb +91 -91
- data/lib/axlsx/workbook/worksheet/comments.rb +82 -82
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -82
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +220 -220
- data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -25
- data/lib/axlsx/workbook/worksheet/data_bar.rb +129 -129
- data/lib/axlsx/workbook/worksheet/data_validation.rb +246 -246
- data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -28
- data/lib/axlsx/workbook/worksheet/date_time_converter.rb +30 -30
- data/lib/axlsx/workbook/worksheet/dimension.rb +64 -64
- data/lib/axlsx/workbook/worksheet/header_footer.rb +52 -52
- data/lib/axlsx/workbook/worksheet/icon_set.rb +81 -81
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +37 -37
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -33
- data/lib/axlsx/workbook/worksheet/page_margins.rb +97 -97
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -44
- data/lib/axlsx/workbook/worksheet/page_setup.rb +240 -240
- data/lib/axlsx/workbook/worksheet/pane.rb +139 -139
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +296 -294
- data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +66 -66
- data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -24
- data/lib/axlsx/workbook/worksheet/print_options.rb +39 -39
- data/lib/axlsx/workbook/worksheet/protected_range.rb +47 -47
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +37 -37
- data/lib/axlsx/workbook/worksheet/rich_text.rb +55 -55
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +250 -250
- data/lib/axlsx/workbook/worksheet/row.rb +164 -164
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -33
- data/lib/axlsx/workbook/worksheet/selection.rb +101 -101
- data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -29
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +27 -27
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +87 -87
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +118 -118
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +213 -213
- data/lib/axlsx/workbook/worksheet/table.rb +102 -102
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +49 -49
- data/lib/axlsx/workbook/worksheet/tables.rb +34 -34
- data/lib/axlsx/workbook/worksheet/worksheet.rb +786 -768
- data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +58 -58
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +58 -58
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -74
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -38
- data/lib/axlsx.rb +185 -171
- data/lib/caxlsx.rb +2 -2
- data/lib/schema/dc.xsd +118 -118
- data/lib/schema/dcmitype.xsd +51 -51
- data/lib/schema/dcterms.xsd +331 -331
- data/lib/schema/dml-chartDrawing.xsd +146 -146
- data/lib/schema/dml-compatibility.xsd +14 -14
- data/lib/schema/dml-lockedCanvas.xsd +11 -11
- data/lib/schema/dml-main.xsd +3048 -3048
- data/lib/schema/dml-picture.xsd +23 -23
- data/lib/schema/dml-spreadsheetDrawing.xsd +185 -185
- data/lib/schema/dml-wordprocessingDrawing.xsd +185 -185
- data/lib/schema/shared-additionalCharacteristics.xsd +28 -28
- data/lib/schema/shared-bibliography.xsd +144 -144
- data/lib/schema/shared-commonSimpleTypes.xsd +166 -166
- data/lib/schema/shared-customXmlDataProperties.xsd +25 -25
- data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -18
- data/lib/schema/shared-documentPropertiesCustom.xsd +59 -59
- data/lib/schema/shared-documentPropertiesExtended.xsd +56 -56
- data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -195
- data/lib/schema/shared-relationshipReference.xsd +25 -25
- data/lib/schema/vml-main.xsd +569 -569
- data/lib/schema/vml-officeDrawing.xsd +509 -509
- data/lib/schema/vml-presentationDrawing.xsd +12 -12
- data/lib/schema/vml-spreadsheetDrawing.xsd +108 -108
- data/lib/schema/vml-wordprocessingDrawing.xsd +96 -96
- data/lib/schema/xml.xsd +116 -116
- data/test/benchmark.rb +72 -72
- data/test/content_type/tc_content_type.rb +76 -76
- data/test/content_type/tc_default.rb +16 -16
- data/test/content_type/tc_override.rb +14 -14
- data/test/doc_props/tc_app.rb +43 -43
- data/test/doc_props/tc_core.rb +42 -42
- data/test/drawing/tc_area_chart.rb +39 -39
- data/test/drawing/tc_area_series.rb +71 -71
- data/test/drawing/tc_axes.rb +7 -7
- data/test/drawing/tc_axis.rb +112 -112
- data/test/drawing/tc_bar_3D_chart.rb +86 -86
- data/test/drawing/tc_bar_chart.rb +86 -86
- data/test/drawing/tc_bar_series.rb +46 -46
- data/test/drawing/tc_bubble_chart.rb +44 -44
- data/test/drawing/tc_bubble_series.rb +21 -21
- data/test/drawing/tc_cat_axis.rb +31 -31
- data/test/drawing/tc_cat_axis_data.rb +27 -27
- data/test/drawing/tc_chart.rb +123 -123
- data/test/drawing/tc_d_lbls.rb +57 -57
- data/test/drawing/tc_data_source.rb +23 -23
- data/test/drawing/tc_drawing.rb +80 -80
- data/test/drawing/tc_graphic_frame.rb +27 -27
- data/test/drawing/tc_hyperlink.rb +64 -64
- data/test/drawing/tc_line_3d_chart.rb +47 -47
- data/test/drawing/tc_line_chart.rb +39 -39
- data/test/drawing/tc_line_series.rb +71 -71
- data/test/drawing/tc_marker.rb +44 -44
- data/test/drawing/tc_named_axis_data.rb +27 -27
- data/test/drawing/tc_num_data.rb +31 -31
- data/test/drawing/tc_num_val.rb +29 -29
- data/test/drawing/tc_one_cell_anchor.rb +66 -66
- data/test/drawing/tc_pic.rb +103 -103
- data/test/drawing/tc_picture_locking.rb +72 -72
- data/test/drawing/tc_pie_3D_chart.rb +28 -28
- data/test/drawing/tc_pie_series.rb +33 -33
- data/test/drawing/tc_scaling.rb +36 -36
- data/test/drawing/tc_scatter_chart.rb +48 -48
- data/test/drawing/tc_scatter_series.rb +74 -56
- data/test/drawing/tc_ser_axis.rb +31 -31
- data/test/drawing/tc_series.rb +23 -23
- data/test/drawing/tc_series_title.rb +54 -54
- data/test/drawing/tc_str_data.rb +18 -18
- data/test/drawing/tc_str_val.rb +30 -30
- data/test/drawing/tc_title.rb +70 -70
- data/test/drawing/tc_two_cell_anchor.rb +36 -36
- data/test/drawing/tc_val_axis.rb +24 -24
- data/test/drawing/tc_view_3D.rb +54 -54
- data/test/drawing/tc_vml_drawing.rb +25 -25
- data/test/drawing/tc_vml_shape.rb +106 -106
- data/test/profile.rb +24 -24
- data/test/rels/tc_relationship.rb +52 -52
- data/test/rels/tc_relationships.rb +37 -37
- data/test/stylesheet/tc_border.rb +37 -37
- data/test/stylesheet/tc_border_pr.rb +32 -32
- data/test/stylesheet/tc_cell_alignment.rb +81 -81
- data/test/stylesheet/tc_cell_protection.rb +29 -29
- data/test/stylesheet/tc_cell_style.rb +57 -57
- data/test/stylesheet/tc_color.rb +43 -43
- data/test/stylesheet/tc_dxf.rb +81 -81
- data/test/stylesheet/tc_fill.rb +18 -18
- data/test/stylesheet/tc_font.rb +133 -133
- data/test/stylesheet/tc_gradient_fill.rb +72 -72
- data/test/stylesheet/tc_gradient_stop.rb +31 -31
- data/test/stylesheet/tc_num_fmt.rb +30 -30
- data/test/stylesheet/tc_pattern_fill.rb +43 -43
- data/test/stylesheet/tc_styles.rb +309 -261
- data/test/stylesheet/tc_table_style.rb +44 -44
- data/test/stylesheet/tc_table_style_element.rb +45 -45
- data/test/stylesheet/tc_table_styles.rb +29 -29
- data/test/stylesheet/tc_xf.rb +120 -120
- data/test/tc_axlsx.rb +109 -109
- data/test/tc_helper.rb +10 -10
- data/test/tc_package.rb +317 -314
- data/test/util/tc_mime_type_utils.rb +13 -13
- data/test/util/tc_serialized_attributes.rb +19 -19
- data/test/util/tc_simple_typed_list.rb +77 -77
- data/test/util/tc_validators.rb +210 -210
- data/test/workbook/tc_defined_name.rb +49 -49
- data/test/workbook/tc_shared_strings_table.rb +59 -59
- data/test/workbook/tc_workbook.rb +165 -160
- data/test/workbook/tc_workbook_view.rb +50 -50
- data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +38 -38
- data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +76 -76
- data/test/workbook/worksheet/auto_filter/tc_filters.rb +50 -50
- data/test/workbook/worksheet/tc_break.rb +49 -49
- data/test/workbook/worksheet/tc_cell.rb +465 -453
- data/test/workbook/worksheet/tc_cfvo.rb +31 -31
- data/test/workbook/worksheet/tc_col.rb +93 -93
- data/test/workbook/worksheet/tc_color_scale.rb +58 -58
- data/test/workbook/worksheet/tc_comment.rb +72 -72
- data/test/workbook/worksheet/tc_comments.rb +57 -57
- data/test/workbook/worksheet/tc_conditional_formatting.rb +224 -224
- data/test/workbook/worksheet/tc_data_bar.rb +46 -46
- data/test/workbook/worksheet/tc_data_validation.rb +265 -265
- data/test/workbook/worksheet/tc_date_time_converter.rb +124 -124
- data/test/workbook/worksheet/tc_header_footer.rb +151 -151
- data/test/workbook/worksheet/tc_icon_set.rb +45 -45
- data/test/workbook/worksheet/tc_outline_pr.rb +19 -19
- data/test/workbook/worksheet/tc_page_margins.rb +97 -97
- data/test/workbook/worksheet/tc_page_set_up_pr.rb +15 -15
- data/test/workbook/worksheet/tc_page_setup.rb +143 -143
- data/test/workbook/worksheet/tc_pane.rb +54 -54
- data/test/workbook/worksheet/tc_pivot_table.rb +180 -143
- data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +62 -62
- data/test/workbook/worksheet/tc_print_options.rb +72 -72
- data/test/workbook/worksheet/tc_protected_range.rb +17 -17
- data/test/workbook/worksheet/tc_rich_text.rb +44 -44
- data/test/workbook/worksheet/tc_rich_text_run.rb +173 -173
- data/test/workbook/worksheet/tc_row.rb +160 -160
- data/test/workbook/worksheet/tc_selection.rb +55 -55
- data/test/workbook/worksheet/tc_sheet_calc_pr.rb +18 -18
- data/test/workbook/worksheet/tc_sheet_format_pr.rb +88 -88
- data/test/workbook/worksheet/tc_sheet_pr.rb +49 -49
- data/test/workbook/worksheet/tc_sheet_protection.rb +117 -117
- data/test/workbook/worksheet/tc_sheet_view.rb +214 -214
- data/test/workbook/worksheet/tc_table.rb +77 -77
- data/test/workbook/worksheet/tc_table_style_info.rb +53 -53
- data/test/workbook/worksheet/tc_worksheet.rb +632 -601
- data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +55 -55
- metadata +101 -101
data/test/tc_package.rb
CHANGED
|
@@ -1,314 +1,317 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
require 'tc_helper.rb'
|
|
3
|
-
|
|
4
|
-
class TestPackage < Test::Unit::TestCase
|
|
5
|
-
def setup
|
|
6
|
-
@package = Axlsx::Package.new
|
|
7
|
-
ws = @package.workbook.add_worksheet
|
|
8
|
-
ws.add_row ['Can', 'we', 'build it?']
|
|
9
|
-
ws.add_row ['Yes!', 'We', 'can!']
|
|
10
|
-
@rt = Axlsx::RichText.new
|
|
11
|
-
@rt.add_run "run 1", :b => true, :i => false
|
|
12
|
-
ws.add_row [@rt]
|
|
13
|
-
|
|
14
|
-
ws.rows.last.add_cell('b', :type => :text)
|
|
15
|
-
|
|
16
|
-
ws.outline_level_rows 0, 1
|
|
17
|
-
ws.outline_level_columns 0, 1
|
|
18
|
-
ws.add_hyperlink :ref => ws.rows.first.cells.last, :location => 'https://github.com/randym'
|
|
19
|
-
ws.workbook.add_defined_name("#{ws.name}!A1:C2", :name => '_xlnm.Print_Titles', :hidden => true)
|
|
20
|
-
ws.workbook.add_view active_tab: 1, first_sheet: 0
|
|
21
|
-
ws.protect_range('A1:C1')
|
|
22
|
-
ws.protect_range(ws.rows.last.cells)
|
|
23
|
-
ws.add_comment :author => 'alice', :text => 'Hi Bob', :ref => 'A12'
|
|
24
|
-
ws.add_comment :author => 'bob', :text => 'Hi Alice', :ref => 'F19'
|
|
25
|
-
ws.sheet_view do |vs|
|
|
26
|
-
vs.pane do |p|
|
|
27
|
-
p.active_pane = :top_right
|
|
28
|
-
p.state = :split
|
|
29
|
-
p.x_split = 11080
|
|
30
|
-
p.y_split = 5000
|
|
31
|
-
p.top_left_cell = 'C44'
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
vs.add_selection(:top_left, { :active_cell => 'A2', :sqref => 'A2' })
|
|
35
|
-
vs.add_selection(:top_right, { :active_cell => 'I10', :sqref => 'I10' })
|
|
36
|
-
vs.add_selection(:bottom_left, { :active_cell => 'E55', :sqref => 'E55' })
|
|
37
|
-
vs.add_selection(:bottom_right, { :active_cell => 'I57', :sqref => 'I57' })
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
ws.add_chart(Axlsx::Pie3DChart, :title => "これは?", :start_at => [0,3]) do |chart|
|
|
41
|
-
chart.add_series :data=>[1,2,3], :labels=>["a", "b", "c"]
|
|
42
|
-
chart.d_lbls.show_val = true
|
|
43
|
-
chart.d_lbls.d_lbl_pos = :outEnd
|
|
44
|
-
chart.d_lbls.show_percent = true
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
ws.add_chart(Axlsx::Line3DChart, :title => "axis labels") do |chart|
|
|
48
|
-
chart.valAxis.title = 'bob'
|
|
49
|
-
chart.d_lbls.show_val = true
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
ws.add_chart(Axlsx::Bar3DChart, :title => 'bar chart') do |chart|
|
|
53
|
-
chart.add_series :data => [1,4,5], :labels => %w(A B C)
|
|
54
|
-
chart.d_lbls.show_percent = true
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
ws.add_chart(Axlsx::ScatterChart, :title => 'scat man') do |chart|
|
|
58
|
-
chart.add_series :xData => [1,2,3,4], :yData => [4,3,2,1]
|
|
59
|
-
chart.d_lbls.show_val = true
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
ws.add_chart(Axlsx::BubbleChart, :title => 'bubble chart') do |chart|
|
|
63
|
-
chart.add_series :xData => [1,2,3,4], :yData => [1,3,2,4]
|
|
64
|
-
chart.d_lbls.show_val = true
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
@fname = 'axlsx_test_serialization.xlsx'
|
|
68
|
-
img = File.expand_path('../fixtures/image1.jpeg', __FILE__)
|
|
69
|
-
ws.add_image(:image_src => img, :noSelect => true, :noMove => true, :hyperlink=>"http://axlsx.blogspot.com") do |image|
|
|
70
|
-
image.width=720
|
|
71
|
-
image.height=666
|
|
72
|
-
image.hyperlink.tooltip = "Labeled Link"
|
|
73
|
-
image.start_at 5, 5
|
|
74
|
-
image.end_at 10, 10
|
|
75
|
-
end
|
|
76
|
-
ws.add_image :image_src => File.expand_path('../fixtures/image1.gif', __FILE__) do |image|
|
|
77
|
-
image.start_at 0, 20
|
|
78
|
-
image.width=360
|
|
79
|
-
image.height=333
|
|
80
|
-
end
|
|
81
|
-
ws.add_image :image_src => File.expand_path('../fixtures/image1.png', __FILE__) do |image|
|
|
82
|
-
image.start_at 9, 20
|
|
83
|
-
image.width = 180
|
|
84
|
-
image.height = 167
|
|
85
|
-
end
|
|
86
|
-
ws.add_table 'A1:C1'
|
|
87
|
-
|
|
88
|
-
ws.add_pivot_table 'G5:G6', 'A1:B3'
|
|
89
|
-
|
|
90
|
-
ws.add_page_break "B2"
|
|
91
|
-
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def test_use_autowidth
|
|
95
|
-
@package.use_autowidth = false
|
|
96
|
-
assert(@package.workbook.use_autowidth == false)
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def test_core_accessor
|
|
100
|
-
assert_equal(@package.core, @package.instance_values["core"])
|
|
101
|
-
assert_raise(NoMethodError) {@package.core = nil }
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
def test_app_accessor
|
|
105
|
-
assert_equal(@package.app, @package.instance_values["app"])
|
|
106
|
-
assert_raise(NoMethodError) {@package.app = nil }
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def test_use_shared_strings
|
|
110
|
-
assert_equal(@package.use_shared_strings, nil)
|
|
111
|
-
assert_raise(ArgumentError) {@package.use_shared_strings 9}
|
|
112
|
-
assert_nothing_raised {@package.use_shared_strings = true}
|
|
113
|
-
assert_equal(@package.use_shared_strings, @package.workbook.use_shared_strings)
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
def test_default_objects_are_created
|
|
117
|
-
assert(@package.instance_values["app"].is_a?(Axlsx::App), 'App object not created')
|
|
118
|
-
assert(@package.instance_values["core"].is_a?(Axlsx::Core), 'Core object not created')
|
|
119
|
-
assert(@package.workbook.is_a?(Axlsx::Workbook), 'Workbook object not created')
|
|
120
|
-
assert(Axlsx::Package.new.workbook.worksheets.size == 0, 'Workbook should not have sheets by default')
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
def test_created_at_is_propagated_to_core
|
|
124
|
-
time = Time.utc(2013, 1, 1, 12, 0)
|
|
125
|
-
p = Axlsx::Package.new :created_at => time
|
|
126
|
-
assert_equal(time, p.core.created)
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
def test_serialization
|
|
130
|
-
@package.serialize(@fname)
|
|
131
|
-
assert_zip_file_matches_package(@fname, @package)
|
|
132
|
-
assert_created_with_rubyzip(@fname, @package)
|
|
133
|
-
File.delete(@fname)
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
def test_serialization_with_zip_command
|
|
137
|
-
@package.serialize(@fname, zip_command: "zip")
|
|
138
|
-
assert_zip_file_matches_package(@fname, @package)
|
|
139
|
-
assert_created_with_zip_command(@fname, @package)
|
|
140
|
-
File.delete(@fname)
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
def test_serialization_with_zip_command_and_absolute_path
|
|
144
|
-
fname = "#{Dir.tmpdir}/#{@fname}"
|
|
145
|
-
@package.serialize(fname, zip_command: "zip")
|
|
146
|
-
assert_zip_file_matches_package(fname, @package)
|
|
147
|
-
assert_created_with_zip_command(fname, @package)
|
|
148
|
-
File.delete(fname)
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
def test_serialization_with_invalid_zip_command
|
|
152
|
-
assert_raises Axlsx::ZipCommand::ZipError do
|
|
153
|
-
@package.serialize(@fname, zip_command: "invalid_zip")
|
|
154
|
-
end
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
def assert_zip_file_matches_package(fname, package)
|
|
158
|
-
zf = Zip::File.open(fname)
|
|
159
|
-
package.send(:parts).each{ |part| zf.get_entry(part[:entry]) }
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
def assert_created_with_rubyzip(fname, package)
|
|
163
|
-
assert_equal 2098, get_mtime(fname, package).year, "XLSX files created with RubyZip have 2098 as the file mtime"
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
def assert_created_with_zip_command(fname, package)
|
|
167
|
-
assert_equal Time.now.utc.year, get_mtime(fname, package).year, "XLSX files created with a zip command have the current year as the file mtime"
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
def get_mtime(fname, package)
|
|
171
|
-
zf = Zip::File.open(fname)
|
|
172
|
-
part = package.send(:parts).first
|
|
173
|
-
entry = zf.get_entry(part[:entry])
|
|
174
|
-
entry.mtime.utc
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
def test_serialization_with_deprecated_argument
|
|
178
|
-
warnings = capture_warnings do
|
|
179
|
-
@package.serialize(@fname, false)
|
|
180
|
-
end
|
|
181
|
-
assert_equal 1, warnings.size
|
|
182
|
-
assert_includes warnings.first, "confirm_valid as a boolean is deprecated"
|
|
183
|
-
File.delete(@fname)
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
def test_serialization_with_deprecated_three_arguments
|
|
187
|
-
warnings = capture_warnings do
|
|
188
|
-
@package.serialize(@fname, true, zip_command: "zip")
|
|
189
|
-
end
|
|
190
|
-
assert_zip_file_matches_package(@fname, @package)
|
|
191
|
-
assert_created_with_zip_command(@fname, @package)
|
|
192
|
-
assert_equal 2, warnings.size
|
|
193
|
-
assert_includes warnings.first, "with 3 arguments is deprecated"
|
|
194
|
-
File.delete(@fname)
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
def capture_warnings(&block)
|
|
198
|
-
original_warn = Kernel.instance_method(:warn)
|
|
199
|
-
warnings = []
|
|
200
|
-
Kernel.send(:define_method, :warn) { |string| warnings << string }
|
|
201
|
-
block.call
|
|
202
|
-
original_verbose = $VERBOSE
|
|
203
|
-
$VERBOSE = nil
|
|
204
|
-
Kernel.send(:define_method, :warn, original_warn)
|
|
205
|
-
$VERBOSE = original_verbose
|
|
206
|
-
warnings
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
# See comment for Package#zip_entry_for_part
|
|
210
|
-
def test_serialization_creates_identical_files_at_any_time_if_created_at_is_set
|
|
211
|
-
@package.core.created = Time.now
|
|
212
|
-
zip_content_now = @package.to_stream.string
|
|
213
|
-
Timecop.travel(3600) do
|
|
214
|
-
zip_content_then = @package.to_stream.string
|
|
215
|
-
assert zip_content_then == zip_content_now, "zip files are not identical"
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
|
-
|
|
219
|
-
def test_serialization_creates_identical_files_for_identical_packages
|
|
220
|
-
package_1, package_2 = 2.times.map do
|
|
221
|
-
Axlsx::Package.new(:created_at => Time.utc(2013, 1, 1)).tap do |p|
|
|
222
|
-
p.workbook.add_worksheet(:name => "Basic Worksheet") do |sheet|
|
|
223
|
-
sheet.add_row [1, 2, 3]
|
|
224
|
-
end
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
assert package_1.to_stream.string == package_2.to_stream.string, "zip files are not identical"
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
def test_serialization_creates_files_with_excel_mime_type
|
|
231
|
-
assert_equal(Marcel::MimeType.for(@package.to_stream),
|
|
232
|
-
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
def test_validation
|
|
236
|
-
assert_equal(@package.validate.size, 0, @package.validate)
|
|
237
|
-
Axlsx::Workbook.send(:class_variable_set, :@@date1904, 9900)
|
|
238
|
-
assert(@package.validate.size > 0)
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
def test_parts
|
|
242
|
-
p = @package.send(:parts)
|
|
243
|
-
#all parts have an entry
|
|
244
|
-
assert_equal(p.select{ |part| part[:entry] =~ /_rels\/\.rels/ }.size, 1, "rels missing")
|
|
245
|
-
assert_equal(p.select{ |part| part[:entry] =~ /docProps\/core\.xml/ }.size, 1, "core missing")
|
|
246
|
-
assert_equal(p.select{ |part| part[:entry] =~ /docProps\/app\.xml/ }.size, 1, "app missing")
|
|
247
|
-
assert_equal(p.select{ |part| part[:entry] =~ /xl\/_rels\/workbook\.xml\.rels/ }.size, 1, "workbook rels missing")
|
|
248
|
-
assert_equal(p.select{ |part| part[:entry] =~ /xl\/workbook\.xml/ }.size, 1, "workbook missing")
|
|
249
|
-
assert_equal(p.select{ |part| part[:entry] =~ /\[Content_Types\]\.xml/ }.size, 1, "content types missing")
|
|
250
|
-
assert_equal(p.select{ |part| part[:entry] =~ /xl\/styles\.xml/ }.size, 1, "styles missin")
|
|
251
|
-
assert_equal(p.select{ |part| part[:entry] =~ /xl\/drawings\/_rels\/drawing\d\.xml\.rels/ }.size, @package.workbook.drawings.size, "one or more drawing rels missing")
|
|
252
|
-
assert_equal(p.select{ |part| part[:entry] =~ /xl\/drawings\/drawing\d\.xml/ }.size, @package.workbook.drawings.size, "one or more drawings missing")
|
|
253
|
-
assert_equal(p.select{ |part| part[:entry] =~ /xl\/charts\/chart\d\.xml/ }.size, @package.workbook.charts.size, "one or more charts missing")
|
|
254
|
-
assert_equal(p.select{ |part| part[:entry] =~ /xl\/worksheets\/sheet\d\.xml/ }.size, @package.workbook.worksheets.size, "one or more sheet missing")
|
|
255
|
-
assert_equal(p.select{ |part| part[:entry] =~ /xl\/worksheets\/_rels\/sheet\d\.xml\.rels/ }.size, @package.workbook.worksheets.size, "one or more sheet rels missing")
|
|
256
|
-
assert_equal(p.select{ |part| part[:entry] =~ /xl\/comments\d\.xml/ }.size, @package.workbook.worksheets.size, "one or more sheet rels missing")
|
|
257
|
-
assert_equal(p.select{ |part| part[:entry] =~ /xl\/pivotTables\/pivotTable\d\.xml/ }.size, @package.workbook.worksheets.first.pivot_tables.size, "one or more pivot tables missing")
|
|
258
|
-
assert_equal(p.select{ |part| part[:entry] =~ /xl\/pivotTables\/_rels\/pivotTable\d\.xml.rels/ }.size, @package.workbook.worksheets.first.pivot_tables.size, "one or more pivot tables rels missing")
|
|
259
|
-
assert_equal(p.select{ |part| part[:entry] =~ /xl\/pivotCache\/pivotCacheDefinition\d\.xml/ }.size, @package.workbook.worksheets.first.pivot_tables.size, "one or more pivot tables missing")
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
#no mystery parts
|
|
263
|
-
assert_equal(25, p.size)
|
|
264
|
-
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
def test_shared_strings_requires_part
|
|
268
|
-
@package.use_shared_strings = true
|
|
269
|
-
@package.to_stream #ensure all cell_serializer paths are hit
|
|
270
|
-
p = @package.send(:parts)
|
|
271
|
-
assert_equal(p.select{ |part| part[:entry] =~/xl\/sharedStrings.xml/}.size, 1, "shared strings table missing")
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
def test_workbook_is_a_workbook
|
|
275
|
-
assert @package.workbook.is_a? Axlsx::Workbook
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
def test_base_content_types
|
|
279
|
-
ct = @package.send(:base_content_types)
|
|
280
|
-
assert(ct.select { |c| c.ContentType == Axlsx::RELS_CT }.size == 1, "rels content type missing")
|
|
281
|
-
assert(ct.select { |c| c.ContentType == Axlsx::XML_CT }.size == 1, "xml content type missing")
|
|
282
|
-
assert(ct.select { |c| c.ContentType == Axlsx::APP_CT }.size == 1, "app content type missing")
|
|
283
|
-
assert(ct.select { |c| c.ContentType == Axlsx::CORE_CT }.size == 1, "core content type missing")
|
|
284
|
-
assert(ct.select { |c| c.ContentType == Axlsx::STYLES_CT }.size == 1, "styles content type missing")
|
|
285
|
-
assert(ct.select { |c| c.ContentType == Axlsx::WORKBOOK_CT }.size == 1, "workbook content type missing")
|
|
286
|
-
assert(ct.size == 6)
|
|
287
|
-
end
|
|
288
|
-
|
|
289
|
-
def test_content_type_added_with_shared_strings
|
|
290
|
-
@package.use_shared_strings = true
|
|
291
|
-
ct = @package.send(:content_types)
|
|
292
|
-
assert(ct.select { |type| type.ContentType == Axlsx::SHARED_STRINGS_CT }.size == 1)
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
def test_name_to_indices
|
|
296
|
-
assert(Axlsx::name_to_indices('A1') == [0,0])
|
|
297
|
-
assert(Axlsx::name_to_indices('A100') == [0,99], 'needs to axcept rows that contain 0')
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
def test_to_stream
|
|
301
|
-
stream = @package.to_stream
|
|
302
|
-
assert(stream.is_a?(StringIO))
|
|
303
|
-
# this is just a roundabout guess for a package as it is build now
|
|
304
|
-
# in testing.
|
|
305
|
-
assert(stream.size > 80000)
|
|
306
|
-
#
|
|
307
|
-
assert
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
require 'tc_helper.rb'
|
|
3
|
+
|
|
4
|
+
class TestPackage < Test::Unit::TestCase
|
|
5
|
+
def setup
|
|
6
|
+
@package = Axlsx::Package.new
|
|
7
|
+
ws = @package.workbook.add_worksheet
|
|
8
|
+
ws.add_row ['Can', 'we', 'build it?']
|
|
9
|
+
ws.add_row ['Yes!', 'We', 'can!']
|
|
10
|
+
@rt = Axlsx::RichText.new
|
|
11
|
+
@rt.add_run "run 1", :b => true, :i => false
|
|
12
|
+
ws.add_row [@rt]
|
|
13
|
+
|
|
14
|
+
ws.rows.last.add_cell('b', :type => :text)
|
|
15
|
+
|
|
16
|
+
ws.outline_level_rows 0, 1
|
|
17
|
+
ws.outline_level_columns 0, 1
|
|
18
|
+
ws.add_hyperlink :ref => ws.rows.first.cells.last, :location => 'https://github.com/randym'
|
|
19
|
+
ws.workbook.add_defined_name("#{ws.name}!A1:C2", :name => '_xlnm.Print_Titles', :hidden => true)
|
|
20
|
+
ws.workbook.add_view active_tab: 1, first_sheet: 0
|
|
21
|
+
ws.protect_range('A1:C1')
|
|
22
|
+
ws.protect_range(ws.rows.last.cells)
|
|
23
|
+
ws.add_comment :author => 'alice', :text => 'Hi Bob', :ref => 'A12'
|
|
24
|
+
ws.add_comment :author => 'bob', :text => 'Hi Alice', :ref => 'F19'
|
|
25
|
+
ws.sheet_view do |vs|
|
|
26
|
+
vs.pane do |p|
|
|
27
|
+
p.active_pane = :top_right
|
|
28
|
+
p.state = :split
|
|
29
|
+
p.x_split = 11080
|
|
30
|
+
p.y_split = 5000
|
|
31
|
+
p.top_left_cell = 'C44'
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
vs.add_selection(:top_left, { :active_cell => 'A2', :sqref => 'A2' })
|
|
35
|
+
vs.add_selection(:top_right, { :active_cell => 'I10', :sqref => 'I10' })
|
|
36
|
+
vs.add_selection(:bottom_left, { :active_cell => 'E55', :sqref => 'E55' })
|
|
37
|
+
vs.add_selection(:bottom_right, { :active_cell => 'I57', :sqref => 'I57' })
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
ws.add_chart(Axlsx::Pie3DChart, :title => "これは?", :start_at => [0,3]) do |chart|
|
|
41
|
+
chart.add_series :data=>[1,2,3], :labels=>["a", "b", "c"]
|
|
42
|
+
chart.d_lbls.show_val = true
|
|
43
|
+
chart.d_lbls.d_lbl_pos = :outEnd
|
|
44
|
+
chart.d_lbls.show_percent = true
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
ws.add_chart(Axlsx::Line3DChart, :title => "axis labels") do |chart|
|
|
48
|
+
chart.valAxis.title = 'bob'
|
|
49
|
+
chart.d_lbls.show_val = true
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
ws.add_chart(Axlsx::Bar3DChart, :title => 'bar chart') do |chart|
|
|
53
|
+
chart.add_series :data => [1,4,5], :labels => %w(A B C)
|
|
54
|
+
chart.d_lbls.show_percent = true
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
ws.add_chart(Axlsx::ScatterChart, :title => 'scat man') do |chart|
|
|
58
|
+
chart.add_series :xData => [1,2,3,4], :yData => [4,3,2,1]
|
|
59
|
+
chart.d_lbls.show_val = true
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
ws.add_chart(Axlsx::BubbleChart, :title => 'bubble chart') do |chart|
|
|
63
|
+
chart.add_series :xData => [1,2,3,4], :yData => [1,3,2,4]
|
|
64
|
+
chart.d_lbls.show_val = true
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
@fname = 'axlsx_test_serialization.xlsx'
|
|
68
|
+
img = File.expand_path('../fixtures/image1.jpeg', __FILE__)
|
|
69
|
+
ws.add_image(:image_src => img, :noSelect => true, :noMove => true, :hyperlink=>"http://axlsx.blogspot.com") do |image|
|
|
70
|
+
image.width=720
|
|
71
|
+
image.height=666
|
|
72
|
+
image.hyperlink.tooltip = "Labeled Link"
|
|
73
|
+
image.start_at 5, 5
|
|
74
|
+
image.end_at 10, 10
|
|
75
|
+
end
|
|
76
|
+
ws.add_image :image_src => File.expand_path('../fixtures/image1.gif', __FILE__) do |image|
|
|
77
|
+
image.start_at 0, 20
|
|
78
|
+
image.width=360
|
|
79
|
+
image.height=333
|
|
80
|
+
end
|
|
81
|
+
ws.add_image :image_src => File.expand_path('../fixtures/image1.png', __FILE__) do |image|
|
|
82
|
+
image.start_at 9, 20
|
|
83
|
+
image.width = 180
|
|
84
|
+
image.height = 167
|
|
85
|
+
end
|
|
86
|
+
ws.add_table 'A1:C1'
|
|
87
|
+
|
|
88
|
+
ws.add_pivot_table 'G5:G6', 'A1:B3'
|
|
89
|
+
|
|
90
|
+
ws.add_page_break "B2"
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_use_autowidth
|
|
95
|
+
@package.use_autowidth = false
|
|
96
|
+
assert(@package.workbook.use_autowidth == false)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def test_core_accessor
|
|
100
|
+
assert_equal(@package.core, @package.instance_values["core"])
|
|
101
|
+
assert_raise(NoMethodError) {@package.core = nil }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def test_app_accessor
|
|
105
|
+
assert_equal(@package.app, @package.instance_values["app"])
|
|
106
|
+
assert_raise(NoMethodError) {@package.app = nil }
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def test_use_shared_strings
|
|
110
|
+
assert_equal(@package.use_shared_strings, nil)
|
|
111
|
+
assert_raise(ArgumentError) {@package.use_shared_strings 9}
|
|
112
|
+
assert_nothing_raised {@package.use_shared_strings = true}
|
|
113
|
+
assert_equal(@package.use_shared_strings, @package.workbook.use_shared_strings)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def test_default_objects_are_created
|
|
117
|
+
assert(@package.instance_values["app"].is_a?(Axlsx::App), 'App object not created')
|
|
118
|
+
assert(@package.instance_values["core"].is_a?(Axlsx::Core), 'Core object not created')
|
|
119
|
+
assert(@package.workbook.is_a?(Axlsx::Workbook), 'Workbook object not created')
|
|
120
|
+
assert(Axlsx::Package.new.workbook.worksheets.size == 0, 'Workbook should not have sheets by default')
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def test_created_at_is_propagated_to_core
|
|
124
|
+
time = Time.utc(2013, 1, 1, 12, 0)
|
|
125
|
+
p = Axlsx::Package.new :created_at => time
|
|
126
|
+
assert_equal(time, p.core.created)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def test_serialization
|
|
130
|
+
@package.serialize(@fname)
|
|
131
|
+
assert_zip_file_matches_package(@fname, @package)
|
|
132
|
+
assert_created_with_rubyzip(@fname, @package)
|
|
133
|
+
File.delete(@fname)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def test_serialization_with_zip_command
|
|
137
|
+
@package.serialize(@fname, zip_command: "zip")
|
|
138
|
+
assert_zip_file_matches_package(@fname, @package)
|
|
139
|
+
assert_created_with_zip_command(@fname, @package)
|
|
140
|
+
File.delete(@fname)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def test_serialization_with_zip_command_and_absolute_path
|
|
144
|
+
fname = "#{Dir.tmpdir}/#{@fname}"
|
|
145
|
+
@package.serialize(fname, zip_command: "zip")
|
|
146
|
+
assert_zip_file_matches_package(fname, @package)
|
|
147
|
+
assert_created_with_zip_command(fname, @package)
|
|
148
|
+
File.delete(fname)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def test_serialization_with_invalid_zip_command
|
|
152
|
+
assert_raises Axlsx::ZipCommand::ZipError do
|
|
153
|
+
@package.serialize(@fname, zip_command: "invalid_zip")
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def assert_zip_file_matches_package(fname, package)
|
|
158
|
+
zf = Zip::File.open(fname)
|
|
159
|
+
package.send(:parts).each{ |part| zf.get_entry(part[:entry]) }
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def assert_created_with_rubyzip(fname, package)
|
|
163
|
+
assert_equal 2098, get_mtime(fname, package).year, "XLSX files created with RubyZip have 2098 as the file mtime"
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def assert_created_with_zip_command(fname, package)
|
|
167
|
+
assert_equal Time.now.utc.year, get_mtime(fname, package).year, "XLSX files created with a zip command have the current year as the file mtime"
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def get_mtime(fname, package)
|
|
171
|
+
zf = Zip::File.open(fname)
|
|
172
|
+
part = package.send(:parts).first
|
|
173
|
+
entry = zf.get_entry(part[:entry])
|
|
174
|
+
entry.mtime.utc
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def test_serialization_with_deprecated_argument
|
|
178
|
+
warnings = capture_warnings do
|
|
179
|
+
@package.serialize(@fname, false)
|
|
180
|
+
end
|
|
181
|
+
assert_equal 1, warnings.size
|
|
182
|
+
assert_includes warnings.first, "confirm_valid as a boolean is deprecated"
|
|
183
|
+
File.delete(@fname)
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def test_serialization_with_deprecated_three_arguments
|
|
187
|
+
warnings = capture_warnings do
|
|
188
|
+
@package.serialize(@fname, true, zip_command: "zip")
|
|
189
|
+
end
|
|
190
|
+
assert_zip_file_matches_package(@fname, @package)
|
|
191
|
+
assert_created_with_zip_command(@fname, @package)
|
|
192
|
+
assert_equal 2, warnings.size
|
|
193
|
+
assert_includes warnings.first, "with 3 arguments is deprecated"
|
|
194
|
+
File.delete(@fname)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def capture_warnings(&block)
|
|
198
|
+
original_warn = Kernel.instance_method(:warn)
|
|
199
|
+
warnings = []
|
|
200
|
+
Kernel.send(:define_method, :warn) { |string| warnings << string }
|
|
201
|
+
block.call
|
|
202
|
+
original_verbose = $VERBOSE
|
|
203
|
+
$VERBOSE = nil
|
|
204
|
+
Kernel.send(:define_method, :warn, original_warn)
|
|
205
|
+
$VERBOSE = original_verbose
|
|
206
|
+
warnings
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# See comment for Package#zip_entry_for_part
|
|
210
|
+
def test_serialization_creates_identical_files_at_any_time_if_created_at_is_set
|
|
211
|
+
@package.core.created = Time.now
|
|
212
|
+
zip_content_now = @package.to_stream.string
|
|
213
|
+
Timecop.travel(3600) do
|
|
214
|
+
zip_content_then = @package.to_stream.string
|
|
215
|
+
assert zip_content_then == zip_content_now, "zip files are not identical"
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def test_serialization_creates_identical_files_for_identical_packages
|
|
220
|
+
package_1, package_2 = 2.times.map do
|
|
221
|
+
Axlsx::Package.new(:created_at => Time.utc(2013, 1, 1)).tap do |p|
|
|
222
|
+
p.workbook.add_worksheet(:name => "Basic Worksheet") do |sheet|
|
|
223
|
+
sheet.add_row [1, 2, 3]
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
assert package_1.to_stream.string == package_2.to_stream.string, "zip files are not identical"
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def test_serialization_creates_files_with_excel_mime_type
|
|
231
|
+
assert_equal(Marcel::MimeType.for(@package.to_stream),
|
|
232
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def test_validation
|
|
236
|
+
assert_equal(@package.validate.size, 0, @package.validate)
|
|
237
|
+
Axlsx::Workbook.send(:class_variable_set, :@@date1904, 9900)
|
|
238
|
+
assert(@package.validate.size > 0)
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def test_parts
|
|
242
|
+
p = @package.send(:parts)
|
|
243
|
+
#all parts have an entry
|
|
244
|
+
assert_equal(p.select{ |part| part[:entry] =~ /_rels\/\.rels/ }.size, 1, "rels missing")
|
|
245
|
+
assert_equal(p.select{ |part| part[:entry] =~ /docProps\/core\.xml/ }.size, 1, "core missing")
|
|
246
|
+
assert_equal(p.select{ |part| part[:entry] =~ /docProps\/app\.xml/ }.size, 1, "app missing")
|
|
247
|
+
assert_equal(p.select{ |part| part[:entry] =~ /xl\/_rels\/workbook\.xml\.rels/ }.size, 1, "workbook rels missing")
|
|
248
|
+
assert_equal(p.select{ |part| part[:entry] =~ /xl\/workbook\.xml/ }.size, 1, "workbook missing")
|
|
249
|
+
assert_equal(p.select{ |part| part[:entry] =~ /\[Content_Types\]\.xml/ }.size, 1, "content types missing")
|
|
250
|
+
assert_equal(p.select{ |part| part[:entry] =~ /xl\/styles\.xml/ }.size, 1, "styles missin")
|
|
251
|
+
assert_equal(p.select{ |part| part[:entry] =~ /xl\/drawings\/_rels\/drawing\d\.xml\.rels/ }.size, @package.workbook.drawings.size, "one or more drawing rels missing")
|
|
252
|
+
assert_equal(p.select{ |part| part[:entry] =~ /xl\/drawings\/drawing\d\.xml/ }.size, @package.workbook.drawings.size, "one or more drawings missing")
|
|
253
|
+
assert_equal(p.select{ |part| part[:entry] =~ /xl\/charts\/chart\d\.xml/ }.size, @package.workbook.charts.size, "one or more charts missing")
|
|
254
|
+
assert_equal(p.select{ |part| part[:entry] =~ /xl\/worksheets\/sheet\d\.xml/ }.size, @package.workbook.worksheets.size, "one or more sheet missing")
|
|
255
|
+
assert_equal(p.select{ |part| part[:entry] =~ /xl\/worksheets\/_rels\/sheet\d\.xml\.rels/ }.size, @package.workbook.worksheets.size, "one or more sheet rels missing")
|
|
256
|
+
assert_equal(p.select{ |part| part[:entry] =~ /xl\/comments\d\.xml/ }.size, @package.workbook.worksheets.size, "one or more sheet rels missing")
|
|
257
|
+
assert_equal(p.select{ |part| part[:entry] =~ /xl\/pivotTables\/pivotTable\d\.xml/ }.size, @package.workbook.worksheets.first.pivot_tables.size, "one or more pivot tables missing")
|
|
258
|
+
assert_equal(p.select{ |part| part[:entry] =~ /xl\/pivotTables\/_rels\/pivotTable\d\.xml.rels/ }.size, @package.workbook.worksheets.first.pivot_tables.size, "one or more pivot tables rels missing")
|
|
259
|
+
assert_equal(p.select{ |part| part[:entry] =~ /xl\/pivotCache\/pivotCacheDefinition\d\.xml/ }.size, @package.workbook.worksheets.first.pivot_tables.size, "one or more pivot tables missing")
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
#no mystery parts
|
|
263
|
+
assert_equal(25, p.size)
|
|
264
|
+
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def test_shared_strings_requires_part
|
|
268
|
+
@package.use_shared_strings = true
|
|
269
|
+
@package.to_stream #ensure all cell_serializer paths are hit
|
|
270
|
+
p = @package.send(:parts)
|
|
271
|
+
assert_equal(p.select{ |part| part[:entry] =~/xl\/sharedStrings.xml/}.size, 1, "shared strings table missing")
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def test_workbook_is_a_workbook
|
|
275
|
+
assert @package.workbook.is_a? Axlsx::Workbook
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def test_base_content_types
|
|
279
|
+
ct = @package.send(:base_content_types)
|
|
280
|
+
assert(ct.select { |c| c.ContentType == Axlsx::RELS_CT }.size == 1, "rels content type missing")
|
|
281
|
+
assert(ct.select { |c| c.ContentType == Axlsx::XML_CT }.size == 1, "xml content type missing")
|
|
282
|
+
assert(ct.select { |c| c.ContentType == Axlsx::APP_CT }.size == 1, "app content type missing")
|
|
283
|
+
assert(ct.select { |c| c.ContentType == Axlsx::CORE_CT }.size == 1, "core content type missing")
|
|
284
|
+
assert(ct.select { |c| c.ContentType == Axlsx::STYLES_CT }.size == 1, "styles content type missing")
|
|
285
|
+
assert(ct.select { |c| c.ContentType == Axlsx::WORKBOOK_CT }.size == 1, "workbook content type missing")
|
|
286
|
+
assert(ct.size == 6)
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
def test_content_type_added_with_shared_strings
|
|
290
|
+
@package.use_shared_strings = true
|
|
291
|
+
ct = @package.send(:content_types)
|
|
292
|
+
assert(ct.select { |type| type.ContentType == Axlsx::SHARED_STRINGS_CT }.size == 1)
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
def test_name_to_indices
|
|
296
|
+
assert(Axlsx::name_to_indices('A1') == [0,0])
|
|
297
|
+
assert(Axlsx::name_to_indices('A100') == [0,99], 'needs to axcept rows that contain 0')
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
def test_to_stream
|
|
301
|
+
stream = @package.to_stream
|
|
302
|
+
assert(stream.is_a?(StringIO))
|
|
303
|
+
# this is just a roundabout guess for a package as it is build now
|
|
304
|
+
# in testing.
|
|
305
|
+
assert(stream.size > 80000)
|
|
306
|
+
# Stream (of zipped contents) should have appropriate default encoding
|
|
307
|
+
assert stream.string.valid_encoding?
|
|
308
|
+
assert_equal(stream.external_encoding, Encoding::ASCII_8BIT)
|
|
309
|
+
# Cached ids should be cleared
|
|
310
|
+
assert(Axlsx::Relationship.ids_cache.empty?)
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
def test_encrypt
|
|
314
|
+
# this is no where near close to ready yet
|
|
315
|
+
assert(@package.encrypt('your_mom.xlsxl', 'has a password') == false)
|
|
316
|
+
end
|
|
317
|
+
end
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
require 'tc_helper.rb'
|
|
2
|
-
class TestMimeTypeUtils < Test::Unit::TestCase
|
|
3
|
-
def setup
|
|
4
|
-
@test_img = File.dirname(__FILE__) + "/../fixtures/image1.jpeg"
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
def teardown
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def test_mime_type_utils
|
|
11
|
-
assert_equal(Axlsx::MimeTypeUtils::get_mime_type(@test_img), 'image/jpeg')
|
|
12
|
-
end
|
|
13
|
-
end
|
|
1
|
+
require 'tc_helper.rb'
|
|
2
|
+
class TestMimeTypeUtils < Test::Unit::TestCase
|
|
3
|
+
def setup
|
|
4
|
+
@test_img = File.dirname(__FILE__) + "/../fixtures/image1.jpeg"
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def teardown
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_mime_type_utils
|
|
11
|
+
assert_equal(Axlsx::MimeTypeUtils::get_mime_type(@test_img), 'image/jpeg')
|
|
12
|
+
end
|
|
13
|
+
end
|