caxlsx 3.2.0 → 3.4.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 (301) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -9
  3. data/.yardopts_guide +18 -18
  4. data/CHANGELOG.md +394 -354
  5. data/LICENSE +21 -21
  6. data/README.md +184 -168
  7. data/Rakefile +28 -29
  8. data/examples/generate.rb +15 -15
  9. data/lib/axlsx/content_type/abstract_content_type.rb +29 -32
  10. data/lib/axlsx/content_type/content_type.rb +22 -26
  11. data/lib/axlsx/content_type/default.rb +21 -25
  12. data/lib/axlsx/content_type/override.rb +21 -25
  13. data/lib/axlsx/doc_props/app.rb +230 -235
  14. data/lib/axlsx/doc_props/core.rb +34 -39
  15. data/lib/axlsx/drawing/area_chart.rb +96 -99
  16. data/lib/axlsx/drawing/area_series.rb +107 -110
  17. data/lib/axlsx/drawing/ax_data_source.rb +21 -26
  18. data/lib/axlsx/drawing/axes.rb +60 -61
  19. data/lib/axlsx/drawing/axis.rb +185 -190
  20. data/lib/axlsx/drawing/bar_3D_chart.rb +145 -148
  21. data/lib/axlsx/drawing/bar_chart.rb +135 -138
  22. data/lib/axlsx/drawing/bar_series.rb +91 -97
  23. data/lib/axlsx/drawing/bubble_chart.rb +56 -59
  24. data/lib/axlsx/drawing/bubble_series.rb +60 -63
  25. data/lib/axlsx/drawing/cat_axis.rb +80 -85
  26. data/lib/axlsx/drawing/chart.rb +294 -276
  27. data/lib/axlsx/drawing/d_lbls.rb +92 -90
  28. data/lib/axlsx/drawing/drawing.rb +163 -167
  29. data/lib/axlsx/drawing/graphic_frame.rb +51 -54
  30. data/lib/axlsx/drawing/hyperlink.rb +97 -100
  31. data/lib/axlsx/drawing/line_3D_chart.rb +64 -68
  32. data/lib/axlsx/drawing/line_chart.rb +96 -99
  33. data/lib/axlsx/drawing/line_series.rb +107 -110
  34. data/lib/axlsx/drawing/marker.rb +80 -84
  35. data/lib/axlsx/drawing/num_data.rb +47 -52
  36. data/lib/axlsx/drawing/num_data_source.rb +58 -62
  37. data/lib/axlsx/drawing/num_val.rb +31 -34
  38. data/lib/axlsx/drawing/one_cell_anchor.rb +97 -99
  39. data/lib/axlsx/drawing/pic.rb +244 -211
  40. data/lib/axlsx/drawing/picture_locking.rb +39 -42
  41. data/lib/axlsx/drawing/pie_3D_chart.rb +42 -47
  42. data/lib/axlsx/drawing/pie_series.rb +69 -74
  43. data/lib/axlsx/drawing/scaling.rb +57 -60
  44. data/lib/axlsx/drawing/scatter_chart.rb +71 -74
  45. data/lib/axlsx/drawing/scatter_series.rb +126 -129
  46. data/lib/axlsx/drawing/ser_axis.rb +41 -45
  47. data/lib/axlsx/drawing/series.rb +67 -69
  48. data/lib/axlsx/drawing/series_title.rb +23 -25
  49. data/lib/axlsx/drawing/str_data.rb +37 -42
  50. data/lib/axlsx/drawing/str_val.rb +31 -34
  51. data/lib/axlsx/drawing/title.rb +104 -97
  52. data/lib/axlsx/drawing/two_cell_anchor.rb +95 -97
  53. data/lib/axlsx/drawing/val_axis.rb +34 -37
  54. data/lib/axlsx/drawing/view_3D.rb +115 -115
  55. data/lib/axlsx/drawing/vml_drawing.rb +39 -42
  56. data/lib/axlsx/drawing/vml_shape.rb +63 -66
  57. data/lib/axlsx/package.rb +397 -388
  58. data/lib/axlsx/rels/relationship.rb +127 -130
  59. data/lib/axlsx/rels/relationships.rb +29 -32
  60. data/lib/axlsx/stylesheet/border.rb +70 -73
  61. data/lib/axlsx/stylesheet/border_pr.rb +69 -71
  62. data/lib/axlsx/stylesheet/cell_alignment.rb +124 -132
  63. data/lib/axlsx/stylesheet/cell_protection.rb +38 -41
  64. data/lib/axlsx/stylesheet/cell_style.rb +68 -72
  65. data/lib/axlsx/stylesheet/color.rb +77 -76
  66. data/lib/axlsx/stylesheet/dxf.rb +75 -79
  67. data/lib/axlsx/stylesheet/fill.rb +31 -35
  68. data/lib/axlsx/stylesheet/font.rb +157 -156
  69. data/lib/axlsx/stylesheet/gradient_fill.rb +101 -103
  70. data/lib/axlsx/stylesheet/gradient_stop.rb +36 -37
  71. data/lib/axlsx/stylesheet/num_fmt.rb +83 -86
  72. data/lib/axlsx/stylesheet/pattern_fill.rb +71 -73
  73. data/lib/axlsx/stylesheet/styles.rb +543 -494
  74. data/lib/axlsx/stylesheet/table_style.rb +51 -54
  75. data/lib/axlsx/stylesheet/table_style_element.rb +74 -77
  76. data/lib/axlsx/stylesheet/table_styles.rb +42 -46
  77. data/lib/axlsx/stylesheet/xf.rb +144 -147
  78. data/lib/axlsx/util/accessors.rb +62 -64
  79. data/lib/axlsx/util/constants.rb +414 -410
  80. data/lib/axlsx/util/mime_type_utils.rb +24 -11
  81. data/lib/axlsx/util/options_parser.rb +15 -16
  82. data/lib/axlsx/util/serialized_attributes.rb +88 -89
  83. data/lib/axlsx/util/simple_typed_list.rb +180 -179
  84. data/lib/axlsx/util/storage.rb +142 -146
  85. data/lib/axlsx/util/validators.rb +315 -312
  86. data/lib/axlsx/util/zip_command.rb +71 -73
  87. data/lib/axlsx/version.rb +4 -5
  88. data/lib/axlsx/workbook/defined_name.rb +129 -128
  89. data/lib/axlsx/workbook/defined_names.rb +20 -21
  90. data/lib/axlsx/workbook/shared_strings_table.rb +74 -77
  91. data/lib/axlsx/workbook/workbook.rb +430 -395
  92. data/lib/axlsx/workbook/workbook_view.rb +75 -80
  93. data/lib/axlsx/workbook/workbook_views.rb +20 -22
  94. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +78 -77
  95. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -94
  96. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +243 -244
  97. data/lib/axlsx/workbook/worksheet/border_creator.rb +79 -0
  98. data/lib/axlsx/workbook/worksheet/break.rb +32 -35
  99. data/lib/axlsx/workbook/worksheet/cell.rb +552 -506
  100. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +164 -164
  101. data/lib/axlsx/workbook/worksheet/cfvo.rb +60 -60
  102. data/lib/axlsx/workbook/worksheet/cfvos.rb +16 -18
  103. data/lib/axlsx/workbook/worksheet/col.rb +142 -145
  104. data/lib/axlsx/workbook/worksheet/col_breaks.rb +34 -35
  105. data/lib/axlsx/workbook/worksheet/color_scale.rb +108 -110
  106. data/lib/axlsx/workbook/worksheet/cols.rb +23 -23
  107. data/lib/axlsx/workbook/worksheet/comment.rb +90 -91
  108. data/lib/axlsx/workbook/worksheet/comments.rb +78 -82
  109. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +81 -82
  110. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +216 -220
  111. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +23 -25
  112. data/lib/axlsx/workbook/worksheet/data_bar.rb +127 -129
  113. data/lib/axlsx/workbook/worksheet/data_validation.rb +266 -246
  114. data/lib/axlsx/workbook/worksheet/data_validations.rb +25 -28
  115. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +28 -30
  116. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -64
  117. data/lib/axlsx/workbook/worksheet/header_footer.rb +51 -52
  118. data/lib/axlsx/workbook/worksheet/icon_set.rb +80 -81
  119. data/lib/axlsx/workbook/worksheet/merged_cells.rb +37 -37
  120. data/lib/axlsx/workbook/worksheet/outline_pr.rb +32 -33
  121. data/lib/axlsx/workbook/worksheet/page_margins.rb +97 -97
  122. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +42 -44
  123. data/lib/axlsx/workbook/worksheet/page_setup.rb +237 -240
  124. data/lib/axlsx/workbook/worksheet/pane.rb +138 -139
  125. data/lib/axlsx/workbook/worksheet/pivot_table.rb +332 -296
  126. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +63 -66
  127. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +23 -24
  128. data/lib/axlsx/workbook/worksheet/print_options.rb +38 -39
  129. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -47
  130. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +37 -37
  131. data/lib/axlsx/workbook/worksheet/rich_text.rb +53 -55
  132. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +266 -250
  133. data/lib/axlsx/workbook/worksheet/row.rb +173 -164
  134. data/lib/axlsx/workbook/worksheet/row_breaks.rb +32 -33
  135. data/lib/axlsx/workbook/worksheet/selection.rb +99 -101
  136. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +28 -29
  137. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -27
  138. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +18 -18
  139. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +87 -87
  140. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +117 -118
  141. data/lib/axlsx/workbook/worksheet/sheet_view.rb +206 -213
  142. data/lib/axlsx/workbook/worksheet/table.rb +100 -102
  143. data/lib/axlsx/workbook/worksheet/table_style_info.rb +48 -49
  144. data/lib/axlsx/workbook/worksheet/tables.rb +34 -34
  145. data/lib/axlsx/workbook/worksheet/worksheet.rb +857 -786
  146. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +58 -58
  147. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +59 -58
  148. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +73 -74
  149. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -38
  150. data/lib/axlsx.rb +218 -185
  151. data/lib/caxlsx.rb +1 -2
  152. data/lib/schema/dc.xsd +118 -118
  153. data/lib/schema/dcmitype.xsd +51 -51
  154. data/lib/schema/dcterms.xsd +331 -331
  155. data/lib/schema/dml-chartDrawing.xsd +146 -146
  156. data/lib/schema/dml-compatibility.xsd +14 -14
  157. data/lib/schema/dml-lockedCanvas.xsd +11 -11
  158. data/lib/schema/dml-main.xsd +3048 -3048
  159. data/lib/schema/dml-picture.xsd +23 -23
  160. data/lib/schema/dml-spreadsheetDrawing.xsd +185 -185
  161. data/lib/schema/dml-wordprocessingDrawing.xsd +185 -185
  162. data/lib/schema/shared-additionalCharacteristics.xsd +28 -28
  163. data/lib/schema/shared-bibliography.xsd +144 -144
  164. data/lib/schema/shared-commonSimpleTypes.xsd +166 -166
  165. data/lib/schema/shared-customXmlDataProperties.xsd +25 -25
  166. data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -18
  167. data/lib/schema/shared-documentPropertiesCustom.xsd +59 -59
  168. data/lib/schema/shared-documentPropertiesExtended.xsd +56 -56
  169. data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -195
  170. data/lib/schema/shared-relationshipReference.xsd +25 -25
  171. data/lib/schema/vml-main.xsd +569 -569
  172. data/lib/schema/vml-officeDrawing.xsd +509 -509
  173. data/lib/schema/vml-presentationDrawing.xsd +12 -12
  174. data/lib/schema/vml-spreadsheetDrawing.xsd +108 -108
  175. data/lib/schema/vml-wordprocessingDrawing.xsd +96 -96
  176. data/lib/schema/xml.xsd +116 -116
  177. metadata +5 -252
  178. data/test/benchmark.rb +0 -72
  179. data/test/content_type/tc_content_type.rb +0 -76
  180. data/test/content_type/tc_default.rb +0 -16
  181. data/test/content_type/tc_override.rb +0 -14
  182. data/test/doc_props/tc_app.rb +0 -43
  183. data/test/doc_props/tc_core.rb +0 -42
  184. data/test/drawing/tc_area_chart.rb +0 -39
  185. data/test/drawing/tc_area_series.rb +0 -71
  186. data/test/drawing/tc_axes.rb +0 -8
  187. data/test/drawing/tc_axis.rb +0 -112
  188. data/test/drawing/tc_bar_3D_chart.rb +0 -86
  189. data/test/drawing/tc_bar_chart.rb +0 -86
  190. data/test/drawing/tc_bar_series.rb +0 -46
  191. data/test/drawing/tc_bubble_chart.rb +0 -44
  192. data/test/drawing/tc_bubble_series.rb +0 -21
  193. data/test/drawing/tc_cat_axis.rb +0 -31
  194. data/test/drawing/tc_cat_axis_data.rb +0 -27
  195. data/test/drawing/tc_chart.rb +0 -123
  196. data/test/drawing/tc_d_lbls.rb +0 -57
  197. data/test/drawing/tc_data_source.rb +0 -23
  198. data/test/drawing/tc_drawing.rb +0 -80
  199. data/test/drawing/tc_graphic_frame.rb +0 -27
  200. data/test/drawing/tc_hyperlink.rb +0 -64
  201. data/test/drawing/tc_line_3d_chart.rb +0 -47
  202. data/test/drawing/tc_line_chart.rb +0 -39
  203. data/test/drawing/tc_line_series.rb +0 -71
  204. data/test/drawing/tc_marker.rb +0 -44
  205. data/test/drawing/tc_named_axis_data.rb +0 -27
  206. data/test/drawing/tc_num_data.rb +0 -31
  207. data/test/drawing/tc_num_val.rb +0 -29
  208. data/test/drawing/tc_one_cell_anchor.rb +0 -66
  209. data/test/drawing/tc_pic.rb +0 -103
  210. data/test/drawing/tc_picture_locking.rb +0 -72
  211. data/test/drawing/tc_pie_3D_chart.rb +0 -28
  212. data/test/drawing/tc_pie_series.rb +0 -33
  213. data/test/drawing/tc_scaling.rb +0 -36
  214. data/test/drawing/tc_scatter_chart.rb +0 -48
  215. data/test/drawing/tc_scatter_series.rb +0 -74
  216. data/test/drawing/tc_ser_axis.rb +0 -31
  217. data/test/drawing/tc_series.rb +0 -23
  218. data/test/drawing/tc_series_title.rb +0 -54
  219. data/test/drawing/tc_str_data.rb +0 -18
  220. data/test/drawing/tc_str_val.rb +0 -30
  221. data/test/drawing/tc_title.rb +0 -70
  222. data/test/drawing/tc_two_cell_anchor.rb +0 -36
  223. data/test/drawing/tc_val_axis.rb +0 -24
  224. data/test/drawing/tc_view_3D.rb +0 -54
  225. data/test/drawing/tc_vml_drawing.rb +0 -25
  226. data/test/drawing/tc_vml_shape.rb +0 -106
  227. data/test/fixtures/image1.gif +0 -0
  228. data/test/fixtures/image1.jpeg +0 -0
  229. data/test/fixtures/image1.jpg +0 -0
  230. data/test/fixtures/image1.png +0 -0
  231. data/test/fixtures/image1_fake.jpg +0 -0
  232. data/test/profile.rb +0 -24
  233. data/test/rels/tc_relationship.rb +0 -52
  234. data/test/rels/tc_relationships.rb +0 -37
  235. data/test/stylesheet/tc_border.rb +0 -37
  236. data/test/stylesheet/tc_border_pr.rb +0 -32
  237. data/test/stylesheet/tc_cell_alignment.rb +0 -81
  238. data/test/stylesheet/tc_cell_protection.rb +0 -29
  239. data/test/stylesheet/tc_cell_style.rb +0 -57
  240. data/test/stylesheet/tc_color.rb +0 -43
  241. data/test/stylesheet/tc_dxf.rb +0 -81
  242. data/test/stylesheet/tc_fill.rb +0 -18
  243. data/test/stylesheet/tc_font.rb +0 -133
  244. data/test/stylesheet/tc_gradient_fill.rb +0 -72
  245. data/test/stylesheet/tc_gradient_stop.rb +0 -31
  246. data/test/stylesheet/tc_num_fmt.rb +0 -30
  247. data/test/stylesheet/tc_pattern_fill.rb +0 -43
  248. data/test/stylesheet/tc_styles.rb +0 -309
  249. data/test/stylesheet/tc_table_style.rb +0 -44
  250. data/test/stylesheet/tc_table_style_element.rb +0 -45
  251. data/test/stylesheet/tc_table_styles.rb +0 -29
  252. data/test/stylesheet/tc_xf.rb +0 -120
  253. data/test/tc_axlsx.rb +0 -109
  254. data/test/tc_helper.rb +0 -10
  255. data/test/tc_package.rb +0 -317
  256. data/test/util/tc_mime_type_utils.rb +0 -13
  257. data/test/util/tc_serialized_attributes.rb +0 -19
  258. data/test/util/tc_simple_typed_list.rb +0 -77
  259. data/test/util/tc_validators.rb +0 -210
  260. data/test/workbook/tc_defined_name.rb +0 -49
  261. data/test/workbook/tc_shared_strings_table.rb +0 -59
  262. data/test/workbook/tc_workbook.rb +0 -165
  263. data/test/workbook/tc_workbook_view.rb +0 -50
  264. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +0 -38
  265. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +0 -76
  266. data/test/workbook/worksheet/auto_filter/tc_filters.rb +0 -50
  267. data/test/workbook/worksheet/tc_break.rb +0 -49
  268. data/test/workbook/worksheet/tc_cell.rb +0 -465
  269. data/test/workbook/worksheet/tc_cfvo.rb +0 -31
  270. data/test/workbook/worksheet/tc_col.rb +0 -93
  271. data/test/workbook/worksheet/tc_color_scale.rb +0 -58
  272. data/test/workbook/worksheet/tc_comment.rb +0 -72
  273. data/test/workbook/worksheet/tc_comments.rb +0 -57
  274. data/test/workbook/worksheet/tc_conditional_formatting.rb +0 -224
  275. data/test/workbook/worksheet/tc_data_bar.rb +0 -46
  276. data/test/workbook/worksheet/tc_data_validation.rb +0 -265
  277. data/test/workbook/worksheet/tc_date_time_converter.rb +0 -124
  278. data/test/workbook/worksheet/tc_header_footer.rb +0 -151
  279. data/test/workbook/worksheet/tc_icon_set.rb +0 -45
  280. data/test/workbook/worksheet/tc_outline_pr.rb +0 -19
  281. data/test/workbook/worksheet/tc_page_margins.rb +0 -97
  282. data/test/workbook/worksheet/tc_page_set_up_pr.rb +0 -15
  283. data/test/workbook/worksheet/tc_page_setup.rb +0 -143
  284. data/test/workbook/worksheet/tc_pane.rb +0 -54
  285. data/test/workbook/worksheet/tc_pivot_table.rb +0 -180
  286. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +0 -62
  287. data/test/workbook/worksheet/tc_print_options.rb +0 -72
  288. data/test/workbook/worksheet/tc_protected_range.rb +0 -17
  289. data/test/workbook/worksheet/tc_rich_text.rb +0 -44
  290. data/test/workbook/worksheet/tc_rich_text_run.rb +0 -173
  291. data/test/workbook/worksheet/tc_row.rb +0 -160
  292. data/test/workbook/worksheet/tc_selection.rb +0 -55
  293. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +0 -18
  294. data/test/workbook/worksheet/tc_sheet_format_pr.rb +0 -88
  295. data/test/workbook/worksheet/tc_sheet_pr.rb +0 -49
  296. data/test/workbook/worksheet/tc_sheet_protection.rb +0 -117
  297. data/test/workbook/worksheet/tc_sheet_view.rb +0 -214
  298. data/test/workbook/worksheet/tc_table.rb +0 -77
  299. data/test/workbook/worksheet/tc_table_style_info.rb +0 -53
  300. data/test/workbook/worksheet/tc_worksheet.rb +0 -632
  301. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +0 -55
