tabular 0.4.4 → 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +10 -4
- data/Gemfile.lock +27 -25
- data/README +1 -0
- data/Rakefile +13 -11
- data/lib/tabular.rb +2 -0
- data/lib/tabular/blank.rb +3 -1
- data/lib/tabular/column.rb +10 -9
- data/lib/tabular/column_mapper.rb +13 -12
- data/lib/tabular/columns.rb +22 -13
- data/lib/tabular/keys.rb +3 -1
- data/lib/tabular/renderer.rb +2 -0
- data/lib/tabular/row.rb +18 -21
- data/lib/tabular/table.rb +23 -31
- data/lib/tabular/tables/file_reading.rb +29 -31
- data/lib/tabular/version.rb +3 -1
- data/lib/tabular/zero.rb +5 -5
- data/tabular.gemspec +6 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5c35d4ee76851e8d43c72b1caaabbc44764b70ccbeb05ce513262209f5b28d3
|
4
|
+
data.tar.gz: 48f2bc1d8234c3c869cab6f3c595b823029220c2bc949f573a0012c5b583e01c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f360ad4dcf92ea57edbc925f2ed1de3785a7acdf26f0cd8258d9d3973586afce38d7c4395b1a725802bb0d565c222aefbdf05965d374972d789a0f52d86df128
|
7
|
+
data.tar.gz: cac61fba15e8858ef709f1c1634e9acd2bed3410f0c438cdb1f328e0c0c46b40485b533aaebbd8e17a688ea9ef9865333c4449378f4b5f959dbb4d4c04b6c18c
|
data/Gemfile
CHANGED
@@ -1,10 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
source "https://rubygems.org"
|
2
4
|
|
5
|
+
ruby ">= 2.4.0"
|
6
|
+
|
3
7
|
git_source(:github) { |name| "https://github.com/#{name}.git" }
|
4
8
|
|
5
|
-
gem "
|
6
|
-
gem "
|
7
|
-
gem "
|
8
|
-
gem "
|
9
|
+
gem "bundler", ">= 2.0"
|
10
|
+
gem "bundler-audit"
|
11
|
+
gem "minitest"
|
12
|
+
gem "rake"
|
13
|
+
gem "roo", github: "scottwillson/roo"
|
14
|
+
gem "roo-xls"
|
9
15
|
|
10
16
|
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,49 +1,51 @@
|
|
1
1
|
GIT
|
2
|
-
remote: https://github.com/
|
3
|
-
revision:
|
4
|
-
ref: a316a88d042ca6e28a83c46a0db1906a9feebb62
|
2
|
+
remote: https://github.com/scottwillson/roo.git
|
3
|
+
revision: 7affb556878466faf1a476f2ed5802f6af5b1066
|
5
4
|
specs:
|
6
|
-
roo
|
7
|
-
nokogiri
|
8
|
-
|
9
|
-
spreadsheet (> 0.9.0)
|
10
|
-
|
11
|
-
GIT
|
12
|
-
remote: https://github.com/roo-rb/roo.git
|
13
|
-
revision: 12f3f7b1b9c7cc31cada36db360125531d408405
|
14
|
-
ref: 12f3f7b1b9c7cc31cada36db360125531d408405
|
15
|
-
specs:
|
16
|
-
roo (2.0.0)
|
17
|
-
nokogiri
|
18
|
-
rubyzip (>= 1.0.0)
|
5
|
+
roo (2.8.2)
|
6
|
+
nokogiri (~> 1)
|
7
|
+
rubyzip (>= 1.2.1, < 2.0.0)
|
19
8
|
|
20
9
|
PATH
|
21
10
|
remote: .
|
22
11
|
specs:
|
23
|
-
tabular (0.4.
|
12
|
+
tabular (0.4.5)
|
24
13
|
|
25
14
|
GEM
|
26
15
|
remote: https://rubygems.org/
|
27
16
|
specs:
|
17
|
+
bundler-audit (0.6.1)
|
18
|
+
bundler (>= 1.2.0, < 3)
|
19
|
+
thor (~> 0.18)
|
28
20
|
mini_portile2 (2.4.0)
|
29
21
|
minitest (5.11.3)
|
30
|
-
nokogiri (1.10.
|
22
|
+
nokogiri (1.10.3)
|
31
23
|
mini_portile2 (~> 2.4.0)
|
32
|
-
rake (
|
33
|
-
|
24
|
+
rake (12.3.2)
|
25
|
+
roo-xls (1.2.0)
|
26
|
+
nokogiri
|
27
|
+
roo (>= 2.0.0, < 3)
|
28
|
+
spreadsheet (> 0.9.0)
|
29
|
+
ruby-ole (1.2.12.2)
|
34
30
|
rubyzip (1.2.2)
|
35
|
-
spreadsheet (1.
|
31
|
+
spreadsheet (1.2.3)
|
36
32
|
ruby-ole (>= 1.0)
|
33
|
+
thor (0.20.3)
|
37
34
|
|
38
35
|
PLATFORMS
|
39
36
|
ruby
|
40
37
|
|
41
38
|
DEPENDENCIES
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
39
|
+
bundler (>= 2.0)
|
40
|
+
bundler-audit
|
41
|
+
minitest
|
42
|
+
rake
|
43
|
+
roo!
|
44
|
+
roo-xls
|
46
45
|
tabular!
|
47
46
|
|
47
|
+
RUBY VERSION
|
48
|
+
ruby 2.6.0p0
|
49
|
+
|
48
50
|
BUNDLED WITH
|
49
51
|
2.0.1
|
data/README
CHANGED
@@ -62,6 +62,7 @@ There's basic test coverage. More comprehensive test coverage needs to be extrac
|
|
62
62
|
|
63
63
|
Changes
|
64
64
|
-------
|
65
|
+
0.4.6 Gem updates. Lint.
|
65
66
|
0.4.3 Gem updates
|
66
67
|
0.4.2 Refactor minor ugly things. No behavior changes.
|
67
68
|
0.4.0 rchristensen: Add sheet argument to Table.read
|
data/Rakefile
CHANGED
@@ -1,21 +1,23 @@
|
|
1
|
-
|
2
|
-
require 'rake'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
require
|
3
|
+
require "rubygems"
|
4
|
+
require "rake"
|
5
|
+
|
6
|
+
require "rake/testtask"
|
5
7
|
Rake::TestTask.new(:test) do |test|
|
6
|
-
test.libs <<
|
7
|
-
test.pattern =
|
8
|
+
test.libs << "lib" << "test"
|
9
|
+
test.pattern = "test/**/*_test.rb"
|
8
10
|
test.verbose = true
|
9
11
|
end
|
10
12
|
|
11
|
-
task :
|
13
|
+
task default: :test
|
12
14
|
|
13
|
-
require
|
15
|
+
require "rdoc/task"
|
14
16
|
Rake::RDocTask.new do |rdoc|
|
15
|
-
version = File.exist?(
|
17
|
+
version = File.exist?("VERSION") ? File.read("VERSION") : ""
|
16
18
|
|
17
|
-
rdoc.rdoc_dir =
|
19
|
+
rdoc.rdoc_dir = "rdoc"
|
18
20
|
rdoc.title = "tabular #{version}"
|
19
|
-
rdoc.rdoc_files.include(
|
20
|
-
rdoc.rdoc_files.include(
|
21
|
+
rdoc.rdoc_files.include("README*")
|
22
|
+
rdoc.rdoc_files.include("lib/**/*.rb")
|
21
23
|
end
|
data/lib/tabular.rb
CHANGED
data/lib/tabular/blank.rb
CHANGED
data/lib/tabular/column.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Tabular
|
2
4
|
class Column
|
3
5
|
attr_reader :key, :column_type
|
@@ -10,13 +12,13 @@ module Tabular
|
|
10
12
|
@table = table
|
11
13
|
@key = self.columns.column_mapper.map(key)
|
12
14
|
|
13
|
-
if @key && @key.to_s["date"]
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
@column_type = if @key && @key.to_s["date"]
|
16
|
+
:date
|
17
|
+
elsif @key && @key.to_s[/\?\z/]
|
18
|
+
:boolean
|
19
|
+
else
|
20
|
+
:string
|
21
|
+
end
|
20
22
|
end
|
21
23
|
|
22
24
|
def rows
|
@@ -35,7 +37,7 @@ module Tabular
|
|
35
37
|
|
36
38
|
# Number of zeros to the right of the decimal point. Useful for formtting time data.
|
37
39
|
def precision
|
38
|
-
@precision ||= cells.map(&:to_f).map {|n| n.round(3) }.map {|n| n.to_s.split(".").last.gsub(/0+$/, "").length }.max
|
40
|
+
@precision ||= cells.map(&:to_f).map { |n| n.round(3) }.map { |n| n.to_s.split(".").last.gsub(/0+$/, "").length }.max
|
39
41
|
end
|
40
42
|
|
41
43
|
# Widest string in column
|
@@ -65,7 +67,6 @@ module Tabular
|
|
65
67
|
key.to_s
|
66
68
|
end
|
67
69
|
|
68
|
-
|
69
70
|
protected
|
70
71
|
|
71
72
|
def columns
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Tabular
|
2
4
|
class ColumnMapper
|
3
5
|
include Tabular::Blank
|
@@ -5,22 +7,21 @@ module Tabular
|
|
5
7
|
# Convert +key+ to normalized symbol. Subclass for more complex mapping.
|
6
8
|
def map(key)
|
7
9
|
return nil if is_blank?(key)
|
10
|
+
|
8
11
|
symbolize key
|
9
12
|
end
|
10
13
|
|
11
14
|
def symbolize(key)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
nil
|
23
|
-
end
|
15
|
+
key.to_s.strip.gsub(/::/, "/")
|
16
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
17
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
18
|
+
.tr("-", "_")
|
19
|
+
.gsub(/ +/, "_")
|
20
|
+
.delete(";")
|
21
|
+
.downcase
|
22
|
+
.to_sym
|
23
|
+
rescue StandardError
|
24
|
+
nil
|
24
25
|
end
|
25
26
|
end
|
26
27
|
end
|
data/lib/tabular/columns.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Tabular
|
2
4
|
# The Table's header: a list of Columns.
|
3
5
|
class Columns
|
@@ -5,8 +7,8 @@ module Tabular
|
|
5
7
|
include Tabular::Blank
|
6
8
|
include Tabular::Keys
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
+
attr_writer :column_mapper
|
11
|
+
attr_writer :renderer
|
10
12
|
|
11
13
|
# +table+ -- Table
|
12
14
|
# +data+ -- array of header names
|
@@ -28,9 +30,7 @@ module Tabular
|
|
28
30
|
def set_columns(table = Table.new, names = [])
|
29
31
|
index = 0
|
30
32
|
|
31
|
-
if names.respond_to?(:keys)
|
32
|
-
names = names.keys
|
33
|
-
end
|
33
|
+
names = names.keys if names.respond_to?(:keys)
|
34
34
|
|
35
35
|
@columns = names.map do |name|
|
36
36
|
new_column = Tabular::Column.new(table, self, name)
|
@@ -38,14 +38,23 @@ module Tabular
|
|
38
38
|
@column_indexes[new_column.key] = index
|
39
39
|
@columns_by_key[new_column.key] = new_column
|
40
40
|
end
|
41
|
-
index
|
41
|
+
index += 1
|
42
42
|
new_column
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
def empty?
|
47
|
+
size.zero?
|
48
|
+
end
|
49
|
+
|
50
|
+
# Deprecated
|
51
|
+
def has_key?(key) # rubocop:disable Naming/PredicateName
|
52
|
+
key? key
|
53
|
+
end
|
54
|
+
|
46
55
|
# Is the a Column with this key? Keys are lower-case, underscore symbols.
|
47
56
|
# Example: :postal_code
|
48
|
-
def
|
57
|
+
def key?(key)
|
49
58
|
@columns.any? { |column| column.key == key }
|
50
59
|
end
|
51
60
|
|
@@ -67,12 +76,12 @@ module Tabular
|
|
67
76
|
# Add a new Column with +key+
|
68
77
|
def <<(key)
|
69
78
|
column = Column.new(@table, self, key)
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
79
|
+
return if is_blank?(column.key) || key?(key)
|
80
|
+
|
81
|
+
@column_indexes[column.key] = @columns.size
|
82
|
+
@column_indexes[@columns.size] = column
|
83
|
+
@columns_by_key[column.key] = column
|
84
|
+
@columns << column
|
76
85
|
end
|
77
86
|
|
78
87
|
def delete(key)
|
data/lib/tabular/keys.rb
CHANGED
data/lib/tabular/renderer.rb
CHANGED
data/lib/tabular/row.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "date"
|
2
4
|
|
3
5
|
module Tabular
|
@@ -38,7 +40,7 @@ module Tabular
|
|
38
40
|
|
39
41
|
# Set cell value. Adds cell to end of Row and adds new Column if there is no Column for +key_
|
40
42
|
def []=(key, value)
|
41
|
-
if columns.
|
43
|
+
if columns.key?(key)
|
42
44
|
@array[columns.index(key)] = value
|
43
45
|
else
|
44
46
|
@array << value
|
@@ -52,6 +54,11 @@ module Tabular
|
|
52
54
|
@array.each(&block)
|
53
55
|
end
|
54
56
|
|
57
|
+
# Call +block+ for each key
|
58
|
+
def each_key(&block)
|
59
|
+
keys.each(&block)
|
60
|
+
end
|
61
|
+
|
55
62
|
# Call +block+ for each cell
|
56
63
|
def each_with_key(&block)
|
57
64
|
hash.each(&block)
|
@@ -74,9 +81,7 @@ module Tabular
|
|
74
81
|
|
75
82
|
# Previous Row
|
76
83
|
def previous
|
77
|
-
if index
|
78
|
-
@table.rows[index - 1]
|
79
|
-
end
|
84
|
+
@table.rows[index - 1] if index.positive?
|
80
85
|
end
|
81
86
|
|
82
87
|
# Next Row
|
@@ -113,13 +118,13 @@ module Tabular
|
|
113
118
|
end
|
114
119
|
|
115
120
|
def to_space_delimited
|
116
|
-
|
121
|
+
cells = []
|
117
122
|
|
118
|
-
hash.
|
119
|
-
|
123
|
+
hash.each_key do |key|
|
124
|
+
cells << (render(key) || "").ljust(columns[key].width)
|
120
125
|
end
|
121
126
|
|
122
|
-
|
127
|
+
cells.join " "
|
123
128
|
end
|
124
129
|
|
125
130
|
def inspect
|
@@ -130,7 +135,6 @@ module Tabular
|
|
130
135
|
@array.join(", ").to_s
|
131
136
|
end
|
132
137
|
|
133
|
-
|
134
138
|
protected
|
135
139
|
|
136
140
|
def hash #:nodoc:
|
@@ -138,13 +142,11 @@ module Tabular
|
|
138
142
|
end
|
139
143
|
|
140
144
|
def build_hash #:nodoc:
|
141
|
-
|
145
|
+
hash = {}
|
142
146
|
columns.each do |column|
|
143
|
-
if column.key
|
144
|
-
_hash[column.key] = value_for_hash(column)
|
145
|
-
end
|
147
|
+
hash[column.key] = value_for_hash(column) if column.key
|
146
148
|
end
|
147
|
-
|
149
|
+
hash
|
148
150
|
end
|
149
151
|
|
150
152
|
def value_for_hash(column) #:nodoc:
|
@@ -155,7 +157,7 @@ module Tabular
|
|
155
157
|
|
156
158
|
case column.column_type
|
157
159
|
when :boolean
|
158
|
-
[
|
160
|
+
[1, "1", true, "true"].include?(value)
|
159
161
|
when :date
|
160
162
|
if date?(value)
|
161
163
|
value
|
@@ -167,7 +169,6 @@ module Tabular
|
|
167
169
|
end
|
168
170
|
end
|
169
171
|
|
170
|
-
|
171
172
|
private
|
172
173
|
|
173
174
|
def date?(value)
|
@@ -181,11 +182,7 @@ module Tabular
|
|
181
182
|
Date.parse(value.to_s, true)
|
182
183
|
rescue ArgumentError
|
183
184
|
date = parse_invalid_date(value)
|
184
|
-
|
185
|
-
date
|
186
|
-
else
|
187
|
-
raise ArgumentError, "'#{key}' index #{index} #{value}' is not a valid date"
|
188
|
-
end
|
185
|
+
date || raise(ArgumentError, "'#{key}' index #{index} #{value}' is not a valid date")
|
189
186
|
end
|
190
187
|
end
|
191
188
|
|
data/lib/tabular/table.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Tabular
|
2
4
|
# Simple Enumerable list of Hashes. Use Table.read(file_path) to read file. Can also create a Table with Table.new. Either
|
3
5
|
# pass in data or set options and then call row=.
|
@@ -7,9 +9,8 @@ module Tabular
|
|
7
9
|
include Tabular::Tables::FileReading
|
8
10
|
include Tabular::Zero
|
9
11
|
|
10
|
-
attr_accessor :column_mapper
|
11
12
|
attr_accessor :row_mapper
|
12
|
-
attr_reader
|
13
|
+
attr_reader :column_mapper
|
13
14
|
|
14
15
|
def self.read(file, options = {})
|
15
16
|
table = Table.new
|
@@ -29,13 +30,11 @@ module Tabular
|
|
29
30
|
|
30
31
|
# Set table rows. Calls row <<, which creates columns and links the source rows to Row#source.
|
31
32
|
def rows=(source_rows = [])
|
32
|
-
return
|
33
|
+
return unless source_rows
|
33
34
|
|
34
35
|
source_rows.each do |row|
|
35
36
|
self.<< row
|
36
37
|
end
|
37
|
-
|
38
|
-
rows
|
39
38
|
end
|
40
39
|
|
41
40
|
# Return Row at zero-based index, or nil if Row is out of bounds
|
@@ -47,25 +46,23 @@ module Tabular
|
|
47
46
|
# To control how source data is added to the Table, use Table#mapper= to set a class that
|
48
47
|
# implements map(row) and returns a Hash.
|
49
48
|
def <<(row)
|
50
|
-
if row_mapper
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
49
|
+
cells = if row_mapper
|
50
|
+
row_mapper.map(row)
|
51
|
+
else
|
52
|
+
row
|
53
|
+
end
|
55
54
|
|
56
|
-
if @columns.nil? || @columns.
|
55
|
+
if @columns.nil? || @columns.empty?
|
57
56
|
@columns = Tabular::Columns.new(self, cells, column_mapper)
|
58
|
-
|
59
|
-
return columns
|
60
|
-
end
|
57
|
+
return columns unless cells.respond_to?(:keys)
|
61
58
|
end
|
62
59
|
|
63
|
-
|
64
|
-
|
60
|
+
new_row = Tabular::Row.new(self, cells, row)
|
61
|
+
new_row.each_key do |key|
|
65
62
|
columns << key
|
66
63
|
end
|
67
|
-
rows <<
|
68
|
-
|
64
|
+
rows << new_row
|
65
|
+
new_row
|
69
66
|
end
|
70
67
|
|
71
68
|
def inspect
|
@@ -78,27 +75,25 @@ module Tabular
|
|
78
75
|
end
|
79
76
|
|
80
77
|
# Remove all columns that only contain a blank string, zero, or nil
|
81
|
-
def delete_blank_columns!(*
|
82
|
-
exceptions = extract_exceptions(
|
78
|
+
def delete_blank_columns!(*options)
|
79
|
+
exceptions = extract_exceptions(options)
|
83
80
|
|
84
81
|
(columns.map(&:key) - exceptions).each do |key|
|
85
|
-
if rows.all? { |row| is_blank?(row[key]) || is_zero?(row[key]) }
|
82
|
+
if rows.all? { |row| is_blank?(row[key]) || is_zero?(row[key]) } # rubocop:disable Style/IfUnlessModifier
|
86
83
|
delete_column key
|
87
84
|
end
|
88
85
|
end
|
89
86
|
end
|
90
87
|
|
91
88
|
# Remove all columns that contain the same value in all rows
|
92
|
-
def delete_homogenous_columns!(*
|
89
|
+
def delete_homogenous_columns!(*options)
|
93
90
|
return if rows.size < 2
|
94
91
|
|
95
|
-
exceptions = extract_exceptions(
|
92
|
+
exceptions = extract_exceptions(options)
|
96
93
|
|
97
94
|
(columns.map(&:key) - exceptions).each do |key|
|
98
95
|
value = rows.first[key]
|
99
|
-
if rows.all? { |row| row[key] == value }
|
100
|
-
delete_column key
|
101
|
-
end
|
96
|
+
delete_column key if rows.all? { |row| row[key] == value }
|
102
97
|
end
|
103
98
|
end
|
104
99
|
|
@@ -142,9 +137,7 @@ module Tabular
|
|
142
137
|
end
|
143
138
|
|
144
139
|
def column_mapper=(mapper)
|
145
|
-
if rows.nil? || rows.
|
146
|
-
@columns = nil
|
147
|
-
end
|
140
|
+
@columns = nil if rows.nil? || rows.empty?
|
148
141
|
@column_mapper = mapper
|
149
142
|
end
|
150
143
|
|
@@ -154,14 +147,13 @@ module Tabular
|
|
154
147
|
end
|
155
148
|
|
156
149
|
def to_space_delimited
|
157
|
-
([
|
150
|
+
([columns] + rows).map(&:to_space_delimited).join("\n") << "\n"
|
158
151
|
end
|
159
152
|
|
160
153
|
def to_s
|
161
154
|
"#<#{self.class} #{rows.size}>"
|
162
155
|
end
|
163
156
|
|
164
|
-
|
165
157
|
private
|
166
158
|
|
167
159
|
def extract_exceptions(options)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Tabular
|
2
4
|
module Tables
|
3
5
|
module FileReading
|
@@ -12,43 +14,39 @@ module Tabular
|
|
12
14
|
format ||= format_from(format, file_path)
|
13
15
|
|
14
16
|
self.rows = case format
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
when :xls, :xlsx
|
18
|
+
# Set to first sheet if undefined.
|
19
|
+
sheet ||= 0
|
20
|
+
read_spreadsheet file_path, format, sheet
|
21
|
+
when :txt
|
22
|
+
read_txt file_path
|
23
|
+
when :csv
|
24
|
+
read_csv file_path
|
25
|
+
else
|
26
|
+
raise "Cannot read '#{format}' format. Expected :xls, :xlsx, :txt, or :csv"
|
27
|
+
end
|
26
28
|
end
|
27
29
|
|
28
30
|
def format_from(as_option, file_path)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
when ".csv"
|
40
|
-
:csv
|
41
|
-
end
|
42
|
-
end
|
31
|
+
as_option || case File.extname(file_path)
|
32
|
+
when ".xls"
|
33
|
+
:xls
|
34
|
+
when ".xlsx"
|
35
|
+
:xlsx
|
36
|
+
when ".txt"
|
37
|
+
:txt
|
38
|
+
when ".csv"
|
39
|
+
:csv
|
40
|
+
end
|
43
41
|
end
|
44
42
|
|
45
43
|
def to_file_path(file)
|
46
44
|
file_path = case file
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
45
|
+
when File
|
46
|
+
file.path
|
47
|
+
else
|
48
|
+
file
|
49
|
+
end
|
52
50
|
|
53
51
|
raise "Could not find '#{file_path}'" unless File.exist?(file_path)
|
54
52
|
|
@@ -68,7 +66,7 @@ module Tabular
|
|
68
66
|
# Row#to_a coerces Excel data to Strings, but we want Dates and Numbers
|
69
67
|
data = []
|
70
68
|
excel.sheet(sheet).each do |excel_row|
|
71
|
-
data << excel_row.
|
69
|
+
data << excel_row.each_with_object([]) { |cell, row| row << cell }
|
72
70
|
end
|
73
71
|
data
|
74
72
|
end
|
data/lib/tabular/version.rb
CHANGED
data/lib/tabular/zero.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Tabular
|
2
4
|
module Zero
|
3
|
-
def is_zero?(object)
|
4
|
-
if object.respond_to?(:zero?)
|
5
|
-
|
6
|
-
end
|
7
|
-
|
5
|
+
def is_zero?(object) # rubocop:disable Naming/PredicateName
|
6
|
+
return object.zero? if object.respond_to?(:zero?)
|
7
|
+
|
8
8
|
case object
|
9
9
|
when NilClass, FalseClass, TrueClass
|
10
10
|
false
|
data/tabular.gemspec
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
$LOAD_PATH.push File.expand_path("lib", __dir__)
|
2
4
|
|
3
5
|
require "tabular/version"
|
4
6
|
|
@@ -9,9 +11,9 @@ Gem::Specification.new do |s|
|
|
9
11
|
s.authors = ["Scott Willson"]
|
10
12
|
s.description = "Tabular is a Ruby library for reading, writing, and manipulating CSV, tab-delimited and Excel data."
|
11
13
|
s.email = "scott.willson@gmail.com"
|
12
|
-
s.extra_rdoc_files = [
|
13
|
-
|
14
|
-
|
14
|
+
s.extra_rdoc_files = %w[
|
15
|
+
LICENSE
|
16
|
+
README
|
15
17
|
]
|
16
18
|
s.files = [
|
17
19
|
"Gemfile",
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tabular
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Willson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-19 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Tabular is a Ruby library for reading, writing, and manipulating CSV,
|
14
14
|
tab-delimited and Excel data.
|
@@ -56,7 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
56
56
|
- !ruby/object:Gem::Version
|
57
57
|
version: '0'
|
58
58
|
requirements: []
|
59
|
-
rubygems_version: 3.0.
|
59
|
+
rubygems_version: 3.0.3
|
60
60
|
signing_key:
|
61
61
|
specification_version: 4
|
62
62
|
summary: Read, write, and manipulate CSV, tab-delimited and Excel data
|