forked from kscience/visionforge
build update and minor API changes
This commit is contained in:
parent
c921d5541b
commit
c48e5aac25
@ -13,7 +13,7 @@ val fxVersion by extra("11")
|
|||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
group = "space.kscience"
|
group = "space.kscience"
|
||||||
version = "0.3.0-dev-7"
|
version = "0.3.0-dev-8"
|
||||||
}
|
}
|
||||||
|
|
||||||
subprojects {
|
subprojects {
|
||||||
@ -24,6 +24,7 @@ subprojects {
|
|||||||
maven("https://repo.kotlin.link")
|
maven("https://repo.kotlin.link")
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
maven("https://maven.jzy3d.org/releases")
|
maven("https://maven.jzy3d.org/releases")
|
||||||
|
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
|
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
|
||||||
|
@ -65,7 +65,7 @@ kotlin {
|
|||||||
val jvmMain by getting {
|
val jvmMain by getting {
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(projects.visionforgeServer)
|
implementation(projects.visionforgeServer)
|
||||||
implementation("ch.qos.logback:logback-classic:1.2.3")
|
implementation(spclibs.logback.classic)
|
||||||
implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6")
|
implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,4 +6,5 @@ kotlin.incremental.js.ir=true
|
|||||||
org.gradle.parallel=true
|
org.gradle.parallel=true
|
||||||
org.gradle.jvmargs=-Xmx4G
|
org.gradle.jvmargs=-Xmx4G
|
||||||
|
|
||||||
toolsVersion=0.14.7-kotlin-1.8.20
|
toolsVersion=0.14.8-kotlin-1.8.20
|
||||||
|
org.jetbrains.compose.experimental.jscanvas.enabled=true
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
rootProject.name = "visionforge"
|
rootProject.name = "visionforge"
|
||||||
|
|
||||||
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
|
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
|
||||||
enableFeaturePreview("VERSION_CATALOGS")
|
|
||||||
|
|
||||||
pluginManagement {
|
pluginManagement {
|
||||||
|
|
||||||
@ -46,6 +45,7 @@ include(
|
|||||||
":ui:ring",
|
":ui:ring",
|
||||||
// ":ui:material",
|
// ":ui:material",
|
||||||
":ui:bootstrap",
|
":ui:bootstrap",
|
||||||
|
// ":ui:compose",
|
||||||
":visionforge-core",
|
":visionforge-core",
|
||||||
":visionforge-solid",
|
":visionforge-solid",
|
||||||
// ":visionforge-fx",
|
// ":visionforge-fx",
|
||||||
|
@ -41,7 +41,6 @@ public object NullVision : Vision {
|
|||||||
override val properties: MutableVisionProperties get() = error("Can't get properties of `NullVision`")
|
override val properties: MutableVisionProperties get() = error("Can't get properties of `NullVision`")
|
||||||
|
|
||||||
override val descriptor: MetaDescriptor? = null
|
override val descriptor: MetaDescriptor? = null
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -89,6 +88,12 @@ public class VisionChangeBuilder : MutableVisionContainer<Vision> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun build(visionManager: VisionManager): VisionChange = VisionChange(
|
||||||
|
vision,
|
||||||
|
if (propertyChange.isEmpty()) null else propertyChange,
|
||||||
|
if (children.isEmpty()) null else children.mapValues { it.value.build(visionManager) }
|
||||||
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Isolate collected changes by creating detached copies of given visions
|
* Isolate collected changes by creating detached copies of given visions
|
||||||
*/
|
*/
|
||||||
@ -97,6 +102,13 @@ public class VisionChangeBuilder : MutableVisionContainer<Vision> {
|
|||||||
if (propertyChange.isEmpty()) null else propertyChange.seal(),
|
if (propertyChange.isEmpty()) null else propertyChange.seal(),
|
||||||
if (children.isEmpty()) null else children.mapValues { it.value.deepCopy(visionManager) }
|
if (children.isEmpty()) null else children.mapValues { it.value.deepCopy(visionManager) }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform current change directly to Json string without protective copy
|
||||||
|
*/
|
||||||
|
public fun toJsonString(visionManager: VisionManager): String = visionManager.encodeToString(
|
||||||
|
build(visionManager)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -115,6 +127,9 @@ public inline fun VisionManager.VisionChange(block: VisionChangeBuilder.() -> Un
|
|||||||
VisionChangeBuilder().apply(block).deepCopy(this)
|
VisionChangeBuilder().apply(block).deepCopy(this)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collect changes that are made to [source] to [collector] using [mutex] as a synchronization lock.
|
||||||
|
*/
|
||||||
private fun CoroutineScope.collectChange(
|
private fun CoroutineScope.collectChange(
|
||||||
name: Name,
|
name: Name,
|
||||||
source: Vision,
|
source: Vision,
|
||||||
|
@ -15,6 +15,7 @@ import space.kscience.visionforge.*
|
|||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
import kotlin.test.assertNotEquals
|
import kotlin.test.assertNotEquals
|
||||||
|
import kotlin.time.Duration.Companion.milliseconds
|
||||||
|
|
||||||
|
|
||||||
private class TestScheme : Scheme() {
|
private class TestScheme : Scheme() {
|
||||||
@ -58,7 +59,7 @@ internal class VisionPropertyTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testChildrenPropertyPropagation() = runTest(dispatchTimeoutMs = 200) {
|
fun testChildrenPropertyPropagation() = runTest(timeout = 200.milliseconds) {
|
||||||
val group = Global.request(VisionManager).group {
|
val group = Global.request(VisionManager).group {
|
||||||
properties {
|
properties {
|
||||||
"test" put 11
|
"test" put 11
|
||||||
|
@ -6,6 +6,8 @@ import kotlinx.coroutines.Job
|
|||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.isActive
|
import kotlinx.coroutines.isActive
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.sync.Mutex
|
||||||
|
import kotlinx.coroutines.sync.withLock
|
||||||
import org.w3c.dom.*
|
import org.w3c.dom.*
|
||||||
import org.w3c.dom.url.URL
|
import org.w3c.dom.url.URL
|
||||||
import space.kscience.dataforge.context.*
|
import space.kscience.dataforge.context.*
|
||||||
@ -30,8 +32,6 @@ public class VisionClient : AbstractPlugin() {
|
|||||||
override val tag: PluginTag get() = Companion.tag
|
override val tag: PluginTag get() = Companion.tag
|
||||||
private val visionManager: VisionManager by require(VisionManager)
|
private val visionManager: VisionManager by require(VisionManager)
|
||||||
|
|
||||||
//private val visionMap = HashMap<Element, Vision>()
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Up-going tree traversal in search for endpoint attribute. If element is null, return window URL
|
* Up-going tree traversal in search for endpoint attribute. If element is null, return window URL
|
||||||
*/
|
*/
|
||||||
@ -61,12 +61,20 @@ public class VisionClient : AbstractPlugin() {
|
|||||||
|
|
||||||
private fun Element.getFlag(attribute: String): Boolean = attributes[attribute]?.value != null
|
private fun Element.getFlag(attribute: String): Boolean = attributes[attribute]?.value != null
|
||||||
|
|
||||||
|
private val mutex = Mutex()
|
||||||
|
|
||||||
private val changeCollector = VisionChangeBuilder()
|
private val changeCollector = VisionChangeBuilder()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Communicate vision property changed from rendering engine to model
|
||||||
|
*/
|
||||||
public fun visionPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) {
|
public fun visionPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) {
|
||||||
|
context.launch {
|
||||||
|
mutex.withLock {
|
||||||
changeCollector.propertyChanged(visionName, propertyName, item)
|
changeCollector.propertyChanged(visionName, propertyName, item)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// public fun visionChanged(name: Name?, child: Vision?) {
|
// public fun visionChanged(name: Name?, child: Vision?) {
|
||||||
// changeCollector.setChild(name, child)
|
// changeCollector.setChild(name, child)
|
||||||
@ -131,11 +139,13 @@ public class VisionClient : AbstractPlugin() {
|
|||||||
delay(feedbackAggregationTime.milliseconds)
|
delay(feedbackAggregationTime.milliseconds)
|
||||||
val change = changeCollector[name] ?: continue
|
val change = changeCollector[name] ?: continue
|
||||||
if (!change.isEmpty()) {
|
if (!change.isEmpty()) {
|
||||||
send(visionManager.encodeToString(change.deepCopy(visionManager)))
|
mutex.withLock {
|
||||||
|
send(change.toJsonString(visionManager))
|
||||||
change.reset()
|
change.reset()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
logger.info { "WebSocket update channel established for output '$name'" }
|
logger.info { "WebSocket update channel established for output '$name'" }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -232,7 +242,7 @@ public class VisionClient : AbstractPlugin() {
|
|||||||
public companion object : PluginFactory<VisionClient> {
|
public companion object : PluginFactory<VisionClient> {
|
||||||
override fun build(context: Context, meta: Meta): VisionClient = VisionClient()
|
override fun build(context: Context, meta: Meta): VisionClient = VisionClient()
|
||||||
|
|
||||||
override val tag: PluginTag = PluginTag(name = "vision.client", group = PluginTag.DATAFORGE_GROUP)
|
override val tag: PluginTag = PluginTag(name = "vision.client.js", group = PluginTag.DATAFORGE_GROUP)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ import java.nio.file.Path
|
|||||||
/**
|
/**
|
||||||
* Export a [VisionPage] to a file
|
* Export a [VisionPage] to a file
|
||||||
*
|
*
|
||||||
* @param fileHeaders additional file-system specific headers.
|
* @param fileHeaders additional file system specific headers.
|
||||||
*/
|
*/
|
||||||
@DFExperimental
|
@DFExperimental
|
||||||
public fun VisionPage.makeFile(
|
public fun VisionPage.makeFile(
|
||||||
|
@ -10,7 +10,7 @@ kscience {
|
|||||||
binaries.library()
|
binaries.library()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
api(project(":visionforge-core"))
|
api(projects.visionforgeCore)
|
||||||
api("space.kscience:plotlykt-core:${plotlyVersion}")
|
api("space.kscience:plotlykt-core:${plotlyVersion}")
|
||||||
}
|
}
|
||||||
useSerialization()
|
useSerialization()
|
||||||
|
@ -10,6 +10,7 @@ import space.kscience.dataforge.names.asName
|
|||||||
import space.kscience.visionforge.*
|
import space.kscience.visionforge.*
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.time.Duration.Companion.milliseconds
|
||||||
|
|
||||||
@OptIn(ExperimentalCoroutinesApi::class)
|
@OptIn(ExperimentalCoroutinesApi::class)
|
||||||
@Suppress("UNUSED_VARIABLE")
|
@Suppress("UNUSED_VARIABLE")
|
||||||
@ -26,7 +27,7 @@ class SolidPropertyTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testColorUpdate() = runTest(dispatchTimeoutMs = 200) {
|
fun testColorUpdate() = runTest(timeout = 200.milliseconds) {
|
||||||
val box = Box(10.0f, 10.0f, 10.0f)
|
val box = Box(10.0f, 10.0f, 10.0f)
|
||||||
|
|
||||||
val c = CompletableDeferred<String?>()
|
val c = CompletableDeferred<String?>()
|
||||||
|
Loading…
Reference in New Issue
Block a user