table_transform 0.1.0 → 0.2.0

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
2
  SHA1:
3
- metadata.gz: 7fb6bac3917263800ce0bf3ad130303f284d0370
4
- data.tar.gz: a2944c579b7c1df767b8c91133268c8ecac2de25
3
+ metadata.gz: 2d6d8a8e87390799ac51635a6889032993ab424f
4
+ data.tar.gz: 118f7f5592a983ee5ff77cad1e7960d73e032de8
5
5
  SHA512:
6
- metadata.gz: d409bbd7f233d8a24bfe2bb5f822579f9afa72fd94627b9d251918bbe7d329e91f7565690fdc3f1e78f42a88ef33db11a8711211db474006af1fffa1382a1626
7
- data.tar.gz: 915eda6a4a62242e77d89b888fa8209fb027a5190755af78d811f1e2a0db3321ba24c595a6864d00d214c04745c0188630b6830a59a44572c0d07720f5621eb9
6
+ metadata.gz: 320bd9c7eccdcf26649d717c3f254e7fcaa39f6cd88f256e6b91355c0d5f631a85ad5fe4a107af90f40bc3a6c755e670ee3dceb53d83c98e0fb8ae4f0d4fb899
7
+ data.tar.gz: 574420f128ca4cfc4b54db2a6a7058f562c5201294db8954c0965fde1850d05021198761376c7d7e07eb5c36633a39ca885b01e09a8c6bafd50936351dc3648b
data/CHANGELOG.md CHANGED
@@ -6,9 +6,18 @@ TableTransform is still in pre-release state. This means that its APIs and behav
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.2.0][] (2016-02-16)
10
+
11
+ * Added ability to publish Tables in *Microsoft Excel* format
12
+
13
+ Fixes:
14
+
15
+ * Require at least non empty header row to be present in Table
16
+
9
17
  ## 0.1.0 (2016-02-10)
10
18
 
11
19
  * Initial release including Table
12
20
 
13
21
  [Semver]: http://semver.org
14
- [Unreleased]: https://github.com/jonas-lantto/table_transform/compare/v0.1.0...HEAD
22
+ [Unreleased]: https://github.com/jonas-lantto/table_transform/compare/v0.2.0...HEAD
23
+ [0.2.0]: https://github.com/jonas-lantto/table_transform/compare/v0.1.0...0.2.0
data/README.md CHANGED
@@ -34,7 +34,7 @@ Or install it yourself as:
34
34
  data = [ %w(Name Age), %w(Jane 22)]
35
35
  t = TableTransform::Table.new(data)
36
36
 
37
- ### Work with the table
37
+ ### Transform
38
38
  # Add a new column to the far right
39
39
  t.add_column('NameLength'){|row| row['Name'].size}
40
40
 
@@ -55,9 +55,22 @@ Or install it yourself as:
55
55
  t2 = TableTransform::Table::create_empty(%w(Col1 Col2))
56
56
  t3 = t1 + t2
57
57
 
58
+
59
+ ### Publish
58
60
  # Export as array
59
61
  t.to_a
60
-
62
+
63
+ # Excel sheet
64
+ excel = TableTransform::ExcelCreator.new('output.xlsx')
65
+ excel.add_tab('Result', t)
66
+ excel.create!
67
+
68
+ #### Excel Creator
69
+ Will create an Excel Table on each tab. Name of the table will be the same as the sheet (except space replaced
70
+ with _)
71
+
72
+ Each column will be auto scaled to an approximate size based on column content.
73
+
61
74
  ## Contributing
62
75
 
