Skip to content

Commit

Permalink
Fix #57 now EnvironmentCL uses also the properties.
Browse files Browse the repository at this point in the history
  • Loading branch information
jdiazcano committed Apr 3, 2019
1 parent 5491589 commit f5e3a5a
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 36 deletions.
1 change: 1 addition & 0 deletions cfg4k-core/build.gradle
Expand Up @@ -10,5 +10,6 @@ dependencies {
testCompile libraries.junitrunner
testCompile libraries.expekt
testCompile libraries.mockwebserver
testCompile libraries.mockk
testRuntime libraries.jetbrains.spek.engine
}
@@ -1,19 +1,19 @@
package com.jdiazcano.cfg4k.loaders

import com.jdiazcano.cfg4k.core.ConfigObject
import com.jdiazcano.cfg4k.core.toConfig

private val DEFAULT_TRANSFORMERS = mutableListOf<(String) -> String>(
{ key -> key.replace('_', '.') },
{ key -> key.replace('-', '.') }
)

/**
* EnvironmentConfigLoader will try to match the key to an environment variable. This will apply a series of
* transformations before matching.
*/
open class EnvironmentConfigLoader : DefaultConfigLoader(System.getenv().toConfig()) {
protected val transformations: MutableList<(String) -> String> = mutableListOf()

init {
addTransformer { key -> key.replace('.', '_') }
addTransformer { key -> key.replace('.', '-') }
}
open class EnvironmentConfigLoader(
protected val transformations: MutableList<(String) -> String> = DEFAULT_TRANSFORMERS
) : DefaultConfigLoader(System.getenv().transformice(transformations).toProperties().toConfig()) {

override fun get(key: String): ConfigObject? {
transformations.forEach {
Expand All @@ -28,17 +28,10 @@ open class EnvironmentConfigLoader : DefaultConfigLoader(System.getenv().toConfi
}

override fun reload() {
root = System.getenv().toConfig()
root = System.getenv().transformice(transformations).toProperties().toConfig()
}
}

/**
* Adds a transformer that will be performed once the get() method is called. This will transform the key to the
* environment variable form (UPPER_CASE_FORM) and by default there are three transformers.
*
* 1- foo.bar to FOO-BAR
* 2- foo.bar to FOO_BAR
*/
fun addTransformer(transformer: (String) -> String) {
transformations.add(transformer)
}
}
private fun Map<String, String>.transformice(transformations: MutableList<(String) -> String>) = map { (key, value) ->
transformations.fold(key) { transformedKey, transformer -> transformer(transformedKey) } to value
}.toMap()
14 changes: 0 additions & 14 deletions cfg4k-core/src/test/kotlin/com/jdiazcano/cfg4k/ConfigLoaderTest.kt
Expand Up @@ -118,17 +118,3 @@ private interface ServerConfig {
val host: String
val environment: String
}

internal fun setEnv(key: String, value: String) {
try {
val env = System.getenv()
val cl = env.javaClass
val field = cl.getDeclaredField("m")
field.isAccessible = true
val writableEnv = field.get(env) as MutableMap<String, String>
writableEnv.put(key, value)
} catch (e: Exception) {
throw IllegalStateException("Failed to set environment variable", e)
}

}
15 changes: 15 additions & 0 deletions cfg4k-core/src/test/kotlin/com/jdiazcano/cfg4k/TestUtils.kt
@@ -0,0 +1,15 @@
package com.jdiazcano.cfg4k

internal fun setEnv(key: String, value: String) {
try {
val env = System.getenv()
val cl = env.javaClass
val field = cl.getDeclaredField("m")
field.isAccessible = true
val writableEnv = field.get(env) as MutableMap<String, String>
writableEnv.put(key, value)
} catch (e: Exception) {
throw IllegalStateException("Failed to set environment variable", e)
}

}
@@ -0,0 +1,51 @@
package com.jdiazcano.cfg4k.loaders

import com.jdiazcano.cfg4k.core.toConfig
import com.jdiazcano.cfg4k.providers.*
import com.winterbe.expekt.should
import io.mockk.every
import io.mockk.mockkStatic
import io.mockk.unmockkAll
import org.jetbrains.spek.api.Spek
import org.jetbrains.spek.api.dsl.describe
import org.jetbrains.spek.api.dsl.it

class EnvironmentConfigLoaderTest : Spek({

describe("a property config loader") {
mockkStatic(System::class)
every { System.getenv() } returns mapOf(
"PROPERTIES_GROUPONE_KEYONE" to "1",
"PROPERTIES_GROUPONE_KEYTWO" to "2"
)

val loader = EnvironmentConfigLoader()
val provider = ProxyConfigProvider(loader)

it("it should be good in the loader") {
loader.get("properties.groupone.keyone").should.be.equal("1".toConfig())
}

it ("should be also good with the provider") {
provider.get<String>("properties.groupone.keyone").should.be.equal("1")
}

it("works with binding") {
val properties = provider.bind<Props>("properties")
properties.groupone.keyone.should.be.equal("1")
properties.groupone.keytwo.should.be.equal("2")
}

unmockkAll()
}

})

interface Props {
val groupone: Groupone
}

interface Groupone {
val keyone: String
val keytwo: String
}
6 changes: 4 additions & 2 deletions gradle/versions.gradle
Expand Up @@ -14,7 +14,8 @@ ext.versions = [
jcommander: '1.72',
mockwebserver: '3.13.1',
aws: '1.11.510',
logging: '1.6.25'
logging: '1.6.25',
mockk: '1.9.3'
]

ext.libraries = [
Expand Down Expand Up @@ -43,5 +44,6 @@ ext.libraries = [
aws: [
s3: "com.amazonaws:aws-java-sdk-s3:$versions.aws"
],
logging: "io.github.microutils:kotlin-logging:$versions.logging"
logging: "io.github.microutils:kotlin-logging:$versions.logging",
mockk: "io.mockk:mockk:$versions.mockk"
]

0 comments on commit f5e3a5a

Please sign in to comment.