caxlsx 3.4.1 → 4.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 (151) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -1
  3. data/README.md +9 -11
  4. data/Rakefile +7 -5
  5. data/lib/axlsx/content_type/abstract_content_type.rb +9 -4
  6. data/lib/axlsx/content_type/content_type.rb +7 -5
  7. data/lib/axlsx/content_type/default.rb +4 -2
  8. data/lib/axlsx/content_type/override.rb +4 -2
  9. data/lib/axlsx/doc_props/app.rb +26 -24
  10. data/lib/axlsx/doc_props/core.rb +8 -6
  11. data/lib/axlsx/drawing/area_chart.rb +10 -8
  12. data/lib/axlsx/drawing/area_series.rb +12 -10
  13. data/lib/axlsx/drawing/ax_data_source.rb +2 -0
  14. data/lib/axlsx/drawing/axes.rb +6 -4
  15. data/lib/axlsx/drawing/axis.rb +21 -19
  16. data/lib/axlsx/drawing/bar_3D_chart.rb +14 -12
  17. data/lib/axlsx/drawing/bar_chart.rb +13 -11
  18. data/lib/axlsx/drawing/bar_series.rb +8 -6
  19. data/lib/axlsx/drawing/bubble_chart.rb +6 -4
  20. data/lib/axlsx/drawing/bubble_series.rb +8 -6
  21. data/lib/axlsx/drawing/cat_axis.rb +12 -10
  22. data/lib/axlsx/drawing/chart.rb +20 -18
  23. data/lib/axlsx/drawing/d_lbls.rb +7 -5
  24. data/lib/axlsx/drawing/drawing.rb +58 -56
  25. data/lib/axlsx/drawing/graphic_frame.rb +6 -4
  26. data/lib/axlsx/drawing/hyperlink.rb +10 -8
  27. data/lib/axlsx/drawing/line_3D_chart.rb +7 -5
  28. data/lib/axlsx/drawing/line_chart.rb +10 -8
  29. data/lib/axlsx/drawing/line_series.rb +12 -10
  30. data/lib/axlsx/drawing/marker.rb +9 -7
  31. data/lib/axlsx/drawing/num_data.rb +9 -7
  32. data/lib/axlsx/drawing/num_data_source.rb +9 -7
  33. data/lib/axlsx/drawing/num_val.rb +7 -5
  34. data/lib/axlsx/drawing/one_cell_anchor.rb +7 -5
  35. data/lib/axlsx/drawing/pic.rb +16 -14
  36. data/lib/axlsx/drawing/picture_locking.rb +3 -1
  37. data/lib/axlsx/drawing/pie_3D_chart.rb +5 -3
  38. data/lib/axlsx/drawing/pie_series.rb +8 -6
  39. data/lib/axlsx/drawing/scaling.rb +8 -6
  40. data/lib/axlsx/drawing/scatter_chart.rb +7 -5
  41. data/lib/axlsx/drawing/scatter_series.rb +14 -12
  42. data/lib/axlsx/drawing/ser_axis.rb +7 -5
  43. data/lib/axlsx/drawing/series.rb +6 -4
  44. data/lib/axlsx/drawing/series_title.rb +6 -4
  45. data/lib/axlsx/drawing/str_data.rb +7 -5
  46. data/lib/axlsx/drawing/str_val.rb +6 -4
  47. data/lib/axlsx/drawing/title.rb +13 -14
  48. data/lib/axlsx/drawing/two_cell_anchor.rb +4 -2
  49. data/lib/axlsx/drawing/val_axis.rb +4 -2
  50. data/lib/axlsx/drawing/view_3D.rb +9 -7
  51. data/lib/axlsx/drawing/vml_drawing.rb +18 -16
  52. data/lib/axlsx/drawing/vml_shape.rb +24 -22
  53. data/lib/axlsx/package.rb +69 -66
  54. data/lib/axlsx/rels/relationship.rb +10 -5
  55. data/lib/axlsx/rels/relationships.rb +5 -3
  56. data/lib/axlsx/stylesheet/border.rb +6 -4
  57. data/lib/axlsx/stylesheet/border_pr.rb +5 -3
  58. data/lib/axlsx/stylesheet/cell_alignment.rb +12 -10
  59. data/lib/axlsx/stylesheet/cell_protection.rb +5 -3
  60. data/lib/axlsx/stylesheet/cell_style.rb +10 -8
  61. data/lib/axlsx/stylesheet/color.rb +9 -7
  62. data/lib/axlsx/stylesheet/dxf.rb +5 -3
  63. data/lib/axlsx/stylesheet/fill.rb +3 -1
  64. data/lib/axlsx/stylesheet/font.rb +18 -16
  65. data/lib/axlsx/stylesheet/gradient_fill.rb +6 -4
  66. data/lib/axlsx/stylesheet/gradient_stop.rb +6 -4
  67. data/lib/axlsx/stylesheet/num_fmt.rb +8 -10
  68. data/lib/axlsx/stylesheet/pattern_fill.rb +5 -3
  69. data/lib/axlsx/stylesheet/styles.rb +69 -71
  70. data/lib/axlsx/stylesheet/table_style.rb +7 -5
  71. data/lib/axlsx/stylesheet/table_style_element.rb +6 -4
  72. data/lib/axlsx/stylesheet/table_styles.rb +6 -4
  73. data/lib/axlsx/stylesheet/xf.rb +18 -16
  74. data/lib/axlsx/util/accessors.rb +4 -2
  75. data/lib/axlsx/util/buffered_zip_output_stream.rb +60 -0
  76. data/lib/axlsx/util/constants.rb +117 -104
  77. data/lib/axlsx/util/mime_type_utils.rb +3 -5
  78. data/lib/axlsx/util/options_parser.rb +3 -1
  79. data/lib/axlsx/util/serialized_attributes.rb +42 -17
  80. data/lib/axlsx/util/simple_typed_list.rb +47 -47
  81. data/lib/axlsx/util/storage.rb +11 -10
  82. data/lib/axlsx/util/validators.rb +101 -41
  83. data/lib/axlsx/util/zip_command.rb +10 -10
  84. data/lib/axlsx/version.rb +3 -1
  85. data/lib/axlsx/workbook/defined_name.rb +6 -4
  86. data/lib/axlsx/workbook/defined_names.rb +3 -1
  87. data/lib/axlsx/workbook/shared_strings_table.rb +8 -6
  88. data/lib/axlsx/workbook/workbook.rb +78 -76
  89. data/lib/axlsx/workbook/workbook_view.rb +3 -1
  90. data/lib/axlsx/workbook/workbook_views.rb +3 -1
  91. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +65 -8
  92. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +7 -3
  93. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +11 -7
  94. data/lib/axlsx/workbook/worksheet/auto_filter/sort_condition.rb +51 -0
  95. data/lib/axlsx/workbook/worksheet/auto_filter/sort_state.rb +56 -0
  96. data/lib/axlsx/workbook/worksheet/border_creator.rb +5 -3
  97. data/lib/axlsx/workbook/worksheet/break.rb +3 -1
  98. data/lib/axlsx/workbook/worksheet/cell.rb +53 -54
  99. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +31 -27
  100. data/lib/axlsx/workbook/worksheet/cfvo.rb +5 -3
  101. data/lib/axlsx/workbook/worksheet/cfvos.rb +3 -1
  102. data/lib/axlsx/workbook/worksheet/col.rb +5 -3
  103. data/lib/axlsx/workbook/worksheet/col_breaks.rb +5 -3
  104. data/lib/axlsx/workbook/worksheet/color_scale.rb +12 -10
  105. data/lib/axlsx/workbook/worksheet/cols.rb +3 -1
  106. data/lib/axlsx/workbook/worksheet/comment.rb +8 -6
  107. data/lib/axlsx/workbook/worksheet/comments.rb +6 -4
  108. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +9 -4
  109. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +18 -16
  110. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +3 -1
  111. data/lib/axlsx/workbook/worksheet/data_bar.rb +14 -13
  112. data/lib/axlsx/workbook/worksheet/data_validation.rb +30 -28
  113. data/lib/axlsx/workbook/worksheet/data_validations.rb +3 -1
  114. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +7 -5
  115. data/lib/axlsx/workbook/worksheet/dimension.rb +4 -2
  116. data/lib/axlsx/workbook/worksheet/header_footer.rb +4 -2
  117. data/lib/axlsx/workbook/worksheet/icon_set.rb +23 -6
  118. data/lib/axlsx/workbook/worksheet/merged_cells.rb +5 -5
  119. data/lib/axlsx/workbook/worksheet/outline_pr.rb +6 -2
  120. data/lib/axlsx/workbook/worksheet/page_margins.rb +15 -10
  121. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +6 -2
  122. data/lib/axlsx/workbook/worksheet/page_setup.rb +11 -9
  123. data/lib/axlsx/workbook/worksheet/pane.rb +11 -9
  124. data/lib/axlsx/workbook/worksheet/pivot_table.rb +20 -19
  125. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +8 -6
  126. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +2 -0
  127. data/lib/axlsx/workbook/worksheet/print_options.rb +3 -1
  128. data/lib/axlsx/workbook/worksheet/protected_range.rb +3 -1
  129. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +5 -3
  130. data/lib/axlsx/workbook/worksheet/rich_text.rb +3 -1
  131. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +16 -14
  132. data/lib/axlsx/workbook/worksheet/row.rb +6 -7
  133. data/lib/axlsx/workbook/worksheet/row_breaks.rb +6 -4
  134. data/lib/axlsx/workbook/worksheet/selection.rb +9 -7
  135. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +6 -2
  136. data/lib/axlsx/workbook/worksheet/sheet_data.rb +3 -1
  137. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +6 -2
  138. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +8 -4
  139. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +10 -8
  140. data/lib/axlsx/workbook/worksheet/sheet_view.rb +15 -13
  141. data/lib/axlsx/workbook/worksheet/table.rb +9 -7
  142. data/lib/axlsx/workbook/worksheet/table_style_info.rb +4 -2
  143. data/lib/axlsx/workbook/worksheet/tables.rb +3 -1
  144. data/lib/axlsx/workbook/worksheet/worksheet.rb +38 -37
  145. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +4 -2
  146. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +8 -2
  147. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +6 -4
  148. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +4 -2
  149. data/lib/axlsx.rb +56 -42
  150. data/lib/caxlsx.rb +3 -1
  151. metadata +49 -43