63
76
  Bug reports and pull requests are welcome on [GitHub](https://github.com/jonas-lantto/table_transform).
@@ -0,0 +1,62 @@
1
+ require 'write_xlsx'
2
+
3
+
4
+ module TableTransform
5
+
6
+ # Creates excel file
7
+ class ExcelCreator
8
+ def initialize(filename)
9
+ @workbook = WriteXLSX.new(filename)
10
+ end
11
+
12
+ def create!
13
+ @workbook.close
14
+ end
15
+
16
+ def add_tab(name, table)
17
+ create_table(name, table.to_a)
18
+ end
19
+
20
+ #################################
21
+ private
22
+
23
+ # @return array with column width per column
24
+ def self.column_width(data, auto_filter_correct = true, max_width = 100)
25
+ return [] if data.empty?
26
+
27
+ auto_filter_size_correction = auto_filter_correct ? 3 : 0
28
+
29
+ res = Array.new(data.first.map { |x| x.to_s.size + auto_filter_size_correction })
30
+ data.each { |row|
31
+ row.each_with_index { |cell, column_no|
32
+ res[column_no] = [cell.to_s.size, res[column_no]].max
33
+ }
34
+ }
35
+ res.map! { |x| [x, max_width].min }
36
+ end
37
+
38
+ def create_table(name, data)
39
+ worksheet = @workbook.add_worksheet(name)
40
+ return if data.nil? or data.empty? # Create empty worksheet if no data
41
+
42
+ auto_filter = true
43
+ col_width = ExcelCreator::column_width(data, auto_filter)
44
+
45
+ header = data.shift
46
+ data << [nil] * header.count if data.empty? # Add extra row if empty
47
+
48
+ worksheet.add_table(
49
+ 0, 0, data.count, header.count - 1,
50
+ {
51
+ :name => name.tr(' ', '_'),
52
+ :data => data,
53
+ :autofilter => auto_filter ? 1 : 0,
54
+ :columns => header.map { |v| {:header => v} }
55
+ }
56
+ )
57
+
58
+ # Set column width
59
+ col_width.each_with_index { |size, column| worksheet.set_column(column, column, size) }
60
+ end
61
+ end
62
+ end
@@ -24,16 +24,13 @@ module TableTransform
24
24
  # @throws if column names not unique
25
25
  # @throws if column size for each row match
26
26
  def initialize(rows)
27
+ raise 'Table required to have at least a header row' if (rows.nil? or rows.empty?)
27
28
  @data_rows = rows.clone
28
29
  @header = @data_rows.shift
29
30
  @column_indexes = create_column_name_binding(@header)
30
31
 
31
- #validate header uniqueness
32
- dup = @header.select{ |e| @header.count(e) > 1 }.uniq
33
- raise "Column #{dup.map{|x| "'#{x}'"}.join(' and ')} not unique" if dup.size > 0
34
-
35
- #validate column size
36
- @data_rows.each_with_index {|x, index| raise "Column size mismatch. On row #{index+1}. Size #{x.size} expected to be #{@header.size}" if @header.size != x.size}
32
+ validate_header_uniqueness
33
+ validate_column_size
37
34
  end
38
35
 
39
36
  def << (hash_values)
@@ -105,6 +102,17 @@ module TableTransform
105
102
  self
106
103
  end
107
104
 
105
+ # @throws unless all header names are unique
106
+ private def validate_header_uniqueness
107
+ dup = @header.select{ |e| @header.count(e) > 1 }.uniq
108
+ raise "Column #{dup.map{|x| "'#{x}'"}.join(' and ')} not unique" if dup.size > 0
109
+ end
110
+
111
+ # @throws unless all rows have same number of elements
112
+ private def validate_column_size
113
+ @data_rows.each_with_index {|x, index| raise "Column size mismatch. On row #{index+1}. Size #{x.size} expected to be #{@header.size}" if @header.size != x.size}
114
+ end
115
+
108
116
  class Row
109
117
 
110
118
  def initialize(cols, row)
@@ -1,3 +1,3 @@
1
1
  module TableTransform
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -1,3 +1,3 @@
1
1
  require 'table_transform/version'
2
2
  require 'table_transform/table'
3
-
3
+ require 'table_transform/excel_creator'
@@ -19,7 +19,9 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ['lib']
21
21
 
22
- spec.add_development_dependency 'bundler', '~> 1.10'
23
- spec.add_development_dependency 'rake', '~> 10.0'
24
- spec.add_development_dependency 'minitest', '~> 5.0'
22
+ spec.add_development_dependency 'bundler', '~> 1.10'
23
+ spec.add_development_dependency 'rake', '~> 10.0'
24
+ spec.add_development_dependency 'minitest', '~> 5.0'
25
+ spec.add_development_dependency 'write_xlsx', '~> 0.83'
26
+ spec.add_development_dependency 'roo', '~> 2.3'
25
27
  end
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.1.0
4
+ version: 0.2.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-02-10 00:00:00.000000000 Z
11
+ date: 2016-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: write_xlsx
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.83'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.83'
69
+ - !ruby/object:Gem::Dependency
70
+ name: roo
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.3'
55
83
  description: ''
56
84
  email:
57
85
  - j@lantto.net
@@ -71,6 +99,7 @@ files:
71
99
  - README.md
72
100
  - Rakefile
73
101
  - lib/table_transform.rb
102
+ - lib/table_transform/excel_creator.rb
74
103
  - lib/table_transform/table.rb
75
104
  - lib/table_transform/version.rb
76
105
  - table_transform.gemspec