Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/pr-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ jobs:
- uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 11
java-version: 17
cache: 'gradle'
- name: Build
run: ./gradlew build
- name: Upload Unsigned Module
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v5
with:
name: ignition-extensions-unsigned
path: build/Ignition-Extensions.unsigned.modl
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
- uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 11
java-version: 17
cache: 'gradle'
- name: Deserialize signing certs
run: |
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
.gradle/

local.properties
/common/.jython_cache
3 changes: 3 additions & 0 deletions build-logic/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
plugins {
`kotlin-dsl` apply false
}
3 changes: 3 additions & 0 deletions build-logic/conventions/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
plugins {
`kotlin-dsl`
}
15 changes: 15 additions & 0 deletions build-logic/conventions/src/main/kotlin/imdc/build/base.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package imdc.build


group = "org.imdc.extensions"

plugins {
base
}

repositories {
mavenCentral()
gradlePluginPortal()
maven(url = "https://nexus.inductiveautomation.com/repository/public/")
maven(url = "https://nexus.inductiveautomation.com/repository/inductiveautomation-releases/")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package imdc.build

import libs
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension

plugins {
id("imdc.build.base")
alias(libs.plugins.kotlin)
`java-library`

alias(libs.plugins.spotless)
}

version = project.parent?.version ?: "0.0.0-SNAPSHOT"

val jvmLanguageVersion = libs.versions.java.map { JavaLanguageVersion.of(it) }

configure<KotlinProjectExtension> {
jvmToolchain {
languageVersion = jvmLanguageVersion
}
}

configure<JavaPluginExtension> {
toolchain {
languageVersion = jvmLanguageVersion
}
}

spotless {
ratchetFrom("HEAD")
format("misc") {
target("*.gradle", ".gitattributes", ".gitignore")
trimTrailingWhitespace()
endWithNewline()
}
java {
palantirJavaFormat()
formatAnnotations()
}
kotlin {
ktlint()
}
kotlinGradle {
ktlint()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package imdc.test

tasks {
withType<Test> {
useJUnitPlatform()
jvmArgs = listOf("--add-opens", "java.base/java.io=ALL-UNNAMED")
}
}
19 changes: 19 additions & 0 deletions build-logic/settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
rootProject.name = "build-logic"

plugins {
id("dev.panuszewski.typesafe-conventions") version "0.10.0"
}

dependencyResolutionManagement {
repositories {
mavenCentral()
gradlePluginPortal()
maven(url = "https://nexus.inductiveautomation.com/repository/public/")
maven(url = "https://nexus.inductiveautomation.com/repository/inductiveautomation-releases/")
maven(url = "https://nexus.inductiveautomation.com/repository/inductiveautomation-snapshots/")
}
}

include(
"conventions",
)
13 changes: 0 additions & 13 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,20 +1,7 @@
plugins {
alias(libs.plugins.kotlin)
alias(libs.plugins.modl)
}

allprojects {
repositories {
mavenCentral()
maven("https://nexus.inductiveautomation.com/repository/public")
}
}

subprojects {
// cascade version, which will be set at command line in CI, down to subprojects
version = rootProject.version
}

ignitionModule {
name = "Ignition Extensions"
fileName = "Ignition-Extensions.modl"
Expand Down
7 changes: 1 addition & 6 deletions client/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
plugins {
`java-library`
kotlin("jvm")
}

kotlin {
jvmToolchain(libs.versions.java.map(String::toInt).get())
id("imdc.build.ignition-module-scope")
}

dependencies {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package org.imdc.extensions.client

import com.inductiveautomation.ignition.client.model.ClientContext
import com.inductiveautomation.ignition.common.project.Project
import com.inductiveautomation.ignition.common.script.hints.ScriptFunction
import com.inductiveautomation.ignition.common.resourcecollection.ResourceCollection
import com.inductiveautomation.ignition.common.script.hints.JythonElement
import org.imdc.extensions.common.ProjectExtensions

class ClientProjectExtensions(private val context: ClientContext) : ProjectExtensions {
@ScriptFunction(docBundlePrefix = "ClientProjectExtensions")
override fun getProject(): Project {
@JythonElement(docBundlePrefix = "ClientProjectExtensions")
override fun getProject(): ResourceCollection {
return requireNotNull(context.project)
}
}
15 changes: 2 additions & 13 deletions common/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
plugins {
`java-library`
kotlin("jvm")
}

kotlin {
jvmToolchain(libs.versions.java.map(String::toInt).get())
id("imdc.build.ignition-module-scope")
id("imdc.test.junit-tests")
}

dependencies {
Expand All @@ -13,10 +9,3 @@ dependencies {
testImplementation(libs.bundles.kotest)
testImplementation(libs.mockk)
}

tasks {
withType<Test> {
useJUnitPlatform()
jvmArgs = listOf("--add-opens", "java.base/java.io=ALL-UNNAMED")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import com.inductiveautomation.ignition.common.script.PyArgParser;
import com.inductiveautomation.ignition.common.script.ScriptContext;
import com.inductiveautomation.ignition.common.script.builtin.KeywordArgs;
import com.inductiveautomation.ignition.common.script.hints.ScriptFunction;
import com.inductiveautomation.ignition.common.script.hints.JythonElement;
import com.inductiveautomation.ignition.common.tags.model.TagPath;
import com.inductiveautomation.ignition.common.tags.paths.parser.TagPathParser;
import org.apache.commons.lang3.tuple.Pair;
Expand All @@ -41,13 +41,13 @@ public UtilitiesExtensions(CommonContext context) {
this.context = context;
}

@ScriptFunction(docBundlePrefix = "UtilitiesExtensions")
@JythonElement(docBundlePrefix = "UtilitiesExtensions")
@UnsafeExtension
public CommonContext getContext() {
return context;
}

@ScriptFunction(docBundlePrefix = "UtilitiesExtensions")
@JythonElement(docBundlePrefix = "UtilitiesExtensions")
@KeywordArgs(names = {"object"}, types = {PyObject.class})
public PyObject deepCopy(PyObject[] args, String[] keywords) {
PyArgParser parsedArgs = PyArgParser.parseArgs(args, keywords, this.getClass(), "deepCopy");
Expand Down Expand Up @@ -76,7 +76,7 @@ private static PyObject recursiveConvert(@NotNull PyObject object) {
}
}

@ScriptFunction(docBundlePrefix = "UtilitiesExtensions")
@JythonElement(docBundlePrefix = "UtilitiesExtensions")
@KeywordArgs(names = {"expression"}, types = {String.class})
public QualifiedValue evalExpression(PyObject[] args, String[] keywords) throws Exception {
if (args.length == 0) {
Expand Down Expand Up @@ -116,7 +116,7 @@ public Expression createBoundExpression(String reference) throws RuntimeExceptio
return new ConstantExpression(keywords.get(reference));
} else {
try {
TagPath path = TagPathParser.parse(ScriptContext.defaultTagProvider(), reference);
TagPath path = TagPathParser.parse(ScriptContext.getDefaultTagProvider().orElseThrow(), reference);
var tagValues = context.getTagManager().readAsync(List.of(path)).get(30, TimeUnit.SECONDS);
return new ConstantExpression(tagValues.get(0).getValue());
} catch (IOException | InterruptedException | ExecutionException | TimeoutException e) {
Expand All @@ -131,7 +131,7 @@ public FunctionFactory getFunctionFactory() {
}
}

@ScriptFunction(docBundlePrefix = "UtilitiesExtensions")
@JythonElement(docBundlePrefix = "UtilitiesExtensions")
public UUID getUUID4() {
return UUID.randomUUID();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.inductiveautomation.ignition.common.TypeUtilities
import com.inductiveautomation.ignition.common.script.PyArgParser
import com.inductiveautomation.ignition.common.script.builtin.KeywordArgs
import com.inductiveautomation.ignition.common.script.hints.ScriptArg
import com.inductiveautomation.ignition.common.script.hints.ScriptFunction
import com.inductiveautomation.ignition.common.script.hints.JythonElement
import com.inductiveautomation.ignition.common.util.DatasetBuilder
import com.inductiveautomation.ignition.common.xmlserialization.ClassNameResolver
import org.apache.poi.ss.usermodel.Cell
Expand Down Expand Up @@ -35,7 +35,7 @@ import kotlin.streams.asSequence

object DatasetExtensions {
@Suppress("unused")
@ScriptFunction(docBundlePrefix = "DatasetExtensions")
@JythonElement(docBundlePrefix = "DatasetExtensions")
@KeywordArgs(
names = ["dataset", "mapper", "preserveColumnTypes"],
types = [Dataset::class, PyFunction::class, Boolean::class],
Expand Down Expand Up @@ -74,7 +74,7 @@ object DatasetExtensions {
}

@Suppress("unused")
@ScriptFunction(docBundlePrefix = "DatasetExtensions")
@JythonElement(docBundlePrefix = "DatasetExtensions")
@KeywordArgs(
names = ["dataset", "filter"],
types = [Dataset::class, PyFunction::class],
Expand Down Expand Up @@ -122,7 +122,7 @@ object DatasetExtensions {
}

@Suppress("unused")
@ScriptFunction(docBundlePrefix = "DatasetExtensions")
@JythonElement(docBundlePrefix = "DatasetExtensions")
@KeywordArgs(
names = ["dataset", "output", "includeTypes"],
types = [Dataset::class, Appendable::class, Boolean::class],
Expand Down Expand Up @@ -221,7 +221,7 @@ object DatasetExtensions {
}

@Suppress("unused")
@ScriptFunction(docBundlePrefix = "DatasetExtensions")
@JythonElement(docBundlePrefix = "DatasetExtensions")
@KeywordArgs(
names = ["dataset", "filterNull"],
types = [Dataset::class, Boolean::class],
Expand Down Expand Up @@ -253,7 +253,7 @@ object DatasetExtensions {
}

@Suppress("unused")
@ScriptFunction(docBundlePrefix = "DatasetExtensions")
@JythonElement(docBundlePrefix = "DatasetExtensions")
@KeywordArgs(
names = ["input", "headerRow", "sheetNumber", "firstRow", "lastRow", "firstColumn", "lastColumn", "typeOverrides"],
types = [ByteArray::class, Int::class, Int::class, Int::class, Int::class, Int::class, Int::class, PyStringMap::class],
Expand Down Expand Up @@ -412,7 +412,7 @@ object DatasetExtensions {
}

@Suppress("unused")
@ScriptFunction(docBundlePrefix = "DatasetExtensions")
@JythonElement(docBundlePrefix = "DatasetExtensions")
fun equals(
@ScriptArg("dataset1") ds1: Dataset,
@ScriptArg("dataset2") ds2: Dataset,
Expand All @@ -421,7 +421,7 @@ object DatasetExtensions {
}

@Suppress("unused")
@ScriptFunction(docBundlePrefix = "DatasetExtensions")
@JythonElement(docBundlePrefix = "DatasetExtensions")
fun valuesEqual(
@ScriptArg("dataset1") ds1: Dataset,
@ScriptArg("dataset2") ds2: Dataset,
Expand All @@ -440,7 +440,7 @@ object DatasetExtensions {
}

@Suppress("unused")
@ScriptFunction(docBundlePrefix = "DatasetExtensions")
@JythonElement(docBundlePrefix = "DatasetExtensions")
@JvmOverloads
fun columnsEqual(
@ScriptArg("dataset1") ds1: Dataset,
Expand Down Expand Up @@ -473,7 +473,7 @@ object DatasetExtensions {
}
}

@ScriptFunction(docBundlePrefix = "DatasetExtensions")
@JythonElement(docBundlePrefix = "DatasetExtensions")
@KeywordArgs(
names = ["**columns"],
types = [KeywordArgs::class],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.imdc.extensions.common

import com.inductiveautomation.ignition.common.script.hints.PropertiesFileDocProvider
import com.inductiveautomation.ignition.common.script.hints.ScriptFunctionDocProvider
import com.inductiveautomation.ignition.common.script.typing.CompletionDescriptor
import java.lang.reflect.Method

private val propertiesFileDocProvider = PropertiesFileDocProvider()
Expand All @@ -13,20 +14,23 @@ private val WARNING = """
""".trimIndent()

object ExtensionDocProvider : ScriptFunctionDocProvider by propertiesFileDocProvider {
override fun getMethodDescription(path: String, method: Method): String {
val methodDescription: String? = propertiesFileDocProvider.getMethodDescription(path, method)
override fun getMethodDescriptor(path: String, method: Method): CompletionDescriptor.Method? {
val base = propertiesFileDocProvider.getMethodDescriptor(path, method)

val unsafeAnnotation = method.getAnnotation<UnsafeExtension>()

return buildString {
if (unsafeAnnotation != null) {
return if (unsafeAnnotation != null) {
base?.copy(description = buildString {
append("<html><b>")
append(WARNING)
if (unsafeAnnotation.note.isNotEmpty()) {
append("<br>").append(unsafeAnnotation.note)
}
append("</b><br><br>")
}
append(methodDescription.orEmpty())
append(base.description.orEmpty())
})
} else {
base
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package org.imdc.extensions.common

import com.inductiveautomation.ignition.common.project.Project
import com.inductiveautomation.ignition.common.resourcecollection.ResourceCollection


interface ProjectExtensions {
fun getProject(): Project
fun getProject(): ResourceCollection
}
Loading