rspreadsheet 0.4.8 → 0.4.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: b2c92247a04812100d02a3145ee69d112aa434b6ea2365c6f416a7be5d399eef
4
- data.tar.gz: 728f3fb25da67aa9cd4b31f5d1ddec687b9ddc7bc749f6baefe4bb926048b2ca
2
+ SHA1:
3
+ metadata.gz: e7334a14b9121a8cfefe62a271f865b0be259f32
4
+ data.tar.gz: b76797efc38071ebc4d2120eb051e220f45e3657
5
5
  SHA512:
6
- metadata.gz: 73dc5875e271ff2fd0e67997ced78078538147d8beeec3c2d61e3eb2bcde0f60a3b80a758f1e1e396c76347fea2bfe1d1db0a727c13d75f8e01218291010a5b3
7
- data.tar.gz: 637a92a312e621f4482499bfb27235ffcdb57e8a936834b7f492024b67284a8b89884429c6eaf40cb94a67b523a6b52f7b4479c6d1f672e649635c5ec551ef89
6
+ metadata.gz: 456b8b7240c21d4bcc6c4faa82775c46310517e26e7051025ddfb852bceff1375860d7c2b350e36fd92c183ba8019228d8e7ba2db7319d581a61f95b91118118
7
+ data.tar.gz: a28c423ecb3a1e9b8644a7dfcf6c6f063a817d9a710edb80388a050e0738b0dd421783ab940987023725223af8d618df3753537b89c98478c169cf3da78e1f14
data/GUIDE.md CHANGED
@@ -43,6 +43,9 @@ workbook.save(any_io_object) # file can be saved to any IO like object as
43
43
  ### Date and Time
44
44
  OpenDocument and ruby have different models of date, time and datetime. Ruby containg three different objects. Time and DateTime cover all cases, Date covers dates only. OpenDocument distinguishes two groups - time of a day (time) and everything else (date). To simplify things a little we return cell values containg time of day as Time object and cell values containg datetime of date as DateTime. I am aware that this is very arbitrary choice, but it is very practical. This way and to some extend the types of values from OpenDocument are preserved when read from files, beeing acted upon and written back to spreadshhet.
45
45
 
46
+ ### Merged cells
47
+ Even when a cell spans more rows and collumns, you must access by coordinates of its topleft corner. In fact, the "hidden" cells under are still there and their content is usually preserved.
48
+
46
49
 
47
50
  ## Examples
48
51
 
@@ -107,6 +107,10 @@ else # Monkeypatching
107
107
  each_element { |e| result << e }
108
108
  return result
109
109
  end
110
+ # TODO: posoudit jestli by to nebylo rychlejsi takto
111
+ # def elements
112
+ # children.select { |e| e.element? }
113
+ # end
110
114
  end
111
115
 
112
116
  end
@@ -33,8 +33,7 @@ class Cell < XMLTiedItem
33
33
  attr_reader :rowi
34
34
 
35
35
  # @!group XMLTiedItem related methods and extensions
36
- def xml_options; {:xml_items_node_name => 'table-cell', :xml_repeated_attribute => 'number-columns-repeated'} end
37
- def parent; row end
36
+ def parent; row end #TODO: otazka zda je treba definovat zde, mozna uz je to v XMLTiedItem osefovano
38
37
  def coli; index end
39
38
 
40
39
  def set_rowi(arowi); @rowi = arowi end # this should ONLY be used by parent row
@@ -65,7 +64,8 @@ class Cell < XMLTiedItem
65
64
  end
66
65
  def value
67
66
  gt = guess_cell_type
68
- if (self.mode == :regular) or (self.mode == :repeated)
67
+ amode = self.mode
68
+ if (amode == :regular) or (amode == :repeated)
69
69
  case
70
70
  when gt == nil then nil
71
71
  when gt == Float then xmlnode.attributes['value'].to_f
@@ -75,10 +75,10 @@ class Cell < XMLTiedItem
75
75
  when gt == :percentage then xmlnode.attributes['value'].to_f
76
76
  when gt == :currency then xmlnode.attributes['value'].to_d
77
77
  end
