Skip to content

Reject duplicate headers in dictionary views - #147

Open
rupayon123 wants to merge 1 commit into
swiftcsv:masterfrom
rupayon123:fix/reject-duplicate-named-headers-20261003
Open

rupayon123 wants to merge 1 commit into
swiftcsv:masterfrom
rupayon123:fix/reject-duplicate-named-headers-20261003

Conversation

@rupayon123

Copy link
Copy Markdown

Summary\n- Reject duplicate header names in dictionary-backed views and enumeration with a specific parse error instead of silently overwriting earlier columns.\n- Keep the enumerated view available for CSVs with repeated headers, where columns remain positionally distinct.\n- Add regression coverage for the reported translation CSV shape.\n\nCloses #134\n\n## Validation\n- Test Suite 'All tests' started at 2026-10-03 01:04:00.280.

Test Suite 'SwiftCSVPackageTests.xctest' started at 2026-10-03 01:04:00.286.
Test Suite 'CSVDelimiterGuessingTests' started at 2026-10-03 01:04:00.286.
Test Case '-[SwiftCSVTests.CSVDelimiterGuessingTests testGuessDelimiter_Comma]' started.
Test Case '-[SwiftCSVTests.CSVDelimiterGuessingTests testGuessDelimiter_Comma]' passed (0.002 seconds).
Test Case '-[SwiftCSVTests.CSVDelimiterGuessingTests testGuessDelimiter_IgnoresEmptyLeadingLines]' started.
Test Case '-[SwiftCSVTests.CSVDelimiterGuessingTests testGuessDelimiter_IgnoresEmptyLeadingLines]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.CSVDelimiterGuessingTests testGuessDelimiter_InvalidInput_FallbackToComma]' started.
Test Case '-[SwiftCSVTests.CSVDelimiterGuessingTests testGuessDelimiter_InvalidInput_FallbackToComma]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.CSVDelimiterGuessingTests testGuessDelimiter_Semicolon]' started.
Test Case '-[SwiftCSVTests.CSVDelimiterGuessingTests testGuessDelimiter_Semicolon]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.CSVDelimiterGuessingTests testGuessDelimiter_Tab]' started.
Test Case '-[SwiftCSVTests.CSVDelimiterGuessingTests testGuessDelimiter_Tab]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.CSVDelimiterGuessingTests testInitWithGuessedDelimiter]' started.
Test Case '-[SwiftCSVTests.CSVDelimiterGuessingTests testInitWithGuessedDelimiter]' passed (0.000 seconds).
Test Suite 'CSVDelimiterGuessingTests' passed at 2026-10-03 01:04:00.289.
Executed 6 tests, with 0 failures (0 unexpected) in 0.003 (0.003) seconds
Test Suite 'CSVDelimiterTests' started at 2026-10-03 01:04:00.289.
Test Case '-[SwiftCSVTests.CSVDelimiterTests testLiteralInitializer]' started.
Test Case '-[SwiftCSVTests.CSVDelimiterTests testLiteralInitializer]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.CSVDelimiterTests testRawValue]' started.
Test Case '-[SwiftCSVTests.CSVDelimiterTests testRawValue]' passed (0.000 seconds).
Test Suite 'CSVDelimiterTests' passed at 2026-10-03 01:04:00.290.
Executed 2 tests, with 0 failures (0 unexpected) in 0.000 (0.000) seconds
Test Suite 'DuplicateHeaderTests' started at 2026-10-03 01:04:00.290.
Test Case '-[SwiftCSVTests.DuplicateHeaderTests testDictionaryEnumerationRejectsDuplicateHeaders]' started.
Test Case '-[SwiftCSVTests.DuplicateHeaderTests testDictionaryEnumerationRejectsDuplicateHeaders]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.DuplicateHeaderTests testEnumeratedViewPreservesDuplicateHeaderColumns]' started.
Test Case '-[SwiftCSVTests.DuplicateHeaderTests testEnumeratedViewPreservesDuplicateHeaderColumns]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.DuplicateHeaderTests testNamedViewRejectsDuplicateHeaders]' started.
Test Case '-[SwiftCSVTests.DuplicateHeaderTests testNamedViewRejectsDuplicateHeaders]' passed (0.000 seconds).
Test Suite 'DuplicateHeaderTests' passed at 2026-10-03 01:04:00.291.
Executed 3 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds
Test Suite 'EnumeratedViewTests' started at 2026-10-03 01:04:00.291.
Test Case '-[SwiftCSVTests.EnumeratedViewTests testColumns]' started.
Test Case '-[SwiftCSVTests.EnumeratedViewTests testColumns]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.EnumeratedViewTests testColumns_WithLimit]' started.
Test Case '-[SwiftCSVTests.EnumeratedViewTests testColumns_WithLimit]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.EnumeratedViewTests testFillsIncompleteRows]' started.
Test Case '-[SwiftCSVTests.EnumeratedViewTests testFillsIncompleteRows]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.EnumeratedViewTests testRows]' started.
Test Case '-[SwiftCSVTests.EnumeratedViewTests testRows]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.EnumeratedViewTests testRows_WithLimit]' started.
Test Case '-[SwiftCSVTests.EnumeratedViewTests testRows_WithLimit]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.EnumeratedViewTests testSerialization]' started.
Test Case '-[SwiftCSVTests.EnumeratedViewTests testSerialization]' passed (0.000 seconds).
Test Suite 'EnumeratedViewTests' passed at 2026-10-03 01:04:00.292.
Executed 6 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds
Test Suite 'NamedViewTests' started at 2026-10-03 01:04:00.292.
Test Case '-[SwiftCSVTests.NamedViewTests testColumns]' started.
Test Case '-[SwiftCSVTests.NamedViewTests testColumns]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.NamedViewTests testColumns_WithLimit]' started.
Test Case '-[SwiftCSVTests.NamedViewTests testColumns_WithLimit]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.NamedViewTests testEnumerate]' started.
Test Case '-[SwiftCSVTests.NamedViewTests testEnumerate]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.NamedViewTests testFillsIncompleteRows]' started.
Test Case '-[SwiftCSVTests.NamedViewTests testFillsIncompleteRows]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.NamedViewTests testHeader]' started.
Test Case '-[SwiftCSVTests.NamedViewTests testHeader]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.NamedViewTests testIgnoreColumns]' started.
Test Case '-[SwiftCSVTests.NamedViewTests testIgnoreColumns]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.NamedViewTests testInit_ParseCommaSeparatedFileWithQuotesAndWhitespaces]' started.
Test Case '-[SwiftCSVTests.NamedViewTests testInit_ParseCommaSeparatedFileWithQuotesAndWhitespaces]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.NamedViewTests testRows]' started.
Test Case '-[SwiftCSVTests.NamedViewTests testRows]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.NamedViewTests testRows_WithLimit]' started.
Test Case '-[SwiftCSVTests.NamedViewTests testRows_WithLimit]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.NamedViewTests testSerialization]' started.
Test Case '-[SwiftCSVTests.NamedViewTests testSerialization]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.NamedViewTests testSerializationWithDoubleQuotes]' started.
Test Case '-[SwiftCSVTests.NamedViewTests testSerializationWithDoubleQuotes]' passed (0.000 seconds).
Test Suite 'NamedViewTests' passed at 2026-10-03 01:04:00.294.
Executed 11 tests, with 0 failures (0 unexpected) in 0.001 (0.002) seconds
Test Suite 'NewlineTests' started at 2026-10-03 01:04:00.294.
Test Case '-[SwiftCSVTests.NewlineTests testInit_whenThereIsExtraCarriageReturnAtTheEnd]' started.
Test Case '-[SwiftCSVTests.NewlineTests testInit_whenThereIsExtraCarriageReturnAtTheEnd]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.NewlineTests testInit_withCR]' started.
Test Case '-[SwiftCSVTests.NewlineTests testInit_withCR]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.NewlineTests testInit_withCRLF]' started.
Test Case '-[SwiftCSVTests.NewlineTests testInit_withCRLF]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.NewlineTests testInit_withLF]' started.
Test Case '-[SwiftCSVTests.NewlineTests testInit_withLF]' passed (0.000 seconds).
Test Suite 'NewlineTests' passed at 2026-10-03 01:04:00.295.
Executed 4 tests, with 0 failures (0 unexpected) in 0.000 (0.001) seconds
Test Suite 'ParserTests' started at 2026-10-03 01:04:00.295.
Test Case '-[SwiftCSVTests.ParserTests testParseArray_RowLimitAndOffset]' started.
Test Case '-[SwiftCSVTests.ParserTests testParseArray_RowLimitAndOffset]' passed (0.000 seconds).
Test Suite 'ParserTests' passed at 2026-10-03 01:04:00.295.
Executed 1 test, with 0 failures (0 unexpected) in 0.000 (0.000) seconds
Test Suite 'PerformanceTest' started at 2026-10-03 01:04:00.295.
Test Case '-[SwiftCSVTests.PerformanceTest testParsePerformance]' started.
/Users/rh_mac/Documents/Codex/2026-09-09/creat/work/swiftcsv-duplicate-headers-20261003/SwiftCSVTests/PerformanceTest.swift:27: Test Case '-[SwiftCSVTests.PerformanceTest testParsePerformance]' measured [Time, seconds] average: 0.000, relative standard deviation: 106.906%, values: [0.000032, 0.000011, 0.000005, 0.000004, 0.000003, 0.000012, 0.000004, 0.000003, 0.000003, 0.000003], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100
Test Case '-[SwiftCSVTests.PerformanceTest testParsePerformance]' passed (0.393 seconds).
Test Suite 'PerformanceTest' passed at 2026-10-03 01:04:00.688.
Executed 1 test, with 0 failures (0 unexpected) in 0.393 (0.394) seconds
Test Suite 'QuotedTests' started at 2026-10-03 01:04:00.688.
Test Case '-[SwiftCSVTests.QuotedTests testEmbeddedQuotes]' started.
Test Case '-[SwiftCSVTests.QuotedTests testEmbeddedQuotes]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.QuotedTests testQuotedContent]' started.
Test Case '-[SwiftCSVTests.QuotedTests testQuotedContent]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.QuotedTests testQuotedHeader]' started.
Test Case '-[SwiftCSVTests.QuotedTests testQuotedHeader]' passed (0.000 seconds).
Test Suite 'QuotedTests' passed at 2026-10-03 01:04:00.689.
Executed 3 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds
Test Suite 'TSVTests' started at 2026-10-03 01:04:00.689.
Test Case '-[SwiftCSVTests.TSVTests testInit_makesColumns]' started.
Test Case '-[SwiftCSVTests.TSVTests testInit_makesColumns]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.TSVTests testInit_makesHeader]' started.
Test Case '-[SwiftCSVTests.TSVTests testInit_makesHeader]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.TSVTests testInit_makesRows]' started.
Test Case '-[SwiftCSVTests.TSVTests testInit_makesRows]' passed (0.000 seconds).
Test Suite 'TSVTests' passed at 2026-10-03 01:04:00.690.
Executed 3 tests, with 0 failures (0 unexpected) in 0.000 (0.000) seconds
Test Suite 'URLTests' started at 2026-10-03 01:04:00.690.
Test Case '-[SwiftCSVTests.URLTests testBOMInHeadersWhenInitialisingFromString]' started.
Test Case '-[SwiftCSVTests.URLTests testBOMInHeadersWhenInitialisingFromString]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.URLTests testEmptyFields]' started.
Test Case '-[SwiftCSVTests.URLTests testEmptyFields]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.URLTests testQuotes]' started.
Test Case '-[SwiftCSVTests.URLTests testQuotes]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.URLTests testUTF8]' started.
Test Case '-[SwiftCSVTests.URLTests testUTF8]' passed (0.000 seconds).
Test Case '-[SwiftCSVTests.URLTests testUTF8Delimited]' started.
Test Case '-[SwiftCSVTests.URLTests testUTF8Delimited]' passed (0.000 seconds).
Test Suite 'URLTests' passed at 2026-10-03 01:04:00.691.
Executed 5 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds
Test Suite 'SwiftCSVPackageTests.xctest' passed at 2026-10-03 01:04:00.691.
Executed 45 tests, with 0 failures (0 unexpected) in 0.402 (0.405) seconds
Test Suite 'All tests' passed at 2026-10-03 01:04:00.691.
Executed 45 tests, with 0 failures (0 unexpected) in 0.402 (0.411) seconds
◇ Test run started.
↳ Testing Library Version: 1902
↳ Target Platform: arm64e-apple-macos14.0
✔ Test run with 0 tests in 0 suites passed after 0.001 seconds.: 45 tests passed.\n- Swift 4.2 language-mode test run: passed.\n- : passed.\n- SwiftLint was not available in this environment.\n\nThis contribution was prepared with AI assistance under my direction.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant