From 81d3926c15a1434ad6cc28841bf7f2c9a3f55b5e Mon Sep 17 00:00:00 2001 From: benmusson Date: Wed, 4 Sep 2024 15:08:03 -0400 Subject: [PATCH 1/2] add `randomUUID` expression and scripting functions --- .../org/imdc/extensions/client/ClientHook.kt | 6 +++++ .../common/UtilitiesExtensions.java | 6 +++++ .../common/expressions/RandomUUIDFunction.kt | 23 +++++++++++++++++++ .../common/UtilitiesExtensions.properties | 4 ++++ .../imdc/extensions/common/RandomUUIDTests.kt | 18 +++++++++++++++ .../common/UtilitiesExtensionsTests.kt | 5 ++++ .../imdc/extensions/designer/DesignerHook.kt | 6 +++++ .../imdc/extensions/gateway/GatewayHook.kt | 6 +++++ 8 files changed, 74 insertions(+) create mode 100644 common/src/main/kotlin/org/imdc/extensions/common/expressions/RandomUUIDFunction.kt create mode 100644 common/src/test/kotlin/org/imdc/extensions/common/RandomUUIDTests.kt diff --git a/client/src/main/kotlin/org/imdc/extensions/client/ClientHook.kt b/client/src/main/kotlin/org/imdc/extensions/client/ClientHook.kt index 9d888fd..41aeacc 100644 --- a/client/src/main/kotlin/org/imdc/extensions/client/ClientHook.kt +++ b/client/src/main/kotlin/org/imdc/extensions/client/ClientHook.kt @@ -13,6 +13,7 @@ import org.imdc.extensions.common.UtilitiesExtensions import org.imdc.extensions.common.addPropertyBundle import org.imdc.extensions.common.expressions.IsAvailableFunction import org.imdc.extensions.common.expressions.LogicalPredicate.Companion.registerLogicFunctions +import org.imdc.extensions.common.expressions.RandomUUIDFunction @Suppress("unused") class ClientHook : AbstractClientModuleHook() { @@ -50,6 +51,11 @@ class ClientHook : AbstractClientModuleHook() { IsAvailableFunction(), ) registerLogicFunctions() + addFunction( + RandomUUIDFunction.NAME, + RandomUUIDFunction.CATEGORY, + RandomUUIDFunction(), + ) } } } diff --git a/common/src/main/java/org/imdc/extensions/common/UtilitiesExtensions.java b/common/src/main/java/org/imdc/extensions/common/UtilitiesExtensions.java index 3273e84..5377859 100644 --- a/common/src/main/java/org/imdc/extensions/common/UtilitiesExtensions.java +++ b/common/src/main/java/org/imdc/extensions/common/UtilitiesExtensions.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -129,4 +130,9 @@ public FunctionFactory getFunctionFactory() { return context.getExpressionFunctionFactory(); } } + + @ScriptFunction(docBundlePrefix = "UtilitiesExtensions") + public UUID randomUUID() { + return UUID.randomUUID(); + } } diff --git a/common/src/main/kotlin/org/imdc/extensions/common/expressions/RandomUUIDFunction.kt b/common/src/main/kotlin/org/imdc/extensions/common/expressions/RandomUUIDFunction.kt new file mode 100644 index 0000000..435cc57 --- /dev/null +++ b/common/src/main/kotlin/org/imdc/extensions/common/expressions/RandomUUIDFunction.kt @@ -0,0 +1,23 @@ +package org.imdc.extensions.common.expressions + +import com.inductiveautomation.ignition.common.expressions.Expression +import com.inductiveautomation.ignition.common.expressions.functions.AbstractFunction +import com.inductiveautomation.ignition.common.model.values.BasicQualifiedValue +import com.inductiveautomation.ignition.common.model.values.QualifiedValue +import java.util.UUID + +class RandomUUIDFunction : AbstractFunction() { + override fun validateNumArgs(num: Int): Boolean = num == 0 + override fun execute(expressions: Array): QualifiedValue { + return BasicQualifiedValue(UUID.randomUUID()) + } + + override fun getArgDocString(): String = "" + override fun getFunctionDisplayName(): String = NAME + override fun getType(): Class<*> = UUID::class.java + + companion object { + const val NAME = "randomUUID" + const val CATEGORY = "Advanced" + } +} diff --git a/common/src/main/resources/org/imdc/extensions/common/UtilitiesExtensions.properties b/common/src/main/resources/org/imdc/extensions/common/UtilitiesExtensions.properties index c5ce55e..f61ac73 100644 --- a/common/src/main/resources/org/imdc/extensions/common/UtilitiesExtensions.properties +++ b/common/src/main/resources/org/imdc/extensions/common/UtilitiesExtensions.properties @@ -8,3 +8,7 @@ deepCopy.returns=A plain Python primitive object. evalExpression.desc=Evaluates the supplied expression. Provide keyword arguments to populate values to curly braces. evalExpression.param.expression=The expression to evaluate. evalExpression.returns=A QualifiedValue with the result of the provided expression. + +randomUUID.desc=Returns a type 4 (pseudo randomly generated) UUID. +randomUUID.returns=A type 4 (pseudo randomly generated) UUID. + diff --git a/common/src/test/kotlin/org/imdc/extensions/common/RandomUUIDTests.kt b/common/src/test/kotlin/org/imdc/extensions/common/RandomUUIDTests.kt new file mode 100644 index 0000000..0b28b71 --- /dev/null +++ b/common/src/test/kotlin/org/imdc/extensions/common/RandomUUIDTests.kt @@ -0,0 +1,18 @@ +package org.imdc.extensions.common + +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.shouldBe +import org.imdc.extensions.common.ExpressionTestHarness.Companion.withFunction +import org.imdc.extensions.common.expressions.RandomUUIDFunction + +class RandomUUIDTests : FunSpec() { + init { + context("RandomUUID") { + withFunction("randomUUID", RandomUUIDFunction()) { + test("Unique results") { + evaluate("randomUUID() = randomUUID()") shouldBe false + } + } + } + } +} diff --git a/common/src/test/kotlin/org/imdc/extensions/common/UtilitiesExtensionsTests.kt b/common/src/test/kotlin/org/imdc/extensions/common/UtilitiesExtensionsTests.kt index a853fdd..8ad52a9 100644 --- a/common/src/test/kotlin/org/imdc/extensions/common/UtilitiesExtensionsTests.kt +++ b/common/src/test/kotlin/org/imdc/extensions/common/UtilitiesExtensionsTests.kt @@ -46,5 +46,10 @@ class UtilitiesExtensionsTests : JythonTest( } } } + context("Random UUID tests") { + test("Unique results") { + eval("utils.randomUUID() == utils.randomUUID()") shouldBe false + } + } } } diff --git a/designer/src/main/kotlin/org/imdc/extensions/designer/DesignerHook.kt b/designer/src/main/kotlin/org/imdc/extensions/designer/DesignerHook.kt index 4bdc050..0b5becb 100644 --- a/designer/src/main/kotlin/org/imdc/extensions/designer/DesignerHook.kt +++ b/designer/src/main/kotlin/org/imdc/extensions/designer/DesignerHook.kt @@ -13,6 +13,7 @@ import org.imdc.extensions.common.UtilitiesExtensions import org.imdc.extensions.common.addPropertyBundle import org.imdc.extensions.common.expressions.IsAvailableFunction import org.imdc.extensions.common.expressions.LogicalPredicate.Companion.registerLogicFunctions +import org.imdc.extensions.common.expressions.RandomUUIDFunction @Suppress("unused") class DesignerHook : AbstractDesignerModuleHook() { @@ -50,6 +51,11 @@ class DesignerHook : AbstractDesignerModuleHook() { IsAvailableFunction(), ) registerLogicFunctions() + addFunction( + RandomUUIDFunction.NAME, + RandomUUIDFunction.CATEGORY, + RandomUUIDFunction(), + ) } } } diff --git a/gateway/src/main/kotlin/org/imdc/extensions/gateway/GatewayHook.kt b/gateway/src/main/kotlin/org/imdc/extensions/gateway/GatewayHook.kt index 36cffab..4bcfc4d 100644 --- a/gateway/src/main/kotlin/org/imdc/extensions/gateway/GatewayHook.kt +++ b/gateway/src/main/kotlin/org/imdc/extensions/gateway/GatewayHook.kt @@ -13,6 +13,7 @@ import org.imdc.extensions.common.UtilitiesExtensions import org.imdc.extensions.common.addPropertyBundle import org.imdc.extensions.common.expressions.IsAvailableFunction import org.imdc.extensions.common.expressions.LogicalPredicate.Companion.registerLogicFunctions +import org.imdc.extensions.common.expressions.RandomUUIDFunction @Suppress("unused") class GatewayHook : AbstractGatewayModuleHook() { @@ -57,6 +58,11 @@ class GatewayHook : AbstractGatewayModuleHook() { IsAvailableFunction(), ) registerLogicFunctions() + addFunction( + RandomUUIDFunction.NAME, + RandomUUIDFunction.CATEGORY, + RandomUUIDFunction(), + ) } } From 98182be6d0c182a9ef94cb94836ad191c66f631a Mon Sep 17 00:00:00 2001 From: Ben Musson <58087114+benmusson@users.noreply.github.com> Date: Wed, 11 Sep 2024 17:52:41 -0400 Subject: [PATCH 2/2] rename from `randomUUID` to `uuid4` --- .../org/imdc/extensions/client/ClientHook.kt | 8 +++---- .../common/UtilitiesExtensions.java | 2 +- ...RandomUUIDFunction.kt => UUID4Function.kt} | 4 ++-- .../common/UtilitiesExtensions.properties | 4 ++-- .../imdc/extensions/common/RandomUUIDTests.kt | 18 -------------- .../org/imdc/extensions/common/UUID4Tests.kt | 24 +++++++++++++++++++ .../common/UtilitiesExtensionsTests.kt | 10 ++++++-- .../imdc/extensions/designer/DesignerHook.kt | 8 +++---- .../imdc/extensions/gateway/GatewayHook.kt | 8 +++---- 9 files changed, 49 insertions(+), 37 deletions(-) rename common/src/main/kotlin/org/imdc/extensions/common/expressions/{RandomUUIDFunction.kt => UUID4Function.kt} (90%) delete mode 100644 common/src/test/kotlin/org/imdc/extensions/common/RandomUUIDTests.kt create mode 100644 common/src/test/kotlin/org/imdc/extensions/common/UUID4Tests.kt diff --git a/client/src/main/kotlin/org/imdc/extensions/client/ClientHook.kt b/client/src/main/kotlin/org/imdc/extensions/client/ClientHook.kt index 41aeacc..03b8652 100644 --- a/client/src/main/kotlin/org/imdc/extensions/client/ClientHook.kt +++ b/client/src/main/kotlin/org/imdc/extensions/client/ClientHook.kt @@ -13,7 +13,7 @@ import org.imdc.extensions.common.UtilitiesExtensions import org.imdc.extensions.common.addPropertyBundle import org.imdc.extensions.common.expressions.IsAvailableFunction import org.imdc.extensions.common.expressions.LogicalPredicate.Companion.registerLogicFunctions -import org.imdc.extensions.common.expressions.RandomUUIDFunction +import org.imdc.extensions.common.expressions.UUID4Function @Suppress("unused") class ClientHook : AbstractClientModuleHook() { @@ -52,9 +52,9 @@ class ClientHook : AbstractClientModuleHook() { ) registerLogicFunctions() addFunction( - RandomUUIDFunction.NAME, - RandomUUIDFunction.CATEGORY, - RandomUUIDFunction(), + UUID4Function.NAME, + UUID4Function.CATEGORY, + UUID4Function(), ) } } diff --git a/common/src/main/java/org/imdc/extensions/common/UtilitiesExtensions.java b/common/src/main/java/org/imdc/extensions/common/UtilitiesExtensions.java index 5377859..c6b66e6 100644 --- a/common/src/main/java/org/imdc/extensions/common/UtilitiesExtensions.java +++ b/common/src/main/java/org/imdc/extensions/common/UtilitiesExtensions.java @@ -132,7 +132,7 @@ public FunctionFactory getFunctionFactory() { } @ScriptFunction(docBundlePrefix = "UtilitiesExtensions") - public UUID randomUUID() { + public UUID getUUID4() { return UUID.randomUUID(); } } diff --git a/common/src/main/kotlin/org/imdc/extensions/common/expressions/RandomUUIDFunction.kt b/common/src/main/kotlin/org/imdc/extensions/common/expressions/UUID4Function.kt similarity index 90% rename from common/src/main/kotlin/org/imdc/extensions/common/expressions/RandomUUIDFunction.kt rename to common/src/main/kotlin/org/imdc/extensions/common/expressions/UUID4Function.kt index 435cc57..969de96 100644 --- a/common/src/main/kotlin/org/imdc/extensions/common/expressions/RandomUUIDFunction.kt +++ b/common/src/main/kotlin/org/imdc/extensions/common/expressions/UUID4Function.kt @@ -6,7 +6,7 @@ import com.inductiveautomation.ignition.common.model.values.BasicQualifiedValue import com.inductiveautomation.ignition.common.model.values.QualifiedValue import java.util.UUID -class RandomUUIDFunction : AbstractFunction() { +class UUID4Function : AbstractFunction() { override fun validateNumArgs(num: Int): Boolean = num == 0 override fun execute(expressions: Array): QualifiedValue { return BasicQualifiedValue(UUID.randomUUID()) @@ -17,7 +17,7 @@ class RandomUUIDFunction : AbstractFunction() { override fun getType(): Class<*> = UUID::class.java companion object { - const val NAME = "randomUUID" + const val NAME = "uuid4" const val CATEGORY = "Advanced" } } diff --git a/common/src/main/resources/org/imdc/extensions/common/UtilitiesExtensions.properties b/common/src/main/resources/org/imdc/extensions/common/UtilitiesExtensions.properties index f61ac73..cbc97f7 100644 --- a/common/src/main/resources/org/imdc/extensions/common/UtilitiesExtensions.properties +++ b/common/src/main/resources/org/imdc/extensions/common/UtilitiesExtensions.properties @@ -9,6 +9,6 @@ evalExpression.desc=Evaluates the supplied expression. Provide keyword arguments evalExpression.param.expression=The expression to evaluate. evalExpression.returns=A QualifiedValue with the result of the provided expression. -randomUUID.desc=Returns a type 4 (pseudo randomly generated) UUID. -randomUUID.returns=A type 4 (pseudo randomly generated) UUID. +getUUID4.desc=Returns type 4 pseudo randomly generated UUID. +getUUID4.returns=A type 4 pseudo randomly generated UUID. diff --git a/common/src/test/kotlin/org/imdc/extensions/common/RandomUUIDTests.kt b/common/src/test/kotlin/org/imdc/extensions/common/RandomUUIDTests.kt deleted file mode 100644 index 0b28b71..0000000 --- a/common/src/test/kotlin/org/imdc/extensions/common/RandomUUIDTests.kt +++ /dev/null @@ -1,18 +0,0 @@ -package org.imdc.extensions.common - -import io.kotest.core.spec.style.FunSpec -import io.kotest.matchers.shouldBe -import org.imdc.extensions.common.ExpressionTestHarness.Companion.withFunction -import org.imdc.extensions.common.expressions.RandomUUIDFunction - -class RandomUUIDTests : FunSpec() { - init { - context("RandomUUID") { - withFunction("randomUUID", RandomUUIDFunction()) { - test("Unique results") { - evaluate("randomUUID() = randomUUID()") shouldBe false - } - } - } - } -} diff --git a/common/src/test/kotlin/org/imdc/extensions/common/UUID4Tests.kt b/common/src/test/kotlin/org/imdc/extensions/common/UUID4Tests.kt new file mode 100644 index 0000000..2c71256 --- /dev/null +++ b/common/src/test/kotlin/org/imdc/extensions/common/UUID4Tests.kt @@ -0,0 +1,24 @@ +package org.imdc.extensions.common + +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.should +import io.kotest.matchers.shouldBe +import io.kotest.matchers.types.beInstanceOf +import org.imdc.extensions.common.ExpressionTestHarness.Companion.withFunction +import org.imdc.extensions.common.expressions.UUID4Function +import java.util.* + +class UUID4Tests : FunSpec() { + init { + context("RandomUUID") { + withFunction("uuid4", UUID4Function()) { + test("Instance of UUID") { + evaluate("uuid4()") should beInstanceOf() + } + test("Unique results") { + evaluate("uuid4() = uuid4()") shouldBe false + } + } + } + } +} diff --git a/common/src/test/kotlin/org/imdc/extensions/common/UtilitiesExtensionsTests.kt b/common/src/test/kotlin/org/imdc/extensions/common/UtilitiesExtensionsTests.kt index 8ad52a9..ede9bfc 100644 --- a/common/src/test/kotlin/org/imdc/extensions/common/UtilitiesExtensionsTests.kt +++ b/common/src/test/kotlin/org/imdc/extensions/common/UtilitiesExtensionsTests.kt @@ -1,11 +1,14 @@ package org.imdc.extensions.common import io.kotest.matchers.nulls.shouldBeNull +import io.kotest.matchers.should import io.kotest.matchers.shouldBe +import io.kotest.matchers.types.beInstanceOf import io.mockk.mockk import org.python.core.Py import org.python.core.PyDictionary import org.python.core.PyList +import java.util.UUID @Suppress("PyUnresolvedReferences", "PyInterpreter") class UtilitiesExtensionsTests : JythonTest( @@ -46,9 +49,12 @@ class UtilitiesExtensionsTests : JythonTest( } } } - context("Random UUID tests") { + context("UUID4 tests") { + test("Instance of UUID") { + eval("utils.getUUID4()") should beInstanceOf() + } test("Unique results") { - eval("utils.randomUUID() == utils.randomUUID()") shouldBe false + eval("utils.getUUID4() == utils.getUUID4()") shouldBe false } } } diff --git a/designer/src/main/kotlin/org/imdc/extensions/designer/DesignerHook.kt b/designer/src/main/kotlin/org/imdc/extensions/designer/DesignerHook.kt index 0b5becb..9ecc231 100644 --- a/designer/src/main/kotlin/org/imdc/extensions/designer/DesignerHook.kt +++ b/designer/src/main/kotlin/org/imdc/extensions/designer/DesignerHook.kt @@ -13,7 +13,7 @@ import org.imdc.extensions.common.UtilitiesExtensions import org.imdc.extensions.common.addPropertyBundle import org.imdc.extensions.common.expressions.IsAvailableFunction import org.imdc.extensions.common.expressions.LogicalPredicate.Companion.registerLogicFunctions -import org.imdc.extensions.common.expressions.RandomUUIDFunction +import org.imdc.extensions.common.expressions.UUID4Function @Suppress("unused") class DesignerHook : AbstractDesignerModuleHook() { @@ -52,9 +52,9 @@ class DesignerHook : AbstractDesignerModuleHook() { ) registerLogicFunctions() addFunction( - RandomUUIDFunction.NAME, - RandomUUIDFunction.CATEGORY, - RandomUUIDFunction(), + UUID4Function.NAME, + UUID4Function.CATEGORY, + UUID4Function(), ) } } diff --git a/gateway/src/main/kotlin/org/imdc/extensions/gateway/GatewayHook.kt b/gateway/src/main/kotlin/org/imdc/extensions/gateway/GatewayHook.kt index 4bcfc4d..72727b8 100644 --- a/gateway/src/main/kotlin/org/imdc/extensions/gateway/GatewayHook.kt +++ b/gateway/src/main/kotlin/org/imdc/extensions/gateway/GatewayHook.kt @@ -13,7 +13,7 @@ import org.imdc.extensions.common.UtilitiesExtensions import org.imdc.extensions.common.addPropertyBundle import org.imdc.extensions.common.expressions.IsAvailableFunction import org.imdc.extensions.common.expressions.LogicalPredicate.Companion.registerLogicFunctions -import org.imdc.extensions.common.expressions.RandomUUIDFunction +import org.imdc.extensions.common.expressions.UUID4Function @Suppress("unused") class GatewayHook : AbstractGatewayModuleHook() { @@ -59,9 +59,9 @@ class GatewayHook : AbstractGatewayModuleHook() { ) registerLogicFunctions() addFunction( - RandomUUIDFunction.NAME, - RandomUUIDFunction.CATEGORY, - RandomUUIDFunction(), + UUID4Function.NAME, + UUID4Function.CATEGORY, + UUID4Function(), ) } }