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
This commit is contained in:
2024-12-10 17:37:20 +01:00
parent 494843592a
commit ff1239e592
6 changed files with 166 additions and 5 deletions

View File

@@ -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. 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 ## Releasing plugin
Run `release.sh` script from `master` branch. Run `release.sh` script from `master` branch.

View File

@@ -19,9 +19,11 @@ plugins {
dependencies { dependencies {
implementation(hlaeja.org.eclipse.jgit) 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.kotlin.test)
testImplementation(hlaeja.org.junit.jupiter.params) testImplementation(hlaeja.mockk)
} }
gradlePlugin.plugins.create("hlaeja-core-plugin") { gradlePlugin.plugins.create("hlaeja-core-plugin") {
@@ -112,6 +114,8 @@ tasks {
} }
} }
withType<Test> { withType<Test> {
// Set TEST_ENV environment variable for test execution
environment["TEST_ENV"] = "hlæja"
useJUnitPlatform() useJUnitPlatform()
} }
} }

View File

@@ -1,3 +1,3 @@
kotlin.code.style=official kotlin.code.style=official
version=0.2.0-SNAPSHOT version=0.2.0-SNAPSHOT
catalog=0.1.0 catalog=0.6.0-SNAPSHOT

View File

@@ -1,11 +1,13 @@
package ltd.hlaeja.plugin package ltd.hlaeja.plugin
import ltd.hlaeja.plugin.extension.ConfigExtension
import ltd.hlaeja.plugin.extension.InfoExtension import ltd.hlaeja.plugin.extension.InfoExtension
import ltd.hlaeja.plugin.extension.GitExtension import ltd.hlaeja.plugin.extension.GitExtension
import org.gradle.api.Plugin import org.gradle.api.Plugin
import org.gradle.api.Project import org.gradle.api.Project
import ltd.hlaeja.plugin.extension.InfoExtension.Companion.PLUGIN_NAME as INFO_PLUGIN_NAME 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.GitExtension.Companion.PLUGIN_NAME as GIT_PLUGIN_NAME
import ltd.hlaeja.plugin.extension.ConfigExtension.Companion.PLUGIN_NAME as CONFIG_PLUGIN_NAME
@Suppress("unused") @Suppress("unused")
class CorePlugin : Plugin<Project> { class CorePlugin : Plugin<Project> {
@@ -16,13 +18,21 @@ class CorePlugin : Plugin<Project> {
override fun apply(project: Project) { override fun apply(project: Project) {
gitExtension(project) gitExtension(project)
infoExtension(project) infoExtension(project)
configExtension(project)
} }
private fun configExtension(
project: Project,
): ConfigExtension = project.extensions
.create(CONFIG_PLUGIN_NAME, ConfigExtension::class.java, project)
private fun infoExtension( private fun infoExtension(
project: Project, 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( private fun gitExtension(
project: Project, project: Project,
): GitExtension = project.extensions.create(GIT_PLUGIN_NAME, GitExtension::class.java, project) ): GitExtension = project.extensions
.create(GIT_PLUGIN_NAME, GitExtension::class.java, project)
} }

View File

@@ -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)
}

View File

@@ -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")
}
}
}