diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a61f2e9d..69a37ed7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,6 +39,9 @@ ktor-serialization-kotlinx-xml = "2.3.11" kotlinx-serialization = "1.6.3" squareup-okhttp = "5.0.0-alpha.11" kotlinx-io = "0.3.3" +webjar-material-design-icons = "4.0.0" +webjar-materialize = "1.0.0" +webjars-locator-lite = "0.0.4" [libraries] roborazzi = { module = "io.github.takahirom.roborazzi:roborazzi", version.ref = "roborazzi-for-replacing-by-include-build" } @@ -88,3 +91,6 @@ squareup-okhttp-coroutines = { module = "com.squareup.okhttp3:okhttp-coroutines" robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" } robolectric-android-all = { module = "org.robolectric:android-all", version.ref = "robolectric-android-all" } kotlinx-io-core = { module = "org.jetbrains.kotlinx:kotlinx-io-core", version.ref = "kotlinx-io" } +webjars-material-design-icons = { module = "org.webjars:material-design-icons", version.ref = "webjar-material-design-icons" } +webjars-materialize = { module = "org.webjars:materializecss", version.ref = "webjar-materialize" } +webjars-locator-lite = { module = "org.webjars:webjars-locator-lite", version.ref = "webjars-locator-lite" } diff --git a/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/CaptureResults.kt b/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/CaptureResults.kt index b56e7067..ff94ee7a 100644 --- a/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/CaptureResults.kt +++ b/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/CaptureResults.kt @@ -93,7 +93,7 @@ data class CaptureResults( tabs.forEachIndexed { tabIndex, tab -> //
  • Test 1
  • val activeClass = if (tabIndex == 0) """class="active" """ else "" - append("""
  • ${tab.title}
  • """) + append("""
  • ${tab.title}
  • """) } append("\n") tabs.forEach { tab -> diff --git a/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/RoborazziReportConst.kt b/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/RoborazziReportConst.kt index 3a608379..460b12a1 100644 --- a/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/RoborazziReportConst.kt +++ b/include-build/roborazzi-core/src/commonMain/kotlin/com/github/takahirom/roborazzi/RoborazziReportConst.kt @@ -43,114 +43,4 @@ object RoborazziReportConst { } } } - - const val reportHtml = """ - - - - - - - Roborazzi report - - - - - - - -
    -
    -

    -REPORT_TEMPLATE_BODY -

    -
    -
    - - - - - - - - - - """ } \ No newline at end of file diff --git a/include-build/roborazzi-gradle-plugin/build.gradle b/include-build/roborazzi-gradle-plugin/build.gradle index cb360dfe..3d768fac 100644 --- a/include-build/roborazzi-gradle-plugin/build.gradle +++ b/include-build/roborazzi-gradle-plugin/build.gradle @@ -19,6 +19,9 @@ dependencies { exclude group: 'junit', module: 'junit' } implementation libs.kotlinx.serialization.json + implementation libs.webjars.locator.lite + implementation libs.webjars.materialize + implementation libs.webjars.material.design.icons integrationTestDepImplementation libs.android.tools.build.gradle integrationTestDepImplementation libs.kotlin.gradle.plugin integrationTestDepImplementation libs.compose.gradle.plugin diff --git a/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/RoborazziPlugin.kt b/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/RoborazziPlugin.kt index 85963e48..663aab28 100644 --- a/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/RoborazziPlugin.kt +++ b/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/RoborazziPlugin.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithTests import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.targets.native.KotlinNativeBinaryTestRun import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeTest +import java.io.FileNotFoundException import java.util.Locale import javax.inject.Inject import kotlin.reflect.KClass @@ -50,6 +51,7 @@ open class RoborazziExtension @Inject constructor(objects: ObjectFactory) { @Suppress("unused") // From Paparazzi: https://github.com/cashapp/paparazzi/blob/a76702744a7f380480f323ffda124e845f2733aa/paparazzi/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PaparazziPlugin.kt abstract class RoborazziPlugin : Plugin { + val AbstractTestTask.systemProperties: MutableMap get() = when (this) { is Test -> systemProperties @@ -255,9 +257,12 @@ abstract class RoborazziPlugin : Plugin { resultsSummaryFile.parentFile.mkdirs() resultsSummaryFile.writeText(jsonResult) val reportFile = reportFileProperty.get().asFile + reportFile.parentFile.mkdirs() + WebAssets.create().writeToRoborazziReportsDir(reportFile.parentFile) + val reportHtml = readIndexHtmlFile() ?: throw FileNotFoundException("index.html not found in resources/META-INF folder") reportFile.writeText( - RoborazziReportConst.reportHtml.replace( + reportHtml.replace( oldValue = "REPORT_TEMPLATE_BODY", newValue = roborazziResults.toHtml(reportFile.parentFile.absolutePath) ) @@ -464,6 +469,10 @@ abstract class RoborazziPlugin : Plugin { } } + private fun readIndexHtmlFile(): String? { + return this::class.java.classLoader.getResource("META-INF/index.html")?.readText() + } + private fun String.capitalizeUS() = replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.US) else it.toString() } diff --git a/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/WebAssets.kt b/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/WebAssets.kt new file mode 100644 index 00000000..f5cc19f0 --- /dev/null +++ b/include-build/roborazzi-gradle-plugin/src/main/java/io/github/takahirom/roborazzi/WebAssets.kt @@ -0,0 +1,78 @@ +package io.github.takahirom.roborazzi + +import org.webjars.WebJarVersionLocator +import java.io.File + +class WebAssets private constructor(private val webJarVersionLocator: WebJarVersionLocator) { + private val materializeCss = "materializecss" + private val materialIcons = "material-design-icons" + private val webJarResource = "resources" + + fun writeToRoborazziReportsDir(reportDir: File) { + writeLocalAssetsToRoborazziReportsDir(reportDir) + writeWebJarAssetsToRoborazziReportsDir(reportDir) + } + + private fun writeLocalAssetsToRoborazziReportsDir(reportDir: File) { + writeAssets( + assetName = "report-style.css", + exactPath = "assets/report-style.css", + reportDir = reportDir + ) + } + + private fun writeWebJarAssetsToRoborazziReportsDir(reportDir: File) { + mapOf( + materializeCss to listOf( + "css/materialize.min.css", + "js/materialize.min.js", + ), + materialIcons to listOf( + "material-icons.css", + "MaterialIcons-Regular.ttf", + ) + ).forEach { (key, value) -> + value.forEach { exactPath -> + webJarVersionLocator.locate(key, exactPath)?.let { + writeAssets( + assetName = exactPath.substringAfterLast("/"), + exactPath = "$webJarResource/$it", + reportDir = reportDir + ) + } + } + } + } + + private fun outputFile(directory: File, filename: String): File { + return File(directory, filename).apply { + parentFile.apply { if (!exists()) mkdirs() } + } + } + + private fun WebJarVersionLocator.locate(webJarName: String, exactPath: String) = run { + path(webJarName, exactPath)?.let { "webjars/$it" } + } + + private fun writeAssets( + assetName: String, + exactPath: String, + reportDir: File + ) { + val assetsDirectory = File(reportDir, "assets") + val asset = this::class.java + .classLoader + .getResource("META-INF/$exactPath")?.readBytes() + if (asset != null) { + val assetFile = outputFile(assetsDirectory, assetName) + assetFile.writeBytes(asset) + } + } + + companion object { + + fun create( + webJarVersionLocator: WebJarVersionLocator = WebJarVersionLocator() + ): WebAssets = WebAssets(webJarVersionLocator) + } +} \ No newline at end of file diff --git a/include-build/roborazzi-gradle-plugin/src/main/resources/META-INF/assets/report-style.css b/include-build/roborazzi-gradle-plugin/src/main/resources/META-INF/assets/report-style.css new file mode 100644 index 00000000..9b90fae3 --- /dev/null +++ b/include-build/roborazzi-gradle-plugin/src/main/resources/META-INF/assets/report-style.css @@ -0,0 +1,33 @@ +.container { + width: 90%; + } + + h3 { + color: orange; + } + + a, .menu { + color: white; + } + + th a, td a { + display: block; + color: black; + } + + .material-icons { + color: #29b6f6; + } + + .us { + color: #ffcc80; + } + + #imageBottomSheet { + max-height: 100%; + top: 15%; + } + + #modalImage { + max-width: 100%; + } \ No newline at end of file diff --git a/include-build/roborazzi-gradle-plugin/src/main/resources/META-INF/index.html b/include-build/roborazzi-gradle-plugin/src/main/resources/META-INF/index.html new file mode 100644 index 00000000..366b8439 --- /dev/null +++ b/include-build/roborazzi-gradle-plugin/src/main/resources/META-INF/index.html @@ -0,0 +1,66 @@ + + + + + + + Roborazzi report + + + + + + + + +
    +
    +

    REPORT_TEMPLATE_BODY

    +
    +
    + + + + + + + + + \ No newline at end of file