diff --git a/CHANGELOG.md b/CHANGELOG.md index 06dfa5bf..ef953bb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ ### Removed ### Fixed +- Incorrect work of `MetaWithDefault::getValue` ### Security diff --git a/build.gradle.kts b/build.gradle.kts index 84c1bba7..755212d9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ plugins { allprojects { group = "space.kscience" - version = "0.10.0" + version = "0.10.1-dev" } subprojects { diff --git a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/MutableMeta.kt b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/MutableMeta.kt index 274671bf..a11a5a53 100644 --- a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/MutableMeta.kt +++ b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/MutableMeta.kt @@ -438,7 +438,7 @@ public inline fun Meta.copy(modification: MutableMeta.() -> Unit = {}): Meta = M private class MutableMetaWithDefault( val source: MutableMeta, val default: MetaProvider, val rootName: Name, -) : MutableMeta by source { +) : MutableMeta { override val items: Map<NameToken, MutableMeta> get() { val sourceKeys: Collection<NameToken> = source[rootName]?.items?.keys ?: emptyList() @@ -457,6 +457,17 @@ private class MutableMetaWithDefault( override fun get(name: Name): MutableMeta = MutableMetaWithDefault(source, default, rootName + name) + override fun set(name: Name, node: Meta?) { + source[name] = node + } + + override fun setValue(name: Name, value: Value?) { + source.setValue(name, value) + } + + override fun getOrCreate(name: Name): MutableMeta = + MutableMetaWithDefault(source, default, rootName + name) + override fun toString(): String = Meta.toString(this) override fun equals(other: Any?): Boolean = Meta.equals(this, other as? Meta) override fun hashCode(): Int = Meta.hashCode(this) diff --git a/dataforge-meta/src/commonTest/kotlin/space/kscience/dataforge/meta/MutableMetaTest.kt b/dataforge-meta/src/commonTest/kotlin/space/kscience/dataforge/meta/MutableMetaTest.kt index da4474d8..c286486a 100644 --- a/dataforge-meta/src/commonTest/kotlin/space/kscience/dataforge/meta/MutableMetaTest.kt +++ b/dataforge-meta/src/commonTest/kotlin/space/kscience/dataforge/meta/MutableMetaTest.kt @@ -3,9 +3,9 @@ package space.kscience.dataforge.meta import kotlin.test.Test import kotlin.test.assertEquals -class MutableMetaTest{ +class MutableMetaTest { @Test - fun remove(){ + fun remove() { val meta = MutableMeta { "aNode" put { "innerNode" put { @@ -19,4 +19,26 @@ class MutableMetaTest{ meta.remove("aNode.c") assertEquals(meta["aNode.c"], null) } + + @Test + fun withDefault() { + val metaWithDefault = MutableMeta().withDefault( + Meta { + "a" put { + value = 22.asValue() + "b" put true + } + } + ) + + assertEquals(22, metaWithDefault["a"].int) + assertEquals(true, metaWithDefault.getValue("a.b")?.boolean) + + metaWithDefault["a.b"] = "false" + + assertEquals(false, metaWithDefault["a.b"]?.boolean) + assertEquals(false, metaWithDefault.getValue("a.b")?.boolean) + assertEquals(22, metaWithDefault.getValue("a")?.int) + + } } \ No newline at end of file