78
- elsif self.mode == :outbound
78
+ elsif amode == :outbound
79
79
  nil
80
80
  else
81
- raise "Unknown cell mode #{self.mode}"
81
+ raise "Unknown cell mode #{amode}"
82
82
  end
83
83
  end
84
84
 
@@ -17,7 +17,7 @@ class WorksheetImages
17
17
  end
18
18
 
19
19
  # @!group XMLTiedArray_WithRepeatableItems related methods
20
- def subitem_xml_options; {:xml_items_node_name => 'frame', :xml_items_node_namespace => 'draw'} end
20
+ def subnode_options; {:node_name => 'frame', :node_namespace => 'draw'} end
21
21
  def prepare_subitem(index); Image.new(self,index) end
22
22
  def xmlnode; @worksheet.xmlnode.find('./table:shapes').first end
23
23
  def prepare_empty_xmlnode
@@ -105,9 +105,6 @@ class Image < XMLTiedItem
105
105
  Tools.set_ns_attribute(xml_image_subnode,'xlink','href', value )
106
106
  end
107
107
 
108
- # @!group XMLTiedItem related methods
109
- def xml_options; {:xml_items_node_name => 'frame'} end
110
-
111
108
  #
112
109
  # Note: when creating new empty image we might have included xlink:type attribute but specification
113
110
  # says it has default value simple [1] so we omit it. The same goes for
@@ -25,6 +25,14 @@ module Rspreadsheet
25
25
 
26
26
  class Row < XMLTiedItem
27
27
  include XMLTiedArray_WithRepeatableItems
28
+ # @!group XMLTiedArray_WithRepeatableItems related methods
29
+ def subnode_options; {
30
+ :node_name => 'table-cell',
31
+ :alt_node_names => ['covered-table-cell'],
32
+ :repeated_attribute => 'number-columns-repeated'
33
+ } end
34
+ def prepare_subitem(coli); Cell.new(worksheet,rowi,coli) end
35
+
28
36
  ## @return [Worksheet] worksheet which contains the row
29
37
  # @!attribute [r] worksheet
30
38
  def worksheet; parent end
@@ -93,7 +101,7 @@ class Row < XMLTiedItem
93
101
  if myxmlnode.nil?
94
102
  []
95
103
  else
96
- worksheet.find_nonempty_subnode_indexes(myxmlnode, subitem_xml_options)
104
+ worksheet.find_nonempty_subnode_indexes(myxmlnode, subnode_options)
97
105
  end
98
106
  end
99
107
  alias :used_range :range
@@ -118,13 +126,6 @@ class Row < XMLTiedItem
118
126
  @itemcache.each_value{ |cell| cell.set_rowi(rowi) }
119
127
  end
120
128
 
121
- private
122
- # @!group XMLTiedArray_WithRepeatableItems related methods
123
- def subitem_xml_options; {:xml_items_node_name => 'table-cell', :xml_repeated_attribute => 'number-columns-repeated'} end
124
- def prepare_subitem(coli); Cell.new(worksheet,rowi,coli) end
125
- # @!group XMLTiedItem related methods and extensions
126
- def xml_options; {:xml_items_node_name => 'table-row', :xml_repeated_attribute => 'number-rows-repeated'} end
127
-
128
129
  end
129
130
 
130
131
  end
@@ -1,3 +1,3 @@
1
1
  module Rspreadsheet
2
- VERSION = "0.4.8"
2
+ VERSION = "0.4.9"
3
3
  end
@@ -10,7 +10,12 @@ module Rspreadsheet
10
10
  class Worksheet
11
11
  include XMLTiedArray_WithRepeatableItems
12
12
  attr_accessor :xmlnode
13
- def subitem_xml_options; {:xml_items_node_name => 'table-row', :xml_repeated_attribute => 'number-rows-repeated'} end
13
+ # @!group XMLTiedArray related methods
14
+ def subnode_options; {
15
+ :node_name => 'table-row',
16
+ :ignore_groupings => ['table-header-rows'],
17
+ :repeated_attribute => 'number-rows-repeated'
18
+ } end
14
19
 
