From 474c30fbac8debfec2d7584be82cc70fa032d2f6 Mon Sep 17 00:00:00 2001 From: Angela Cortecchia Date: Fri, 11 Apr 2025 14:26:41 +0200 Subject: [PATCH 01/96] chore(deps): add rrmxmx-kt dependency --- alchemist-loading/build.gradle.kts | 2 ++ gradle/libs.versions.toml | 1 + 2 files changed, 3 insertions(+) diff --git a/alchemist-loading/build.gradle.kts b/alchemist-loading/build.gradle.kts index 3f2c0269a9..feab2ca9dd 100644 --- a/alchemist-loading/build.gradle.kts +++ b/alchemist-loading/build.gradle.kts @@ -38,8 +38,10 @@ dependencies { implementation(libs.kasechange) implementation(libs.kotlin.reflect) implementation(libs.kotlin.coroutines.core) + implementation(libs.rrmxmx) implementation(libs.mongodb) implementation(libs.snakeyaml) + implementation(libs.caffeine) runtimeOnly(libs.groovy.jsr223) runtimeOnly(kotlin("scripting-jsr223")) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2de7cfe243..f28eca56b2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -112,6 +112,7 @@ protelis-interpreter = { module = "org.protelis:protelis-interpreter", version.r protelis-lang = { module = "org.protelis:protelis-lang", version.ref = "protelis" } quadtree = "org.danilopianini:java-quadtree:1.0.1" resourceloader = "org.danilopianini:thread-inheritable-resource-loader:0.3.7" +rrmxmx = { module = "org.danilopianini:rrmxmx-kt", version = "2.0.4" } rtree = "com.github.davidmoten:rtree:0.12" scafi-core = { module = "it.unibo.scafi:scafi-core_2.13", version.ref = "scafi" } scala-compiler = { module = "org.scala-lang:scala-compiler", version.ref = "scala" } From 28257e7996772e33eb8d6567f66f99f371417d9c Mon Sep 17 00:00:00 2001 From: Angela Cortecchia Date: Fri, 11 Apr 2025 14:27:14 +0200 Subject: [PATCH 02/96] feat: add nelder mead method logic --- .../alchemist/boundary/NelderMeadMethod.kt | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt diff --git a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt new file mode 100644 index 0000000000..54c68c9840 --- /dev/null +++ b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt @@ -0,0 +1,148 @@ +package it.unibo.common + +import com.github.benmanes.caffeine.cache.Caffeine +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors +import java.util.concurrent.Future + +/** + * Nelder-Mead optimization method. + * Given an initial [simplex], this method iteratively refines the simplex to minimize a given [objective] function. + * The method is suitable for optimizing functions that are continuous but not differentiable. + * Other parameters are: + * - [alpha]: Reflection coefficient (standard value is 1.0); + * - [gamma]: Expansion coefficient (standard value is 2.0); + * - [rho]: Contraction coefficient (standard value is 0.5); + * - [sigma]: Shrink coefficient (standard value is 0.5); + * - [maxIterations]: Maximum number of iterations; + * - [tolerance]: Termination condition (small variation in function values). + */ +@JvmInline +value class Vertex(private val vertex: Map) { + val size: Int + get() = vertex.size + + fun valuesToList(): List = vertex.values.toList() + + fun keys(): Set = vertex.keys + + operator fun get(index: Int) = valuesToList()[index] + + fun keyAt(index: Int) = vertex.keys.elementAt(index) +} + +class NelderMeadMethod( + val simplex: List, + private val maxIterations: Int, + private val tolerance: Double, + private val alpha: Double, // Reflection coefficient + private val gamma: Double, // Expansion coefficient + private val rho: Double, // Contraction coefficient + private val sigma: Double, // Shrink coefficient + executorService: ExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()), + private val objective: (List) -> Future +) { + + private val cache = Caffeine.newBuilder().executor(executorService) + .build, Future> { coordinates -> + objective(coordinates) + } + + /** + * Apply the Nelder-Mead optimization method to the given [simplex] and [objective] function. + */ + fun optimize(): Vertex { + require(simplex.isNotEmpty()) { "The initial simplex must not be empty" } + val dimensions = simplex.first().size + require(dimensions > 0) { "The number of dimensions must be greater than 0" } + require(simplex.size == dimensions + 1) { + "The vertices of the initial simplex must be one more than the number of dimensions" + } + require(simplex.all { it.size == dimensions }) { + "All vertices of the initial simplex must have the same number of dimensions" + } + var symplexUpdated = simplex + repeat(maxIterations) { //iteration -> + // Sort simplex by function values + val sortedSimplex = symplexUpdated + .map { it to cache[it.valuesToList()] } + .sortedBy { it.second.get() } + .map { it.first } + val bestVertex: Vertex = sortedSimplex.first() + val worstVertex: Vertex = sortedSimplex.last() + val secondWorstVertex: Vertex = sortedSimplex[simplex.size - 2] + val bestValue = cache[bestVertex.valuesToList()] + val worstValues = worstVertex.valuesToList() + // Compute centroid (excluding worst point) + val centroid = + DoubleArray(dimensions) { index -> + sortedSimplex.dropLast(1).sumOf { it[index] } / (sortedSimplex.size - 1) + }.toList() + // Reflections + val reflected: List = centroid.mapCentroid(alpha, worstValues) + val reflectedValue = cache[reflected] + require(reflectedValue.get().isFinite() && !reflectedValue.get().isNaN()) { + "Invalid objective function return value for reflection with $reflected = $reflectedValue.\n" + + "Check the objective function implementation, the result should be a finite number." + } + if (!reflectedValue.get().isFinite()) { + throw IllegalStateException("Invalid objective function return value for reflection") + } + val newSimplex = when { + reflectedValue < bestValue -> { // expansion + val expanded: List = centroid.mapCentroid(gamma, reflected) + when { + cache[expanded] < reflectedValue -> sortedSimplex.updateLastVertex(expanded) + else -> sortedSimplex.updateLastVertex(reflected) + } + } + reflectedValue < cache[secondWorstVertex.valuesToList()] -> { // accept reflection + sortedSimplex.updateLastVertex(reflected) + } + else -> { // contraction + val contracted = when { + reflectedValue < cache[worstValues] -> centroid.mapCentroid(rho, reflected) + else -> centroid.mapCentroid(rho, worstValues) + } + when { + cache[contracted] < cache[worstValues] -> sortedSimplex.updateLastVertex(contracted) +// objective(contracted) < cache[worstValues] -> sortedSimplex.updateLastVertex(contracted) + else -> { // shrink simplex + sortedSimplex.map { vertex -> + Vertex( + vertex.keys().associateWith { key -> + val index = bestVertex.keys().indexOf(key) // Find the index corresponding to the key + val oldValue = bestVertex[index] + oldValue + sigma * (vertex[index] - oldValue) // Apply shrink transformation + } + ) + } + } + } + } + } + // Check termination condition (small variation in function values) + val functionValues = newSimplex.map { cache[it.valuesToList()].get() } + symplexUpdated = newSimplex + val maxDiff = functionValues.maxOrNull()!! - functionValues.minOrNull()!! + if (maxDiff < tolerance) return symplexUpdated.first() + } + return symplexUpdated.first() + } + + private fun List.mapCentroid(coefficient: Double, values: List): List = + mapIndexed { index, value -> value + coefficient * (values[index] - value) } + + private fun List.updateLastVertex(newVertex: List): List = + mapIndexed { index, vertex -> + if (index == size - 1) { + Vertex(vertex.keys().associateWith { newVertex[vertex.keys().indexOf(it)] }) + } else vertex + } + + companion object { + operator fun Future.compareTo(other: Future): Int = get().compareTo(other.get()) + operator fun Future.compareTo(other: Double): Int = get().compareTo(other) + operator fun Double.compareTo(other: Future): Int = compareTo(other.get()) + } +} From 4ef2e988356c81d8a33f0f3f17ae522f374a7c45 Mon Sep 17 00:00:00 2001 From: Angela Cortecchia Date: Fri, 11 Apr 2025 14:30:33 +0200 Subject: [PATCH 03/96] feat: add nelder mead launcher --- .../boundary/launchers/NelderMeadLauncher.kt | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt diff --git a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt new file mode 100644 index 0000000000..c2a30e5823 --- /dev/null +++ b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt @@ -0,0 +1,158 @@ +package it.unibo.alchemist.boundary.launchers + +import it.unibo.alchemist.boundary.Launcher +import it.unibo.alchemist.boundary.Loader +import it.unibo.alchemist.boundary.Variable +import it.unibo.alchemist.model.Environment +import it.unibo.common.NelderMeadMethod +import it.unibo.common.Vertex +import org.danilopianini.rrmxmx.RrmxmxRandom +import org.danilopianini.rrmxmx.RrmxmxRandom.Companion.DEFAULT_SEED +import java.io.File +import java.nio.file.Paths +import java.time.LocalDateTime +import java.util.concurrent.Callable +import java.util.concurrent.ConcurrentLinkedDeque +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors +import java.util.concurrent.ForkJoinPool +import java.util.concurrent.Future +import java.util.concurrent.TimeUnit +import java.util.concurrent.atomic.AtomicInteger +import kotlin.Int.Companion.MAX_VALUE + +class NelderMeadLauncher +@JvmOverloads +constructor( + private val objectiveFunction: Environment<*, *>.() -> Double, + private val variables: List = emptyList(), + private val seedName: String, + private val repetitions: Int = 1, + private val maxIterations: Int = MAX_VALUE, + private val seed: ULong = DEFAULT_SEED, + private val tolerance: Double = 1e-6, + private val alpha: Double = 1.0, // standard value for the reflection in Nelder-Mead method + private val gamma: Double = 2.0, // standard value for the expansion in Nelder-Mead method + private val rho: Double = 0.5, // standard value for the contraction in Nelder-Mead method + private val sigma: Double = 0.5, // standard value for the shrink in Nelder-Mead method +) : Launcher { + @Synchronized + override fun launch(loader: Loader) { + require(loader.variables.isNotEmpty() || variables.isNotEmpty()) { + "No variables found, can not optimize anything." + } + val simplexVertices: List> = generateSymplexVertices(loader.variables) + val seeds: List = + loader.variables[seedName] + ?.stream() + ?.map { + check(it is Number) { "Seed must be a number. $it is not." } + it.toInt() + }?.toList() + ?.take(repetitions) ?: listOf(repetitions) + val executorID = AtomicInteger(0) + val executor = + Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()) { + Thread(it, "Alchemist Nelder Mead worker #${executorID.getAndIncrement()}") + } + val errorQueue = ConcurrentLinkedDeque() + loader.executeWithNelderMead(simplexVertices, executor) { vertex -> + val futureValues = seeds.map> { currentSeed -> + // associate keys to vertex values + val simulationParameters = variables + .associateWith { vertex[variables.indexOf(it)] } + (seedName to currentSeed) + check(loader.variables.keys == simulationParameters.keys) { + "Variables do not match: ${loader.variables.keys} != ${simulationParameters.keys}" + } + executor.submit( + Callable { + val simulation = loader.getWith(simulationParameters) + simulation.play() + simulation.run() + if (simulation.error.isPresent) { + errorQueue.add(simulation.error.get()) + } + objectiveFunction(simulation.environment) + }, + ) + } + ForkJoinPool.commonPool().submit( + Callable { + futureValues.map { it.get() }.average() + }, + ) + }.also { + // write the result into a csv with as name the variables and the date of execution + val outputPath = + Paths.get("").toAbsolutePath().toString() + "${File.separator}data${File.separator}NelderMeadMethod" + // if not exists create the directory + File(outputPath).mkdirs() + val outputFile = + File( + "$outputPath${File.separator}${variables.joinToString( + "_", + )}_maxIter${maxIterations}_${seedName}s${seeds.max()}_${LocalDateTime.now().toString().replace( + ":", + "-", + )}.csv", + ) + val outputContent = buildString { + append(variables.joinToString(" ")) + append("\n") + append(it.entries.joinToString(" ") { it.value.toString() }) + append("\n") + } + outputFile.writeText(outputContent) + } + executor.shutdown() + executor.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS) + if (errorQueue.isNotEmpty()) { + throw errorQueue.reduce { previous, other -> + previous.addSuppressed(other) + previous + } + } + } + + private fun Loader.executeWithNelderMead( + simplexVertices: List>, + executorService: ExecutorService, + executeFunction: (List) -> Future, + ): Map = NelderMeadMethod( + simplex = simplexVertices.map { Vertex(it) }, + maxIterations = maxIterations, + tolerance = tolerance, + alpha = alpha, + gamma = gamma, + rho = rho, + sigma = sigma, + executorService = executorService, + objective = executeFunction, + ).optimize() + .let { result -> + this@NelderMeadLauncher.variables.associateWith { + result[this@NelderMeadLauncher.variables.indexOf(it)] + } + } + + private fun generateSymplexVertices(loaderVariables: Map>): List> { + val randomGenerator = RrmxmxRandom(seed) + val instances: Map> = + variables.associateWith { varName -> + val variable = loaderVariables.getValue(varName) + val allValues = + variable + .stream() + .map { + check(it is Number) { + "All variables to optimize must be Numbers. $varName has value $it." + } + it.toDouble() + }.toList() + allValues.min()..allValues.max() + } + return (0..variables.size).map { + instances.mapValues { (_, range) -> randomGenerator.nextDouble(range.start, range.endInclusive) } + } + } +} From e7a90aa64989115781ef5c58d1183a9c742b123a Mon Sep 17 00:00:00 2001 From: Angela Cortecchia Date: Fri, 11 Apr 2025 14:30:57 +0200 Subject: [PATCH 04/96] style: fix according to ktlint --- .../alchemist/boundary/NelderMeadMethod.kt | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt index 54c68c9840..7de52b7b41 100644 --- a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt +++ b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt @@ -40,13 +40,13 @@ class NelderMeadMethod( private val rho: Double, // Contraction coefficient private val sigma: Double, // Shrink coefficient executorService: ExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()), - private val objective: (List) -> Future + private val objective: (List) -> Future, ) { private val cache = Caffeine.newBuilder().executor(executorService) .build, Future> { coordinates -> objective(coordinates) - } + } /** * Apply the Nelder-Mead optimization method to the given [simplex] and [objective] function. @@ -62,7 +62,8 @@ class NelderMeadMethod( "All vertices of the initial simplex must have the same number of dimensions" } var symplexUpdated = simplex - repeat(maxIterations) { //iteration -> + repeat(maxIterations) { + // iteration -> // Sort simplex by function values val sortedSimplex = symplexUpdated .map { it to cache[it.valuesToList()] } @@ -111,10 +112,11 @@ class NelderMeadMethod( sortedSimplex.map { vertex -> Vertex( vertex.keys().associateWith { key -> - val index = bestVertex.keys().indexOf(key) // Find the index corresponding to the key + // Find the index corresponding to the key + val index = bestVertex.keys().indexOf(key) val oldValue = bestVertex[index] oldValue + sigma * (vertex[index] - oldValue) // Apply shrink transformation - } + }, ) } } @@ -133,12 +135,13 @@ class NelderMeadMethod( private fun List.mapCentroid(coefficient: Double, values: List): List = mapIndexed { index, value -> value + coefficient * (values[index] - value) } - private fun List.updateLastVertex(newVertex: List): List = - mapIndexed { index, vertex -> - if (index == size - 1) { - Vertex(vertex.keys().associateWith { newVertex[vertex.keys().indexOf(it)] }) - } else vertex + private fun List.updateLastVertex(newVertex: List): List = mapIndexed { index, vertex -> + if (index == size - 1) { + Vertex(vertex.keys().associateWith { newVertex[vertex.keys().indexOf(it)] }) + } else { + vertex } + } companion object { operator fun Future.compareTo(other: Future): Int = get().compareTo(other.get()) From def2ed3624562371902e21da4fd2c3408bf668c3 Mon Sep 17 00:00:00 2001 From: Angela Cortecchia Date: Mon, 14 Apr 2025 12:27:03 +0200 Subject: [PATCH 05/96] docs: add missing documentation --- .../alchemist/boundary/NelderMeadMethod.kt | 58 ++++++++++++++----- .../boundary/launchers/NelderMeadLauncher.kt | 13 ++++- 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt index 7de52b7b41..b8bdbb9bf0 100644 --- a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt +++ b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt @@ -1,4 +1,4 @@ -package it.unibo.common +package it.unibo.alchemist.boundary import com.github.benmanes.caffeine.cache.Caffeine import java.util.concurrent.ExecutorService @@ -6,31 +6,49 @@ import java.util.concurrent.Executors import java.util.concurrent.Future /** - * Nelder-Mead optimization method. - * Given an initial [simplex], this method iteratively refines the simplex to minimize a given [objective] function. - * The method is suitable for optimizing functions that are continuous but not differentiable. - * Other parameters are: - * - [alpha]: Reflection coefficient (standard value is 1.0); - * - [gamma]: Expansion coefficient (standard value is 2.0); - * - [rho]: Contraction coefficient (standard value is 0.5); - * - [sigma]: Shrink coefficient (standard value is 0.5); - * - [maxIterations]: Maximum number of iterations; - * - [tolerance]: Termination condition (small variation in function values). + * A vertex of the simplex in the Nelder-Mead method. */ @JvmInline value class Vertex(private val vertex: Map) { + /** + * Returns amount of dimensions of the vertex. + */ val size: Int get() = vertex.size + /** + * Returns the values of the vertex as a list. + */ fun valuesToList(): List = vertex.values.toList() + /** + * Returns the keys of the vertex as a set. + */ fun keys(): Set = vertex.keys + /** + * Returns the value of the vertex at the given index. + */ operator fun get(index: Int) = valuesToList()[index] + /** + * Returns the key of the vertex at the given index. + */ fun keyAt(index: Int) = vertex.keys.elementAt(index) } +/** + * Nelder-Mead optimization method. + * Given an initial [simplex], this method iteratively refines the simplex to minimize a given [objective] function. + * The method is suitable for optimizing functions that are continuous but not differentiable. + * Other parameters are: + * - [alpha]: Reflection coefficient (standard value is 1.0); + * - [gamma]: Expansion coefficient (standard value is 2.0); + * - [rho]: Contraction coefficient (standard value is 0.5); + * - [sigma]: Shrink coefficient (standard value is 0.5); + * - [maxIterations]: Maximum number of iterations; + * - [tolerance]: Termination condition (small variation in function values). + */ class NelderMeadMethod( val simplex: List, private val maxIterations: Int, @@ -86,8 +104,8 @@ class NelderMeadMethod( "Invalid objective function return value for reflection with $reflected = $reflectedValue.\n" + "Check the objective function implementation, the result should be a finite number." } - if (!reflectedValue.get().isFinite()) { - throw IllegalStateException("Invalid objective function return value for reflection") + check (!reflectedValue.get().isFinite()) { + error("Invalid objective function return value for reflection") } val newSimplex = when { reflectedValue < bestValue -> { // expansion @@ -143,9 +161,23 @@ class NelderMeadMethod( } } + /** + * This companion object contains the comparison operators for [Future] of [Double] objects and [Double]s. + */ companion object { + /** + * Compares two [Future] of [Double] objects. + */ operator fun Future.compareTo(other: Future): Int = get().compareTo(other.get()) + + /** + * Compares a [Future] of [Double] object with a [Double]. + */ operator fun Future.compareTo(other: Double): Int = get().compareTo(other) + + /** + * Compares a [Double] with a [Future] of [Double] object. + */ operator fun Double.compareTo(other: Future): Int = compareTo(other.get()) } } diff --git a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt index c2a30e5823..68da6ccb75 100644 --- a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt +++ b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt @@ -4,8 +4,8 @@ import it.unibo.alchemist.boundary.Launcher import it.unibo.alchemist.boundary.Loader import it.unibo.alchemist.boundary.Variable import it.unibo.alchemist.model.Environment -import it.unibo.common.NelderMeadMethod -import it.unibo.common.Vertex +import it.unibo.alchemist.boundary.NelderMeadMethod +import it.unibo.alchemist.boundary.Vertex import org.danilopianini.rrmxmx.RrmxmxRandom import org.danilopianini.rrmxmx.RrmxmxRandom.Companion.DEFAULT_SEED import java.io.File @@ -21,6 +21,15 @@ import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicInteger import kotlin.Int.Companion.MAX_VALUE +/** + * Alchemist launcher for the Nelder-Mead method optimization. + * This launcher optimize the [variables] of the simulation by a given [objectiveFunction]. + * The optimization is done by the Nelder-Mead method, which is a derivative-free optimization algorithm. + * The optimization is done in parallel. + * The optimization is done for a given number of [repetitions] of the [seedName] and [maxIterations]. + * The optimization is done with a given [tolerance], under which the optimization stops, + * and also the [alpha], [gamma], [rho] and [sigma] parameters of the Nelder-Mead method. + */ class NelderMeadLauncher @JvmOverloads constructor( From 79f7336151e55a60726a197fc23223e98c89ed62 Mon Sep 17 00:00:00 2001 From: Angela Cortecchia Date: Tue, 15 Apr 2025 16:47:55 +0200 Subject: [PATCH 06/96] chore(deps): add kotlinx serialization --- alchemist-loading/build.gradle.kts | 2 + .../alchemist/boundary/NelderMeadMethod.kt | 66 +++++++++---------- .../boundary/launchers/NelderMeadLauncher.kt | 8 +-- 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/alchemist-loading/build.gradle.kts b/alchemist-loading/build.gradle.kts index feab2ca9dd..1643303024 100644 --- a/alchemist-loading/build.gradle.kts +++ b/alchemist-loading/build.gradle.kts @@ -38,6 +38,7 @@ dependencies { implementation(libs.kasechange) implementation(libs.kotlin.reflect) implementation(libs.kotlin.coroutines.core) + implementation(libs.kotlinx.serialization.json) implementation(libs.rrmxmx) implementation(libs.mongodb) implementation(libs.snakeyaml) @@ -52,6 +53,7 @@ dependencies { testImplementation(libs.appdirs) testImplementation(libs.caffeine) testImplementation(libs.embedmongo) + testImplementation(libs.kotlin.test) testRuntimeOnly(incarnation("sapere")) testRuntimeOnly(incarnation("protelis")) diff --git a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt index b8bdbb9bf0..9ab1a753a0 100644 --- a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt +++ b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt @@ -5,38 +5,6 @@ import java.util.concurrent.ExecutorService import java.util.concurrent.Executors import java.util.concurrent.Future -/** - * A vertex of the simplex in the Nelder-Mead method. - */ -@JvmInline -value class Vertex(private val vertex: Map) { - /** - * Returns amount of dimensions of the vertex. - */ - val size: Int - get() = vertex.size - - /** - * Returns the values of the vertex as a list. - */ - fun valuesToList(): List = vertex.values.toList() - - /** - * Returns the keys of the vertex as a set. - */ - fun keys(): Set = vertex.keys - - /** - * Returns the value of the vertex at the given index. - */ - operator fun get(index: Int) = valuesToList()[index] - - /** - * Returns the key of the vertex at the given index. - */ - fun keyAt(index: Int) = vertex.keys.elementAt(index) -} - /** * Nelder-Mead optimization method. * Given an initial [simplex], this method iteratively refines the simplex to minimize a given [objective] function. @@ -81,7 +49,6 @@ class NelderMeadMethod( } var symplexUpdated = simplex repeat(maxIterations) { - // iteration -> // Sort simplex by function values val sortedSimplex = symplexUpdated .map { it to cache[it.valuesToList()] } @@ -125,7 +92,6 @@ class NelderMeadMethod( } when { cache[contracted] < cache[worstValues] -> sortedSimplex.updateLastVertex(contracted) -// objective(contracted) < cache[worstValues] -> sortedSimplex.updateLastVertex(contracted) else -> { // shrink simplex sortedSimplex.map { vertex -> Vertex( @@ -181,3 +147,35 @@ class NelderMeadMethod( operator fun Double.compareTo(other: Future): Int = compareTo(other.get()) } } + +/** + * A vertex of the simplex in the Nelder-Mead method. + */ +@JvmInline +value class Vertex(private val vertex: Map) { + /** + * Returns amount of dimensions of the vertex. + */ + val size: Int + get() = vertex.size + + /** + * Returns the values of the vertex as a list. + */ + fun valuesToList(): List = vertex.values.toList() + + /** + * Returns the keys of the vertex as a set. + */ + fun keys(): Set = vertex.keys + + /** + * Returns the value of the vertex at the given index. + */ + operator fun get(index: Int) = valuesToList()[index] + + /** + * Returns the key of the vertex at the given index. + */ + fun keyAt(index: Int) = vertex.keys.elementAt(index) +} diff --git a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt index 68da6ccb75..0ba9efff47 100644 --- a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt +++ b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt @@ -25,10 +25,10 @@ import kotlin.Int.Companion.MAX_VALUE * Alchemist launcher for the Nelder-Mead method optimization. * This launcher optimize the [variables] of the simulation by a given [objectiveFunction]. * The optimization is done by the Nelder-Mead method, which is a derivative-free optimization algorithm. - * The optimization is done in parallel. - * The optimization is done for a given number of [repetitions] of the [seedName] and [maxIterations]. - * The optimization is done with a given [tolerance], under which the optimization stops, - * and also the [alpha], [gamma], [rho] and [sigma] parameters of the Nelder-Mead method. + * The optimization is done in parallel for a given number of [repetitions] of the [seedName] and [maxIterations]. + * It will stop when the [tolerance] is reached. + * The [alpha], [gamma], [rho] and [sigma] parameters are the standard values for the Nelder-Mead method. + * The result of the optimization is written into `data/NelderMeadMethod` folder as a CSV file. */ class NelderMeadLauncher @JvmOverloads From 4cc19098b3fead7eac078b7c13a1aac4a43f1015 Mon Sep 17 00:00:00 2001 From: Angela Cortecchia Date: Tue, 15 Apr 2025 16:49:47 +0200 Subject: [PATCH 07/96] fix: put result into json file and take as parameter the path and file --- .../boundary/launchers/NelderMeadLauncher.kt | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt index 0ba9efff47..5c18bb7aff 100644 --- a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt +++ b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/launchers/NelderMeadLauncher.kt @@ -2,14 +2,16 @@ package it.unibo.alchemist.boundary.launchers import it.unibo.alchemist.boundary.Launcher import it.unibo.alchemist.boundary.Loader -import it.unibo.alchemist.boundary.Variable -import it.unibo.alchemist.model.Environment import it.unibo.alchemist.boundary.NelderMeadMethod +import it.unibo.alchemist.boundary.Variable import it.unibo.alchemist.boundary.Vertex +import it.unibo.alchemist.model.Environment +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.buildJsonObject import org.danilopianini.rrmxmx.RrmxmxRandom import org.danilopianini.rrmxmx.RrmxmxRandom.Companion.DEFAULT_SEED import java.io.File -import java.nio.file.Paths import java.time.LocalDateTime import java.util.concurrent.Callable import java.util.concurrent.ConcurrentLinkedDeque @@ -28,11 +30,13 @@ import kotlin.Int.Companion.MAX_VALUE * The optimization is done in parallel for a given number of [repetitions] of the [seedName] and [maxIterations]. * It will stop when the [tolerance] is reached. * The [alpha], [gamma], [rho] and [sigma] parameters are the standard values for the Nelder-Mead method. - * The result of the optimization is written into `data/NelderMeadMethod` folder as a CSV file. + * The result of the optimization is written into `[outputPath]` folder in [outputFileName] as a JSON file. */ class NelderMeadLauncher @JvmOverloads constructor( + private val outputPath: String = "data", + private val outputFileName: String = "nelderMead", private val objectiveFunction: Environment<*, *>.() -> Double, private val variables: List = emptyList(), private val seedName: String, @@ -45,6 +49,7 @@ constructor( private val rho: Double = 0.5, // standard value for the contraction in Nelder-Mead method private val sigma: Double = 0.5, // standard value for the shrink in Nelder-Mead method ) : Launcher { + @OptIn(ExperimentalSerializationApi::class) @Synchronized override fun launch(loader: Loader) { require(loader.variables.isNotEmpty() || variables.isNotEmpty()) { @@ -90,27 +95,21 @@ constructor( futureValues.map { it.get() }.average() }, ) - }.also { - // write the result into a csv with as name the variables and the date of execution - val outputPath = - Paths.get("").toAbsolutePath().toString() + "${File.separator}data${File.separator}NelderMeadMethod" + }.also { result -> // if not exists create the directory File(outputPath).mkdirs() - val outputFile = - File( - "$outputPath${File.separator}${variables.joinToString( - "_", - )}_maxIter${maxIterations}_${seedName}s${seeds.max()}_${LocalDateTime.now().toString().replace( - ":", - "-", - )}.csv", - ) - val outputContent = buildString { - append(variables.joinToString(" ")) - append("\n") - append(it.entries.joinToString(" ") { it.value.toString() }) - append("\n") - } + val outputFile = File( + "$outputPath${File.separator}${outputFileName}" + + "_${LocalDateTime.now().toString().replace(":", "-")}.json", + ) + val outputContent = buildJsonObject { + put(seedName, JsonPrimitive(repetitions)) + put("variables", buildJsonObject { + variables.forEach { variable -> + put(variable, JsonPrimitive(result[variable])) + } + }) + }.toString() outputFile.writeText(outputContent) } executor.shutdown() From c9a5e824f0c088b4ce8919fc1df79a19a2686ddb Mon Sep 17 00:00:00 2001 From: Angela Cortecchia Date: Tue, 15 Apr 2025 16:50:22 +0200 Subject: [PATCH 08/96] test: add test class for nelder mead launcher --- .../alchemist/test/TestNelderMeadLauncher.kt | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 alchemist-loading/src/test/kotlin/it/unibo/alchemist/test/TestNelderMeadLauncher.kt diff --git a/alchemist-loading/src/test/kotlin/it/unibo/alchemist/test/TestNelderMeadLauncher.kt b/alchemist-loading/src/test/kotlin/it/unibo/alchemist/test/TestNelderMeadLauncher.kt new file mode 100644 index 0000000000..645e9ab164 --- /dev/null +++ b/alchemist-loading/src/test/kotlin/it/unibo/alchemist/test/TestNelderMeadLauncher.kt @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2010-2025, Danilo Pianini and contributors + * listed, for each module, in the respective subproject's build.gradle.kts file. + * + * This file is part of Alchemist, and is distributed under the terms of the + * GNU General Public License, with a linking exception, + * as described in the file LICENSE in the Alchemist distribution's top directory. + */ + +package it.unibo.alchemist.test + +import it.unibo.alchemist.boundary.LoadAlchemist +import it.unibo.alchemist.boundary.launchers.DefaultLauncher +import it.unibo.alchemist.core.Status +import it.unibo.alchemist.model.Environment +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.jsonObject +import org.kaikikm.threadresloader.ResourceLoader +import java.io.File +import java.util.concurrent.TimeUnit +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +class TestNelderMeadLauncher() { + val loader = LoadAlchemist + .from(ResourceLoader.getResource("testNelderMeadLauncher.yml")) + + @Test + fun `Nelder mead launcher should optimize the objective function as expected`() { + val launcher = loader.launcher + println("launcher is $launcher") + launcher.launch(loader) + val simulation = loader.getDefault() + assertEquals(simulation.environment.nodeCount , 1) + simulation.play() + simulation.run() + val status = simulation.waitFor(Status.TERMINATED, 5, TimeUnit.MINUTES) + check(status == Status.TERMINATED) { + error("Simulation did not terminate after 5 minutes, status is $status") + } + // take the last created file at a specific path + // newestFileTime = max([os.path.getmtime(directory + '/' + file) for file in os.listdir(directory)], default=0.0) + val newestFile = File("src/test/resources/testNelderMeadResults") + .listFiles() + ?.maxByOrNull { it.lastModified() } + // from this file, i want to take all the values and relative keys of the object "variables" + val json = newestFile?.readText() + if(json != null) { + val element = Json.parseToJsonElement(json) + val variables = element.jsonObject["variables"]?.jsonObject + println("variables are $variables") + if (variables != null) { + val inputs = variables.toMap().mapValues { it.value.toString().toDouble() } + println("inputs are $inputs") + loader.launch(DefaultLauncher()) + val optimizedSimulation = loader.getWith(inputs) + assertTrue(optimizedSimulation.environment.nodeCount in 75..85) + } + } + } + + @Test + fun `Nelder mead parameter optimization should TODO`() { +// val newestFile = File("src/test/resources/testNelderMeadResults") +// .listFiles() +// ?.maxByOrNull { it.lastModified() } +// // from this file, i want to take all the values and relative keys of the object "variables" +// val json = newestFile?.readText() +// if(json != null) { +// val element = Json.parseToJsonElement(json) +// val variables = element.jsonObject["variables"]?.jsonObject +// println("variables are $variables") +// if (variables != null) { +// val inputs = variables.toMap().mapValues { it.value.toString().toDouble() } +// println("inputs are $inputs") +// loader.launch(DefaultLauncher()) +// val customVars = mapOf("width" to 9.0, "height" to 9.0) +// val optimizedSimulation = loader.getWith(customVars) +// assertTrue(optimizedSimulation.environment.nodeCount in 75..85) +// } +// } + loader.launch(DefaultLauncher()) + val customVars = mapOf("width" to 8.0, "height" to 10.0) + val optimizedSimulation = loader.getWith(customVars) + optimizedSimulation.play() + optimizedSimulation.run() + assertTrue(optimizedSimulation.environment.nodeCount in 75..85) + } +} + +/** + * The goal for the optimization. + */ +class Goal : (Environment<*, *>) -> Double { + /** + * The target number of nodes. + */ + val target = 81 + + override fun invoke(env: Environment<*, *>): Double = target.toDouble() - env.nodeCount +} + From 3ebddb602e6b831a385bb7ca69fb3df6ba2a64b5 Mon Sep 17 00:00:00 2001 From: Angela Cortecchia Date: Tue, 15 Apr 2025 16:50:53 +0200 Subject: [PATCH 09/96] feat: add nelder mead launcher yaml --- .../test/resources/testNelderMeadLauncher.yml | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 alchemist-loading/src/test/resources/testNelderMeadLauncher.yml diff --git a/alchemist-loading/src/test/resources/testNelderMeadLauncher.yml b/alchemist-loading/src/test/resources/testNelderMeadLauncher.yml new file mode 100644 index 0000000000..ef8e4d9e74 --- /dev/null +++ b/alchemist-loading/src/test/resources/testNelderMeadLauncher.yml @@ -0,0 +1,45 @@ +variables: + goal: &goal + formula: | + it.unibo.alchemist.test.Goal() + language: kotlin + width: &width + type: LinearVariable + parameters: [ 1, 1, 20, 1 ] + height: &height + type: LinearVariable + parameters: [ 1, 1, 20, 1 ] + seed: &seed + min: 0 + max: 0 + step: 1 + default: 0 + +network-model: + type: ConnectWithinDistance + parameters: [ 5 ] + +seeds: + scenario: *seed + simulation: *seed + +incarnation: protelis + +deployments: + - type: Grid + parameters: [0, 0, *width, *height, 1, 1] + +terminate: + type: AfterTime + parameters: [5] + +launcher: + type: NelderMeadLauncher + parameters: { + outputPath: "src/test/resources/testNelderMeadResults", + outputFileName: "testNelderMeadLauncher", + objectiveFunction: *goal, + variables: [ "width", "height" ], + seedName: "seed", + repetitions: 1, + } From 1bfd7c27cd27cadd21433d14e1d37cd8b69cc855 Mon Sep 17 00:00:00 2001 From: Angela Cortecchia Date: Mon, 14 Apr 2025 12:10:02 +0200 Subject: [PATCH 10/96] perf: improve the network diameter evaluation performance (#4288) --- .../it/unibo/alchemist/model/Network.kt | 7 +- .../it/unibo/alchemist/util/Environments.kt | 104 +++++------- .../unibo/alchemist/util/TestDiameterUtils.kt | 135 ++++++++++++++++ .../util/TestEnvironmentsDiameter.kt | 149 ++++++++---------- ...TestEnvironmentsDiameterWithHopDistance.kt | 109 +++++++++++++ .../alchemist/util/UndirectedEdgeTest.kt | 32 ---- 6 files changed, 347 insertions(+), 189 deletions(-) create mode 100644 alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/TestDiameterUtils.kt create mode 100644 alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/TestEnvironmentsDiameterWithHopDistance.kt delete mode 100644 alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/UndirectedEdgeTest.kt diff --git a/alchemist-implementationbase/src/main/kotlin/it/unibo/alchemist/model/Network.kt b/alchemist-implementationbase/src/main/kotlin/it/unibo/alchemist/model/Network.kt index 08eef62ee5..05bdeef8f7 100644 --- a/alchemist-implementationbase/src/main/kotlin/it/unibo/alchemist/model/Network.kt +++ b/alchemist-implementationbase/src/main/kotlin/it/unibo/alchemist/model/Network.kt @@ -26,15 +26,10 @@ interface Network { /** * Returns true whether the [Network] contains the [node] passed as input. */ - operator fun contains(node: Node): Boolean = nodes.contains(node) + operator fun contains(node: Node): Boolean = node in nodes /** * Returns true whether the [Network] contains at least one of the [nodes] passed as input. */ fun containsAtLeastOneOf(nodes: Set>): Boolean = nodes.any { it in this } - - /** - * Returns a new [Network] obtained by adding the [otherNetwork] to this one. - */ - operator fun plus(otherNetwork: Network): Network } diff --git a/alchemist-implementationbase/src/main/kotlin/it/unibo/alchemist/util/Environments.kt b/alchemist-implementationbase/src/main/kotlin/it/unibo/alchemist/util/Environments.kt index 0a9a53b6ed..b6b07aa1ae 100644 --- a/alchemist-implementationbase/src/main/kotlin/it/unibo/alchemist/util/Environments.kt +++ b/alchemist-implementationbase/src/main/kotlin/it/unibo/alchemist/util/Environments.kt @@ -14,6 +14,7 @@ import it.unibo.alchemist.model.Network import it.unibo.alchemist.model.Node import it.unibo.alchemist.util.Environments.allShortestHopPaths import org.danilopianini.symmetricmatrix.MutableDoubleSymmetricMatrix +import org.danilopianini.symmetricmatrix.SymmetricMatrix import kotlin.Double.Companion.NaN import kotlin.Double.Companion.POSITIVE_INFINITY import kotlin.math.max @@ -63,43 +64,45 @@ object Environments { fun Environment.allSubNetworksByNode( computeDistance: (Node, Node) -> Double = environmentMetricDistance(), ): Map, Network> { - val subnetworks = mutableMapOf, Network>() - - fun subnetOf(distance: Double, node: Node): Network = subnetworks[node] - .let { subnet -> - val result = SubNetwork(distance, node) - if (subnet == null) result else result + subnet - } + val subnetworks = arrayOfNulls>(nodeCount) + val result = mutableMapOf, Network>() val paths = allShortestPaths(computeDistance) - for (i in 0 until nodes.size) { - val reference = nodes[i] - for (j in i until nodes.size) { - val target = nodes[j] - val distance = paths[UndirectedEdge(reference, target)] - if (distance != null && distance.isFinite()) { - val merger = subnetOf(distance, reference) + subnetOf(distance, target) - subnetworks[target] = merger - } - } - } // Update all the subnetworks with the last evaluated; that is the most complete - val toVisit = nodes.toMutableSet() - while (toVisit.isNotEmpty()) { - val current = toVisit.last().also { toVisit -= it } - val subnet = subnetworks.getValue(current) - // For each node in the current subnet, update the subnetworks related to each node - subnet.nodes.forEach { node -> - toVisit -= node - subnetworks[node] = subnet + nodes.forEachIndexed { centerIndex, centerNode -> + when (val subnetwork = subnetworks[centerIndex]) { + null -> { + val newSubnetwork = MutableNetwork(0.0, mutableListOf(centerNode)) + result.put(centerNode, newSubnetwork) + val centerRow = paths.row(centerIndex) + for (potentialNeighborIndex in centerIndex + 1 until nodeCount) { + val distanceToNeighbor = centerRow[potentialNeighborIndex] + if (distanceToNeighbor.isFinite()) { + newSubnetwork.diameter = max(newSubnetwork.diameter, distanceToNeighbor) + newSubnetwork.neighbors += nodes[potentialNeighborIndex] + subnetworks[potentialNeighborIndex] = newSubnetwork + } + } + } + else -> { + // The subnetwork is already computed + subnetwork.diameter = max( + subnetwork.diameter, + paths.row(centerIndex).asSequence() + .drop(centerIndex + 1) + .filter { it.isFinite() } + .maxOrNull() + ?: 0.0, + ) + } } } - return subnetworks + return result } /** * Computes the diameter of all subnetworks in the environment. * The diameter is the longest shortest path between any two nodes. - * Returns a [Set] containing the [SubNetwork]s. + * Returns a [Map] containing the [SubNetwork] related to each [Node] of the environment. */ fun Environment.allSubNetworks( computeDistance: (Node, Node) -> Double = environmentMetricDistance(), @@ -110,39 +113,23 @@ object Environments { */ fun Environment.allShortestHopPaths() = allShortestPaths(hopDistance()) - /** - * Represents an undirected edge between the [source] and the [target] nodes. - * The order of the nodes does not matter. - */ - data class UndirectedEdge(val source: Node, val target: Node) { - override fun equals(other: Any?): Boolean = this === other || - other is UndirectedEdge<*> && - (source == other.source && target == other.target || source == other.target && target == other.source) - - override fun hashCode(): Int = source.hashCode() + target.hashCode() - } - /** * Computes all the minimum distances with the provided metric using the Floyd–Warshall algorithm. */ - fun Environment.allShortestPaths( + private fun Environment.allShortestPaths( computeDistance: (Node, Node) -> Double = neighborDistanceMetric { n1, n2 -> getDistanceBetweenNodes(n1, n2) }, - ): Map, Double> { + ): SymmetricMatrix { val nodes = nodes.toList() /* * The distance matrix is a triangular matrix stored in a flat array. */ val distances = MutableDoubleSymmetricMatrix(nodeCount) - val result = LinkedHashMap, Double>(nodes.size * (nodes.size + 1) / 2, 1.0f) for (i in 0 until nodeCount) { for (j in i until nodeCount) { distances[i, j] = computeDistance(nodes[i], nodes[j]) - if (distances[i, j].isFinite()) { - result.put(UndirectedEdge(nodes[i], nodes[j]), distances[i, j]) - } } } for (intermediate in 0 until nodeCount) { @@ -151,12 +138,11 @@ object Environments { val throughIntermediate = distances[i, intermediate] + distances[intermediate, j] if (distances[i, j] > throughIntermediate) { distances[i, j] = throughIntermediate - result.put(UndirectedEdge(nodes[i], nodes[j]), throughIntermediate) } } } } - return result + return distances } /** @@ -164,12 +150,7 @@ object Environments { */ fun Environment.isNetworkSegmented(): Boolean { val explored = mutableSetOf>() - val toExplore: MutableSet> = - nodes - .firstOrNull() - ?.let { setOf(it) } - .orEmpty() - .toMutableSet() + val toExplore: MutableSet> = nodes.firstOrNull()?.let { setOf(it) }.orEmpty().toMutableSet() while (toExplore.isNotEmpty()) { val current = toExplore.first() explored += current @@ -199,17 +180,8 @@ object Environments { */ fun Environment<*, *>.networkDiameter(): Double = allSubNetworks().singleOrNull()?.diameter ?: NaN - private data class SubNetwork(override val diameter: Double, override val nodes: Set>) : Network { - init { - require(nodes.isNotEmpty()) - require(diameter.isFinite() && diameter >= 0.0) - } - - constructor(diameter: Double, vararg nodes: Node) : this(diameter, nodes.toSet()) - - constructor(node: Node) : this(0.0, setOf(node)) - - override fun plus(otherNetwork: Network): Network = - SubNetwork(max(diameter, otherNetwork.diameter), nodes + otherNetwork.nodes) + private data class MutableNetwork(override var diameter: Double, val neighbors: MutableList>) : + Network { + override val nodes: Set> by lazy { neighbors.toSet() } } } diff --git a/alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/TestDiameterUtils.kt b/alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/TestDiameterUtils.kt new file mode 100644 index 0000000000..ff83559197 --- /dev/null +++ b/alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/TestDiameterUtils.kt @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2010-2025, Danilo Pianini and contributors + * listed, for each module, in the respective subproject's build.gradle.kts file. + * + * This file is part of Alchemist, and is distributed under the terms of the + * GNU General Public License, with a linking exception, + * as described in the file LICENSE in the Alchemist distribution's top directory. + */ + +package it.unibo.alchemist.util + +import it.unibo.alchemist.model.Environment +import it.unibo.alchemist.model.environments.Continuous2DEnvironment +import it.unibo.alchemist.model.linkingrules.ConnectWithinDistance +import it.unibo.alchemist.model.nodes.GenericNode +import it.unibo.alchemist.model.positions.Euclidean2DPosition +import it.unibo.alchemist.model.protelis.ProtelisIncarnation +import it.unibo.alchemist.util.Environments.isNetworkSegmented +import it.unibo.alchemist.util.Environments.networkDiameter +import kotlin.test.assertTrue + +/** + * Adds a node to the environment at the specified [coordinates]. + */ +infix fun Environment.addNodeAt(coordinates: Pair) = addNode( + GenericNode(ProtelisIncarnation(), this), + Euclidean2DPosition(coordinates.first, coordinates.second), +) + +/** + * Creates a new [Continuous2DEnvironment] with nodes at the specified [positions]. + */ +fun environmentWithNodesAt(vararg positions: Pair) = + Continuous2DEnvironment(ProtelisIncarnation()).apply { + linkingRule = ConnectWithinDistance(5.0) + positions.forEach { addNodeAt(it) } + } + +/** + * Asserts that the environment is segmented and has a NaN network diameter. + */ +fun Environment.mustBeSegmented() { + assertTrue(isNetworkSegmented()) + assertTrue(networkDiameter().isNaN()) +} + +/** + * Creates a [Subnetworks] object with the specified [count]. + */ +fun Int.subnetworks(): Subnetworks = Subnetworks(this) + +/** + * Represents the number of subnetworks in an environment. + */ +@JvmInline +value class Subnetworks(val count: Int) + +/** + * The origin of the coordinate system. + */ +val ORIGIN = 0.0 to 0.0 + +/** + * Represents a network composed of one node. + */ +fun singleNodeEnvironment() = environmentWithNodesAt(ORIGIN) + +/** + * Represents a network composed of two connected nodes. + */ +val twoConnectedNodes = environmentWithNodesAt(ORIGIN, 3.0 to 0.0) + +/** + * Represents a network composed of three nodes in a triangle formation. + */ +val nodesInATriangle = environmentWithNodesAt(ORIGIN, 3.0 to 0.0, 0.0 to 3.0) + +/** + * Represents a network composed of three nodes in a row, + * with just the central node that has two neighbors. + */ +val threeNodesInARow = environmentWithNodesAt(ORIGIN, 4.0 to 0.0, 8.0 to 0.0) + +/** + * Represents a network composed of four nodes in a square formation. + */ +val fourNodesInASquare = environmentWithNodesAt(ORIGIN, 5.0 to 0.0, 0.0 to 5.0, 5.0 to 5.0) + +/** + * Represents a network composed of four nodes in a triangle formation. + */ +val fourNodesInATriangle = environmentWithNodesAt(ORIGIN, 3.0 to 0.0, 6.0 to 0.0, 3.0 to 3.0) + +/** + * Represents a network composed of three nodes, + * one of which is isolated from the others. + */ +val twoConnectedNodesAndOneIsolated = environmentWithNodesAt(ORIGIN, 3.0 to 0.0, 10.0 to 0.0) + +/** + * Represents a network composed of two subnetworks, + * each with two nodes. + */ +val twoSubnetworksWithTwoNodesEach = environmentWithNodesAt(ORIGIN, 3.0 to 0.0, 10.0 to 0.0, 10.0 to 3.0) + +/** + * Represents a network composed of two subnetworks, + * each with different amount of nodes. + */ +val twoSparseSubnetworks = environmentWithNodesAt( + ORIGIN, + 12.0 to 12.0, + 0.0 to 6.0, + 12.0 to 14.0, + -3.0 to 3.0, + 9.0 to 15.0, + 3.0 to 3.0, + 15.0 to 15.0, +) + +/** + * Represents a network composed of three subnetworks, + * each with different amount of nodes. + */ +val threeSparseSubnetworks = environmentWithNodesAt( + ORIGIN, + 12.0 to 12.0, + 0.0 to 6.0, + 12.0 to 14.0, + -3.0 to 3.0, + 9.0 to 15.0, + 3.0 to 3.0, + 15.0 to 15.0, + 25.0 to 25.0, +) diff --git a/alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/TestEnvironmentsDiameter.kt b/alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/TestEnvironmentsDiameter.kt index efc91bf3e3..15210cb6a2 100644 --- a/alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/TestEnvironmentsDiameter.kt +++ b/alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/TestEnvironmentsDiameter.kt @@ -10,128 +10,107 @@ package it.unibo.alchemist.util import it.unibo.alchemist.model.Environment -import it.unibo.alchemist.model.environments.Continuous2DEnvironment -import it.unibo.alchemist.model.linkingrules.ConnectWithinDistance -import it.unibo.alchemist.model.nodes.GenericNode -import it.unibo.alchemist.model.positions.Euclidean2DPosition -import it.unibo.alchemist.model.protelis.ProtelisIncarnation -import it.unibo.alchemist.util.Environments.allSubNetworksByNodeWithHopDistance -import it.unibo.alchemist.util.Environments.allSubNetworksWithHopDistance +import it.unibo.alchemist.util.Environments.allSubNetworksByNode import it.unibo.alchemist.util.Environments.isNetworkSegmented -import it.unibo.alchemist.util.Environments.networkDiameter -import it.unibo.alchemist.util.Environments.networkDiameterByHopDistance import org.junit.jupiter.api.Test +import java.math.BigDecimal +import java.math.RoundingMode import kotlin.test.assertEquals import kotlin.test.assertFalse -import kotlin.test.assertTrue object TestEnvironmentsDiameter { - val ORIGIN = 0.0 to 0.0 - - private infix fun Environment.addNodeAt(coordinates: Pair) = addNode( - GenericNode(ProtelisIncarnation(), this), - Euclidean2DPosition(coordinates.first, coordinates.second), - ) - - private fun environmentWithNodesAt(vararg positions: Pair) = - Continuous2DEnvironment(ProtelisIncarnation()).apply { - linkingRule = ConnectWithinDistance(5.0) - positions.forEach { addNodeAt(it) } - } + private infix fun Environment.mustHave(expected: Subnetworks) = + assertEquals(expected.count, allSubNetworksByNode().size) - private infix fun Environment.mustNotBeSegmentedAndHaveHopDiameter(expected: Double) { + private infix fun Environment.mustNotBeSegmentedAndHaveDiameter(expected: Double) { assertFalse(isNetworkSegmented()) - assertEquals(expected, allSubNetworksWithHopDistance().single().diameter) + assertEquals( + expected, + allSubNetworksByNode().values.single().diameter.roundToTwoDecimals(), + ) } - private fun Environment.mustBeSegmented() { - assertTrue(isNetworkSegmented()) - assertTrue(networkDiameter().isNaN()) - assertTrue(networkDiameterByHopDistance().isNaN()) + private fun Environment.specificNodeInASegmentedNetworkShouldHaveDiameter(index: Int, expected: Double) { + require(index < nodes.size) + val diameter = allSubNetworksByNode()[nodes[index]]?.diameter + if (diameter != null) { + assertEquals( + expected, + diameter.roundToTwoDecimals(), + ) + } } - private infix fun Environment.mustHave(expected: Subnetworks) = - assertEquals(expected.count, allSubNetworksWithHopDistance().size) - - fun Int.subnetworks(): Subnetworks = Subnetworks(this) - - @JvmInline - value class Subnetworks(val count: Int) - - private fun Environment.specificNodeInASegmentedNetworkShouldHaveDiameter(index: Int, expected: Double) = - { - require(index < nodes.size) - assertEquals(expected, allSubNetworksByNodeWithHopDistance()[nodes[index]]?.diameter!!) - } + private fun Double.roundToTwoDecimals(): Double = BigDecimal(this).setScale(2, RoundingMode.HALF_UP).toDouble() @Test fun `environments with a single node have diameter 0`() = - environmentWithNodesAt(ORIGIN) mustNotBeSegmentedAndHaveHopDiameter 0.0 + singleNodeEnvironment() mustNotBeSegmentedAndHaveDiameter 0.0 @Test - fun `two connected nodes should have hop diameter 1`() = - environmentWithNodesAt(ORIGIN, 3.0 to 0.0) mustNotBeSegmentedAndHaveHopDiameter 1.0 + fun `two connected nodes should have diameter 3`() = twoConnectedNodes mustNotBeSegmentedAndHaveDiameter 3.0 @Test - fun `a triangle has hop diameter 1`() = - environmentWithNodesAt(ORIGIN, 3.0 to 0.0, 0.0 to 3.0) mustNotBeSegmentedAndHaveHopDiameter 1.0 + fun `a triangle formation network is not segmented`() = nodesInATriangle mustNotBeSegmentedAndHaveDiameter 4.24 @Test - fun `three nodes in a row have hop diameter 2`() = - environmentWithNodesAt(ORIGIN, 4.0 to 0.0, 8.0 to 0.0) mustNotBeSegmentedAndHaveHopDiameter 2.0 + fun `three nodes in a row have diameter 8`() = threeNodesInARow mustNotBeSegmentedAndHaveDiameter 8.0 @Test - fun `four nodes connected in a square should have hop diameter 2`() = - environmentWithNodesAt(ORIGIN, 5.0 to 0.0, 0.0 to 5.0, 5.0 to 5.0) mustNotBeSegmentedAndHaveHopDiameter 2.0 + fun `four nodes connected in a square should have diameter 10`() = + fourNodesInASquare mustNotBeSegmentedAndHaveDiameter 10.0 @Test - fun `four nodes in a triangle should have hop diameter 2`() = - environmentWithNodesAt(ORIGIN, 3.0 to 0.0, 6.0 to 0.0, 3.0 to 2.0) mustNotBeSegmentedAndHaveHopDiameter 2.0 + fun `four nodes in a triangle should have diameter 6`() = fourNodesInATriangle mustNotBeSegmentedAndHaveDiameter 6.0 @Test fun `a network of three nodes with one isolated should be considered segmented`() { - val environment = environmentWithNodesAt(ORIGIN, 3.0 to 0.0, 10.0 to 0.0) - environment.mustBeSegmented() - environment mustHave 2.subnetworks() - environment.specificNodeInASegmentedNetworkShouldHaveDiameter(0, 1.0) - environment.specificNodeInASegmentedNetworkShouldHaveDiameter(2, 0.0) + with(twoConnectedNodesAndOneIsolated) { + mustBeSegmented() + mustHave(2.subnetworks()) + specificNodeInASegmentedNetworkShouldHaveDiameter(0, 3.0) + specificNodeInASegmentedNetworkShouldHaveDiameter(2, 0.0) + } } @Test fun `a network of four nodes connected by two should be considered segmented with the same diameter`() { - val environment = environmentWithNodesAt(ORIGIN, 3.0 to 0.0, 10.0 to 0.0, 10.0 to 3.0) - environment.mustBeSegmented() - environment mustHave 2.subnetworks() - environment.specificNodeInASegmentedNetworkShouldHaveDiameter(0, 1.0) - environment.specificNodeInASegmentedNetworkShouldHaveDiameter(2, 1.0) + with(twoSubnetworksWithTwoNodesEach) { + mustBeSegmented() + mustHave(2.subnetworks()) + specificNodeInASegmentedNetworkShouldHaveDiameter(0, 3.0) + specificNodeInASegmentedNetworkShouldHaveDiameter(2, 3.0) + } } @Test - fun `a network of three nodes added dynamically and not in order should adapt accordingly`() { - val environment = environmentWithNodesAt(ORIGIN) - environment mustNotBeSegmentedAndHaveHopDiameter 0.0 - environment addNodeAt (1.0 to 4.0) - environment mustNotBeSegmentedAndHaveHopDiameter 1.0 - environment addNodeAt (4.0 to -2.0) - environment mustNotBeSegmentedAndHaveHopDiameter 2.0 - } + fun `a network of three nodes added dynamically and not in order should adapt accordingly`() = + with(singleNodeEnvironment()) { + mustNotBeSegmentedAndHaveDiameter(expected = 0.0) + addNodeAt(1.0 to 4.0) + mustNotBeSegmentedAndHaveDiameter(expected = 4.12) + addNodeAt(-4.0 to -2.0) + mustNotBeSegmentedAndHaveDiameter(expected = 8.60) + } @Test fun `two sparse subnetworks should be considered segmented`() { - val environment = - environmentWithNodesAt( - ORIGIN, - 12.0 to 12.0, - 0.0 to 6.0, - 12.0 to 14.0, - -3.0 to 3.0, - 9.0 to 15.0, - 3.0 to 3.0, - 15.0 to 15.0, - ) - environment.mustBeSegmented() - environment mustHave 2.subnetworks() - environment.specificNodeInASegmentedNetworkShouldHaveDiameter(0, 2.0) - environment.specificNodeInASegmentedNetworkShouldHaveDiameter(1, 1.0) + with(twoSparseSubnetworks) { + mustBeSegmented() + mustHave(2.subnetworks()) + specificNodeInASegmentedNetworkShouldHaveDiameter(0, 8.49) + specificNodeInASegmentedNetworkShouldHaveDiameter(1, 6.32) + } + } + + @Test + fun `three sparse subnetworks should be considered segmented`() { + with(threeSparseSubnetworks) { + mustBeSegmented() + mustHave(3.subnetworks()) + specificNodeInASegmentedNetworkShouldHaveDiameter(0, 8.49) + specificNodeInASegmentedNetworkShouldHaveDiameter(1, 6.32) + specificNodeInASegmentedNetworkShouldHaveDiameter(nodeCount - 1, 0.0) + } } } diff --git a/alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/TestEnvironmentsDiameterWithHopDistance.kt b/alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/TestEnvironmentsDiameterWithHopDistance.kt new file mode 100644 index 0000000000..401e638f6e --- /dev/null +++ b/alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/TestEnvironmentsDiameterWithHopDistance.kt @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2010-2025, Danilo Pianini and contributors + * listed, for each module, in the respective subproject's build.gradle.kts file. + * + * This file is part of Alchemist, and is distributed under the terms of the + * GNU General Public License, with a linking exception, + * as described in the file LICENSE in the Alchemist distribution's top directory. + */ + +package it.unibo.alchemist.util + +import it.unibo.alchemist.model.Environment +import it.unibo.alchemist.util.Environments.allSubNetworksByNodeWithHopDistance +import it.unibo.alchemist.util.Environments.allSubNetworksWithHopDistance +import it.unibo.alchemist.util.Environments.isNetworkSegmented +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse + +object TestEnvironmentsDiameterWithHopDistance { + private infix fun Environment.withHopDistanceMustHave(expected: Subnetworks) = + assertEquals(expected.count, allSubNetworksWithHopDistance().size) + + private fun Environment.specificNodeInASegmentedNetworkShouldHaveHopDiameter( + index: Int, + expected: Double, + ) = { + require(index < nodes.size) + assertEquals(expected, allSubNetworksByNodeWithHopDistance()[nodes[index]]?.diameter!!) + } + + private infix fun Environment.mustNotBeSegmentedAndHaveHopDiameter(expected: Double) { + assertFalse(isNetworkSegmented()) + assertEquals(expected, allSubNetworksWithHopDistance().single().diameter) + } + + @Test + fun `environment with a single node have diameter 0`() = + singleNodeEnvironment() mustNotBeSegmentedAndHaveHopDiameter 0.0 + + @Test + fun `two connected nodes should have hop diameter 1`() = twoConnectedNodes mustNotBeSegmentedAndHaveHopDiameter 1.0 + + @Test + fun `a triangle has hop diameter 1`() = nodesInATriangle mustNotBeSegmentedAndHaveHopDiameter 1.0 + + @Test + fun `three nodes in a row have hop diameter 2`() = threeNodesInARow mustNotBeSegmentedAndHaveHopDiameter 2.0 + + @Test + fun `four nodes connected in a square should have hop diameter 2`() = + fourNodesInASquare mustNotBeSegmentedAndHaveHopDiameter 2.0 + + @Test + fun `four nodes in a triangle should have hop diameter 2`() = + fourNodesInATriangle mustNotBeSegmentedAndHaveHopDiameter 2.0 + + @Test + fun `a network of three nodes with one isolated should be considered segmented`() { + with(twoConnectedNodesAndOneIsolated) { + mustBeSegmented() + withHopDistanceMustHave(2.subnetworks()) + specificNodeInASegmentedNetworkShouldHaveHopDiameter(0, 1.0) + specificNodeInASegmentedNetworkShouldHaveHopDiameter(2, 0.0) + } + } + + @Test + fun `a network of four nodes connected by two should be considered segmented with the same diameter`() { + with(twoSubnetworksWithTwoNodesEach) { + mustBeSegmented() + withHopDistanceMustHave(2.subnetworks()) + specificNodeInASegmentedNetworkShouldHaveHopDiameter(0, 1.0) + specificNodeInASegmentedNetworkShouldHaveHopDiameter(2, 1.0) + } + } + + @Test + fun `a network of three nodes added dynamically and not in order should adapt accordingly`() { + with(singleNodeEnvironment()) { + mustNotBeSegmentedAndHaveHopDiameter(expected = 0.0) + addNodeAt(1.0 to 4.0) + mustNotBeSegmentedAndHaveHopDiameter(expected = 1.0) + addNodeAt(4.0 to -2.0) + mustNotBeSegmentedAndHaveHopDiameter(expected = 2.0) + } + } + + @Test + fun `two sparse subnetworks should be considered segmented`() { + with(twoSparseSubnetworks) { + mustBeSegmented() + withHopDistanceMustHave(2.subnetworks()) + specificNodeInASegmentedNetworkShouldHaveHopDiameter(0, 2.0) + specificNodeInASegmentedNetworkShouldHaveHopDiameter(1, 1.0) + } + } + + @Test + fun `three sparse subnetworks should be considered segmented`() { + with(threeSparseSubnetworks) { + mustBeSegmented() + withHopDistanceMustHave(3.subnetworks()) + specificNodeInASegmentedNetworkShouldHaveHopDiameter(0, 2.0) + specificNodeInASegmentedNetworkShouldHaveHopDiameter(1, 1.0) + specificNodeInASegmentedNetworkShouldHaveHopDiameter(nodeCount - 1, 0.0) + } + } +} diff --git a/alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/UndirectedEdgeTest.kt b/alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/UndirectedEdgeTest.kt deleted file mode 100644 index 62bc398b53..0000000000 --- a/alchemist-implementationbase/src/test/kotlin/it/unibo/alchemist/util/UndirectedEdgeTest.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2010-2025, Danilo Pianini and contributors - * listed, for each module, in the respective subproject's build.gradle.kts file. - * - * This file is part of Alchemist, and is distributed under the terms of the - * GNU General Public License, with a linking exception, - * as described in the file LICENSE in the Alchemist distribution's top directory. - */ - -package it.unibo.alchemist.util - -import it.unibo.alchemist.model.environments.Continuous2DEnvironment -import it.unibo.alchemist.model.linkingrules.ConnectWithinDistance -import it.unibo.alchemist.model.nodes.GenericNode -import it.unibo.alchemist.model.protelis.ProtelisIncarnation -import it.unibo.alchemist.util.Environments.UndirectedEdge -import org.junit.jupiter.api.Test -import kotlin.test.assertEquals - -class UndirectedEdgeTest { - @Test - fun `UndirectedEdge should be idependent from the source and destination nodes`() { - Continuous2DEnvironment(ProtelisIncarnation()).apply { - linkingRule = ConnectWithinDistance(5.0) - val node1 = GenericNode(ProtelisIncarnation(), this) - val node2 = GenericNode(ProtelisIncarnation(), this) - assertEquals(UndirectedEdge(node1, node2), UndirectedEdge(node1, node2)) - assertEquals(UndirectedEdge(node1, node2), UndirectedEdge(node2, node1)) - assertEquals(UndirectedEdge(node1, node2).hashCode(), UndirectedEdge(node2, node1).hashCode()) - } - } -} From 17bdc3d2544d28a652dee03bfa5eefa25e20eb65 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 14 Apr 2025 10:56:37 +0000 Subject: [PATCH 11/96] chore(release): 42.0.8 [skip ci] ## [42.0.8](https://github.com/AlchemistSimulator/Alchemist/compare/42.0.7...42.0.8) (2025-04-14) ### Dependency updates * **deps:** update danysk/makepkg docker tag to v1.1.43 ([#4376](https://github.com/AlchemistSimulator/Alchemist/issues/4376)) ([248e497](https://github.com/AlchemistSimulator/Alchemist/commit/248e497a91cfd78fc25bcbb5fdb971bedef5f614)) * **deps:** update dependency com.google.code.gson:gson to v2.13.0 ([#4381](https://github.com/AlchemistSimulator/Alchemist/issues/4381)) ([4d2bd5e](https://github.com/AlchemistSimulator/Alchemist/commit/4d2bd5e94c6acb4b70831692fdcb11bf1adcf429)) * **deps:** update dependency commons-io:commons-io to v2.19.0 ([#4384](https://github.com/AlchemistSimulator/Alchemist/issues/4384)) ([2a65a86](https://github.com/AlchemistSimulator/Alchemist/commit/2a65a86db0abcf1d1fabba0419b5e3357198e304)) * **deps:** update dependency org.danilopianini:gson-extras to v3.2.0 ([#4382](https://github.com/AlchemistSimulator/Alchemist/issues/4382)) ([715bfd2](https://github.com/AlchemistSimulator/Alchemist/commit/715bfd278486de1f4857fdd48f8e8b36d7a5616e)) * **deps:** update graphql to v8.5.0 (minor) ([#4383](https://github.com/AlchemistSimulator/Alchemist/issues/4383)) ([ccd08f6](https://github.com/AlchemistSimulator/Alchemist/commit/ccd08f6a7bd4631e1b350c2705ef34aba7c1d296)) * **deps:** update junit5 monorepo (patch) ([#4379](https://github.com/AlchemistSimulator/Alchemist/issues/4379)) ([6dc1692](https://github.com/AlchemistSimulator/Alchemist/commit/6dc169281e885d3a9d05e30a7d1bab7e9dd3a8f4)) * **deps:** update plugin org.gradle.toolchains.foojay-resolver-convention to v0.10.0 ([#4374](https://github.com/AlchemistSimulator/Alchemist/issues/4374)) ([002062d](https://github.com/AlchemistSimulator/Alchemist/commit/002062de9c2179d0da4379d4997c3e779d6ff3ba)) * **deps:** update react to v2025.4.10-19.1.0 (patch) ([#4385](https://github.com/AlchemistSimulator/Alchemist/issues/4385)) ([3778da0](https://github.com/AlchemistSimulator/Alchemist/commit/3778da07dc4c23595b99b456a928cfdd516deb43)) * **deps:** update react to v2025.4.8-19.1.0 (patch) ([#4373](https://github.com/AlchemistSimulator/Alchemist/issues/4373)) ([ec921cc](https://github.com/AlchemistSimulator/Alchemist/commit/ec921cc867dda19971843102c1124e5ef25ca6d4)) * **deps:** update react to v2025.4.9-19.1.0 (patch) ([#4380](https://github.com/AlchemistSimulator/Alchemist/issues/4380)) ([5153114](https://github.com/AlchemistSimulator/Alchemist/commit/51531140098afc80065a875d65f3eba7ee27c1c9)) ### Performance improvements * improve the network diameter evaluation performance ([#4288](https://github.com/AlchemistSimulator/Alchemist/issues/4288)) ([22e8ce9](https://github.com/AlchemistSimulator/Alchemist/commit/22e8ce9294630d1c330de9bc4754f99af2268eca)) ### Build and continuous integration * **deps:** update actions/setup-node action to v4.4.0 ([#4386](https://github.com/AlchemistSimulator/Alchemist/issues/4386)) ([e32a081](https://github.com/AlchemistSimulator/Alchemist/commit/e32a081fce9566ee520e2b651140400047c556e6)) * **deps:** update danysk/build-check-deploy-gradle-action action to v3.7.16 ([#4372](https://github.com/AlchemistSimulator/Alchemist/issues/4372)) ([03ee584](https://github.com/AlchemistSimulator/Alchemist/commit/03ee5843c372fa057c0ec72910539f86894e853f)) * **deps:** update dependency windows github actions runner to v2025 ([#4368](https://github.com/AlchemistSimulator/Alchemist/issues/4368)) ([83566ee](https://github.com/AlchemistSimulator/Alchemist/commit/83566ee7a4442855d84ca5ba541fa4faf8600472)) ### General maintenance * **build:** update the javadoc.io cache ([a5f745f](https://github.com/AlchemistSimulator/Alchemist/commit/a5f745fa316fe508060536e04f48a8715f3c1df8)) * **build:** update the javadoc.io cache ([0ff68a6](https://github.com/AlchemistSimulator/Alchemist/commit/0ff68a601eee5c9d469872cde3cd28c152416382)) * **build:** update the javadoc.io cache ([a1b1cd2](https://github.com/AlchemistSimulator/Alchemist/commit/a1b1cd242102a2bfa780a0d30a929340d2303e25)) * **build:** update the javadoc.io cache ([48779d7](https://github.com/AlchemistSimulator/Alchemist/commit/48779d7ade4996fd26c2ac80ae27548aec467587)) * **build:** update the javadoc.io cache ([d07195e](https://github.com/AlchemistSimulator/Alchemist/commit/d07195e9fe21777821bc33ca078a7b016beb50cf)) * **build:** update the javadoc.io cache ([8b7527e](https://github.com/AlchemistSimulator/Alchemist/commit/8b7527ee34b10e236ce067ded828a659ad1affc3)) * **build:** update the javadoc.io cache ([37f3ac8](https://github.com/AlchemistSimulator/Alchemist/commit/37f3ac8754643a84bf21379bfb54acbadf6c19a5)) * **build:** update the javadoc.io cache ([5adb682](https://github.com/AlchemistSimulator/Alchemist/commit/5adb682d3a89bb007e5c53a0813e6dd052f31c18)) * **build:** update the javadoc.io cache ([7cb85e6](https://github.com/AlchemistSimulator/Alchemist/commit/7cb85e6916494ca07400ad74f8c5df0cfa4ec875)) --- CHANGELOG.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23b0457ee6..1a250833e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,40 @@ +## [42.0.8](https://github.com/AlchemistSimulator/Alchemist/compare/42.0.7...42.0.8) (2025-04-14) + +### Dependency updates + +* **deps:** update danysk/makepkg docker tag to v1.1.43 ([#4376](https://github.com/AlchemistSimulator/Alchemist/issues/4376)) ([248e497](https://github.com/AlchemistSimulator/Alchemist/commit/248e497a91cfd78fc25bcbb5fdb971bedef5f614)) +* **deps:** update dependency com.google.code.gson:gson to v2.13.0 ([#4381](https://github.com/AlchemistSimulator/Alchemist/issues/4381)) ([4d2bd5e](https://github.com/AlchemistSimulator/Alchemist/commit/4d2bd5e94c6acb4b70831692fdcb11bf1adcf429)) +* **deps:** update dependency commons-io:commons-io to v2.19.0 ([#4384](https://github.com/AlchemistSimulator/Alchemist/issues/4384)) ([2a65a86](https://github.com/AlchemistSimulator/Alchemist/commit/2a65a86db0abcf1d1fabba0419b5e3357198e304)) +* **deps:** update dependency org.danilopianini:gson-extras to v3.2.0 ([#4382](https://github.com/AlchemistSimulator/Alchemist/issues/4382)) ([715bfd2](https://github.com/AlchemistSimulator/Alchemist/commit/715bfd278486de1f4857fdd48f8e8b36d7a5616e)) +* **deps:** update graphql to v8.5.0 (minor) ([#4383](https://github.com/AlchemistSimulator/Alchemist/issues/4383)) ([ccd08f6](https://github.com/AlchemistSimulator/Alchemist/commit/ccd08f6a7bd4631e1b350c2705ef34aba7c1d296)) +* **deps:** update junit5 monorepo (patch) ([#4379](https://github.com/AlchemistSimulator/Alchemist/issues/4379)) ([6dc1692](https://github.com/AlchemistSimulator/Alchemist/commit/6dc169281e885d3a9d05e30a7d1bab7e9dd3a8f4)) +* **deps:** update plugin org.gradle.toolchains.foojay-resolver-convention to v0.10.0 ([#4374](https://github.com/AlchemistSimulator/Alchemist/issues/4374)) ([002062d](https://github.com/AlchemistSimulator/Alchemist/commit/002062de9c2179d0da4379d4997c3e779d6ff3ba)) +* **deps:** update react to v2025.4.10-19.1.0 (patch) ([#4385](https://github.com/AlchemistSimulator/Alchemist/issues/4385)) ([3778da0](https://github.com/AlchemistSimulator/Alchemist/commit/3778da07dc4c23595b99b456a928cfdd516deb43)) +* **deps:** update react to v2025.4.8-19.1.0 (patch) ([#4373](https://github.com/AlchemistSimulator/Alchemist/issues/4373)) ([ec921cc](https://github.com/AlchemistSimulator/Alchemist/commit/ec921cc867dda19971843102c1124e5ef25ca6d4)) +* **deps:** update react to v2025.4.9-19.1.0 (patch) ([#4380](https://github.com/AlchemistSimulator/Alchemist/issues/4380)) ([5153114](https://github.com/AlchemistSimulator/Alchemist/commit/51531140098afc80065a875d65f3eba7ee27c1c9)) + +### Performance improvements + +* improve the network diameter evaluation performance ([#4288](https://github.com/AlchemistSimulator/Alchemist/issues/4288)) ([22e8ce9](https://github.com/AlchemistSimulator/Alchemist/commit/22e8ce9294630d1c330de9bc4754f99af2268eca)) + +### Build and continuous integration + +* **deps:** update actions/setup-node action to v4.4.0 ([#4386](https://github.com/AlchemistSimulator/Alchemist/issues/4386)) ([e32a081](https://github.com/AlchemistSimulator/Alchemist/commit/e32a081fce9566ee520e2b651140400047c556e6)) +* **deps:** update danysk/build-check-deploy-gradle-action action to v3.7.16 ([#4372](https://github.com/AlchemistSimulator/Alchemist/issues/4372)) ([03ee584](https://github.com/AlchemistSimulator/Alchemist/commit/03ee5843c372fa057c0ec72910539f86894e853f)) +* **deps:** update dependency windows github actions runner to v2025 ([#4368](https://github.com/AlchemistSimulator/Alchemist/issues/4368)) ([83566ee](https://github.com/AlchemistSimulator/Alchemist/commit/83566ee7a4442855d84ca5ba541fa4faf8600472)) + +### General maintenance + +* **build:** update the javadoc.io cache ([a5f745f](https://github.com/AlchemistSimulator/Alchemist/commit/a5f745fa316fe508060536e04f48a8715f3c1df8)) +* **build:** update the javadoc.io cache ([0ff68a6](https://github.com/AlchemistSimulator/Alchemist/commit/0ff68a601eee5c9d469872cde3cd28c152416382)) +* **build:** update the javadoc.io cache ([a1b1cd2](https://github.com/AlchemistSimulator/Alchemist/commit/a1b1cd242102a2bfa780a0d30a929340d2303e25)) +* **build:** update the javadoc.io cache ([48779d7](https://github.com/AlchemistSimulator/Alchemist/commit/48779d7ade4996fd26c2ac80ae27548aec467587)) +* **build:** update the javadoc.io cache ([d07195e](https://github.com/AlchemistSimulator/Alchemist/commit/d07195e9fe21777821bc33ca078a7b016beb50cf)) +* **build:** update the javadoc.io cache ([8b7527e](https://github.com/AlchemistSimulator/Alchemist/commit/8b7527ee34b10e236ce067ded828a659ad1affc3)) +* **build:** update the javadoc.io cache ([37f3ac8](https://github.com/AlchemistSimulator/Alchemist/commit/37f3ac8754643a84bf21379bfb54acbadf6c19a5)) +* **build:** update the javadoc.io cache ([5adb682](https://github.com/AlchemistSimulator/Alchemist/commit/5adb682d3a89bb007e5c53a0813e6dd052f31c18)) +* **build:** update the javadoc.io cache ([7cb85e6](https://github.com/AlchemistSimulator/Alchemist/commit/7cb85e6916494ca07400ad74f8c5df0cfa4ec875)) + ## [42.0.7](https://github.com/AlchemistSimulator/Alchemist/compare/42.0.6...42.0.7) (2025-04-09) ### Dependency updates From f207cc6806231d835a8231e6b428fc5bb3327208 Mon Sep 17 00:00:00 2001 From: Danilo Pianini Date: Mon, 14 Apr 2025 17:57:45 +0200 Subject: [PATCH 12/96] ci: do not install winget (preinstalled on windows-2025) (#4387) --- .github/workflows/build-and-deploy.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index ad2592a45a..295bc72dfb 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -503,8 +503,6 @@ jobs: packageID: "Unibo.Alchemist" if: fromJSON(needs.release.outputs.winget-deploy) steps: - - name: Install winget - uses: Cyberboss/install-winget@v1 - name: Install wingetcreate shell: pwsh run: Invoke-WebRequest https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe From 485bab82dab3fd198bb7ed371e2c49ee8cf55557 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 20:16:24 +0000 Subject: [PATCH 13/96] chore(deps): update dependency com.google.guava:guava to v33.4.8-jre (#4388) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a90f0396d5..0a73d2767a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -52,7 +52,7 @@ graphstream-core = { module = "org.graphstream:gs-core", version.ref = "graphstr groovy-jsr223 = "org.codehaus.groovy:groovy-jsr223:3.0.24" gson = "com.google.code.gson:gson:2.13.0" gson-extras = "org.danilopianini:gson-extras:3.2.0" -guava = "com.google.guava:guava:33.4.7-jre" +guava = "com.google.guava:guava:33.4.8-jre" javalib-java7 = "org.danilopianini:javalib-java7:0.6.1" java-quality-assurance-plugin = "org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin:1.108.0" jgit = "org.eclipse.jgit:org.eclipse.jgit:7.2.0.202503040940-r" From 806535afd9bdef03f3e6ff2258065b2b5093f540 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Mon, 14 Apr 2025 20:18:59 +0000 Subject: [PATCH 14/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 1ffd42de9f..1bac8cfc63 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -54,9 +54,8 @@ "first": "https://javadoc.io/doc/com.google.code.gson/gson/2.13.0", "second": "https://javadoc.io/doc/com.google.code.gson/gson/2.13.0/element-list" }, - "com.google.guava/guava/33.4.7-jre": { - "first": "https://javadoc.io/doc/com.google.guava/guava/33.4.7-jre", - "second": "https://javadoc.io/doc/com.google.guava/guava/33.4.7-jre/element-list" + "com.google.guava/guava/33.4.8-jre": { + "first": "https://javadoc.io/doc/com.google.guava/guava/33.4.8-jre" }, "com.graphhopper/graphhopper-core/10.2": { "first": "https://javadoc.io/doc/com.graphhopper/graphhopper-core/10.2", From d0ff1be09c53d96122947ee851acf6dd81e889f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 21:31:24 +0000 Subject: [PATCH 15/96] chore(deps): update plugin gitsemver to v5 (#4390) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0a73d2767a..11080b45c0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -164,7 +164,7 @@ testing-runtimeOnly = [ "junit-engine" ] [plugins] compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } compose-multiplatform = { id = "org.jetbrains.compose", version.ref = "compose-multiplatform" } -gitSemVer = "org.danilopianini.git-sensitive-semantic-versioning-gradle-plugin:4.0.2" +gitSemVer = "org.danilopianini.git-sensitive-semantic-versioning-gradle-plugin:5.1.1" graphql-client = { id = "com.apollographql.apollo3", version.ref = "apollo" } graphql-server = { id = "com.expediagroup.graphql", version.ref = "graphql" } hugo = "io.github.fstaudt.hugo:0.9.0" From 8c4fed19c48b2f6377c26920a22f803cf5f5749a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 15 Apr 2025 00:35:31 +0000 Subject: [PATCH 16/96] chore(deps): update graphql to v8.6.0 (minor) (#4389) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 11080b45c0..e04589d26e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ apollo ="4.0.0-beta.7" arrow = "2.0.1" compose-multiplatform = "1.7.3" dokka = "2.0.0" -graphql = "8.5.0" +graphql = "8.6.0" graphhopper = "10.2" graphstream = "2.0" junit = "5.12.2" From 8fb34e5a1385ed75076f121e9a0a1e262e3ea9c9 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Tue, 15 Apr 2025 00:37:53 +0000 Subject: [PATCH 17/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 1bac8cfc63..01a7ec3977 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -9,26 +9,26 @@ "com.apollographql.apollo3/apollo-runtime/4.0.0-beta.7": { "first": "https://javadoc.io/doc/com.apollographql.apollo3/apollo-runtime/4.0.0-beta.7" }, - "com.expediagroup/graphql-kotlin-client-generator/8.5.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-client-generator/8.5.0" + "com.expediagroup/graphql-kotlin-client-generator/8.6.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-client-generator/8.6.0" }, - "com.expediagroup/graphql-kotlin-client/8.5.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-client/8.5.0" + "com.expediagroup/graphql-kotlin-client/8.6.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-client/8.6.0" }, - "com.expediagroup/graphql-kotlin-graalvm-metadata-generator/8.5.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-graalvm-metadata-generator/8.5.0" + "com.expediagroup/graphql-kotlin-graalvm-metadata-generator/8.6.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-graalvm-metadata-generator/8.6.0" }, - "com.expediagroup/graphql-kotlin-hooks-provider/8.5.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-hooks-provider/8.5.0" + "com.expediagroup/graphql-kotlin-hooks-provider/8.6.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-hooks-provider/8.6.0" }, - "com.expediagroup/graphql-kotlin-ktor-server/8.5.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-ktor-server/8.5.0" + "com.expediagroup/graphql-kotlin-ktor-server/8.6.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-ktor-server/8.6.0" }, - "com.expediagroup/graphql-kotlin-sdl-generator/8.5.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-sdl-generator/8.5.0" + "com.expediagroup/graphql-kotlin-sdl-generator/8.6.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-sdl-generator/8.6.0" }, - "com.expediagroup/graphql-kotlin-server/8.5.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-server/8.5.0" + "com.expediagroup/graphql-kotlin-server/8.6.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-server/8.6.0" }, "com.github.ben-manes.caffeine/caffeine/3.2.0": { "first": "https://javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/3.2.0", @@ -55,7 +55,8 @@ "second": "https://javadoc.io/doc/com.google.code.gson/gson/2.13.0/element-list" }, "com.google.guava/guava/33.4.8-jre": { - "first": "https://javadoc.io/doc/com.google.guava/guava/33.4.8-jre" + "first": "https://javadoc.io/doc/com.google.guava/guava/33.4.8-jre", + "second": "https://javadoc.io/doc/com.google.guava/guava/33.4.8-jre/element-list" }, "com.graphhopper/graphhopper-core/10.2": { "first": "https://javadoc.io/doc/com.graphhopper/graphhopper-core/10.2", From 1f9bf95a25a99683e00cad20bf949cece4d36c2e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 15 Apr 2025 03:41:52 +0000 Subject: [PATCH 18/96] ci(deps): update danysk/build-check-deploy-gradle-action action to v3.7.17 (#4392) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build-and-deploy.yml | 8 ++++---- .github/workflows/update-ancillary-files.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 295bc72dfb..97c9ad46f1 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -68,7 +68,7 @@ jobs: steps: - name: Checkout uses: danysk/action-checkout@0.2.22 - - uses: DanySK/build-check-deploy-gradle-action@3.7.16 + - uses: DanySK/build-check-deploy-gradle-action@3.7.17 with: pre-build-command: true build-command: | @@ -92,7 +92,7 @@ jobs: steps: - name: Checkout uses: danysk/action-checkout@0.2.22 - - uses: DanySK/build-check-deploy-gradle-action@3.7.16 + - uses: DanySK/build-check-deploy-gradle-action@3.7.17 with: retries-on-failure: 5 wait-between-retries: 120 @@ -175,7 +175,7 @@ jobs: steps: - name: Checkout with full history uses: danysk/action-checkout@0.2.22 - - uses: DanySK/build-check-deploy-gradle-action@3.7.16 + - uses: DanySK/build-check-deploy-gradle-action@3.7.17 with: signing-key: ${{ secrets.SIGNING_KEY }} signing-password: ${{ secrets.SIGNING_PASSWORD }} @@ -446,7 +446,7 @@ jobs: uses: actions/setup-node@v4.4.0 with: node-version-file: package.json - - uses: DanySK/build-check-deploy-gradle-action@3.7.16 + - uses: DanySK/build-check-deploy-gradle-action@3.7.17 env: STAGING_REPO_ID: ${{ needs.staging-repo.outputs.repo-id }} MAKEPKG_IMAGE: ${{ needs.ci-preparation.outputs.makepkg-image }} diff --git a/.github/workflows/update-ancillary-files.yml b/.github/workflows/update-ancillary-files.yml index 9fcbfff460..962aaae47c 100644 --- a/.github/workflows/update-ancillary-files.yml +++ b/.github/workflows/update-ancillary-files.yml @@ -15,7 +15,7 @@ jobs: uses: danysk/action-checkout@0.2.22 with: token: ${{ secrets.DEPLOYMENT_TOKEN }} - - uses: DanySK/build-check-deploy-gradle-action@3.7.16 + - uses: DanySK/build-check-deploy-gradle-action@3.7.17 with: pre-build-command: rm javadoc-io.json build-command: | From 8ea91920d30cf02a55c804585b751b2f4e775312 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 15 Apr 2025 06:46:24 +0000 Subject: [PATCH 19/96] chore(core-deps): update protelis to v18.0.4 (patch) (#4393) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e04589d26e..4c278805ba 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,7 @@ kotlin = "2.1.20" kotlinx-coroutines = "1.10.2" ktor = "3.1.2" mockito = "5.17.0" -protelis = "18.0.3" +protelis = "18.0.4" react = "2025.4.10-19.1.0" scafi = "1.6.0" scala = "2.13.16" From f3a7e25e0d26c6969ecfa591bf776770ae45a0a9 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Tue, 15 Apr 2025 06:49:06 +0000 Subject: [PATCH 20/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 01a7ec3977..02d7bea13e 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -362,11 +362,11 @@ "first": "https://javadoc.io/doc/org.mongodb/mongodb-driver-sync/5.4.0", "second": "https://javadoc.io/doc/org.mongodb/mongodb-driver-sync/5.4.0/element-list" }, - "org.protelis/protelis-interpreter/18.0.3": { - "first": "https://javadoc.io/doc/org.protelis/protelis-interpreter/18.0.3" + "org.protelis/protelis-interpreter/18.0.4": { + "first": "https://javadoc.io/doc/org.protelis/protelis-interpreter/18.0.4" }, - "org.protelis/protelis-lang/18.0.3": { - "first": "https://javadoc.io/doc/org.protelis/protelis-lang/18.0.3" + "org.protelis/protelis-lang/18.0.4": { + "first": "https://javadoc.io/doc/org.protelis/protelis-lang/18.0.4" }, "org.reduxkotlin/redux-kotlin-threadsafe/0.6.1": { "first": "https://javadoc.io/doc/org.reduxkotlin/redux-kotlin-threadsafe/0.6.1" From f1ca95cb487b31a2f5e02c247cb3d5d3cae77d17 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 15 Apr 2025 09:54:34 +0000 Subject: [PATCH 21/96] chore(deps): update react to v2025.4.11-19.1.0 (patch) (#4394) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4c278805ba..148fde5e46 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ kotlinx-coroutines = "1.10.2" ktor = "3.1.2" mockito = "5.17.0" protelis = "18.0.4" -react = "2025.4.10-19.1.0" +react = "2025.4.11-19.1.0" scafi = "1.6.0" scala = "2.13.16" scalacache = "0.28.0" From 15e44f6ec69939827bd7a6e71d786dbbab044391 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Tue, 15 Apr 2025 09:57:01 +0000 Subject: [PATCH 22/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 02d7bea13e..c6b6311700 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -280,11 +280,11 @@ "org.jetbrains.dokka/templating-plugin/2.0.0": { "first": "https://javadoc.io/doc/org.jetbrains.dokka/templating-plugin/2.0.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.10-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.10-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.11-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.11-19.1.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.10-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.10-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.11-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.11-19.1.0" }, "org.jetbrains.kotlin/kotlin-build-tools-impl/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-build-tools-impl/null" From f4697ef6f8fcf9662b3c810ac5db184236d87b0e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 17 Apr 2025 02:46:50 +0000 Subject: [PATCH 23/96] chore(deps): update plugin multijvmtesting to v3.4.0 (#4396) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 148fde5e46..52a320dd2a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -171,7 +171,7 @@ hugo = "io.github.fstaudt.hugo:0.9.0" kotest-multiplatform = { id = "io.kotest.multiplatform", version.ref = "kotest" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ktor = { id = "io.ktor.plugin", version.ref = "ktor" } -multiJvmTesting = "org.danilopianini.multi-jvm-test-plugin:3.3.0" +multiJvmTesting = "org.danilopianini.multi-jvm-test-plugin:3.4.0" publishOnCentral = "org.danilopianini.publish-on-central:8.0.6" scalafmt = "cz.alenkacz.gradle.scalafmt:1.16.2" shadowJar = "com.github.johnrengelman.shadow:8.1.1" From e123b5c94973dbd19079831c6505516a551bef8d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 17 Apr 2025 05:49:26 +0000 Subject: [PATCH 24/96] chore(deps): update dependency org.danilopianini:jirf to v0.4.32 (#4391) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 52a320dd2a..c2c85026fe 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -57,7 +57,7 @@ javalib-java7 = "org.danilopianini:javalib-java7:0.6.1" java-quality-assurance-plugin = "org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin:1.108.0" jgit = "org.eclipse.jgit:org.eclipse.jgit:7.2.0.202503040940-r" jgrapht-core = "org.jgrapht:jgrapht-core:1.5.2" -jirf = "org.danilopianini:jirf:0.4.31" +jirf = "org.danilopianini:jirf:0.4.32" jool = "org.jooq:jool:0.9.15" jpx = "io.jenetics:jpx:3.2.1" jsr305 = "com.google.code.findbugs:jsr305:3.0.2" From 38e6546b5356187cba60353de0bd3cbcd52bfc18 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Thu, 17 Apr 2025 05:53:41 +0000 Subject: [PATCH 25/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index c6b6311700..6f8d474e55 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -224,8 +224,8 @@ "first": "https://javadoc.io/doc/org.danilopianini/javalib-java7/0.6.1", "second": "https://javadoc.io/doc/org.danilopianini/javalib-java7/0.6.1/package-list" }, - "org.danilopianini/jirf/0.4.31": { - "first": "https://javadoc.io/doc/org.danilopianini/jirf/0.4.31" + "org.danilopianini/jirf/0.4.32": { + "first": "https://javadoc.io/doc/org.danilopianini/jirf/0.4.32" }, "org.danilopianini/kotlin-symmetric-matrix/1.1.2": { "first": "https://javadoc.io/doc/org.danilopianini/kotlin-symmetric-matrix/1.1.2" From 656ff62aa37d5c014dd48a2f18505324fd3f86d9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Apr 2025 05:59:09 +0000 Subject: [PATCH 26/96] chore(deps): update danysk/makepkg docker tag to v1.1.44 (#4398) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- deps-utils/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps-utils/Dockerfile b/deps-utils/Dockerfile index a477ab0387..c270930335 100644 --- a/deps-utils/Dockerfile +++ b/deps-utils/Dockerfile @@ -1 +1 @@ -FROM danysk/makepkg:1.1.43 +FROM danysk/makepkg:1.1.44 From e91db85f82c566b2122f0466ff27bd32931ab083 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Fri, 18 Apr 2025 06:02:57 +0000 Subject: [PATCH 27/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/javadoc-io.json b/javadoc-io.json index 6f8d474e55..a5a77889fc 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -346,7 +346,8 @@ "second": "https://javadoc.io/doc/org.jooq/jool/0.9.15/element-list" }, "org.junit.jupiter/junit-jupiter-api/5.12.2": { - "first": "https://javadoc.io/doc/org.junit.jupiter/junit-jupiter-api/5.12.2" + "first": "https://javadoc.io/doc/org.junit.jupiter/junit-jupiter-api/5.12.2", + "second": "https://javadoc.io/doc/org.junit.jupiter/junit-jupiter-api/5.12.2/package-list" }, "org.junit.jupiter/junit-jupiter-engine/5.12.2": { "first": "https://javadoc.io/doc/org.junit.jupiter/junit-jupiter-engine/5.12.2" From 0271e597be208b0033863b11bc4493dcb22ea2bf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Apr 2025 09:30:33 +0000 Subject: [PATCH 28/96] chore(deps): update react to v2025.4.12-19.1.0 (patch) (#4397) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c2c85026fe..9170b69821 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ kotlinx-coroutines = "1.10.2" ktor = "3.1.2" mockito = "5.17.0" protelis = "18.0.4" -react = "2025.4.11-19.1.0" +react = "2025.4.12-19.1.0" scafi = "1.6.0" scala = "2.13.16" scalacache = "0.28.0" From 60e0ca7b296f46b94fdcc508ce17b0baa323d84d Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Fri, 18 Apr 2025 09:35:03 +0000 Subject: [PATCH 29/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index a5a77889fc..066c7b83ca 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -280,11 +280,11 @@ "org.jetbrains.dokka/templating-plugin/2.0.0": { "first": "https://javadoc.io/doc/org.jetbrains.dokka/templating-plugin/2.0.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.11-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.11-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.12-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.12-19.1.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.11-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.11-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.12-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.12-19.1.0" }, "org.jetbrains.kotlin/kotlin-build-tools-impl/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-build-tools-impl/null" From 5e3fa2cf32b6eb1d5fde6f885557a791680de42a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Apr 2025 22:40:23 +0000 Subject: [PATCH 30/96] chore(deps): update react to v2025.4.13-19.1.0 (patch) (#4399) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9170b69821..eaeccf0b36 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ kotlinx-coroutines = "1.10.2" ktor = "3.1.2" mockito = "5.17.0" protelis = "18.0.4" -react = "2025.4.12-19.1.0" +react = "2025.4.13-19.1.0" scafi = "1.6.0" scala = "2.13.16" scalacache = "0.28.0" From f82795306ef4aa2d445589aa7f8ddd361ac1a38d Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Fri, 18 Apr 2025 22:45:33 +0000 Subject: [PATCH 31/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 066c7b83ca..c958931e4f 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -280,11 +280,11 @@ "org.jetbrains.dokka/templating-plugin/2.0.0": { "first": "https://javadoc.io/doc/org.jetbrains.dokka/templating-plugin/2.0.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.12-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.12-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.13-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.13-19.1.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.12-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.12-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.13-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.13-19.1.0" }, "org.jetbrains.kotlin/kotlin-build-tools-impl/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-build-tools-impl/null" From 15ed35786c45141ed79bb827df83ccab42e37e07 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 19 Apr 2025 16:34:30 +0000 Subject: [PATCH 32/96] chore(deps): update plugin hugo to v0.10.0 (#4400) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index eaeccf0b36..7fdc59de1e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -167,7 +167,7 @@ compose-multiplatform = { id = "org.jetbrains.compose", version.ref = "compose-m gitSemVer = "org.danilopianini.git-sensitive-semantic-versioning-gradle-plugin:5.1.1" graphql-client = { id = "com.apollographql.apollo3", version.ref = "apollo" } graphql-server = { id = "com.expediagroup.graphql", version.ref = "graphql" } -hugo = "io.github.fstaudt.hugo:0.9.0" +hugo = "io.github.fstaudt.hugo:0.10.0" kotest-multiplatform = { id = "io.kotest.multiplatform", version.ref = "kotest" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ktor = { id = "io.ktor.plugin", version.ref = "ktor" } From 8a845de02e6fb03054dce6120897148fdb8b59f6 Mon Sep 17 00:00:00 2001 From: Danilo Pianini Date: Sat, 19 Apr 2025 20:40:24 +0200 Subject: [PATCH 33/96] revert(deps): revert update graphql to v8.6.0 (#4389), as it is leading the build to get stuck This reverts commit 3d2d145f413efdada240d79e6b693058987c9d7e. --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7fdc59de1e..4c7f022cd6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ apollo ="4.0.0-beta.7" arrow = "2.0.1" compose-multiplatform = "1.7.3" dokka = "2.0.0" -graphql = "8.6.0" +graphql = "8.5.0" graphhopper = "10.2" graphstream = "2.0" junit = "5.12.2" From dcc75117dbbc7f7291f4e025c0dd3d73e3908c00 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Sat, 19 Apr 2025 18:47:07 +0000 Subject: [PATCH 34/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index c958931e4f..859e88bac6 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -9,26 +9,26 @@ "com.apollographql.apollo3/apollo-runtime/4.0.0-beta.7": { "first": "https://javadoc.io/doc/com.apollographql.apollo3/apollo-runtime/4.0.0-beta.7" }, - "com.expediagroup/graphql-kotlin-client-generator/8.6.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-client-generator/8.6.0" + "com.expediagroup/graphql-kotlin-client-generator/8.5.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-client-generator/8.5.0" }, - "com.expediagroup/graphql-kotlin-client/8.6.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-client/8.6.0" + "com.expediagroup/graphql-kotlin-client/8.5.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-client/8.5.0" }, - "com.expediagroup/graphql-kotlin-graalvm-metadata-generator/8.6.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-graalvm-metadata-generator/8.6.0" + "com.expediagroup/graphql-kotlin-graalvm-metadata-generator/8.5.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-graalvm-metadata-generator/8.5.0" }, - "com.expediagroup/graphql-kotlin-hooks-provider/8.6.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-hooks-provider/8.6.0" + "com.expediagroup/graphql-kotlin-hooks-provider/8.5.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-hooks-provider/8.5.0" }, - "com.expediagroup/graphql-kotlin-ktor-server/8.6.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-ktor-server/8.6.0" + "com.expediagroup/graphql-kotlin-ktor-server/8.5.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-ktor-server/8.5.0" }, - "com.expediagroup/graphql-kotlin-sdl-generator/8.6.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-sdl-generator/8.6.0" + "com.expediagroup/graphql-kotlin-sdl-generator/8.5.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-sdl-generator/8.5.0" }, - "com.expediagroup/graphql-kotlin-server/8.6.0": { - "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-server/8.6.0" + "com.expediagroup/graphql-kotlin-server/8.5.0": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-server/8.5.0" }, "com.github.ben-manes.caffeine/caffeine/3.2.0": { "first": "https://javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/3.2.0", From ac0544610bea125178ef75ef609d7a917e4aa170 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 19 Apr 2025 20:07:02 +0000 Subject: [PATCH 35/96] chore(deps): update react to v2025.4.14-19.1.0 (patch) (#4402) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4c7f022cd6..536cb839d2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ kotlinx-coroutines = "1.10.2" ktor = "3.1.2" mockito = "5.17.0" protelis = "18.0.4" -react = "2025.4.13-19.1.0" +react = "2025.4.14-19.1.0" scafi = "1.6.0" scala = "2.13.16" scalacache = "0.28.0" From 8fb5f59c1ba9575e9738768b8f49ab0237967206 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Sat, 19 Apr 2025 20:14:40 +0000 Subject: [PATCH 36/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 859e88bac6..33318de32a 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -280,11 +280,11 @@ "org.jetbrains.dokka/templating-plugin/2.0.0": { "first": "https://javadoc.io/doc/org.jetbrains.dokka/templating-plugin/2.0.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.13-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.13-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.14-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.14-19.1.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.13-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.13-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.14-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.14-19.1.0" }, "org.jetbrains.kotlin/kotlin-build-tools-impl/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-build-tools-impl/null" From 42307380df441391b7b406930d5a30ae1cb1d0d2 Mon Sep 17 00:00:00 2001 From: Danilo Pianini Date: Sat, 19 Apr 2025 23:26:10 +0200 Subject: [PATCH 37/96] test(graphql): convert `NodeSurrogateTest` to kotlin.test and set a timeout (#4406) --- .../schema/model/EnvironmentSurrogateTest.kt | 4 +- .../graphql/schema/model/NodeSurrogateTest.kt | 59 ++++++++++--------- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/EnvironmentSurrogateTest.kt b/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/EnvironmentSurrogateTest.kt index 51b92d4669..b0d3521292 100644 --- a/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/EnvironmentSurrogateTest.kt +++ b/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/EnvironmentSurrogateTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2023, Danilo Pianini and contributors + * Copyright (C) 2010-2025, Danilo Pianini and contributors * listed, for each module, in the respective subproject's build.gradle.kts file. * * This file is part of Alchemist, and is distributed under the terms of the @@ -32,7 +32,7 @@ class EnvironmentSurrogateTest : it.nodes.size shouldBe envSurrogate.nodes().size it.nodes.forEach { node -> val nodeSurrogate = envSurrogate.nodeById(node.id) - checkNodeSurrogate(node, nodeSurrogate) + checkNodeSurrogate(node, nodeSurrogate) checkPositionSurrogate(it.getPosition(node), envSurrogate.nodeToPos()[node.id]!!) checkNeighborhood(it.getNeighborhood(node), envSurrogate.getNeighborhood(node.id)) } diff --git a/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/NodeSurrogateTest.kt b/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/NodeSurrogateTest.kt index 56e08ba1ab..6c5305e826 100644 --- a/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/NodeSurrogateTest.kt +++ b/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/NodeSurrogateTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2023, Danilo Pianini and contributors + * Copyright (C) 2010-2025, Danilo Pianini and contributors * listed, for each module, in the respective subproject's build.gradle.kts file. * * This file is part of Alchemist, and is distributed under the terms of the @@ -9,8 +9,6 @@ package it.unibo.alchemist.boundary.graphql.schema.model -import io.kotest.core.spec.style.StringSpec -import io.kotest.matchers.shouldBe import it.unibo.alchemist.boundary.GraphQLTestEnvironments import it.unibo.alchemist.boundary.graphql.schema.model.ConcentrationSurrogateTest.Companion.checkConcentrationContent import it.unibo.alchemist.boundary.graphql.schema.model.surrogates.MoleculeInput @@ -22,44 +20,51 @@ import it.unibo.alchemist.model.Node import it.unibo.alchemist.model.Position import it.unibo.alchemist.model.Reaction import it.unibo.alchemist.model.geometry.Vector +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.Timeout +import java.util.concurrent.TimeUnit +import kotlin.test.assertEquals +import kotlin.test.assertNotNull +import kotlin.test.assertTrue -class NodeSurrogateTest : - StringSpec({ - "NodeSurrogate should map a Node to a GraphQL compliant object" { - GraphQLTestEnvironments.loadTests { - it.nodes.forEach { node -> - checkNodeSurrogate(node, node.toGraphQLNodeSurrogate()) - } +class NodeSurrogateTest where T : Any, P : Position

, P : Vector

{ + + @Test + @Timeout(value = 1, unit = TimeUnit.MINUTES) + fun `NodeSurrogate should map a Node to a GraphQL compliant object`() { + GraphQLTestEnvironments.loadTests { + it.nodes.forEach { node -> + checkNodeSurrogate(node, node.toGraphQLNodeSurrogate()) } } - }) where T : Any, P : Position

, P : Vector

{ - companion object { - fun checkNodeSurrogate(node: Node, nodeSurrogate: NodeSurrogate) { - node.id shouldBe nodeSurrogate.id - node.moleculeCount shouldBe nodeSurrogate.moleculeCount + } - node.reactions.size shouldBe nodeSurrogate.reactions().size + companion object { + fun checkNodeSurrogate(node: Node, nodeSurrogate: NodeSurrogate) { + assertEquals(node.id, nodeSurrogate.id, "Node ID mismatch") + assertEquals(node.moleculeCount, nodeSurrogate.moleculeCount, "Molecule count mismatch") + assertEquals(node.reactions.size, nodeSurrogate.reactions().size, "Reaction count mismatch") node.reactions.forEach { reaction -> checkReactionSurrogate(reaction, reaction.toGraphQLReactionSurrogate()) } - node.contents.forEach { (molecule, concentration) -> - val concentrationSurrogate = requireNotNull(nodeSurrogate.contents()[MoleculeInput(molecule.name)]) - checkConcentrationContent(concentration, concentrationSurrogate) + val surrogate = nodeSurrogate.contents()[MoleculeInput(molecule.name)] + assertNotNull(surrogate, "Surrogate concentration should not be null for molecule ${molecule.name}") + checkConcentrationContent(concentration, surrogate) } - - node.contents.size shouldBe nodeSurrogate.contents().size + assertEquals(node.contents.size, nodeSurrogate.contents().size, "Content map size mismatch") node.contents.forEach { (molecule, concentration) -> val moleculeInput = MoleculeInput(molecule.name) - nodeSurrogate.contains(moleculeInput) shouldBe true - checkConcentrationContent(concentration, nodeSurrogate.getConcentration(moleculeInput)!!) + assertTrue(nodeSurrogate.contains(moleculeInput), "NodeSurrogate should contain $moleculeInput") + val actual = nodeSurrogate.getConcentration(moleculeInput) + assertNotNull(actual, "Concentration should not be null for $moleculeInput") + checkConcentrationContent(concentration, actual) } } - fun checkReactionSurrogate(reaction: Reaction, reactionSurrogate: ReactionSurrogate) { - reaction.inputContext shouldBe reactionSurrogate.inputContext - reaction.outputContext shouldBe reactionSurrogate.outputContext - reaction.node.toGraphQLNodeSurrogate() shouldBe reactionSurrogate.node + assertEquals(reaction.inputContext, reactionSurrogate.inputContext, "Input context mismatch") + assertEquals(reaction.outputContext, reactionSurrogate.outputContext, "Output context mismatch") + assertEquals(reaction.node.toGraphQLNodeSurrogate(), reactionSurrogate.node, "Node mapping mismatch") } } } From 98c117ffc751878f28327cf24b061a5f3d261f59 Mon Sep 17 00:00:00 2001 From: Danilo Pianini Date: Sun, 20 Apr 2025 00:39:36 +0200 Subject: [PATCH 38/96] test(graphql): convert `EnvironmentSurrogateTest` to kotlin.test and set a timeout (#4405) --- .../schema/model/EnvironmentSurrogateTest.kt | 84 +++++++++++-------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/EnvironmentSurrogateTest.kt b/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/EnvironmentSurrogateTest.kt index b0d3521292..581fffd5d3 100644 --- a/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/EnvironmentSurrogateTest.kt +++ b/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/EnvironmentSurrogateTest.kt @@ -9,9 +9,6 @@ package it.unibo.alchemist.boundary.graphql.schema.model -import io.kotest.core.spec.style.StringSpec -import io.kotest.matchers.collections.shouldContainAll -import io.kotest.matchers.shouldBe import it.unibo.alchemist.boundary.GraphQLTestEnvironments import it.unibo.alchemist.boundary.graphql.schema.model.NodeSurrogateTest.Companion.checkNodeSurrogate import it.unibo.alchemist.boundary.graphql.schema.model.surrogates.NeighborhoodSurrogate @@ -21,43 +18,58 @@ import it.unibo.alchemist.model.Neighborhood import it.unibo.alchemist.model.Position import it.unibo.alchemist.model.Time import it.unibo.alchemist.model.geometry.Vector +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.Timeout +import java.util.concurrent.TimeUnit +import kotlin.test.assertEquals +import kotlin.test.assertTrue -class EnvironmentSurrogateTest : - StringSpec({ - "EnvironmentSurrogate should map an Environment to a GraphQL compliant object" { - GraphQLTestEnvironments.loadTests { - requireNotNull(it.simulation) - val envSurrogate = it.toGraphQLEnvironmentSurrogate() - it.dimensions shouldBe envSurrogate.dimensions - it.nodes.size shouldBe envSurrogate.nodes().size - it.nodes.forEach { node -> - val nodeSurrogate = envSurrogate.nodeById(node.id) - checkNodeSurrogate(node, nodeSurrogate) - checkPositionSurrogate(it.getPosition(node), envSurrogate.nodeToPos()[node.id]!!) - checkNeighborhood(it.getNeighborhood(node), envSurrogate.getNeighborhood(node.id)) - } - // Test propagation of changes - val newNode = it.nodes.first().cloneNode(Time.ZERO) - val newPosition = it.makePosition(0.0, 0.0) - it.simulation.schedule { - it.addNode(newNode, newPosition) - } - it.simulation.play() - it.simulation.run() - it.getNodeByID(newNode.id).toGraphQLNodeSurrogate() shouldBe envSurrogate.nodeById(newNode.id) +class EnvironmentSurrogateTest where T : Any, P : Position

, P : Vector

{ + + @Test + @Timeout(value = 1, unit = TimeUnit.MINUTES) + fun `EnvironmentSurrogate should map an Environment to a GraphQL compliant object`() { + GraphQLTestEnvironments.loadTests { envWrapper -> + val simulation = requireNotNull(envWrapper.simulation, { "Simulation must not be null" }) + val envSurrogate = envWrapper.toGraphQLEnvironmentSurrogate() + assertEquals(envWrapper.dimensions, envSurrogate.dimensions) + assertEquals(envWrapper.nodes.size, envSurrogate.nodes().size) + envWrapper.nodes.forEach { node -> + val nodeSurrogate = envSurrogate.nodeById(node.id) + checkNodeSurrogate(node, nodeSurrogate) + checkPositionSurrogate(envWrapper.getPosition(node), envSurrogate.nodeToPos()[node.id]!!) + checkNeighborhood(envWrapper.getNeighborhood(node), envSurrogate.getNeighborhood(node.id)) + } + // Test propagation of changes + val newNode = envWrapper.nodes.first().cloneNode(Time.ZERO) + val newPosition = envWrapper.makePosition(0.0, 0.0) + simulation.schedule { + envWrapper.addNode(newNode, newPosition) } + simulation.play() + simulation.run() + assertEquals( + newNode.toGraphQLNodeSurrogate(), + envSurrogate.nodeById(newNode.id), + "EnvironmentSurrogate should reflect newly added node", + ) } - }) where T : Any, P : Position

, P : Vector

{ - companion object { - private fun checkNeighborhood(n: Neighborhood, ns: NeighborhoodSurrogate) { - n.size() shouldBe ns.size - n.isEmpty shouldBe ns.isEmpty() - n.center.toGraphQLNodeSurrogate() shouldBe ns.getCenter() + } - if (!n.isEmpty) { - val node = n.neighbors.first() - ns.contains(node.toGraphQLNodeSurrogate()) shouldBe true - ns.getNeighbors().shouldContainAll(n.neighbors.map { it.toGraphQLNodeSurrogate() }) + companion object { + fun checkNeighborhood(neighborhood: Neighborhood, neighborhoodSurrogate: NeighborhoodSurrogate) { + assertEquals(neighborhood.size(), neighborhoodSurrogate.size) + assertEquals(neighborhood.isEmpty, neighborhoodSurrogate.isEmpty()) + assertEquals(neighborhood.center.toGraphQLNodeSurrogate(), neighborhoodSurrogate.getCenter()) + if (!neighborhood.isEmpty) { + val node = neighborhood.neighbors.first() + assertTrue( + neighborhoodSurrogate.contains(node.toGraphQLNodeSurrogate()), + "Neighborhood should contain node", + ) + val expected = neighborhood.neighbors.map { it.toGraphQLNodeSurrogate() } + val actual = neighborhoodSurrogate.getNeighbors() + assertTrue(actual.containsAll(expected), "All neighbors should match in the surrogate") } } } From 4246ed5655eda5fe7c526e2aef6099070d02e991 Mon Sep 17 00:00:00 2001 From: Danilo Pianini Date: Sun, 20 Apr 2025 01:49:22 +0200 Subject: [PATCH 39/96] test(graphql): convert `PositionSurrogateTest` to kotlin.test and set a timeout (#4407) --- .../schema/model/PositionSurrogateTest.kt | 79 ++++++++++--------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/PositionSurrogateTest.kt b/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/PositionSurrogateTest.kt index 814b230881..f6a5ecc356 100644 --- a/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/PositionSurrogateTest.kt +++ b/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/PositionSurrogateTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2023, Danilo Pianini and contributors + * Copyright (C) 2010-2025, Danilo Pianini and contributors * listed, for each module, in the respective subproject's build.gradle.kts file. * * This file is part of Alchemist, and is distributed under the terms of the @@ -9,48 +9,49 @@ package it.unibo.alchemist.boundary.graphql.schema.model -import io.kotest.core.spec.style.StringSpec -import io.kotest.matchers.shouldBe import it.unibo.alchemist.boundary.graphql.schema.model.surrogates.GenericPositionSurrogate import it.unibo.alchemist.boundary.graphql.schema.model.surrogates.Position2DSurrogate import it.unibo.alchemist.boundary.graphql.schema.model.surrogates.PositionSurrogate import it.unibo.alchemist.boundary.graphql.schema.util.PositionSurrogateUtils import it.unibo.alchemist.model.Position import it.unibo.alchemist.model.Position2D +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.Timeout +import java.util.concurrent.TimeUnit +import kotlin.test.assertEquals +import kotlin.test.assertTrue -class PositionSurrogateTest : - StringSpec({ - "A two dimensional position should should be mapped to the correct surrogate" { - val position2D = TestPosition(doubleArrayOf(1.0, 2.0)) - val positionSurrogate = PositionSurrogateUtils.toPositionSurrogate(position2D) - if (positionSurrogate is Position2DSurrogate) { - checkPositionSurrogate(position2D, positionSurrogate) - } else { - error("PositionSurrogate is not converted properly!") - } - } +class PositionSurrogateTest { - "A three dimensional position should should be mapped to the correct surrogate" { - val genericPosition = TestPosition(doubleArrayOf(1.0, 2.0, 3.0)) - val positionSurrogate = PositionSurrogateUtils.toPositionSurrogate(genericPosition) - if (positionSurrogate is GenericPositionSurrogate) { - checkPositionSurrogate(genericPosition, positionSurrogate) - } else { - error("PositionSurrogate is not converted properly!") - } - } - - "InputPosition should behave as expected" { - val position = TestPosition(doubleArrayOf(1.0, 2.0, 3.0)) - val inputPosition = PositionSurrogateUtils.toPositionSurrogate(position).toInputPosition() + @Test + @Timeout(value = 1, unit = TimeUnit.MINUTES) + fun `A two dimensional position should be mapped to the correct surrogate`() { + val position2D = TestPosition(doubleArrayOf(1.0, 2.0)) + val positionSurrogate = PositionSurrogateUtils.toPositionSurrogate(position2D) + assertTrue(positionSurrogate is Position2DSurrogate) + checkPositionSurrogate(position2D, positionSurrogate) + } - position.dimensions shouldBe inputPosition.dimensions - position.coordinates shouldBe inputPosition.coordinates + @Test + @Timeout(value = 1, unit = TimeUnit.MINUTES) + fun `A three dimensional position should be mapped to the correct surrogate`() { + val genericPosition = TestPosition(doubleArrayOf(1.0, 2.0, 3.0)) + val positionSurrogate = PositionSurrogateUtils.toPositionSurrogate(genericPosition) + assertTrue(positionSurrogate is GenericPositionSurrogate) + checkPositionSurrogate(genericPosition, positionSurrogate) + } - val positionSurrogate = PositionSurrogateUtils.fromPositionInput(inputPosition) - checkPositionSurrogate(position, positionSurrogate) - } - }) + @Test + @Timeout(value = 1, unit = TimeUnit.MINUTES) + fun `InputPosition should behave as expected`() { + val position = TestPosition(doubleArrayOf(1.0, 2.0, 3.0)) + val inputPosition = PositionSurrogateUtils.toPositionSurrogate(position).toInputPosition() + assertEquals(position.dimensions, inputPosition.dimensions, "Dimensions mismatch") + assertEquals(position.coordinates.toList(), inputPosition.coordinates.toList(), "Coordinates mismatch") + val positionSurrogate = PositionSurrogateUtils.fromPositionInput(inputPosition) + checkPositionSurrogate(position, positionSurrogate) + } +} private class TestPosition( override val coordinates: DoubleArray, @@ -68,11 +69,15 @@ private class TestPosition( } fun

> checkPositionSurrogate(position: P, positionSurrogate: PositionSurrogate) { - position.dimensions shouldBe positionSurrogate.dimensions - position.coordinates shouldBe positionSurrogate.coordinates + assertEquals(position.dimensions, positionSurrogate.dimensions, "Surrogate dimensions mismatch") + assertEquals( + position.coordinates.toList(), + positionSurrogate.coordinates.toList(), + "Surrogate coordinates mismatch", + ) if (position is Position2D<*> && positionSurrogate is Position2DSurrogate) { - position.x shouldBe positionSurrogate.x - position.y shouldBe positionSurrogate.y + assertEquals(position.x, positionSurrogate.x, "X coordinate mismatch in 2D surrogate") + assertEquals(position.y, positionSurrogate.y, "Y coordinate mismatch in 2D surrogate") } } From 80dd86b3c25f84c3eebd675edfbe531b37d0d462 Mon Sep 17 00:00:00 2001 From: Danilo Pianini Date: Sun, 20 Apr 2025 02:57:11 +0200 Subject: [PATCH 40/96] test(graphql): convert `ConcentrationSurrogateTest` to kotlin.test and set a timeout (#4404) --- .../model/ConcentrationSurrogateTest.kt | 65 +++++++++---------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/ConcentrationSurrogateTest.kt b/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/ConcentrationSurrogateTest.kt index 31503d2164..3e477c15df 100644 --- a/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/ConcentrationSurrogateTest.kt +++ b/alchemist-graphql/src/jvmTest/kotlin/it/unibo/alchemist/boundary/graphql/schema/model/ConcentrationSurrogateTest.kt @@ -9,40 +9,42 @@ package it.unibo.alchemist.boundary.graphql.schema.model -import io.kotest.core.spec.style.StringSpec -import io.kotest.matchers.shouldBe import it.unibo.alchemist.boundary.graphql.schema.model.surrogates.toGraphQLConcentrationSurrogate import it.unibo.alchemist.boundary.graphql.schema.util.encodeConcentrationContentToString import it.unibo.alchemist.model.Concentration import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import kotlinx.serialization.serializer +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.Timeout +import java.util.concurrent.TimeUnit +import kotlin.test.assertEquals + +class ConcentrationSurrogateTest { + + @Test + @Timeout(value = 10, unit = TimeUnit.SECONDS) + fun `ConcentrationSurrogate should map a Concentration to a GraphQL compliant object`() { + // Basic concentration content test + val c1: Concentration = Concentration { 1.0 } + checkConcentrationContent(c1.content, c1.toGraphQLConcentrationSurrogate().content) + // Test with a serializable content + val c2: Concentration = Concentration { TestSerializableContent(1, "a") } + checkConcentrationContent(c2.content, c2.toGraphQLConcentrationSurrogate().content) + // Test with a non-serializable content + val c3: Concentration = Concentration { TestNonSerializableContent(1, "a") } + checkConcentrationContent(c3.content, c3.toGraphQLConcentrationSurrogate().content) + } + + @Serializable + private data class TestSerializableContent(val a: Int, val b: String) + + private data class TestNonSerializableContent(val a: Int, val b: String) -class ConcentrationSurrogateTest : - StringSpec({ - "ConcentrationSurrogate should map a Concentration to a GraphQL compliant object" { - // Basic concentration content test - val c1: Concentration = Concentration { 1.0 } - checkConcentrationContent(c1.content, c1.toGraphQLConcentrationSurrogate().content) - // Test with a serializable content - val c2: Concentration = Concentration { TestSerializableContent(1, "a") } - checkConcentrationContent(c2.content, c2.toGraphQLConcentrationSurrogate().content) - // Test with a non-serializable content - val c3: Concentration = Concentration { TestNonSerializableContent(1, "a") } - checkConcentrationContent(c3.content, c3.toGraphQLConcentrationSurrogate().content) - } - }) { companion object { - @Serializable - private data class TestSerializableContent( - val a: Int, - val b: String, - ) - private data class TestNonSerializableContent( - val a: Int, - val b: String, - ) + private fun canSerialize(content: T): Boolean = + runCatching { Json.Default.encodeToString(serializer(content::class.java), content) }.isSuccess fun checkConcentrationContent(c: T, cs: String) { if (canSerialize(c)) { @@ -52,18 +54,15 @@ class ConcentrationSurrogateTest : } } - fun checkGenericContent(c: T, cs: String) { - encodeConcentrationContentToString(c) shouldBe cs + private fun checkGenericContent(c: T, cs: String) { + assertEquals(encodeConcentrationContentToString(c), cs, "Expected generic content encoding to match") } - fun checkJsonContent(c: T, cs: String) { + private fun checkJsonContent(c: T, cs: String) { val jsonContent = Json.Default.encodeToString(serializer(c::class.java), c) - jsonContent shouldBe cs + assertEquals(jsonContent, cs, "Expected JSON content encoding to match") val content = Json.Default.decodeFromString(serializer(c::class.java), cs) - content shouldBe c + assertEquals(content, c, "Expected decoded content to match original") } - - private fun canSerialize(content: T): Boolean = - runCatching { Json.Default.encodeToString(serializer(content::class.java), content) }.isSuccess } } From c28fd26ec2e7a2fa446736637b0763e908c27c8f Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 20 Apr 2025 02:12:05 +0000 Subject: [PATCH 41/96] chore(release): 42.0.9 [skip ci] ## [42.0.9](https://github.com/AlchemistSimulator/Alchemist/compare/42.0.8...42.0.9) (2025-04-20) ### Dependency updates * **core-deps:** update protelis to v18.0.4 (patch) ([#4393](https://github.com/AlchemistSimulator/Alchemist/issues/4393)) ([16afe39](https://github.com/AlchemistSimulator/Alchemist/commit/16afe399b62e6612211ead4cea02f5b989943fb8)) * **deps:** update danysk/makepkg docker tag to v1.1.44 ([#4398](https://github.com/AlchemistSimulator/Alchemist/issues/4398)) ([bbf432b](https://github.com/AlchemistSimulator/Alchemist/commit/bbf432bb223a9491bbb3756457b9cb6e8d443cc2)) * **deps:** update dependency com.google.guava:guava to v33.4.8-jre ([#4388](https://github.com/AlchemistSimulator/Alchemist/issues/4388)) ([5253393](https://github.com/AlchemistSimulator/Alchemist/commit/5253393f7d287ec7b04c45e3b3a5f635f5744fac)) * **deps:** update dependency org.danilopianini:jirf to v0.4.32 ([#4391](https://github.com/AlchemistSimulator/Alchemist/issues/4391)) ([245eb03](https://github.com/AlchemistSimulator/Alchemist/commit/245eb032f364f3ac408d5b209ac10da5b12756b5)) * **deps:** update graphql to v8.6.0 (minor) ([#4389](https://github.com/AlchemistSimulator/Alchemist/issues/4389)) ([3d2d145](https://github.com/AlchemistSimulator/Alchemist/commit/3d2d145f413efdada240d79e6b693058987c9d7e)) * **deps:** update plugin gitsemver to v5 ([#4390](https://github.com/AlchemistSimulator/Alchemist/issues/4390)) ([a6d02b1](https://github.com/AlchemistSimulator/Alchemist/commit/a6d02b1d5760ef11e40c1cfa433058ff89039f9a)) * **deps:** update plugin hugo to v0.10.0 ([#4400](https://github.com/AlchemistSimulator/Alchemist/issues/4400)) ([5cfeebd](https://github.com/AlchemistSimulator/Alchemist/commit/5cfeebd203a08af5cbcc572d40a9127c9a304bfe)) * **deps:** update plugin multijvmtesting to v3.4.0 ([#4396](https://github.com/AlchemistSimulator/Alchemist/issues/4396)) ([bca1d4b](https://github.com/AlchemistSimulator/Alchemist/commit/bca1d4b5b22e8d98e4c1c6e3741f964477937744)) * **deps:** update react to v2025.4.11-19.1.0 (patch) ([#4394](https://github.com/AlchemistSimulator/Alchemist/issues/4394)) ([fcc319b](https://github.com/AlchemistSimulator/Alchemist/commit/fcc319bb974c62edefc057c7563da07afdda17fa)) * **deps:** update react to v2025.4.12-19.1.0 (patch) ([#4397](https://github.com/AlchemistSimulator/Alchemist/issues/4397)) ([74218ff](https://github.com/AlchemistSimulator/Alchemist/commit/74218ffa657d5c26804d0e7f7c1f154929965007)) * **deps:** update react to v2025.4.13-19.1.0 (patch) ([#4399](https://github.com/AlchemistSimulator/Alchemist/issues/4399)) ([15bd8f4](https://github.com/AlchemistSimulator/Alchemist/commit/15bd8f4d209112347e9e43ff58365f96352bb1ee)) * **deps:** update react to v2025.4.14-19.1.0 (patch) ([#4402](https://github.com/AlchemistSimulator/Alchemist/issues/4402)) ([91cfaf5](https://github.com/AlchemistSimulator/Alchemist/commit/91cfaf554a3aab2567c3b3be5984e89d9f99377a)) ### Revert previous changes * **deps:** revert update graphql to v8.6.0 ([#4389](https://github.com/AlchemistSimulator/Alchemist/issues/4389)), as it is leading the build to get stuck ([a19d2d6](https://github.com/AlchemistSimulator/Alchemist/commit/a19d2d6a599b01855ec69cb59bc421f1f9bbe4ad)) ### Tests * **graphql:** convert `ConcentrationSurrogateTest` to kotlin.test and set a timeout ([#4404](https://github.com/AlchemistSimulator/Alchemist/issues/4404)) ([b4454ac](https://github.com/AlchemistSimulator/Alchemist/commit/b4454acd15d905bff0d652745158f95f61e047ae)) * **graphql:** convert `EnvironmentSurrogateTest` to kotlin.test and set a timeout ([#4405](https://github.com/AlchemistSimulator/Alchemist/issues/4405)) ([128b6b5](https://github.com/AlchemistSimulator/Alchemist/commit/128b6b59452a463a10104546166c8c2d59af0a8a)) * **graphql:** convert `NodeSurrogateTest` to kotlin.test and set a timeout ([#4406](https://github.com/AlchemistSimulator/Alchemist/issues/4406)) ([517ddb1](https://github.com/AlchemistSimulator/Alchemist/commit/517ddb1dbef7d076e6e54f0a55ef75674169dac2)) * **graphql:** convert `PositionSurrogateTest` to kotlin.test and set a timeout ([#4407](https://github.com/AlchemistSimulator/Alchemist/issues/4407)) ([1ec4882](https://github.com/AlchemistSimulator/Alchemist/commit/1ec4882f93c16ec97a2a03b4bcaba79cd50885fa)) ### Build and continuous integration * **deps:** update danysk/build-check-deploy-gradle-action action to v3.7.17 ([#4392](https://github.com/AlchemistSimulator/Alchemist/issues/4392)) ([a902d8f](https://github.com/AlchemistSimulator/Alchemist/commit/a902d8facfc3cb2fa54b15fc7122b49b6a6ad86e)) * do not install winget (preinstalled on windows-2025) ([#4387](https://github.com/AlchemistSimulator/Alchemist/issues/4387)) ([fb13d3e](https://github.com/AlchemistSimulator/Alchemist/commit/fb13d3eec6f0364e3649c08c7e292bfa84ed28fc)) ### General maintenance * **build:** update the javadoc.io cache ([e62bcd9](https://github.com/AlchemistSimulator/Alchemist/commit/e62bcd920f07b47a35add1dee5967ba716e9ae93)) * **build:** update the javadoc.io cache ([f2a3d4e](https://github.com/AlchemistSimulator/Alchemist/commit/f2a3d4eb6d059eef089b3ee53ced51f6de2980f5)) * **build:** update the javadoc.io cache ([447c9a7](https://github.com/AlchemistSimulator/Alchemist/commit/447c9a758d833fe2e057bbe59cdcb491ddda9adc)) * **build:** update the javadoc.io cache ([9866c85](https://github.com/AlchemistSimulator/Alchemist/commit/9866c8543f8f074793317114da4f1b8f3e1f49e5)) * **build:** update the javadoc.io cache ([b7131ba](https://github.com/AlchemistSimulator/Alchemist/commit/b7131ba558fb8dd7cc3f384f0cb73de398f4b7b1)) * **build:** update the javadoc.io cache ([b7dd2a1](https://github.com/AlchemistSimulator/Alchemist/commit/b7dd2a1e6b47e4bb6f1ebe5fb5f4f063b6c3ab5e)) * **build:** update the javadoc.io cache ([1049ea4](https://github.com/AlchemistSimulator/Alchemist/commit/1049ea45c2e42f0137744b16d7618a845a965cfd)) * **build:** update the javadoc.io cache ([ace9dcc](https://github.com/AlchemistSimulator/Alchemist/commit/ace9dccb58d0550d6f0243949af4cc04734f31a9)) * **build:** update the javadoc.io cache ([24d2ca7](https://github.com/AlchemistSimulator/Alchemist/commit/24d2ca7151f3c3b2c37cb1001cc46e6a38c99c05)) * **build:** update the javadoc.io cache ([4f32329](https://github.com/AlchemistSimulator/Alchemist/commit/4f323290de0c5e1acbbec16f0a0ce181c297fb52)) --- CHANGELOG.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a250833e1..55c41a77d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,49 @@ +## [42.0.9](https://github.com/AlchemistSimulator/Alchemist/compare/42.0.8...42.0.9) (2025-04-20) + +### Dependency updates + +* **core-deps:** update protelis to v18.0.4 (patch) ([#4393](https://github.com/AlchemistSimulator/Alchemist/issues/4393)) ([16afe39](https://github.com/AlchemistSimulator/Alchemist/commit/16afe399b62e6612211ead4cea02f5b989943fb8)) +* **deps:** update danysk/makepkg docker tag to v1.1.44 ([#4398](https://github.com/AlchemistSimulator/Alchemist/issues/4398)) ([bbf432b](https://github.com/AlchemistSimulator/Alchemist/commit/bbf432bb223a9491bbb3756457b9cb6e8d443cc2)) +* **deps:** update dependency com.google.guava:guava to v33.4.8-jre ([#4388](https://github.com/AlchemistSimulator/Alchemist/issues/4388)) ([5253393](https://github.com/AlchemistSimulator/Alchemist/commit/5253393f7d287ec7b04c45e3b3a5f635f5744fac)) +* **deps:** update dependency org.danilopianini:jirf to v0.4.32 ([#4391](https://github.com/AlchemistSimulator/Alchemist/issues/4391)) ([245eb03](https://github.com/AlchemistSimulator/Alchemist/commit/245eb032f364f3ac408d5b209ac10da5b12756b5)) +* **deps:** update graphql to v8.6.0 (minor) ([#4389](https://github.com/AlchemistSimulator/Alchemist/issues/4389)) ([3d2d145](https://github.com/AlchemistSimulator/Alchemist/commit/3d2d145f413efdada240d79e6b693058987c9d7e)) +* **deps:** update plugin gitsemver to v5 ([#4390](https://github.com/AlchemistSimulator/Alchemist/issues/4390)) ([a6d02b1](https://github.com/AlchemistSimulator/Alchemist/commit/a6d02b1d5760ef11e40c1cfa433058ff89039f9a)) +* **deps:** update plugin hugo to v0.10.0 ([#4400](https://github.com/AlchemistSimulator/Alchemist/issues/4400)) ([5cfeebd](https://github.com/AlchemistSimulator/Alchemist/commit/5cfeebd203a08af5cbcc572d40a9127c9a304bfe)) +* **deps:** update plugin multijvmtesting to v3.4.0 ([#4396](https://github.com/AlchemistSimulator/Alchemist/issues/4396)) ([bca1d4b](https://github.com/AlchemistSimulator/Alchemist/commit/bca1d4b5b22e8d98e4c1c6e3741f964477937744)) +* **deps:** update react to v2025.4.11-19.1.0 (patch) ([#4394](https://github.com/AlchemistSimulator/Alchemist/issues/4394)) ([fcc319b](https://github.com/AlchemistSimulator/Alchemist/commit/fcc319bb974c62edefc057c7563da07afdda17fa)) +* **deps:** update react to v2025.4.12-19.1.0 (patch) ([#4397](https://github.com/AlchemistSimulator/Alchemist/issues/4397)) ([74218ff](https://github.com/AlchemistSimulator/Alchemist/commit/74218ffa657d5c26804d0e7f7c1f154929965007)) +* **deps:** update react to v2025.4.13-19.1.0 (patch) ([#4399](https://github.com/AlchemistSimulator/Alchemist/issues/4399)) ([15bd8f4](https://github.com/AlchemistSimulator/Alchemist/commit/15bd8f4d209112347e9e43ff58365f96352bb1ee)) +* **deps:** update react to v2025.4.14-19.1.0 (patch) ([#4402](https://github.com/AlchemistSimulator/Alchemist/issues/4402)) ([91cfaf5](https://github.com/AlchemistSimulator/Alchemist/commit/91cfaf554a3aab2567c3b3be5984e89d9f99377a)) + +### Revert previous changes + +* **deps:** revert update graphql to v8.6.0 ([#4389](https://github.com/AlchemistSimulator/Alchemist/issues/4389)), as it is leading the build to get stuck ([a19d2d6](https://github.com/AlchemistSimulator/Alchemist/commit/a19d2d6a599b01855ec69cb59bc421f1f9bbe4ad)) + +### Tests + +* **graphql:** convert `ConcentrationSurrogateTest` to kotlin.test and set a timeout ([#4404](https://github.com/AlchemistSimulator/Alchemist/issues/4404)) ([b4454ac](https://github.com/AlchemistSimulator/Alchemist/commit/b4454acd15d905bff0d652745158f95f61e047ae)) +* **graphql:** convert `EnvironmentSurrogateTest` to kotlin.test and set a timeout ([#4405](https://github.com/AlchemistSimulator/Alchemist/issues/4405)) ([128b6b5](https://github.com/AlchemistSimulator/Alchemist/commit/128b6b59452a463a10104546166c8c2d59af0a8a)) +* **graphql:** convert `NodeSurrogateTest` to kotlin.test and set a timeout ([#4406](https://github.com/AlchemistSimulator/Alchemist/issues/4406)) ([517ddb1](https://github.com/AlchemistSimulator/Alchemist/commit/517ddb1dbef7d076e6e54f0a55ef75674169dac2)) +* **graphql:** convert `PositionSurrogateTest` to kotlin.test and set a timeout ([#4407](https://github.com/AlchemistSimulator/Alchemist/issues/4407)) ([1ec4882](https://github.com/AlchemistSimulator/Alchemist/commit/1ec4882f93c16ec97a2a03b4bcaba79cd50885fa)) + +### Build and continuous integration + +* **deps:** update danysk/build-check-deploy-gradle-action action to v3.7.17 ([#4392](https://github.com/AlchemistSimulator/Alchemist/issues/4392)) ([a902d8f](https://github.com/AlchemistSimulator/Alchemist/commit/a902d8facfc3cb2fa54b15fc7122b49b6a6ad86e)) +* do not install winget (preinstalled on windows-2025) ([#4387](https://github.com/AlchemistSimulator/Alchemist/issues/4387)) ([fb13d3e](https://github.com/AlchemistSimulator/Alchemist/commit/fb13d3eec6f0364e3649c08c7e292bfa84ed28fc)) + +### General maintenance + +* **build:** update the javadoc.io cache ([e62bcd9](https://github.com/AlchemistSimulator/Alchemist/commit/e62bcd920f07b47a35add1dee5967ba716e9ae93)) +* **build:** update the javadoc.io cache ([f2a3d4e](https://github.com/AlchemistSimulator/Alchemist/commit/f2a3d4eb6d059eef089b3ee53ced51f6de2980f5)) +* **build:** update the javadoc.io cache ([447c9a7](https://github.com/AlchemistSimulator/Alchemist/commit/447c9a758d833fe2e057bbe59cdcb491ddda9adc)) +* **build:** update the javadoc.io cache ([9866c85](https://github.com/AlchemistSimulator/Alchemist/commit/9866c8543f8f074793317114da4f1b8f3e1f49e5)) +* **build:** update the javadoc.io cache ([b7131ba](https://github.com/AlchemistSimulator/Alchemist/commit/b7131ba558fb8dd7cc3f384f0cb73de398f4b7b1)) +* **build:** update the javadoc.io cache ([b7dd2a1](https://github.com/AlchemistSimulator/Alchemist/commit/b7dd2a1e6b47e4bb6f1ebe5fb5f4f063b6c3ab5e)) +* **build:** update the javadoc.io cache ([1049ea4](https://github.com/AlchemistSimulator/Alchemist/commit/1049ea45c2e42f0137744b16d7618a845a965cfd)) +* **build:** update the javadoc.io cache ([ace9dcc](https://github.com/AlchemistSimulator/Alchemist/commit/ace9dccb58d0550d6f0243949af4cc04734f31a9)) +* **build:** update the javadoc.io cache ([24d2ca7](https://github.com/AlchemistSimulator/Alchemist/commit/24d2ca7151f3c3b2c37cb1001cc46e6a38c99c05)) +* **build:** update the javadoc.io cache ([4f32329](https://github.com/AlchemistSimulator/Alchemist/commit/4f323290de0c5e1acbbec16f0a0ce181c297fb52)) + ## [42.0.8](https://github.com/AlchemistSimulator/Alchemist/compare/42.0.7...42.0.8) (2025-04-14) ### Dependency updates From 9255b7755682f1f6172c2eae0b3474580d0f80d3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 20 Apr 2025 19:49:13 +0000 Subject: [PATCH 42/96] chore(deps): update react to v2025.4.15-19.1.0 (patch) (#4408) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 536cb839d2..78ee3ea440 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ kotlinx-coroutines = "1.10.2" ktor = "3.1.2" mockito = "5.17.0" protelis = "18.0.4" -react = "2025.4.14-19.1.0" +react = "2025.4.15-19.1.0" scafi = "1.6.0" scala = "2.13.16" scalacache = "0.28.0" From cd27bae2e2cc678d4815e00d6af6bf3e37882ea3 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Sun, 20 Apr 2025 19:55:14 +0000 Subject: [PATCH 43/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 33318de32a..8197bf9df7 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -280,11 +280,11 @@ "org.jetbrains.dokka/templating-plugin/2.0.0": { "first": "https://javadoc.io/doc/org.jetbrains.dokka/templating-plugin/2.0.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.14-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.14-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.15-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.15-19.1.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.14-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.14-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.15-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.15-19.1.0" }, "org.jetbrains.kotlin/kotlin-build-tools-impl/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-build-tools-impl/null" @@ -350,7 +350,8 @@ "second": "https://javadoc.io/doc/org.junit.jupiter/junit-jupiter-api/5.12.2/package-list" }, "org.junit.jupiter/junit-jupiter-engine/5.12.2": { - "first": "https://javadoc.io/doc/org.junit.jupiter/junit-jupiter-engine/5.12.2" + "first": "https://javadoc.io/doc/org.junit.jupiter/junit-jupiter-engine/5.12.2", + "second": "https://javadoc.io/doc/org.junit.jupiter/junit-jupiter-engine/5.12.2/package-list" }, "org.mapsforge/mapsforge-map-awt/0.25.0": { "first": "https://javadoc.io/doc/org.mapsforge/mapsforge-map-awt/0.25.0" From 34a3fb1996612ab1e791ab5655185d8936fcd3fa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 11:47:55 +0000 Subject: [PATCH 44/96] chore(deps): update react to v2025.4.16-19.1.0 (patch) (#4409) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 78ee3ea440..c09e9878e0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ kotlinx-coroutines = "1.10.2" ktor = "3.1.2" mockito = "5.17.0" protelis = "18.0.4" -react = "2025.4.15-19.1.0" +react = "2025.4.16-19.1.0" scafi = "1.6.0" scala = "2.13.16" scalacache = "0.28.0" From 5d432f7fd1038480ecd5cea040cbefbdf15e4878 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Mon, 21 Apr 2025 11:52:02 +0000 Subject: [PATCH 45/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 8197bf9df7..be275f6e5f 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -280,11 +280,11 @@ "org.jetbrains.dokka/templating-plugin/2.0.0": { "first": "https://javadoc.io/doc/org.jetbrains.dokka/templating-plugin/2.0.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.15-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.15-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.16-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.16-19.1.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.15-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.15-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.16-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.16-19.1.0" }, "org.jetbrains.kotlin/kotlin-build-tools-impl/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-build-tools-impl/null" From 8c1bf49148f764feb6656362688780c77af29286 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 15:15:13 +0000 Subject: [PATCH 46/96] chore(deps): update dependency io.arrow-kt:arrow-core to v2.1.0 (#4410) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c09e9878e0..927a3d3f66 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ androidx-lifecycle = "2.8.4" antlr4 = "4.13.2" apollo ="4.0.0-beta.7" -arrow = "2.0.1" +arrow = "2.1.0" compose-multiplatform = "1.7.3" dokka = "2.0.0" graphql = "8.5.0" From 2d6775384805276456d5545e08f61a3868b5d30d Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Mon, 21 Apr 2025 15:19:18 +0000 Subject: [PATCH 47/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index be275f6e5f..da7df2b837 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -98,8 +98,8 @@ "guru.nidi.com.kitfox/svgSalamander/1.1.3": { "first": "https://javadoc.io/doc/guru.nidi.com.kitfox/svgSalamander/1.1.3" }, - "io.arrow-kt/arrow-core/2.0.1": { - "first": "https://javadoc.io/doc/io.arrow-kt/arrow-core/2.0.1" + "io.arrow-kt/arrow-core/2.1.0": { + "first": "https://javadoc.io/doc/io.arrow-kt/arrow-core/2.1.0" }, "io.github.classgraph/classgraph/4.8.179": { "first": "https://javadoc.io/doc/io.github.classgraph/classgraph/4.8.179", From 6584781becb0e8e33943d139d9132194fa2088ee Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 22 Apr 2025 21:02:01 +0000 Subject: [PATCH 48/96] chore(deps): update dependency org.apache.commons:commons-collections4 to v4.5.0 (#4412) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 927a3d3f66..e375c8c8b1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -27,7 +27,7 @@ antlr4 = { module = "org.antlr:antlr4", version.ref = "antlr4" } antlr4-runtime = { module = "org.antlr:antlr4-runtime", version.ref = "antlr4" } apache-commons-cli = "commons-cli:commons-cli:1.9.0" apache-commons-codec = "commons-codec:commons-codec:1.18.0" -apache-commons-collections4 = "org.apache.commons:commons-collections4:4.4" +apache-commons-collections4 = "org.apache.commons:commons-collections4:4.5.0" apache-commons-io = "commons-io:commons-io:2.19.0" apache-commons-lang3 = "org.apache.commons:commons-lang3:3.17.0" apache-commons-math3 = "org.apache.commons:commons-math3:3.6.1" From bbde9f75725cc728265fe4204e282089d7129f22 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Tue, 22 Apr 2025 21:06:07 +0000 Subject: [PATCH 49/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index da7df2b837..1de128d5df 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -192,9 +192,9 @@ "first": "https://javadoc.io/doc/org.antlr/antlr4/4.13.2", "second": "https://javadoc.io/doc/org.antlr/antlr4/4.13.2/element-list" }, - "org.apache.commons/commons-collections4/4.4": { - "first": "https://javadoc.io/doc/org.apache.commons/commons-collections4/4.4", - "second": "https://javadoc.io/doc/org.apache.commons/commons-collections4/4.4/package-list" + "org.apache.commons/commons-collections4/4.5.0": { + "first": "https://javadoc.io/doc/org.apache.commons/commons-collections4/4.5.0", + "second": "https://javadoc.io/doc/org.apache.commons/commons-collections4/4.5.0/element-list" }, "org.apache.commons/commons-lang3/3.17.0": { "first": "https://javadoc.io/doc/org.apache.commons/commons-lang3/3.17.0", From 4c9d00af9a3bfb25fe9a5005d4e55f8f286f4cf8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 22 Apr 2025 22:19:14 +0000 Subject: [PATCH 50/96] chore(deps): update dependency org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin to v1.109.0 (#4411) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e375c8c8b1..995e7bdbcd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -54,7 +54,7 @@ gson = "com.google.code.gson:gson:2.13.0" gson-extras = "org.danilopianini:gson-extras:3.2.0" guava = "com.google.guava:guava:33.4.8-jre" javalib-java7 = "org.danilopianini:javalib-java7:0.6.1" -java-quality-assurance-plugin = "org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin:1.108.0" +java-quality-assurance-plugin = "org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin:1.109.0" jgit = "org.eclipse.jgit:org.eclipse.jgit:7.2.0.202503040940-r" jgrapht-core = "org.jgrapht:jgrapht-core:1.5.2" jirf = "org.danilopianini:jirf:0.4.32" From f9e54d06b0427dd24fc53848225d730bf996141e Mon Sep 17 00:00:00 2001 From: Gianluca Aguzzi Date: Wed, 23 Apr 2025 16:41:52 +0200 Subject: [PATCH 51/96] feat: add SystemEnvVariable to load environment variable (#4401) Co-authored-by: Danilo Pianini --- .../boundary/variables/SystemEnvVariable.kt | 52 +++++++++++ .../unibo/alchemist/test/TestEnvVariables.kt | 91 +++++++++++++++++++ .../src/test/resources/testEnvVariables.yml | 14 +++ 3 files changed, 157 insertions(+) create mode 100644 alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/variables/SystemEnvVariable.kt create mode 100644 alchemist-loading/src/test/kotlin/it/unibo/alchemist/test/TestEnvVariables.kt create mode 100644 alchemist-loading/src/test/resources/testEnvVariables.yml diff --git a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/variables/SystemEnvVariable.kt b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/variables/SystemEnvVariable.kt new file mode 100644 index 0000000000..30610ecf43 --- /dev/null +++ b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/variables/SystemEnvVariable.kt @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2010-2025, Danilo Pianini and contributors + * listed, for each module, in the respective subproject's build.gradle.kts file. + * + * This file is part of Alchemist, and is distributed under the terms of the + * GNU General Public License, with a linking exception, + * as described in the file LICENSE in the Alchemist distribution's top directory. + */ + +package it.unibo.alchemist.boundary.variables + +import it.unibo.alchemist.boundary.DependentVariable +import java.io.Serializable + +/** + * A variable that retrieves its value from a system environment variable. + * + * @param name the name of the environment variable + * @param defaultValue the default value to return if the environment variable is not set + */ +class SystemEnvVariable @JvmOverloads constructor( + private val name: String, + private val defaultValue: Serializable? = null, +) : DependentVariable { + + override fun getWith(variables: MutableMap?): Serializable = when (val value = loadFromEnv(name)) { + null -> defaultValue ?: error("Environment variable '$name' is not set and no default value is provided.") + else -> converters.mapNotNull { it(value) }.firstOrNull() ?: value + } + + /** + * Expose the function used to load the environment variable. + */ + companion object { + private val converters: Sequence<(String) -> Serializable?> = sequenceOf( + String::toBooleanStrictOrNull, + String::toIntOrNull, + String::toDoubleOrNull, + String::toLongOrNull, + String::toFloatOrNull, + String::toBigIntegerOrNull, + String::toBigDecimalOrNull, + ) + + /** + * Load the value of an environment variable. + * @param name the name of the environment variable + * @return the value of the environment variable, or null if it is not set + */ + fun loadFromEnv(name: String): String? = System.getenv(name) + } +} diff --git a/alchemist-loading/src/test/kotlin/it/unibo/alchemist/test/TestEnvVariables.kt b/alchemist-loading/src/test/kotlin/it/unibo/alchemist/test/TestEnvVariables.kt new file mode 100644 index 0000000000..52ece3bcc7 --- /dev/null +++ b/alchemist-loading/src/test/kotlin/it/unibo/alchemist/test/TestEnvVariables.kt @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2010-2023, Danilo Pianini and contributors + * listed, for each module, in the respective subproject's build.gradle.kts file. + * + * This file is part of Alchemist, and is distributed under the terms of the + * GNU General Public License, with a linking exception, + * as described in the file LICENSE in the Alchemist distribution's top directory. + */ + +package it.unibo.alchemist.test + +import io.kotest.core.spec.style.StringSpec +import io.mockk.every +import io.mockk.mockkObject +import io.mockk.unmockkObject +import it.unibo.alchemist.boundary.LoadAlchemist +import it.unibo.alchemist.boundary.variables.SystemEnvVariable +import it.unibo.alchemist.model.Position +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertNotNull +import org.junit.jupiter.api.assertThrows +import org.kaikikm.threadresloader.ResourceLoader + +class TestEnvVariables> : + StringSpec({ + val resourceFile = "testEnvVariables.yml" + + fun verifyEnvironmentVariable(environment: Map, variableName: String, expectedValue: Any) { + mockkObject(SystemEnvVariable.Companion) + environment.forEach { (key, value) -> + every { SystemEnvVariable.Companion.loadFromEnv(key) } returns value + } + val file = ResourceLoader.getResource(resourceFile) + assertNotNull(file) + val loader = LoadAlchemist.from(file) + assertNotNull(loader.getWith(emptyMap())) + loader.constants[variableName]?.let { constant -> + assertEquals(expectedValue, constant) + } + unmockkObject(SystemEnvVariable.Companion) + } + + "test alchemist should support system env variables" { + verifyEnvironmentVariable( + mapOf("value" to "10", "anyValue" to "foo"), + "envWithDefault", + 10, + ) + } + + "test alchemist should load default value when env is not set" { + verifyEnvironmentVariable( + mapOf("anyValue" to "foo"), + "envWithDefault", + 0, + ) + } + + "test alchemist should load boolean from env" { + verifyEnvironmentVariable( + mapOf("anyValue" to "true"), + "env", + true, + ) + } + + "test alchemist should load double from env" { + verifyEnvironmentVariable( + mapOf("anyValue" to "10.0"), + "env", + 10.0, + ) + } + + "test alchemist should load string from env" { + verifyEnvironmentVariable( + mapOf("anyValue" to "hello"), + "env", + "hello", + ) + } + + "test alchemist should throw an exception when an environment value is not set and has not default" { + val file = ResourceLoader.getResource(resourceFile) + assertNotNull(file) + assertThrows { + val loader = LoadAlchemist.from(file) + loader.getDefault() + } + } + }) diff --git a/alchemist-loading/src/test/resources/testEnvVariables.yml b/alchemist-loading/src/test/resources/testEnvVariables.yml new file mode 100644 index 0000000000..978c39e175 --- /dev/null +++ b/alchemist-loading/src/test/resources/testEnvVariables.yml @@ -0,0 +1,14 @@ +variables: + envWithDefault: + type: SystemEnvVariable + parameters: [value, 0] + + env: + type: SystemEnvVariable + parameters: [anyValue] + + seed: + min: 0 + max: env + default: 0 +incarnation: sapere From 75ac3625541a07b7afae2601d3ea498a2774655c Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 23 Apr 2025 15:35:29 +0000 Subject: [PATCH 52/96] chore(release): 42.1.0 [skip ci] ## [42.1.0](https://github.com/AlchemistSimulator/Alchemist/compare/42.0.9...42.1.0) (2025-04-23) ### Features * add SystemEnvVariable to load environment variable ([#4401](https://github.com/AlchemistSimulator/Alchemist/issues/4401)) ([dd598ae](https://github.com/AlchemistSimulator/Alchemist/commit/dd598aeedd43300858807eae627af10bd24d6049)) ### Dependency updates * **deps:** update dependency io.arrow-kt:arrow-core to v2.1.0 ([#4410](https://github.com/AlchemistSimulator/Alchemist/issues/4410)) ([83e29f1](https://github.com/AlchemistSimulator/Alchemist/commit/83e29f1325e466001241294a3a14a10df4f10b66)) * **deps:** update dependency org.apache.commons:commons-collections4 to v4.5.0 ([#4412](https://github.com/AlchemistSimulator/Alchemist/issues/4412)) ([a5a0329](https://github.com/AlchemistSimulator/Alchemist/commit/a5a0329f66069910888aec3ea090e00f261ef365)) * **deps:** update dependency org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin to v1.109.0 ([#4411](https://github.com/AlchemistSimulator/Alchemist/issues/4411)) ([8bbb5db](https://github.com/AlchemistSimulator/Alchemist/commit/8bbb5dbca4bb01c24cc37b8ac0f27c04f3467a4f)) * **deps:** update react to v2025.4.15-19.1.0 (patch) ([#4408](https://github.com/AlchemistSimulator/Alchemist/issues/4408)) ([c44fef5](https://github.com/AlchemistSimulator/Alchemist/commit/c44fef569f3691262d8a2b75acb6c7074027f46f)) * **deps:** update react to v2025.4.16-19.1.0 (patch) ([#4409](https://github.com/AlchemistSimulator/Alchemist/issues/4409)) ([cd9be15](https://github.com/AlchemistSimulator/Alchemist/commit/cd9be15a947f99476405178236faf55d3e0289cd)) ### General maintenance * **build:** update the javadoc.io cache ([1a62a76](https://github.com/AlchemistSimulator/Alchemist/commit/1a62a76c4bbf2b7e22884ecec332763ae9ab5982)) * **build:** update the javadoc.io cache ([c1464f3](https://github.com/AlchemistSimulator/Alchemist/commit/c1464f35f8b05e33b53ce3675c59a0844a90f3c4)) * **build:** update the javadoc.io cache ([d9901fb](https://github.com/AlchemistSimulator/Alchemist/commit/d9901fb7593fa52fbf57c08f0a5092804d94a530)) * **build:** update the javadoc.io cache ([55ca7e4](https://github.com/AlchemistSimulator/Alchemist/commit/55ca7e4c55dbd2ef2f9ec15f58a6b986de74f93c)) --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55c41a77d0..2018392d85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +## [42.1.0](https://github.com/AlchemistSimulator/Alchemist/compare/42.0.9...42.1.0) (2025-04-23) + +### Features + +* add SystemEnvVariable to load environment variable ([#4401](https://github.com/AlchemistSimulator/Alchemist/issues/4401)) ([dd598ae](https://github.com/AlchemistSimulator/Alchemist/commit/dd598aeedd43300858807eae627af10bd24d6049)) + +### Dependency updates + +* **deps:** update dependency io.arrow-kt:arrow-core to v2.1.0 ([#4410](https://github.com/AlchemistSimulator/Alchemist/issues/4410)) ([83e29f1](https://github.com/AlchemistSimulator/Alchemist/commit/83e29f1325e466001241294a3a14a10df4f10b66)) +* **deps:** update dependency org.apache.commons:commons-collections4 to v4.5.0 ([#4412](https://github.com/AlchemistSimulator/Alchemist/issues/4412)) ([a5a0329](https://github.com/AlchemistSimulator/Alchemist/commit/a5a0329f66069910888aec3ea090e00f261ef365)) +* **deps:** update dependency org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin to v1.109.0 ([#4411](https://github.com/AlchemistSimulator/Alchemist/issues/4411)) ([8bbb5db](https://github.com/AlchemistSimulator/Alchemist/commit/8bbb5dbca4bb01c24cc37b8ac0f27c04f3467a4f)) +* **deps:** update react to v2025.4.15-19.1.0 (patch) ([#4408](https://github.com/AlchemistSimulator/Alchemist/issues/4408)) ([c44fef5](https://github.com/AlchemistSimulator/Alchemist/commit/c44fef569f3691262d8a2b75acb6c7074027f46f)) +* **deps:** update react to v2025.4.16-19.1.0 (patch) ([#4409](https://github.com/AlchemistSimulator/Alchemist/issues/4409)) ([cd9be15](https://github.com/AlchemistSimulator/Alchemist/commit/cd9be15a947f99476405178236faf55d3e0289cd)) + +### General maintenance + +* **build:** update the javadoc.io cache ([1a62a76](https://github.com/AlchemistSimulator/Alchemist/commit/1a62a76c4bbf2b7e22884ecec332763ae9ab5982)) +* **build:** update the javadoc.io cache ([c1464f3](https://github.com/AlchemistSimulator/Alchemist/commit/c1464f35f8b05e33b53ce3675c59a0844a90f3c4)) +* **build:** update the javadoc.io cache ([d9901fb](https://github.com/AlchemistSimulator/Alchemist/commit/d9901fb7593fa52fbf57c08f0a5092804d94a530)) +* **build:** update the javadoc.io cache ([55ca7e4](https://github.com/AlchemistSimulator/Alchemist/commit/55ca7e4c55dbd2ef2f9ec15f58a6b986de74f93c)) + ## [42.0.9](https://github.com/AlchemistSimulator/Alchemist/compare/42.0.8...42.0.9) (2025-04-20) ### Dependency updates From 48698bc404fa776cb9d025c0868f52f8f32b81de Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 24 Apr 2025 03:14:08 +0000 Subject: [PATCH 53/96] chore(deps): update dependency com.google.code.gson:gson to v2.13.1 (#4413) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 995e7bdbcd..57313380fc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -50,7 +50,7 @@ graphql-server-ktor = { module = "com.expediagroup:graphql-kotlin-ktor-server", graphstream-algo = { module = "org.graphstream:gs-algo", version.ref = "graphstream" } graphstream-core = { module = "org.graphstream:gs-core", version.ref = "graphstream" } groovy-jsr223 = "org.codehaus.groovy:groovy-jsr223:3.0.24" -gson = "com.google.code.gson:gson:2.13.0" +gson = "com.google.code.gson:gson:2.13.1" gson-extras = "org.danilopianini:gson-extras:3.2.0" guava = "com.google.guava:guava:33.4.8-jre" javalib-java7 = "org.danilopianini:javalib-java7:0.6.1" From 8307c0538daf8e7b460bccf3ea15a2f0cf3138a3 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Thu, 24 Apr 2025 03:19:36 +0000 Subject: [PATCH 54/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 1de128d5df..d6350382b7 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -50,9 +50,8 @@ "first": "https://javadoc.io/doc/com.google.code.findbugs/jsr305/3.0.2", "second": "https://javadoc.io/doc/com.google.code.findbugs/jsr305/3.0.2/package-list" }, - "com.google.code.gson/gson/2.13.0": { - "first": "https://javadoc.io/doc/com.google.code.gson/gson/2.13.0", - "second": "https://javadoc.io/doc/com.google.code.gson/gson/2.13.0/element-list" + "com.google.code.gson/gson/2.13.1": { + "first": "https://javadoc.io/doc/com.google.code.gson/gson/2.13.1" }, "com.google.guava/guava/33.4.8-jre": { "first": "https://javadoc.io/doc/com.google.guava/guava/33.4.8-jre", From 806abe4f29b75b454020ed6db5f1622fe4d0329e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 24 Apr 2025 10:05:22 +0000 Subject: [PATCH 55/96] chore(deps): update dependency org.danilopianini:gson-extras to v3.3.0 (#4414) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 57313380fc..14c9efc8d7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -51,7 +51,7 @@ graphstream-algo = { module = "org.graphstream:gs-algo", version.ref = "graphstr graphstream-core = { module = "org.graphstream:gs-core", version.ref = "graphstream" } groovy-jsr223 = "org.codehaus.groovy:groovy-jsr223:3.0.24" gson = "com.google.code.gson:gson:2.13.1" -gson-extras = "org.danilopianini:gson-extras:3.2.0" +gson-extras = "org.danilopianini:gson-extras:3.3.0" guava = "com.google.guava:guava:33.4.8-jre" javalib-java7 = "org.danilopianini:javalib-java7:0.6.1" java-quality-assurance-plugin = "org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin:1.109.0" From 2b9c864c1cbf7b8b83a415371befa3daeb39150b Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Thu, 24 Apr 2025 10:09:09 +0000 Subject: [PATCH 56/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index d6350382b7..4f9dc003c6 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -51,7 +51,8 @@ "second": "https://javadoc.io/doc/com.google.code.findbugs/jsr305/3.0.2/package-list" }, "com.google.code.gson/gson/2.13.1": { - "first": "https://javadoc.io/doc/com.google.code.gson/gson/2.13.1" + "first": "https://javadoc.io/doc/com.google.code.gson/gson/2.13.1", + "second": "https://javadoc.io/doc/com.google.code.gson/gson/2.13.1/element-list" }, "com.google.guava/guava/33.4.8-jre": { "first": "https://javadoc.io/doc/com.google.guava/guava/33.4.8-jre", @@ -213,8 +214,8 @@ "org.danilopianini/conrec/0.1.0": { "first": "https://javadoc.io/doc/org.danilopianini/conrec/0.1.0" }, - "org.danilopianini/gson-extras/3.2.0": { - "first": "https://javadoc.io/doc/org.danilopianini/gson-extras/3.2.0" + "org.danilopianini/gson-extras/3.3.0": { + "first": "https://javadoc.io/doc/org.danilopianini/gson-extras/3.3.0" }, "org.danilopianini/java-quadtree/1.0.1": { "first": "https://javadoc.io/doc/org.danilopianini/java-quadtree/1.0.1" From f1041d3313c05c9e6ae6b918af4fb0ab6eb2cb02 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 03:16:47 +0000 Subject: [PATCH 57/96] chore(deps): update node.js to 22.15 (#4416) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8bbd666217..2fe2066950 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "semantic-release-preconfigured-conventional-commits": "1.1.125" }, "engines": { - "node": "22.14", + "node": "22.15", "npm": ">=3.0.0" } }, diff --git a/package.json b/package.json index 66a82b90c3..8dbd18af81 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "semantic-release-preconfigured-conventional-commits": "1.1.125" }, "engines": { - "node": "22.14", + "node": "22.15", "npm": ">=3.0.0" } } From e5107caf670664a5452c7f608cccb0fbf74391dd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 04:28:03 +0000 Subject: [PATCH 58/96] ci(deps): update actions/download-artifact action to v4.3.0 (#4415) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build-and-deploy.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 97c9ad46f1..3779d6cc2f 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -233,7 +233,7 @@ jobs: always() && needs.assemble-and-upload.result == 'success' steps: - name: Download packages - uses: actions/download-artifact@v4.2.1 + uses: actions/download-artifact@v4.3.0 with: name: installer-package-${{ github.sha }}-${{ runner.os }} - name: Install packages @@ -268,7 +268,7 @@ jobs: always() && needs.assemble-and-upload.result == 'success' steps: - name: Download packages - uses: actions/download-artifact@v4.2.1 + uses: actions/download-artifact@v4.3.0 with: name: installer-package-${{ github.sha }}-${{ runner.os }} - name: Work around xdg bug https://bugs.archlinux.org/task/33316 @@ -296,7 +296,7 @@ jobs: image: fedora:43 steps: - name: Download packages - uses: actions/download-artifact@v4.2.1 + uses: actions/download-artifact@v4.3.0 with: name: installer-package-${{ github.sha }}-${{ runner.os }} - name: Install packages @@ -329,7 +329,7 @@ jobs: # Work around https://github.com/actions/checkout/issues/1169 # sudo git config --system --add safe.directory /__w/Alchemist/Alchemist - name: Download the PKGBUILD - uses: actions/download-artifact@v4.2.1 + uses: actions/download-artifact@v4.3.0 with: pattern: pkgbuild-${{ github.sha }} merge-multiple: true @@ -338,7 +338,7 @@ jobs: namcap PKGBUILD 2>&1 namcap PKGBUILD 2>&1 | awk 'END { exit (NR > 0 ? NR : 0) }' - name: Download the RPM - uses: actions/download-artifact@v4.2.1 + uses: actions/download-artifact@v4.3.0 with: pattern: installer-package-${{ github.sha }}-${{ runner.os }} merge-multiple: true @@ -421,23 +421,23 @@ jobs: repository: AlchemistSimulator/alchemistsimulator.github.io token: ${{ secrets.DEPLOYMENT_TOKEN }} - name: Download website artifact - uses: actions/download-artifact@v4.2.1 + uses: actions/download-artifact@v4.3.0 with: name: website-${{ github.sha }} - name: Download packages - uses: actions/download-artifact@v4.2.1 + uses: actions/download-artifact@v4.3.0 with: pattern: installer-package-${{ github.sha }}* path: build/package/ merge-multiple: true - name: Download fatJars - uses: actions/download-artifact@v4.2.1 + uses: actions/download-artifact@v4.3.0 with: name: fat-jars-${{ github.sha }} path: build/shadow/ merge-multiple: true - name: Download the PKGBUILD - uses: actions/download-artifact@v4.2.1 + uses: actions/download-artifact@v4.3.0 with: pattern: pkgbuild-${{ github.sha }} path: pkgbuild/ From 4dfb2d8b98b503637567368c58ffc1796d2499ed Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 15:14:13 +0000 Subject: [PATCH 59/96] chore(deps): update plugin com.gradle.develocity to v4.0.1 (#4418) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 2917a8e68d..3ca1cc5f49 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,7 +7,7 @@ * as described in the file LICENSE in the Alchemist distribution's top directory. */ plugins { - id("com.gradle.develocity") version "4.0" + id("com.gradle.develocity") version "4.0.1" id("org.danilopianini.gradle-pre-commit-git-hooks") version "2.0.22" id("org.gradle.toolchains.foojay-resolver-convention") version "0.10.0" } From f878cdcd02a1f84527533197c217565b63171a51 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 16:45:22 +0000 Subject: [PATCH 60/96] chore(deps): update danysk/makepkg docker tag to v1.1.45 (#4417) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- deps-utils/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps-utils/Dockerfile b/deps-utils/Dockerfile index c270930335..732035f3ab 100644 --- a/deps-utils/Dockerfile +++ b/deps-utils/Dockerfile @@ -1 +1 @@ -FROM danysk/makepkg:1.1.44 +FROM danysk/makepkg:1.1.45 From fc2b46dfcee157683d5965986fa8f1c60544b389 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 18:42:31 +0000 Subject: [PATCH 61/96] chore(deps): update plugin multijvmtesting to v3.4.1 (#4420) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 14c9efc8d7..98cf9daa0c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -171,7 +171,7 @@ hugo = "io.github.fstaudt.hugo:0.10.0" kotest-multiplatform = { id = "io.kotest.multiplatform", version.ref = "kotest" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ktor = { id = "io.ktor.plugin", version.ref = "ktor" } -multiJvmTesting = "org.danilopianini.multi-jvm-test-plugin:3.4.0" +multiJvmTesting = "org.danilopianini.multi-jvm-test-plugin:3.4.1" publishOnCentral = "org.danilopianini.publish-on-central:8.0.6" scalafmt = "cz.alenkacz.gradle.scalafmt:1.16.2" shadowJar = "com.github.johnrengelman.shadow:8.1.1" From ccc73fddb5210e01e5419acf952a06e4ab22b4cc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 20:06:55 +0000 Subject: [PATCH 62/96] chore(deps): update plugin gitsemver to v5.1.2 (#4419) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 98cf9daa0c..0c2855616b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -164,7 +164,7 @@ testing-runtimeOnly = [ "junit-engine" ] [plugins] compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } compose-multiplatform = { id = "org.jetbrains.compose", version.ref = "compose-multiplatform" } -gitSemVer = "org.danilopianini.git-sensitive-semantic-versioning-gradle-plugin:5.1.1" +gitSemVer = "org.danilopianini.git-sensitive-semantic-versioning-gradle-plugin:5.1.2" graphql-client = { id = "com.apollographql.apollo3", version.ref = "apollo" } graphql-server = { id = "com.expediagroup.graphql", version.ref = "graphql" } hugo = "io.github.fstaudt.hugo:0.10.0" From 78c0ca453b7a0e38e96a4d4fe3bc10cce5be6c78 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 21:39:40 +0000 Subject: [PATCH 63/96] chore(deps): update dependency org.danilopianini.gradle-kotlin-qa:org.danilopianini.gradle-kotlin-qa.gradle.plugin to v0.86.1 (#4423) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0c2855616b..a84986330a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -79,7 +79,7 @@ kotlin-multiplatform-plugin = { module = "org.jetbrains.kotlin.multiplatform:org kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } kotlin-test-annotations = { module = "org.jetbrains.kotlin:kotlin-test-annotations-common", version.ref = "kotlin" } kotlin-power-assert-plugin = { module = "org.jetbrains.kotlin.plugin.power-assert:org.jetbrains.kotlin.plugin.power-assert.gradle.plugin", version.ref = "kotlin" } -kotlin-quality-assurance-plugin = "org.danilopianini.gradle-kotlin-qa:org.danilopianini.gradle-kotlin-qa.gradle.plugin:0.85.0" +kotlin-quality-assurance-plugin = "org.danilopianini.gradle-kotlin-qa:org.danilopianini.gradle-kotlin-qa.gradle.plugin:0.86.1" kotlin-react = { module = "org.jetbrains.kotlin-wrappers:kotlin-react", version.ref = "react" } kotlin-react-dom = { module = "org.jetbrains.kotlin-wrappers:kotlin-react-dom", version.ref = "react" } kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } From be322ee3919692832adc08815ceb7fd1fe114f40 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Fri, 25 Apr 2025 21:45:11 +0000 Subject: [PATCH 64/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 4f9dc003c6..36e5e17855 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -181,8 +181,8 @@ "first": "https://javadoc.io/doc/net.sf.trove4j/trove4j/3.0.3", "second": "https://javadoc.io/doc/net.sf.trove4j/trove4j/3.0.3/package-list" }, - "net.sourceforge.pmd/pmd-dist/7.12.0": { - "first": "https://javadoc.io/doc/net.sourceforge.pmd/pmd-dist/7.12.0" + "net.sourceforge.pmd/pmd-dist/7.13.0": { + "first": "https://javadoc.io/doc/net.sourceforge.pmd/pmd-dist/7.13.0" }, "org.antlr/antlr4-runtime/4.13.2": { "first": "https://javadoc.io/doc/org.antlr/antlr4-runtime/4.13.2", From 3704d0243a3c4220e6c05c44b82b92876a6db9a6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 23:00:08 +0000 Subject: [PATCH 65/96] chore(deps): update dependency org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin to v1.110.0 (#4422) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a84986330a..2dfcea1bd5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -54,7 +54,7 @@ gson = "com.google.code.gson:gson:2.13.1" gson-extras = "org.danilopianini:gson-extras:3.3.0" guava = "com.google.guava:guava:33.4.8-jre" javalib-java7 = "org.danilopianini:javalib-java7:0.6.1" -java-quality-assurance-plugin = "org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin:1.109.0" +java-quality-assurance-plugin = "org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin:1.110.0" jgit = "org.eclipse.jgit:org.eclipse.jgit:7.2.0.202503040940-r" jgrapht-core = "org.jgrapht:jgrapht-core:1.5.2" jirf = "org.danilopianini:jirf:0.4.32" From 7f8f66fc7509b84192762c9a13f372b446b97f9f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 23:59:31 +0000 Subject: [PATCH 66/96] chore(deps): update dependency gradle to v8.14 (#4421) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/wrapper/gradle-wrapper.jar | Bin 43705 -> 43764 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 4 ++-- gradlew.bat | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 9bbc975c742b298b441bfb90dbc124400a3751b9..1b33c55baabb587c669f562ae36f953de2481846 100755 GIT binary patch delta 642 zcmdmamFde>rVZJA^}0Q$xegf!xPEW^+5YDM%iT2bEgct9o+jH~+sJas#HZ=szO|** z=Pj=X_vx?W&DSwKck|WWn~hffsvnQ+42*W$b7b0$SCcOoZ`{W{^$^pk;4>8-A*-)$ z?n(Po`1$6Jn_u?t-L+tsPyZ2#X}8T6OS8pAU;kdgd+_Hw4z4TW0p9E!T+=f7-c&O% zFic^X{7^$?^Ho04eona9n#mGMxKhA=~8B%JN`M zMhm5wc-2v)$``sY$!Q`9xiU@DhI73ZxiGEKg>yIPs)NmWwMdF-ngLXpZSqV5ez36n zVkxF2rjrjWR+_xr6e6@_u@s~2uv{9vi*1pj2)BjFD+-%@&pRVP1f{O1glxTOp2-62Ph;v z`N1+vCd)9ea)af*Ol1*JCfnp$%Uu}%OuoN7g2}3C@`L5FlP#(sA=|h@iixuZC?qp^ z=L$=v$ZoI}|87Wh=&h7udff{aieKr*l+zDp?pf)_bbRvUf>kn;HCDMXNlgbbo!QRK I1x7am0No)LiU0rr delta 584 zcmexzm1*ZyrVZJAexH5Moc8h7)w{^+t*dqJ%=yhh23L$9JpFV=_k`zJ-?Q4DI*eSe z+ES)HSrVnWLtJ&)lO%hRkV9zl5qqWRt0e;bb zPPo`)y?HTAyZI&u&X<|2$FDHCf4;!v8}p=?Tm`^F0`u(|1ttf~&t$qP3KUSD>@TJQ zRwJ}Pim6NzEc8KA6)e;S6gs8=7IIL8sQL*MYEuRYO;Uj<%3UbMbV&^&!Zvx+LKmjT z8Zch6rYP7Tw?$Hn(UTJwWiS=$f{lB(C=e*%usDV})0AQIK~sat=ND@+Gg*Pyij!rR z*fa02W|%BsV++>4W{DKDGSIUEHd2$P+8ct!RF+CHDowUuTEZOZ%rJSQv*qOXOSPDN zT|sP-$p*_3ncsWB*qoD7JQcyZ9xan%cJP6Tb4-?AZpr*F6v98hoNaPJm@HV`yya5N z))6pqFXn@}P(3T0nEzM8*c_9KtE9o|_pFd&K35GBXP^9Kg(b6GH-z8S4GDzIl~T+b zdLd#meKKHu$5u))8cu$=GKINkGDPOUD)!0$C(BH(U!}!-e;Q0ok8Sc?V1zRO04>ts AA^-pY diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 36e4933e1d..247cf2a9f5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionSha256Sum=61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index faf93008b7..23d15a9367 100755 --- a/gradlew +++ b/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a21834..db3a6ac207 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell From 5b2d7df315924772111174db1f2764edd8ee6cc4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 26 Apr 2025 00:57:46 +0000 Subject: [PATCH 67/96] chore(deps): update plugin org.danilopianini.gradle-pre-commit-git-hooks to v2.0.23 (#4425) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 3ca1cc5f49..6490420d48 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,7 +8,7 @@ */ plugins { id("com.gradle.develocity") version "4.0.1" - id("org.danilopianini.gradle-pre-commit-git-hooks") version "2.0.22" + id("org.danilopianini.gradle-pre-commit-git-hooks") version "2.0.23" id("org.gradle.toolchains.foojay-resolver-convention") version "0.10.0" } From 065d6abd2b04c72188513d82a5eb83a8ab2885d4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 04:25:36 +0000 Subject: [PATCH 68/96] chore(deps): update dependency org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin to v1.112.0 (#4428) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2dfcea1bd5..55adc07a4b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -54,7 +54,7 @@ gson = "com.google.code.gson:gson:2.13.1" gson-extras = "org.danilopianini:gson-extras:3.3.0" guava = "com.google.guava:guava:33.4.8-jre" javalib-java7 = "org.danilopianini:javalib-java7:0.6.1" -java-quality-assurance-plugin = "org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin:1.110.0" +java-quality-assurance-plugin = "org.danilopianini.gradle-java-qa:org.danilopianini.gradle-java-qa.gradle.plugin:1.112.0" jgit = "org.eclipse.jgit:org.eclipse.jgit:7.2.0.202503040940-r" jgrapht-core = "org.jgrapht:jgrapht-core:1.5.2" jirf = "org.danilopianini:jirf:0.4.32" From 05a82d9ad778eebfc8f94dd0e58a3700faf40703 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 29 Apr 2025 18:41:26 +0000 Subject: [PATCH 69/96] chore(deps): update dependency io.mockk:mockk to v1.14.2 (#4430) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 55adc07a4b..1c98d91859 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -105,7 +105,7 @@ logback = "ch.qos.logback:logback-classic:1.5.18" mapsforge = "org.mapsforge:mapsforge-map-awt:0.25.0" miglayout-swing = "com.miglayout:miglayout-swing:11.4.2" mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" } -mockk = "io.mockk:mockk:1.14.0" +mockk = "io.mockk:mockk:1.14.2" mongodb = "org.mongodb:mongodb-driver-sync:5.4.0" oxygen-icons = "net.anwiba.commons.swing.icons:org.oxygen.oxygen-icons:4.13.0-1.2.50" protelis-interpreter = { module = "org.protelis:protelis-interpreter", version.ref = "protelis" } From 69fc16b494755716284ccaea78147a3c2f5b12a2 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Tue, 29 Apr 2025 18:46:13 +0000 Subject: [PATCH 70/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 36e5e17855..9a77713d48 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -160,8 +160,8 @@ "io.ktor/ktor-server-websockets-jvm/3.1.2": { "first": "https://javadoc.io/doc/io.ktor/ktor-server-websockets-jvm/3.1.2" }, - "io.mockk/mockk/1.14.0": { - "first": "https://javadoc.io/doc/io.mockk/mockk/1.14.0" + "io.mockk/mockk/1.14.2": { + "first": "https://javadoc.io/doc/io.mockk/mockk/1.14.2" }, "it.unimi.dsi/dsiutils/2.7.4": { "first": "https://javadoc.io/doc/it.unimi.dsi/dsiutils/2.7.4", From 923824d48e1f7b053a18419c6d7eec7f54833dab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 29 Apr 2025 19:58:49 +0000 Subject: [PATCH 71/96] chore(deps): update dependency semantic-release-preconfigured-conventional-commits to v1.1.126 (#4427) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2fe2066950..a169cfb884 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,7 @@ "packages": { "": { "devDependencies": { - "semantic-release-preconfigured-conventional-commits": "1.1.125" + "semantic-release-preconfigured-conventional-commits": "1.1.126" }, "engines": { "node": "22.15", @@ -6112,9 +6112,9 @@ } }, "node_modules/semantic-release-preconfigured-conventional-commits": { - "version": "1.1.125", - "resolved": "https://registry.npmjs.org/semantic-release-preconfigured-conventional-commits/-/semantic-release-preconfigured-conventional-commits-1.1.125.tgz", - "integrity": "sha512-a/etm9M+ZckmE+QX8Pb8Z+PTGL3PrggdhqecEhZM2EaXXbsVdIsA2y7iH4/AAae2WZjjKQK46LX3USedW5FSIQ==", + "version": "1.1.126", + "resolved": "https://registry.npmjs.org/semantic-release-preconfigured-conventional-commits/-/semantic-release-preconfigured-conventional-commits-1.1.126.tgz", + "integrity": "sha512-scn6q/4EoDzmfzsckAtg2hKEXM8GTeoZzpEZL9VnxAgWnvOnJVXdmVkwmQPQQQwHyiwStTtAcOV6zykMjEE6Ig==", "dev": true, "license": "MIT", "dependencies": { @@ -6128,7 +6128,7 @@ "conventional-changelog-conventionalcommits": "8.0.0" }, "engines": { - "node": "22.14" + "node": "22.15" }, "peerDependencies": { "semantic-release": "24.2.3" @@ -11367,9 +11367,9 @@ } }, "semantic-release-preconfigured-conventional-commits": { - "version": "1.1.125", - "resolved": "https://registry.npmjs.org/semantic-release-preconfigured-conventional-commits/-/semantic-release-preconfigured-conventional-commits-1.1.125.tgz", - "integrity": "sha512-a/etm9M+ZckmE+QX8Pb8Z+PTGL3PrggdhqecEhZM2EaXXbsVdIsA2y7iH4/AAae2WZjjKQK46LX3USedW5FSIQ==", + "version": "1.1.126", + "resolved": "https://registry.npmjs.org/semantic-release-preconfigured-conventional-commits/-/semantic-release-preconfigured-conventional-commits-1.1.126.tgz", + "integrity": "sha512-scn6q/4EoDzmfzsckAtg2hKEXM8GTeoZzpEZL9VnxAgWnvOnJVXdmVkwmQPQQQwHyiwStTtAcOV6zykMjEE6Ig==", "dev": true, "requires": { "@semantic-release/changelog": "6.0.3", diff --git a/package.json b/package.json index 8dbd18af81..d6ef23160b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "devDependencies": { - "semantic-release-preconfigured-conventional-commits": "1.1.125" + "semantic-release-preconfigured-conventional-commits": "1.1.126" }, "engines": { "node": "22.15", From 98bc10f5a52ba58be9cf5c7b767451e1e76fee4a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:17:43 +0000 Subject: [PATCH 72/96] chore(deps): update dependency io.arrow-kt:arrow-core to v2.1.1 (#4429) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1c98d91859..8365559a61 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ androidx-lifecycle = "2.8.4" antlr4 = "4.13.2" apollo ="4.0.0-beta.7" -arrow = "2.1.0" +arrow = "2.1.1" compose-multiplatform = "1.7.3" dokka = "2.0.0" graphql = "8.5.0" From 0582375f335383b8e7162fae77d39534d66cfec0 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Tue, 29 Apr 2025 21:23:46 +0000 Subject: [PATCH 73/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 9a77713d48..21e02d91bf 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -98,8 +98,8 @@ "guru.nidi.com.kitfox/svgSalamander/1.1.3": { "first": "https://javadoc.io/doc/guru.nidi.com.kitfox/svgSalamander/1.1.3" }, - "io.arrow-kt/arrow-core/2.1.0": { - "first": "https://javadoc.io/doc/io.arrow-kt/arrow-core/2.1.0" + "io.arrow-kt/arrow-core/2.1.1": { + "first": "https://javadoc.io/doc/io.arrow-kt/arrow-core/2.1.1" }, "io.github.classgraph/classgraph/4.8.179": { "first": "https://javadoc.io/doc/io.github.classgraph/classgraph/4.8.179", From 4b4f373fe5b930d919c0552439156d9ba6838dac Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 29 Apr 2025 22:41:26 +0000 Subject: [PATCH 74/96] chore(deps): update react to v2025.4.17-19.1.0 (patch) (#4432) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8365559a61..fe7a48ea87 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ kotlinx-coroutines = "1.10.2" ktor = "3.1.2" mockito = "5.17.0" protelis = "18.0.4" -react = "2025.4.16-19.1.0" +react = "2025.4.17-19.1.0" scafi = "1.6.0" scala = "2.13.16" scalacache = "0.28.0" From 92705e2d4fdc03f06f8fa0a9f221bc45905b6195 Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Tue, 29 Apr 2025 22:45:25 +0000 Subject: [PATCH 75/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 21e02d91bf..43254d7fc6 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -280,11 +280,11 @@ "org.jetbrains.dokka/templating-plugin/2.0.0": { "first": "https://javadoc.io/doc/org.jetbrains.dokka/templating-plugin/2.0.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.16-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.16-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.17-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.17-19.1.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.16-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.16-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.17-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.17-19.1.0" }, "org.jetbrains.kotlin/kotlin-build-tools-impl/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-build-tools-impl/null" From 3671c608a3b6c9d8e5713207b8b1d549e770b302 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 29 Apr 2025 23:59:56 +0000 Subject: [PATCH 76/96] chore(deps): update dependency scalafmt to v3.9.5 (#4431) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .scalafmt.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index 7ef479f7c0..f2948223a9 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -4,7 +4,7 @@ # To edit the original configurations go to # https://github.com/alejandrohdezma/sbt-scalafmt-defaults/edit/master/.scalafmt.conf -version = 3.9.4 +version = 3.9.5 runner.dialect = scala213 maxColumn = 120 align.preset = none From a618e389a3b10c63a21f7d2361d836e33007bb90 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 18:26:55 +0000 Subject: [PATCH 77/96] chore(deps): update react to v2025.4.18-19.1.0 (patch) (#4434) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fe7a48ea87..c00e78b2f4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ kotlinx-coroutines = "1.10.2" ktor = "3.1.2" mockito = "5.17.0" protelis = "18.0.4" -react = "2025.4.17-19.1.0" +react = "2025.4.18-19.1.0" scafi = "1.6.0" scala = "2.13.16" scalacache = "0.28.0" From d9f4fb0406d4d2dc2c3e8cff79161fe81cba623a Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Wed, 30 Apr 2025 18:33:05 +0000 Subject: [PATCH 78/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 43254d7fc6..ada5a8db89 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -280,11 +280,11 @@ "org.jetbrains.dokka/templating-plugin/2.0.0": { "first": "https://javadoc.io/doc/org.jetbrains.dokka/templating-plugin/2.0.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.17-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.17-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.18-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.18-19.1.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.17-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.17-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.18-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.18-19.1.0" }, "org.jetbrains.kotlin/kotlin-build-tools-impl/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-build-tools-impl/null" From 75d91d64bed9a1e7e8660035d26252ad05acca05 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 12:02:03 +0000 Subject: [PATCH 79/96] chore(deps): update react to v2025.5.0-19.1.0 (minor) (#4435) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c00e78b2f4..e9798754f5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ kotlinx-coroutines = "1.10.2" ktor = "3.1.2" mockito = "5.17.0" protelis = "18.0.4" -react = "2025.4.18-19.1.0" +react = "2025.5.0-19.1.0" scafi = "1.6.0" scala = "2.13.16" scalacache = "0.28.0" From 06fee99c673edf0b07d08257788721f8a385c52e Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Thu, 1 May 2025 12:05:47 +0000 Subject: [PATCH 80/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index ada5a8db89..e18b4466ac 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -280,11 +280,11 @@ "org.jetbrains.dokka/templating-plugin/2.0.0": { "first": "https://javadoc.io/doc/org.jetbrains.dokka/templating-plugin/2.0.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.18-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.4.18-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.0-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.0-19.1.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.18-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.4.18-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.0-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.0-19.1.0" }, "org.jetbrains.kotlin/kotlin-build-tools-impl/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-build-tools-impl/null" From 427a0361a5a90479b387d94e9c090cbfd8de65c9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 23:32:16 +0000 Subject: [PATCH 81/96] chore(deps): update react to v2025.5.1-19.1.0 (patch) (#4437) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e9798754f5..ce80c8ba60 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ kotlinx-coroutines = "1.10.2" ktor = "3.1.2" mockito = "5.17.0" protelis = "18.0.4" -react = "2025.5.0-19.1.0" +react = "2025.5.1-19.1.0" scafi = "1.6.0" scala = "2.13.16" scalacache = "0.28.0" From f820666f0c28e969ad85be58741a9001a5208d4e Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Thu, 1 May 2025 23:36:34 +0000 Subject: [PATCH 82/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index e18b4466ac..8d31b5fafa 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -280,11 +280,11 @@ "org.jetbrains.dokka/templating-plugin/2.0.0": { "first": "https://javadoc.io/doc/org.jetbrains.dokka/templating-plugin/2.0.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.0-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.0-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.1-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.1-19.1.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.0-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.0-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.1-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.1-19.1.0" }, "org.jetbrains.kotlin/kotlin-build-tools-impl/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-build-tools-impl/null" From 3a1dfcbd3d220172298c9b9db5cd3af0345b99d9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 2 May 2025 01:15:15 +0000 Subject: [PATCH 83/96] chore(deps): update dependency semantic-release-preconfigured-conventional-commits to v1.1.127 (#4436) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 439 ++++++++++++++++++++++++++++++++++++---------- package.json | 2 +- 2 files changed, 352 insertions(+), 89 deletions(-) diff --git a/package-lock.json b/package-lock.json index a169cfb884..68a4d37e7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,7 @@ "packages": { "": { "devDependencies": { - "semantic-release-preconfigured-conventional-commits": "1.1.126" + "semantic-release-preconfigured-conventional-commits": "1.1.127" }, "engines": { "node": "22.15", @@ -109,17 +109,17 @@ } }, "node_modules/@octokit/core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", - "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", + "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", "dev": true, "license": "MIT", "dependencies": { "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.0.0", - "@octokit/request": "^9.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.0.0", + "@octokit/graphql": "^8.2.2", + "@octokit/request": "^9.2.3", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", "before-after-hook": "^3.0.2", "universal-user-agent": "^7.0.0" }, @@ -127,35 +127,86 @@ "node": ">= 18" } }, + "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/core/node_modules/@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^25.0.0" + } + }, "node_modules/@octokit/endpoint": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", - "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", + "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^13.0.0", + "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.2" }, "engines": { "node": ">= 18" } }, + "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^25.0.0" + } + }, "node_modules/@octokit/graphql": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", - "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", + "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/request": "^9.0.0", - "@octokit/types": "^13.0.0", + "@octokit/request": "^9.2.3", + "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.0" }, "engines": { "node": ">= 18" } }, + "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/graphql/node_modules/@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^25.0.0" + } + }, "node_modules/@octokit/openapi-types": { "version": "22.2.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", @@ -164,13 +215,13 @@ "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.5.tgz", - "integrity": "sha512-cgwIRtKrpwhLoBi0CUNuY83DPGRMaWVjqVI/bGKsLJ4PzyWZNaEmhHroI2xlrVXkk6nFv0IsZpOp+ZWSWUS2AQ==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-12.0.0.tgz", + "integrity": "sha512-MPd6WK1VtZ52lFrgZ0R2FlaoiWllzgqFHaSZxvp72NmoDeZ0m8GeJdg4oB6ctqMTYyrnDYp592Xma21mrgiyDA==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^13.6.0" + "@octokit/types": "^14.0.0" }, "engines": { "node": ">= 18" @@ -179,6 +230,23 @@ "@octokit/core": ">=6" } }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^25.0.0" + } + }, "node_modules/@octokit/plugin-retry": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.1.2.tgz", @@ -198,32 +266,50 @@ } }, "node_modules/@octokit/plugin-throttling": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.3.1.tgz", - "integrity": "sha512-Qd91H4liUBhwLB2h6jZ99bsxoQdhgPk6TdwnClPyTBSDAdviGPceViEgUwj+pcQDmB/rfAXAXK7MTochpHM3yQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-10.0.0.tgz", + "integrity": "sha512-Kuq5/qs0DVYTHZuBAzCZStCzo2nKvVRo/TDNhCcpC2TKiOGz/DisXMCvjt3/b5kr6SCI1Y8eeeJTHBxxpFvZEg==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^13.0.0", + "@octokit/types": "^14.0.0", "bottleneck": "^2.15.3" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "@octokit/core": "^6.0.0" + "@octokit/core": "^6.1.3" + } + }, + "node_modules/@octokit/plugin-throttling/node_modules/@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-throttling/node_modules/@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^25.0.0" } }, "node_modules/@octokit/request": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz", - "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", + "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/endpoint": "^10.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.1.0", + "@octokit/endpoint": "^10.1.4", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^2.0.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -231,18 +317,52 @@ } }, "node_modules/@octokit/request-error": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.5.tgz", - "integrity": "sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", + "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^13.0.0" + "@octokit/types": "^14.0.0" }, "engines": { "node": ">= 18" } }, + "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^25.0.0" + } + }, + "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/request/node_modules/@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^25.0.0" + } + }, "node_modules/@octokit/types": { "version": "13.6.1", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.1.tgz", @@ -580,16 +700,16 @@ } }, "node_modules/@semantic-release/github": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.1.tgz", - "integrity": "sha512-Z9cr0LgU/zgucbT9cksH0/pX9zmVda9hkDPcgIE0uvjMQ8w/mElDivGjx1w1pEQ+MuQJ5CBq3VCF16S6G4VH3A==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.2.tgz", + "integrity": "sha512-EhHimj3/eOSPu0OflgDzwgrawoGJIn8XLOkNS6WzwuTr8ebxyX976Y4mCqJ8MlkdQpV5+8T+49sy8xXlcm6uCg==", "dev": true, "license": "MIT", "dependencies": { "@octokit/core": "^6.0.0", - "@octokit/plugin-paginate-rest": "^11.0.0", + "@octokit/plugin-paginate-rest": "^12.0.0", "@octokit/plugin-retry": "^7.0.0", - "@octokit/plugin-throttling": "^9.0.0", + "@octokit/plugin-throttling": "^10.0.0", "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", "debug": "^4.3.4", @@ -4590,6 +4710,23 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/fast-content-type-parse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", + "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -6112,9 +6249,9 @@ } }, "node_modules/semantic-release-preconfigured-conventional-commits": { - "version": "1.1.126", - "resolved": "https://registry.npmjs.org/semantic-release-preconfigured-conventional-commits/-/semantic-release-preconfigured-conventional-commits-1.1.126.tgz", - "integrity": "sha512-scn6q/4EoDzmfzsckAtg2hKEXM8GTeoZzpEZL9VnxAgWnvOnJVXdmVkwmQPQQQwHyiwStTtAcOV6zykMjEE6Ig==", + "version": "1.1.127", + "resolved": "https://registry.npmjs.org/semantic-release-preconfigured-conventional-commits/-/semantic-release-preconfigured-conventional-commits-1.1.127.tgz", + "integrity": "sha512-lGrxDKngRn0KuZD2OY+wt4yCxso4Vop28I5d4QSizZ7gvcv5TYQhsTtuFIhOcH0Hlv0cw48R/ImF9DDBv85Y8g==", "dev": true, "license": "MIT", "dependencies": { @@ -6122,7 +6259,7 @@ "@semantic-release/commit-analyzer": "13.0.1", "@semantic-release/exec": "7.0.3", "@semantic-release/git": "10.0.1", - "@semantic-release/github": "11.0.1", + "@semantic-release/github": "11.0.2", "@semantic-release/npm": "12.0.1", "@semantic-release/release-notes-generator": "14.0.3", "conventional-changelog-conventionalcommits": "8.0.0" @@ -7157,39 +7294,90 @@ "dev": true }, "@octokit/core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", - "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", + "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", "dev": true, "requires": { "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.0.0", - "@octokit/request": "^9.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.0.0", + "@octokit/graphql": "^8.2.2", + "@octokit/request": "^9.2.3", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", "before-after-hook": "^3.0.2", "universal-user-agent": "^7.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true + }, + "@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^25.0.0" + } + } } }, "@octokit/endpoint": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", - "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", + "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", "dev": true, "requires": { - "@octokit/types": "^13.0.0", + "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.2" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true + }, + "@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^25.0.0" + } + } } }, "@octokit/graphql": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", - "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", + "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", "dev": true, "requires": { - "@octokit/request": "^9.0.0", - "@octokit/types": "^13.0.0", + "@octokit/request": "^9.2.3", + "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true + }, + "@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^25.0.0" + } + } } }, "@octokit/openapi-types": { @@ -7199,12 +7387,29 @@ "dev": true }, "@octokit/plugin-paginate-rest": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.5.tgz", - "integrity": "sha512-cgwIRtKrpwhLoBi0CUNuY83DPGRMaWVjqVI/bGKsLJ4PzyWZNaEmhHroI2xlrVXkk6nFv0IsZpOp+ZWSWUS2AQ==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-12.0.0.tgz", + "integrity": "sha512-MPd6WK1VtZ52lFrgZ0R2FlaoiWllzgqFHaSZxvp72NmoDeZ0m8GeJdg4oB6ctqMTYyrnDYp592Xma21mrgiyDA==", "dev": true, "requires": { - "@octokit/types": "^13.6.0" + "@octokit/types": "^14.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true + }, + "@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^25.0.0" + } + } } }, "@octokit/plugin-retry": { @@ -7219,34 +7424,86 @@ } }, "@octokit/plugin-throttling": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.3.1.tgz", - "integrity": "sha512-Qd91H4liUBhwLB2h6jZ99bsxoQdhgPk6TdwnClPyTBSDAdviGPceViEgUwj+pcQDmB/rfAXAXK7MTochpHM3yQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-10.0.0.tgz", + "integrity": "sha512-Kuq5/qs0DVYTHZuBAzCZStCzo2nKvVRo/TDNhCcpC2TKiOGz/DisXMCvjt3/b5kr6SCI1Y8eeeJTHBxxpFvZEg==", "dev": true, "requires": { - "@octokit/types": "^13.0.0", + "@octokit/types": "^14.0.0", "bottleneck": "^2.15.3" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true + }, + "@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^25.0.0" + } + } } }, "@octokit/request": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz", - "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", + "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", "dev": true, "requires": { - "@octokit/endpoint": "^10.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.1.0", + "@octokit/endpoint": "^10.1.4", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^2.0.0", "universal-user-agent": "^7.0.2" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true + }, + "@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^25.0.0" + } + } } }, "@octokit/request-error": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.5.tgz", - "integrity": "sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", + "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", "dev": true, "requires": { - "@octokit/types": "^13.0.0" + "@octokit/types": "^14.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", + "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "dev": true + }, + "@octokit/types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", + "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^25.0.0" + } + } } }, "@octokit/types": { @@ -7462,15 +7719,15 @@ } }, "@semantic-release/github": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.1.tgz", - "integrity": "sha512-Z9cr0LgU/zgucbT9cksH0/pX9zmVda9hkDPcgIE0uvjMQ8w/mElDivGjx1w1pEQ+MuQJ5CBq3VCF16S6G4VH3A==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.2.tgz", + "integrity": "sha512-EhHimj3/eOSPu0OflgDzwgrawoGJIn8XLOkNS6WzwuTr8ebxyX976Y4mCqJ8MlkdQpV5+8T+49sy8xXlcm6uCg==", "dev": true, "requires": { "@octokit/core": "^6.0.0", - "@octokit/plugin-paginate-rest": "^11.0.0", + "@octokit/plugin-paginate-rest": "^12.0.0", "@octokit/plugin-retry": "^7.0.0", - "@octokit/plugin-throttling": "^9.0.0", + "@octokit/plugin-throttling": "^10.0.0", "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", "debug": "^4.3.4", @@ -10141,6 +10398,12 @@ "strip-final-newline": "^2.0.0" } }, + "fast-content-type-parse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", + "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", + "dev": true + }, "fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -11367,16 +11630,16 @@ } }, "semantic-release-preconfigured-conventional-commits": { - "version": "1.1.126", - "resolved": "https://registry.npmjs.org/semantic-release-preconfigured-conventional-commits/-/semantic-release-preconfigured-conventional-commits-1.1.126.tgz", - "integrity": "sha512-scn6q/4EoDzmfzsckAtg2hKEXM8GTeoZzpEZL9VnxAgWnvOnJVXdmVkwmQPQQQwHyiwStTtAcOV6zykMjEE6Ig==", + "version": "1.1.127", + "resolved": "https://registry.npmjs.org/semantic-release-preconfigured-conventional-commits/-/semantic-release-preconfigured-conventional-commits-1.1.127.tgz", + "integrity": "sha512-lGrxDKngRn0KuZD2OY+wt4yCxso4Vop28I5d4QSizZ7gvcv5TYQhsTtuFIhOcH0Hlv0cw48R/ImF9DDBv85Y8g==", "dev": true, "requires": { "@semantic-release/changelog": "6.0.3", "@semantic-release/commit-analyzer": "13.0.1", "@semantic-release/exec": "7.0.3", "@semantic-release/git": "10.0.1", - "@semantic-release/github": "11.0.1", + "@semantic-release/github": "11.0.2", "@semantic-release/npm": "12.0.1", "@semantic-release/release-notes-generator": "14.0.3", "conventional-changelog-conventionalcommits": "8.0.0" diff --git a/package.json b/package.json index d6ef23160b..428bfa26b1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "devDependencies": { - "semantic-release-preconfigured-conventional-commits": "1.1.126" + "semantic-release-preconfigured-conventional-commits": "1.1.127" }, "engines": { "node": "22.15", From 22b2abb0c5377e35219d52f5e1d7b8e40e01b272 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 2 May 2025 06:20:26 +0000 Subject: [PATCH 84/96] chore(deps): update danysk/makepkg docker tag to v1.1.46 (#4438) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- deps-utils/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps-utils/Dockerfile b/deps-utils/Dockerfile index 732035f3ab..2ede731a34 100644 --- a/deps-utils/Dockerfile +++ b/deps-utils/Dockerfile @@ -1 +1 @@ -FROM danysk/makepkg:1.1.45 +FROM danysk/makepkg:1.1.46 From 13cfcf4cd6dc1d98ac585ef6d89182a6be4d0a11 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 2 May 2025 12:25:34 +0000 Subject: [PATCH 85/96] chore(deps): update react to v2025.5.2-19.1.0 (patch) (#4439) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ce80c8ba60..52fef0bec4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ kotlinx-coroutines = "1.10.2" ktor = "3.1.2" mockito = "5.17.0" protelis = "18.0.4" -react = "2025.5.1-19.1.0" +react = "2025.5.2-19.1.0" scafi = "1.6.0" scala = "2.13.16" scalacache = "0.28.0" From ef59168605181ec33534cc6097c48586726027fe Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Fri, 2 May 2025 12:30:20 +0000 Subject: [PATCH 86/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 8d31b5fafa..0c47aefe1e 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -280,11 +280,11 @@ "org.jetbrains.dokka/templating-plugin/2.0.0": { "first": "https://javadoc.io/doc/org.jetbrains.dokka/templating-plugin/2.0.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.1-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.1-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.2-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.2-19.1.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.1-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.1-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.2-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.2-19.1.0" }, "org.jetbrains.kotlin/kotlin-build-tools-impl/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-build-tools-impl/null" From cd3500f6da4651f906210549256b356222f08aba Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 3 May 2025 02:48:52 +0000 Subject: [PATCH 87/96] chore(deps): update plugin publishoncentral to v8.0.7 (#4440) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 52fef0bec4..d08a12b37e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -172,7 +172,7 @@ kotest-multiplatform = { id = "io.kotest.multiplatform", version.ref = "kotest" kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ktor = { id = "io.ktor.plugin", version.ref = "ktor" } multiJvmTesting = "org.danilopianini.multi-jvm-test-plugin:3.4.1" -publishOnCentral = "org.danilopianini.publish-on-central:8.0.6" +publishOnCentral = "org.danilopianini.publish-on-central:8.0.7" scalafmt = "cz.alenkacz.gradle.scalafmt:1.16.2" shadowJar = "com.github.johnrengelman.shadow:8.1.1" taskTree = "com.dorongold.task-tree:4.0.1" From 9001a47bd064a117c91f48d07290c69a78fc2f80 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 3 May 2025 22:53:26 +0000 Subject: [PATCH 88/96] ci(deps): update danysk/build-check-deploy-gradle-action action to v3.7.18 (#4441) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build-and-deploy.yml | 8 ++++---- .github/workflows/update-ancillary-files.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 3779d6cc2f..39a50c56c5 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -68,7 +68,7 @@ jobs: steps: - name: Checkout uses: danysk/action-checkout@0.2.22 - - uses: DanySK/build-check-deploy-gradle-action@3.7.17 + - uses: DanySK/build-check-deploy-gradle-action@3.7.18 with: pre-build-command: true build-command: | @@ -92,7 +92,7 @@ jobs: steps: - name: Checkout uses: danysk/action-checkout@0.2.22 - - uses: DanySK/build-check-deploy-gradle-action@3.7.17 + - uses: DanySK/build-check-deploy-gradle-action@3.7.18 with: retries-on-failure: 5 wait-between-retries: 120 @@ -175,7 +175,7 @@ jobs: steps: - name: Checkout with full history uses: danysk/action-checkout@0.2.22 - - uses: DanySK/build-check-deploy-gradle-action@3.7.17 + - uses: DanySK/build-check-deploy-gradle-action@3.7.18 with: signing-key: ${{ secrets.SIGNING_KEY }} signing-password: ${{ secrets.SIGNING_PASSWORD }} @@ -446,7 +446,7 @@ jobs: uses: actions/setup-node@v4.4.0 with: node-version-file: package.json - - uses: DanySK/build-check-deploy-gradle-action@3.7.17 + - uses: DanySK/build-check-deploy-gradle-action@3.7.18 env: STAGING_REPO_ID: ${{ needs.staging-repo.outputs.repo-id }} MAKEPKG_IMAGE: ${{ needs.ci-preparation.outputs.makepkg-image }} diff --git a/.github/workflows/update-ancillary-files.yml b/.github/workflows/update-ancillary-files.yml index 962aaae47c..7435265b04 100644 --- a/.github/workflows/update-ancillary-files.yml +++ b/.github/workflows/update-ancillary-files.yml @@ -15,7 +15,7 @@ jobs: uses: danysk/action-checkout@0.2.22 with: token: ${{ secrets.DEPLOYMENT_TOKEN }} - - uses: DanySK/build-check-deploy-gradle-action@3.7.17 + - uses: DanySK/build-check-deploy-gradle-action@3.7.18 with: pre-build-command: rm javadoc-io.json build-command: | From ddaedb7c28bec9cefca889699d5f739163a84f5b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 19:41:22 +0000 Subject: [PATCH 89/96] chore(deps): update dependency scalafmt to v3.9.6 (#4443) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .scalafmt.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index f2948223a9..e576ab1214 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -4,7 +4,7 @@ # To edit the original configurations go to # https://github.com/alejandrohdezma/sbt-scalafmt-defaults/edit/master/.scalafmt.conf -version = 3.9.5 +version = 3.9.6 runner.dialect = scala213 maxColumn = 120 align.preset = none From 0441020330072925cc62ac2c0148f035f8f68cd3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 21:03:00 +0000 Subject: [PATCH 90/96] chore(deps): update ktor monorepo to v3.1.3 (patch) (#4442) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d08a12b37e..61ca87ebd1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ konf = "1.1.2" kotest = "6.0.0.M3" kotlin = "2.1.20" kotlinx-coroutines = "1.10.2" -ktor = "3.1.2" +ktor = "3.1.3" mockito = "5.17.0" protelis = "18.0.4" react = "2025.5.2-19.1.0" From 890de441bc304d6dac1085e33156ae9fdd92719d Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Mon, 5 May 2025 21:07:09 +0000 Subject: [PATCH 91/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 52 ++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 0c47aefe1e..75e614ec91 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -121,44 +121,44 @@ "io.kotest/kotest-runner-junit5-jvm/6.0.0.M3": { "first": "https://javadoc.io/doc/io.kotest/kotest-runner-junit5-jvm/6.0.0.M3" }, - "io.ktor/ktor-client-content-negotiation/3.1.2": { - "first": "https://javadoc.io/doc/io.ktor/ktor-client-content-negotiation/3.1.2" + "io.ktor/ktor-client-content-negotiation/3.1.3": { + "first": "https://javadoc.io/doc/io.ktor/ktor-client-content-negotiation/3.1.3" }, - "io.ktor/ktor-client-core/3.1.2": { - "first": "https://javadoc.io/doc/io.ktor/ktor-client-core/3.1.2" + "io.ktor/ktor-client-core/3.1.3": { + "first": "https://javadoc.io/doc/io.ktor/ktor-client-core/3.1.3" }, - "io.ktor/ktor-client-js/3.1.2": { - "first": "https://javadoc.io/doc/io.ktor/ktor-client-js/3.1.2" + "io.ktor/ktor-client-js/3.1.3": { + "first": "https://javadoc.io/doc/io.ktor/ktor-client-js/3.1.3" }, - "io.ktor/ktor-serialization-jackson/3.1.2": { - "first": "https://javadoc.io/doc/io.ktor/ktor-serialization-jackson/3.1.2" + "io.ktor/ktor-serialization-jackson/3.1.3": { + "first": "https://javadoc.io/doc/io.ktor/ktor-serialization-jackson/3.1.3" }, - "io.ktor/ktor-serialization-kotlinx-json/3.1.2": { - "first": "https://javadoc.io/doc/io.ktor/ktor-serialization-kotlinx-json/3.1.2" + "io.ktor/ktor-serialization-kotlinx-json/3.1.3": { + "first": "https://javadoc.io/doc/io.ktor/ktor-serialization-kotlinx-json/3.1.3" }, - "io.ktor/ktor-serialization/3.1.2": { - "first": "https://javadoc.io/doc/io.ktor/ktor-serialization/3.1.2" + "io.ktor/ktor-serialization/3.1.3": { + "first": "https://javadoc.io/doc/io.ktor/ktor-serialization/3.1.3" }, - "io.ktor/ktor-server-compression/3.1.2": { - "first": "https://javadoc.io/doc/io.ktor/ktor-server-compression/3.1.2" + "io.ktor/ktor-server-compression/3.1.3": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-compression/3.1.3" }, - "io.ktor/ktor-server-content-negotiation/3.1.2": { - "first": "https://javadoc.io/doc/io.ktor/ktor-server-content-negotiation/3.1.2" + "io.ktor/ktor-server-content-negotiation/3.1.3": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-content-negotiation/3.1.3" }, - "io.ktor/ktor-server-core-jvm/3.1.2": { - "first": "https://javadoc.io/doc/io.ktor/ktor-server-core-jvm/3.1.2" + "io.ktor/ktor-server-core-jvm/3.1.3": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-core-jvm/3.1.3" }, - "io.ktor/ktor-server-cors/3.1.2": { - "first": "https://javadoc.io/doc/io.ktor/ktor-server-cors/3.1.2" + "io.ktor/ktor-server-cors/3.1.3": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-cors/3.1.3" }, - "io.ktor/ktor-server-netty/3.1.2": { - "first": "https://javadoc.io/doc/io.ktor/ktor-server-netty/3.1.2" + "io.ktor/ktor-server-netty/3.1.3": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-netty/3.1.3" }, - "io.ktor/ktor-server-test-host/3.1.2": { - "first": "https://javadoc.io/doc/io.ktor/ktor-server-test-host/3.1.2" + "io.ktor/ktor-server-test-host/3.1.3": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-test-host/3.1.3" }, - "io.ktor/ktor-server-websockets-jvm/3.1.2": { - "first": "https://javadoc.io/doc/io.ktor/ktor-server-websockets-jvm/3.1.2" + "io.ktor/ktor-server-websockets-jvm/3.1.3": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-websockets-jvm/3.1.3" }, "io.mockk/mockk/1.14.2": { "first": "https://javadoc.io/doc/io.mockk/mockk/1.14.2" From bb08504235af4abd8bd7c7a7dfca47699adc6671 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 May 2025 17:39:37 +0000 Subject: [PATCH 92/96] chore(deps): update dependency org.jetbrains.compose to v1.8.0 (#4445) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 61ca87ebd1..fe1cc9231a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ androidx-lifecycle = "2.8.4" antlr4 = "4.13.2" apollo ="4.0.0-beta.7" arrow = "2.1.1" -compose-multiplatform = "1.7.3" +compose-multiplatform = "1.8.0" dokka = "2.0.0" graphql = "8.5.0" graphhopper = "10.2" From 05c6fba476436b7dee8ea6d972a3c0b4afcac4cf Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Tue, 6 May 2025 17:42:25 +0000 Subject: [PATCH 93/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index 75e614ec91..e95d1fc176 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -250,20 +250,20 @@ "first": "https://javadoc.io/doc/org.graphstream/gs-core/2.0", "second": "https://javadoc.io/doc/org.graphstream/gs-core/2.0/element-list" }, - "org.jetbrains.compose.components/components-resources/1.7.3": { - "first": "https://javadoc.io/doc/org.jetbrains.compose.components/components-resources/1.7.3" + "org.jetbrains.compose.components/components-resources/1.8.0": { + "first": "https://javadoc.io/doc/org.jetbrains.compose.components/components-resources/1.8.0" }, - "org.jetbrains.compose.foundation/foundation/1.7.3": { - "first": "https://javadoc.io/doc/org.jetbrains.compose.foundation/foundation/1.7.3" + "org.jetbrains.compose.foundation/foundation/1.8.0": { + "first": "https://javadoc.io/doc/org.jetbrains.compose.foundation/foundation/1.8.0" }, - "org.jetbrains.compose.material/material/1.7.3": { - "first": "https://javadoc.io/doc/org.jetbrains.compose.material/material/1.7.3" + "org.jetbrains.compose.material/material/1.8.0": { + "first": "https://javadoc.io/doc/org.jetbrains.compose.material/material/1.8.0" }, - "org.jetbrains.compose.runtime/runtime/1.7.3": { - "first": "https://javadoc.io/doc/org.jetbrains.compose.runtime/runtime/1.7.3" + "org.jetbrains.compose.runtime/runtime/1.8.0": { + "first": "https://javadoc.io/doc/org.jetbrains.compose.runtime/runtime/1.8.0" }, - "org.jetbrains.compose.ui/ui/1.7.3": { - "first": "https://javadoc.io/doc/org.jetbrains.compose.ui/ui/1.7.3" + "org.jetbrains.compose.ui/ui/1.8.0": { + "first": "https://javadoc.io/doc/org.jetbrains.compose.ui/ui/1.8.0" }, "org.jetbrains.dokka/all-modules-page-plugin/2.0.0": { "first": "https://javadoc.io/doc/org.jetbrains.dokka/all-modules-page-plugin/2.0.0" From 0af61e6586de5c21bdb95cdceb867b897c15145d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 09:18:33 +0000 Subject: [PATCH 94/96] chore(deps): update react to v2025.5.3-19.1.0 (patch) (#4446) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fe1cc9231a..d2c2070650 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ kotlinx-coroutines = "1.10.2" ktor = "3.1.3" mockito = "5.17.0" protelis = "18.0.4" -react = "2025.5.2-19.1.0" +react = "2025.5.3-19.1.0" scafi = "1.6.0" scala = "2.13.16" scalacache = "0.28.0" From 6a8fd2bdcbf3ea264887b6cec5510c1be16a5dcc Mon Sep 17 00:00:00 2001 From: "Danilo Pianini [bot]" Date: Wed, 7 May 2025 09:20:58 +0000 Subject: [PATCH 95/96] chore(build): update the javadoc.io cache --- javadoc-io.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javadoc-io.json b/javadoc-io.json index e95d1fc176..d0fea408c2 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -280,11 +280,11 @@ "org.jetbrains.dokka/templating-plugin/2.0.0": { "first": "https://javadoc.io/doc/org.jetbrains.dokka/templating-plugin/2.0.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.2-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.2-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.3-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/2025.5.3-19.1.0" }, - "org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.2-19.1.0": { - "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.2-19.1.0" + "org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.3-19.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/2025.5.3-19.1.0" }, "org.jetbrains.kotlin/kotlin-build-tools-impl/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-build-tools-impl/null" From 8a18eff7f06ca026cf9e8c6f68bfbe91c4bda057 Mon Sep 17 00:00:00 2001 From: Angela Cortecchia Date: Wed, 7 May 2025 19:09:16 +0200 Subject: [PATCH 96/96] refactor: change target function into zoom --- .../alchemist/boundary/NelderMeadMethod.kt | 6 +- .../alchemist/test/TestNelderMeadLauncher.kt | 30 +++++++--- .../src/test/resources/images/base.png | Bin 0 -> 403 bytes .../src/test/resources/images/square.png | Bin 0 -> 7796 bytes .../test/resources/testNelderMeadLauncher.yml | 55 ++++++++++-------- ...auncher_2025-04-15T16-22-09.065959154.json | 1 + ...auncher_2025-05-07T17-11-57.151028509.json | 1 + ...auncher_2025-05-07T17-13-17.341174094.json | 1 + ...auncher_2025-05-07T17-16-06.717987460.json | 1 + ...auncher_2025-05-07T17-17-00.566773855.json | 1 + ...auncher_2025-05-07T17-19-49.731927730.json | 1 + ...auncher_2025-05-07T17-22-30.509375333.json | 1 + ...auncher_2025-05-07T17-32-06.814812034.json | 1 + 13 files changed, 66 insertions(+), 33 deletions(-) create mode 100644 alchemist-loading/src/test/resources/images/base.png create mode 100644 alchemist-loading/src/test/resources/images/square.png create mode 100644 alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-04-15T16-22-09.065959154.json create mode 100644 alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-11-57.151028509.json create mode 100644 alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-13-17.341174094.json create mode 100644 alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-16-06.717987460.json create mode 100644 alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-17-00.566773855.json create mode 100644 alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-19-49.731927730.json create mode 100644 alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-22-30.509375333.json create mode 100644 alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-32-06.814812034.json diff --git a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt index 9ab1a753a0..dedf7f8f8d 100644 --- a/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt +++ b/alchemist-loading/src/main/kotlin/it/unibo/alchemist/boundary/NelderMeadMethod.kt @@ -71,9 +71,9 @@ class NelderMeadMethod( "Invalid objective function return value for reflection with $reflected = $reflectedValue.\n" + "Check the objective function implementation, the result should be a finite number." } - check (!reflectedValue.get().isFinite()) { - error("Invalid objective function return value for reflection") - } +// check (!reflectedValue.get().isFinite()) { +// error("Invalid objective function return value for reflection") +// } val newSimplex = when { reflectedValue < bestValue -> { // expansion val expanded: List = centroid.mapCentroid(gamma, reflected) diff --git a/alchemist-loading/src/test/kotlin/it/unibo/alchemist/test/TestNelderMeadLauncher.kt b/alchemist-loading/src/test/kotlin/it/unibo/alchemist/test/TestNelderMeadLauncher.kt index 645e9ab164..268c6f64c6 100644 --- a/alchemist-loading/src/test/kotlin/it/unibo/alchemist/test/TestNelderMeadLauncher.kt +++ b/alchemist-loading/src/test/kotlin/it/unibo/alchemist/test/TestNelderMeadLauncher.kt @@ -12,10 +12,13 @@ package it.unibo.alchemist.test import it.unibo.alchemist.boundary.LoadAlchemist import it.unibo.alchemist.boundary.launchers.DefaultLauncher import it.unibo.alchemist.core.Status +import it.unibo.alchemist.model.Node import it.unibo.alchemist.model.Environment +import it.unibo.alchemist.model.Position import kotlinx.serialization.json.Json import kotlinx.serialization.json.jsonObject import org.kaikikm.threadresloader.ResourceLoader +import java.awt.geom.QuadCurve2D import java.io.File import java.util.concurrent.TimeUnit import kotlin.test.Test @@ -55,7 +58,12 @@ class TestNelderMeadLauncher() { println("inputs are $inputs") loader.launch(DefaultLauncher()) val optimizedSimulation = loader.getWith(inputs) - assertTrue(optimizedSimulation.environment.nodeCount in 75..85) + val node = optimizedSimulation.environment.nodes[0] + val nodepos: Position<*> = optimizedSimulation.environment.getPosition(node) + println("node position is $nodepos") + nodepos.coordinates.forEachIndexed { index, value -> + assertEquals(0.0, value) + } } } } @@ -81,23 +89,31 @@ class TestNelderMeadLauncher() { // } // } loader.launch(DefaultLauncher()) - val customVars = mapOf("width" to 8.0, "height" to 10.0) + val customVars = mapOf("zoom" to 0.001) val optimizedSimulation = loader.getWith(customVars) optimizedSimulation.play() optimizedSimulation.run() - assertTrue(optimizedSimulation.environment.nodeCount in 75..85) + val node = optimizedSimulation.environment.nodes[0] + val nodepos: Position<*> = optimizedSimulation.environment.getPosition(node) + println("node position is $nodepos") + assertEquals(DoubleArray(2) { 2.2 }.toList(), nodepos.coordinates.toList()) } } /** * The goal for the optimization. */ -class Goal : (Environment<*, *>) -> Double { +class Goal : (Environment) -> Double { /** - * The target number of nodes. + * The target position of the node. */ - val target = 81 + val target = DoubleArray(2) { 2.2 } - override fun invoke(env: Environment<*, *>): Double = target.toDouble() - env.nodeCount + override fun invoke(env: Environment): Double { + val node: Node = env.nodes[0] + env.nodes.mapIndexed { idx, node -> env.getPosition(node) } + val nodePosition = env.getPosition(node).coordinates + return target.mapIndexed { index, value -> value - nodePosition[index] }.sum() + } } diff --git a/alchemist-loading/src/test/resources/images/base.png b/alchemist-loading/src/test/resources/images/base.png new file mode 100644 index 0000000000000000000000000000000000000000..82d78352c738438446c4ef5795f1eb4137d16917 GIT binary patch literal 403 zcmeAS@N?(olHy`uVBq!ia0vp^86eET1|(%=wk`xxoCO|{#S9F5he4R}c>anMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E74o-U3d6?5KRGvs125O6&h z`|)3RU+dJSZIwrTX1+R{tY~eVexmA*+<|(gqnsk&|I}GLf77eD=k2@W^AE5BMbrc4 sI23}Uh704)xidR$o9@Rz{I!?iStZ+fiK9YqfdR_k>FVdQ&MBb@0ICs$EdT%j literal 0 HcmV?d00001 diff --git a/alchemist-loading/src/test/resources/images/square.png b/alchemist-loading/src/test/resources/images/square.png new file mode 100644 index 0000000000000000000000000000000000000000..317bf6d8b1ca42adb1d209267ed764d9e5a80e21 GIT binary patch literal 7796 zcmeAS@N?(olHy`uVBq!ia0y~yVA%k|94tT)M~!M11_n86PZ!6KinzDeHu^F%GO!$6 z-_kHg?nT3;j01B8CS4MKvQ200g+|tSJAZt#%dw$`w)g9pUq7ud0h-=jy)UCPd-v-DRaX0%7-GH_Tok&l1`KSW#;HK6 z!7pJcrw+pc;fPEoZiW{uVY3b}F<6aCjfTc(+8E6aqlLq0c{o}-j8=%F&4bYv(P)ck zv_&-9A{uQGjkbtJTSTKRqR|%7Xp3mHMKszX8f_7cwunYsM58UD(H7BYi-_heBK_lw zf%AlscRss%$J~x(2TvOM`_Oe>5$i1G-@^y2WaU8() + # language: kotlin + zoom: &zoom type: LinearVariable - parameters: [ 1, 1, 20, 1 ] - height: &height - type: LinearVariable - parameters: [ 1, 1, 20, 1 ] + parameters: [ 1, 0.001, 1, 0.01 ] seed: &seed min: 0 max: 0 @@ -25,21 +22,33 @@ seeds: incarnation: protelis +environment: { type: ImageEnvironment, parameters: [images/base.png, 0.01, 0, 0] } + +_program-pools: + move: &move + - time-distribution: { type: ExponentialTime, parameters: [1] } + type: Event + actions: { type: FollowAtDistance, parameters: [destination, 0, 1] } + deployments: - - type: Grid - parameters: [0, 0, *width, *height, 1, 1] + - type: Point + parameters: [0.1, 0.1] + programs: [*move] + contents: + - molecule: destination + concentration: [ 2, 2 ] terminate: type: AfterTime - parameters: [5] - -launcher: - type: NelderMeadLauncher - parameters: { - outputPath: "src/test/resources/testNelderMeadResults", - outputFileName: "testNelderMeadLauncher", - objectiveFunction: *goal, - variables: [ "width", "height" ], - seedName: "seed", - repetitions: 1, - } + parameters: [10] + +#launcher: +# type: NelderMeadLauncher +# parameters: { +# outputPath: "src/test/resources/testNelderMeadResults", +# outputFileName: "testNelderMeadLauncher", +# objectiveFunction: *goal, +# variables: [ "zoom" ], +# seedName: "seed", +# repetitions: 1, +# } diff --git a/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-04-15T16-22-09.065959154.json b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-04-15T16-22-09.065959154.json new file mode 100644 index 0000000000..bc14af0bf7 --- /dev/null +++ b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-04-15T16-22-09.065959154.json @@ -0,0 +1 @@ +{"seed":1,"variables":{"width":2.5628155191630464,"height":17.182540214812793}} \ No newline at end of file diff --git a/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-11-57.151028509.json b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-11-57.151028509.json new file mode 100644 index 0000000000..43fe80b1ec --- /dev/null +++ b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-11-57.151028509.json @@ -0,0 +1 @@ +{"seed":1,"variables":{"zoom":0.009022468751106863}} \ No newline at end of file diff --git a/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-13-17.341174094.json b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-13-17.341174094.json new file mode 100644 index 0000000000..43fe80b1ec --- /dev/null +++ b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-13-17.341174094.json @@ -0,0 +1 @@ +{"seed":1,"variables":{"zoom":0.009022468751106863}} \ No newline at end of file diff --git a/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-16-06.717987460.json b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-16-06.717987460.json new file mode 100644 index 0000000000..43fe80b1ec --- /dev/null +++ b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-16-06.717987460.json @@ -0,0 +1 @@ +{"seed":1,"variables":{"zoom":0.009022468751106863}} \ No newline at end of file diff --git a/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-17-00.566773855.json b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-17-00.566773855.json new file mode 100644 index 0000000000..43fe80b1ec --- /dev/null +++ b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-17-00.566773855.json @@ -0,0 +1 @@ +{"seed":1,"variables":{"zoom":0.009022468751106863}} \ No newline at end of file diff --git a/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-19-49.731927730.json b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-19-49.731927730.json new file mode 100644 index 0000000000..43fe80b1ec --- /dev/null +++ b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-19-49.731927730.json @@ -0,0 +1 @@ +{"seed":1,"variables":{"zoom":0.009022468751106863}} \ No newline at end of file diff --git a/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-22-30.509375333.json b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-22-30.509375333.json new file mode 100644 index 0000000000..43fe80b1ec --- /dev/null +++ b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-22-30.509375333.json @@ -0,0 +1 @@ +{"seed":1,"variables":{"zoom":0.009022468751106863}} \ No newline at end of file diff --git a/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-32-06.814812034.json b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-32-06.814812034.json new file mode 100644 index 0000000000..43fe80b1ec --- /dev/null +++ b/alchemist-loading/src/test/resources/testNelderMeadResults/testNelderMeadLauncher_2025-05-07T17-32-06.814812034.json @@ -0,0 +1 @@ +{"seed":1,"variables":{"zoom":0.009022468751106863}} \ No newline at end of file