From d53658841c34f078a2e9667c02ada0d503fea631 Mon Sep 17 00:00:00 2001 From: "Angel N. Sciortino" Date: Thu, 25 Sep 2014 15:30:21 -0500 Subject: [PATCH 1/6] Fix rspec error "undefined method `run_all'" --- to_xls.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/to_xls.gemspec b/to_xls.gemspec index ac3b0b2..a95aeb8 100644 --- a/to_xls.gemspec +++ b/to_xls.gemspec @@ -21,7 +21,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency "spreadsheet" s.add_development_dependency "spreadsheet" - s.add_development_dependency "rspec", "~> 2.3.0" + s.add_development_dependency "rspec", "~> 2.4.0" s.add_development_dependency "bundler", "> 1.1.0" s.add_development_dependency "rake", "~> 0.9.2" end From 0315b630385dadffec61e68df0eee303e94a03fc Mon Sep 17 00:00:00 2001 From: "Angel N. Sciortino" Date: Thu, 25 Sep 2014 15:50:22 -0500 Subject: [PATCH 2/6] Multiple header rows can be used --- lib/to_xls/writer.rb | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/to_xls/writer.rb b/lib/to_xls/writer.rb index d655df5..3bdad7d 100644 --- a/lib/to_xls/writer.rb +++ b/lib/to_xls/writer.rb @@ -36,9 +36,15 @@ def write_sheet(sheet) row_index = 0 if headers_should_be_included? - apply_format_to_row(sheet.row(0), @header_format) - fill_row(sheet.row(0), headers) - row_index = 1 + if multiple_headers? + headers.each do |header_row| + fill_headers(sheet, header_row, row_index) + row_index += 1 + end + else + fill_headers(sheet, headers, row_index) + row_index += 1 + end end @array.each do |model| @@ -79,6 +85,9 @@ def headers_should_be_included? @options[:headers] != false end + def multiple_headers? + headers_should_be_included? && @options[:headers] && headers.all? {|h| h.is_a? Array} + end private def apply_format_to_row(row, format) @@ -89,6 +98,11 @@ def create_format(name) Spreadsheet::Format.new @options[name] if @options.has_key? name end + def fill_headers(sheet, headers, row_index) + apply_format_to_row(sheet.row(row_index), @header_format) + fill_row(sheet.row(row_index), headers) + end + def fill_row(row, column, model=nil) case column when String, Symbol From 07f29c2497853f17a15b17491f6cd599f64c6bb0 Mon Sep 17 00:00:00 2001 From: "Angel N. Sciortino" Date: Fri, 26 Sep 2014 09:40:51 -0500 Subject: [PATCH 3/6] Add specs for multiple header rows --- lib/to_xls/writer.rb | 23 +++++++++++++---------- spec/writer_spec.rb | 25 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/lib/to_xls/writer.rb b/lib/to_xls/writer.rb index 3bdad7d..068e5c2 100644 --- a/lib/to_xls/writer.rb +++ b/lib/to_xls/writer.rb @@ -35,16 +35,15 @@ def write_sheet(sheet) if columns.any? row_index = 0 - if headers_should_be_included? - if multiple_headers? - headers.each do |header_row| - fill_headers(sheet, header_row, row_index) - row_index += 1 - end - else - fill_headers(sheet, headers, row_index) + + if multiple_headers_should_be_included? + headers.each do |header_row| + fill_headers(sheet, header_row, row_index) row_index += 1 end + elsif headers_should_be_included? + fill_headers(sheet, headers, row_index) + row_index += 1 end @array.each do |model| @@ -85,8 +84,12 @@ def headers_should_be_included? @options[:headers] != false end - def multiple_headers? - headers_should_be_included? && @options[:headers] && headers.all? {|h| h.is_a? Array} + def multiple_headers_should_be_included? + return false unless headers_should_be_included? && @options[:multiple_headers] && @options[:headers] + unless headers.all? {|h| h.is_a? Array} + raise ArgumentError, ":headers (#{@headers.inspect}) must be an array of arrays" + end + true end private diff --git a/spec/writer_spec.rb b/spec/writer_spec.rb index 1414652..57f8142 100644 --- a/spec/writer_spec.rb +++ b/spec/writer_spec.rb @@ -77,6 +77,31 @@ ) end + it "uses multiple headers if the option is set and headers is an array of arrays" do + xls = make_book( mock_users, + :columns => [:name, :email, :age], + :multiple_headers => true, + :headers => [['Info', '', 'Other Info'], ['Nombre', 'Correo', 'Edad']] + ) + check_sheet( xls.worksheets.first, + [ ['Info', '', 'Other Info'], + ['Nombre', 'Correo', 'Edad'], + ['Peter', 'peter@gmail.com', 20], + ['John', 'john@gmail.com', 25], + ['Day9', 'day9@day9tv.com', 27] + ] + ) + end + + it "throws an error if multiple headers option is set but headers is not an array of arrays" do + lambda { + make_book( mock_users, + :columns => [:name, :email, :age], + :multiple_headers => true, + :headers => [['Info', '', 'Other Info'], 'Nombre', 'Correo', 'Edad'] + ) }.should raise_error + end + it "includes no headers if the headers option is false" do xls = make_book( mock_users, :columns => [:name, :email, :age], From dc9f64141f5171b04f9d51d5190f03a88e372a3b Mon Sep 17 00:00:00 2001 From: "Angel N. Sciortino" Date: Fri, 26 Sep 2014 09:49:22 -0500 Subject: [PATCH 4/6] Rename option from multiple_headers to multiple_header_rows for clarity --- lib/to_xls/writer.rb | 6 +++--- spec/writer_spec.rb | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/to_xls/writer.rb b/lib/to_xls/writer.rb index 068e5c2..f9038de 100644 --- a/lib/to_xls/writer.rb +++ b/lib/to_xls/writer.rb @@ -36,7 +36,7 @@ def write_sheet(sheet) row_index = 0 - if multiple_headers_should_be_included? + if multiple_header_rows_should_be_included? headers.each do |header_row| fill_headers(sheet, header_row, row_index) row_index += 1 @@ -84,8 +84,8 @@ def headers_should_be_included? @options[:headers] != false end - def multiple_headers_should_be_included? - return false unless headers_should_be_included? && @options[:multiple_headers] && @options[:headers] + def multiple_header_rows_should_be_included? + return false unless headers_should_be_included? && @options[:multiple_header_rows] && @options[:headers] unless headers.all? {|h| h.is_a? Array} raise ArgumentError, ":headers (#{@headers.inspect}) must be an array of arrays" end diff --git a/spec/writer_spec.rb b/spec/writer_spec.rb index 57f8142..18793b7 100644 --- a/spec/writer_spec.rb +++ b/spec/writer_spec.rb @@ -77,10 +77,10 @@ ) end - it "uses multiple headers if the option is set and headers is an array of arrays" do + it "uses multiple header rows if the option is set and headers is an array of arrays" do xls = make_book( mock_users, :columns => [:name, :email, :age], - :multiple_headers => true, + :multiple_header_rows => true, :headers => [['Info', '', 'Other Info'], ['Nombre', 'Correo', 'Edad']] ) check_sheet( xls.worksheets.first, @@ -93,11 +93,11 @@ ) end - it "throws an error if multiple headers option is set but headers is not an array of arrays" do + it "throws an error if multiple header rows option is set but headers is not an array of arrays" do lambda { make_book( mock_users, :columns => [:name, :email, :age], - :multiple_headers => true, + :multiple_header_rows => true, :headers => [['Info', '', 'Other Info'], 'Nombre', 'Correo', 'Edad'] ) }.should raise_error end From 36dec65bc898530b142a2b0c27f9c6830b6dac9e Mon Sep 17 00:00:00 2001 From: "Angel N. Sciortino" Date: Fri, 26 Sep 2014 09:55:42 -0500 Subject: [PATCH 5/6] Add documentation for multiple header rows --- README.rdoc | 1 + 1 file changed, 1 insertion(+) diff --git a/README.rdoc b/README.rdoc index 4591a70..0067915 100644 --- a/README.rdoc +++ b/README.rdoc @@ -14,6 +14,7 @@ It is (very slightly) oriented towards exporting ActiveRecord sets, but it can b @users.to_xls(:columns => [:name, :role]) # include only these columns, on this order @users.to_xls(:columns => [:name, {:company => [:name, :address]}]) # able to pick associations/called methods @users.to_xls(:columns => [:name, {:company => [:name, :address]}], :headers => ['Name', 'Company', 'Address']) # provide better names for the associated columns + @users.to_xls(:columns => [:name, {:company => [:name, :address]}], :headers => [['Personal', 'Company'], ['Name', 'Name', 'Address']], :multiple_header_rows => true) # use multiple rows of headers == Format From 6283dc4b2b015c179c0fd7b757e3c91672103299 Mon Sep 17 00:00:00 2001 From: Juan Alvarado Date: Sun, 31 May 2015 16:21:56 -0400 Subject: [PATCH 6/6] Update to_xls.gemspec Removed duplicate spreadsheet dependency as it was causing bundler issues on deploy. --- to_xls.gemspec | 1 - 1 file changed, 1 deletion(-) diff --git a/to_xls.gemspec b/to_xls.gemspec index a95aeb8..a9e0fb1 100644 --- a/to_xls.gemspec +++ b/to_xls.gemspec @@ -20,7 +20,6 @@ Gem::Specification.new do |s| s.require_paths = ["lib"] s.add_runtime_dependency "spreadsheet" - s.add_development_dependency "spreadsheet" s.add_development_dependency "rspec", "~> 2.4.0" s.add_development_dependency "bundler", "> 1.1.0" s.add_development_dependency "rake", "~> 0.9.2"