workbook 0.7.6 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.ruby-version +1 -0
- data/.travis.yml +1 -2
- data/lib/workbook/cell.rb +9 -0
- data/lib/workbook/modules/cell.rb +1 -11
- data/lib/workbook/modules/type_parser.rb +41 -16
- data/lib/workbook/readers/csv_reader.rb +6 -7
- data/lib/workbook/readers/xlsx_reader.rb +6 -0
- data/lib/workbook/version.rb +1 -1
- data/test/artifacts/excel_different_types.xlsx +0 -0
- data/test/artifacts/skippingcells.xlsx +0 -0
- data/test/test_modules_cell.rb +4 -1
- data/test/test_modules_type_parser.rb +6 -2
- data/test/test_readers_xlsx_reader.rb +8 -0
- data/test/test_table.rb +3 -0
- data/workbook.gemspec +1 -1
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2d11f35120106855bbb5905a7f2611b138293157e135f86b0d8f5248c90f5f83
|
4
|
+
data.tar.gz: ced9b91f1f1f69bbe90151ef78f61885a1ced541c5d3392e46dcb4e7770b58da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1abccd53682ea4a4718153f0409e43925108740004dfbbba78419d4f80dd7a23add4677c7430812253a6e5559322b1919fb0f2c8f4450575804c8aae68056db6
|
7
|
+
data.tar.gz: 6eb31d092e13c909e6d96d78a594bd3c1e9abd01d88a8cb76fc133c128035786d7f06651123e4c2f0798fa7d8b275f6914ed21152a0eab94efbb80e03083cb95
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.6.0
|
data/.travis.yml
CHANGED
data/lib/workbook/cell.rb
CHANGED
@@ -5,5 +5,14 @@ require 'workbook/modules/cell'
|
|
5
5
|
module Workbook
|
6
6
|
class Cell
|
7
7
|
include Workbook::Modules::Cell
|
8
|
+
|
9
|
+
# @param [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass] value a valid value
|
10
|
+
# @param [Hash] options a reference to :format (Workbook::Format) can be specified
|
11
|
+
def initialize value=nil, options={}
|
12
|
+
self.format = options[:format] if options[:format]
|
13
|
+
self.row = options[:row]
|
14
|
+
self.value = value
|
15
|
+
@to_sym = nil
|
16
|
+
end
|
8
17
|
end
|
9
18
|
end
|
@@ -81,15 +81,6 @@ module Workbook
|
|
81
81
|
@row= r
|
82
82
|
end
|
83
83
|
|
84
|
-
# @param [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass] value a valid value
|
85
|
-
# @param [Hash] options a reference to :format (Workbook::Format) can be specified
|
86
|
-
def initialize value=nil, options={}
|
87
|
-
self.format = options[:format] if options[:format]
|
88
|
-
self.row = options[:row]
|
89
|
-
self.value = value
|
90
|
-
@to_sym = nil
|
91
|
-
end
|
92
|
-
|
93
84
|
# Change the current value
|
94
85
|
#
|
95
86
|
# @param [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass,Symbol] value a valid value
|
@@ -196,8 +187,7 @@ module Workbook
|
|
196
187
|
elsif cell_type == :float
|
197
188
|
v = "num#{value}".sub(".","_").to_sym
|
198
189
|
else
|
199
|
-
v = value_to_s
|
200
|
-
|
190
|
+
v = value_to_s.strip
|
201
191
|
ends_with_exclamationmark = (v[-1] == '!')
|
202
192
|
ends_with_questionmark = (v[-1] == '?')
|
203
193
|
|
@@ -78,30 +78,55 @@ module Workbook
|
|
78
78
|
|
79
79
|
def string_optimistic_date_converter
|
80
80
|
proc do |v|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
81
|
+
if v
|
82
|
+
rv = v
|
83
|
+
starts_with_nr = v.chars.first.to_i.to_s == v.chars.first #it should at least start with a number...
|
84
|
+
no_spaced_dash = v.to_s.match(" - ") ? false : true
|
85
|
+
min_two_dashes = v.to_s.scan("-").count > 1 ? true : false
|
86
|
+
min_two_dashes = v.to_s.scan("/").count > 1 ? true : false if min_two_dashes == false
|
86
87
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
88
|
+
normal_date_length = v.to_s.length <= 25
|
89
|
+
if no_spaced_dash and starts_with_nr and normal_date_length and min_two_dashes
|
90
|
+
begin
|
91
|
+
rv = (v.length > 10) ? DateTime.parse(v) : Date.parse(v)
|
92
|
+
rescue ArgumentError
|
93
|
+
rv = v
|
94
|
+
end
|
95
|
+
begin
|
96
|
+
rv = Date.parse(v.to_i.to_s) == rv ? v : rv # disqualify if it is only based on the first number
|
97
|
+
rescue ArgumentError
|
98
|
+
end
|
97
99
|
end
|
100
|
+
rv
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def string_american_date_converter
|
106
|
+
proc do |v|
|
107
|
+
if v
|
108
|
+
rv = v
|
98
109
|
# try strptime with format 'mm/dd/yyyy'
|
99
|
-
if rv
|
110
|
+
if rv.is_a?(String) && /^\d{1,2}[\/-]\d{1,2}[\/-]\d{4}/ =~ v
|
100
111
|
begin
|
101
112
|
rv = Date.strptime(v, "%m/%d/%Y")
|
102
113
|
rescue ArgumentError
|
103
114
|
end
|
104
115
|
end
|
116
|
+
rv
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def string_non_american_date_converter
|
122
|
+
proc do |v|
|
123
|
+
rv = v
|
124
|
+
# try strptime with format 'mm/dd/yyyy'
|
125
|
+
if rv.is_a?(String) && /^\d{1,2}[\/\-\.]\d{1,2}[\/\-\.]\d{4}/ =~ v
|
126
|
+
begin
|
127
|
+
rv = Date.strptime(v, "%m/%d/%Y")
|
128
|
+
rescue ArgumentError
|
129
|
+
end
|
105
130
|
end
|
106
131
|
rv
|
107
132
|
end
|
@@ -14,19 +14,18 @@ module Workbook
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def parse_csv csv_raw, options={}
|
17
|
-
|
17
|
+
optimistic_date_converter = Workbook::Cell.new.string_optimistic_date_converter
|
18
18
|
options = {
|
19
|
-
converters: [:all
|
19
|
+
converters: [optimistic_date_converter, :all]
|
20
20
|
}.merge(options)
|
21
21
|
|
22
|
-
csv=nil
|
23
|
-
begin
|
24
|
-
csv = CSV.parse(csv_raw,options)
|
22
|
+
csv = nil
|
25
23
|
|
24
|
+
begin
|
25
|
+
csv = CSV.parse(csv_raw, options)
|
26
26
|
rescue CSV::MalformedCSVError
|
27
27
|
csv_excel = CSV.parse(csv_raw,options.merge({:col_sep=>';'}))
|
28
28
|
csv = csv_excel if csv_excel[0].count > 1
|
29
|
-
|
30
29
|
end
|
31
30
|
|
32
31
|
if csv==nil or csv[0].count == 1
|
@@ -34,7 +33,7 @@ module Workbook
|
|
34
33
|
csv = csv_excel if csv_excel[0].count > 1
|
35
34
|
end
|
36
35
|
|
37
|
-
self[0]=Workbook::Sheet.new(csv,self) unless sheet.has_contents?
|
36
|
+
self[0] = Workbook::Sheet.new(csv, self) unless sheet.has_contents?
|
38
37
|
end
|
39
38
|
|
40
39
|
end
|
@@ -188,6 +188,12 @@ module Workbook
|
|
188
188
|
elsif type == "n"
|
189
189
|
value = value.match(/\./) ? value.to_f : value.to_i
|
190
190
|
end
|
191
|
+
elsif type == "b"
|
192
|
+
if value.to_s == "0"
|
193
|
+
value = false
|
194
|
+
elsif value.to_s == "1"
|
195
|
+
value = true
|
196
|
+
end
|
191
197
|
elsif type == "s"
|
192
198
|
value = @shared_strings[value.to_i]
|
193
199
|
end
|
data/lib/workbook/version.rb
CHANGED
Binary file
|
Binary file
|
data/test/test_modules_cell.rb
CHANGED
@@ -88,7 +88,10 @@ class TestModulesCell < Minitest::Test
|
|
88
88
|
"A-B!" => :ab!,
|
89
89
|
"éåšžÌ?" => :easzi?,
|
90
90
|
1 => :num1,
|
91
|
-
1.0 => :num1_0
|
91
|
+
1.0 => :num1_0,
|
92
|
+
'test ' => :test,
|
93
|
+
'test ' => :test
|
94
|
+
|
92
95
|
}
|
93
96
|
examples.each do |k,v|
|
94
97
|
assert_equal(v, Workbook::Cell.new(k).to_sym)
|
@@ -12,7 +12,7 @@ module Modules
|
|
12
12
|
"20-2-2012 20:52"=>DateTime.new(2012,2,20,20,52),
|
13
13
|
"1-11-2011"=>Date.new(2011,11,1),
|
14
14
|
"12/12/2012"=>Date.new(2012,12,12),
|
15
|
-
"12/23/1980"=>Date.new(1980,12,23), #TODO: should probably depend on locale, see: http://bugs.ruby-lang.org/issues/634#note-10
|
15
|
+
# "12/23/1980"=>Date.new(1980,12,23), #TODO: should probably depend on locale, see: http://bugs.ruby-lang.org/issues/634#note-10
|
16
16
|
"jA"=>"jA",
|
17
17
|
"n"=>"n",
|
18
18
|
""=>nil,
|
@@ -27,7 +27,11 @@ module Modules
|
|
27
27
|
|
28
28
|
def test_parse
|
29
29
|
examples.each do |k,v|
|
30
|
-
|
30
|
+
if v == nil
|
31
|
+
assert_nil(Workbook::Cell.new(k).parse({:detect_date => true}))
|
32
|
+
else
|
33
|
+
assert_equal(v, Workbook::Cell.new(k).parse({:detect_date => true}))
|
34
|
+
end
|
31
35
|
end
|
32
36
|
end
|
33
37
|
|
@@ -48,6 +48,14 @@ module Readers
|
|
48
48
|
assert(t["A2"].value.is_a?(Date))
|
49
49
|
assert((Date.new(2012,2,22)-t["A2"].value) < 0.00001)
|
50
50
|
assert((Date.new(2014,12,27)-t["B2"].value) < 0.00001)
|
51
|
+
assert_equal(false,t["E2"].value)
|
52
|
+
assert_equal(true,t["E3"].value)
|
53
|
+
assert_equal(true,t["E4"].value)
|
54
|
+
end
|
55
|
+
def test_skipping_cells
|
56
|
+
w = Workbook::Book.open File.join(File.dirname(__FILE__), 'artifacts/skippingcells.xlsx')
|
57
|
+
t = w.sheet.table
|
58
|
+
assert_equal("a,b,c,d,e,f,g,h,i,j,k,l,m,n\n1,,,,,,,,,,,,,\n,2,,,,,,,,,,,,\n,,3,,,,,,,,,,,\n,,,4,,,,,,,,,,\n,,,,5,,,,,,,,,\n,,,,,6,,,,,,,,\n,,,,,,7,,,,,,,\n,,,,,,,8,,,,,,\n,,,,,,,,9,,,,,\n,,,,,,,,,10,,,,\n,,,,,,,,,,11,,,\n,,,,,,,,,,,12,,\n,,,,,,,,,,,,13,\n,,,,,,,,,,,,,14\na,,,,,,,,,,,,,\n,b,,,,,,,,,,,,\n,,c,,,,,,,,,,,\n,,,d,,,,,,,,,,\n,,,,e,,,,,,,,,\n,,,,,f,,,,,,,,\n,,,,,,g,,,,,,,\n,,,,,,,h,,,,,,\n,,,,,,,,i,,,,,\n,,,,,,,,,j,,,,\n,,,,,,,,,,k,,,\n,,,,,,,,,,,l,,\n,,,,,,,,,,,,m,\n,,,,,,,,,,,,,n\n", t.to_csv)
|
51
59
|
end
|
52
60
|
def test_bit_table_xlsx
|
53
61
|
b = Workbook::Book.open File.join(File.dirname(__FILE__), 'artifacts/bigtable.xlsx')
|
data/test/test_table.rb
CHANGED
@@ -125,6 +125,7 @@ class TestTable< Minitest::Test
|
|
125
125
|
w2.sheet.table = t[2..3]
|
126
126
|
assert_equal("1,2\n3,4\n", w2.sheet.table.to_csv)
|
127
127
|
end
|
128
|
+
|
128
129
|
def test_array_style_assignment
|
129
130
|
w = Workbook::Book.new [["a","b"],[1,2],[3,4]]
|
130
131
|
t = w.sheet.table
|
@@ -133,12 +134,14 @@ class TestTable< Minitest::Test
|
|
133
134
|
t[2] = r
|
134
135
|
assert_equal(t, r.table)
|
135
136
|
end
|
137
|
+
|
136
138
|
def test_delete_at
|
137
139
|
w = Workbook::Book.new [["a","b"],[1,2],[3,4]]
|
138
140
|
t = w.sheet.table
|
139
141
|
t.delete_at 2
|
140
142
|
assert_equal(1, t.last.first.value)
|
141
143
|
end
|
144
|
+
|
142
145
|
def test_trim!
|
143
146
|
t = Workbook::Table.new
|
144
147
|
t << [1,2,3]
|
data/workbook.gemspec
CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.description = "Workbook contains workbooks, as in a table, contains rows, contains cells, reads/writes excel, ods and csv and tab separated files, and offers basic diffing and sorting capabilities."
|
16
16
|
s.authors = ["Maarten Brouwers"]
|
17
17
|
s.add_development_dependency 'ruby-prof', '~> 0.14'
|
18
|
-
s.add_development_dependency("rake", '~>
|
18
|
+
s.add_development_dependency("rake", '~> 12.0')
|
19
19
|
s.add_development_dependency('minitest', '~> 5.4')
|
20
20
|
s.add_dependency('spreadsheet', '~> 1.1')
|
21
21
|
s.add_dependency("rchardet", "~> 1.3")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: workbook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maarten Brouwers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-prof
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '12.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '12.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -133,6 +133,7 @@ extensions: []
|
|
133
133
|
extra_rdoc_files: []
|
134
134
|
files:
|
135
135
|
- ".gitignore"
|
136
|
+
- ".ruby-version"
|
136
137
|
- ".travis.yml"
|
137
138
|
- ".yardoc/checksums"
|
138
139
|
- ".yardoc/object_types"
|
@@ -208,6 +209,7 @@ files:
|
|
208
209
|
- test/artifacts/simple_sheet.xls
|
209
210
|
- test/artifacts/simple_sheet.xlsx
|
210
211
|
- test/artifacts/simple_sheet_many_sheets.xls
|
212
|
+
- test/artifacts/skippingcells.xlsx
|
211
213
|
- test/artifacts/txt_in_xls.xls
|
212
214
|
- test/artifacts/xls_with_txt_extension.txt
|
213
215
|
- test/artifacts/xlsx_with_empty_start.xlsx
|
@@ -256,8 +258,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
256
258
|
- !ruby/object:Gem::Version
|
257
259
|
version: '0'
|
258
260
|
requirements: []
|
259
|
-
|
260
|
-
rubygems_version: 2.6.11
|
261
|
+
rubygems_version: 3.0.1
|
261
262
|
signing_key:
|
262
263
|
specification_version: 4
|
263
264
|
summary: Workbook is a datastructure to contain books of tables (an anlogy used in
|
@@ -289,6 +290,7 @@ test_files:
|
|
289
290
|
- test/artifacts/simple_sheet.xls
|
290
291
|
- test/artifacts/simple_sheet.xlsx
|
291
292
|
- test/artifacts/simple_sheet_many_sheets.xls
|
293
|
+
- test/artifacts/skippingcells.xlsx
|
292
294
|
- test/artifacts/txt_in_xls.xls
|
293
295
|
- test/artifacts/xls_with_txt_extension.txt
|
294
296
|
- test/artifacts/xlsx_with_empty_start.xlsx
|