From 742b7f95ae68f96c17a325d16f971283247928b1 Mon Sep 17 00:00:00 2001 From: eldcn Date: Sun, 2 Jun 2024 13:09:53 +0200 Subject: [PATCH 1/3] Detekt (#18) # Add Detekt Fixes #6 - Adds Detekt in the project - Configures github action on pull requests - Add pre-commit detekt git hook - Add internal guide to setup detekt plugin locally and pre-commit hook installation ## :gear: Release Notes *Add a bullet point list summary of the feature and possible migration guides if this is a breaking change so this section can be added to the release notes.* *Include code snippets that provide examples of the feature implemented or links to the documentation if it appends or changes the public interface.* ## :books: Documentation *Please ensure that you properly document any additions in conformance to [Spezi Documentation Guide](https://github.com/StanfordSpezi/.github/blob/main/DOCUMENTATIONGUIDE.md).* *You can use this section to describe your solution, but we encourage contributors to document your reasoning and changes using in-line documentation.* ## :white_check_mark: Testing *Please ensure that the PR meets the testing requirements set by CodeCov and that new functionality is appropriately tested.* *This section describes important information about the tests and why some elements might not be testable.* ## :pencil: Code of Conduct & Contributing Guidelines By submitting creating this pull request, you agree to follow our [Code of Conduct](https://github.com/StanfordSpezi/.github/blob/main/CODE_OF_CONDUCT.md) and [Contributing Guidelines](https://github.com/StanfordSpezi/.github/blob/main/CONTRIBUTING.md): - [ ] I agree to follow the [Code of Conduct](https://github.com/StanfordSpezi/.github/blob/main/CODE_OF_CONDUCT.md) and [Contributing Guidelines](https://github.com/StanfordSpezi/.github/blob/main/CONTRIBUTING.md). --- .github/workflows/android.yml | 102 --- .github/workflows/build-and-test.yml | 60 ++ .github/workflows/main.yml | 49 ++ app/build.gradle.kts | 2 +- .../spezi/app/ExampleInstrumentedTest.kt | 22 - .../edu/stanford/spezi/app/MainActivity.kt | 4 +- .../edu/stanford/spezi/app/MainApplication.kt | 2 +- .../spezi/app/bluetooth/BluetoothViewModel.kt | 2 +- .../data/mapper/BluetoothUiStateMapper.kt | 2 +- .../bluetooth/data/models/DeviceUiModel.kt | 2 +- .../app/bluetooth/screen/BluetoothScreen.kt | 3 +- .../app/bluetooth/BluetoothViewModelTest.kt | 2 +- .../data/mapper/BluetoothUiStateMapperTest.kt | 2 +- build-logic/convention/build.gradle.kts | 2 +- .../extensions/DependencyHandler.kt | 2 +- .../logic/convention/extensions/Project.kt | 2 +- .../build/logic/convention/model/PluginId.kt | 2 +- .../plugins/HiltConventionPlugin.kt | 2 +- .../plugins/SpeziAbstractConfigPlugin.kt | 2 +- .../SpeziApplicationConventionPlugin.kt | 2 +- .../SpeziBaseConfigConventionPlugin.kt | 2 +- .../plugins/SpeziComposeConventionPlugin.kt | 2 +- .../plugins/SpeziLibraryConventionPlugin.kt | 2 +- build-logic/settings.gradle.kts | 2 +- build.gradle.kts | 66 +- core/bluetooth/build.gradle.kts | 2 +- .../data/mapper/BloodPressureMapper.kt | 3 +- .../data/mapper/MeasurementMapper.kt | 2 +- .../data/mapper/WeightMeasurementMapper.kt | 26 +- .../bluetooth/data/model/BLEDeviceSession.kt | 4 +- .../bluetooth/data/model/BLEServiceEvent.kt | 2 +- .../bluetooth/data/model/BLEServiceState.kt | 2 +- .../bluetooth/data/model/BLEServiceType.kt | 4 +- .../core/bluetooth/data/model/Measurement.kt | 8 +- .../bluetooth/data/model/SupportedServices.kt | 2 +- .../core/bluetooth/di/BluetoothModule.kt | 2 +- .../bluetooth/domain/BLEDeviceConnector.kt | 2 +- .../core/bluetooth/domain/BLEDeviceScanner.kt | 4 +- .../core/bluetooth/domain/BLEServiceImpl.kt | 2 +- .../data/mapper/BloodPressureMapperTest.kt | 2 +- .../data/mapper/MeasurementMapperTest.kt | 2 +- .../mapper/WeightMeasurementMapperTest.kt | 2 +- .../data/model/BLEServiceTypeTest.kt | 2 +- .../domain/BLEDeviceConnectorTest.kt | 2 +- .../bluetooth/domain/BLEDeviceScannerTest.kt | 2 +- .../core/bluetooth/domain/BLEServiceTest.kt | 2 +- core/coroutines/build.gradle.kts | 2 +- .../core/coroutines/DispatchersProvider.kt | 2 +- .../core/coroutines/di/CoroutinesModule.kt | 4 +- .../coroutines/di/CoroutinesModuleTest.kt | 2 +- core/design/build.gradle.kts | 2 +- .../core/design/ExampleInstrumentedTest.kt | 22 - .../spezi/core/design/SpeziButtonKtTest.kt | 2 +- .../core/design/component/SpeziButton.kt | 1 - .../spezi/core/design/theme/Colors.kt | 4 +- .../stanford/spezi/core/design/theme/Sizes.kt | 2 +- .../spezi/core/design/theme/Spacings.kt | 2 +- .../spezi/core/design/theme/SpeziKtTheme.kt | 4 +- .../spezi/core/design/theme/TextStyles.kt | 2 +- .../spezi/core/design/ExampleUnitTest.kt | 2 +- core/logging/build.gradle.kts | 2 +- .../edu/stanford/spezi/core/logging/Api.kt | 2 +- .../spezi/core/logging/SpeziLogger.kt | 2 +- .../spezi/core/logging/internal/LogLogger.kt | 2 +- .../core/logging/internal/PrintLogger.kt | 4 +- .../core/logging/internal/TimberLogger.kt | 2 +- .../spezi/core/logging/internal/_Logger.kt | 3 +- .../spezi/core/logging/models/LoggerConfig.kt | 1 - .../core/logging/models/LoggingStrategy.kt | 4 +- .../spezi/core/logging/SpeziLoggerTest.kt | 2 +- core/testing/build.gradle.kts | 2 +- .../spezi/core/testing/CoroutineTestRule.kt | 4 +- .../edu/stanford/spezi/core/testing/Mockk.kt | 5 +- .../stanford/spezi/core/testing/RunTest.kt | 2 +- .../spezi/core/testing/SpeziTestScope.kt | 3 +- .../core/testing/TestDispatchersProvider.kt | 2 +- core/utils/build.gradle.kts | 2 +- .../stanford/spezi/core/utils/Typealiases.kt | 3 +- .../edu/stanford/spezi/core/utils/UUID.kt | 2 +- .../spezi/core/utils/extensions/List.kt | 2 +- gradle/libs.versions.toml | 5 +- gradle/tasks/git-hooks.gradle.kts | 25 + gradlew | 0 internal/detekt-config.yml | 756 ++++++++++++++++++ internal/git-hooks/pre-commit.sh | 13 + internal/guides/Detekt.md | 89 +++ internal/guides/resources/code_style.png | Bin 0 -> 126521 bytes internal/guides/resources/detekt_config.png | Bin 0 -> 76146 bytes .../resources/gradle_installgithooks.png | Bin 0 -> 48141 bytes internal/spezi_code_style.xml | 82 ++ modules/contact/build.gradle.kts | 2 +- .../spezi/modules/contact/ContactFactory.kt | 15 +- .../modules/contact/ContactScreenTest.kt | 10 +- .../spezi/modules/contact/TestActivity.kt | 2 +- .../spezi/modules/contact/ContactScreen.kt | 7 +- .../spezi/modules/contact/ContactViewModel.kt | 2 +- .../spezi/modules/contact/OnAction.kt | 2 +- .../contact/component/ContactOptionCard.kt | 2 +- .../contact/component/NavigationCard.kt | 2 +- .../spezi/modules/contact/model/Contact.kt | 6 +- .../contact/repository/ContactRepository.kt | 4 +- ...est.kt => DefaultContactRepositoryTest.kt} | 6 +- modules/onboarding/build.gradle.kts | 2 +- .../modules/onboarding/OnboardingScreen.kt | 3 +- 104 files changed, 1276 insertions(+), 284 deletions(-) delete mode 100644 .github/workflows/android.yml create mode 100644 .github/workflows/build-and-test.yml create mode 100644 .github/workflows/main.yml delete mode 100644 app/src/androidTest/kotlin/edu/stanford/spezi/app/ExampleInstrumentedTest.kt delete mode 100644 core/design/src/androidTest/kotlin/edu/stanford/spezi/core/design/ExampleInstrumentedTest.kt create mode 100644 gradle/tasks/git-hooks.gradle.kts mode change 100644 => 100755 gradlew create mode 100644 internal/detekt-config.yml create mode 100644 internal/git-hooks/pre-commit.sh create mode 100644 internal/guides/Detekt.md create mode 100644 internal/guides/resources/code_style.png create mode 100644 internal/guides/resources/detekt_config.png create mode 100644 internal/guides/resources/gradle_installgithooks.png create mode 100644 internal/spezi_code_style.xml rename modules/contact/src/test/kotlin/edu/stanford/spezi/modules/contact/{ContactRepositoryTest.kt => DefaultContactRepositoryTest.kt} (84%) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml deleted file mode 100644 index 38b8bf71b..000000000 --- a/.github/workflows/android.yml +++ /dev/null @@ -1,102 +0,0 @@ -name: Android CI - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -concurrency: - group: build-${{ github.ref }} - cancel-in-progress: true - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - cache: gradle - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Build with Gradle - run: ./gradlew build - - - name: Archive production artifacts - uses: actions/upload-artifact@v2 - with: - name: app - path: app/build/outputs/apk/ - - test: - runs-on: ubuntu-latest - needs: build - steps: - - name: Checkout code - uses: actions/checkout@v4.1.0 - - name: Set up JDK 17 - uses: actions/setup-java@v3.13.0 - with: - distribution: 'adopt' - java-version: '17' - - - name: Grant execute permissions for gradlew - run: chmod +x ./gradlew - - - name: Run Tests with Gradle - run: ./gradlew test - - lint: - runs-on: ubuntu-latest - needs: build - steps: - - name: Checkout code - uses: actions/checkout@v4.1.0 - - name: Set up JDK 17 - uses: actions/setup-java@v3.13.0 - with: - distribution: 'temurin' - java-version: '17' - cache: gradle - - - name: Grant execute permissions for gradlew - run: chmod +x ./gradlew - - name: Run Lint with Gradle - run: ./gradlew lint - - name: Upload lint results - uses: actions/upload-artifact@v2 - with: - name: lint-results - path: '**/build/reports/lint-results-*.html' - - dokka: - runs-on: ubuntu-latest - needs: [ build, test ] - steps: - - name: Checkout code - uses: actions/checkout@v4.1.0 - - - name: Set up JDK 17 - uses: actions/setup-java@v3.13.0 - with: - distribution: 'temurin' - java-version: '17' - cache: gradle - - - name: Grant execute permissions for gradlew - run: chmod +x ./gradlew - - name: Run Dokka with Gradle - run: ./gradlew dokkaHtmlMultiModule - - - name: Deploy to GitHub Pages - uses: JamesIves/github-pages-deploy-action@v4 - with: - branch: gh-pages - folder: build/dokka/htmlMultiModule \ No newline at end of file diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml new file mode 100644 index 000000000..ec2ee2e6e --- /dev/null +++ b/.github/workflows/build-and-test.yml @@ -0,0 +1,60 @@ +name: Pull Request + +on: + pull_request: + branches: [ "main" ] + +concurrency: + group: build-${{ github.ref }} + cancel-in-progress: true + +jobs: + detekt: + name: Detekt review + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4.1.0 + with: + fetch-depth: 1 + ref: ${{ github.head_ref }} + - name: Detekt PR Check + uses: alaegin/Detekt-Action@v1.23.6 + with: + reviewdog_reporter: github-pr-check + github_token: ${{ secrets.github_token }} + fail_on_error: true + detekt_config: internal/detekt-config.yml + + buildtestanalyze: + name: Build, test and analyze + runs-on: ubuntu-latest + timeout-minutes: 120 + permissions: # needed for CodeQL steps + security-events: write + packages: read + actions: read + contents: read + + steps: + - name: Checkout code + uses: actions/checkout@v4.1.0 + - name: Initialize CodeQL # CodeQL init should happen before project build! + uses: github/codeql-action/init@v3 + with: + languages: java-kotlin + build-mode: manual + - name: Set up JDK 17 + uses: actions/setup-java@v3.13.0 + with: + distribution: 'temurin' + java-version: '17' + cache: gradle + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 + - name: Build and test + run: ./gradlew build + - name: Perform CodeQL Analysis # CodeQL analysis needs project build! + uses: github/codeql-action/analyze@v3 + with: + category: "/language:java-kotlin" diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..0e52b4925 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,49 @@ +name: Merge + +on: + push: + branches: [ "main" ] + +concurrency: + group: build-${{ github.ref }} + cancel-in-progress: true + +jobs: + buildtestanalyze: + uses: ./.github/workflows/build-and-test.yml + secrets: inherit + + uploadartifacts: + name: Archive production artifacts + runs-on: ubuntu-latest + needs: buildtestanalyze + steps: + - name: Checkout code + uses: actions/checkout@v4.1.0 + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: app + path: app/build/outputs/apk/ + + dokka: + runs-on: ubuntu-latest + needs: buildtestanalyze + steps: + - name: Checkout code + uses: actions/checkout@v4.1.0 + - name: Set up JDK 17 + uses: actions/setup-java@v3.13.0 + with: + distribution: 'temurin' + java-version: '17' + cache: gradle + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 + - name: Run Dokka with Gradle + run: ./gradlew dokkaHtmlMultiModule + - name: Deploy to GitHub Pages + uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: gh-pages + folder: build/dokka/htmlMultiModule diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 82d3b0a61..934657ac6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -36,4 +36,4 @@ dependencies { implementation(libs.hilt.navigation.compose) implementation(project(":core:bluetooth")) -} \ No newline at end of file +} diff --git a/app/src/androidTest/kotlin/edu/stanford/spezi/app/ExampleInstrumentedTest.kt b/app/src/androidTest/kotlin/edu/stanford/spezi/app/ExampleInstrumentedTest.kt deleted file mode 100644 index baf2c0341..000000000 --- a/app/src/androidTest/kotlin/edu/stanford/spezi/app/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package edu.stanford.spezi.app - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.assertEquals -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("edu.stanford.spezi.app", appContext.packageName) - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/edu/stanford/spezi/app/MainActivity.kt b/app/src/main/kotlin/edu/stanford/spezi/app/MainActivity.kt index 17ea9fcaf..5deaf237b 100644 --- a/app/src/main/kotlin/edu/stanford/spezi/app/MainActivity.kt +++ b/app/src/main/kotlin/edu/stanford/spezi/app/MainActivity.kt @@ -13,8 +13,8 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) setContent { SpeziTheme { - BluetoothScreen() + BluetoothScreen() } } } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/edu/stanford/spezi/app/MainApplication.kt b/app/src/main/kotlin/edu/stanford/spezi/app/MainApplication.kt index df674256a..9cddacef5 100644 --- a/app/src/main/kotlin/edu/stanford/spezi/app/MainApplication.kt +++ b/app/src/main/kotlin/edu/stanford/spezi/app/MainApplication.kt @@ -12,4 +12,4 @@ class MainApplication : Application() { SpeziLogger.setLoggingEnabled(enabled = BuildConfig.DEBUG) } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/BluetoothViewModel.kt b/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/BluetoothViewModel.kt index deef80c7d..7cda4e2b3 100644 --- a/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/BluetoothViewModel.kt +++ b/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/BluetoothViewModel.kt @@ -72,4 +72,4 @@ class BluetoothViewModel @Inject internal constructor( object EnableBluetooth : Event data class RequestPermissions(val permissions: List) : Event } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/data/mapper/BluetoothUiStateMapper.kt b/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/data/mapper/BluetoothUiStateMapper.kt index 43688f560..be7248ec7 100644 --- a/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/data/mapper/BluetoothUiStateMapper.kt +++ b/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/data/mapper/BluetoothUiStateMapper.kt @@ -30,4 +30,4 @@ class BluetoothUiStateMapper @Inject constructor() { } private fun format(value: Number?): String = String.format(Locale.US, "%.2f", value) -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/data/models/DeviceUiModel.kt b/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/data/models/DeviceUiModel.kt index 3a7ff1ab7..792e9bb74 100644 --- a/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/data/models/DeviceUiModel.kt +++ b/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/data/models/DeviceUiModel.kt @@ -4,4 +4,4 @@ data class DeviceUiModel( val address: String, val measurementsCount: Int, val summary: String, -) \ No newline at end of file +) diff --git a/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/screen/BluetoothScreen.kt b/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/screen/BluetoothScreen.kt index 69cb548fd..7aad644cd 100644 --- a/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/screen/BluetoothScreen.kt +++ b/app/src/main/kotlin/edu/stanford/spezi/app/bluetooth/screen/BluetoothScreen.kt @@ -71,7 +71,6 @@ private fun AdditionalInfo(uiState: BluetoothUiState) { Text(text = text) } - @Composable fun DeviceComposable(device: DeviceUiModel) { ElevatedCard(modifier = Modifier.fillMaxWidth()) { @@ -102,4 +101,4 @@ private fun BluetoothEvents(events: Flow) { } } } -} \ No newline at end of file +} diff --git a/app/src/test/kotlin/edu/stanford/spezi/app/bluetooth/BluetoothViewModelTest.kt b/app/src/test/kotlin/edu/stanford/spezi/app/bluetooth/BluetoothViewModelTest.kt index 0e890b2cc..b271f56ec 100644 --- a/app/src/test/kotlin/edu/stanford/spezi/app/bluetooth/BluetoothViewModelTest.kt +++ b/app/src/test/kotlin/edu/stanford/spezi/app/bluetooth/BluetoothViewModelTest.kt @@ -189,4 +189,4 @@ class BluetoothViewModelTest { uiStateMapper = uiStateMapper ) } -} \ No newline at end of file +} diff --git a/app/src/test/kotlin/edu/stanford/spezi/app/bluetooth/data/mapper/BluetoothUiStateMapperTest.kt b/app/src/test/kotlin/edu/stanford/spezi/app/bluetooth/data/mapper/BluetoothUiStateMapperTest.kt index bdefe5333..0f9b05f2d 100644 --- a/app/src/test/kotlin/edu/stanford/spezi/app/bluetooth/data/mapper/BluetoothUiStateMapperTest.kt +++ b/app/src/test/kotlin/edu/stanford/spezi/app/bluetooth/data/mapper/BluetoothUiStateMapperTest.kt @@ -87,4 +87,4 @@ class BluetoothUiStateMapperTest { const val WEIGHT = 4.56 const val ADDRESS = "some device address" } -} \ No newline at end of file +} diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index b79cc93e0..39020075d 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -48,4 +48,4 @@ gradlePlugin { conventionPlugin(id = "hilt", className = "HiltConventionPlugin") conventionPlugin(id = "library", className = "SpeziLibraryConventionPlugin") } -} \ No newline at end of file +} diff --git a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/extensions/DependencyHandler.kt b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/extensions/DependencyHandler.kt index 1fc3f96e2..28adcd2e5 100644 --- a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/extensions/DependencyHandler.kt +++ b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/extensions/DependencyHandler.kt @@ -16,4 +16,4 @@ internal fun DependencyHandler.debugImplementation(dependency: Any) { internal fun DependencyHandler.androidTestImplementation(dependency: Any) { add("androidTestImplementation", dependency) -} \ No newline at end of file +} diff --git a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/extensions/Project.kt b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/extensions/Project.kt index 9f5aa08b7..e527396bd 100644 --- a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/extensions/Project.kt +++ b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/extensions/Project.kt @@ -34,4 +34,4 @@ internal fun Project.commonExtensions(configBlock: CommonExtension<*,*,*,*,*,*>. isLibrary() -> extension(configBlock) else -> error("commonExtensions was called before setting the module type plugin") } -} \ No newline at end of file +} diff --git a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/model/PluginId.kt b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/model/PluginId.kt index 6bee74d3e..79e659e0d 100644 --- a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/model/PluginId.kt +++ b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/model/PluginId.kt @@ -7,4 +7,4 @@ enum class PluginId(val id: String) { HILT(id = "com.google.dagger.hilt.android"), KSP(id = "com.google.devtools.ksp"), COMPOSE_COMPILER("org.jetbrains.kotlin.plugin.compose") -} \ No newline at end of file +} diff --git a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/HiltConventionPlugin.kt b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/HiltConventionPlugin.kt index 16242b876..4cf7a4cf4 100644 --- a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/HiltConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/HiltConventionPlugin.kt @@ -29,4 +29,4 @@ class HiltConventionPlugin : Plugin { enableAggregatingTask = true } } -} \ No newline at end of file +} diff --git a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziAbstractConfigPlugin.kt b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziAbstractConfigPlugin.kt index ea6f2fa4f..a75413ca6 100644 --- a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziAbstractConfigPlugin.kt +++ b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziAbstractConfigPlugin.kt @@ -23,4 +23,4 @@ abstract class SpeziAbstractConfigPlugin(private val modulePlugin: PluginId) : P testImplementation(project(":core:testing")) } } -} \ No newline at end of file +} diff --git a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziApplicationConventionPlugin.kt b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziApplicationConventionPlugin.kt index 5de1cf6ec..0fd075597 100644 --- a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziApplicationConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziApplicationConventionPlugin.kt @@ -2,4 +2,4 @@ package edu.stanford.spezi.build.logic.convention.plugins import edu.stanford.spezi.build.logic.convention.model.PluginId -class SpeziApplicationConventionPlugin : SpeziAbstractConfigPlugin(modulePlugin = PluginId.ANDROID_APPLICATION) \ No newline at end of file +class SpeziApplicationConventionPlugin : SpeziAbstractConfigPlugin(modulePlugin = PluginId.ANDROID_APPLICATION) diff --git a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziBaseConfigConventionPlugin.kt b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziBaseConfigConventionPlugin.kt index 23da820d2..66d94e773 100644 --- a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziBaseConfigConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziBaseConfigConventionPlugin.kt @@ -59,4 +59,4 @@ class SpeziBaseConfigConventionPlugin : Plugin { } } } -} \ No newline at end of file +} diff --git a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziComposeConventionPlugin.kt b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziComposeConventionPlugin.kt index 45330e54e..976f83fd5 100644 --- a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziComposeConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziComposeConventionPlugin.kt @@ -36,4 +36,4 @@ class SpeziComposeConventionPlugin : Plugin { } } } -} \ No newline at end of file +} diff --git a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziLibraryConventionPlugin.kt index 017533eb7..4694e9954 100644 --- a/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/edu/stanford/spezi/build/logic/convention/plugins/SpeziLibraryConventionPlugin.kt @@ -2,4 +2,4 @@ package edu.stanford.spezi.build.logic.convention.plugins import edu.stanford.spezi.build.logic.convention.model.PluginId -class SpeziLibraryConventionPlugin : SpeziAbstractConfigPlugin(modulePlugin = PluginId.ANDROID_LIBRARY) \ No newline at end of file +class SpeziLibraryConventionPlugin : SpeziAbstractConfigPlugin(modulePlugin = PluginId.ANDROID_LIBRARY) diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts index b8c2f72bd..a0a40c169 100644 --- a/build-logic/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -12,4 +12,4 @@ dependencyResolutionManagement { } rootProject.name = "build-logic" -include(":convention") \ No newline at end of file +include(":convention") diff --git a/build.gradle.kts b/build.gradle.kts index 6e1952940..2662735e4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,18 +1,30 @@ +import io.gitlab.arturbosch.detekt.Detekt import org.jetbrains.dokka.gradle.DokkaTaskPartial plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false - alias(libs.plugins.jetbrains.kotlin.android) apply false - alias(libs.plugins.hilt.android) version libs.versions.hiltVersion apply false - alias(libs.plugins.google.devtools.ksp) version libs.versions.kspVersion apply false alias(libs.plugins.compose.compiler) version libs.versions.kotlin apply false + alias(libs.plugins.detekt) version libs.versions.detekt alias(libs.plugins.dokka) version libs.versions.dokka + alias(libs.plugins.google.devtools.ksp) version libs.versions.kspVersion apply false + alias(libs.plugins.hilt.android) version libs.versions.hiltVersion apply false + alias(libs.plugins.jetbrains.kotlin.android) apply false } subprojects { - apply(plugin = "org.jetbrains.dokka") + setupDokka() + setupDetekt() +} + +installCustomTasks() + +tasks.dokkaHtmlMultiModule { + moduleName.set("Spezi Documentation") +} +fun Project.setupDokka() { + apply(plugin = rootProject.libs.plugins.dokka.get().pluginId) if (this != rootProject) { rootProject.tasks.named("dokkaHtmlMultiModule") { @@ -26,7 +38,7 @@ subprojects { skipDeprecated.set(true) skipEmptyPackages.set(true) includeNonPublic.set(false) - jdkVersion.set(17) + jdkVersion.set(JavaVersion.VERSION_17.majorVersion.toInt()) if (file("README.md").exists()) { includes.from("README.md") } @@ -42,6 +54,44 @@ subprojects { } } -tasks.dokkaHtmlMultiModule { - moduleName.set("Spezi Documentation") -} \ No newline at end of file +fun Project.setupDetekt() { + val libs = rootProject.libs + apply(plugin = libs.plugins.detekt.get().pluginId) + detekt { + toolVersion = libs.versions.detekt.get() + config.setFrom("$rootDir/internal/detekt-config.yml") + autoCorrect = true + ignoreFailures = false + source.setFrom( + files( + "src/main", + "src/test", + "src/androidTest", + "build.gradle.kts" + ) + ) + } + + dependencies { + detektPlugins(libs.detekt.formatting) + } + + tasks.withType { + reports { + xml.required.set(true) + html.required.set(true) + txt.required.set(true) + sarif.required.set(true) + } + } +} + +/** + * Installs all custom tasks defined in /gradle/tasks + */ +fun Project.installCustomTasks() { + val tasksDir = File("$rootDir/gradle/tasks") + if (tasksDir.exists() && tasksDir.isDirectory) { + tasksDir.listFiles { file -> file.extension == "kts" }?.forEach { file -> apply(from = file) } + } +} diff --git a/core/bluetooth/build.gradle.kts b/core/bluetooth/build.gradle.kts index b1eb3cfd5..379ecaf65 100644 --- a/core/bluetooth/build.gradle.kts +++ b/core/bluetooth/build.gradle.kts @@ -10,4 +10,4 @@ android { dependencies { implementation(project(":core:utils")) implementation(project(":core:coroutines")) -} \ No newline at end of file +} diff --git a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/BloodPressureMapper.kt b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/BloodPressureMapper.kt index 9025fb677..54409a1bb 100644 --- a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/BloodPressureMapper.kt +++ b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/BloodPressureMapper.kt @@ -1,3 +1,4 @@ +@file:Suppress("MagicNumber") package edu.stanford.spezi.core.bluetooth.data.mapper import android.bluetooth.BluetoothGattCharacteristic @@ -78,4 +79,4 @@ internal class BloodPressureMapper @Inject constructor() : MeasurementMapper.Chi measurementStatus = measurementStatus ) } -} \ No newline at end of file +} diff --git a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/MeasurementMapper.kt b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/MeasurementMapper.kt index 95c170420..a489a806e 100644 --- a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/MeasurementMapper.kt +++ b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/MeasurementMapper.kt @@ -61,4 +61,4 @@ internal class MeasurementMapperImpl @Inject constructor( override suspend fun map(characteristic: BluetoothGattCharacteristic?, data: ByteArray): Measurement? = withContext(ioDispatcher) { children.find { it.recognises(characteristic) }?.map(characteristic, data) } -} \ No newline at end of file +} diff --git a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/WeightMeasurementMapper.kt b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/WeightMeasurementMapper.kt index 3f7c80c2a..64a3cb2b4 100644 --- a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/WeightMeasurementMapper.kt +++ b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/WeightMeasurementMapper.kt @@ -1,3 +1,4 @@ +@file:Suppress("MagicNumber") package edu.stanford.spezi.core.bluetooth.data.mapper import android.bluetooth.BluetoothGattCharacteristic @@ -35,10 +36,9 @@ internal class WeightMeasurementMapper @Inject constructor() : MeasurementMapper return if (recognises(characteristic).not()) null else runCatching { interpretWeightMeasurement(data) }.getOrNull() } - private fun interpretWeightMeasurement(data: ByteArray): Measurement.Weight { val flags = data[0] - val unitKg = (flags and 0b00000001).toInt() == 0 // Check if bit 0 is 0 for kg, 1 for lb + val unitKg = (flags and 0b00000001).toInt() == 0 // Check if bit 0 is 0 for kg, 1 for lb val weight = if (unitKg) { // Kilograms, resolution of 0.005 kg @@ -49,26 +49,30 @@ internal class WeightMeasurementMapper @Inject constructor() : MeasurementMapper } val zonedDateTime = if (flags and 0b00000010 > 0) { - val year = data[3].toInt() and 0xFF or (data[4].toInt() and 0xFF shl 8) val month = data[5].toInt() val day = data[6].toInt() val hour = data[7].toInt() val minute = data[8].toInt() val second = data[9].toInt() - if (year == 0 || month == 0 || day == 0) null - else { + if (year == 0 || month == 0 || day == 0) { + null + } else { val localDateTime = LocalDateTime.of(year, month, day, hour, minute, second) val zoneId = ZoneId.systemDefault() ZonedDateTime.of(localDateTime, zoneId) } - } else null + } else { + null + } val userId = if (flags and 0b00000100 > 0) data[10].toInt() else null - val bmi = - if (flags and 0b00001000 > 0) (data[11].toInt() and 0xFF or (data[12].toInt() and 0xFF shl 8)) * 0.1 else null - val height = - if (flags and 0b00001000 > 0) (data[13].toInt() and 0xFF or (data[14].toInt() and 0xFF shl 8)) * (if (unitKg) 0.005 else 0.1) else null + val bmi = if (flags and 0b00001000 > 0) (data[11].toInt() and 0xFF or (data[12].toInt() and 0xFF shl 8)) * 0.1 else null + val height = if (flags and 0b00001000 > 0) { + (data[13].toInt() and 0xFF or (data[14].toInt() and 0xFF shl 8)) * (if (unitKg) 0.005 else 0.1) + } else { + null + } return Measurement.Weight( weight = weight, @@ -78,4 +82,4 @@ internal class WeightMeasurementMapper @Inject constructor() : MeasurementMapper height = height ) } -} \ No newline at end of file +} diff --git a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEDeviceSession.kt b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEDeviceSession.kt index e7ff1df27..602afd9e7 100644 --- a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEDeviceSession.kt +++ b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEDeviceSession.kt @@ -12,5 +12,5 @@ import android.bluetooth.BluetoothDevice */ data class BLEDeviceSession( val device: BluetoothDevice, - val measurements: List -) \ No newline at end of file + val measurements: List, +) diff --git a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceEvent.kt b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceEvent.kt index ac4cabaa3..30ebfd5be 100644 --- a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceEvent.kt +++ b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceEvent.kt @@ -59,4 +59,4 @@ sealed interface BLEServiceEvent { * @property measurement The measurement received from the device. */ data class MeasurementReceived(val device: BluetoothDevice, val measurement: Measurement) : BLEServiceEvent -} \ No newline at end of file +} diff --git a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceState.kt b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceState.kt index 601f64855..67fd72bbb 100644 --- a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceState.kt +++ b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceState.kt @@ -18,4 +18,4 @@ sealed interface BLEServiceState { * @property sessions The list of BLE device sessions being scanned. */ data class Scanning(val sessions: List) : BLEServiceState -} \ No newline at end of file +} diff --git a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceType.kt b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceType.kt index 0222b0fda..ee0d67c3f 100644 --- a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceType.kt +++ b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceType.kt @@ -15,7 +15,7 @@ internal enum class BLEServiceType( /** * The UUID of the characteristic associated with the BLE service. */ - val characteristic: UUID + val characteristic: UUID, ) { /** * Represents the Weight service. @@ -31,5 +31,5 @@ internal enum class BLEServiceType( BLOOD_PRESSURE( service = UUID("00001810-0000-1000-8000-00805f9b34fb"), characteristic = UUID("00002a35-0000-1000-8000-00805f9b34fb") - ) + ), } diff --git a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/Measurement.kt b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/Measurement.kt index b048290df..87c21885a 100644 --- a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/Measurement.kt +++ b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/Measurement.kt @@ -23,7 +23,7 @@ sealed interface Measurement { val timeStampSecond: Int, // 0-59 val pulseRate: Float, // pulse rate value bpm val userId: Int, - val measurementStatus: Status + val measurementStatus: Status, ) : Measurement { /** @@ -34,7 +34,7 @@ sealed interface Measurement { val timeStampFlag: Boolean, // false: no timestamp, true: timestamp present val pulseRateFlag: Boolean, // false: no pulse rate, true: pulse rate present val userIdFlag: Boolean, // false: no user ID, true: user ID present - val measurementStatusFlag: Boolean // false: no measurement status, true: measurement status present + val measurementStatusFlag: Boolean, // false: no measurement status, true: measurement status present ) /** @@ -45,7 +45,7 @@ sealed interface Measurement { val cuffFitDetectionFlag: Boolean, // 0: fit properly, 1: too loose val irregularPulseDetectionFlag: Boolean, // 0: no irregular pulse detected, 1: irregular pulse detected val pulseRateRangeDetectionFlags: Int, // - always 0 - val measurementPositionDetectionFlag: Boolean // false: proper, true: improper + val measurementPositionDetectionFlag: Boolean, // false: proper, true: improper ) } @@ -57,6 +57,6 @@ sealed interface Measurement { val zonedDateTime: ZonedDateTime?, val userId: Int?, val bmi: Double?, - val height: Double? + val height: Double?, ) : Measurement } diff --git a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/SupportedServices.kt b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/SupportedServices.kt index c447d96c0..4f7a3d446 100644 --- a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/SupportedServices.kt +++ b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/data/model/SupportedServices.kt @@ -5,4 +5,4 @@ package edu.stanford.spezi.core.bluetooth.data.model * * @param services The list of supported BLE service types. */ -internal class SupportedServices(services: List): List by services +internal class SupportedServices(services: List) : List by services diff --git a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/di/BluetoothModule.kt b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/di/BluetoothModule.kt index 906ee88eb..1b7b5a8ff 100644 --- a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/di/BluetoothModule.kt +++ b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/di/BluetoothModule.kt @@ -68,4 +68,4 @@ class BluetoothModule { @Binds internal abstract fun bindSpeziBLEService(impl: BLEServiceImpl): BLEService } -} \ No newline at end of file +} diff --git a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceConnector.kt b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceConnector.kt index 6f2dcee55..a0d5486e8 100644 --- a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceConnector.kt +++ b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceConnector.kt @@ -134,4 +134,4 @@ internal class BLEDeviceConnector @AssistedInject constructor( private companion object { val DESCRIPTOR_UUID = UUID("00002902-0000-1000-8000-00805f9b34fb") } -} \ No newline at end of file +} diff --git a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceScanner.kt b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceScanner.kt index 0b4631462..615755475 100644 --- a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceScanner.kt +++ b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceScanner.kt @@ -103,7 +103,7 @@ internal class BLEDeviceScanner @Inject constructor( /** * Event indicating that a BLE device was found during scanning. */ - data class DeviceFound(val device: BluetoothDevice): Event + data class DeviceFound(val device: BluetoothDevice) : Event /** * Event indicating a failure during scanning. @@ -111,4 +111,4 @@ internal class BLEDeviceScanner @Inject constructor( */ data class Failure(val errorCode: Int) : Event } -} \ No newline at end of file +} diff --git a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEServiceImpl.kt b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEServiceImpl.kt index b434e8feb..2f8d281d6 100644 --- a/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEServiceImpl.kt +++ b/core/bluetooth/src/main/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEServiceImpl.kt @@ -184,4 +184,4 @@ internal class BLEServiceImpl @Inject constructor( Manifest.permission.BLUETOOTH_SCAN, ) } -} \ No newline at end of file +} diff --git a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/BloodPressureMapperTest.kt b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/BloodPressureMapperTest.kt index 62f6fab67..fd185a9f4 100644 --- a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/BloodPressureMapperTest.kt +++ b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/BloodPressureMapperTest.kt @@ -118,4 +118,4 @@ class BloodPressureMapperTest { // then assertThat(result).isNull() } -} \ No newline at end of file +} diff --git a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/MeasurementMapperTest.kt b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/MeasurementMapperTest.kt index 02875fed0..d0707d32b 100644 --- a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/MeasurementMapperTest.kt +++ b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/MeasurementMapperTest.kt @@ -72,4 +72,4 @@ class MeasurementMapperTest { // then assertThat(result).isEqualTo(measurement) } -} \ No newline at end of file +} diff --git a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/WeightMeasurementMapperTest.kt b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/WeightMeasurementMapperTest.kt index 51bb929e7..40e33312b 100644 --- a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/WeightMeasurementMapperTest.kt +++ b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/mapper/WeightMeasurementMapperTest.kt @@ -90,4 +90,4 @@ class WeightMeasurementMapperTest { // then assertThat(result).isNull() } -} \ No newline at end of file +} diff --git a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceTypeTest.kt b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceTypeTest.kt index 7e1a92962..1f98be489 100644 --- a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceTypeTest.kt +++ b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/data/model/BLEServiceTypeTest.kt @@ -32,4 +32,4 @@ class BLEServiceTypeTest { assertThat(service.toString()).isEqualTo("00001810-0000-1000-8000-00805f9b34fb") assertThat(characteristic.toString()).isEqualTo("00002a35-0000-1000-8000-00805f9b34fb") } -} \ No newline at end of file +} diff --git a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceConnectorTest.kt b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceConnectorTest.kt index c032c65e4..e85879b7b 100644 --- a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceConnectorTest.kt +++ b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceConnectorTest.kt @@ -197,4 +197,4 @@ class BLEDeviceConnectorTest { private suspend fun assertEvent(event: BLEServiceEvent) { assertThat(bleDeviceConnector.events.first()).isEqualTo(event) } -} \ No newline at end of file +} diff --git a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceScannerTest.kt b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceScannerTest.kt index 6028c9852..e93765535 100644 --- a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceScannerTest.kt +++ b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEDeviceScannerTest.kt @@ -172,4 +172,4 @@ class BLEDeviceScannerTest { verify { bluetoothLeScanner.startScan(any>(), any(), capture(callbackSlot)) } return callbackSlot.captured } -} \ No newline at end of file +} diff --git a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEServiceTest.kt b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEServiceTest.kt index 23da54342..226539859 100644 --- a/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEServiceTest.kt +++ b/core/bluetooth/src/test/kotlin/edu/stanford/spezi/core/bluetooth/domain/BLEServiceTest.kt @@ -258,4 +258,4 @@ class BLEServiceTest { private fun assertState(state: BLEServiceState) { assertThat(bleService.state.value).isEqualTo(state) } -} \ No newline at end of file +} diff --git a/core/coroutines/build.gradle.kts b/core/coroutines/build.gradle.kts index da2ca8997..b2613fd50 100644 --- a/core/coroutines/build.gradle.kts +++ b/core/coroutines/build.gradle.kts @@ -9,4 +9,4 @@ android { dependencies { api(libs.bundles.ktx.coroutines) -} \ No newline at end of file +} diff --git a/core/coroutines/src/main/kotlin/edu/stanford/spezi/core/coroutines/DispatchersProvider.kt b/core/coroutines/src/main/kotlin/edu/stanford/spezi/core/coroutines/DispatchersProvider.kt index 9c98720db..2702e61e7 100644 --- a/core/coroutines/src/main/kotlin/edu/stanford/spezi/core/coroutines/DispatchersProvider.kt +++ b/core/coroutines/src/main/kotlin/edu/stanford/spezi/core/coroutines/DispatchersProvider.kt @@ -77,4 +77,4 @@ internal class DispatchersProviderImpl @Inject constructor() : DispatchersProvid * @return The unconfined [CoroutineDispatcher] from [Dispatchers.Unconfined]. */ override fun unconfined(): CoroutineDispatcher = Dispatchers.Unconfined -} \ No newline at end of file +} diff --git a/core/coroutines/src/main/kotlin/edu/stanford/spezi/core/coroutines/di/CoroutinesModule.kt b/core/coroutines/src/main/kotlin/edu/stanford/spezi/core/coroutines/di/CoroutinesModule.kt index 6e214ed81..3f42b3434 100644 --- a/core/coroutines/src/main/kotlin/edu/stanford/spezi/core/coroutines/di/CoroutinesModule.kt +++ b/core/coroutines/src/main/kotlin/edu/stanford/spezi/core/coroutines/di/CoroutinesModule.kt @@ -175,5 +175,7 @@ class CoroutinesModule { * @return The [CoroutineScope] instance. */ @VisibleForTesting - internal fun buildCoroutine(dispatcher: CoroutineDispatcher) = CoroutineScope(context = dispatcher + SupervisorJob()) + internal fun buildCoroutine( + dispatcher: CoroutineDispatcher, + ): CoroutineScope = CoroutineScope(context = dispatcher + SupervisorJob()) } diff --git a/core/coroutines/src/test/kotlin/edu/stanford/spezi/core/coroutines/di/CoroutinesModuleTest.kt b/core/coroutines/src/test/kotlin/edu/stanford/spezi/core/coroutines/di/CoroutinesModuleTest.kt index bb4d3e7c9..cbc1f753e 100644 --- a/core/coroutines/src/test/kotlin/edu/stanford/spezi/core/coroutines/di/CoroutinesModuleTest.kt +++ b/core/coroutines/src/test/kotlin/edu/stanford/spezi/core/coroutines/di/CoroutinesModuleTest.kt @@ -126,4 +126,4 @@ class CoroutinesModuleTest { assertThat(result).isEqualTo(coroutineScope) verify { sut.buildCoroutine(dispatcher) } } -} \ No newline at end of file +} diff --git a/core/design/build.gradle.kts b/core/design/build.gradle.kts index a8d811114..919e7347f 100644 --- a/core/design/build.gradle.kts +++ b/core/design/build.gradle.kts @@ -25,4 +25,4 @@ dependencies { debugImplementation(libs.compose.ui.tooling) debugImplementation(libs.compose.ui.test.manifest) -} \ No newline at end of file +} diff --git a/core/design/src/androidTest/kotlin/edu/stanford/spezi/core/design/ExampleInstrumentedTest.kt b/core/design/src/androidTest/kotlin/edu/stanford/spezi/core/design/ExampleInstrumentedTest.kt deleted file mode 100644 index 71113246c..000000000 --- a/core/design/src/androidTest/kotlin/edu/stanford/spezi/core/design/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package edu.stanford.spezi.core.design - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.assertEquals -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("edu.stanford.spezi.core.design.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/core/design/src/androidTest/kotlin/edu/stanford/spezi/core/design/SpeziButtonKtTest.kt b/core/design/src/androidTest/kotlin/edu/stanford/spezi/core/design/SpeziButtonKtTest.kt index 477587615..e56dbbde1 100644 --- a/core/design/src/androidTest/kotlin/edu/stanford/spezi/core/design/SpeziButtonKtTest.kt +++ b/core/design/src/androidTest/kotlin/edu/stanford/spezi/core/design/SpeziButtonKtTest.kt @@ -84,4 +84,4 @@ class SpeziButtonKtTest { assert(clicked) } -} \ No newline at end of file +} diff --git a/core/design/src/main/kotlin/edu/stanford/spezi/core/design/component/SpeziButton.kt b/core/design/src/main/kotlin/edu/stanford/spezi/core/design/component/SpeziButton.kt index 48bcdfe27..9677945d0 100644 --- a/core/design/src/main/kotlin/edu/stanford/spezi/core/design/component/SpeziButton.kt +++ b/core/design/src/main/kotlin/edu/stanford/spezi/core/design/component/SpeziButton.kt @@ -58,4 +58,3 @@ fun SpeziButtonDarkPreview() { } } } - diff --git a/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/Colors.kt b/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/Colors.kt index afaf8d88d..c11cb3ddc 100644 --- a/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/Colors.kt +++ b/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/Colors.kt @@ -41,7 +41,6 @@ object Colors { @ReadOnlyComposable get() = scheme.onPrimary - val onSecondary @Composable @ReadOnlyComposable @@ -52,7 +51,6 @@ object Colors { @ReadOnlyComposable get() = scheme.onTertiary - val onBackground @Composable @ReadOnlyComposable @@ -79,4 +77,4 @@ internal val Black40 = Color(0xFFABABA9) internal val Black20 = Color(0xFFD5D5D4) internal val Black10 = Color(0xFFEAEAEA) -internal val RectangleBlue = Color(0xFFEBF2FC) \ No newline at end of file +internal val RectangleBlue = Color(0xFFEBF2FC) diff --git a/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/Sizes.kt b/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/Sizes.kt index 0dfdcd96c..c82e4e473 100644 --- a/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/Sizes.kt +++ b/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/Sizes.kt @@ -10,4 +10,4 @@ object Sizes { @Composable @ReadOnlyComposable get() = 48.dp -} \ No newline at end of file +} diff --git a/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/Spacings.kt b/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/Spacings.kt index 6e58fc1a7..79ecea13c 100644 --- a/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/Spacings.kt +++ b/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/Spacings.kt @@ -20,4 +20,4 @@ object Spacings { @Composable @ReadOnlyComposable get() = 24.dp -} \ No newline at end of file +} diff --git a/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/SpeziKtTheme.kt b/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/SpeziKtTheme.kt index 1882edcb0..1d9801ac6 100644 --- a/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/SpeziKtTheme.kt +++ b/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/SpeziKtTheme.kt @@ -52,7 +52,7 @@ private val LightColorScheme = lightColorScheme( fun SpeziTheme( darkTheme: Boolean = isSystemInDarkTheme(), dynamicColor: Boolean = true, - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { val colorScheme = when { dynamicColor -> { @@ -85,4 +85,4 @@ fun SpeziTheme( typography = typography, content = surface ) -} \ No newline at end of file +} diff --git a/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/TextStyles.kt b/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/TextStyles.kt index 870f4d5c6..4d7a64aa8 100644 --- a/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/TextStyles.kt +++ b/core/design/src/main/kotlin/edu/stanford/spezi/core/design/theme/TextStyles.kt @@ -129,4 +129,4 @@ private fun TypographyPreview() { ) } } -} \ No newline at end of file +} diff --git a/core/design/src/test/kotlin/edu/stanford/spezi/core/design/ExampleUnitTest.kt b/core/design/src/test/kotlin/edu/stanford/spezi/core/design/ExampleUnitTest.kt index 15c29f4ed..c5ef9e08d 100644 --- a/core/design/src/test/kotlin/edu/stanford/spezi/core/design/ExampleUnitTest.kt +++ b/core/design/src/test/kotlin/edu/stanford/spezi/core/design/ExampleUnitTest.kt @@ -13,4 +13,4 @@ class ExampleUnitTest { fun addition_isCorrect() { assertEquals(4, 2 + 2) } -} \ No newline at end of file +} diff --git a/core/logging/build.gradle.kts b/core/logging/build.gradle.kts index e67ea28dd..5a8a29af9 100644 --- a/core/logging/build.gradle.kts +++ b/core/logging/build.gradle.kts @@ -11,4 +11,4 @@ android { dependencies { implementation(libs.timber) testImplementation(libs.bundles.unit.testing) -} \ No newline at end of file +} diff --git a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/Api.kt b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/Api.kt index 12a4eaf85..555bd95c8 100644 --- a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/Api.kt +++ b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/Api.kt @@ -46,5 +46,5 @@ fun groupLogger(tag: String, config: LoggerConfig.() -> Unit = {}) = object : Re */ fun speziLogger( tag: String, - config: LoggerConfig.() -> Unit = {} + config: LoggerConfig.() -> Unit = {}, ) = lazy { SpeziLogger(tag, LoggerConfig().apply(config)) } diff --git a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/SpeziLogger.kt b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/SpeziLogger.kt index 120174c6e..3452ea7dd 100644 --- a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/SpeziLogger.kt +++ b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/SpeziLogger.kt @@ -185,4 +185,4 @@ class SpeziLogger internal constructor(private val tag: String, private val conf _IS_LOGGING_ENABLED.set(enabled) } } -} \ No newline at end of file +} diff --git a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/LogLogger.kt b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/LogLogger.kt index 38395e074..e9f3bc7fd 100644 --- a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/LogLogger.kt +++ b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/LogLogger.kt @@ -27,4 +27,4 @@ internal class LogLogger( override fun e(throwable: Throwable?, message: () -> String) { Log.d(getCurrentTag(), getMessage(message), throwable) } -} \ No newline at end of file +} diff --git a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/PrintLogger.kt b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/PrintLogger.kt index a908997cd..17e543d13 100644 --- a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/PrintLogger.kt +++ b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/PrintLogger.kt @@ -31,9 +31,9 @@ internal class PrintLogger( ) = buildString { append("($level) ") append("${getCurrentTag()} - ") - append(getMessage(message) ) + append(getMessage(message)) throwable?.let { append(" Error: $it") } } -} \ No newline at end of file +} diff --git a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/TimberLogger.kt b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/TimberLogger.kt index 94767851c..2cf63c3d5 100644 --- a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/TimberLogger.kt +++ b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/TimberLogger.kt @@ -36,4 +36,4 @@ internal class TimberLogger( if (PLANTED_DEBUG_TREE.getAndSet(true).not()) Timber.plant(Timber.DebugTree()) } } -} \ No newline at end of file +} diff --git a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/_Logger.kt b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/_Logger.kt index 2aa2b03dc..7cd5d0c58 100644 --- a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/_Logger.kt +++ b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/internal/_Logger.kt @@ -11,6 +11,7 @@ import edu.stanford.spezi.core.logging.SpeziLogger * of [SpeziLogger] which requires it to be visible outside of the component for the inline function to access it. * @see [SpeziLogger] for the reasoning behind inline functions. */ +@Suppress("ClassNaming") sealed interface _Logger { val tag: String val messagePrefix: String? @@ -66,4 +67,4 @@ internal fun _Logger.getMessage(message: () -> String) = if (messagePrefix != nu "$messagePrefix - ${message()}" } else { message() -} \ No newline at end of file +} diff --git a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/models/LoggerConfig.kt b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/models/LoggerConfig.kt index 453fcfbc2..b428e1cc6 100644 --- a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/models/LoggerConfig.kt +++ b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/models/LoggerConfig.kt @@ -38,4 +38,3 @@ class LoggerConfig internal constructor() { SpeziLogger.GLOBAL_CONFIG?.invoke(this) } } - diff --git a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/models/LoggingStrategy.kt b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/models/LoggingStrategy.kt index 072efa47c..33316206f 100644 --- a/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/models/LoggingStrategy.kt +++ b/core/logging/src/main/kotlin/edu/stanford/spezi/core/logging/models/LoggingStrategy.kt @@ -19,5 +19,5 @@ enum class LoggingStrategy { /** * The logging strategy that logs messages using the Log utility. */ - LOG -} \ No newline at end of file + LOG, +} diff --git a/core/logging/src/test/kotlin/edu/stanford/spezi/core/logging/SpeziLoggerTest.kt b/core/logging/src/test/kotlin/edu/stanford/spezi/core/logging/SpeziLoggerTest.kt index 431713837..6d1373a48 100644 --- a/core/logging/src/test/kotlin/edu/stanford/spezi/core/logging/SpeziLoggerTest.kt +++ b/core/logging/src/test/kotlin/edu/stanford/spezi/core/logging/SpeziLoggerTest.kt @@ -9,4 +9,4 @@ class SpeziLoggerTest { fun `GLOBAL_CONFIG must be set to null`() { assertThat(SpeziLogger.GLOBAL_CONFIG).isNull() } -} \ No newline at end of file +} diff --git a/core/testing/build.gradle.kts b/core/testing/build.gradle.kts index c71b82acc..4d103c57c 100644 --- a/core/testing/build.gradle.kts +++ b/core/testing/build.gradle.kts @@ -11,4 +11,4 @@ android { dependencies { implementation(project(":core:coroutines")) api(libs.bundles.unit.testing) -} \ No newline at end of file +} diff --git a/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/CoroutineTestRule.kt b/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/CoroutineTestRule.kt index 5f571bc27..60f6aed2f 100644 --- a/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/CoroutineTestRule.kt +++ b/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/CoroutineTestRule.kt @@ -37,7 +37,7 @@ import org.junit.runner.Description * */ class CoroutineTestRule( - private val testDispatcher: TestDispatcher = UnconfinedTestDispatcher() + private val testDispatcher: TestDispatcher = UnconfinedTestDispatcher(), ) : TestWatcher() { /** @@ -57,4 +57,4 @@ class CoroutineTestRule( override fun finished(description: Description?) { Dispatchers.resetMain() } -} \ No newline at end of file +} diff --git a/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/Mockk.kt b/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/Mockk.kt index 75c3e1836..73b85879f 100644 --- a/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/Mockk.kt +++ b/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/Mockk.kt @@ -19,7 +19,6 @@ import io.mockk.verify */ fun verifyNever(verifyBlock: MockKVerificationScope.() -> Unit) = verify(exactly = 0, verifyBlock = verifyBlock) - /** * Verifies that a specific interaction with a mock object in a coroutine context never occurred. * @@ -33,4 +32,6 @@ fun verifyNever(verifyBlock: MockKVerificationScope.() -> Unit) = verify(exactly * * @param verifyBlock The suspendable block of code containing the interaction to verify. */ -fun coVerifyNever(verifyBlock: suspend MockKVerificationScope.() -> Unit) = coVerify(exactly = 0, verifyBlock = verifyBlock) +fun coVerifyNever( + verifyBlock: suspend MockKVerificationScope.() -> Unit, +) = coVerify(exactly = 0, verifyBlock = verifyBlock) diff --git a/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/RunTest.kt b/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/RunTest.kt index 1e1068ba2..6501166c0 100644 --- a/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/RunTest.kt +++ b/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/RunTest.kt @@ -26,4 +26,4 @@ import kotlinx.coroutines.test.runTest * @param testBody The suspending function containing the test code to be executed. */ fun runTestUnconfined(testBody: suspend TestScope.() -> Unit) = - runTest(context = UnconfinedTestDispatcher(), testBody = testBody) \ No newline at end of file + runTest(context = UnconfinedTestDispatcher(), testBody = testBody) diff --git a/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/SpeziTestScope.kt b/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/SpeziTestScope.kt index 027d31268..a9a3fbde8 100644 --- a/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/SpeziTestScope.kt +++ b/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/SpeziTestScope.kt @@ -21,4 +21,5 @@ import kotlin.coroutines.CoroutineContext * } * ``` */ -fun SpeziTestScope(context: CoroutineContext = UnconfinedTestDispatcher()): TestScope = TestScope(context = context) \ No newline at end of file +@Suppress("FunctionNaming") +fun SpeziTestScope(context: CoroutineContext = UnconfinedTestDispatcher()): TestScope = TestScope(context = context) diff --git a/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/TestDispatchersProvider.kt b/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/TestDispatchersProvider.kt index 389b44933..b8be01837 100644 --- a/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/TestDispatchersProvider.kt +++ b/core/testing/src/main/kotlin/edu/stanford/spezi/core/testing/TestDispatchersProvider.kt @@ -12,7 +12,7 @@ import kotlinx.coroutines.test.UnconfinedTestDispatcher * @property testDispatcher The [CoroutineDispatcher] to be used for all dispatcher contexts. Defaults to [UnconfinedTestDispatcher]. */ class TestDispatchersProvider( - private val testDispatcher: CoroutineDispatcher = UnconfinedTestDispatcher() + private val testDispatcher: CoroutineDispatcher = UnconfinedTestDispatcher(), ) : DispatchersProvider { /** diff --git a/core/utils/build.gradle.kts b/core/utils/build.gradle.kts index 89b0c2bf0..1c0364848 100644 --- a/core/utils/build.gradle.kts +++ b/core/utils/build.gradle.kts @@ -10,4 +10,4 @@ dependencies { val composeBom = platform(libs.compose.bom) implementation(composeBom) implementation(libs.compose.runtime) -} \ No newline at end of file +} diff --git a/core/utils/src/main/kotlin/edu/stanford/spezi/core/utils/Typealiases.kt b/core/utils/src/main/kotlin/edu/stanford/spezi/core/utils/Typealiases.kt index 8ea37bfd6..895b4b501 100644 --- a/core/utils/src/main/kotlin/edu/stanford/spezi/core/utils/Typealiases.kt +++ b/core/utils/src/main/kotlin/edu/stanford/spezi/core/utils/Typealiases.kt @@ -1,3 +1,4 @@ +@file:Suppress("Filename") package edu.stanford.spezi.core.utils import androidx.compose.runtime.Composable @@ -22,4 +23,4 @@ import androidx.compose.runtime.Composable * } * ``` */ -typealias ComposableBlock = @Composable () -> Unit \ No newline at end of file +typealias ComposableBlock = @Composable () -> Unit diff --git a/core/utils/src/main/kotlin/edu/stanford/spezi/core/utils/UUID.kt b/core/utils/src/main/kotlin/edu/stanford/spezi/core/utils/UUID.kt index c1f182bfc..c5da7f320 100644 --- a/core/utils/src/main/kotlin/edu/stanford/spezi/core/utils/UUID.kt +++ b/core/utils/src/main/kotlin/edu/stanford/spezi/core/utils/UUID.kt @@ -9,4 +9,4 @@ import java.util.UUID * @return The [UUID] instance parsed from the string. * @throws IllegalArgumentException if the specified string does not conform to the string representation format. */ -fun UUID(string: String): UUID = UUID.fromString(string) \ No newline at end of file +fun UUID(string: String): UUID = UUID.fromString(string) diff --git a/core/utils/src/main/kotlin/edu/stanford/spezi/core/utils/extensions/List.kt b/core/utils/src/main/kotlin/edu/stanford/spezi/core/utils/extensions/List.kt index f865d95ad..882203970 100644 --- a/core/utils/src/main/kotlin/edu/stanford/spezi/core/utils/extensions/List.kt +++ b/core/utils/src/main/kotlin/edu/stanford/spezi/core/utils/extensions/List.kt @@ -6,4 +6,4 @@ package edu.stanford.spezi.core.utils.extensions * @param item The item to append to the list. If null, it will not be added. * @return A new list containing the original items and the appended item, if not null. */ -fun List.append(item: T?): List = this + listOfNotNull(item) \ No newline at end of file +fun List.append(item: T?): List = this + listOfNotNull(item) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 94846ab13..9b4cd5842 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,6 +9,7 @@ composeBom = "2024.05.00" coreKtx = "1.13.1" coreTestingVersion = "2.2.0" coroutinesVersion = "1.8.0" +detekt = "1.23.6" # please adjust github action version as well in case of version change dokka = "1.9.20" espressoCore = "3.5.1" hiltNavigation = "1.2.0" @@ -49,6 +50,7 @@ compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "coroutinesVersion" } coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "coroutinesVersion" } coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "coroutinesVersion" } +detekt-formatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" } google-truth = { group = "com.google.truth", name = "truth", version.ref = "truth" } hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hiltVersion" } hilt-core = { group = "com.google.dagger", name = "hilt-android", version.ref = "hiltVersion" } @@ -69,6 +71,7 @@ timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "tim android-application = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } google-devtools-ksp = { id = "com.google.devtools.ksp", version.ref = "kspVersion" } hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hiltVersion" } @@ -84,4 +87,4 @@ spezi-library = { id = "spezi.library", version = "unspecified" } compose = ["compose-ui", "compose-material3", "compose-ui-tooling-preview", "compose-ui-tooling", "androidx-core-ktx", "androidx-appcompat", "androidx-activity-compose"] compose-androidTest = ["junit", "androidx-espresso-core", "compose-ui-test", "mockk-agent-core", "mockk-android", "google-truth"] ktx-coroutines = ["coroutines-core", "coroutines-android"] -unit-testing = ["junit", "mockk-core", "google-truth", "coroutines-test", "androidx-core-testing"] \ No newline at end of file +unit-testing = ["junit", "mockk-core", "google-truth", "coroutines-test", "androidx-core-testing"] diff --git a/gradle/tasks/git-hooks.gradle.kts b/gradle/tasks/git-hooks.gradle.kts new file mode 100644 index 000000000..25e8115ee --- /dev/null +++ b/gradle/tasks/git-hooks.gradle.kts @@ -0,0 +1,25 @@ +import org.gradle.api.tasks.Copy + +/** + * A gradle task that registers the git hooks from internal/git-hooks to the .git folder + */ +val installGitHooks by tasks.registering(Copy::class) { + group = "spezi" + description = "Copies and installs the git hooks from internal/git-hooks to the .git folder." + + val gitHooksDir = file("$rootDir/.git/hooks") + + from("$rootDir/internal/git-hooks/") { + include("**/*.sh") + rename("(.*).sh", "$1") + } + + into(gitHooksDir) + + doLast { + gitHooksDir.listFiles()?.forEach { file -> + file.setExecutable(true) + logger.info("Git hook ${file.name} copied and installed successfully.") + } + } +} diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/internal/detekt-config.yml b/internal/detekt-config.yml new file mode 100644 index 000000000..79fbe0f0b --- /dev/null +++ b/internal/detekt-config.yml @@ -0,0 +1,756 @@ +build: + maxIssues: 0 + excludeCorrectable: false + weights: + # complexity: 2 + # LongParameterList: 1 + # style: 1 + # comments: 1 + excludes: ['**/*.kts'] + +config: + validation: true + warningsAsErrors: true + # when writing own rules with new properties, exclude the property path e.g.: 'my_rule_set,.*>.*>[my_property]' + excludes: '' + +processors: + active: true + exclude: + - 'DetektProgressListener' + # - 'KtFileCountProcessor' + # - 'PackageCountProcessor' + # - 'ClassCountProcessor' + # - 'FunctionCountProcessor' + # - 'PropertyCountProcessor' + # - 'ProjectComplexityProcessor' + # - 'ProjectCognitiveComplexityProcessor' + # - 'ProjectLLOCProcessor' + # - 'ProjectCLOCProcessor' + # - 'ProjectLOCProcessor' + # - 'ProjectSLOCProcessor' + # - 'LicenseHeaderLoaderExtension' + +console-reports: + active: true + exclude: + - 'ProjectStatisticsReport' + - 'ComplexityReport' + - 'NotificationReport' + # - 'FindingsReport' + - 'FileBasedFindingsReport' + +output-reports: + active: true + exclude: + # - 'TxtOutputReport' + # - 'XmlOutputReport' + # - 'HtmlOutputReport' + +comments: + active: true + AbsentOrWrongFileLicense: + active: false + licenseTemplateFile: 'license.template' + licenseTemplateIsRegex: false + CommentOverPrivateFunction: + active: false + CommentOverPrivateProperty: + active: false + DeprecatedBlockTag: + active: false + EndOfSentenceFormat: + active: false + endOfSentenceFormat: '([.?!][ \t\n\r\f<])|([.?!:]$)' + UndocumentedPublicClass: + active: false + searchInNestedClass: true + searchInInnerClass: true + searchInInnerObject: true + searchInInnerInterface: true + UndocumentedPublicFunction: + active: false + UndocumentedPublicProperty: + active: false + +complexity: + active: true + ComplexCondition: + active: true + threshold: 4 + ComplexInterface: + active: false + threshold: 10 + includeStaticDeclarations: false + includePrivateDeclarations: false + CyclomaticComplexMethod: + active: true + threshold: 15 + ignoreSingleWhenExpression: false + ignoreSimpleWhenEntries: false + ignoreNestingFunctions: false + nestingFunctions: + - 'also' + - 'apply' + - 'forEach' + - 'isNotNull' + - 'ifNull' + - 'let' + - 'run' + - 'use' + - 'with' + LabeledExpression: + active: false + ignoredLabels: [] + LargeClass: + active: true + threshold: 600 + LongMethod: + active: true + threshold: 60 + ignoreAnnotated: + - 'Composable' + LongParameterList: + active: true + functionThreshold: 7 + constructorThreshold: 7 + ignoreDefaultParameters: false + ignoreDataClasses: true + ignoreAnnotated: [] + excludes: ['**/test/**', '**/androidTest/**'] + MethodOverloading: + active: false + threshold: 6 + NamedArguments: + active: true + threshold: 3 + NestedBlockDepth: + active: true + threshold: 5 + ReplaceSafeCallChainWithRun: + active: false + StringLiteralDuplication: + active: false + excludes: ['**/test/**', '**/androidTest/**'] + threshold: 3 + ignoreAnnotation: true + excludeStringsWithLessThan5Characters: true + ignoreStringsRegex: '$^' + TooManyFunctions: + active: true + excludes: ['**/test/**', '**/androidTest/**'] + thresholdInFiles: 15 + thresholdInClasses: 15 + thresholdInInterfaces: 11 + thresholdInObjects: 11 + thresholdInEnums: 11 + ignoreDeprecated: false + ignorePrivate: false + ignoreOverridden: false + +coroutines: + active: true + GlobalCoroutineUsage: + active: false + RedundantSuspendModifier: + active: false + SleepInsteadOfDelay: + active: false + SuspendFunWithFlowReturnType: + active: false + +empty-blocks: + active: true + EmptyCatchBlock: + active: true + allowedExceptionNameRegex: '_|(ignore|expected).*' + EmptyClassBlock: + active: true + EmptyDefaultConstructor: + active: true + EmptyDoWhileBlock: + active: true + EmptyElseBlock: + active: true + EmptyFinallyBlock: + active: true + EmptyForBlock: + active: true + EmptyFunctionBlock: + active: true + ignoreOverridden: false + EmptyIfBlock: + active: true + EmptyInitBlock: + active: true + EmptyKtFile: + active: true + EmptySecondaryConstructor: + active: true + EmptyTryBlock: + active: true + EmptyWhenBlock: + active: true + EmptyWhileBlock: + active: true + +exceptions: + active: true + ExceptionRaisedInUnexpectedLocation: + active: true + methodNames: + - 'equals' + - 'finalize' + - 'hashCode' + - 'toString' + InstanceOfCheckForException: + active: false + excludes: ['**/test/**', '**/androidTest/**'] + NotImplementedDeclaration: + active: false + ObjectExtendsThrowable: + active: false + PrintStackTrace: + active: true + RethrowCaughtException: + active: true + ReturnFromFinally: + active: true + ignoreLabeled: false + SwallowedException: + active: true + ignoredExceptionTypes: + - 'InterruptedException' + - 'MalformedURLException' + - 'NumberFormatException' + - 'ParseException' + allowedExceptionNameRegex: '_|(ignore|expected).*' + ThrowingExceptionFromFinally: + active: true + ThrowingExceptionInMain: + active: false + ThrowingExceptionsWithoutMessageOrCause: + active: true + excludes: ['**/test/**', '**/androidTest/**'] + exceptions: + - 'ArrayIndexOutOfBoundsException' + - 'Exception' + - 'IllegalArgumentException' + - 'IllegalMonitorStateException' + - 'IllegalStateException' + - 'IndexOutOfBoundsException' + - 'NullPointerException' + - 'RuntimeException' + - 'Throwable' + ThrowingNewInstanceOfSameException: + active: true + TooGenericExceptionCaught: + active: true + excludes: ['**/test/**', '**/androidTest/**'] + exceptionNames: + - 'ArrayIndexOutOfBoundsException' + - 'Error' + - 'Exception' + - 'IllegalMonitorStateException' + - 'IndexOutOfBoundsException' + - 'NullPointerException' + - 'RuntimeException' + - 'Throwable' + allowedExceptionNameRegex: '_|(ignore|expected).*' + TooGenericExceptionThrown: + active: true + exceptionNames: + - 'Error' + - 'Exception' + - 'RuntimeException' + - 'Throwable' + +formatting: + active: true + android: true + autoCorrect: true + AnnotationOnSeparateLine: + active: false + autoCorrect: true + AnnotationSpacing: + active: false + autoCorrect: true + ArgumentListWrapping: + active: false + autoCorrect: true + indentSize: 4 + maxLineLength: 140 + ChainWrapping: + active: true + autoCorrect: true + CommentSpacing: + active: true + autoCorrect: true + EnumEntryNameCase: + active: false + autoCorrect: true + Filename: + active: true + FinalNewline: + active: true + autoCorrect: true + insertFinalNewLine: true + ImportOrdering: + active: true + autoCorrect: true + layout: '*,java.**,javax.**,kotlin.**,^' + Indentation: + active: true + autoCorrect: true + indentSize: 4 + MaximumLineLength: + active: true + maxLineLength: 140 + ignoreBackTickedIdentifier: false + ModifierOrdering: + active: true + autoCorrect: true + MultiLineIfElse: + active: true + autoCorrect: true + NoBlankLineBeforeRbrace: + active: true + autoCorrect: true + NoConsecutiveBlankLines: + active: true + autoCorrect: true + NoEmptyClassBody: + active: true + autoCorrect: true + NoEmptyFirstLineInMethodBlock: + active: true + autoCorrect: true + NoLineBreakAfterElse: + active: true + autoCorrect: true + NoLineBreakBeforeAssignment: + active: true + autoCorrect: true + NoMultipleSpaces: + active: true + autoCorrect: true + NoSemicolons: + active: true + autoCorrect: true + NoTrailingSpaces: + active: true + autoCorrect: true + NoUnitReturn: + active: true + autoCorrect: true + NoUnusedImports: + active: true + autoCorrect: true + NoWildcardImports: + active: true + PackageName: + active: true + autoCorrect: true + ParameterListWrapping: + active: true + autoCorrect: true + indentSize: 4 + maxLineLength: 120 + SpacingAroundAngleBrackets: + active: false + autoCorrect: true + SpacingAroundColon: + active: true + autoCorrect: true + SpacingAroundComma: + active: true + autoCorrect: true + SpacingAroundCurly: + active: true + autoCorrect: true + SpacingAroundDot: + active: true + autoCorrect: true + SpacingAroundDoubleColon: + active: true + autoCorrect: true + SpacingAroundKeyword: + active: true + autoCorrect: true + SpacingAroundOperators: + active: true + autoCorrect: true + SpacingAroundParens: + active: true + autoCorrect: true + SpacingAroundRangeOperator: + active: true + autoCorrect: true + SpacingAroundUnaryOperator: + active: true + autoCorrect: true + SpacingBetweenDeclarationsWithAnnotations: + active: true + autoCorrect: true + SpacingBetweenDeclarationsWithComments: + active: true + autoCorrect: true + StringTemplate: + active: true + autoCorrect: true + TrailingCommaOnDeclarationSite: + active: true + autoCorrect: true + +naming: + active: true + BooleanPropertyNaming: + active: false + allowedPattern: '^(is|has|are)' + ClassNaming: + active: true + classPattern: '[A-Z][a-zA-Z0-9]*' + ConstructorParameterNaming: + active: true + parameterPattern: '[a-z][A-Za-z0-9]*' + privateParameterPattern: '[a-z][A-Za-z0-9]*' + excludeClassPattern: '$^' + EnumNaming: + active: true + enumEntryPattern: '[A-Z][_a-zA-Z0-9]*' + ForbiddenClassName: + active: false + forbiddenName: [] + FunctionMaxLength: + active: false + maximumFunctionNameLength: 30 + FunctionMinLength: + active: false + minimumFunctionNameLength: 3 + FunctionNaming: + active: true + excludes: ['**/test/**', '**/androidTest/**'] + functionPattern: '([a-z][a-zA-Z0-9]*)|(`.*`)' + excludeClassPattern: '$^' + ignoreAnnotated: + - 'Composable' + FunctionParameterNaming: + active: true + parameterPattern: '[a-z][A-Za-z0-9]*' + excludeClassPattern: '$^' + InvalidPackageDeclaration: + active: true + excludes: ['**/*.kts'] + rootPackage: '' + MatchingDeclarationName: + active: false + mustBeFirst: true + MemberNameEqualsClassName: + active: true + ignoreOverridden: true + NoNameShadowing: + active: false + NonBooleanPropertyPrefixedWithIs: + active: false + excludes: ['**/test/**', '**/androidTest/**'] + ObjectPropertyNaming: + active: true + excludes: ['**/test/**', '**/androidTest/**'] + constantPattern: '[A-Za-z][_A-Za-z0-9]*' + propertyPattern: '[A-Za-z][_A-Za-z0-9]*' + privatePropertyPattern: '(_)?[A-Za-z][_A-Za-z0-9]*' + PackageNaming: + active: true + packagePattern: '[a-z]+(\.[a-z][A-Za-z0-9]*)*' + TopLevelPropertyNaming: + active: true + excludes: ['**/test/**', '**/androidTest/**'] + constantPattern: '[A-Z][_A-Z0-9]*' + propertyPattern: '[A-Za-z][_A-Za-z0-9]*' + privatePropertyPattern: '_?[A-Za-z][_A-Za-z0-9]*' + VariableMaxLength: + active: false + excludes: ['**/test/**', '**/androidTest/**'] + maximumVariableNameLength: 64 + VariableMinLength: + active: true + minimumVariableNameLength: 3 + VariableNaming: + active: true + variablePattern: '[a-z][A-Za-z0-9]*' + privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*' + excludeClassPattern: '$^' + +performance: + active: true + ArrayPrimitive: + active: true + ForEachOnRange: + active: true + SpreadOperator: + active: true + UnnecessaryTemporaryInstantiation: + active: true + +potential-bugs: + active: true + AvoidReferentialEquality: + active: false + forbiddenTypePatterns: + - 'kotlin.String' + CastToNullableType: + active: false + Deprecation: + active: false + DontDowncastCollectionTypes: + active: false + DoubleMutabilityForCollection: + active: false + EqualsAlwaysReturnsTrueOrFalse: + active: true + EqualsWithHashCodeExist: + active: true + ExitOutsideMain: + active: false + ExplicitGarbageCollectionCall: + active: true + HasPlatformType: + active: false + IgnoredReturnValue: + active: false + restrictToConfig: true + returnValueAnnotations: + - '*.CheckResult' + - '*.CheckReturnValue' + ignoreReturnValueAnnotations: + - '*.CanIgnoreReturnValue' + ImplicitDefaultLocale: + active: true + ImplicitUnitReturnType: + active: false + allowExplicitReturnType: true + InvalidRange: + active: true + IteratorHasNextCallsNextMethod: + active: true + IteratorNotThrowingNoSuchElementException: + active: true + LateinitUsage: + active: false + excludes: ['**/test/**', '**/androidTest/**'] + ignoreAnnotated: [] + ignoreOnClassesPattern: '' + MapGetWithNotNullAssertionOperator: + active: false + NullableToStringCall: + active: false + UnconditionalJumpStatementInLoop: + active: false + UnnecessaryNotNullOperator: + active: true + UnnecessarySafeCall: + active: true + UnreachableCatchBlock: + active: false + UnreachableCode: + active: true + UnsafeCallOnNullableType: + active: true + UnsafeCast: + active: true + UnusedUnaryOperator: + active: false + UselessPostfixExpression: + active: false + WrongEqualsTypeParameter: + active: true + +style: + active: true + ClassOrdering: + active: false + CollapsibleIfStatements: + active: false + DataClassContainsFunctions: + active: false + conversionFunctionPrefix: ['to'] + DataClassShouldBeImmutable: + active: false + DestructuringDeclarationWithTooManyEntries: + active: false + maxDestructuringEntries: 3 + EqualsNullCall: + active: true + EqualsOnSignatureLine: + active: false + ExplicitCollectionElementAccessMethod: + active: false + ExplicitItLambdaParameter: + active: false + ExpressionBodySyntax: + active: false + includeLineWrapping: false + ForbiddenComment: + active: true + comments: ['FIXME:','STOPSHIP:'] + allowedPatterns: '' + ForbiddenImport: + active: false + imports: [] + forbiddenPatterns: [''] + ForbiddenMethodCall: + active: false + methods: + - 'kotlin.io.print' + - 'kotlin.io.println' + ForbiddenVoid: + active: false + ignoreOverridden: false + ignoreUsageInGenerics: false + FunctionOnlyReturningConstant: + active: true + ignoreOverridableFunction: true + ignoreActualFunction: true + excludedFunctions: [] + ignoreAnnotated: ['dagger.Provides'] + LoopWithTooManyJumpStatements: + active: true + maxJumpCount: 1 + MagicNumber: + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/theme/**'] + ignoreNumbers: + - '-1' + - '0' + - '1' + - '2' + ignoreHashCodeFunction: true + ignorePropertyDeclaration: false + ignoreLocalVariableDeclaration: false + ignoreConstantDeclaration: true + ignoreCompanionObjectPropertyDeclaration: true + ignoreAnnotation: false + ignoreNamedArgument: true + ignoreEnums: false + ignoreRanges: false + ignoreExtensionFunctions: true + MandatoryBracesLoops: + active: false + MaxLineLength: + active: true + maxLineLength: 140 + excludePackageStatements: true + excludeImportStatements: true + excludeCommentStatements: false + MayBeConst: + active: true + ModifierOrder: + active: true + MultilineLambdaItParameter: + active: false + NestedClassesVisibility: + active: true + NewLineAtEndOfFile: + active: true + NoTabs: + active: false + NullableBooleanCheck: + active: true + ObjectLiteralToLambda: + active: false + OptionalAbstractKeyword: + active: true + OptionalUnit: + active: false + PreferToOverPairSyntax: + active: false + ProtectedMemberInFinalClass: + active: true + RedundantExplicitType: + active: false + RedundantHigherOrderMapUsage: + active: false + RedundantVisibilityModifierRule: + active: false + ReturnCount: + active: true + max: 3 + excludedFunctions: ['equals'] + excludeLabeled: false + excludeReturnFromLambda: true + excludeGuardClauses: false + SafeCast: + active: true + SerialVersionUIDInSerializableClass: + active: true + SpacingBetweenPackageAndImports: + active: false + ThrowsCount: + active: true + max: 2 + excludeGuardClauses: false + TrailingWhitespace: + active: false + UnderscoresInNumericLiterals: + active: false + acceptableLength: 5 + UnnecessaryAbstractClass: + active: true + ignoreAnnotated: ['dagger.Module'] + UnnecessaryAnnotationUseSiteTarget: + active: false + UnnecessaryApply: + active: true + UnnecessaryFilter: + active: false + UnnecessaryInheritance: + active: true + UnnecessaryLet: + active: false + UnnecessaryParentheses: + active: false + UntilInsteadOfRangeTo: + active: false + UnusedImports: + active: true + UnusedPrivateClass: + active: true + UnusedPrivateMember: + active: true + allowedNames: '(_|ignored|expected|serialVersionUID)' + ignoreAnnotated: ['Preview'] + UseArrayLiteralsInAnnotations: + active: false + UseCheckNotNull: + active: false + UseCheckOrError: + active: false + UseDataClass: + active: true + ignoreAnnotated: [] + allowVars: true + UseEmptyCounterpart: + active: false + UseIfEmptyOrIfBlank: + active: true + UseIfInsteadOfWhen: + active: true + UseIsNullOrEmpty: + active: true + UseOrEmpty: + active: true + UseRequire: + active: false + UseRequireNotNull: + active: false + UselessCallOnNotNull: + active: true + UtilityClassWithPublicConstructor: + active: true + VarCouldBeVal: + active: true + WildcardImport: + active: true + excludeImports: + - 'java.util.*' + - 'kotlinx.android.synthetic.*' diff --git a/internal/git-hooks/pre-commit.sh b/internal/git-hooks/pre-commit.sh new file mode 100644 index 000000000..6eb2c2afb --- /dev/null +++ b/internal/git-hooks/pre-commit.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +echo "Running detekt..." +./gradlew detekt + +detektStatus=$? +if [[ "$detektStatus" = 0 ]] ; then + echo "Detekt run successfully" + exit 0 +else + echo 1>&2 "Detekt found violations" + exit 1 +fi \ No newline at end of file diff --git a/internal/guides/Detekt.md b/internal/guides/Detekt.md new file mode 100644 index 000000000..1a3a7f23c --- /dev/null +++ b/internal/guides/Detekt.md @@ -0,0 +1,89 @@ +# Detekt Guide + +The Spezi project utilizes [Detekt](https://detekt.dev/) as a static code analyzer for Kotlin. This guide contains relevant information regarding Detekt setup and its usage. + +## Introduction + +The project relies on the following Detekt dependencies: +1. Detekt plugin: `io.gitlab.arturbosch.detekt` +2. Detekt formatting library: `io.gitlab.arturbosch.detekt:detekt-formatting:${version}` + +Detekt is configured in the root project's `build.gradle.kts` file via the `Project.setupDetekt()` method, and it's applied to all subprojects (modules) of the project. It utilizes the [`detekt-config.yml`](../detekt-config.yml) configuration file, which contains all Detekt rules that the project complies with. + +Detekt plugin will create several Gradle tasks for the root project and for each module. You can run these tasks either via the terminal by using Gradle Wrapper at the root of the project: + +```bash +# Run Detekt analysis on the root project +./gradlew detekt + +# Run Detekt analysis on a specific module +./gradlew :moduleName:detekt +``` + +It's important to note that the Detekt task is configured to automatically correct any found violations (if the issue is autocorrectable); otherwise, the fix should be performed manually. + +Furthermore, Detekt is configured as a job in a [Github action](https://github.com/alaegin/Detekt-Action?tab=readme-ov-file) to run on every [pull request](../../.github/workflows/build-and-test.yml) pointing to the main project branch. The job is configured to comment violations in the `Files changed` section of the pull request. + +## Android Studio and local setup + +In addition to the project setup, we advise making use of [Android Studio Detekt plugin](https://plugins.jetbrains.com/plugin/10761-detekt) to have in-editor support pointing out potential violations and in-editor autocorrection. In order to install the plugin, follow these steps: + +1. Open `Android Studio` > `Settings` > `Plugins` > `Marketplace` +2. Search for `detekt` and install it +3. After installing, open `Android Studio` > `Settings` > `Tools` > `detekt` and enable the following configurations: + 1. `Enable background analysis` + 2. `Treat detekt findings as errors` + 3. `Enable formatting (ktlint) rules` + 4. Under `Files / Configuration files`, add the project's `detekt-config.yml` located at `SpeziKt/internal/detekt-config.yml` +4. Save the changes + +

+ +

+ +In order to comply automatically with some detekt rules, we advise to also perform the following configurations in Android studio + +1. Open `Android Studio` > `Settings` > `Editor` > `General` > `On Save` and check `Ensure every saved file ends with a line break` +2. Open `Android Studio` > `Settings` > `Editor` > `Kotlin` > `Scheme` and on in the settings icon import [spezi_code_style.xml](../spezi_code_style.xml) file at `SpeziKt/internal/spezi_code_style.xml`. This will allow formatting with respect to detekt formatting rules when applying `Code` > `Reformat Code / File` commands in Android studio (or the corresponding shortcuts) + +

+ +

+ +## Git hook + +To ensure that every code change satisfies Detekt rules, the project includes a `pre-commit.sh` script located at [internal/git-hooks/pre-commit.sh](../../internal/git-hooks/pre-commit.sh): + +```bash +#!/bin/bash + +echo "Running detekt..." +./gradlew detekt + +detektStatus=$? +if [[ "$detektStatus" = 0 ]] ; then + echo "Detekt run successfully" + exit 0 +else + echo 1>&2 "Detekt found violations" + exit 1 +fi +``` + +The script can be installed as a `pre-commit` git hook, which runs Detekt (with autocorrection enabled) before a commit is executed. This ensures that applied changes conform to Detekt rules. To install the git hook, the project contains a Gradle task under the group `spezi`, which activates the hook: + +

+ +

+ +or by running the task via gradle wrapper from the root of the project: + +```bash +./gradlew installGitHooks +``` + +If you don't want to use the pre-commit hook, you can either delete it from the `.git/hooks` folder or disable it for a single commit using the `--no-verify` option: + +```bash +git commit -m "Your commit message" --no-verify +``` diff --git a/internal/guides/resources/code_style.png b/internal/guides/resources/code_style.png new file mode 100644 index 0000000000000000000000000000000000000000..13fb37f7b5bcb43e990ef7c525878f6340917b1e GIT binary patch literal 126521 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

`ysZ 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

Y>iqN+C@`C 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 UieGwv3;dB3l@loudgb^304RtDsQ>@~ literal 0 HcmV?d00001 diff --git a/internal/guides/resources/detekt_config.png b/internal/guides/resources/detekt_config.png new file mode 100644 index 0000000000000000000000000000000000000000..a488604520ef813a94ad986f0af6724fbdceb1c5 GIT binary patch literal 76146 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 L)rSQS%!B_A;c;I) literal 0 HcmV?d00001 diff --git a/internal/guides/resources/gradle_installgithooks.png b/internal/guides/resources/gradle_installgithooks.png new file mode 100644 index 0000000000000000000000000000000000000000..f158383a5b313ef4bc7334d2310ab9fa7bb207f9 GIT binary patch literal 48141 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ʧ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 literal 0 HcmV?d00001 diff --git a/internal/spezi_code_style.xml b/internal/spezi_code_style.xml new file mode 100644 index 000000000..65c32b9c7 --- /dev/null +++ b/internal/spezi_code_style.xml @@ -0,0 +1,82 @@ + + diff --git a/modules/contact/build.gradle.kts b/modules/contact/build.gradle.kts index af8c7cbba..ecc4954de 100644 --- a/modules/contact/build.gradle.kts +++ b/modules/contact/build.gradle.kts @@ -10,4 +10,4 @@ android { dependencies { testImplementation(project(":core:testing")) androidTestImplementation(libs.bundles.compose.androidTest) -} \ No newline at end of file +} diff --git a/modules/contact/src/androidTest/kotlin/edu/stanford/spezi/modules/contact/ContactFactory.kt b/modules/contact/src/androidTest/kotlin/edu/stanford/spezi/modules/contact/ContactFactory.kt index 1aae6c37e..e97629523 100644 --- a/modules/contact/src/androidTest/kotlin/edu/stanford/spezi/modules/contact/ContactFactory.kt +++ b/modules/contact/src/androidTest/kotlin/edu/stanford/spezi/modules/contact/ContactFactory.kt @@ -14,8 +14,17 @@ object ContactFactory { description: String = "", organization: String = "", address: String = "", - options: List = emptyList() + options: List = emptyList(), ): Contact { - return Contact(id, icon, name, title, description, organization, address, options) + return Contact( + id = id, + icon = icon, + name = name, + title = title, + description = description, + organization = organization, + address = address, + options = options, + ) } -} \ No newline at end of file +} diff --git a/modules/contact/src/androidTest/kotlin/edu/stanford/spezi/modules/contact/ContactScreenTest.kt b/modules/contact/src/androidTest/kotlin/edu/stanford/spezi/modules/contact/ContactScreenTest.kt index 9923e5bef..398df1d7c 100644 --- a/modules/contact/src/androidTest/kotlin/edu/stanford/spezi/modules/contact/ContactScreenTest.kt +++ b/modules/contact/src/androidTest/kotlin/edu/stanford/spezi/modules/contact/ContactScreenTest.kt @@ -34,7 +34,6 @@ class ContactScreenTest { composeTestRule.onNodeWithText(contact.name).assertExists() } - @Test fun contactView_displaysContactOptions() { val contact = ContactFactory.create( @@ -90,15 +89,14 @@ class ContactScreenTest { @Test fun contactView_displaysContactDescription() { - val contact = - ContactFactory.create(description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.") + val description = "Lorem ipsum dolor sit amet" + val contact = ContactFactory.create(description = description) every { mockContactRepository.getContact() } returns contact composeTestRule.setContent { ContactScreen(ContactViewModel(mockContactRepository)) } - composeTestRule.onNodeWithText(mockContactRepository.getContact().description) - .assertExists() + composeTestRule.onNodeWithText(description).assertExists() } -} \ No newline at end of file +} diff --git a/modules/contact/src/androidTest/kotlin/edu/stanford/spezi/modules/contact/TestActivity.kt b/modules/contact/src/androidTest/kotlin/edu/stanford/spezi/modules/contact/TestActivity.kt index 314d0bdda..199503515 100644 --- a/modules/contact/src/androidTest/kotlin/edu/stanford/spezi/modules/contact/TestActivity.kt +++ b/modules/contact/src/androidTest/kotlin/edu/stanford/spezi/modules/contact/TestActivity.kt @@ -2,4 +2,4 @@ package edu.stanford.spezi.modules.contact import androidx.activity.ComponentActivity -class TestActivity : ComponentActivity() \ No newline at end of file +class TestActivity : ComponentActivity() diff --git a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/ContactScreen.kt b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/ContactScreen.kt index 4a730b6c2..6648541e3 100644 --- a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/ContactScreen.kt +++ b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/ContactScreen.kt @@ -1,6 +1,5 @@ package edu.stanford.spezi.modules.contact - import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi @@ -134,7 +133,9 @@ fun ContactScreen(viewModel: ContactViewModel) { @Preview @Composable -fun ContactScreenPreview(@PreviewParameter(ContactViewModelPreviewParameterProvider::class) viewModel: ContactViewModel) { +fun ContactScreenPreview( + @PreviewParameter(ContactViewModelPreviewParameterProvider::class) viewModel: ContactViewModel, +) { SpeziTheme { ContactScreen(viewModel) } @@ -144,4 +145,4 @@ class ContactViewModelPreviewParameterProvider : PreviewParameterProvider = sequenceOf( ContactViewModel(DefaultContactRepository()), ) -} \ No newline at end of file +} diff --git a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/ContactViewModel.kt b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/ContactViewModel.kt index 0f0984f8f..a713b1090 100644 --- a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/ContactViewModel.kt +++ b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/ContactViewModel.kt @@ -56,4 +56,4 @@ class ContactViewModel(private val repository: ContactRepository) : ViewModel() } } } -} \ No newline at end of file +} diff --git a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/OnAction.kt b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/OnAction.kt index f653ee51c..c89e7655e 100644 --- a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/OnAction.kt +++ b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/OnAction.kt @@ -5,4 +5,4 @@ import edu.stanford.spezi.modules.contact.model.ContactOption sealed interface OnAction { data class CardClicked(val option: ContactOption) : OnAction data class NavigateTo(val address: String) : OnAction -} \ No newline at end of file +} diff --git a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/component/ContactOptionCard.kt b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/component/ContactOptionCard.kt index 16f6f13aa..9546dbcff 100644 --- a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/component/ContactOptionCard.kt +++ b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/component/ContactOptionCard.kt @@ -73,4 +73,4 @@ fun ContactOptionCardPreview() { publisher = { action -> println(action) } ) } -} \ No newline at end of file +} diff --git a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/component/NavigationCard.kt b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/component/NavigationCard.kt index 8ccb11662..bbfcca4ad 100644 --- a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/component/NavigationCard.kt +++ b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/component/NavigationCard.kt @@ -71,4 +71,4 @@ fun NavigationCardPreview() { NavigationCard("1234 Main Street, 12345 City", publisher = { action -> println(action) }) } -} \ No newline at end of file +} diff --git a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/model/Contact.kt b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/model/Contact.kt index efbbbe3a5..385d6e115 100644 --- a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/model/Contact.kt +++ b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/model/Contact.kt @@ -27,7 +27,7 @@ data class Contact( val description: String, val organization: String, val address: String, - val options: List + val options: List, ) /** @@ -46,7 +46,7 @@ data class ContactOption( val name: String, val value: String, val icon: ImageVector?, - val optionType: ContactOptionType + val optionType: ContactOptionType, ) /** @@ -56,4 +56,4 @@ data class ContactOption( */ enum class ContactOptionType { CALL, EMAIL, WEBSITE -} \ No newline at end of file +} diff --git a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/repository/ContactRepository.kt b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/repository/ContactRepository.kt index f6fc72ee9..e4d747370 100644 --- a/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/repository/ContactRepository.kt +++ b/modules/contact/src/main/kotlin/edu/stanford/spezi/modules/contact/repository/ContactRepository.kt @@ -26,7 +26,7 @@ class DefaultContactRepository : ContactRepository { icon = null, name = "Leland Stanford", title = "CEO", - description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", organization = "Stanford University", address = "450 Jane Stanford Way Stanford, CA", options = listOf( @@ -54,4 +54,4 @@ class DefaultContactRepository : ContactRepository { ) ) } -} \ No newline at end of file +} diff --git a/modules/contact/src/test/kotlin/edu/stanford/spezi/modules/contact/ContactRepositoryTest.kt b/modules/contact/src/test/kotlin/edu/stanford/spezi/modules/contact/DefaultContactRepositoryTest.kt similarity index 84% rename from modules/contact/src/test/kotlin/edu/stanford/spezi/modules/contact/ContactRepositoryTest.kt rename to modules/contact/src/test/kotlin/edu/stanford/spezi/modules/contact/DefaultContactRepositoryTest.kt index 8d0c7c465..062965e0f 100644 --- a/modules/contact/src/test/kotlin/edu/stanford/spezi/modules/contact/ContactRepositoryTest.kt +++ b/modules/contact/src/test/kotlin/edu/stanford/spezi/modules/contact/DefaultContactRepositoryTest.kt @@ -21,9 +21,7 @@ class DefaultContactRepositoryTest { with(contact) { assertThat(name).isEqualTo("Leland Stanford") assertThat(title).isEqualTo("CEO") - assertThat(description).isEqualTo( - "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." - ) + assertThat(description).isEqualTo("Lorem ipsum dolor sit amet, consectetur adipiscing elit.") assertThat(organization).isEqualTo("Stanford University") assertThat(address).isEqualTo("450 Jane Stanford Way Stanford, CA") assertThat(options.size).isEqualTo(3) @@ -32,4 +30,4 @@ class DefaultContactRepositoryTest { assertThat(options[0].optionType).isEqualTo(ContactOptionType.CALL) } } -} \ No newline at end of file +} diff --git a/modules/onboarding/build.gradle.kts b/modules/onboarding/build.gradle.kts index 5a805d56b..0ffcb9cac 100644 --- a/modules/onboarding/build.gradle.kts +++ b/modules/onboarding/build.gradle.kts @@ -5,4 +5,4 @@ plugins { android { namespace = "edu.stanford.spezi.modules.onboarding" -} \ No newline at end of file +} diff --git a/modules/onboarding/src/main/kotlin/edu/stanford/spezi/modules/onboarding/OnboardingScreen.kt b/modules/onboarding/src/main/kotlin/edu/stanford/spezi/modules/onboarding/OnboardingScreen.kt index 1ebfde7e8..7e2dc272b 100644 --- a/modules/onboarding/src/main/kotlin/edu/stanford/spezi/modules/onboarding/OnboardingScreen.kt +++ b/modules/onboarding/src/main/kotlin/edu/stanford/spezi/modules/onboarding/OnboardingScreen.kt @@ -10,11 +10,10 @@ fun OnboardingScreen() { Text(text = "Onboarding Screen") } - @Preview @Composable fun OnboardingScreenPreview() { SpeziTheme { OnboardingScreen() } -} \ No newline at end of file +} From 99445f165a4fc46453a0c2dc28a57dbc522b1f1e Mon Sep 17 00:00:00 2001 From: eldcn Date: Sun, 2 Jun 2024 13:50:12 +0200 Subject: [PATCH 2/3] Make build test workflow reusable (#22) # *Name of the PR* ## :recycle: Current situation & Problem *Link any open issues or pull requests (PRs) related to this PR. Please ensure that all non-trivial PRs are first tracked and discussed in an existing GitHub issue or discussion.* ## :gear: Release Notes *Add a bullet point list summary of the feature and possible migration guides if this is a breaking change so this section can be added to the release notes.* *Include code snippets that provide examples of the feature implemented or links to the documentation if it appends or changes the public interface.* ## :books: Documentation *Please ensure that you properly document any additions in conformance to [Spezi Documentation Guide](https://github.com/StanfordSpezi/.github/blob/main/DOCUMENTATIONGUIDE.md).* *You can use this section to describe your solution, but we encourage contributors to document your reasoning and changes using in-line documentation.* ## :white_check_mark: Testing *Please ensure that the PR meets the testing requirements set by CodeCov and that new functionality is appropriately tested.* *This section describes important information about the tests and why some elements might not be testable.* ## :pencil: Code of Conduct & Contributing Guidelines By submitting creating this pull request, you agree to follow our [Code of Conduct](https://github.com/StanfordSpezi/.github/blob/main/CODE_OF_CONDUCT.md) and [Contributing Guidelines](https://github.com/StanfordSpezi/.github/blob/main/CONTRIBUTING.md): - [ ] I agree to follow the [Code of Conduct](https://github.com/StanfordSpezi/.github/blob/main/CODE_OF_CONDUCT.md) and [Contributing Guidelines](https://github.com/StanfordSpezi/.github/blob/main/CONTRIBUTING.md). --- ...ld-and-test.yml => build-test-analyze.yml} | 31 +++--------------- .github/workflows/main.yml | 8 ++--- .github/workflows/pull-request.yml | 32 +++++++++++++++++++ internal/guides/Detekt.md | 2 +- 4 files changed, 42 insertions(+), 31 deletions(-) rename .github/workflows/{build-and-test.yml => build-test-analyze.yml} (58%) create mode 100644 .github/workflows/pull-request.yml diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-test-analyze.yml similarity index 58% rename from .github/workflows/build-and-test.yml rename to .github/workflows/build-test-analyze.yml index ec2ee2e6e..6fc00099c 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-test-analyze.yml @@ -1,33 +1,12 @@ -name: Pull Request +name: Build, Test and Analyze on: - pull_request: - branches: [ "main" ] - -concurrency: - group: build-${{ github.ref }} - cancel-in-progress: true + workflow_dispatch: + workflow_call: jobs: - detekt: - name: Detekt review - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4.1.0 - with: - fetch-depth: 1 - ref: ${{ github.head_ref }} - - name: Detekt PR Check - uses: alaegin/Detekt-Action@v1.23.6 - with: - reviewdog_reporter: github-pr-check - github_token: ${{ secrets.github_token }} - fail_on_error: true - detekt_config: internal/detekt-config.yml - - buildtestanalyze: - name: Build, test and analyze + buildtestandanalyze: + name: Build, Test and Analyze runs-on: ubuntu-latest timeout-minutes: 120 permissions: # needed for CodeQL steps diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0e52b4925..13fd9e13b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,14 +9,14 @@ concurrency: cancel-in-progress: true jobs: - buildtestanalyze: - uses: ./.github/workflows/build-and-test.yml + buildtestandanalyze: + uses: ./.github/workflows/build-test-analyze.yml secrets: inherit uploadartifacts: name: Archive production artifacts runs-on: ubuntu-latest - needs: buildtestanalyze + needs: buildtestandanalyze steps: - name: Checkout code uses: actions/checkout@v4.1.0 @@ -28,7 +28,7 @@ jobs: dokka: runs-on: ubuntu-latest - needs: buildtestanalyze + needs: buildtestandanalyze steps: - name: Checkout code uses: actions/checkout@v4.1.0 diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 000000000..48c711900 --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,32 @@ +name: Pull Request + +on: + pull_request: + branches: [ "main" ] + +concurrency: + group: build-${{ github.ref }} + cancel-in-progress: true + +jobs: + detekt: + name: Detekt review + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4.1.0 + with: + fetch-depth: 1 + ref: ${{ github.head_ref }} + - name: Detekt PR Check + uses: alaegin/Detekt-Action@v1.23.6 + with: + reviewdog_reporter: github-pr-check + github_token: ${{ secrets.github_token }} + fail_on_error: true + detekt_config: internal/detekt-config.yml + + buildtestandanalyze: + uses: ./.github/workflows/build-test-analyze.yml + secrets: inherit + diff --git a/internal/guides/Detekt.md b/internal/guides/Detekt.md index 1a3a7f23c..55095818d 100644 --- a/internal/guides/Detekt.md +++ b/internal/guides/Detekt.md @@ -22,7 +22,7 @@ Detekt plugin will create several Gradle tasks for the root project and for each It's important to note that the Detekt task is configured to automatically correct any found violations (if the issue is autocorrectable); otherwise, the fix should be performed manually. -Furthermore, Detekt is configured as a job in a [Github action](https://github.com/alaegin/Detekt-Action?tab=readme-ov-file) to run on every [pull request](../../.github/workflows/build-and-test.yml) pointing to the main project branch. The job is configured to comment violations in the `Files changed` section of the pull request. +Furthermore, Detekt is configured as a job in a [Github action](https://github.com/alaegin/Detekt-Action?tab=readme-ov-file) to run on every [pull request](../../.github/workflows/pull-request.yml) pointing to the main project branch. The job is configured to comment violations in the `Files changed` section of the pull request. ## Android Studio and local setup From a0cb8c6634b1b318ec4ac43ea43c6cdbbee64be4 Mon Sep 17 00:00:00 2001 From: eldcn Date: Sun, 2 Jun 2024 23:49:24 +0200 Subject: [PATCH 3/3] Setup Codecov with Jacoco (#23) # Setup Codecov with Jacoco Fixes #10 ## :recycle: Current situation & Problem *Link any open issues or pull requests (PRs) related to this PR. Please ensure that all non-trivial PRs are first tracked and discussed in an existing GitHub issue or discussion.* ## :gear: Release Notes *Add a bullet point list summary of the feature and possible migration guides if this is a breaking change so this section can be added to the release notes.* *Include code snippets that provide examples of the feature implemented or links to the documentation if it appends or changes the public interface.* ## :books: Documentation *Please ensure that you properly document any additions in conformance to [Spezi Documentation Guide](https://github.com/StanfordSpezi/.github/blob/main/DOCUMENTATIONGUIDE.md).* *You can use this section to describe your solution, but we encourage contributors to document your reasoning and changes using in-line documentation.* ## :white_check_mark: Testing *Please ensure that the PR meets the testing requirements set by CodeCov and that new functionality is appropriately tested.* *This section describes important information about the tests and why some elements might not be testable.* ## :pencil: Code of Conduct & Contributing Guidelines By submitting creating this pull request, you agree to follow our [Code of Conduct](https://github.com/StanfordSpezi/.github/blob/main/CODE_OF_CONDUCT.md) and [Contributing Guidelines](https://github.com/StanfordSpezi/.github/blob/main/CONTRIBUTING.md): - [ ] I agree to follow the [Code of Conduct](https://github.com/StanfordSpezi/.github/blob/main/CODE_OF_CONDUCT.md) and [Contributing Guidelines](https://github.com/StanfordSpezi/.github/blob/main/CONTRIBUTING.md). --- .github/workflows/build-test-analyze.yml | 7 ++++ .github/workflows/main.yml | 4 +-- README.md | 7 ++-- app/src/main/AndroidManifest.xml | 2 +- build.gradle.kts | 43 ++++++++++++++++++++++++ 5 files changed, 57 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-test-analyze.yml b/.github/workflows/build-test-analyze.yml index 6fc00099c..8171787ef 100644 --- a/.github/workflows/build-test-analyze.yml +++ b/.github/workflows/build-test-analyze.yml @@ -37,3 +37,10 @@ jobs: uses: github/codeql-action/analyze@v3 with: category: "/language:java-kotlin" + - name: Upload JaCoCo report to Codecov + uses: codecov/codecov-action@v4 + with: + files: '**/build/reports/jacoco/jacocoCoverageReport/jacocoCoverageReport.xml' + flags: unittests + name: codecov-coverage + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 13fd9e13b..00b9e3a20 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,4 +1,4 @@ -name: Merge +name: Main on: push: @@ -24,7 +24,7 @@ jobs: uses: actions/upload-artifact@v2 with: name: app - path: app/build/outputs/apk/ + path: app/build/outputs/apk/release/app-release-unsigned.apk dokka: runs-on: ubuntu-latest diff --git a/README.md b/README.md index 932418c8b..6af06bdf6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ -[![Android CI](https://github.com/Basler182/Spezi/actions/workflows/android.yml/badge.svg)](https://github.com/StanfordSpezi/SpeziKt/actions/workflows/android.yml) -[![pages-build-deployment](https://github.com/Basler182/SpeziKt/actions/workflows/pages/pages-build-deployment/badge.svg?branch=gh-pages)](https://github.com/Basler182/SpeziKt/actions/workflows/pages/pages-build-deployment) +[![Main](https://github.com/StanfordSpezi/SpeziKt/actions/workflows/main.yml/badge.svg)](https://github.com/StanfordSpezi/SpeziKt/actions/workflows/main.yml) +[![Github Pages](https://github.com/StanfordSpezi/SpeziKt/actions/workflows/pages/pages-build-deployment/badge.svg?branch=gh-pages)](https://github.com/StanfordSpezi/SpeziKt/actions/workflows/pages/pages-build-deployment) +[![Codecov](https://codecov.io/gh/StanfordSpezi/SpeziKt/branch/main/graph/badge.svg)](https://app.codecov.io/gh/StanfordSpezi/SpeziKt) # Spezi Kotlin & Android Version of the Stanford Spezi Framework @@ -11,4 +12,4 @@ Spezi is a collection of modules that can be used to build Android applications ### Modules - **Design System**: Provides a cohesive user interface and user experience - components. [Read More](./core/design/README.md) \ No newline at end of file + components. [Read More](./core/design/README.md) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e29fee29e..5cebfd406 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,4 +24,4 @@ - \ No newline at end of file + diff --git a/build.gradle.kts b/build.gradle.kts index 2662735e4..a445b14e6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,12 +9,14 @@ plugins { alias(libs.plugins.dokka) version libs.versions.dokka alias(libs.plugins.google.devtools.ksp) version libs.versions.kspVersion apply false alias(libs.plugins.hilt.android) version libs.versions.hiltVersion apply false + jacoco alias(libs.plugins.jetbrains.kotlin.android) apply false } subprojects { setupDokka() setupDetekt() + setupJacoco() } installCustomTasks() @@ -86,6 +88,47 @@ fun Project.setupDetekt() { } } +fun Project.setupJacoco() { + apply(plugin = "jacoco") + val buildDir = layout.buildDirectory.get() + val coverageExclusions = listOf( + // Android + "**/R.class", + "**/R\$*.class", + "**/BuildConfig.*", + "**/Manifest*.*", + "**/*_Hilt*.class", + "**/Hilt_*.class", + "**/*Activity.class", + "**/*Application.class", + "**/di/*Module.*", + ) + val reportTask = tasks.register("jacocoCoverageReport", JacocoReport::class.java) { + classDirectories.setFrom( + fileTree("$buildDir/intermediates/classes/debug") { + exclude(coverageExclusions) + } + fileTree("$buildDir/tmp/kotlin-classes/debug") { + exclude(coverageExclusions) + } + ) + reports { + html.required.set(true) + xml.required.set(true) + } + + sourceDirectories.setFrom(files("$projectDir/src/main")) + executionData.setFrom(files("$buildDir/outputs/unit_test_code_coverage/debugUnitTest/testDebugUnitTest.exec")) + } + + tasks.withType().configureEach { + configure { + isIncludeNoLocationClasses = true + excludes = listOf("jdk.internal.*") + } + finalizedBy(reportTask) + } +} + /** * Installs all custom tasks defined in /gradle/tasks */