table_transform 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -1
- data/README.md +7 -0
- data/lib/table_transform/excel_creator.rb +13 -4
- data/lib/table_transform/properties.rb +37 -0
- data/lib/table_transform/table.rb +29 -7
- data/lib/table_transform/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18bd452f05254c417d3deb30c03d61c9595d3494
|
4
|
+
data.tar.gz: d998ab542023204734aca739c5caf91538307e91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb3c761f20419bccf2a954c05ee50b0baf01886bc87df0808071cf44147e6c8050bee7b8d0613b058a7f152dbe8ce6e02b4cd74ac08164e0dff3590028060bad
|
7
|
+
data.tar.gz: 55bf3224205284a9b32904fa7f5d507be845878bd4eaf0f983a17e26456d6cccb24f1420a7df697866223b2df2964150404285e1db6497efe7904464172bcc1c
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,9 @@ TableTransform is still in pre-release state. This means that its APIs and behav
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [0.5.0][] (2016-03-13)
|
10
|
+
* Table properties added
|
11
|
+
|
9
12
|
## [0.4.0][] (2016-03-05)
|
10
13
|
* Supports formulas in columns
|
11
14
|
* Helper functions to create formulas
|
@@ -25,7 +28,8 @@ TableTransform is still in pre-release state. This means that its APIs and behav
|
|
25
28
|
* Initial release including Table
|
26
29
|
|
27
30
|
[Semver]: http://semver.org
|
28
|
-
[Unreleased]: https://github.com/jonas-lantto/table_transform/compare/v0.
|
31
|
+
[Unreleased]: https://github.com/jonas-lantto/table_transform/compare/v0.5.0...HEAD
|
32
|
+
[0.4.0]: https://github.com/jonas-lantto/table_transform/compare/v0.4.0...v0.5.0
|
29
33
|
[0.4.0]: https://github.com/jonas-lantto/table_transform/compare/v0.3.0...v0.4.0
|
30
34
|
[0.3.0]: https://github.com/jonas-lantto/table_transform/compare/v0.2.0...v0.3.0
|
31
35
|
[0.2.0]: https://github.com/jonas-lantto/table_transform/compare/v0.1.0...v0.2.0
|
data/README.md
CHANGED
@@ -73,6 +73,13 @@ A row can access its values by column name e.g. `row['Name']`
|
|
73
73
|
c = row['Col1'] # c = 'CHECK'
|
74
74
|
c.include_any?(%w(AA EC DD))) # true
|
75
75
|
|
76
|
+
### Table properties
|
77
|
+
# Set table name - override default name
|
78
|
+
t.table_properties.update({name: 'Table1'})
|
79
|
+
|
80
|
+
# Set turn on/off auto filter button
|
81
|
+
t.table_properties.update({auto_filter: false})
|
82
|
+
|
76
83
|
### Meta data
|
77
84
|
# Set format for one column
|
78
85
|
t.set_metadata('Tax', {format: '0.0%'})
|
@@ -23,6 +23,15 @@ module TableTransform
|
|
23
23
|
#################################
|
24
24
|
private
|
25
25
|
|
26
|
+
def self.default_properties(table_name)
|
27
|
+
TableTransform::Table::TableProperties.new(
|
28
|
+
{
|
29
|
+
name: table_name.tr(' ', '_'),
|
30
|
+
auto_filter: true
|
31
|
+
}
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
26
35
|
# estimated column width of format
|
27
36
|
def self.format_column_size(format)
|
28
37
|
return 0 if format.nil?
|
@@ -71,8 +80,8 @@ module TableTransform
|
|
71
80
|
data = table.to_a
|
72
81
|
return if data.nil? or data.empty? # Create empty worksheet if no data
|
73
82
|
|
74
|
-
|
75
|
-
col_width = ExcelCreator::column_width(table, auto_filter)
|
83
|
+
properties = ExcelCreator::default_properties(name).update(table.table_properties.to_h)
|
84
|
+
col_width = ExcelCreator::column_width(table, properties[:auto_filter])
|
76
85
|
|
77
86
|
header = data.shift
|
78
87
|
data << [nil] * header.count if data.empty? # Add extra row if empty
|
@@ -80,9 +89,9 @@ module TableTransform
|
|
80
89
|
worksheet.add_table(
|
81
90
|
0, 0, data.count, header.count - 1,
|
82
91
|
{
|
83
|
-
:name => name
|
92
|
+
:name => properties[:name],
|
84
93
|
:data => data,
|
85
|
-
:autofilter => auto_filter ? 1 : 0,
|
94
|
+
:autofilter => properties[:auto_filter] ? 1 : 0,
|
86
95
|
:columns => create_column_metadata(table.metadata, @formats, table.formulas)
|
87
96
|
}
|
88
97
|
)
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
module TableTransform
|
3
|
+
|
4
|
+
class Properties
|
5
|
+
def initialize(init_properties = {})
|
6
|
+
validate(init_properties)
|
7
|
+
@props = init_properties
|
8
|
+
end
|
9
|
+
|
10
|
+
def validate(properties)
|
11
|
+
raise 'Default properties must be a hash' unless properties.is_a? Hash
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_h
|
15
|
+
@props.clone
|
16
|
+
end
|
17
|
+
|
18
|
+
def update(properties)
|
19
|
+
validate(properties)
|
20
|
+
@props.merge! properties
|
21
|
+
end
|
22
|
+
|
23
|
+
def delete(prop_key)
|
24
|
+
@props.delete(prop_key)
|
25
|
+
end
|
26
|
+
|
27
|
+
def reset(properties)
|
28
|
+
validate(properties)
|
29
|
+
@props = properties
|
30
|
+
end
|
31
|
+
|
32
|
+
def [](prop_key)
|
33
|
+
raise "Property '#{prop_key}' does not exist" unless @props.include? prop_key
|
34
|
+
@props[prop_key]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'csv'
|
2
|
+
require_relative 'properties'
|
2
3
|
|
3
4
|
module TableTransform
|
4
5
|
module Util
|
@@ -9,6 +10,7 @@ module TableTransform
|
|
9
10
|
|
10
11
|
class Table
|
11
12
|
attr_reader :formulas
|
13
|
+
attr_reader :table_properties
|
12
14
|
|
13
15
|
def self.create_from_file(file_name, sep = ',')
|
14
16
|
rows = CSV.read(file_name, { :col_sep => sep })
|
@@ -17,15 +19,15 @@ module TableTransform
|
|
17
19
|
Table.new(rows)
|
18
20
|
end
|
19
21
|
|
20
|
-
def self.create_empty(header)
|
22
|
+
def self.create_empty(header, table_properties = {})
|
21
23
|
raise 'Table header need to be array' unless header.is_a? Array
|
22
24
|
raise 'Table, No header defined' if header.empty?
|
23
|
-
Table.new([header])
|
25
|
+
Table.new([header], table_properties)
|
24
26
|
end
|
25
27
|
|
26
28
|
# @throws if column names not unique
|
27
29
|
# @throws if column size for each row match
|
28
|
-
def initialize(rows)
|
30
|
+
def initialize(rows, table_properties = {})
|
29
31
|
raise 'Table required to have at least a header row' if (rows.nil? or rows.empty?)
|
30
32
|
|
31
33
|
@data_rows = rows.clone
|
@@ -33,6 +35,7 @@ module TableTransform
|
|
33
35
|
@column_indexes = create_column_name_binding(header)
|
34
36
|
@metadata = header.zip( Array.new(header.size){{}} ).to_h
|
35
37
|
@formulas = {}
|
38
|
+
@table_properties = TableProperties.new(table_properties)
|
36
39
|
|
37
40
|
validate_header_uniqueness(header)
|
38
41
|
validate_column_size
|
@@ -69,8 +72,9 @@ module TableTransform
|
|
69
72
|
def +(table)
|
70
73
|
t2 = table.to_a
|
71
74
|
t2_header = t2.shift
|
72
|
-
raise 'Tables cannot be added due to header mismatch'
|
73
|
-
raise 'Tables cannot be added due to meta data mismatch'
|
75
|
+
raise 'Tables cannot be added due to header mismatch' unless @metadata.keys == t2_header
|
76
|
+
raise 'Tables cannot be added due to meta data mismatch' unless @metadata == table.metadata
|
77
|
+
raise 'Tables cannot be added due to table properties mismatch' unless @table_properties.to_h == table.table_properties.to_h
|
74
78
|
TableTransform::Table.new(self.to_a + t2)
|
75
79
|
end
|
76
80
|
|
@@ -90,7 +94,7 @@ module TableTransform
|
|
90
94
|
def extract(header)
|
91
95
|
validate_column_names(*header)
|
92
96
|
selected_cols = @column_indexes.values_at(*header)
|
93
|
-
t = Table.new( @data_rows.inject([header]) {|res, row| (res << row.values_at(*selected_cols))} )
|
97
|
+
t = Table.new( @data_rows.inject([header]) {|res, row| (res << row.values_at(*selected_cols))}, @table_properties.to_h )
|
94
98
|
t.metadata = t.metadata.keys.zip(@metadata.values_at(*header)).to_h
|
95
99
|
t.formulas = header.zip(@formulas.values_at(*header)).to_h
|
96
100
|
t
|
@@ -98,7 +102,7 @@ module TableTransform
|
|
98
102
|
|
99
103
|
# @returns new table with rows that match given block
|
100
104
|
def filter
|
101
|
-
Table.new( @data_rows.select {|row| yield Row.new(@column_indexes, row)}.unshift @metadata.keys.clone )
|
105
|
+
Table.new( (@data_rows.select {|row| yield Row.new(@column_indexes, row)}.unshift @metadata.keys.clone), @table_properties.to_h )
|
102
106
|
end
|
103
107
|
|
104
108
|
#adds a column with given name to the far right of the table
|
@@ -164,6 +168,24 @@ module TableTransform
|
|
164
168
|
end
|
165
169
|
end
|
166
170
|
|
171
|
+
# Table properties
|
172
|
+
class TableProperties < TableTransform::Properties
|
173
|
+
def validate(properties)
|
174
|
+
super
|
175
|
+
properties.each { |k, v|
|
176
|
+
case k
|
177
|
+
when :name
|
178
|
+
raise "Table property '#{k}' expected to be a non-empty string" unless v.is_a?(String) && !v.empty?
|
179
|
+
when :auto_filter
|
180
|
+
raise "Table property '#{k}' expected to be a boolean" unless !!v == v
|
181
|
+
else
|
182
|
+
raise "Table property unknown '#{k}'"
|
183
|
+
end
|
184
|
+
}
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
|
167
189
|
protected
|
168
190
|
attr_writer :metadata
|
169
191
|
attr_writer :formulas
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: table_transform
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonas Lantto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -102,6 +102,7 @@ files:
|
|
102
102
|
- lib/table_transform.rb
|
103
103
|
- lib/table_transform/excel_creator.rb
|
104
104
|
- lib/table_transform/formula_helper.rb
|
105
|
+
- lib/table_transform/properties.rb
|
105
106
|
- lib/table_transform/table.rb
|
106
107
|
- lib/table_transform/version.rb
|
107
108
|
- table_transform.gemspec
|