@@ -1,12 +1,33 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Axlsx
2
4
  # A SimpleTypedList is a type restrictive collection that allows some of the methods from Array and supports basic xml serialization.
3
5
  # @private
4
- class SimpleTypedList
6
+ class SimpleTypedList < Array
7
+ DESTRUCTIVE = [
8
+ 'replace', 'insert', 'collect!', 'map!', 'pop', 'delete_if',
9
+ 'reverse!', 'shift', 'shuffle!', 'slice!', 'sort!', 'uniq!',
10
+ 'unshift', 'zip', 'flatten!', 'fill', 'drop', 'drop_while',
11
+ 'clear'
12
+ ].freeze
13
+
14
+ DESTRUCTIVE.each do |name|
15
+ undef_method name
16
+ end
17
+
18
+ # We often call index(element) on instances of SimpleTypedList. Thus, we do not want to inherit Array
19
+ # implementation of == / eql? which walks the elements calling == / eql?. Instead we want the fast
20
+ # and original versions from BasicObject.
21
+ alias :== :equal?
22
+ alias :eql? :equal?
23
+
5
24
  # Creats a new typed list
6
25
  # @param [Array, Class] type An array of Class objects or a single Class object
7
26
  # @param [String] serialize_as The tag name to use in serialization
8
27
  # @raise [ArgumentError] if all members of type are not Class objects
9
- def initialize type, serialize_as = nil, start_size = 0
28
+ def initialize(type, serialize_as = nil, start_size = 0)
29
+ super(start_size)
30
+
10
31
  if type.is_a? Array
11
32
  type.each { |item| raise ArgumentError, "All members of type must be Class objects" unless item.is_a? Class }
12
33
  @allowed_types = type
@@ -16,7 +37,6 @@ module Axlsx
16
37
  @allowed_types = [type]
17
38
  end
18
39
  @serialize_as = serialize_as unless serialize_as.nil?
19
- @list = Array.new(start_size)
20
40
  end
21
41
 