15
20
  def initialize(xmlnode_or_sheet_name,workbook) # workbook is here ONLY because of inserting images - to find unique name - it would be much better if it should bot be there
16
21
  initialize_xml_tied_array
@@ -105,7 +110,8 @@ class Worksheet
105
110
  when 0 then raise 'Not implemented yet' #TODO: return list of all cells
106
111
  when 1..2
107
112
  r,c = Rspreadsheet::Tools.a2c(*params)
108
- row(r).andand.cell(c)
113
+ arow = row(r)
114
+ arow.andand.cell(c)
109
115
  else raise ArgumentError.new('Wrong number of arguments.')
110
116
  end
111
117
  end
@@ -1,4 +1,5 @@
1
1
  require 'helpers/class_extensions'
2
+ require 'pry'
2
3
 
3
4
  module Rspreadsheet
4
5
 
@@ -29,20 +30,30 @@ end
29
30
  # of course util you want to insert something. If this may happens, importer must
30
31
  # provide method prepare_empty_xmlnode which prepares (and returns) empty xml node.
31
32
  # It is lazy called, as late as possible.
32
- # * subitem_xml_options - returns hash of options used to locate subitems in xml (TODO: rewrite in clear way)
33
+ # * subnode_options - returns hash of options used to locate subitems in xml with these values
34
+ # * subnode_options[:node_name] - how the relevant subitems are named (string)
35
+ # * subnode_options[:alt_node_names] - array of strings of alternative names to :node_name
36
+ # these are recognized in searching, but never created when creating new node.
37
+ # * subnode_options[:node_namespace] - namespace of relevant subitems (defaults to table)
38
+ # * subnode_options[:repeated_attribute] - attribute of elements which tell how many
39
+ # times this is repeated (this is only used in XMLTiedArray_WithRepeatableItems)
40
+ # * subnode_options[:ignore_groupings] - some subnodes can rather be groups of subnodes, these
41
+ # groups need to be expanded and nodes put out of them
33
42
  # * intilize must call initialize_xml_tied_array
34
43
  #
35
- # Terminology
36
- # * item, subitem is object from @itemcache (quite often subclass of XMLTiedItem)
37
- # * node, subnode is LibXML::XML::Node object
38
- #
39
- # this class is made to be included.
40
- #
41
- # Note for developers:
42
- # Beware that the implementation of methods needs to be done in a way that it continues to
43
- # work when items are "repeatable" - see XMLTiedArray_WithRepeatableItems. When impractical or impossible
44
- # please implement the corresponding method in XMLTiedArray_WithRepeatableItems or at least override it there
45
- # and make it raise exception.
44
+ #== Notes for developers
45
+ #
46
+ # * This class is made to be included.
47
+ # * Terminology
48
+ # * item, subitem is object from @itemcache (quite often subclass of XMLTiedItem)
49
+ # * node, subnode is LibXML::XML::Node object
50
+ # * usual flow is that when user asks for an item the proxy item object is created (prepare_item) which
51
+ # only contains index etx, but no values. When the values are needed, it asks its parent to get the xmlnode, it first
52
+ # uses xmlsubnodes method to get all sumbodes and then by respecting the repeating finds apropriate node.
53
+ # * Beware that the implementation of methods needs to be done in a way that it continues to
54
+ # work when items are "repeatable" - see XMLTiedArray_WithRepeatableItems. When impractical or impossible
55
+ # please implement the corresponding method in XMLTiedArray_WithRepeatableItems or at least override it there
56
+ # and make it raise exception.
46
57
  #
47
58
  # @private
48
59
  module XMLTiedArray
@@ -122,7 +133,7 @@ module XMLTiedArray
122
133
  # returns xmlnode with index
123
134
  # DOES not respect repeated_attribute
124
135
  def my_subnode(aindex)
125
- raise 'Using method which does not respect repeated_attribute with options that are using it. You probably donot want to do that.' unless subitem_xml_options[:xml_repeated_attribute].nil?
136
+ raise 'Using method which does not respect repeated_attribute with options that are using it. You probably donot want to do that.' unless subnode_options[:repeated_attribute].nil?
126
137
  return xmlsubnodes[aindex-1]
127
138
  end
