From b8995c4481e06b5865b3e00a94c95f61b38c4af7 Mon Sep 17 00:00:00 2001 From: benjaperez1983 Date: Tue, 7 Jan 2025 09:02:29 +0100 Subject: [PATCH 1/5] #2115 error when importing empty row --- .../Core/DataSheet.cs | 11 ++- .../CsvDataSourceFile.cs | 2 +- .../ExcelDataSourceFile.cs | 2 +- .../Presenters/Importer/ImporterPresenter.cs | 2 + .../Presenters/ImporterPresenterSpecs.cs | 75 +++++++++++++++++++ 5 files changed, 89 insertions(+), 3 deletions(-) diff --git a/src/OSPSuite.Infrastructure.Import/Core/DataSheet.cs b/src/OSPSuite.Infrastructure.Import/Core/DataSheet.cs index e0873b3ca..160c424c6 100644 --- a/src/OSPSuite.Infrastructure.Import/Core/DataSheet.cs +++ b/src/OSPSuite.Infrastructure.Import/Core/DataSheet.cs @@ -173,7 +173,7 @@ public void RemoveEmptyColumns() } } - public void RemoveEmptyRows() + public void RemoveEmptyRowsAtTheEnd() { for (var i = _rawDataTable.Count - 1; i >= 0; i--) { @@ -184,6 +184,15 @@ public void RemoveEmptyRows() } } + public void RemoveEmptyRows() + { + for (var i = _rawDataTable.Count - 1; i >= 0; i--) + { + if (_rawDataTable[i].All(x => x.IsNullOrEmpty())) + _rawDataTable.RemoveAt(i); + } + } + public string SheetName { get; set; } } } \ No newline at end of file diff --git a/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/CsvDataSourceFile.cs b/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/CsvDataSourceFile.cs index a51c7ce7c..acc950f27 100644 --- a/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/CsvDataSourceFile.cs +++ b/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/CsvDataSourceFile.cs @@ -59,7 +59,7 @@ protected override void LoadFromFile(string path) } dataSheet.RemoveEmptyColumns(); - dataSheet.RemoveEmptyRows(); + dataSheet.RemoveEmptyRowsAtTheEnd(); DataSheets.AddSheet(dataSheet); } diff --git a/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/ExcelDataSourceFile.cs b/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/ExcelDataSourceFile.cs index 082810dab..280ef5d40 100644 --- a/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/ExcelDataSourceFile.cs +++ b/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/ExcelDataSourceFile.cs @@ -51,7 +51,7 @@ protected override void LoadFromFile(string path) } rawSheetData.RemoveEmptyColumns(); - rawSheetData.RemoveEmptyRows(); + rawSheetData.RemoveEmptyRowsAtTheEnd(); DataSheets.AddSheet(rawSheetData); } diff --git a/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs b/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs index 1866cdc54..8e67d5fe0 100644 --- a/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs +++ b/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs @@ -218,6 +218,8 @@ private void loadSheets(IDataSourceFile dataSourceFile, IReadOnlyList sh } var sheets = dataSourceFile.DataSheets.GetDataSheetsByName(sheetNames); + sheets.Each(sheet => sheet.RemoveEmptyRows()); + var dataMappings = dataSourceFile.Format.GetParameters().Where(p => p.ColumnName != null).Select(md => new MetaDataMappingConverter() { diff --git a/tests/OSPSuite.Presentation.Tests/Importer/Presenters/ImporterPresenterSpecs.cs b/tests/OSPSuite.Presentation.Tests/Importer/Presenters/ImporterPresenterSpecs.cs index 0ad88f055..6306e9558 100644 --- a/tests/OSPSuite.Presentation.Tests/Importer/Presenters/ImporterPresenterSpecs.cs +++ b/tests/OSPSuite.Presentation.Tests/Importer/Presenters/ImporterPresenterSpecs.cs @@ -208,6 +208,81 @@ public void sets_column_mapping_presenter_settings() } } + public class When_setting_data_source_with_empty_rows : concern_for_ImporterPresenter + { + private RandomDataSourceFile _dataSourceFile; + protected Cache _sheets; + + protected override void Context() + { + base.Context(); + _sheets = new Cache(); + _sheets.Add("Sheet1", A.Fake()); + + _dataSourceFile = new RandomDataSourceFile(A.Fake()); + _dataSourceFile.Format = A.Fake(); + _dataSourceFile.Path = "FakePath"; + A.CallTo(() => _importerDataPresenter.SetDataSource(A.Ignored)).Returns(_dataSourceFile); + _importerDataPresenter.OnImportSheets += Raise.With(new ImportSheetsEventArgs() + { Filter = "", DataSourceFile = _dataSourceFile, SheetNames = _sheets.Keys.ToList() }); + } + + [Observation] + public void should_not_throw_an_ImporterParsingException() + { + sut.LoadConfiguration(_importerConfiguration, ""); + } + + //This class needs to be added to create a random data source file + //With the empty rows that we need to test + public class RandomDataSourceFile : DataSourceFile + { + public RandomDataSourceFile(IImportLogger logger) : base(logger) + { + } + + protected override void LoadFromFile(string path) + { + Console.WriteLine($"Loading data from file: {path} (simulated random data)"); + + var random = new Random(); + int numberOfSheets = 1; + + for (int i = 0; i < numberOfSheets; i++) + { + var dataSheet = new DataSheet + { + SheetName = $"Sheet{i + 1}" + }; + + int numberOfRows = 5; + int numberOfColumns = 3; + + for (int c = 0; c < numberOfColumns; c++) + { + dataSheet.AddColumn($"Column{c + 1}", c); + } + + var emptyRow = new List(Enumerable.Repeat(string.Empty, numberOfColumns)); + dataSheet.AddRow(emptyRow); + + for (int r = 0; r < numberOfRows; r++) + { + var row = new List(); + for (int c = 0; c < numberOfColumns; c++) + { + row.Add($"Data_{i + 1}_{r + 1}_{c + 1}"); + } + + dataSheet.AddRow(row); + } + + DataSheets.AddSheet(dataSheet); + } + } + } + } + public class When_import_data : concern_for_ImporterPresenter { protected bool triggered = false; From eac9da938f30c54f8f5daaf3eb04398c6adcfd2e Mon Sep 17 00:00:00 2001 From: benjaperez1983 Date: Wed, 8 Jan 2025 11:38:30 +0100 Subject: [PATCH 2/5] #2115 test update --- .../Presenters/Importer/ImporterPresenter.cs | 2 +- .../Data/IntegrationSampleUnitFromColumn.xlsx | Bin 9695 -> 9736 bytes .../Presenters/ImporterPresenterSpecs.cs | 56 ++---------------- 3 files changed, 5 insertions(+), 53 deletions(-) diff --git a/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs b/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs index 8e67d5fe0..246a6689a 100644 --- a/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs +++ b/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs @@ -210,7 +210,7 @@ private ParseErrors validateDataSource(IDataSource dataSource) } private void loadSheets(IDataSourceFile dataSourceFile, IReadOnlyList sheetNames, string filter, string selectedNamingConvention = null) - { + { if (!sheetNames.Any()) { View.DisableConfirmationView(); diff --git a/tests/OSPSuite.Presentation.Tests/Data/IntegrationSampleUnitFromColumn.xlsx b/tests/OSPSuite.Presentation.Tests/Data/IntegrationSampleUnitFromColumn.xlsx index 3d5aeeb502adf37ec27d1a4a478eb36c7866d904..07595214d71c94bf2bb1c5af2f19de612c9d5140 100644 GIT binary patch delta 4047 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 x9QlZa1|ted&%#Rk&l~ _sheets; protected override void Context() @@ -219,9 +220,9 @@ protected override void Context() _sheets = new Cache(); _sheets.Add("Sheet1", A.Fake()); - _dataSourceFile = new RandomDataSourceFile(A.Fake()); + _dataSourceFile = new ExcelDataSourceFile(A.Fake()); _dataSourceFile.Format = A.Fake(); - _dataSourceFile.Path = "FakePath"; + _dataSourceFile.Path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Data", "IntegrationSampleUnitFromColumn.xlsx"); A.CallTo(() => _importerDataPresenter.SetDataSource(A.Ignored)).Returns(_dataSourceFile); _importerDataPresenter.OnImportSheets += Raise.With(new ImportSheetsEventArgs() { Filter = "", DataSourceFile = _dataSourceFile, SheetNames = _sheets.Keys.ToList() }); @@ -232,55 +233,6 @@ public void should_not_throw_an_ImporterParsingException() { sut.LoadConfiguration(_importerConfiguration, ""); } - - //This class needs to be added to create a random data source file - //With the empty rows that we need to test - public class RandomDataSourceFile : DataSourceFile - { - public RandomDataSourceFile(IImportLogger logger) : base(logger) - { - } - - protected override void LoadFromFile(string path) - { - Console.WriteLine($"Loading data from file: {path} (simulated random data)"); - - var random = new Random(); - int numberOfSheets = 1; - - for (int i = 0; i < numberOfSheets; i++) - { - var dataSheet = new DataSheet - { - SheetName = $"Sheet{i + 1}" - }; - - int numberOfRows = 5; - int numberOfColumns = 3; - - for (int c = 0; c < numberOfColumns; c++) - { - dataSheet.AddColumn($"Column{c + 1}", c); - } - - var emptyRow = new List(Enumerable.Repeat(string.Empty, numberOfColumns)); - dataSheet.AddRow(emptyRow); - - for (int r = 0; r < numberOfRows; r++) - { - var row = new List(); - for (int c = 0; c < numberOfColumns; c++) - { - row.Add($"Data_{i + 1}_{r + 1}_{c + 1}"); - } - - dataSheet.AddRow(row); - } - - DataSheets.AddSheet(dataSheet); - } - } - } } public class When_import_data : concern_for_ImporterPresenter From ca0b8b263d413529423f9958a6e790d8fe6a39fe Mon Sep 17 00:00:00 2001 From: benjaperez1983 Date: Wed, 8 Jan 2025 14:00:39 +0100 Subject: [PATCH 3/5] #2115 remove empty rows --- src/OSPSuite.Infrastructure.Import/Core/DataSheet.cs | 11 ----------- .../Core/DataSourceFileReaders/CsvDataSourceFile.cs | 2 +- .../Core/DataSourceFileReaders/ExcelDataSourceFile.cs | 2 +- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/OSPSuite.Infrastructure.Import/Core/DataSheet.cs b/src/OSPSuite.Infrastructure.Import/Core/DataSheet.cs index 160c424c6..82bbbb21b 100644 --- a/src/OSPSuite.Infrastructure.Import/Core/DataSheet.cs +++ b/src/OSPSuite.Infrastructure.Import/Core/DataSheet.cs @@ -173,17 +173,6 @@ public void RemoveEmptyColumns() } } - public void RemoveEmptyRowsAtTheEnd() - { - for (var i = _rawDataTable.Count - 1; i >= 0; i--) - { - if (_rawDataTable[i].All(x => x.IsNullOrEmpty())) - _rawDataTable.RemoveAt(i); - else - break; - } - } - public void RemoveEmptyRows() { for (var i = _rawDataTable.Count - 1; i >= 0; i--) diff --git a/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/CsvDataSourceFile.cs b/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/CsvDataSourceFile.cs index acc950f27..a51c7ce7c 100644 --- a/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/CsvDataSourceFile.cs +++ b/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/CsvDataSourceFile.cs @@ -59,7 +59,7 @@ protected override void LoadFromFile(string path) } dataSheet.RemoveEmptyColumns(); - dataSheet.RemoveEmptyRowsAtTheEnd(); + dataSheet.RemoveEmptyRows(); DataSheets.AddSheet(dataSheet); } diff --git a/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/ExcelDataSourceFile.cs b/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/ExcelDataSourceFile.cs index 280ef5d40..082810dab 100644 --- a/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/ExcelDataSourceFile.cs +++ b/src/OSPSuite.Infrastructure.Import/Core/DataSourceFileReaders/ExcelDataSourceFile.cs @@ -51,7 +51,7 @@ protected override void LoadFromFile(string path) } rawSheetData.RemoveEmptyColumns(); - rawSheetData.RemoveEmptyRowsAtTheEnd(); + rawSheetData.RemoveEmptyRows(); DataSheets.AddSheet(rawSheetData); } From bc1e0c259cdb1cb1eca3b6e25501d05f0e3e4445 Mon Sep 17 00:00:00 2001 From: benjaperez1983 Date: Wed, 8 Jan 2025 14:23:01 +0100 Subject: [PATCH 4/5] #2115 remove extra instructions --- .../Presenters/Importer/ImporterPresenter.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs b/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs index 246a6689a..08399278e 100644 --- a/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs +++ b/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs @@ -218,7 +218,6 @@ private void loadSheets(IDataSourceFile dataSourceFile, IReadOnlyList sh } var sheets = dataSourceFile.DataSheets.GetDataSheetsByName(sheetNames); - sheets.Each(sheet => sheet.RemoveEmptyRows()); var dataMappings = dataSourceFile.Format.GetParameters().Where(p => p.ColumnName != null).Select(md => new MetaDataMappingConverter() From 242e24c0c401aa7472aca040b06bb94bb1cff0aa Mon Sep 17 00:00:00 2001 From: benjaperez1983 Date: Wed, 8 Jan 2025 14:27:55 +0100 Subject: [PATCH 5/5] #2115 code cleanup --- .../Presenters/Importer/ImporterPresenter.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs b/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs index 08399278e..1866cdc54 100644 --- a/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs +++ b/src/OSPSuite.Presentation/Presenters/Importer/ImporterPresenter.cs @@ -210,7 +210,7 @@ private ParseErrors validateDataSource(IDataSource dataSource) } private void loadSheets(IDataSourceFile dataSourceFile, IReadOnlyList sheetNames, string filter, string selectedNamingConvention = null) - { + { if (!sheetNames.Any()) { View.DisableConfirmationView(); @@ -218,7 +218,6 @@ private void loadSheets(IDataSourceFile dataSourceFile, IReadOnlyList sh } var sheets = dataSourceFile.DataSheets.GetDataSheetsByName(sheetNames); - var dataMappings = dataSourceFile.Format.GetParameters().Where(p => p.ColumnName != null).Select(md => new MetaDataMappingConverter() {