22
42
  # The class constants of allowed types
@@ -37,16 +57,16 @@ module Axlsx
37
57
  # Transposes the list (without blowing up like ruby does)
38
58
  # any non populated cell in the matrix will be a nil value
39
59
  def transpose
40
- return @list.clone if @list.size == 0
60
+ return clone if size.zero?
41
61
 
42
- row_count = @list.size
43
- max_column_count = @list.map { |row| row.cells.size }.max
62
+ row_count = size
63
+ max_column_count = map { |row| row.cells.size }.max
44
64
  result = Array.new(max_column_count) { Array.new(row_count) }
45
65
  # yes, I know it is silly, but that warning is really annoying
46
66
  row_count.times do |row_index|
47
67
  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]
68
+ datum = if self[row_index].cells.size >= max_column_count
69
+ self[row_index].cells[column_index]
50
70
  elsif block_given?
51
71
  yield(column_index, row_index)
52
72
  end
@@ -59,7 +79,7 @@ module Axlsx
59
79
  # Lock this list at the current size
60
80
  # @return [self]
61
81
  def lock
62
- @locked_at = @list.size
82
+ @locked_at = size
63
83
  self
64
84
  end
65
85
 
@@ -70,22 +90,16 @@ module Axlsx
70
90
  self
71
91
  end
72
92
 
73
- def to_ary
74
- @list
75
- end
76
-
77
- alias :to_a :to_ary
78
-
79
93
  # join operator
80
- # @param [Array] v the array to join
94
+ # @param [Array] other the array to join
81
95
  # @raise [ArgumentError] if any of the values being joined are not
82
96
  # one of the allowed types
83
97
  # @return [SimpleTypedList]
84
- def +(v)
85
- v.each do |item|
86
- DataTypeValidator.validate :SimpleTypedList_plus, @allowed_types, item
87
- @list << item
98
+ def +(other)
99
+ other.each do |item|
100
+ self << item
88
101
  end
102
+ super
89
103
  end
90
104
 
91
105
  # Concat operator
@@ -94,8 +108,8 @@ module Axlsx
94
108
  # @return [Integer] returns the index of the item added.
95
109
  def <<(v)
96
110
  DataTypeValidator.validate :SimpleTypedList_push, @allowed_types, v
97
- @list << v
98
- @list.size - 1
111
+ super
112
+ size - 1
99
113
  end
100
114
 
101
115
  alias :push :<<
@@ -108,17 +122,16 @@ module Axlsx
108
122
  return unless include? v
109
123
  raise ArgumentError, "Item is protected and cannot be deleted" if protected? index(v)
110
124
 
111
- @list.delete v
125
+ super
112
126
  end
113
127
 
114
128
  # delete the item from the list at the index position provided
115
129
  # @raise [ArgumentError] if the index is protected by locking
116
130
  # @return [Any] The item deleted
117
131
  def delete_at(index)
118
- @list[index]
119
132
  raise ArgumentError, "Item is protected and cannot be deleted" if protected? index
120
133
 
121
- @list.delete_at index
134
+ super
122
135
  end
123
136
 
124
137
  # positional assignment. Adds the item at the index specified
@@ -126,12 +139,12 @@ module Axlsx
126
139
  # @param [Any] v
127
140
  # @raise [ArgumentError] if the index is protected by locking
128
141
  # @raise [ArgumentError] if the item is not one of the allowed types
142
+ # @return [Any] The item added
129
143
  def []=(index, v)
130
144
  DataTypeValidator.validate :SimpleTypedList_insert, @allowed_types, v
131
145
  raise ArgumentError, "Item is protected and cannot be changed" if protected? index
132
146
 
133
- @list[index] = v
134
- v
147
+ super
135
148
  end
136
149
 
137
150
  # inserts an item at the index specfied
@@ -139,42 +152,29 @@ module Axlsx
139
152
  # @param [Any] v
140
153
  # @raise [ArgumentError] if the index is protected by locking
141
154
  # @raise [ArgumentError] if the index is not one of the allowed types
155
+ # @return [Any] The item inserted
142
156
  def insert(index, v)
143
157
  DataTypeValidator.validate :SimpleTypedList_insert, @allowed_types, v
144
158
  raise ArgumentError, "Item is protected and cannot be changed" if protected? index
145
159
 
146
- @list.insert(index, v)
160
+ super
147
161
  v
148
162
  end
149
163
 
150
164
  # determines if the index is protected
151
165
  # @param [Integer] index
152
- def protected? index
166
+ def protected?(index)
153
167
  return false unless locked_at.is_a? Integer
154
168
 
155
169
  index < locked_at
156
170
  end
157
171
 
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 = '')
172
+ def to_xml_string(str = +'')
173
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 << '">')
174
+ el_name = serialize_as.to_s || (classname[0, 1].downcase + classname[1..])
175
+ str << '<' << el_name << ' count="' << size.to_s << '">'
176
176
  each { |item| item.to_xml_string(str) }
177
- str << ('</' << el_name << '>')
177
+ str << '</' << el_name << '>'
178
178
  end
179
179
  end
180
180
  end
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Axlsx
2
4
  # The Storage class represents a storage object or stream in a compound file.
3
5
  class Storage
4
6
  # Packing for the Storage when pushing an array of items into a byte stream
5
7
  # Name, name length, type, color, left sibling, right sibling, child, classid, state, created, modified, sector, size
6
- PACKING = "s32 s1 c2 l3 x16 x4 q2 l q".freeze
8
+ PACKING = "s32 s1 c2 l3 x16 x4 q2 l q"
7
9
 
8
10
  # storage types
9
11
  TYPES = {
10
- :root => 5,
11
- :stream => 2,
12
- :storage => 1
12
+ root: 5,
13
+ stream: 2,
14
+ storage: 1
13
15
  }.freeze
14
16
 
15
17
  # Creates a byte string for this storage
@@ -31,9 +33,9 @@ module Axlsx
31
33
 
32
34
  # storage colors
33
35
  COLORS = {
34
- :red => 0,
35
- :black => 1
36
- }
36
+ red: 0,
37
+ black: 1
38
+ }.freeze
37
39
 
38
40
  # The color of this node in the directory tree. Defaults to black if not specified
39
41
  # @return [Integer] color