128
139
 
@@ -150,8 +161,8 @@ module XMLTiedArray
150
161
 
151
162
  def prepare_empty_subnode
152
163
  Tools.prepare_ns_node(
153
- subitem_xml_options[:xml_items_node_namespace] || 'table',
154
- subitem_xml_options[:xml_items_node_name]
164
+ subnode_options[:node_namespace] || 'table',
165
+ subnode_options[:node_name]
155
166
  )
156
167
  end
157
168
 
@@ -165,16 +176,45 @@ module XMLTiedArray
165
176
  # @!group finding and accessing subnodes
166
177
  # array containing subnodes of xmlnode which represent subitems
167
178
  def xmlsubnodes
168
- return [] if xmlnode.nil?
169
- ele = xmlnode.elements
170
- return [] if ele.empty?
171
- so = subitem_xml_options[:xml_items_node_name]
172
-
173
- ele.select do |node|
174
- node.andand.name == so
179
+ axmlnode = self.xmlnode
180
+ return [] if axmlnode.nil?
181
+ node_name = subnode_options[:node_name]
182
+ alt_node_names = subnode_options[:alt_node_names] || []
183
+ ignore_groupings = subnode_options[:ignore_groupings] || []
184
+
185
+ result = []
186
+ axmlnode.children.each do |node|
187
+ if ignore_groupings.include?(node.andand.name)
188
+ node.children.each do |subnode|
189
+ result << subnode
190
+ end
191
+ else
192
+ result << node
193
+ end
194
+ end
195
+
196
+ result.select do |node|
197
+ node.element? && # nejde o textový node
198
+ ( (node_name == node.andand.name) || # a jde o node s pořadovaným názvem
199
+ alt_node_names.include?(node.andand.name) ) # nebo s alternativním přípustným názvem
175
200
  end
176
201
  end
177
202
 
178
203
  end
179
204
 
180
205
  end
206
+
207
+
208
+
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
@@ -14,8 +14,6 @@ using ClassExtensions if RUBY_VERSION > '2.1'
14
14
  # more so subitem can implement parent and index methods.
15
15
 
16
16
  # @private
17
- # abstract class. All successors have some options. MUST implement:
18
- # * xml_options
19
17
  #
20
18
  # If you override intializer make sure you call initialize_xml_tied_item(aparent,aindex).
21
19
  #
@@ -42,9 +40,7 @@ class XMLTiedItem < XMLTied
42
40
  def set_index(aindex); @xml_tied_item_index=aindex end
43
41
  def index=(aindex); @xml_tied_item_index=aindex end
44
42
 
45
- # `xml_options[:xml_items_node_name]` gives the name of the tag representing cell
46
- # `xml_options[:number-columns-repeated]` gives the name of the previous tag which sais how many times the item is repeated
47
- def xml_options; abstract end
43
+ def name_of_repeated_attribute; parent.subnode_options[:repeated_attribute] end
48
44
 
49
45
  def initialize_xml_tied_item(aparent,aindex)
50
46
  @xml_tied_parent = aparent unless aparent.nil?
@@ -58,7 +54,7 @@ class XMLTiedItem < XMLTied
58
54
  else :regular
59
55
  end
60
56
  end
61
- def repeated; (Tools.get_ns_attribute_value(xmlnode, 'table', xml_options[:xml_repeated_attribute]) || 1 ).to_i end
57
+ def repeated; (Tools.get_ns_attribute_value(xmlnode, 'table', name_of_repeated_attribute) || 1 ).to_i end
62
58
  def repeated?; mode==:repeated || mode==:outbound end
63
59
  alias :is_repeated? :repeated?
64
60
  def xmlnode
@@ -29,10 +29,11 @@ module XMLTiedArray_WithRepeatableItems
29
29
  end
30
30
 
31
31
  def find_subnode_with_range(aindex)
32
- options = subitem_xml_options
32
+ options = subnode_options
33
33
  rightindex = 0
34
- xmlsubnodes.each do |node|
35
- repeated = (node.attributes[options[:xml_repeated_attribute]] || 1).to_i
34
+ xmlsub = self.xmlsubnodes
35
+ xmlsub.each do |node|
36
+ repeated = (node.attributes[options[:repeated_attribute]] || 1).to_i
36
37
  leftindex = rightindex + 1
