wolfskin/wolfskin-design/build.gradle.kts
justinzeus c78a8dfa8d
Some checks failed
review/safety-opus Blocking: versionCode ledger bypassable; tv-publish lacks monotonic check
Cache each Robolectric SDK without version conflicts
2026-11-07 19:12:21 +01:00

70 lines
3 KiB
Kotlin

import java.security.MessageDigest
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.compose)
}
android {
namespace = "org.justinvisser.wolfskin.design"
compileSdk = libs.versions.compileSdk.get().toInt()
defaultConfig { minSdk = libs.versions.minSdk.get().toInt() }
buildFeatures { compose = true }
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
testOptions.unitTests.isIncludeAndroidResources = true
}
kotlin.compilerOptions.jvmTarget = JvmTarget.JVM_11
val cacheRobolectricSdk by tasks.registering(Copy::class) {
val versions = listOf(
"9-robolectric-4913185-2-i7",
"11-robolectric-6757853-i7",
"14-robolectric-10818077-i7",
)
// One configuration would evict the older SDKs through version conflict resolution.
from(versions.map { version ->
project.configurations.detachedConfiguration(
project.dependencies.create("org.robolectric:android-all-instrumented:$version"),
).apply { isTransitive = false }
})
into(layout.buildDirectory.dir("robolectric-sdk"))
}
val checkTokenDrift by tasks.registering {
inputs.files(fileTree(projectDir) { include("tokens.json", "shell-tokens.json", "title-tokens.json", "home-tokens.json", "discover-tokens.json", "generate_tokens.py", "tokens.css", "tokens.sha256", "src/main/java/**/WolfskinTokens.kt") })
doLast {
file("tokens.sha256").readLines().forEach { line ->
val (expected, name) = line.split(" ", limit = 2)
val actual = MessageDigest.getInstance("SHA-256").digest(file(name).readBytes()).joinToString("") { "%02x".format(it) }
check(actual == expected) { "Token drift in $name: run python3 wolfskin-design/generate_tokens.py" }
}
}
}
tasks.named("preBuild") { dependsOn(checkTokenDrift) }
tasks.withType<Test>().configureEach {
dependsOn(cacheRobolectricSdk)
systemProperty("robolectric.dependency.dir", layout.buildDirectory.dir("robolectric-sdk").get().asFile.absolutePath)
systemProperty("robolectric.offline", "true")
systemProperty("robolectric.graphicsMode", "NATIVE")
systemProperty("roborazzi.test.record", "true")
systemProperty("wolfskin.captureDirectory", rootProject.layout.buildDirectory.dir("wolfskin-captures").get().asFile.absolutePath)
}
dependencies {
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.tv.material)
implementation(libs.coil.compose)
debugImplementation(libs.androidx.compose.ui.test.manifest)
testImplementation(libs.junit)
testImplementation(libs.kotlinx.coroutines.test)
testImplementation(libs.robolectric)
implementation(libs.androidx.compose.material3)
testImplementation(libs.androidx.compose.ui.test.junit4)
testImplementation("io.github.takahirom.roborazzi:roborazzi:1.77.0")
testImplementation("io.github.takahirom.roborazzi:roborazzi-compose:1.77.0")
}