@@ -61,7 +63,6 @@ module Axlsx
61
63
  def name=(v)
62
64
  @name = v.bytes.to_a << 0
63
65
  @name_size = @name.size * 2
64
- @name
65
66
  end
66
67
 
67
68
  # The size of the stream
@@ -74,7 +75,7 @@ module Axlsx
74
75
  # @param [String] v The data for this storages stream
75
76
  # @return [Array]
76
77
  def data=(v)
77
- Axlsx::validate_string(v)
78
+ Axlsx.validate_string(v)
78
79
  self.type = TYPES[:stream] unless @type
79
80
  @size = v.size
80
81
  @data = v.bytes.to_a
@@ -132,7 +133,7 @@ module Axlsx
132
133
  @left = @right = @child = -1
133
134
  @sector = @size = @created = @modified = 0
134
135
  options.each do |o|
135
- self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
136
+ send("#{o[0]}=", o[1]) if respond_to? "#{o[0]}="
136
137
  end
137
138
  @color ||= COLORS[:black]
138
139
  @type ||= (data.nil? ? TYPES[:storage] : TYPES[:stream])
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Axlsx
2
4
  # Validate a value against a specific list of allowed values.
3
5
  class RestrictionValidator
@@ -8,7 +10,7 @@ module Axlsx
8
10
  # @raise [ArgumentError] Raised if the value provided is not in the list of choices.
9
11
  # @return [Boolean] true if validation succeeds.
10
12
  def self.validate(name, choices, v)
11
- raise ArgumentError, (ERR_RESTRICTION % [v.to_s, name, choices.inspect]) unless choices.include?(v)
13
+ raise ArgumentError, format(ERR_RESTRICTION, v.to_s, name, choices.inspect) unless choices.include?(v)
12
14
 
13
15
  true
14
16
  end
@@ -29,7 +31,7 @@ module Axlsx
29
31
  else
30
32
  min < value && value < max
31
33
  end
32
- raise ArgumentError, (ERR_RANGE % [value.inspect, min.to_s, max.to_s, inclusive]) unless passes
34
+ raise ArgumentError, format(ERR_RANGE, value.inspect, min.to_s, max.to_s, inclusive) unless passes
33
35
  end
34
36
  end
35
37
 
@@ -39,7 +41,7 @@ module Axlsx
39
41
  # @param [Regexp] regex The regular expression to evaluate
40
42
  # @param [Any] v The value to validate.
41
43
  def self.validate(name, regex, v)
42
- raise ArgumentError, (ERR_REGEX % [v.inspect, regex.to_s]) unless (v.respond_to?(:to_s) && v.to_s.match(regex))
44
+ raise ArgumentError, format(ERR_REGEX, v.inspect, regex.to_s) unless v.respond_to?(:to_s) && regex.match?(v.to_s)
43
45
  end
44
46
  end
45
47
 
@@ -53,14 +55,14 @@ module Axlsx
53
55
  # @return [Boolean] true if validation succeeds.
54
56
  # @see validate_boolean
55
57
  def self.validate(name, types, v, other = false)
56
- if other.is_a?(Proc)
57
- raise ArgumentError, (ERR_TYPE % [v.inspect, name, types.inspect]) unless other.call(v)
58
+ if other.is_a?(Proc) && !other.call(v)
59
+ raise ArgumentError, format(ERR_TYPE, v.inspect, name, types.inspect)
58
60
  end
61
+
59
62
  v_class = v.is_a?(Class) ? v : v.class
60
- Array(types).each do |t|
61
- return if v_class <= t
62
- end
63
- raise ArgumentError, (ERR_TYPE % [v.inspect, name, types.inspect])
63
+ return if Array(types).any? { |t| v_class <= t }
64
+
65
+ raise ArgumentError, format(ERR_TYPE, v.inspect, name, types.inspect)
64
66
  end
65
67
  end
66
68
 
@@ -68,7 +70,7 @@ module Axlsx
68
70
  # @para, [Any] v the value to validate
69
71
  # @raise [ArgumentError] raised if the value cannot be converted to an integer
70
72
  def self.validate_integerish(v)
71
- raise ArgumentError, (ERR_INTEGERISH % v.inspect) unless (v.respond_to?(:to_i) && v.to_i.is_a?(Integer))
73
+ raise ArgumentError, format(ERR_INTEGERISH, v.inspect) unless v.respond_to?(:to_i) && v.to_i.is_a?(Integer)
72
74
  end
73
75
 
74
76
  # Requires that the value is between -54000000 and 54000000
@@ -76,11 +78,11 @@ module Axlsx
76
78
  # @raise [ArgumentError] raised if the value cannot be converted to an integer between the allowed angle values for chart label rotation.
77
79
  # @return [Boolean] true if the data is valid
78
80
  def self.validate_angle(v)
79
- raise ArgumentError, (ERR_ANGLE % v.inspect) unless (v.to_i >= -5400000 && v.to_i <= 5400000)
81
+ raise ArgumentError, format(ERR_ANGLE, v.inspect) unless v.to_i >= -5400000 && v.to_i <= 5400000
80
82
  end
81
83
 
82
84
  # Validates an unsigned intger
83
- UINT_VALIDATOR = lambda { |arg| arg.respond_to?(:>=) && arg >= 0 }
85
+ UINT_VALIDATOR = ->(arg) { arg.respond_to?(:>=) && arg >= 0 }
84
86
 
85
87
  # Requires that the value is a Integer and is greater or equal to 0
86
88
  # @param [Any] v The value validated
@@ -104,12 +106,16 @@ module Axlsx
104
106
  DataTypeValidator.validate :signed_int, Integer, v
105
107
  end
106
108
 
109
+ VALID_BOOLEAN_CLASSES = [TrueClass, FalseClass, Integer, String, Symbol].freeze
110
+ VALID_BOOLEAN_VALUES = [true, false, 1, 0, '1', '0', 'true', 'false', :true, :false].freeze
111
+ BOOLEAN_VALIDATOR = ->(arg) { VALID_BOOLEAN_VALUES.include?(arg) }
112
+
107
113
  # Requires that the value is a form that can be evaluated as a boolean in an xml document.
108
114
  # The value must be an instance of String, Integer, Symbol, TrueClass or FalseClass and
