Upgraded plugin and added test for data gathering in workspace.
This commit is contained in:
parent
156a43d4bf
commit
23a2d29e84
@ -1,9 +1,9 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("scientifik.mpp") version "0.2.0" apply false
|
id("scientifik.mpp") version "0.2.1" apply false
|
||||||
id("scientifik.publish") version "0.2.0" apply false
|
id("scientifik.publish") version "0.2.1" apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
val dataforgeVersion by extra("0.1.4-dev-4")
|
val dataforgeVersion by extra("0.1.4-dev-5")
|
||||||
|
|
||||||
val bintrayRepo by extra("dataforge")
|
val bintrayRepo by extra("dataforge")
|
||||||
val githubProject by extra("dataforge-core")
|
val githubProject by extra("dataforge-core")
|
||||||
|
@ -32,13 +32,11 @@ sealed class ItemDescriptor(override val config: Config) : Specific {
|
|||||||
var info: String? by string()
|
var info: String? by string()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A list of tags for this item. Tags used to customize item usage
|
* Additional attributes of an item. For example validation and widget parameters
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
var tags: List<String> by value { value ->
|
var attributes by node()
|
||||||
value?.list?.map { it.string } ?: emptyList()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* True if the item is required
|
* True if the item is required
|
||||||
@ -54,7 +52,7 @@ sealed class ItemDescriptor(override val config: Config) : Specific {
|
|||||||
*
|
*
|
||||||
* @author Alexander Nozik
|
* @author Alexander Nozik
|
||||||
*/
|
*/
|
||||||
class NodeDescriptor(config: Config) : ItemDescriptor(config){
|
class NodeDescriptor(config: Config) : ItemDescriptor(config) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* True if the node is required
|
* True if the node is required
|
||||||
@ -68,7 +66,7 @@ class NodeDescriptor(config: Config) : ItemDescriptor(config){
|
|||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
var default: Meta? by node()
|
var default: Config? by node()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The list of value descriptors
|
* The list of value descriptors
|
||||||
@ -79,7 +77,7 @@ class NodeDescriptor(config: Config) : ItemDescriptor(config){
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun value(name: String, descriptor: ValueDescriptor) {
|
fun value(name: String, descriptor: ValueDescriptor) {
|
||||||
if(items.keys.contains(name)) error("The key $name already exists in descriptor")
|
if (items.keys.contains(name)) error("The key $name already exists in descriptor")
|
||||||
val token = NameToken(VALUE_KEY, name)
|
val token = NameToken(VALUE_KEY, name)
|
||||||
config[token] = descriptor.config
|
config[token] = descriptor.config
|
||||||
}
|
}
|
||||||
@ -101,7 +99,7 @@ class NodeDescriptor(config: Config) : ItemDescriptor(config){
|
|||||||
|
|
||||||
|
|
||||||
fun node(name: String, descriptor: NodeDescriptor) {
|
fun node(name: String, descriptor: NodeDescriptor) {
|
||||||
if(items.keys.contains(name)) error("The key $name already exists in descriptor")
|
if (items.keys.contains(name)) error("The key $name already exists in descriptor")
|
||||||
val token = NameToken(NODE_KEY, name)
|
val token = NameToken(NODE_KEY, name)
|
||||||
config[token] = descriptor.config
|
config[token] = descriptor.config
|
||||||
}
|
}
|
||||||
@ -117,7 +115,7 @@ class NodeDescriptor(config: Config) : ItemDescriptor(config){
|
|||||||
|
|
||||||
companion object : Specification<NodeDescriptor> {
|
companion object : Specification<NodeDescriptor> {
|
||||||
|
|
||||||
// const val ITEM_KEY = "item"
|
// const val ITEM_KEY = "item"
|
||||||
const val NODE_KEY = "node"
|
const val NODE_KEY = "node"
|
||||||
const val VALUE_KEY = "value"
|
const val VALUE_KEY = "value"
|
||||||
|
|
||||||
@ -135,7 +133,7 @@ class NodeDescriptor(config: Config) : ItemDescriptor(config){
|
|||||||
*
|
*
|
||||||
* @author Alexander Nozik
|
* @author Alexander Nozik
|
||||||
*/
|
*/
|
||||||
class ValueDescriptor(config: Config) : ItemDescriptor(config){
|
class ValueDescriptor(config: Config) : ItemDescriptor(config) {
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -105,7 +105,7 @@ inline fun <reified E : Enum<E>> Configurable.enum(default: E, key: Name? = null
|
|||||||
|
|
||||||
/* Node delegates */
|
/* Node delegates */
|
||||||
|
|
||||||
fun Configurable.node(key: Name? = null) = MutableNodeDelegate(config, key)
|
fun Configurable.node(key: Name? = null): MutableNodeDelegate<Config> = MutableNodeDelegate(config, key)
|
||||||
|
|
||||||
fun <T : Specific> Configurable.spec(spec: Specification<T>, key: Name? = null) =
|
fun <T : Specific> Configurable.spec(spec: Specification<T>, key: Name? = null) =
|
||||||
MutableMorphDelegate(config, key) { spec.wrap(it) }
|
MutableMorphDelegate(config, key) { spec.wrap(it) }
|
||||||
@ -133,5 +133,5 @@ fun Configurable.doubleArray(key: Name? = null): ReadWriteDelegateWrapper<Value?
|
|||||||
?: doubleArrayOf()
|
?: doubleArrayOf()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T : Configurable> Configurable.child(key: Name? = null, converter: (Meta) -> T) =
|
fun <T : Configurable> Configurable.node(key: Name? = null, converter: (Meta) -> T) =
|
||||||
MutableMorphDelegate(config, key, converter)
|
MutableMorphDelegate(config, key, converter)
|
||||||
|
@ -138,7 +138,7 @@ fun Meta.boolean(default: Boolean? = null, key: String? = null) = BooleanDelegat
|
|||||||
|
|
||||||
fun Meta.number(default: Number? = null, key: String? = null) = NumberDelegate(this, key, default)
|
fun Meta.number(default: Number? = null, key: String? = null) = NumberDelegate(this, key, default)
|
||||||
|
|
||||||
fun Meta.child(key: String? = null) = ChildDelegate(this, key) { it }
|
fun Meta.node(key: String? = null) = ChildDelegate(this, key) { it }
|
||||||
|
|
||||||
@JvmName("safeString")
|
@JvmName("safeString")
|
||||||
fun Meta.string(default: String, key: String? = null) =
|
fun Meta.string(default: String, key: String? = null) =
|
||||||
@ -169,7 +169,7 @@ inline fun <reified E : Enum<E>> Meta.enum(default: E, key: String? = null) =
|
|||||||
SafeEnumDelegate(this, key, default) { enumValueOf(it) }
|
SafeEnumDelegate(this, key, default) { enumValueOf(it) }
|
||||||
|
|
||||||
|
|
||||||
fun <T : Metoid> Metoid.child(key: String? = null, converter: (Meta) -> T) = ChildDelegate(meta, key, converter)
|
fun <T : Metoid> Metoid.node(key: String? = null, converter: (Meta) -> T) = ChildDelegate(meta, key, converter)
|
||||||
|
|
||||||
/* Read-write delegates */
|
/* Read-write delegates */
|
||||||
|
|
||||||
@ -337,12 +337,12 @@ class MutableSafeEnumvDelegate<M : MutableMeta<M>, E : Enum<E>>(
|
|||||||
class MutableNodeDelegate<M : MutableMeta<M>>(
|
class MutableNodeDelegate<M : MutableMeta<M>>(
|
||||||
val meta: M,
|
val meta: M,
|
||||||
private val key: Name? = null
|
private val key: Name? = null
|
||||||
) : ReadWriteProperty<Any?, Meta?> {
|
) : ReadWriteProperty<Any?, M?> {
|
||||||
override fun getValue(thisRef: Any?, property: KProperty<*>): Meta? {
|
override fun getValue(thisRef: Any?, property: KProperty<*>): M? {
|
||||||
return meta[key ?: property.name.asName()]?.node
|
return meta[key ?: property.name.asName()]?.node
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setValue(thisRef: Any?, property: KProperty<*>, value: Meta?) {
|
override fun setValue(thisRef: Any?, property: KProperty<*>, value: M?) {
|
||||||
meta[key ?: property.name.asName()] = value
|
meta[key ?: property.name.asName()] = value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,20 +19,20 @@ class GenericTask<R : Any>(
|
|||||||
private val dataTransform: Workspace.() -> TaskModel.(DataNode<Any>) -> DataNode<R>
|
private val dataTransform: Workspace.() -> TaskModel.(DataNode<Any>) -> DataNode<R>
|
||||||
) : Task<R> {
|
) : Task<R> {
|
||||||
|
|
||||||
private fun gather(workspace: Workspace, model: TaskModel): DataNode<Any> {
|
// private fun gather(workspace: Workspace, model: TaskModel): DataNode<Any> {
|
||||||
return DataNode.invoke(Any::class) {
|
// return DataNode.invoke(Any::class) {
|
||||||
model.dependencies.forEach { dep ->
|
// model.dependencies.forEach { dep ->
|
||||||
update(dep.apply(workspace))
|
// update(dep.apply(workspace))
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
override fun run(workspace: Workspace, model: TaskModel): DataNode<R> {
|
override fun run(workspace: Workspace, model: TaskModel): DataNode<R> {
|
||||||
//validate model
|
//validate model
|
||||||
validate(model)
|
validate(model)
|
||||||
|
|
||||||
// gather data
|
// gather data
|
||||||
val input = gather(workspace, model)
|
val input = model.buildInput(workspace)// gather(workspace, model)
|
||||||
|
|
||||||
//execute
|
//execute
|
||||||
workspace.context.logger.info{"Starting task '$name' on ${model.target} with meta: \n${model.meta}"}
|
workspace.context.logger.info{"Starting task '$name' on ${model.target} with meta: \n${model.meta}"}
|
||||||
|
@ -8,7 +8,6 @@ package hep.dataforge.workspace
|
|||||||
import hep.dataforge.data.DataFilter
|
import hep.dataforge.data.DataFilter
|
||||||
import hep.dataforge.data.DataTree
|
import hep.dataforge.data.DataTree
|
||||||
import hep.dataforge.data.DataTreeBuilder
|
import hep.dataforge.data.DataTreeBuilder
|
||||||
import hep.dataforge.data.dataSequence
|
|
||||||
import hep.dataforge.meta.*
|
import hep.dataforge.meta.*
|
||||||
import hep.dataforge.names.EmptyName
|
import hep.dataforge.names.EmptyName
|
||||||
import hep.dataforge.names.Name
|
import hep.dataforge.names.Name
|
||||||
@ -53,9 +52,8 @@ data class TaskModel(
|
|||||||
*/
|
*/
|
||||||
fun TaskModel.buildInput(workspace: Workspace): DataTree<Any> {
|
fun TaskModel.buildInput(workspace: Workspace): DataTree<Any> {
|
||||||
return DataTreeBuilder(Any::class).apply {
|
return DataTreeBuilder(Any::class).apply {
|
||||||
dependencies.asSequence().flatMap { it.apply(workspace).dataSequence() }.forEach { (name, data) ->
|
dependencies.forEach { dep ->
|
||||||
//TODO add concise error on replacement
|
update(dep.apply(workspace))
|
||||||
this[name] = data
|
|
||||||
}
|
}
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,14 @@ class SimpleWorkspaceTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val filterTask = task<Int>("filterOne") {
|
||||||
|
model {
|
||||||
|
data("myData\\[12\\]")
|
||||||
|
}
|
||||||
|
pipe<Int>{
|
||||||
|
it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val square = task<Int>("square") {
|
val square = task<Int>("square") {
|
||||||
pipe<Int> { data ->
|
pipe<Int> { data ->
|
||||||
@ -150,4 +158,10 @@ class SimpleWorkspaceTest {
|
|||||||
val node = workspace.run("fullsquare")
|
val node = workspace.run("fullsquare")
|
||||||
println(node.toMeta())
|
println(node.toMeta())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testGather() {
|
||||||
|
val node = workspace.run("filterOne")
|
||||||
|
assertEquals(12, node.first()?.get())
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user