Skip to content

Commit ffbf9a2

Browse files
committed
Release v1.8.180 — catalog: promote hardcoded testImpl strings; reject "dead pin" claim
Three test deps in app/build.gradle.kts were hardcoded coordinate strings ("androidx.compose.ui:ui-test-junit4", "androidx.test:runner:1.7.0", "junit:junit:4.13.2"), bypassing the version catalog. Dependabot's grouped update rules (android-test-tooling pattern in .github/dependabot.yml) skipped them, and bumps required hand-editing the .kts. Promoted all three to libs.versions.toml entries. New catalog rows (additive, no edits to existing live pins): [versions] androidx-test-runner = "1.7.0" [versions] junit4 = "4.13.2" [libraries] androidx-test-runner = "androidx.test:runner" [libraries] androidx-compose-ui-test-junit4 = "androidx.compose.ui:ui-test-junit4" # compose-BOM-managed [libraries] junit4 = "junit:junit" app/build.gradle.kts now consumes them via libs.* accessors. JUnit 4 is intentionally pinned because Robolectric's @RunWith and Compose's createComposeRule() ship as JUnit-4 rules; junit-vintage-engine bridges them onto the project-wide useJUnitPlatform() runner. Kotest 6 remains the primary test framework. RESEARCH_FEATURE_PLAN.md F33 ("coil + material-kolor are dead pins") was investigated and rejected: both are live in sibling library modules. lib/snygg/build.gradle.kts:103-104 uses libs.coil.compose + libs.coil.gif; lib/color/build.gradle.kts:60 uses libs.material.kolor. The catalog entries stay; F33 is closed as rejected. Closes RESEARCH_FEATURE_PLAN.md F34. Verification: - grep -E "implementation\(\"[a-z.]+:[a-z-]+" app/build.gradle.kts -> 0 matches - grep -rn "libs\.coil\|libs\.material\.kolor" lib/ -> expected matches in lib/snygg/build.gradle.kts and lib/color/build.gradle.kts - bash scripts/check-fastlane-metadata.sh -> OK (versionCode 1980) - bash scripts/check-repo-hygiene.sh -> OK - Gradle compile + Dependabot grouping verification deferred to maintainer host per CLAUDE.md
1 parent e271ac0 commit ffbf9a2

7 files changed

Lines changed: 65 additions & 8 deletions

File tree

CHANGELOG.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,53 @@
22

33
All SwiftFloris release history is consolidated here. This replaces the former root-level `RELEASE_NOTES_v*.md` file-per-release pattern.
44

