From cac5b8a3240bee9b669fe63bc0585d9294cd5b80 Mon Sep 17 00:00:00 2001 From: Edward Anderson Date: Wed, 2 Jan 2013 18:44:59 -0500 Subject: [PATCH 1/2] Don't add worksheets to the workbook when initialize fails Creating a worksheet with an invalid name would still add it to the workbook, despite raising an exception. --- lib/axlsx/workbook/worksheet/worksheet.rb | 2 +- test/workbook/worksheet/tc_worksheet.rb | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/axlsx/workbook/worksheet/worksheet.rb b/lib/axlsx/workbook/worksheet/worksheet.rb index 26385573..b02af18e 100644 --- a/lib/axlsx/workbook/worksheet/worksheet.rb +++ b/lib/axlsx/workbook/worksheet/worksheet.rb @@ -23,11 +23,11 @@ def self.thin_chars # @option options [Boolean] show_gridlines indicates if gridlines should be shown for this sheet. def initialize(wb, options={}) self.workbook = wb - @workbook.worksheets << self @sheet_protection = nil initialize_page_options(options) parse_options options + @workbook.worksheets << self end # Initalizes page margin, setup and print options diff --git a/test/workbook/worksheet/tc_worksheet.rb b/test/workbook/worksheet/tc_worksheet.rb index 8280aca0..b576047d 100644 --- a/test/workbook/worksheet/tc_worksheet.rb +++ b/test/workbook/worksheet/tc_worksheet.rb @@ -492,4 +492,10 @@ def test_outline_level_columns assert_equal(true, @ws.sheet_view.show_outline_symbols) end + def test_worksheet_does_not_get_added_to_workbook_on_initialize_failure + assert_equal(1, @wb.worksheets.size) + assert_raise(ArgumentError) { @wb.add_worksheet(:name => 'Sheet1') } + assert_equal(1, @wb.worksheets.size) + end + end From 2feb1ba5ae0d64012cff128c87631a32fc18de1a Mon Sep 17 00:00:00 2001 From: Edward Anderson Date: Wed, 2 Jan 2013 19:13:03 -0500 Subject: [PATCH 2/2] Worksheet name uniqueness doesn't apply to itself This constraint would prevent you from creating a new worksheet with the name that it would have gotten by default. --- lib/axlsx/workbook/worksheet/worksheet.rb | 4 ++-- test/workbook/worksheet/tc_worksheet.rb | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/axlsx/workbook/worksheet/worksheet.rb b/lib/axlsx/workbook/worksheet/worksheet.rb index b02af18e..5f650263 100644 --- a/lib/axlsx/workbook/worksheet/worksheet.rb +++ b/lib/axlsx/workbook/worksheet/worksheet.rb @@ -637,14 +637,14 @@ def outline(collection, range, level = 1, collapsed = true) end sheet_view.show_outline_symbols = true end - end + def validate_sheet_name(name) DataTypeValidator.validate "Worksheet.name", String, name raise ArgumentError, (ERR_SHEET_NAME_TOO_LONG % name) if name.size > 31 raise ArgumentError, (ERR_SHEET_NAME_CHARACTER_FORBIDDEN % name) if '[]*/\?:'.chars.any? { |char| name.include? char } name = Axlsx::coder.encode(name) - sheet_names = @workbook.worksheets.map { |s| s.name } + sheet_names = @workbook.worksheets.reject { |s| s == self }.map { |s| s.name } raise ArgumentError, (ERR_DUPLICATE_SHEET_NAME % name) if sheet_names.include?(name) end diff --git a/test/workbook/worksheet/tc_worksheet.rb b/test/workbook/worksheet/tc_worksheet.rb index b576047d..ed8c7cab 100644 --- a/test/workbook/worksheet/tc_worksheet.rb +++ b/test/workbook/worksheet/tc_worksheet.rb @@ -405,6 +405,11 @@ def test_name_unique assert_raise(ArgumentError, "worksheet name must be unique") { n = @ws.name; @ws.workbook.add_worksheet(:name=> n) } end + def test_name_unique_only_checks_other_worksheet_names + assert_nothing_raised { @ws.name = @ws.name } + assert_nothing_raised { Axlsx::Package.new.workbook.add_worksheet :name => 'Sheet1' } + end + def test_name_size assert_raise(ArgumentError, "name too long!") { @ws.name = Array.new(32, "A").join() } assert_nothing_raised { @ws.name = Array.new(31, "A").join() }