From ff1239e59246866b10f7fdb50f644ebbcfa0d0a8 Mon Sep 17 00:00:00 2001 From: Swordsteel Date: Tue, 10 Dec 2024 17:37:20 +0100 Subject: [PATCH] add ConfigExtension - update README.md with Extension Config - add configExtension to CorePlugin - add ConfigExtension - add environment variable in Test tasks - update catalog version - update dependencies in build.gradle.kts --- README.md | 4 + build.gradle.kts | 8 +- gradle.properties | 2 +- .../kotlin/ltd/hlaeja/plugin/CorePlugin.kt | 14 ++- .../plugin/extension/ConfigExtension.kt | 31 +++++ .../plugin/extension/ConfigExtensionTest.kt | 112 ++++++++++++++++++ 6 files changed, 166 insertions(+), 5 deletions(-) create mode 100644 src/main/kotlin/ltd/hlaeja/plugin/extension/ConfigExtension.kt create mode 100644 src/test/kotlin/ltd/hlaeja/plugin/extension/ConfigExtensionTest.kt diff --git a/README.md b/README.md index 5f536e6..c4e6818 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,10 @@ The GitExtension enhances versioning by dynamically appending the Git hash befor The InfoExtension provides information for name and version, vendor name, and UTC timestamp. +### Extension Config + +The ConfigExtension provides a find or findOrDefault for getting a property or environment. + ## Releasing plugin Run `release.sh` script from `master` branch. diff --git a/build.gradle.kts b/build.gradle.kts index 9627e8e..6508475 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,9 +19,11 @@ plugins { dependencies { implementation(hlaeja.org.eclipse.jgit) - testImplementation(hlaeja.io.mockk) + testImplementation(hlaeja.assertj.core) + testImplementation(hlaeja.junit.jupiter.params) + testImplementation(hlaeja.kotlin.reflect) testImplementation(hlaeja.kotlin.test) - testImplementation(hlaeja.org.junit.jupiter.params) + testImplementation(hlaeja.mockk) } gradlePlugin.plugins.create("hlaeja-core-plugin") { @@ -112,6 +114,8 @@ tasks { } } withType { + // Set TEST_ENV environment variable for test execution + environment["TEST_ENV"] = "hlæja" useJUnitPlatform() } } diff --git a/gradle.properties b/gradle.properties index 87e65bb..0019d2f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official version=0.2.0-SNAPSHOT -catalog=0.1.0 +catalog=0.6.0-SNAPSHOT diff --git a/src/main/kotlin/ltd/hlaeja/plugin/CorePlugin.kt b/src/main/kotlin/ltd/hlaeja/plugin/CorePlugin.kt index 8f53510..ea1b286 100644 --- a/src/main/kotlin/ltd/hlaeja/plugin/CorePlugin.kt +++ b/src/main/kotlin/ltd/hlaeja/plugin/CorePlugin.kt @@ -1,11 +1,13 @@ package ltd.hlaeja.plugin +import ltd.hlaeja.plugin.extension.ConfigExtension import ltd.hlaeja.plugin.extension.InfoExtension import ltd.hlaeja.plugin.extension.GitExtension import org.gradle.api.Plugin import org.gradle.api.Project import ltd.hlaeja.plugin.extension.InfoExtension.Companion.PLUGIN_NAME as INFO_PLUGIN_NAME import ltd.hlaeja.plugin.extension.GitExtension.Companion.PLUGIN_NAME as GIT_PLUGIN_NAME +import ltd.hlaeja.plugin.extension.ConfigExtension.Companion.PLUGIN_NAME as CONFIG_PLUGIN_NAME @Suppress("unused") class CorePlugin : Plugin { @@ -16,13 +18,21 @@ class CorePlugin : Plugin { override fun apply(project: Project) { gitExtension(project) infoExtension(project) + configExtension(project) } + private fun configExtension( + project: Project, + ): ConfigExtension = project.extensions + .create(CONFIG_PLUGIN_NAME, ConfigExtension::class.java, project) + private fun infoExtension( project: Project, - ): InfoExtension = project.extensions.create(INFO_PLUGIN_NAME, InfoExtension::class.java, project) + ): InfoExtension = project.extensions + .create(INFO_PLUGIN_NAME, InfoExtension::class.java, project) private fun gitExtension( project: Project, - ): GitExtension = project.extensions.create(GIT_PLUGIN_NAME, GitExtension::class.java, project) + ): GitExtension = project.extensions + .create(GIT_PLUGIN_NAME, GitExtension::class.java, project) } diff --git a/src/main/kotlin/ltd/hlaeja/plugin/extension/ConfigExtension.kt b/src/main/kotlin/ltd/hlaeja/plugin/extension/ConfigExtension.kt new file mode 100644 index 0000000..3b64509 --- /dev/null +++ b/src/main/kotlin/ltd/hlaeja/plugin/extension/ConfigExtension.kt @@ -0,0 +1,31 @@ +package ltd.hlaeja.plugin.extension + +import java.lang.System.getenv +import org.gradle.api.Project + +abstract class ConfigExtension(private val project: Project) { + + companion object { + const val PLUGIN_NAME = "config" + const val EMPTY = "" + } + + fun find( + property: String, + environment: String, + ): String? = findProperty(property) ?: findEnvironment(environment) + + fun findOrDefault( + property: String, + environment: String, + default: String = EMPTY, + ): String = findProperty(property) ?: findEnvironment(environment) ?: default + + private fun findProperty( + property: String, + ) = project.findProperty(property)?.toString() + + private fun findEnvironment( + environment: String, + ): String? = getenv(environment) +} diff --git a/src/test/kotlin/ltd/hlaeja/plugin/extension/ConfigExtensionTest.kt b/src/test/kotlin/ltd/hlaeja/plugin/extension/ConfigExtensionTest.kt new file mode 100644 index 0000000..c6a0259 --- /dev/null +++ b/src/test/kotlin/ltd/hlaeja/plugin/extension/ConfigExtensionTest.kt @@ -0,0 +1,112 @@ +package ltd.hlaeja.plugin.extension + +import org.assertj.core.api.Assertions.assertThat +import org.gradle.api.Project +import org.gradle.testfixtures.ProjectBuilder +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test + +/** + * This test uses TEST_ENV set in gradle test task, and project extension to pretend to be a project property. + */ +class ConfigExtensionTest { + + companion object { + const val EXTENSION = "config" + const val PLUGIN_ID = "ltd.hlaeja.plugin.hlaeja-core-plugin" + const val PROJECT_NAME = "test-project" + const val SNAPSHOT_VERSION = "0.0.0-SNAPSHOT" + } + + lateinit var project: Project + + lateinit var configExtension: ConfigExtension + + @BeforeEach + fun beforeEach() { + project = ProjectBuilder.builder() + .withName(PROJECT_NAME) + .build() + project.version = SNAPSHOT_VERSION + project.pluginManager.apply(PLUGIN_ID) + project.extensions.add( + "testProperty", + object { + override fun toString(): String = "hlæja" + }, + ) + configExtension = project.extensions.getByName(EXTENSION) as ConfigExtension + } + + @Nested + inner class FindTest { + + @Test + fun `property or environment find property`() { + // when + val result = configExtension.find("testProperty", "TEST_PROPERTY") + + // then + assertThat(result).isEqualTo("hlæja") + } + + @Test + fun `property or environment find environment`() { + // when + val result = configExtension.find("test_env", "TEST_ENV") + + // then + assertThat(result).isEqualTo("hlæja") + } + + @Test + fun `property or environment find nothing`() { + // when + val result = configExtension.find("test", "TEST") + + // then + assertThat(result).isNull() + } + } + + @Nested + inner class FindOrDefaultTest { + + @Test + fun `property, environment, or default find property`() { + // when + val result = configExtension.findOrDefault("testProperty", "TEST_PROPERTY") + + // then + assertThat(result).isEqualTo("hlæja") + } + + @Test + fun `property, environment, or default find environment`() { + // when + val result = configExtension.findOrDefault("test_env", "TEST_ENV") + + // then + assertThat(result).isEqualTo("hlæja") + } + + @Test + fun `property, environment, or default find empty`() { + // when + val result = configExtension.findOrDefault("test", "TEST") + + // then + assertThat(result).isEmpty() + } + + @Test + fun `property, environment, or default find defined response`() { + // when + val result = configExtension.findOrDefault("test", "TEST", "value") + + // then + assertThat(result).isEqualTo("value") + } + } +}