109
115
  # it must be one of 0, 1, "true", "false", :true, :false, true, false, "0", or "1"
110
116
  # @param [Any] v The value validated
111
117
  def self.validate_boolean(v)
112
- DataTypeValidator.validate(:boolean, [String, Integer, Symbol, TrueClass, FalseClass], v, lambda { |arg| [0, 1, "true", "false", :true, :false, true, false, "0", "1"].include?(arg) })
118
+ DataTypeValidator.validate(:boolean, VALID_BOOLEAN_CLASSES, v, BOOLEAN_VALIDATOR)
113
119
  end
114
120
 
115
121
  # Requires that the value is a String
@@ -130,53 +136,71 @@ module Axlsx
130
136
  RegexValidator.validate "number_with_unit", /\A[0-9]+(\.[0-9]+)?(mm|cm|in|pt|pc|pi)\Z/, v
131
137
  end
132
138
 
139
+ SCALE_10_400_VALIDATOR = ->(arg) { arg >= 10 && arg <= 400 }
140
+
133
141
  # Requires that the value is an integer ranging from 10 to 400.
134
142
  def self.validate_scale_10_400(v)
135
- DataTypeValidator.validate "page_scale", Integer, v, lambda { |arg| arg >= 10 && arg <= 400 }
143
+ DataTypeValidator.validate "page_scale", Integer, v, SCALE_10_400_VALIDATOR
136
144
  end
137
145
 
146
+ SCALE_0_10_400_VALIDATOR = ->(arg) { arg == 0 || (arg >= 10 && arg <= 400) }
147
+
138
148
  # Requires that the value is an integer ranging from 10 to 400 or 0.
139
149
  def self.validate_scale_0_10_400(v)
140
- DataTypeValidator.validate "page_scale", Integer, v, lambda { |arg| arg == 0 || (arg >= 10 && arg <= 400) }
150
+ DataTypeValidator.validate "page_scale", Integer, v, SCALE_0_10_400_VALIDATOR
141
151
  end
142
152
 
153
+ VALID_PAGE_ORIENTATION_VALUES = [:default, :landscape, :portrait].freeze
154
+
143
155
  # Requires that the value is one of :default, :landscape, or :portrait.
144
156
  def self.validate_page_orientation(v)
145
- RestrictionValidator.validate "page_orientation", [:default, :landscape, :portrait], v
157
+ RestrictionValidator.validate "page_orientation", VALID_PAGE_ORIENTATION_VALUES, v
146
158
  end
147
159
 
160
+ VALID_CELL_U_VALUES = [:none, :single, :double, :singleAccounting, :doubleAccounting].freeze
161
+
148
162
  # Requires that the value is one of :none, :single, :double, :singleAccounting, :doubleAccounting
149
163
  def self.validate_cell_u(v)
150
- RestrictionValidator.validate "cell run style u", [:none, :single, :double, :singleAccounting, :doubleAccounting], v
164
+ RestrictionValidator.validate "cell run style u", VALID_CELL_U_VALUES, v
151
165
  end
152
166
 
167
+ VALID_FAMILY_VALUES = (1..5).freeze
168
+
153
169
  # validates cell style family which must be between 1 and 5
154
170
  def self.validate_family(v)
155
- RestrictionValidator.validate "cell run style family", 1..5, v
171
+ RestrictionValidator.validate "cell run style family", VALID_FAMILY_VALUES, v
156
172
  end
157
173
 
174
+ VALID_PATTERN_TYPE_VALUES = [:none, :solid, :mediumGray, :darkGray, :lightGray, :darkHorizontal, :darkVertical, :darkDown, :darkUp, :darkGrid,
175
+ :darkTrellis, :lightHorizontal, :lightVertical, :lightDown, :lightUp, :lightGrid, :lightTrellis, :gray125, :gray0625].freeze
176
+
158
177
  # Requires that the value is valid pattern type.
159
178
  # valid pattern types must be one of :none, :solid, :mediumGray, :darkGray, :lightGray, :darkHorizontal, :darkVertical, :darkDown,
160
179
  # :darkUp, :darkGrid, :darkTrellis, :lightHorizontal, :lightVertical, :lightDown, :lightUp, :lightGrid, :lightTrellis, :gray125, or :gray0625.
161
180
  # @param [Any] v The value validated
162
181
  def self.validate_pattern_type(v)
163
- RestrictionValidator.validate :pattern_type, [:none, :solid, :mediumGray, :darkGray, :lightGray, :darkHorizontal, :darkVertical, :darkDown, :darkUp, :darkGrid,
164
- :darkTrellis, :lightHorizontal, :lightVertical, :lightDown, :lightUp, :lightGrid, :lightTrellis, :gray125, :gray0625], v
182
+ RestrictionValidator.validate :pattern_type, VALID_PATTERN_TYPE_VALUES, v
165
183
  end
166
184
 
185
+ VALID_TIME_PERIOD_TYPE_VALUES = [:today, :yesterday, :tomorrow, :last7Days, :thisMonth, :lastMonth, :nextMonth, :thisWeek, :lastWeek, :nextWeek].freeze
186
+
167
187
  # Requires that the value is one of the ST_TimePeriod types
168
188
  # valid time period types are today, yesterday, tomorrow, last7Days,
169
189
  # thisMonth, lastMonth, nextMonth, thisWeek, lastWeek, nextWeek
170
190
  def self.validate_time_period_type(v)
171
- RestrictionValidator.validate :time_period_type, [:today, :yesterday, :tomorrow, :last7Days, :thisMonth, :lastMonth, :nextMonth, :thisWeek, :lastWeek, :nextWeek], v
191
+ RestrictionValidator.validate :time_period_type, VALID_TIME_PERIOD_TYPE_VALUES, v
172
192
  end
173
193
 
194
+ VALID_ICON_SET_VALUES = ["3Arrows", "3ArrowsGray", "3Flags", "3TrafficLights1", "3TrafficLights2", "3Signs", "3Symbols", "3Symbols2", "4Arrows", "4ArrowsGray", "4RedToBlack", "4Rating", "4TrafficLights", "5Arrows", "5ArrowsGray", "5Rating", "5Quarters"].freeze
195
+
174
196
  # Requires that the value is one of the valid ST_IconSet types
