From 671a46e25d4d47e6ace7f7bf5c9c8b6efd482e6b Mon Sep 17 00:00:00 2001 From: sciencesakura Date: Fri, 6 Feb 2026 00:51:54 +0900 Subject: [PATCH] Add tsv() function that is shorthand of csv().withDelimiter(TAB). --- .../com/sciencesakura/dbsetup/csv/Import.java | 12 +++++++ .../sciencesakura/dbsetup/csv/ImportTest.java | 18 +++++++++-- .../WithDelimiter/with_delimiter.tsv | 2 +- .../sciencesakura/dbsetup/csv/Functions.kt | 26 +++++++++++++++ .../com/sciencesakura/dbsetup/csv/CsvTest.kt | 32 +++++++++++++++++++ kotlin/src/test/resources/kt_test.tsv | 2 +- 6 files changed, 88 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/sciencesakura/dbsetup/csv/Import.java b/core/src/main/java/com/sciencesakura/dbsetup/csv/Import.java index 387e654..ed955a6 100644 --- a/core/src/main/java/com/sciencesakura/dbsetup/csv/Import.java +++ b/core/src/main/java/com/sciencesakura/dbsetup/csv/Import.java @@ -59,6 +59,18 @@ public static Builder csv(@NotNull String location) { return new Builder(urlLocation); } + /** + * Creates a new {@code Import.Builder} instance with TSV format. + * + * @param location the {@code /}-separated path from classpath root to the TSV file + * @return the new {@code Import.Builder} instance + * @throws IllegalArgumentException if the TSV file is not found + */ + @NotNull + public static Builder tsv(@NotNull String location) { + return csv(location).withDelimiter('\t'); + } + private static CSVFormat createFormat(Builder builder) { var fb = CSVFormat.Builder.create(CSVFormat.DEFAULT) .setDelimiter(builder.delimiter) diff --git a/core/src/test/java/com/sciencesakura/dbsetup/csv/ImportTest.java b/core/src/test/java/com/sciencesakura/dbsetup/csv/ImportTest.java index 98c88de..020a638 100644 --- a/core/src/test/java/com/sciencesakura/dbsetup/csv/ImportTest.java +++ b/core/src/test/java/com/sciencesakura/dbsetup/csv/ImportTest.java @@ -6,6 +6,7 @@ import static com.ninja_squad.dbsetup.Operations.sql; import static com.ninja_squad.dbsetup.Operations.truncate; import static com.sciencesakura.dbsetup.csv.Import.csv; +import static com.sciencesakura.dbsetup.csv.Import.tsv; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.db.api.Assertions.assertThat; @@ -281,8 +282,21 @@ void specify_delimiter_explicitly() { .hasNumberOfChanges(1) .changeOfCreation() .rowAtEndPoint() - .value("id").isEqualTo(1) - .value("name").isEqualTo("Alice"); + .value("id").isEqualTo(2) + .value("name").isEqualTo("Bob"); + } + + @Test + void use_tab_if_tsv_function_invoked() { + changes.setStartPointNow(); + var operation = tsv("WithDelimiter/with_delimiter.tsv").build(); + new DbSetup(destination, operation).launch(); + assertThat(changes.setEndPointNow()) + .hasNumberOfChanges(1) + .changeOfCreation() + .rowAtEndPoint() + .value("id").isEqualTo(2) + .value("name").isEqualTo("Bob"); } } diff --git a/core/src/test/resources/WithDelimiter/with_delimiter.tsv b/core/src/test/resources/WithDelimiter/with_delimiter.tsv index fdcdebf..f746611 100644 --- a/core/src/test/resources/WithDelimiter/with_delimiter.tsv +++ b/core/src/test/resources/WithDelimiter/with_delimiter.tsv @@ -1,2 +1,2 @@ id name -1 Alice +2 Bob diff --git a/kotlin/src/main/kotlin/com/sciencesakura/dbsetup/csv/Functions.kt b/kotlin/src/main/kotlin/com/sciencesakura/dbsetup/csv/Functions.kt index 3f8fb0e..90b5edd 100644 --- a/kotlin/src/main/kotlin/com/sciencesakura/dbsetup/csv/Functions.kt +++ b/kotlin/src/main/kotlin/com/sciencesakura/dbsetup/csv/Functions.kt @@ -29,3 +29,29 @@ fun DbSetupBuilder.csv( builder.configure() this.execute(builder.build()) } + +/** + * Creates a TSV import operation. + * + * @param location the `/`-separated path from classpath root to the TSV file + * @throws IllegalArgumentException if the TSV file is not found + */ +fun DbSetupBuilder.tsv(location: String) { + this.execute(Import.tsv(location).build()) +} + +/** + * Creates a TSV import operation. + * + * @param location the `/`-separated path from classpath root to the TSV file + * @param configure A lambda to configure the import operation + * @throws IllegalArgumentException if the TSV file is not found + */ +fun DbSetupBuilder.tsv( + location: String, + configure: Import.Builder.() -> Unit, +) { + val builder = Import.tsv(location) + builder.configure() + this.execute(builder.build()) +} diff --git a/kotlin/src/test/kotlin/com/sciencesakura/dbsetup/csv/CsvTest.kt b/kotlin/src/test/kotlin/com/sciencesakura/dbsetup/csv/CsvTest.kt index 55a20dc..a9523b1 100644 --- a/kotlin/src/test/kotlin/com/sciencesakura/dbsetup/csv/CsvTest.kt +++ b/kotlin/src/test/kotlin/com/sciencesakura/dbsetup/csv/CsvTest.kt @@ -60,6 +60,38 @@ class CsvTest { } }.launch() @Suppress("ktlint:standard:chain-method-continuation") + assertThat(changes.setEndPointNow()) + .hasNumberOfChanges(1) + .changeOfCreation() + .rowAtEndPoint() + .value("id").isEqualTo(2) + .value("name").isEqualTo("bar") + } + + @Test + fun import_tsv() { + changes.setStartPointNow() + dbSetup(destination) { + tsv("kt_test.tsv") + }.launch() + @Suppress("ktlint:standard:chain-method-continuation") + assertThat(changes.setEndPointNow()) + .hasNumberOfChanges(1) + .changeOfCreation() + .rowAtEndPoint() + .value("id").isEqualTo(2) + .value("name").isEqualTo("bar") + } + + @Test + fun import_tsv_with_configure() { + changes.setStartPointNow() + dbSetup(destination) { + tsv("kt_test.csv") { + withDelimiter(',') + } + }.launch() + @Suppress("ktlint:standard:chain-method-continuation") assertThat(changes.setEndPointNow()) .hasNumberOfChanges(1) .changeOfCreation() diff --git a/kotlin/src/test/resources/kt_test.tsv b/kotlin/src/test/resources/kt_test.tsv index c4c3847..b3833ca 100644 --- a/kotlin/src/test/resources/kt_test.tsv +++ b/kotlin/src/test/resources/kt_test.tsv @@ -1,2 +1,2 @@ id name -1 foo +2 bar