37
38
  rightindex = rightindex+repeated
38
39
  if rightindex>= aindex
@@ -50,7 +51,7 @@ module XMLTiedArray_WithRepeatableItems
50
51
 
51
52
  def insert_new_empty_subnode_before_respect_repeatable(aindex)
52
53
  axmlnode = xmlnode
53
- options = subitem_xml_options
54
+ options = subnode_options
54
55
  node,index_range = find_subnode_with_range(aindex)
55
56
 
56
57
  if !node.nil? # found the node, now do the insert
@@ -69,20 +70,20 @@ module XMLTiedArray_WithRepeatableItems
69
70
 
70
71
  def prepare_repeated_subnode(times_repeated,options)
71
72
  result = prepare_empty_subnode
72
- Tools.set_ns_attribute(result,'table',options[:xml_repeated_attribute],times_repeated, 1)
73
+ Tools.set_ns_attribute(result,'table',options[:repeated_attribute],times_repeated, 1)
73
74
  result
74
75
  end
75
76
 
76
77
  def clone_before_and_set_repeated_attribute(node,times_repeated,options)
77
78
  newnode = node.copy(true)
78
- Tools.set_ns_attribute(newnode,'table',options[:xml_repeated_attribute],times_repeated,1)
79
+ Tools.set_ns_attribute(newnode,'table',options[:repeated_attribute],times_repeated,1)
79
80
  node.prev = newnode
80
81
  end
81
82
 
82
83
  # detaches subnode with aindex
83
84
  def detach_my_subnode_respect_repeated(aindex)
84
85
  axmlnode = xmlnode
85
- options = subitem_xml_options
86
+ options = subnode_options
86
87
  node,index_range = find_subnode_with_range(aindex)
87
88
  if index_range.size > 1 # pokud potřebuje vůbec detachovat
88
89
  if !node.nil? # detach subnode
@@ -105,14 +106,14 @@ module XMLTiedArray_WithRepeatableItems
105
106
  end
106
107
 
107
108
  def how_many_times_node_is_repeated(node) # adding respect to repeated nodes
108
- (node.attributes[subitem_xml_options[:xml_repeated_attribute]] || 1).to_i
109
+ (node.attributes[subnode_options[:repeated_attribute]] || 1).to_i
109
110
  end
110
111
 
111
112
 
112
113
  # clean up item from xml (handle possible detachments) and itemcache. leave the object invalidation on the object
113
114
  # this should not be called from nowhere but XMLTiedItem.delete
114
115
  def delete_subitem(aindex)
115
- # options = subitem_xml_options
116
+ # options = subnode_options
116
117
  delete_my_subnode_respect_repeated(aindex) # vymaž node z xml
117
118
  @itemcache.delete(aindex)
118
119
  @itemcache.keys.sort.select{|i| i>=aindex+1 }.each do |i|
@@ -132,8 +133,8 @@ module XMLTiedArray_WithRepeatableItems
132
133
  def find_nonempty_subnode_indexes(axmlnode, options)
133
134
  index = 0
134
135
  result = []
135
- axmlnode.elements.select{|node| node.name == options[:xml_items_node_name]}.each do |node|
136
- repeated = (node.attributes[options[:xml_repeated_attribute]] || 1).to_i
136
+ axmlnode.elements.select{|node| node.name == options[:node_name]}.each do |node|
137
+ repeated = (node.attributes[options[:repeated_attribute]] || 1).to_i
137
138
  index = index + repeated
138
139
  if !(node.content.nil? or node.content.empty? or node.content =='') and (repeated==1)
139
140
  result << index
@@ -8,7 +8,7 @@ sudo rm -f Gemfile.lock
8
8
  git add .
9
9
 
10
10
  # builds the gem to pkg directory and installs gem to local system
11
- sudo rake install
11
+ sudo bundle exec rake install
12
12
 
13
13
  # Note 1: If the last step fails with "mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h",
14
14
  # you may want to ``sudo aptitude install ruby-dev``
