From 648c7277cfd4739a573bae8b4598823afdc372e1 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Wed, 25 Jun 2025 21:48:31 -0500 Subject: [PATCH] CSV export: Add more fields to Habits.csv --- .../assets/test/csv_export/Habits.csv | 6 +++--- .../isoron/uhabits/core/models/HabitList.kt | 21 ++++++++++++++----- .../uhabits/core/io/HabitsCSVExporterTest.kt | 19 +++++++---------- .../uhabits/core/models/HabitListTest.kt | 9 +++++--- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/uhabits-core/assets/test/csv_export/Habits.csv b/uhabits-core/assets/test/csv_export/Habits.csv index 672189f33..14943fa5c 100644 --- a/uhabits-core/assets/test/csv_export/Habits.csv +++ b/uhabits-core/assets/test/csv_export/Habits.csv @@ -1,3 +1,3 @@ -Position,Name,Question,Description,NumRepetitions,Interval,Color -001,Meditate,Did you meditate this morning?,,1,1,#FF8F00 -002,Wake up early,Did you wake up before 6am?,,2,3,#00897B +Position,Name,Type,Question,Description,FrequencyNumerator,FrequencyDenominator,Color,Unit,Target Type,Target Value,Archived? +001,Meditate,YES_NO,Did you meditate this morning?,,1,1,#FF8F00,,,,false +002,Wake up early,YES_NO,Did you wake up before 6am?,,2,3,#00897B,,,,false diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt index 74ee0a700..6227df991 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt @@ -22,6 +22,7 @@ import com.opencsv.CSVWriter import java.io.IOException import java.io.Writer import java.util.LinkedList +import java.util.Locale import javax.annotation.concurrent.ThreadSafe /** @@ -182,24 +183,34 @@ abstract class HabitList : Iterable { val header = arrayOf( "Position", "Name", + "Type", "Question", "Description", - "NumRepetitions", - "Interval", - "Color" + "FrequencyNumerator", + "FrequencyDenominator", + "Color", + "Unit", + "Target Type", + "Target Value", + "Archived?", ) val csv = CSVWriter(out) csv.writeNext(header, false) for (habit in this) { val (numerator, denominator) = habit.frequency val cols = arrayOf( - String.format("%03d", indexOf(habit) + 1), + String.format(Locale.US, "%03d", indexOf(habit) + 1), habit.name, + habit.type.name, habit.question, habit.description, numerator.toString(), denominator.toString(), - habit.color.toCsvColor() + habit.color.toCsvColor(), + if (habit.isNumerical) habit.unit else "", + if (habit.isNumerical) habit.targetType.name else "", + if (habit.isNumerical) habit.targetValue.toString() else "", + habit.isArchived.toString(), ) csv.writeNext(cols, false) } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/HabitsCSVExporterTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/HabitsCSVExporterTest.kt index bbe069be8..5362e640e 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/HabitsCSVExporterTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/io/HabitsCSVExporterTest.kt @@ -18,7 +18,6 @@ */ package org.isoron.uhabits.core.io -import org.apache.commons.io.FileUtils import org.apache.commons.io.IOUtils import org.isoron.uhabits.core.BaseUnitTest import org.isoron.uhabits.core.models.Habit @@ -30,6 +29,7 @@ import java.io.IOException import java.nio.file.Files import java.util.* import java.util.zip.ZipFile +import kotlin.test.assertEquals import kotlin.test.assertTrue class HabitsCSVExporterTest : BaseUnitTest() { @@ -108,15 +108,12 @@ class HabitsCSVExporterTest : BaseUnitTest() { private fun assertFileAndReferenceAreEqual(s: String) { val assetFilename = String.format("csv_export/%s", s) - val file = File.createTempFile("asset", "") - file.deleteOnExit() - copyAssetToFile(assetFilename, file) - - assertTrue( - FileUtils.contentEquals( - file, - File(String.format("%s/%s", baseDir.absolutePath, s)) - ) - ) + val expectedFile = File(String.format("%s/%s", baseDir.absolutePath, s)) + val actualFile = File.createTempFile("asset", "") + actualFile.deleteOnExit() + copyAssetToFile(assetFilename, actualFile) + val expectedContents = expectedFile.readText() + val actualContents = actualFile.readText() + assertEquals(expectedContents, actualContents, "content mismatch for $s") } } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitListTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitListTest.kt index f4cecda6f..8272ef4e2 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitListTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/models/HabitListTest.kt @@ -202,13 +202,16 @@ class HabitListTest : BaseUnitTest() { h2.description = "" h2.frequency = Frequency(2, 3) h2.color = PaletteColor(5) + val h3 = fixtures.createNumericalHabit() list.add(h1) list.add(h2) + list.add(h3) val expectedCSV = """ - Position,Name,Question,Description,NumRepetitions,Interval,Color - 001,Meditate,Did you meditate this morning?,this is a test description,1,1,#FF8F00 - 002,Wake up early,Did you wake up before 6am?,,2,3,#AFB42B + Position,Name,Type,Question,Description,FrequencyNumerator,FrequencyDenominator,Color,Unit,Target Type,Target Value,Archived? + 001,Meditate,YES_NO,Did you meditate this morning?,this is a test description,1,1,#FF8F00,,,,false + 002,Run,NUMERICAL,How many miles did you run today?,,1,1,#E64A19,miles,AT_LEAST,2.0,false + 003,Wake up early,YES_NO,Did you wake up before 6am?,,2,3,#AFB42B,,,,false """.trimIndent() val writer = StringWriter()