5+
<a id="v1.8.180"></a>
6+
## v1.8.180
7+
8+
Released: 2026-05-25
9+
10+
### Version catalog hygiene (RESEARCH_FEATURE_PLAN.md F34; F33 investigated and rejected)
11+
12+
The 2026-05-25 build/CI reconnaissance pass flagged three hardcoded `testImplementation` coordinate strings in [`app/build.gradle.kts`](app/build.gradle.kts) lines 498–500 (`"androidx.compose.ui:ui-test-junit4"`, `"androidx.test:runner:1.7.0"`, `"junit:junit:4.13.2"`). Hardcoded strings bypass the version catalog, which means Dependabot's grouped Android-runtime / Android-test-tooling update rules (`.github/dependabot.yml`) skip them, and bumps require hand-editing the `.kts` file instead of a single catalog entry.
13+
14+
The same pass also claimed `coil` and `material-kolor` were dead catalog pins (F33). Verification on this run found both are actively consumed by sibling library modules: `lib/snygg/build.gradle.kts:103-104` uses `libs.coil.compose` + `libs.coil.gif`, and `lib/color/build.gradle.kts:60` uses `libs.material.kolor`. The "dead pin" claim came from grepping only `app/`, which missed the sibling modules. F33 is therefore rejected and the catalog entries remain.
15+
16+
### Changes
17+
18+
- **`gradle/libs.versions.toml`** — added three new entries:
19+
- `[versions] androidx-test-runner = "1.7.0"`
20+
- `[versions] junit4 = "4.13.2"`
21+
- `[libraries] androidx-test-runner = { module = "androidx.test:runner", version.ref = "androidx-test-runner" }`
22+
- `[libraries] androidx-compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" }` (no `version.ref` — coordinate is managed by the existing `androidx-compose-bom`)
23+
- `[libraries] junit4 = { module = "junit:junit", version.ref = "junit4" }`
24+
- **`app/build.gradle.kts:498-500`** — replaced the three hardcoded coordinate strings with their new catalog accessors:
25+
- `testImplementation("androidx.compose.ui:ui-test-junit4")` → `testImplementation(libs.androidx.compose.ui.test.junit4)`
26+
- `testImplementation("androidx.test:runner:1.7.0")` → `testImplementation(libs.androidx.test.runner)`
27+
- `testImplementation("junit:junit:4.13.2")` → `testImplementation(libs.junit4)`
28+
29+
### Why JUnit 4 is still pinned
30+
31+
JUnit 4 is **not** a primary test framework here — the project's main test runner is Kotest 6 on JUnit Platform (`useJUnitPlatform()` per the existing `tasks.withType<Test>` block). The JUnit-4 transitive surface stays because Robolectric's `@RunWith(RobolectricTestRunner::class)` rule and Compose's `createComposeRule()` ship as JUnit-4 rules, and `junit-vintage-engine` bridges them onto the JUnit-Platform runner. Pinning `junit:junit:4.13.2` (the last stable JUnit 4) keeps the bridge deterministic. JUnit 5 / JUnit Platform stays the primary runner for new tests.
32+
33+
### Verification
34+
35+
- `bash scripts/check-repo-hygiene.sh` → OK.
36+
- `bash scripts/check-fastlane-metadata.sh` → OK (versionCode 1980).
37+
- `git diff gradle/libs.versions.toml` shows only the three additive entries; no edits to existing live pins.
38+
- `grep -E "implementation\(\"[a-z.]+:[a-z-]+" app/build.gradle.kts` returns no remaining hardcoded coordinate strings.
39+
- Sibling-module usage confirmed: `grep -rn "libs\.coil\|libs\.material\.kolor" lib/` returns the expected matches in `lib/snygg/build.gradle.kts` and `lib/color/build.gradle.kts`.
40+
- Gradle compile + Dependabot grouping verification deferred to maintainer host per `CLAUDE.md`.
41+
42+
### Files Touched
43+
44+
- `gradle/libs.versions.toml`
45+
- `app/build.gradle.kts`
46+
- `fastlane/metadata/android/en-US/changelogs/1980.txt` (new)
47+
- `gradle.properties` (versionCode 1979→1980, versionName 1.8.179→1.8.180)
48+
- `README.md` (version badge)
49+
- `CHANGELOG.md` (this section)
50+
- `RESEARCH_FEATURE_PLAN.md` (tick F34, mark F33 rejected with reason)
51+
552
<a id="v1.8.179"></a>
653
## v1.8.179
754

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# SwiftFloris
22

