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 +5 -5
- data/GUIDE.md +3 -0
- data/lib/helpers/class_extensions.rb +4 -0
- data/lib/rspreadsheet/cell.rb +5 -5
- data/lib/rspreadsheet/image.rb +1 -4
- data/lib/rspreadsheet/row.rb +9 -8
- data/lib/rspreadsheet/version.rb +1 -1
- data/lib/rspreadsheet/worksheet.rb +8 -2
- data/lib/rspreadsheet/xml_tied_array.rb +62 -22
- data/lib/rspreadsheet/xml_tied_item.rb +2 -6
- data/lib/rspreadsheet/xml_tied_repeatable.rb +12 -11
- data/reinstall_local_gem.sh +1 -1
- data/spec/cell_spec.rb +16 -0
- data/spec/testfile-issue-42-43.ods +0 -0
- data/spec/xml_tied_spec.rb +1 -1
- metadata +9 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e7334a14b9121a8cfefe62a271f865b0be259f32
|
4
|
+
data.tar.gz: b76797efc38071ebc4d2120eb051e220f45e3657
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
|
data/lib/rspreadsheet/cell.rb
CHANGED
@@ -33,8 +33,7 @@ class Cell < XMLTiedItem
|
|
33
33
|
attr_reader :rowi
|
34
34
|
|
35
35
|
# @!group XMLTiedItem related methods and extensions
|
36
|
-
def
|
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
|
-
|
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
|
78
|
+
elsif amode == :outbound
|
79
79
|
nil
|
80
80
|
else
|
81
|
-
raise "Unknown cell mode #{
|
81
|
+
raise "Unknown cell mode #{amode}"
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
data/lib/rspreadsheet/image.rb
CHANGED
@@ -17,7 +17,7 @@ class WorksheetImages
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# @!group XMLTiedArray_WithRepeatableItems related methods
|
20
|
-
def
|
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
|
data/lib/rspreadsheet/row.rb
CHANGED
@@ -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,
|
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
|
data/lib/rspreadsheet/version.rb
CHANGED
@@ -10,7 +10,12 @@ module Rspreadsheet
|
|
10
10
|
class Worksheet
|
11
11
|
include XMLTiedArray_WithRepeatableItems
|
12
12
|
attr_accessor :xmlnode
|
13
|
-
|
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)
|
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
|
-
# *
|
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
|
-
|
36
|
-
#
|
37
|
-
# *
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
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
|
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
|
-
|
154
|
-
|
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
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
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
|
-
|
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',
|
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 =
|
32
|
+
options = subnode_options
|
33
33
|
rightindex = 0
|
34
|
-
|
35
|
-
|
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 =
|
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[:
|
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[:
|
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 =
|
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[
|
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 =
|
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[:
|
136
|
-
repeated = (node.attributes[options[:
|
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
|
data/reinstall_local_gem.sh
CHANGED
@@ -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
|
data/spec/xml_tied_spec.rb
CHANGED
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.
|
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-
|
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: '
|
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: '
|
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.
|
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
|