175
197
  # Allowed values are: 3Arrows, 3ArrowsGray, 3Flags, 3TrafficLights1, 3TrafficLights2, 3Signs, 3Symbols, 3Symbols2, 4Arrows, 4ArrowsGray, 4RedToBlack, 4Rating, 4TrafficLights, 5Arrows, 5ArrowsGray, 5Rating, 5Quarters
176
198
  def self.validate_icon_set(v)
177
- RestrictionValidator.validate :iconSet, ["3Arrows", "3ArrowsGray", "3Flags", "3TrafficLights1", "3TrafficLights2", "3Signs", "3Symbols", "3Symbols2", "4Arrows", "4ArrowsGray", "4RedToBlack", "4Rating", "4TrafficLights", "5Arrows", "5ArrowsGray", "5Rating", "5Quarters"], v
199
+ RestrictionValidator.validate :iconSet, VALID_ICON_SET_VALUES, v
178
200
  end
179
201
 
202
+ VALID_CONDITIONAL_FORMATTING_TYPE_VALUES = [:expression, :cellIs, :colorScale, :dataBar, :iconSet, :top10, :uniqueValues, :duplicateValues, :containsText, :notContainsText, :beginsWith, :endsWith, :containsBlanks, :notContainsBlanks, :containsErrors, :notContainsErrors, :timePeriod, :aboveAverage].freeze
203
+
180
204
  # Requires that the value is valid conditional formatting type.
181
205
  # valid types must be one of expression, cellIs, colorScale,
182
206
  # dataBar, iconSet, top10, uniqueValues, duplicateValues,
@@ -185,131 +209,167 @@ module Axlsx
185
209
  # notContainsErrors, timePeriod, aboveAverage
186
210
  # @param [Any] v The value validated
187
211
  def self.validate_conditional_formatting_type(v)
188
- RestrictionValidator.validate :conditional_formatting_type, [:expression, :cellIs, :colorScale, :dataBar, :iconSet, :top10, :uniqueValues, :duplicateValues, :containsText, :notContainsText, :beginsWith, :endsWith, :containsBlanks, :notContainsBlanks, :containsErrors, :notContainsErrors, :timePeriod, :aboveAverage], v
212
+ RestrictionValidator.validate :conditional_formatting_type, VALID_CONDITIONAL_FORMATTING_TYPE_VALUES, v
189
213
  end
190
214
 
215
+ VALID_CONDITION_FORMATTING_VALUE_OBJECT_TYPE_VALUES = [:num, :percent, :max, :min, :formula, :percentile].freeze
216
+
191
217
  # Requires thatt he value is a valid conditional formatting value object type.
192
218
  # valid types must be one of num, percent, max, min, formula and percentile
193
219
  def self.validate_conditional_formatting_value_object_type(v)
194
- RestrictionValidator.validate :conditional_formatting_value_object_type, [:num, :percent, :max, :min, :formula, :percentile], v
220
+ RestrictionValidator.validate :conditional_formatting_value_object_type, VALID_CONDITION_FORMATTING_VALUE_OBJECT_TYPE_VALUES, v
195
221
  end
196
222
 
223
+ VALID_CONDITIONAL_FORMATTING_OPERATOR_VALUES = [:lessThan, :lessThanOrEqual, :equal, :notEqual, :greaterThanOrEqual, :greaterThan, :between, :notBetween, :containsText, :notContains, :beginsWith, :endsWith].freeze
224
+
197
225
  # Requires that the value is valid conditional formatting operator.
198
226
  # valid operators must be one of lessThan, lessThanOrEqual, equal,
199
227
  # notEqual, greaterThanOrEqual, greaterThan, between, notBetween,
200
228
  # containsText, notContains, beginsWith, endsWith
201
229
  # @param [Any] v The value validated
202
230
  def self.validate_conditional_formatting_operator(v)
203
- RestrictionValidator.validate :conditional_formatting_type, [:lessThan, :lessThanOrEqual, :equal, :notEqual, :greaterThanOrEqual, :greaterThan, :between, :notBetween, :containsText, :notContains, :beginsWith, :endsWith], v
231
+ RestrictionValidator.validate :conditional_formatting_type, VALID_CONDITIONAL_FORMATTING_OPERATOR_VALUES, v
204
232
  end
205
233
 
234
+ VALID_GRADIENT_TYPE_VALUES = [:linear, :path].freeze
235
+
206
236
  # Requires that the value is a gradient_type.
207
237
  # valid types are :linear and :path
208
238
  # @param [Any] v The value validated
209
239
  def self.validate_gradient_type(v)
210
- RestrictionValidator.validate :gradient_type, [:linear, :path], v
240
+ RestrictionValidator.validate :gradient_type, VALID_GRADIENT_TYPE_VALUES, v
211
241
  end
212
242
 
243
+ VALID_SCATTER_STYLE_VALUES = [:none, :line, :lineMarker, :marker, :smooth, :smoothMarker].freeze
244
+
213
245
  # Requires that the value is a valid scatterStyle
214
246
  # must be one of :none | :line | :lineMarker | :marker | :smooth | :smoothMarker
215
247
  # must be one of "none" | "line" | "lineMarker" | "marker" | "smooth" | "smoothMarker"
216
248
  # @param [Symbol|String] v the value to validate
217
249
  def self.validate_scatter_style(v)
218
- Axlsx::RestrictionValidator.validate "ScatterChart.scatterStyle", [:none, :line, :lineMarker, :marker, :smooth, :smoothMarker], v.to_sym
250
+ Axlsx::RestrictionValidator.validate "ScatterChart.scatterStyle", VALID_SCATTER_STYLE_VALUES, v.to_sym
219
251
  end
220
252
 
253
+ VALID_HORIZONTAL_ALIGNMENT_VALUES = [:general, :left, :center, :right, :fill, :justify, :centerContinuous, :distributed].freeze
254
+
221
255
  # Requires that the value is a valid horizontal_alignment
222
256
  # :general, :left, :center, :right, :fill, :justify, :centerContinuous, :distributed are allowed
223
257
  # @param [Any] v The value validated
224
258
  def self.validate_horizontal_alignment(v)
