table_transform 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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