diff --git a/CHANGELOG.md b/CHANGELOG.md index 58343967..a4bb6751 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - Relaxed type restriction on `MetaConverter`. Now nullables are available. - **Huge API-breaking refactoring of Meta**. Meta now can hava both value and children. - **API breaking** `String.toName()` is replaced by `Name.parse()` +- **API breaking** Configurable`config` changed to `meta` ### Deprecated - Direct use of `Config` diff --git a/build.gradle.kts b/build.gradle.kts index b1a365cf..87e2443e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { allprojects { group = "space.kscience" - version = "0.5.0-dev-4" + version = "0.5.0-dev-5" } subprojects { diff --git a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Configurable.kt b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Configurable.kt index 64ba5ba6..94f66381 100644 --- a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Configurable.kt +++ b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Configurable.kt @@ -9,11 +9,11 @@ public interface Configurable { /** * Backing config */ - public val config: MutableMeta + public val meta: MutableMeta } -public fun T.configure(meta: Meta): T = this.apply { config.update(meta) } +public fun T.configure(meta: Meta): T = this.apply { this.meta.update(meta) } @DFBuilder -public inline fun T.configure(action: MutableMeta.() -> Unit): T = apply { config.apply(action) } \ No newline at end of file +public inline fun T.configure(action: MutableMeta.() -> Unit): T = apply { meta.apply(action) } \ No newline at end of file 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 ebb1501a..10b06d74 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 @@ -1,7 +1,6 @@ package space.kscience.dataforge.meta import kotlinx.serialization.Serializable -import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.* import space.kscience.dataforge.values.EnumValue import space.kscience.dataforge.values.Value @@ -385,7 +384,6 @@ private class MutableMetaImpl( /** * Append the node with a same-name-sibling, automatically generating numerical index */ -@DFExperimental public fun MutableMeta.append(name: Name, meta: Meta) { require(!name.isEmpty()) { "Name could not be empty for append operation" } val newIndex = name.lastOrNull()!!.index @@ -397,13 +395,10 @@ public fun MutableMeta.append(name: Name, meta: Meta) { } } -@DFExperimental public fun MutableMeta.append(key: String, meta: Meta): Unit = append(Name.parse(key), meta) -@DFExperimental public fun MutableMeta.append(name: Name, value: Value): Unit = append(name, Meta(value)) -@DFExperimental public fun MutableMeta.append(key: String, value: Value): Unit = append(Name.parse(key), value) ///** diff --git a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/ObservableMeta.kt b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/ObservableMeta.kt index 9e45a150..fa9dddf4 100644 --- a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/ObservableMeta.kt +++ b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/ObservableMeta.kt @@ -75,6 +75,12 @@ private class ObservableMetaWrapper( override fun set(name: Name, meta: Meta) { val oldMeta = get(name) origin[name] = meta + // if meta is observable propagate changes from it + if(meta is ObservableMeta){ + meta.onChange(this) { changeName -> + setMeta(name + changeName, meta[changeName]) + } + } if (oldMeta != meta) { changed(name) } diff --git a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Scheme.kt b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Scheme.kt index 10f3d038..ae412fc7 100644 --- a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Scheme.kt +++ b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Scheme.kt @@ -7,9 +7,9 @@ import space.kscience.dataforge.names.Name * A base for delegate-based or descriptor-based scheme. [Scheme] has an empty constructor to simplify usage from [Specification]. * Default item provider and [MetaDescriptor] are optional */ -public open class Scheme : Described, MetaRepr, MutableMetaProvider { +public open class Scheme : Described, MetaRepr, MutableMetaProvider, Configurable { - public var meta: ObservableMutableMeta = MutableMeta() + final override var meta: ObservableMutableMeta = MutableMeta() private set final override var descriptor: MetaDescriptor? = null diff --git a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Specification.kt b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Specification.kt index 44263d01..afd2b668 100644 --- a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Specification.kt +++ b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Specification.kt @@ -53,7 +53,7 @@ public fun MutableMeta.update( public fun Configurable.update( spec: Specification, action: T.() -> Unit, -): T = spec.write(config).apply(action) +): T = spec.write(meta).apply(action) // //public fun > MutableMeta.withSpec(spec: Specification): M? =