Fix bug in plugin isAttached

This commit is contained in:
Alexander Nozik 2023-02-20 18:31:56 +03:00
parent f83b759e75
commit 58c5355e25
6 changed files with 42 additions and 17 deletions

View File

@ -9,7 +9,7 @@ plugins {
allprojects {
group = "space.kscience"
version = "0.6.1-dev-2"
version = "0.6.1-dev-3"
}
subprojects {

View File

@ -11,7 +11,7 @@ public abstract class AbstractPlugin(override val meta: Meta = Meta.EMPTY) : Plu
private var _context: Context? = null
private val dependencies = HashMap<PluginFactory<*>, Meta>()
override val isAttached: Boolean = _context != null
override val isAttached: Boolean get() = _context != null
override val context: Context
get() = _context ?: error("Plugin $tag is not attached")

View File

@ -15,7 +15,7 @@ kscience {
dependencies {
api(projects.dataforgeIo)
}
useSerialization("1.4.1"){
useSerialization{
yamlKt()
}
}

View File

@ -90,8 +90,8 @@ public fun YamlMap.toMeta(): Meta = YamlMeta(this)
public class YamlMetaFormat(private val meta: Meta) : MetaFormat {
override fun writeMeta(output: Output, meta: Meta, descriptor: MetaDescriptor?) {
val yaml = meta.toYaml()
val string = Yaml.encodeToString(yaml)
val yaml: YamlMap = meta.toYaml()
val string = Yaml.encodeToString(YamlMap.serializer(), yaml)
output.writeUtf8String(string)
}

View File

@ -1,9 +1,6 @@
package space.kscience.dataforge.io
import io.ktor.utils.io.core.Input
import io.ktor.utils.io.core.Output
import io.ktor.utils.io.core.readDouble
import io.ktor.utils.io.core.writeDouble
import io.ktor.utils.io.core.*
import space.kscience.dataforge.context.Context
import space.kscience.dataforge.context.Factory
import space.kscience.dataforge.io.IOFormatFactory.Companion.IO_FORMAT_TYPE
@ -27,6 +24,19 @@ public interface IOReader<out T> {
public fun readObject(input: Input): T
public fun readObject(binary: Binary): T = binary.read { readObject(this) }
public companion object {
/**
* no-op reader for binaries.
*/
public val binary: IOReader<Binary> = object : IOReader<Binary> {
override val type: KType = typeOf<Binary>()
override fun readObject(input: Input): Binary = input.readBytes().asBinary()
override fun readObject(binary: Binary): Binary = binary
}
}
}
public inline fun <reified T> IOReader(crossinline read: Input.() -> T): IOReader<T> = object : IOReader<T> {

View File

@ -36,11 +36,14 @@ import kotlin.reflect.typeOf
public typealias FileFormatResolver<T> = (path: Path, meta: Meta) -> IOReader<T>
public class FileData<T> internal constructor(private val data: Data<T>) : Data<T> by data {
public val path: String? get() = meta[META_FILE_PATH_KEY].string
public val extension: String? get() = meta[META_FILE_EXTENSION_KEY].string
/**
* A data based on a filesystem [Path]
*/
public class FileData<T> internal constructor(private val data: Data<T>, public val path: Path) : Data<T> by data {
// public val path: String? get() = meta[META_FILE_PATH_KEY].string
// public val extension: String? get() = meta[META_FILE_EXTENSION_KEY].string
//
public val createdTime: Instant? get() = meta[META_FILE_CREATE_TIME_KEY].string?.let { Instant.parse(it) }
public val updatedTime: Instant? get() = meta[META_FILE_UPDATE_TIME_KEY].string?.let { Instant.parse(it) }
@ -74,9 +77,12 @@ public fun <T : Any> IOPlugin.readDataFile(
FileData.META_FILE_UPDATE_TIME_KEY put attributes.lastModifiedTime().toInstant().toString()
FileData.META_FILE_CREATE_TIME_KEY put attributes.creationTime().toInstant().toString()
}
return FileData(Data(format.type, updatedMeta) {
envelope.data?.readWith(format) ?: error("Can't convert envelope without content to Data")
})
return FileData(
Data(format.type, updatedMeta) {
envelope.data?.readWith(format) ?: error("Can't convert envelope without content to Data")
},
path
)
}
@ -122,7 +128,15 @@ public fun <T : Any> IOPlugin.readDataDirectory(
public inline fun <reified T : Any> IOPlugin.readDataDirectory(
path: Path,
noinline formatResolver: FileFormatResolver<T>,
): DataTree<Any> = readDataDirectory(typeOf<T>(), path, formatResolver)
): DataTree<T> = readDataDirectory(typeOf<T>(), path, formatResolver)
/**
* Read raw binary data tree from the directory. All files are read as-is (save for meta files).
*/
@DFExperimental
public fun IOPlugin.readRawDirectory(
path: Path,
): DataTree<Binary> = readDataDirectory(path) { _, _ -> IOReader.binary }
@OptIn(DFExperimental::class)
@ -205,6 +219,7 @@ public suspend fun <T : Any> IOPlugin.writeDataDirectory(
is DataTreeItem.Node -> {
writeDataDirectory(childPath, item.tree, format, envelopeFormat)
}
is DataTreeItem.Leaf -> {
val envelope = item.data.toEnvelope(format)
if (envelopeFormat != null) {