diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..3381f76 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,68 @@ +name: CI + +on: + pull_request: + branches: [ main ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Make gradlew executable + run: chmod +x ./gradlew + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 17 + cache: gradle + - name: Run Android lint + run: ./gradlew lint + + detekt: + name: Detekt + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Make gradlew executable + run: chmod +x ./gradlew + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 17 + cache: gradle + - name: Run Detekt + run: ./gradlew detekt + + unit-tests: + name: Unit Tests & Coverage (≥80%) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Make gradlew executable + run: chmod +x ./gradlew + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 17 + cache: gradle + - name: Run unit tests with coverage + run: ./gradlew testDebugUnitTest + - name: Upload coverage reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: coverage-reports + path: | + app/build/reports/coverage/ + scanner-core/build/reports/coverage/ + scanner-ui/build/reports/coverage/ + scanner-rules/build/reports/coverage/ + retention-days: 14 + - name: Check coverage ≥ 80% + run: python3 scripts/check_coverage.py . 80 diff --git a/.gitignore b/.gitignore index aa724b7..b904214 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,6 @@ .externalNativeBuild .cxx local.properties +/.idea/markdown.xml +/.idea/gradle.xml +/.idea/misc.xml \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7ce9f28..267b8c7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,6 +1,8 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.compose) + alias(libs.plugins.hilt) + alias(libs.plugins.ksp) } android { @@ -22,6 +24,9 @@ android { } buildTypes { + debug { + enableUnitTestCoverage = true + } release { isMinifyEnabled = false proguardFiles( @@ -40,6 +45,9 @@ android { } dependencies { + implementation(project(":scanner-ui")) + implementation(libs.hilt.android) + ksp(libs.hilt.android.compiler) implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.activity.compose) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e1a7864..7cabb79 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> + + + + + + + + + + + + diff --git a/sample/src/main/java/com/composea11yscanner/sample/SampleActivity.kt b/sample/src/main/java/com/composea11yscanner/sample/SampleActivity.kt new file mode 100644 index 0000000..e8ad775 --- /dev/null +++ b/sample/src/main/java/com/composea11yscanner/sample/SampleActivity.kt @@ -0,0 +1,36 @@ +package com.composea11yscanner.sample + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class SampleActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContent { SampleApp() } + } +} + +@Composable +fun SampleApp(modifier: Modifier = Modifier) { + Scaffold(modifier = modifier.fillMaxSize()) { innerPadding -> + Text(text = "ComposeA11yScanner Sample", modifier = Modifier.padding(innerPadding)) + } +} + +@Preview(showBackground = true) +@Composable +fun SampleAppPreview() { + SampleApp() +} diff --git a/sample/src/main/java/com/composea11yscanner/sample/SampleApplication.kt b/sample/src/main/java/com/composea11yscanner/sample/SampleApplication.kt new file mode 100644 index 0000000..d8f21dc --- /dev/null +++ b/sample/src/main/java/com/composea11yscanner/sample/SampleApplication.kt @@ -0,0 +1,7 @@ +package com.composea11yscanner.sample + +import android.app.Application +import dagger.hilt.android.HiltAndroidApp + +@HiltAndroidApp +class SampleApplication : Application() diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml new file mode 100644 index 0000000..4a3e95c --- /dev/null +++ b/sample/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + A11y Scanner Sample + diff --git a/sample/src/main/res/values/themes.xml b/sample/src/main/res/values/themes.xml new file mode 100644 index 0000000..df1c1fa --- /dev/null +++ b/sample/src/main/res/values/themes.xml @@ -0,0 +1,4 @@ + + +