225
- RestrictionValidator.validate :horizontal_alignment, [:general, :left, :center, :right, :fill, :justify, :centerContinuous, :distributed], v
259
+ RestrictionValidator.validate :horizontal_alignment, VALID_HORIZONTAL_ALIGNMENT_VALUES, v
226
260
  end
227
261
 
262
+ VALID_VERTICAL_ALIGNMENT_VALUES = [:top, :center, :bottom, :justify, :distributed].freeze
263
+
228
264
  # Requires that the value is a valid vertical_alignment
229
265
  # :top, :center, :bottom, :justify, :distributed are allowed
230
266
  # @param [Any] v The value validated
231
267
  def self.validate_vertical_alignment(v)
232
- RestrictionValidator.validate :vertical_alignment, [:top, :center, :bottom, :justify, :distributed], v
268
+ RestrictionValidator.validate :vertical_alignment, VALID_VERTICAL_ALIGNMENT_VALUES, v
233
269
  end
234
270
 
271
+ VALID_CONTENT_TYPE_VALUES = [TABLE_CT, WORKBOOK_CT, APP_CT, RELS_CT, STYLES_CT, XML_CT, WORKSHEET_CT, SHARED_STRINGS_CT, CORE_CT, CHART_CT, JPEG_CT, GIF_CT, PNG_CT, DRAWING_CT, COMMENT_CT, VML_DRAWING_CT, PIVOT_TABLE_CT, PIVOT_TABLE_CACHE_DEFINITION_CT].freeze
272
+
235
273
  # Requires that the value is a valid content_type
236
274
  # TABLE_CT, WORKBOOK_CT, APP_CT, RELS_CT, STYLES_CT, XML_CT, WORKSHEET_CT, SHARED_STRINGS_CT, CORE_CT, CHART_CT, DRAWING_CT, COMMENT_CT are allowed
237
275
  # @param [Any] v The value validated
238
276
  def self.validate_content_type(v)
239
- RestrictionValidator.validate :content_type, [TABLE_CT, WORKBOOK_CT, APP_CT, RELS_CT, STYLES_CT, XML_CT, WORKSHEET_CT, SHARED_STRINGS_CT, CORE_CT, CHART_CT, JPEG_CT, GIF_CT, PNG_CT, DRAWING_CT, COMMENT_CT, VML_DRAWING_CT, PIVOT_TABLE_CT, PIVOT_TABLE_CACHE_DEFINITION_CT], v
277
+ RestrictionValidator.validate :content_type, VALID_CONTENT_TYPE_VALUES, v
240
278
  end
241
279
 
280
+ VALID_RELATIONSHIP_TYPE_VALUES = [XML_NS_R, TABLE_R, WORKBOOK_R, WORKSHEET_R, APP_R, RELS_R, CORE_R, STYLES_R, CHART_R, DRAWING_R, IMAGE_R, HYPERLINK_R, SHARED_STRINGS_R, COMMENT_R, VML_DRAWING_R, COMMENT_R_NULL, PIVOT_TABLE_R, PIVOT_TABLE_CACHE_DEFINITION_R].freeze
281
+
242
282
  # Requires that the value is a valid relationship_type
243
283
  # XML_NS_R, TABLE_R, WORKBOOK_R, WORKSHEET_R, APP_R, RELS_R, CORE_R, STYLES_R, CHART_R, DRAWING_R, IMAGE_R, HYPERLINK_R, SHARED_STRINGS_R are allowed
244
284
  # @param [Any] v The value validated
245
285
  def self.validate_relationship_type(v)
246
- RestrictionValidator.validate :relationship_type, [XML_NS_R, TABLE_R, WORKBOOK_R, WORKSHEET_R, APP_R, RELS_R, CORE_R, STYLES_R, CHART_R, DRAWING_R, IMAGE_R, HYPERLINK_R, SHARED_STRINGS_R, COMMENT_R, VML_DRAWING_R, COMMENT_R_NULL, PIVOT_TABLE_R, PIVOT_TABLE_CACHE_DEFINITION_R], v
286
+ RestrictionValidator.validate :relationship_type, VALID_RELATIONSHIP_TYPE_VALUES, v
247
287
  end
248
288
 
289
+ VALID_TABLE_ELEMENT_TYPE_VALUES = [:wholeTable, :headerRow, :totalRow, :firstColumn, :lastColumn, :firstRowStripe, :secondRowStripe, :firstColumnStripe, :secondColumnStripe, :firstHeaderCell, :lastHeaderCell, :firstTotalCell, :lastTotalCell, :firstSubtotalColumn, :secondSubtotalColumn, :thirdSubtotalColumn, :firstSubtotalRow, :secondSubtotalRow, :thirdSubtotalRow, :blankRow, :firstColumnSubheading, :secondColumnSubheading, :thirdColumnSubheading, :firstRowSubheading, :secondRowSubheading, :thirdRowSubheading, :pageFieldLabels, :pageFieldValues].freeze
290
+
249
291
  # Requires that the value is a valid table element type
250
292
  # :wholeTable, :headerRow, :totalRow, :firstColumn, :lastColumn, :firstRowStripe, :secondRowStripe, :firstColumnStripe, :secondColumnStripe, :firstHeaderCell, :lastHeaderCell, :firstTotalCell, :lastTotalCell, :firstSubtotalColumn, :secondSubtotalColumn, :thirdSubtotalColumn, :firstSubtotalRow, :secondSubtotalRow, :thirdSubtotalRow, :blankRow, :firstColumnSubheading, :secondColumnSubheading, :thirdColumnSubheading, :firstRowSubheading, :secondRowSubheading, :thirdRowSubheading, :pageFieldLabels, :pageFieldValues are allowed
251
293
  # @param [Any] v The value validated
252
294
  def self.validate_table_element_type(v)
253
- RestrictionValidator.validate :table_element_type, [:wholeTable, :headerRow, :totalRow, :firstColumn, :lastColumn, :firstRowStripe, :secondRowStripe, :firstColumnStripe, :secondColumnStripe, :firstHeaderCell, :lastHeaderCell, :firstTotalCell, :lastTotalCell, :firstSubtotalColumn, :secondSubtotalColumn, :thirdSubtotalColumn, :firstSubtotalRow, :secondSubtotalRow, :thirdSubtotalRow, :blankRow, :firstColumnSubheading, :secondColumnSubheading, :thirdColumnSubheading, :firstRowSubheading, :secondRowSubheading, :thirdRowSubheading, :pageFieldLabels, :pageFieldValues], v
295
+ RestrictionValidator.validate :table_element_type, VALID_TABLE_ELEMENT_TYPE_VALUES, v
254
296
  end
