From f6439c95267b9b8502d24e1ea77c6eff2266c221 Mon Sep 17 00:00:00 2001 From: Carmine DiMascio Date: Fri, 1 Mar 2019 22:44:59 -0500 Subject: [PATCH] add api to iterator over env entries --- .../io/github/cdimascio/dotenv/Dotenv.kt | 12 +++++----- src/test/java/tests/JavaTests.java | 24 +++++++++++++++---- src/test/kotlin/tests/BasicTests.kt | 2 +- src/test/kotlin/tests/DslTests.kt | 2 +- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/io/github/cdimascio/dotenv/Dotenv.kt b/src/main/kotlin/io/github/cdimascio/dotenv/Dotenv.kt index 9ac30d3..b857629 100644 --- a/src/main/kotlin/io/github/cdimascio/dotenv/Dotenv.kt +++ b/src/main/kotlin/io/github/cdimascio/dotenv/Dotenv.kt @@ -12,7 +12,7 @@ import java.util.Collections * Dotenv * @see The complete dotenv documentation */ -abstract class Dotenv : Iterable { +abstract class Dotenv { /** * The dotenv instance */ @@ -39,7 +39,7 @@ abstract class Dotenv : Iterable { */ abstract operator fun get(envName: String): String? - abstract override operator fun iterator(): Iterator + abstract fun entries(): Set /** * Returns the value for the environment variable, or the default value if absent @@ -119,11 +119,11 @@ class DotenvBuilder internal constructor() { data class DotenvEntry(val key: String, val value: String) private class DotenvImpl(envVars: List>) : Dotenv() { - private val map = envVars.associateBy({ it.first }, { it.second }) - private val iter = Collections.unmodifiableList(envVars.map { DotenvEntry(it.first, it.second) }).iterator() - - override fun iterator(): Iterator = iter + private val set = Collections.unmodifiableSet( + map.entries.map { DotenvEntry(it.key, it.value) }.toSet() + ) + override fun entries() = set override fun get(envName: String): String? = System.getenv(envName) ?: map[envName] } diff --git a/src/test/java/tests/JavaTests.java b/src/test/java/tests/JavaTests.java index df89424..1a3d0da 100644 --- a/src/test/java/tests/JavaTests.java +++ b/src/test/java/tests/JavaTests.java @@ -7,6 +7,7 @@ import org.junit.Test; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import static org.junit.Assert.assertEquals; @@ -17,7 +18,7 @@ public class JavaTests { @Before public void setUp() { - envVars = new HashMap(); + envVars = new HashMap<>(); envVars.put("MY_TEST_EV1", "my test ev 1"); envVars.put("MY_TEST_EV2", "my test ev 2"); envVars.put("WITHOUT_VALUE", ""); @@ -50,21 +51,34 @@ public void iteratorOverDotenv() { dotenv.entries().forEach(e -> assertEquals(dotenv.get(e.getKey()), e.getValue())); - for (DotenvEntry e : dotenv) { + for (DotenvEntry e : dotenv.entries()) { assertEquals(dotenv.get(e.getKey()), e.getValue()); } } @Test(expected = UnsupportedOperationException.class) - public void failToRemoveFromIterator() { + public void failToRemoveFromDotenv() { Dotenv dotenv = Dotenv.configure() .ignoreIfMalformed() .load(); - while (dotenv.iterator().hasNext()) { - dotenv.iterator().remove(); + + Iterator iter = dotenv.entries().iterator(); + while (iter.hasNext()) { + iter.next(); + iter.remove(); } } + @Test(expected = UnsupportedOperationException.class) + public void failToAddToDotenv() { + + Dotenv dotenv = Dotenv.configure() + .ignoreIfMalformed() + .load(); + + dotenv.entries().add(new DotenvEntry("new", "value")); + } + @Test public void configureWithIgnoreMalformed() { Dotenv dotenv = Dotenv.configure() diff --git a/src/test/kotlin/tests/BasicTests.kt b/src/test/kotlin/tests/BasicTests.kt index b4b0a1e..a14292e 100644 --- a/src/test/kotlin/tests/BasicTests.kt +++ b/src/test/kotlin/tests/BasicTests.kt @@ -82,7 +82,7 @@ class DotEnvTest { .ignoreIfMalformed() .load() - for (e in dotenv) { + for (e in dotenv.entries()) { assertEquals(dotenv[e.key], e.value) } } diff --git a/src/test/kotlin/tests/DslTests.kt b/src/test/kotlin/tests/DslTests.kt index 8b8a055..7e88526 100644 --- a/src/test/kotlin/tests/DslTests.kt +++ b/src/test/kotlin/tests/DslTests.kt @@ -80,7 +80,7 @@ class DotEnvDslTest { ignoreIfMalformed = true } - for (e in env) { + for (e in env.entries()) { assertEquals(env[e.key], e.value) } }