Android overhaul: one CopyCategoryKeywords task in build-logic instead of a copy in :data and :core:fakes

The task class and its wiring were duplicated verbatim in both build scripts; bundleCategoryKeywords(resourcePath)
registers it once per module. Resource paths and inputs are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B
This commit is contained in:
2026-10-18 22:53:44 +02:00
parent 48fe119ae1
commit e4e6e5d792
11 changed files with 76 additions and 368 deletions
+11 -40
View File
@@ -1,6 +1,9 @@
import se.hagstedt.kvitt.buildlogic.bundleCategoryKeywords
import se.hagstedt.kvitt.buildlogic.categoryKeywordsTable
// :data — Room database, Ktor client, token store, sync engine, WorkManager workers, the real repositories and the APK
// updater (SPEC §6.2, §14.2, §14.4; owned by M5). Hilt modules here provide the implementations; :app (M8) binds the
// :core:model interfaces to them.
// updater (SPEC §6.2, §14.2, §14.4). Hilt modules here provide the implementations; :app binds the :core:model
// interfaces to them.
plugins {
id("kvitt.android.library")
id("kvitt.android.hilt")
@@ -41,48 +44,16 @@ dependencies {
// so a changed contract file re-runs the tests.
val contractsExamples = rootProject.layout.projectDirectory.dir("../contracts/examples")
val roomSchemas = layout.projectDirectory.dir("schemas")
val categoryKeywordsTable = rootProject.layout.projectDirectory.file("../contracts/category-keywords.csv")
val keywordsTable = categoryKeywordsTable()
tasks.withType<Test>().configureEach {
inputs.dir(contractsExamples).withPathSensitivity(PathSensitivity.RELATIVE).withPropertyName("contractsExamples")
inputs.dir(roomSchemas).withPathSensitivity(PathSensitivity.RELATIVE).withPropertyName("roomSchemas")
systemProperty("kvitt.contracts.examples", contractsExamples.asFile.absolutePath)
systemProperty("kvitt.room.schemas", roomSchemas.asFile.absolutePath)
inputs.file(categoryKeywordsTable).withPathSensitivity(PathSensitivity.RELATIVE).withPropertyName("categoryKeywords")
systemProperty("kvitt.contracts.keywords", categoryKeywordsTable.asFile.absolutePath)
inputs.file(keywordsTable).withPathSensitivity(PathSensitivity.RELATIVE).withPropertyName("categoryKeywords")
systemProperty("kvitt.contracts.keywords", keywordsTable.asFile.absolutePath)
}
// The keyword table of the category suggestion (UX-3, SPEC §9.11 CS-6) is bundled as the Java resource
// se/hagstedt/kvitt/data/category-keywords.csv, copied from contracts/category-keywords.csv at build time (never
// hand-copied). A missing table fails the build: the task's input file must exist.
abstract class CopyCategoryKeywords : DefaultTask() {
@get:InputFile
@get:PathSensitive(PathSensitivity.NONE)
abstract val table: RegularFileProperty
@get:Input
abstract val resourcePath: Property<String>
@get:OutputDirectory
abstract val outputDir: DirectoryProperty
@TaskAction
fun copy() {
val source = table.get().asFile
if (!source.isFile) throw GradleException("missing ${source.path}")
val root = outputDir.get().asFile
root.deleteRecursively()
val target = root.resolve(resourcePath.get())
target.parentFile.mkdirs()
source.copyTo(target)
}
}
val copyCategoryKeywords = tasks.register<CopyCategoryKeywords>("copyCategoryKeywords") {
description = "Copies contracts/category-keywords.csv into the main Java resources."
table.set(categoryKeywordsTable)
resourcePath.set("se/hagstedt/kvitt/data/category-keywords.csv")
outputDir.set(layout.buildDirectory.dir("generated/category-keywords"))
}
androidComponents {
onVariants { variant -> variant.sources.resources?.addGeneratedSourceDirectory(copyCategoryKeywords, CopyCategoryKeywords::outputDir) }
}
// The keyword table of the category suggestion (UX-3, SPEC §9.11 CS-6), bundled as the Java resource
// se/hagstedt/kvitt/data/category-keywords.csv.
bundleCategoryKeywords("se/hagstedt/kvitt/data/category-keywords.csv")