255
297
 
298
+ VALID_DATA_VALIDATION_ERROR_STYLE_VALUES = [:information, :stop, :warning].freeze
299
+
256
300
  # Requires that the value is a valid data_validation_error_style
257
301
  # :information, :stop, :warning
258
302
  # @param [Any] v The value validated
259
303
  def self.validate_data_validation_error_style(v)
260
- RestrictionValidator.validate :validate_data_validation_error_style, [:information, :stop, :warning], v
304
+ RestrictionValidator.validate :validate_data_validation_error_style, VALID_DATA_VALIDATION_ERROR_STYLE_VALUES, v
261
305
  end
262
306
 
307
+ VALID_DATA_VALIDATION_OPERATOR_VALUES = [:lessThan, :lessThanOrEqual, :equal, :notEqual, :greaterThanOrEqual, :greaterThan, :between, :notBetween].freeze
308
+
263
309
  # Requires that the value is valid data validation operator.
264
310
  # valid operators must be one of lessThan, lessThanOrEqual, equal,
265
311
  # notEqual, greaterThanOrEqual, greaterThan, between, notBetween
266
312
  # @param [Any] v The value validated
267
313
  def self.validate_data_validation_operator(v)
268
- RestrictionValidator.validate :data_validation_operator, [:lessThan, :lessThanOrEqual, :equal, :notEqual, :greaterThanOrEqual, :greaterThan, :between, :notBetween], v
314
+ RestrictionValidator.validate :data_validation_operator, VALID_DATA_VALIDATION_OPERATOR_VALUES, v
269
315
  end
270
316
 
317
+ VALID_DATA_VALIDATION_TYPE_VALUES = [:custom, :data, :decimal, :list, :none, :textLength, :date, :time, :whole].freeze
318
+
271
319
  # Requires that the value is valid data validation type.
272
320
  # valid types must be one of custom, data, decimal, list, none, textLength, time, whole
273
321
  # @param [Any] v The value validated
274
322
  def self.validate_data_validation_type(v)
275
- RestrictionValidator.validate :data_validation_type, [:custom, :data, :decimal, :list, :none, :textLength, :date, :time, :whole], v
323
+ RestrictionValidator.validate :data_validation_type, VALID_DATA_VALIDATION_TYPE_VALUES, v
276
324
  end
277
325
 
326
+ VALID_SHEET_VIEW_TYPE_VALUES = [:normal, :page_break_preview, :page_layout].freeze
327
+
278
328
  # Requires that the value is a valid sheet view type.
279
329
  # valid types must be one of normal, page_break_preview, page_layout
280
330
  # @param [Any] v The value validated
281
331
  def self.validate_sheet_view_type(v)
282
- RestrictionValidator.validate :sheet_view_type, [:normal, :page_break_preview, :page_layout], v
332
+ RestrictionValidator.validate :sheet_view_type, VALID_SHEET_VIEW_TYPE_VALUES, v
283
333
  end
284
334
 
335
+ VALID_PANE_TYPE_VALUES = [:bottom_left, :bottom_right, :top_left, :top_right].freeze
336
+
285
337
  # Requires that the value is a valid active pane type.
286
338
  # valid types must be one of bottom_left, bottom_right, top_left, top_right
287
339
  # @param [Any] v The value validated
288
340
  def self.validate_pane_type(v)
289
- RestrictionValidator.validate :active_pane_type, [:bottom_left, :bottom_right, :top_left, :top_right], v
341
+ RestrictionValidator.validate :active_pane_type, VALID_PANE_TYPE_VALUES, v
290
342
  end
291
343
 
344
+ VALID_SPLIT_STATE_TYPE_VALUES = [:frozen, :frozen_split, :split].freeze
345
+
292
346
  # Requires that the value is a valid split state type.
293
347
  # valid types must be one of frozen, frozen_split, split
294
348
  # @param [Any] v The value validated
295
349
  def self.validate_split_state_type(v)
296
- RestrictionValidator.validate :split_state_type, [:frozen, :frozen_split, :split], v
350
+ RestrictionValidator.validate :split_state_type, VALID_SPLIT_STATE_TYPE_VALUES, v
297
351
  end
298
352
 
353
+ VALID_DISPLAY_BLANK_AS_VALUES = [:gap, :span, :zero].freeze
354
+
299
355
  # Requires that the value is a valid "display blanks as" type.
300
356
  # valid types must be one of gap, span, zero
301
357
  # @param [Any] v The value validated
302
358
  def self.validate_display_blanks_as(v)
303
- RestrictionValidator.validate :display_blanks_as, [:gap, :span, :zero], v
359
+ RestrictionValidator.validate :display_blanks_as, VALID_DISPLAY_BLANK_AS_VALUES, v
304
360
  end
305
361
 
362
+ VALID_VIEW_VISIBILITY_VALUES = [:visible, :hidden, :very_hidden].freeze
363
+
306
364
  # Requires that the value is one of :visible, :hidden, :very_hidden
307
365
  def self.validate_view_visibility(v)
308
- RestrictionValidator.validate :visibility, [:visible, :hidden, :very_hidden], v
366
+ RestrictionValidator.validate :visibility, VALID_VIEW_VISIBILITY_VALUES, v
309
367
  end
310
368
 
369
+ VALID_MARKER_SYMBOL_VALUES = [:default, :circle, :dash, :diamond, :dot, :picture, :plus, :square, :star, :triangle, :x].freeze
370
+
311
371
  # Requires that the value is one of :default, :circle, :dash, :diamond, :dot, :picture, :plus, :square, :star, :triangle, :x
312
372
  def self.validate_marker_symbol(v)
313
- RestrictionValidator.validate :marker_symbol, [:default, :circle, :dash, :diamond, :dot, :picture, :plus, :square, :star, :triangle, :x], v
373
+ RestrictionValidator.validate :marker_symbol, VALID_MARKER_SYMBOL_VALUES, v
314
374
  end
315
375
  end