data/spec/cell_spec.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'pry'
2
3
 
3
4
  describe Rspreadsheet::Cell do
4
5
  before do
@@ -351,4 +352,19 @@ describe Rspreadsheet::Cell do
351
352
  inscell = @sheet1.insert_cell_before(2,4) # should not move cells with data
352
353
  @sheet1.C2.should == 'test'
353
354
  end
355
+
356
+ it 'Does not ignore cells covered by other merged cells (issue 42)' do
357
+ sheet = Rspreadsheet.new('./spec/testfile-issue-42-43.ods').sheet(1)
358
+ sheet.C1.should == 'week1'
359
+ sheet.C2.should == 'week2'
360
+ sheet.C3.should == 'week3'
361
+ sheet.C4.should == 'week4'
362
+ sheet.C7.should == 'week7'
363
+ end
364
+ it 'Does not ignore rows repeated on every page = header rows (issue 43)' do
365
+ sheet = Rspreadsheet.new('./spec/testfile-issue-42-43.ods').sheet(2)
366
+ sheet.A1.should == 'Schedule'
367
+ sheet.B2.should == 'Course'
368
+ sheet.A3.should == 'Teacher'
369
+ end
354
370
  end
Binary file
@@ -19,7 +19,7 @@ describe Rspreadsheet::XMLTiedArray do
19
19
 
20
20
  it 'raises when prepare_empty_xmlnode fails in insert_new_empty_subnode_before' do
21
21
  class TestXMLTiedArray
22
- def subitem_xml_options; {} end
22
+ def subnode_options; {} end
23
23
  def xmlnode; nil end
24
24
  end
25
25
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspreadsheet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.8
4
+ version: 0.4.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jakub A.Těšínský
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-27 00:00:00.000000000 Z
11
+ date: 2019-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip
@@ -42,36 +42,30 @@ dependencies:
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.5'
48
- - - "<"
49
- - !ruby/object:Gem::Version
50
- version: '3'
51
48
  type: :development
52
49
  prerelease: false
53
50
  version_requirements: !ruby/object:Gem::Requirement
54
51
  requirements:
55
- - - ">="
52
+ - - "~>"
56
53
  - !ruby/object:Gem::Version
57
54
  version: '1.5'
58
- - - "<"
59
- - !ruby/object:Gem::Version
60
- version: '3'
61
55
  - !ruby/object:Gem::Dependency
62
56
  name: rake
63
57
  requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
59
  - - "~>"
66
60
  - !ruby/object:Gem::Version
67
- version: '10.0'
61
+ version: '0.9'
68
62
  type: :development
69
63
  prerelease: false
70
64
  version_requirements: !ruby/object:Gem::Requirement
71
65
  requirements:
72
66
  - - "~>"
73
67
  - !ruby/object:Gem::Version
74
- version: '10.0'
68
+ version: '0.9'
75
69
  - !ruby/object:Gem::Dependency
76
70
  name: rspec
77
71
  requirement: !ruby/object:Gem::Requirement
@@ -171,6 +165,7 @@ files:
171
165
  - spec/test-image-blue.png
172
166
  - spec/test-image.png
173
167
  - spec/testfile-issue-40.ods
168
+ - spec/testfile-issue-42-43.ods
174
169
  - spec/testfile1.ods
175
170
  - spec/testfile2-images.ods
176
171
  - spec/tools_spec.rb
@@ -197,7 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
192
  version: '0'
198
193
  requirements: []
199
194
  rubyforge_project:
200
- rubygems_version: 2.7.6.2
195
+ rubygems_version: 2.5.2.1
201
196
  signing_key:
202
197
  specification_version: 4
203
198
  summary: Manipulating LibreOffice Calc (OpenDocument Spreadsheet) files from Ruby
@@ -217,6 +212,7 @@ test_files:
217
212
  - spec/test-image-blue.png
218
213
  - spec/test-image.png
219
214
  - spec/testfile-issue-40.ods
215
+ - spec/testfile-issue-42-43.ods
220
216
  - spec/testfile1.ods
221
217
  - spec/testfile2-images.ods
222
218
  - spec/tools_spec.rb