@@ -1,11 +1,24 @@
1
- module Axlsx
2
- # This module defines some utils related with mime type detection
3
- module MimeTypeUtils
4
- # Detect a file mime type
5
- # @param [String] v File path
6
- # @return [String] File mime type
7
- def self.get_mime_type(v)
8
- Marcel::MimeType.for(Pathname.new(v))
9
- end
10
- end
11
- end
1
+ require 'open-uri'
2
+
3
+ module Axlsx
4
+ # This module defines some utils related with mime type detection
5
+ module MimeTypeUtils
6
+ # Detect a file mime type
7
+ # @param [String] v File path
8
+ # @return [String] File mime type
9
+ def self.get_mime_type(v)
10
+ Marcel::MimeType.for(Pathname.new(v))
11
+ end
12
+
13
+ # Detect a file mime type from URI
14
+ # @param [String] v URI
15
+ # @return [String] File mime type
16
+ def self.get_mime_type_from_uri(v)
17
+ if URI.respond_to?(:open)
18
+ Marcel::MimeType.for(URI.open(v))
19
+ else
20
+ Marcel::MimeType.for(URI.parse(v).open)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,16 +1,15 @@
1
- module Axlsx
2
- # This module defines a single method for parsing options in class
3
- # initializers.
4
- module OptionsParser
5
-
6
- # Parses an options hash by calling any defined method by the same
7
- # name of the key postfixed with an '='
8
- # @param [Hash] options Options to parse.
9
- def parse_options(options={})
10
- options.each do |key, value|
11
- key = :"#{key}="
12
- self.send(key, value) if !value.nil? && self.respond_to?(key)
13
- end
14
- end
15
- end
16
- end
1
+ module Axlsx
2
+ # This module defines a single method for parsing options in class
3
+ # initializers.
4
+ module OptionsParser
5
+ # Parses an options hash by calling any defined method by the same
6
+ # name of the key postfixed with an '='
7
+ # @param [Hash] options Options to parse.
8
+ def parse_options(options = {})
9
+ options.each do |key, value|
10
+ key = :"#{key}="
11
+ self.send(key, value) if !value.nil? && self.respond_to?(key)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,89 +1,88 @@
1
- module Axlsx
2
- # This module allows us to define a list of symbols defining which
3
- # attributes will be serialized for a class.
4
- module SerializedAttributes
5
-
6
- # Extend with class methods
7
- def self.included(base)
8
- base.send :extend, ClassMethods
9
- end
10
-
11
- # class methods applied to all includers
12
- module ClassMethods
13
-
14
- # This is the method to be used in inheriting classes to specify
15
- # which of the instance values are serializable
16
- def serializable_attributes(*symbols)
17
- @xml_attributes = symbols
18
- end
19
-
20
- # a reader for those attributes
21
- attr_reader :xml_attributes
22
-
23
- # This helper registers the attributes that will be formatted as elements.
24
- def serializable_element_attributes(*symbols)
25
- @xml_element_attributes = symbols
26
- end
27
-
28
- # attr reader for element attributes
29
- attr_reader :xml_element_attributes
30
- end
31
-
32
- # creates a XML tag with serialized attributes
33
- # @see SerializedAttributes#serialized_attributes
34
- def serialized_tag(tagname, str, additional_attributes = {}, &block)
35
- str << "<#{tagname} "
36
- serialized_attributes(str, additional_attributes)
37
- if block_given?
38
- str << '>'
39
- yield
40
- str << "</#{tagname}>"
41
- else
42
- str << '/>'
43
- end
44
- end
45
-
46
- # serializes the instance values of the defining object based on the
47
- # list of serializable attributes.
48
- # @param [String] str The string instance to append this
49
- # serialization to.
50
- # @param [Hash] additional_attributes An option key value hash for
51
- # defining values that are not serializable attributes list.
52
- def serialized_attributes(str = '', additional_attributes = {})
53
- attributes = declared_attributes.merge! additional_attributes
54
- attributes.each do |key, value|
55
- str << "#{Axlsx.camel(key, false)}=\"#{Axlsx.camel(Axlsx.booleanize(value), false)}\" "
56
- end
57
- str
58
- end
59
-
60
- # A hash of instance variables that have been declared with
61
- # seraialized_attributes and are not nil.
62
- # This requires ruby 1.9.3 or higher
63
- def declared_attributes
64
- instance_values.select do |key, value|
65
- value != nil && self.class.xml_attributes.include?(key.to_sym)
66
- end
67
- end
68
-
69
- # serialized instance values at text nodes on a camelized element of the
70
- # attribute name. You may pass in a block for evaluation against non nil
71
- # values. We use an array for element attributes becuase misordering will
72
- # break the xml and 1.8.7 does not support ordered hashes.
73
- # @param [String] str The string instance to which serialized data is appended
74
- # @param [Array] additional_attributes An array of additional attribute names.
75
- # @return [String] The serialized output.
76
- def serialized_element_attributes(str='', additional_attributes=[], &block)
77
- attrs = self.class.xml_element_attributes + additional_attributes
78
- values = instance_values
79
- attrs.each do |attribute_name|
80
- value = values[attribute_name.to_s]
81
- next if value.nil?
82
- value = yield value if block_given?
83
- element_name = Axlsx.camel(attribute_name, false)
84
- str << "<#{element_name}>#{value}</#{element_name}>"
85
- end
86
- str
87
- end
88
- end
89
- end
1
+ module Axlsx
2
+ # This module allows us to define a list of symbols defining which
3
+ # attributes will be serialized for a class.
4
+ module SerializedAttributes
5
+ # Extend with class methods
6
+ def self.included(base)
7
+ base.send :extend, ClassMethods
8
+ end
9
+
10
+ # class methods applied to all includers
11
+ module ClassMethods
12
+ # This is the method to be used in inheriting classes to specify
13
+ # which of the instance values are serializable
14
+ def serializable_attributes(*symbols)
15
+ @xml_attributes = symbols
16
+ end
17
+
18
+ # a reader for those attributes
19
+ attr_reader :xml_attributes
20
+
21
+ # This helper registers the attributes that will be formatted as elements.
22
+ def serializable_element_attributes(*symbols)
23
+ @xml_element_attributes = symbols
24
+ end
25
+
26
+ # attr reader for element attributes
27
+ attr_reader :xml_element_attributes
28
+ end
29
+
30
+ # creates a XML tag with serialized attributes
31
+ # @see SerializedAttributes#serialized_attributes
32
+ def serialized_tag(tagname, str, additional_attributes = {}, &block)
33
+ str << "<#{tagname} "
34
+ serialized_attributes(str, additional_attributes)
35
+ if block_given?
36
+ str << '>'
37
+ yield
38
+ str << "</#{tagname}>"
39
+ else
40
+ str << '/>'
41
+ end
42
+ end
43
+
44
+ # serializes the instance values of the defining object based on the
45
+ # list of serializable attributes.
46
+ # @param [String] str The string instance to append this
47
+ # serialization to.
48
+ # @param [Hash] additional_attributes An option key value hash for
49
+ # defining values that are not serializable attributes list.
50
+ def serialized_attributes(str = '', additional_attributes = {})
51
+ attributes = declared_attributes.merge! additional_attributes
52
+ attributes.each do |key, value|
53
+ str << "#{Axlsx.camel(key, false)}=\"#{Axlsx.camel(Axlsx.booleanize(value), false)}\" "
54
+ end
55
+ str
56
+ end
57
+
58
+ # A hash of instance variables that have been declared with
59
+ # seraialized_attributes and are not nil.
60
+ # This requires ruby 1.9.3 or higher
61
+ def declared_attributes
62
+ Axlsx.instance_values_for(self).select do |key, value|
63
+ value != nil && self.class.xml_attributes.include?(key.to_sym)
64
+ end
65
+ end
66
+
67
+ # serialized instance values at text nodes on a camelized element of the
68
+ # attribute name. You may pass in a block for evaluation against non nil
69
+ # values. We use an array for element attributes becuase misordering will
70
+ # break the xml and 1.8.7 does not support ordered hashes.
71
+ # @param [String] str The string instance to which serialized data is appended
72
+ # @param [Array] additional_attributes An array of additional attribute names.
73
+ # @return [String] The serialized output.
74
+ def serialized_element_attributes(str = '', additional_attributes = [], &block)
75
+ attrs = self.class.xml_element_attributes + additional_attributes
76
+ values = Axlsx.instance_values_for(self)
77
+ attrs.each do |attribute_name|
78
+ value = values[attribute_name.to_s]
79
+ next if value.nil?
80
+
81
+ value = yield value if block_given?
82
+ element_name = Axlsx.camel(attribute_name, false)
83
+ str << "<#{element_name}>#{value}</#{element_name}>"
84
+ end
85
+ str
86
+ end
87
+ end
88
+ end
@@ -1,179 +1,180 @@
1
- # encoding: UTF-8
2
- module Axlsx
3
-
4
- # A SimpleTypedList is a type restrictive collection that allows some of the methods from Array and supports basic xml serialization.
5
- # @private
6
- class SimpleTypedList
7
- # Creats a new typed list
8
- # @param [Array, Class] type An array of Class objects or a single Class object
9
- # @param [String] serialize_as The tag name to use in serialization
10
- # @raise [ArgumentError] if all members of type are not Class objects
11
- def initialize type, serialize_as=nil, start_size = 0
12
- if type.is_a? Array
13
- type.each { |item| raise ArgumentError, "All members of type must be Class objects" unless item.is_a? Class }
14
- @allowed_types = type
15
- else
16
- raise ArgumentError, "Type must be a Class object or array of Class objects" unless type.is_a? Class
17
- @allowed_types = [type]
18
- end
19
- @serialize_as = serialize_as unless serialize_as.nil?
20
- @list = Array.new(start_size)
21
- end
22
-
23
- # The class constants of allowed types
24
- # @return [Array]
25
- attr_reader :allowed_types
26
-
27
- # The index below which items cannot be removed
28
- # @return [Integer]
29
- def locked_at
30
- defined?(@locked_at) ? @locked_at : nil
31
- end
32
-
33
- # The tag name to use when serializing this object
34
- # by default the parent node for all items in the list is the classname of the first allowed type with the first letter in lowercase.
35
- # @return [String]
36
- attr_reader :serialize_as
37
-
38
- # Transposes the list (without blowing up like ruby does)
39
- # any non populated cell in the matrix will be a nil value
40
- def transpose
41
- return @list.clone if @list.size == 0
42
- row_count = @list.size
43
- max_column_count = @list.map{|row| row.cells.size}.max
44
- result = Array.new(max_column_count) { Array.new(row_count) }
45
- # yes, I know it is silly, but that warning is really annoying
46
- row_count.times do |row_index|
47
- max_column_count.times do |column_index|
48
- datum = if @list[row_index].cells.size >= max_column_count
49
- @list[row_index].cells[column_index]
50
- elsif block_given?
51
- yield(column_index, row_index)
52
- end
53
- result[column_index][row_index] = datum
54
- end
55
- end
56
- result
57
- end
58
-
59
- # Lock this list at the current size
60
- # @return [self]
61
- def lock
62
- @locked_at = @list.size
63
- self
64
- end
65
-
66
- # Unlock the list
67
- # @return [self]
68
- def unlock
69
- @locked_at = nil
70
- self
71
- end
72
-
73
- def to_ary
74
- @list
75
- end
76
-
77
- alias :to_a :to_ary
78
-
79
- # join operator
80
- # @param [Array] v the array to join
81
- # @raise [ArgumentError] if any of the values being joined are not
82
- # one of the allowed types
83
- # @return [SimpleTypedList]
84
- def +(v)
85
- v.each do |item|
86
- DataTypeValidator.validate :SimpleTypedList_plus, @allowed_types, item
87
- @list << item
88
- end
89
- end
90
-
91
- # Concat operator
92
- # @param [Any] v the data to be added
93
- # @raise [ArgumentError] if the value being added is not one fo the allowed types
94
- # @return [Integer] returns the index of the item added.
95
- def <<(v)
96
- DataTypeValidator.validate :SimpleTypedList_push, @allowed_types, v
97
- @list << v
98
- @list.size - 1
99
- end
100
-
101
- alias :push :<<
102
-
103
-
104
- # delete the item from the list
105
- # @param [Any] v The item to be deleted.
106
- # @raise [ArgumentError] if the item's index is protected by locking
107
- # @return [Any] The item deleted
108
- def delete(v)
109
- return unless include? v
110
- raise ArgumentError, "Item is protected and cannot be deleted" if protected? index(v)
111
- @list.delete v
112
- end
113
-
114
- # delete the item from the list at the index position provided
115
- # @raise [ArgumentError] if the index is protected by locking
116
- # @return [Any] The item deleted
117
- def delete_at(index)
118
- @list[index]
119
- raise ArgumentError, "Item is protected and cannot be deleted" if protected? index
120
- @list.delete_at index
121
- end
122
-
123
- # positional assignment. Adds the item at the index specified
124
- # @param [Integer] index
125
- # @param [Any] v
126
- # @raise [ArgumentError] if the index is protected by locking
127
- # @raise [ArgumentError] if the item is not one of the allowed types
128
- def []=(index, v)
129
- DataTypeValidator.validate :SimpleTypedList_insert, @allowed_types, v
130
- raise ArgumentError, "Item is protected and cannot be changed" if protected? index
131
- @list[index] = v
132
- v
133
- end
134
-
135
- # inserts an item at the index specfied
136
- # @param [Integer] index
137
- # @param [Any] v
138
- # @raise [ArgumentError] if the index is protected by locking
139
- # @raise [ArgumentError] if the index is not one of the allowed types
140
- def insert(index, v)
141
- DataTypeValidator.validate :SimpleTypedList_insert, @allowed_types, v
142
- raise ArgumentError, "Item is protected and cannot be changed" if protected? index
143
- @list.insert(index, v)
144
- v
145
- end
146
-
147
- # determines if the index is protected
148
- # @param [Integer] index
149
- def protected? index
150
- return false unless locked_at.is_a? Integer
151
- index < locked_at
152
- end
153
-
154
- DESTRUCTIVE = ['replace', 'insert', 'collect!', 'map!', 'pop', 'delete_if',
155
- 'reverse!', 'shift', 'shuffle!', 'slice!', 'sort!', 'uniq!',
156
- 'unshift', 'zip', 'flatten!', 'fill', 'drop', 'drop_while',
157
- 'delete_if', 'clear']
158
- DELEGATES = Array.instance_methods - self.instance_methods - DESTRUCTIVE
159
-
160
- DELEGATES.each do |method|
161
- class_eval %{
162
- def #{method}(*args, &block)
163
- @list.send(:#{method}, *args, &block)
164
- end
165
- }
166
- end
167
-
168
- def to_xml_string(str = '')
169
- classname = @allowed_types[0].name.split('::').last
170
- el_name = serialize_as.to_s || (classname[0,1].downcase + classname[1..-1])
171
- str << ('<' << el_name << ' count="' << size.to_s << '">')
172
- each { |item| item.to_xml_string(str) }
173
- str << ('</' << el_name << '>')
174
- end
175
-
176
- end
177
-
178
-
179
- end
1
+ module Axlsx
2
+ # A SimpleTypedList is a type restrictive collection that allows some of the methods from Array and supports basic xml serialization.
3
+ # @private
4
+ class SimpleTypedList
5
+ # Creats a new typed list
6
+ # @param [Array, Class] type An array of Class objects or a single Class object
7
+ # @param [String] serialize_as The tag name to use in serialization
8
+ # @raise [ArgumentError] if all members of type are not Class objects
9
+ def initialize type, serialize_as = nil, start_size = 0
10
+ if type.is_a? Array
11
+ type.each { |item| raise ArgumentError, "All members of type must be Class objects" unless item.is_a? Class }
12
+ @allowed_types = type
13
+ else
14
+ raise ArgumentError, "Type must be a Class object or array of Class objects" unless type.is_a? Class
15
+
16
+ @allowed_types = [type]
17
+ end
18
+ @serialize_as = serialize_as unless serialize_as.nil?
19
+ @list = Array.new(start_size)
20
+ end
21
+
22
+ # The class constants of allowed types
23
+ # @return [Array]
24
+ attr_reader :allowed_types
25
+
26
+ # The index below which items cannot be removed
27
+ # @return [Integer]
28
+ def locked_at
29
+ defined?(@locked_at) ? @locked_at : nil
30
+ end
31
+
32
+ # The tag name to use when serializing this object
33
+ # by default the parent node for all items in the list is the classname of the first allowed type with the first letter in lowercase.
34
+ # @return [String]
35
+ attr_reader :serialize_as
36
+
37
+ # Transposes the list (without blowing up like ruby does)
38
+ # any non populated cell in the matrix will be a nil value
39
+ def transpose
40
+ return @list.clone if @list.size == 0
41
+
42
+ row_count = @list.size
43
+ max_column_count = @list.map { |row| row.cells.size }.max
44
+ result = Array.new(max_column_count) { Array.new(row_count) }
45
+ # yes, I know it is silly, but that warning is really annoying
46
+ row_count.times do |row_index|
47
+ max_column_count.times do |column_index|
48
+ datum = if @list[row_index].cells.size >= max_column_count
49
+ @list[row_index].cells[column_index]
50
+ elsif block_given?
51
+ yield(column_index, row_index)
52
+ end
53
+ result[column_index][row_index] = datum
54
+ end
55
+ end
56
+ result
57
+ end
58
+
59
+ # Lock this list at the current size
60
+ # @return [self]
61
+ def lock
62
+ @locked_at = @list.size
63
+ self
64
+ end
65
+
66
+ # Unlock the list
67
+ # @return [self]
68
+ def unlock
69
+ @locked_at = nil
70
+ self
71
+ end
72
+
73
+ def to_ary
74
+ @list
75
+ end
76
+
77
+ alias :to_a :to_ary
78
+
79
+ # join operator
80
+ # @param [Array] v the array to join
81
+ # @raise [ArgumentError] if any of the values being joined are not
82
+ # one of the allowed types
83
+ # @return [SimpleTypedList]
84
+ def +(v)
85
+ v.each do |item|
86
+ DataTypeValidator.validate :SimpleTypedList_plus, @allowed_types, item
87
+ @list << item
88
+ end
89
+ end
90
+
91
+ # Concat operator
92
+ # @param [Any] v the data to be added
93
+ # @raise [ArgumentError] if the value being added is not one fo the allowed types
94
+ # @return [Integer] returns the index of the item added.
95
+ def <<(v)
96
+ DataTypeValidator.validate :SimpleTypedList_push, @allowed_types, v
97
+ @list << v
98
+ @list.size - 1
99
+ end
100
+
101
+ alias :push :<<
102
+
103
+ # delete the item from the list
104
+ # @param [Any] v The item to be deleted.
105
+ # @raise [ArgumentError] if the item's index is protected by locking
106
+ # @return [Any] The item deleted
107
+ def delete(v)
108
+ return unless include? v
109
+ raise ArgumentError, "Item is protected and cannot be deleted" if protected? index(v)
110
+
111
+ @list.delete v
112
+ end
113
+
114
+ # delete the item from the list at the index position provided
115
+ # @raise [ArgumentError] if the index is protected by locking
116
+ # @return [Any] The item deleted
117
+ def delete_at(index)
118
+ @list[index]
119
+ raise ArgumentError, "Item is protected and cannot be deleted" if protected? index
120
+
121
+ @list.delete_at index
122
+ end
123
+
124
+ # positional assignment. Adds the item at the index specified
125
+ # @param [Integer] index
126
+ # @param [Any] v
127
+ # @raise [ArgumentError] if the index is protected by locking
128
+ # @raise [ArgumentError] if the item is not one of the allowed types
129
+ def []=(index, v)
130
+ DataTypeValidator.validate :SimpleTypedList_insert, @allowed_types, v
131
+ raise ArgumentError, "Item is protected and cannot be changed" if protected? index
132
+
133
+ @list[index] = v
134
+ v
135
+ end
136
+
137
+ # inserts an item at the index specfied
138
+ # @param [Integer] index
139
+ # @param [Any] v
140
+ # @raise [ArgumentError] if the index is protected by locking
141
+ # @raise [ArgumentError] if the index is not one of the allowed types
142
+ def insert(index, v)
143
+ DataTypeValidator.validate :SimpleTypedList_insert, @allowed_types, v
144
+ raise ArgumentError, "Item is protected and cannot be changed" if protected? index
145
+
146
+ @list.insert(index, v)
147
+ v
148
+ end
149
+
150
+ # determines if the index is protected
151
+ # @param [Integer] index
152
+ def protected? index
153
+ return false unless locked_at.is_a? Integer
154
+
155
+ index < locked_at
156
+ end
157
+
158
+ DESTRUCTIVE = ['replace', 'insert', 'collect!', 'map!', 'pop', 'delete_if',
159
+ 'reverse!', 'shift', 'shuffle!', 'slice!', 'sort!', 'uniq!',
160
+ 'unshift', 'zip', 'flatten!', 'fill', 'drop', 'drop_while',
161
+ 'delete_if', 'clear']
162
+ DELEGATES = Array.instance_methods - self.instance_methods - DESTRUCTIVE
163
+
164
+ DELEGATES.each do |method|
165
+ class_eval %{
166
+ def #{method}(*args, &block)
167
+ @list.send(:#{method}, *args, &block)
168
+ end
169
+ }
170
+ end
171
+
172
+ def to_xml_string(str = '')
173
+ classname = @allowed_types[0].name.split('::').last
174
+ el_name = serialize_as.to_s || (classname[0, 1].downcase + classname[1..-1])
175
+ str << ('<' << el_name << ' count="' << size.to_s << '">')
176
+ each { |item| item.to_xml_string(str) }
177
+ str << ('</' << el_name << '>')
178
+ end
179
+ end
180
+ end