From 7855c8abb869ff3cb078d13a9b580565e45851cd Mon Sep 17 00:00:00 2001 From: Zach Harel Date: Thu, 5 Jun 2025 10:55:13 -0400 Subject: [PATCH 01/10] add normalize function for angleType --- .../nextcontrol/feedback/AngularFeedback.kt | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol/feedback/AngularFeedback.kt b/nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol/feedback/AngularFeedback.kt index 0a18e4f..b6d6804 100644 --- a/nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol/feedback/AngularFeedback.kt +++ b/nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol/feedback/AngularFeedback.kt @@ -20,15 +20,23 @@ package dev.nextftc.nextcontrol.feedback import dev.nextftc.nextcontrol.KineticState import kotlin.math.PI +import org.apache.commons.math3.util.MathUtils.normalizeAngle -enum class AngleType(val halfRevolution: Double) { - RADIANS(PI), - DEGREES(180.0), - REVOLUTIONS(0.5) +enum class AngleType(val halfRevolution: Double, val toRadians: Double) { + RADIANS(PI, 1.0), + DEGREES(180.0, PI / 180.0), + REVOLUTIONS(0.5, 2 * PI); + + /** + * Normalizes [angle] to the range [[halfRevolution], [halfRevolution]]. + * + */ + fun normalize(angle: Double) = + normalizeAngle(angle * toRadians, 0.0) / toRadians } /** - * A [FeedbackElement] that wraps another [FeedbackElement] + * A [FeedbackElement] that wraps another [FeedbackElement] for angular positions. */ class AngularFeedback(private val type: AngleType, private val feedbackElement: FeedbackElement) : FeedbackElement { @@ -41,12 +49,7 @@ class AngularFeedback(private val type: AngleType, private val feedbackElement: */ override fun calculate(error: KineticState): Double { return feedbackElement.calculate( - error.copy( - position = ((error.position + type.halfRevolution) % (2 * type.halfRevolution) + 2 * - type.halfRevolution) % (2 * - type.halfRevolution) - - type.halfRevolution - ) + error.copy(position = type.normalize(error.position)) ) } } \ No newline at end of file From d4fb644042317ec67813c682051874c4b120da05 Mon Sep 17 00:00:00 2001 From: Zach Harel Date: Sun, 8 Jun 2025 15:08:14 -0400 Subject: [PATCH 02/10] add kotest --- gradle/libs.versions.toml | 4 ++++ nextcontrol/build.gradle.kts | 3 +++ 2 files changed, 7 insertions(+) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index aad6d7f..037943b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,11 +3,15 @@ [versions] commons-math3 = "3.6.1" +kotest = "5.9.1" nextcontrol = "0.0.0-alpha6" [libraries] commons-math3 = { module = "org.apache.commons:commons-math3", version.ref = "commons-math3" } +kotest-runner = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" } +kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" } +kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" } [plugins] kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version = "2.0.21" } diff --git a/nextcontrol/build.gradle.kts b/nextcontrol/build.gradle.kts index c766a35..8198899 100644 --- a/nextcontrol/build.gradle.kts +++ b/nextcontrol/build.gradle.kts @@ -44,6 +44,9 @@ dependencies { testImplementation("org.jetbrains.kotlin:kotlin-test") testImplementation("io.mockk:mockk:1.13.17") + testImplementation(libs.kotest.runner) + testImplementation(libs.kotest.assertions) + testImplementation(libs.kotest.property) } // Apply a specific Java toolchain to ease working on different environments. From e8b875ec2043f7398f717e79ea458ab1cb4a949f Mon Sep 17 00:00:00 2001 From: Zach Harel Date: Sun, 8 Jun 2025 15:14:19 -0400 Subject: [PATCH 03/10] test fixtures --- nextcontrol/build.gradle.kts | 8 ++++- .../dev/nextftc/nextcontrol/test/Arbs.kt | 30 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 nextcontrol/src/testFixtures/kotlin/dev/nextftc/nextcontrol/test/Arbs.kt diff --git a/nextcontrol/build.gradle.kts b/nextcontrol/build.gradle.kts index 8198899..e678635 100644 --- a/nextcontrol/build.gradle.kts +++ b/nextcontrol/build.gradle.kts @@ -31,6 +31,9 @@ plugins { `java-library` `maven-publish` + + //allows for a test fixture source set (which is published to maven) that is accessible from the test source set + `java-test-fixtures` } repositories { @@ -47,6 +50,9 @@ dependencies { testImplementation(libs.kotest.runner) testImplementation(libs.kotest.assertions) testImplementation(libs.kotest.property) + testFixturesImplementation(libs.kotest.runner) + testFixturesImplementation(libs.kotest.assertions) + testFixturesImplementation(libs.kotest.property) } // Apply a specific Java toolchain to ease working on different environments. @@ -75,4 +81,4 @@ publishing { url = uri("../../maven.rowanmcalpin.com") } } -} \ No newline at end of file +} diff --git a/nextcontrol/src/testFixtures/kotlin/dev/nextftc/nextcontrol/test/Arbs.kt b/nextcontrol/src/testFixtures/kotlin/dev/nextftc/nextcontrol/test/Arbs.kt new file mode 100644 index 0000000..2efc682 --- /dev/null +++ b/nextcontrol/src/testFixtures/kotlin/dev/nextftc/nextcontrol/test/Arbs.kt @@ -0,0 +1,30 @@ +/* + * NextFTC: a user-friendly control library for FIRST Tech Challenge + * Copyright (C) 2025 Rowan McAlpin + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package dev.nextftc.nextcontrol.test + +import dev.nextftc.nextcontrol.KineticState +import io.kotest.property.arbitrary.arbitrary + +val kineticStateGen = arbitrary { + KineticState( + it.random.nextDouble(), + it.random.nextDouble(), + it.random.nextDouble() + ) +} \ No newline at end of file From 5ed264440b7b59dd25e077dccc97f4f9beedd4d2 Mon Sep 17 00:00:00 2001 From: Zach Harel Date: Sun, 8 Jun 2025 15:18:21 -0400 Subject: [PATCH 04/10] test kinetic states using kotest --- .../nextftc/nextcontrol/KineticStateTest.kt | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 nextcontrol/src/test/java/dev/nextftc/nextcontrol/KineticStateTest.kt diff --git a/nextcontrol/src/test/java/dev/nextftc/nextcontrol/KineticStateTest.kt b/nextcontrol/src/test/java/dev/nextftc/nextcontrol/KineticStateTest.kt new file mode 100644 index 0000000..43effca --- /dev/null +++ b/nextcontrol/src/test/java/dev/nextftc/nextcontrol/KineticStateTest.kt @@ -0,0 +1,132 @@ +/* + * NextFTC: a user-friendly control library for FIRST Tech Challenge + * Copyright (C) 2025 Rowan McAlpin + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package dev.nextftc.nextcontrol + +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.shouldBe +import io.kotest.property.Arb +import io.kotest.property.arbitrary.double +import io.kotest.property.checkAll +import dev.nextftc.nextcontrol.test.kineticStateGen + +class KineticStateTest : FunSpec({ + + context("KineticState constructor") { + test("default values should be zeros") { + val state = KineticState() + state.position shouldBe 0.0 + state.velocity shouldBe 0.0 + state.acceleration shouldBe 0.0 + } + + test("constructor should set values correctly") { + val state = KineticState(1.0, 2.0, 3.0) + state.position shouldBe 1.0 + state.velocity shouldBe 2.0 + state.acceleration shouldBe 3.0 + } + + test("partial constructor should set provided values and default others") { + val state = KineticState(position = 1.0) + state.position shouldBe 1.0 + state.velocity shouldBe 0.0 + state.acceleration shouldBe 0.0 + + val state2 = KineticState(position = 1.0, velocity = 2.0) + state2.position shouldBe 1.0 + state2.velocity shouldBe 2.0 + state2.acceleration shouldBe 0.0 + } + } + + context("KineticState operators") { + test("plus operator should add components") { + val state1 = KineticState(1.0, 2.0, 3.0) + val state2 = KineticState(4.0, 5.0, 6.0) + val result = state1 + state2 + + result.position shouldBe 5.0 + result.velocity shouldBe 7.0 + result.acceleration shouldBe 9.0 + } + + test("minus operator should subtract components") { + val state1 = KineticState(5.0, 7.0, 9.0) + val state2 = KineticState(1.0, 2.0, 3.0) + val result = state1 - state2 + + result.position shouldBe 4.0 + result.velocity shouldBe 5.0 + result.acceleration shouldBe 6.0 + } + + test("times operator should multiply by scalar") { + val state = KineticState(1.0, 2.0, 3.0) + val scalar = 2.0 + val result = state * scalar + + result.position shouldBe 2.0 + result.velocity shouldBe 4.0 + result.acceleration shouldBe 6.0 + } + } + + context("Property-based testing") { + test("plus is commutative") { + checkAll(kineticStateGen, kineticStateGen) { a, b -> + val result1 = a + b + val result2 = b + a + + result1.position shouldBe result2.position + result1.velocity shouldBe result2.velocity + result1.acceleration shouldBe result2.acceleration + } + } + + test("plus and minus are inverse operations") { + checkAll(kineticStateGen, kineticStateGen) { a, b -> + val result = (a + b) - b + + result.position shouldBe a.position + result.velocity shouldBe a.velocity + result.acceleration shouldBe a.acceleration + } + } + + test("multiplying by 1 doesn't change the state") { + checkAll(kineticStateGen) { state -> + val result = state * 1.0 + + result.position shouldBe state.position + result.velocity shouldBe state.velocity + result.acceleration shouldBe state.acceleration + } + } + + test("multiplying by 0 results in all zeros") { + checkAll(kineticStateGen) { state -> + val result = state * 0.0 + + result.position shouldBe 0.0 + result.velocity shouldBe 0.0 + result.acceleration shouldBe 0.0 + } + } + } +}) \ No newline at end of file From e4a2e4e57552878cf31c7d21c4a5289450e05400 Mon Sep 17 00:00:00 2001 From: Davis Luxenberg <74377508+BeepBot99@users.noreply.github.com> Date: Mon, 9 Jun 2025 16:28:58 -0500 Subject: [PATCH 05/10] Merge pull request #3: single module project setup + maven central publishing --- .gitattributes | 12 -- .github/workflows/deploy-release.yml | 28 ++++ .github/workflows/deploy-snapshot.yml | 27 ++++ .gitignore | 47 ++++++- .idea/.gitignore | 2 + .idea/.name | 1 + .idea/AndroidProjectSystem.xml | 6 + .idea/compiler.xml | 6 - .idea/copyright/NextFTC_Copyright.xml | 6 - .idea/copyright/profiles_settings.xml | 7 - .idea/gradle.xml | 4 +- .idea/kotlin-statistics.xml | 6 - .idea/kotlinc.xml | 2 +- .idea/misc.xml | 5 +- .idea/runConfigurations.xml | 17 --- ...kotlin-compiler-4566496875608200174.salive | 0 LICENSE | 2 +- README.md | 108 ++++++++++++++++ build.gradle.kts | 81 ++++++++++++ gradle.properties | 27 +--- gradle/libs.versions.toml | 19 +-- gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 23 +--- gradlew | 63 ++++----- gradlew.bat | 37 +++--- nextcontrol/build.gradle.kts | 84 ------------ .../dev/nextftc/nextcontrol/utils/TimeUtil.kt | 23 ---- .../feedback/AngularFeedbackTest.kt | 87 ------------- .../dev/nextftc/nextcontrol/test/Arbs.kt | 30 ----- settings.gradle.kts | 30 +---- .../dev/nextftc/control}/ControlSystem.kt | 14 +- .../dev/nextftc/control}/KineticState.kt | 2 +- .../control}/builder/ControlSystemBuilder.kt | 50 ++++--- .../control}/builder/ElementBuilders.kt | 17 +-- .../control}/feedback/AngularFeedback.kt | 10 +- .../control}/feedback/BangBangElement.kt | 5 +- .../control}/feedback/FeedbackElement.kt | 4 +- .../nextftc/control}/feedback/PIDElement.kt | 39 +++--- .../nextftc/control}/feedback/SquIDElement.kt | 37 +++--- .../control}/feedforward/BasicFeedforward.kt | 4 +- .../feedforward/FeedforwardElement.kt | 4 +- .../feedforward/GravityFeedforwardElements.kt | 4 +- .../nextftc/control}/filters/ChainedFilter.kt | 2 +- .../dev/nextftc/control}/filters/Filter.kt | 2 +- .../nextftc/control}/filters/FilterElement.kt | 4 +- .../nextftc/control}/filters/LowPassFilter.kt | 2 +- .../interpolators/FirstOrderEMAParameters.kt | 4 +- .../interpolators/InterpolatorElement.kt | 4 +- .../test/kotlin}/ControlSystemTest.kt | 20 +-- .../test/kotlin}/KineticStateTest.kt | 82 ++++++------ .../kotlin/feedback/AngularFeedbackTest.kt | 85 ++++++++++++ .../test/kotlin}/feedback/NullFeedbackTest.kt | 15 ++- .../test/kotlin}/feedback/PIDElementTest.kt | 122 +++++++++--------- .../test/kotlin}/feedback/SquIDElementTest.kt | 122 +++++++++--------- .../kotlin}/feedforward/ArmFeedforwardTest.kt | 27 ++-- .../feedforward/BasicFeedforwardTest.kt | 24 ++-- .../feedforward/ElevatorFeedforwardTest.kt | 22 ++-- .../feedforward/NullFeedforwardTest.kt | 13 +- .../test/kotlin}/filters/ChainedFilterTest.kt | 18 +-- .../test/kotlin}/filters/FilterElementTest.kt | 33 ++--- .../test/kotlin}/filters/LowPassFilterTest.kt | 49 +++---- .../test/kotlin}/filters/NullFilterTest.kt | 10 +- .../interpolators/ConstantInterpolatorTest.kt | 15 ++- .../FirstOrderEMAInterpolatorTest.kt | 32 ++--- 64 files changed, 862 insertions(+), 825 deletions(-) delete mode 100644 .gitattributes create mode 100644 .github/workflows/deploy-release.yml create mode 100644 .github/workflows/deploy-snapshot.yml create mode 100644 .idea/.name create mode 100644 .idea/AndroidProjectSystem.xml delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/copyright/NextFTC_Copyright.xml delete mode 100644 .idea/copyright/profiles_settings.xml delete mode 100644 .idea/kotlin-statistics.xml delete mode 100644 .idea/runConfigurations.xml delete mode 100644 .kotlin/sessions/kotlin-compiler-4566496875608200174.salive create mode 100644 README.md create mode 100644 build.gradle.kts mode change 100755 => 100644 gradlew delete mode 100644 nextcontrol/build.gradle.kts delete mode 100644 nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol/utils/TimeUtil.kt delete mode 100644 nextcontrol/src/test/java/dev/nextftc/nextcontrol/feedback/AngularFeedbackTest.kt delete mode 100644 nextcontrol/src/testFixtures/kotlin/dev/nextftc/nextcontrol/test/Arbs.kt rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/ControlSystem.kt (91%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/KineticState.kt (98%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/builder/ControlSystemBuilder.kt (70%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/builder/ElementBuilders.kt (81%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/feedback/AngularFeedback.kt (87%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/feedback/BangBangElement.kt (94%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/feedback/FeedbackElement.kt (94%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/feedback/PIDElement.kt (74%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/feedback/SquIDElement.kt (72%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/feedforward/BasicFeedforward.kt (96%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/feedforward/FeedforwardElement.kt (94%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/feedforward/GravityFeedforwardElements.kt (97%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/filters/ChainedFilter.kt (97%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/filters/Filter.kt (96%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/filters/FilterElement.kt (95%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/filters/LowPassFilter.kt (98%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/interpolators/FirstOrderEMAParameters.kt (95%) rename {nextcontrol/src/main/kotlin/dev/nextftc/nextcontrol => src/main/kotlin/dev/nextftc/control}/interpolators/InterpolatorElement.kt (94%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/ControlSystemTest.kt (90%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/KineticStateTest.kt (76%) create mode 100644 src/test/kotlin/feedback/AngularFeedbackTest.kt rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/feedback/NullFeedbackTest.kt (83%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/feedback/PIDElementTest.kt (74%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/feedback/SquIDElementTest.kt (74%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/feedforward/ArmFeedforwardTest.kt (83%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/feedforward/BasicFeedforwardTest.kt (84%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/feedforward/ElevatorFeedforwardTest.kt (85%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/feedforward/NullFeedforwardTest.kt (83%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/filters/ChainedFilterTest.kt (81%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/filters/FilterElementTest.kt (80%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/filters/LowPassFilterTest.kt (76%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/filters/NullFilterTest.kt (83%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/interpolators/ConstantInterpolatorTest.kt (80%) rename {nextcontrol/src/test/java/dev/nextftc/nextcontrol => src/test/kotlin}/interpolators/FirstOrderEMAInterpolatorTest.kt (78%) diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index f91f646..0000000 --- a/.gitattributes +++ /dev/null @@ -1,12 +0,0 @@ -# -# https://help.github.com/articles/dealing-with-line-endings/ -# -# Linux start script should use lf -/gradlew text eol=lf - -# These are Windows script files and should use crlf -*.bat text eol=crlf - -# Binary files should be left untouched -*.jar binary - diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml new file mode 100644 index 0000000..08f8dfb --- /dev/null +++ b/.github/workflows/deploy-release.yml @@ -0,0 +1,28 @@ +name: Deploy Release + +on: + release: + types: [released, prereleased] + +jobs: + deploy-release: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + - name: Grant execute permission + run: chmod +x gradlew + - name: Deploy to Maven Central + run: ./gradlew deployCentralPortal -Pversion=$VERSION + env: + MVN_GPG_KEY: ${{ secrets.MVN_GPG_KEY }} + MVN_GPG_PASSWORD: ${{ secrets.MVN_GPG_PASSWORD }} + SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} + SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} + VERSION: ${{ github.event.release.tag_name }} \ No newline at end of file diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml new file mode 100644 index 0000000..8307c9b --- /dev/null +++ b/.github/workflows/deploy-snapshot.yml @@ -0,0 +1,27 @@ +name: Deploy Snapshot + +on: + push: + branches: [develop] + +jobs: + deploy-snapshot: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + - name: Grant execute permission + run: chmod +x gradlew + - name: Deploy Snapshot + run: ./gradlew deployNexusSnapshot + env: + MVN_GPG_KEY: ${{ secrets.MVN_GPG_KEY }} + MVN_GPG_PASSWORD: ${{ secrets.MVN_GPG_PASSWORD }} + SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} + SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index a7c6327..b1dff0d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,45 @@ -# Ignore Gradle project-specific cache directory .gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ -# Ignore Gradle build output directory -build -/local.properties +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Kotlin ### +.kotlin + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore index 13566b8..7bc07ec 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -3,6 +3,8 @@ /workspace.xml # Editor-based HTTP Client requests /httpRequests/ +# Environment-dependent path to Maven home directory +/mavenHomeManager.xml # Datasource local storage ignored files /dataSources/ /dataSources.local.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..d36af14 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +control \ No newline at end of file diff --git a/.idea/AndroidProjectSystem.xml b/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..4a53bee --- /dev/null +++ b/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 61a9130..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/copyright/NextFTC_Copyright.xml b/.idea/copyright/NextFTC_Copyright.xml deleted file mode 100644 index 3482a61..0000000 --- a/.idea/copyright/NextFTC_Copyright.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml deleted file mode 100644 index 3732b80..0000000 --- a/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 68b8616..2a65317 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,13 +4,11 @@