diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml
index c88dd30..0371308 100644
--- a/.github/workflows/pr-build.yml
+++ b/.github/workflows/pr-build.yml
@@ -12,3 +12,8 @@ jobs:
cache: 'gradle'
- name: Build
run: ./gradlew build
+ - name: Upload Unsigned Module
+ uses: actions/upload-artifact@v3
+ with:
+ name: ignition-extensions-unsigned
+ path: build/Ignition-Extensions.unsigned.modl
diff --git a/LICENSE.html b/LICENSE.html
deleted file mode 100644
index 04e615a..0000000
--- a/LICENSE.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
MIT License
-
Copyright (c) 2023 Ignition Module Development Community
-
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
- documentation files (the "Software"), to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
- to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
The above copyright notice and this permission notice shall be included in all copies or substantial portions of
- the Software.
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
- THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..b621290
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,13 @@
+MIT License
+Copyright (c) 2023 Ignition Module Development Community
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
+to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/build.gradle.kts b/build.gradle.kts
index 692944a..f98efa4 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -22,7 +22,7 @@ ignitionModule {
id.set("org.imdc.extensions.IgnitionExtensions")
moduleVersion.set("${project.version}")
moduleDescription.set("Useful but niche extensions to Ignition for power users")
- license.set("LICENSE.html")
+ license.set("LICENSE.txt")
requiredIgnitionVersion.set(libs.versions.ignition)
projectScopes.putAll(
diff --git a/common/src/main/kotlin/org/imdc/extensions/common/TagExtensions.kt b/common/src/main/kotlin/org/imdc/extensions/common/TagExtensions.kt
new file mode 100644
index 0000000..589e9be
--- /dev/null
+++ b/common/src/main/kotlin/org/imdc/extensions/common/TagExtensions.kt
@@ -0,0 +1,63 @@
+package org.imdc.extensions.common
+
+import com.inductiveautomation.ignition.common.config.PyTagDictionary
+import com.inductiveautomation.ignition.common.config.PyTagList
+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.tags.config.TagConfigurationModel
+import com.inductiveautomation.ignition.common.tags.model.TagPath
+import com.inductiveautomation.ignition.common.tags.paths.parser.TagPathParser
+import org.python.core.PyDictionary
+import org.python.core.PyObject
+
+abstract class TagExtensions {
+ @UnsafeExtension
+ @ScriptFunction(docBundlePrefix = "TagExtensions")
+ @KeywordArgs(
+ names = ["basePath", "recursive"],
+ types = [String::class, Boolean::class],
+ )
+ fun getLocalConfiguration(args: Array