3-
![Version](https://img.shields.io/badge/version-v1.8.179-blue) ![License](https://img.shields.io/badge/license-Apache%202.0-green) ![Platform](https://img.shields.io/badge/platform-Android%208.0+-orange) ![Network](https://img.shields.io/badge/network-none-lightgrey) ![SwiftKey migration](https://img.shields.io/badge/SwiftKey%20migration-window%20closes%202026--05--31-red)
3+
![Version](https://img.shields.io/badge/version-v1.8.180-blue) ![License](https://img.shields.io/badge/license-Apache%202.0-green) ![Platform](https://img.shields.io/badge/platform-Android%208.0+-orange) ![Network](https://img.shields.io/badge/network-none-lightgrey) ![SwiftKey migration](https://img.shields.io/badge/SwiftKey%20migration-window%20closes%202026--05--31-red)
44

55
**SwiftFloris** is a privacy-first Android keyboard, forked from FlorisBoard and pushed toward SwiftKey-class multilingual typing without the cloud. It ships under Apache-2.0, holds no `INTERNET` permission, and binds zero accounts.
66

RESEARCH_FEATURE_PLAN.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,9 +1021,9 @@ The items above promote to:
10211021

10221022
- [ ] **P2** — F32 — **Empty `try/catch (_: Throwable)` audit**. Replace silent drops at `TextKeyData.kt:637/656` and `FlorisImeService.kt:758` with `flogWarning`. Touches: those two files. Complexity: S.
10231023

1024-
- [ ] **P2** — F33 — **Delete dead catalog pins** `coil` and `material-kolor` from `libs.versions.toml`. Update PROJECT_CONTEXT.md §3 to match. Complexity: S.
1024+
- [~] **P2** — F33 — **Delete dead catalog pins** `coil` and `material-kolor`. **Rejected on investigation (2026-05-25)**: both are actively consumed by sibling library modules — `lib/snygg/build.gradle.kts:103-104` uses `libs.coil.compose` + `libs.coil.gif`, and `lib/color/build.gradle.kts:60` uses `libs.material.kolor`. The original claim came from grepping only `app/` source; the catalog pins are live.
10251025

1026-
- [ ] **P2** — F34 — **Move hard-coded `testImplementation` strings** at `app/build.gradle.kts:498-500` into the version catalog so Dependabot can update them. Complexity: S.
1026+
- [x] **P2** — F34 — **Move hard-coded `testImplementation` strings** at `app/build.gradle.kts:498-500` into the version catalog so Dependabot can update them. Complexity: S. **Shipped v1.8.180 (2026-05-25)** — promoted `androidx-test-runner`, `junit4`, and `androidx-compose-ui-test-junit4` (compose-BOM-managed, no version ref) into `libs.versions.toml`; `app/build.gradle.kts` consumes them via `libs.*` accessors.
10271027

10281028
- [x] **P2** — F35 — **Refresh `docs/THREAT_MODEL.md`** — currently 105 versions stale. Reflect v1.8.104-122 privacy regressions closed + addon trust pin store. Complexity: M. **Shipped v1.8.176 (2026-05-25)** — added a 20-bullet "What changed since the v1.8.68 baseline" audit-trail section covering v1.8.85 → v1.8.175.
10291029

app/build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -495,9 +495,9 @@ dependencies {
495495
testImplementation(libs.roborazzi.junit.rule)
496496
testImplementation(libs.robolectric)
497497
testImplementation(libs.androidx.test.ext)
498-
testImplementation("androidx.compose.ui:ui-test-junit4")
499-
testImplementation("androidx.test:runner:1.7.0")
500-
testImplementation("junit:junit:4.13.2")
498+
testImplementation(libs.androidx.compose.ui.test.junit4)
499+
testImplementation(libs.androidx.test.runner)
500+
testImplementation(libs.junit4)
501501
testRuntimeOnly(libs.junit.vintage.engine)
502502
androidTestImplementation(libs.androidx.test.ext)
503503
androidTestImplementation(libs.androidx.test.espresso.core)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
v1.8.180 — version catalog: promote hardcoded testImpl strings.
2+
3+
Three testImplementation coordinate strings in app/build.gradle.kts ("androidx.compose.ui:ui-test-junit4", "androidx.test:runner:1.7.0", "junit:junit:4.13.2") now live in libs.versions.toml so Dependabot can update them. Investigated coil + material-kolor as supposed dead pins; both are live in lib/snygg + lib/color, kept.
4+
5+
No app behaviour changes.

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ projectMinSdk=26
1515
projectTargetSdk=36
1616
projectCompileSdk=36
1717

18-
projectVersionCode=1979
19-
projectVersionName=1.8.179
18+
projectVersionCode=1980
19+
projectVersionName=1.8.180

gradle/libs.versions.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ zxing-core = "3.5.4"
3232
androidx-benchmark = "1.4.1"
3333
androidx-test-ext = "1.3.0"
3434
androidx-test-espresso = "3.7.0"
35+
androidx-test-runner = "1.7.0"
3536
androidx-test-uiautomator = "2.3.0"
37+
junit4 = "4.13.2"
3638
kotest = "6.1.11"
3739
junit-vintage = "6.0.3"
3840
kotlinx-kover = "0.9.8"
@@ -87,7 +89,10 @@ zxing-core = { module = "com.google.zxing:core", version.ref = "zxing-core" }
8789
androidx-benchmark-macro = { module = "androidx.benchmark:benchmark-macro-junit4", version.ref = "androidx-benchmark" }
8890
androidx-test-ext = { module = "androidx.test.ext:junit", version.ref = "androidx-test-ext" }
8991
androidx-test-espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "androidx-test-espresso" }
92+
androidx-test-runner = { module = "androidx.test:runner", version.ref = "androidx-test-runner" }
9093
androidx-test-uiautomator = { module = "androidx.test.uiautomator:uiautomator", version.ref = "androidx-test-uiautomator" }
94+
androidx-compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" }
95+
junit4 = { module = "junit:junit", version.ref = "junit4" }
9196
kotest-assertions-core = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" }
9297
kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" }
9398
kotest-runner-junit5 = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" }

0 commit comments

Comments
 (0)