mirror of
https://github.com/priyanshujain/sanderling.git
synced 2026-10-04 12:07:09 +00:00
refactor(folio): delete :composeApp and retarget tooling
Removes the old monolithic module now that :core / :app:shared / :app:ui-components / :app:androidApp own the source. Updates: - justfile install/uninstall recipes -> :app:androidApp - iosApp/project.yml framework path -> ../app/shared/..., baseName Shared (was ComposeApp); pre-build script invokes :app:shared:linkDebugFrameworkIosSimulatorArm64 - iosApp/iosApp/iOSApp.swift -> import Shared - README -> mentions SQLDelight unification, drops the data-carrier contentDescription notes (now stale), no Layout section per repo convention
This commit is contained in:
1 parent
5121f777f2
commit
3288364424
63 files changed
+21
-2370
No files matched your search
@@ -2,14 +2,15 @@
|
||||
|
||||
A minimal Kotlin Multiplatform personal-ledger app: login with demo
|
||||
credentials, create accounts, add credits and debits. Shared UI across
|
||||
Android, iOS, and Web via Compose Multiplatform. Doubles as the example
|
||||
Android and iOS via Compose Multiplatform. Doubles as the example
|
||||
sanderling runs its property-based specs against.
|
||||
|
||||
## Stack
|
||||
|
||||
- Kotlin Multiplatform + Compose Multiplatform (shared UI)
|
||||
- kotlinx.serialization for file-backed persistence
|
||||
- SQLDelight for the data layer (unified across platforms)
|
||||
- kotlinx.coroutines for state flows
|
||||
- kotlinx.serialization for `@Serializable` route types
|
||||
|
||||
## Prerequisites
|
||||
|
||||
@@ -35,8 +36,8 @@ IOS_DEVICE="iPhone 15" just ios # pick a different simulator
|
||||
```
|
||||
|
||||
`just ios` regenerates `iosApp/iosApp.xcodeproj` from `iosApp/project.yml`,
|
||||
builds the KMP framework, links it into the SwiftUI host, installs, and
|
||||
launches.
|
||||
builds the KMP framework (`Shared.framework` from `:app:shared`), links it
|
||||
into the SwiftUI host, installs, and launches.
|
||||
|
||||
## Demo credentials
|
||||
|
||||
@@ -69,9 +70,13 @@ Traces land in `./sanderling/runs/<timestamp>/`.
|
||||
|
||||
## How it connects to sanderling
|
||||
|
||||
- UI elements expose state via content descriptions (`account:$id:$balance`,
|
||||
`ledger_row:$id:$signed`, `ledger_balance:$cents`, `active_account:$id`,
|
||||
`focused_input:$field`)
|
||||
- Each screen sets a stable Compose `testTag` (`HomeScreen`, `AccountCard`,
|
||||
`LedgerRow`, `TxnAmount`, ...). The Sanderling SDK resolves `testTag` to
|
||||
`resource-id` on Android and `accessibilityIdentifier` on iOS.
|
||||
- Identity for list items is the visible text content (account name; txn
|
||||
note + amount). No synthetic IDs encoded in semantics.
|
||||
- `contentDescription` is reserved for real accessibility labels, never as a
|
||||
data carrier.
|
||||
- `sanderling/spec.ts` imports `@sanderling/spec`, reads state via `s.ax.*`,
|
||||
asserts properties, and weights the actions the fuzzer picks from
|
||||
- `just test` invokes `sanderling test` against the installed APK
|
||||
asserts properties, and weights the actions the fuzzer picks from.
|
||||
- `just test` invokes `sanderling test` against the installed APK.
|
||||
Reference in new issue
Block a user