Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Version 1.1 #167

Merged
merged 28 commits into from
Oct 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
e34fbe9
Bump library version to 1.1.0
russhwolf Aug 20, 2023
4f72b17
Fix serialization decoder reuse to address issues 160 and 162
russhwolf Aug 19, 2023
38df7e0
Add serialization-aware `removeValue()` and `containsValue()` functions.
russhwolf Jun 18, 2022
eba929b
Remove now-redundant suppressions in serialization tests
russhwolf Aug 19, 2023
723315f
Bump to Kotlin 1.9.0
russhwolf Aug 19, 2023
14e66b7
Use Dispatchers.IO instead of Dispatchers.Default in coroutine conver…
russhwolf Aug 19, 2023
d1c7d9e
Add wasm browser target and share js StorageSettings implementation
russhwolf Aug 20, 2023
027dbbe
Remove deprecated native targets
russhwolf Aug 20, 2023
f9568b6
Add changelog for 1.1.0
russhwolf Aug 20, 2023
b20f7ac
Add additional serialization docs
russhwolf Oct 1, 2023
33da7d3
Update readme table-of-contents
russhwolf Oct 1, 2023
ea68730
Update project version in readme to 1.1.0
russhwolf Oct 1, 2023
67495a0
Removed legacy JS workarounds in serialization module
russhwolf Oct 1, 2023
43f0d8c
Update dependency versions
russhwolf Oct 1, 2023
ae3c63c
Move CI to use JDK 17
russhwolf Oct 1, 2023
051935c
Update multiplatform-settings/src/appleMain/kotlin/com/russhwolf/sett…
russhwolf Oct 1, 2023
b67f631
Update sample app build configuration
russhwolf Oct 1, 2023
a871dc2
Add Compose dependencies
tfcporciuncula Apr 16, 2023
0f406a6
Reimplement UI in Compose
tfcporciuncula Apr 16, 2023
8e31aed
Ditch last piece of legacy UI
tfcporciuncula Apr 16, 2023
99b147d
Labelled -> Labeled
tfcporciuncula May 15, 2023
410fcac
Add dark mode support in Compose sample
russhwolf Oct 2, 2023
a5c8c23
Add compose desktop sample app
russhwolf Oct 2, 2023
0f2af63
Update changelog with new versions of major dependencies
russhwolf Oct 2, 2023
68636d3
Add preview to desktop sample app
russhwolf Oct 9, 2023
36af43d
Convert iOS sample to use SwiftUI
russhwolf Oct 5, 2023
db2e03c
Set changelog date for 1.1
russhwolf Oct 9, 2023
2bcc395
Fix gradle wrapper validation action branch
russhwolf Oct 9, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 2 additions & 8 deletions .github/workflows/build-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,11 @@ jobs:
steps:
- uses: actions/checkout@v3

- name: Download JavaFX JDK
run: |
mkdir -p ./jdk/binaries/
curl https://cdn.azul.com/zulu/bin/zulu11.56.19-ca-fx-jdk11.0.15-linux_x64.tar.gz --output ./jdk/zulu11.56.19-ca-fx-jdk11.0.15-linux_x64.tar.gz

- name: JDK setup
uses: actions/setup-java@v3
with:
java-version: 11
distribution: jdkfile
jdkFile: ./jdk/zulu11.56.19-ca-fx-jdk11.0.15-linux_x64.tar.gz
java-version: 17
distribution: corretto

- name: Linux build
run: |
Expand Down
6 changes: 2 additions & 4 deletions .github/workflows/build-macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,13 @@ jobs:
- name: JDK setup
uses: actions/setup-java@v3
with:
java-version: 11
java-version: 17
distribution: corretto

- name: Mac build
run: |
./gradlew macosX64Test iosX64Test watchosX64Test watchosX86Test tvosX64Test \
./gradlew macosX64Test iosX64Test watchosX64Test tvosX64Test \
publishKotlinMultiplatformPublicationToMavenLocal \
publishIosArm32PublicationToMavenLocal \
publishIosArm64PublicationToMavenLocal \
publishIosSimulatorArm64PublicationToMavenLocal \
publishIosX64PublicationToMavenLocal \
Expand All @@ -38,7 +37,6 @@ jobs:
publishWatchosArm64PublicationToMavenLocal \
publishWatchosDeviceArm64PublicationToMavenLocal \
publishWatchosSimulatorArm64PublicationToMavenLocal \
publishWatchosX86PublicationToMavenLocal \
publishWatchosX64PublicationToMavenLocal \
publishTvosArm64PublicationToMavenLocal \
publishTvosSimulatorArm64PublicationToMavenLocal \
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/build-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ jobs:
- name: JDK setup
uses: actions/setup-java@v3
with:
java-version: 11
java-version: 17
distribution: corretto

- name: Windows build
run: |
./gradlew mingwX64Test publishKotlinMultiplatformPublicationToMavenLocal publishMingwX64PublicationToMavenLocal publishMingwX86PublicationToMavenLocal --no-daemon --stacktrace
./gradlew mingwX64Test publishKotlinMultiplatformPublicationToMavenLocal publishMingwX64PublicationToMavenLocal --no-daemon --stacktrace
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3g"
8 changes: 3 additions & 5 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
- name: JDK setup
uses: actions/setup-java@v3
with:
java-version: 11
java-version: 17
distribution: corretto

- name: Linux deploy
Expand All @@ -35,13 +35,12 @@ jobs:
- name: JDK setup
uses: actions/setup-java@v3
with:
java-version: 11
java-version: 17
distribution: corretto

- name: Mac deploy
run: |
./gradlew \
publishIosArm32PublicationToMavenRepository \
publishIosArm64PublicationToMavenRepository \
publishIosSimulatorArm64PublicationToMavenRepository \
publishIosX64PublicationToMavenRepository \
Expand All @@ -51,7 +50,6 @@ jobs:
publishWatchosArm64PublicationToMavenRepository \
publishWatchosDeviceArm64PublicationToMavenRepository \
publishWatchosSimulatorArm64PublicationToMavenRepository \
publishWatchosX86PublicationToMavenRepository \
publishWatchosX64PublicationToMavenRepository \
publishTvosArm64PublicationToMavenRepository \
publishTvosSimulatorArm64PublicationToMavenRepository \
Expand All @@ -67,7 +65,7 @@ jobs:
- name: JDK setup
uses: actions/setup-java@v3
with:
java-version: 11
java-version: 17
distribution: corretto

- name: Windows deploy
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/validate-gradle-wrapper.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: Gradle Wrapper Validation

on:
push:
branches: [ master ]
branches: [ main ]
pull_request:
branches: [ master ]
branches: [ main ]

jobs:
build:
Expand Down
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# Changelog #

## v1.1.0 *(2023-10-09)* ##

- Update to Kotlin 1.9.10, Gradle 8.3, and Android Gradle Plugin 8.1.2
- Remove deprecated Kotlin/Native targets
- Add wasm browser target to `multiplatform-settings`, `multiplatform-settings-test`,
and `multiplatform-settings-no-arg` (issue #142). This uses the same `StorageSettings` implementation as in the
current js target.
- Use Dispatchers.IO rather than Dispatchers.Default in `multiplatform-settings-coroutines` on platforms where it is
available (issue #157)
- Add serialization-aware `removeValue()` and `containsValue()` functions to `multiplatform-settings-serialization` (
issue #81)
- Fix issue with serialization delegates incorrectly falling back to default values (issues #160 and #162)

## v1.0.0 *(2023-01-14)* ##

- First stable release!
Expand Down
70 changes: 41 additions & 29 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,24 @@ This is a Kotlin library for Multiplatform apps, so that common code can persist

<!-- TODO it's maybe getting time to break this up into separate pages and do a real docs site -->

- [Adding to your project](#adding-to-your-project)
- [Usage](#usage)
- [Creating a Settings instance](#creating-a-settings-instance)
- [Platform constructors](#platform-constructors)
- [Factories](#factories)
- [No-arg module](#no-arg-module)
- [Settings API](#settings-api)
- [Testing](#testing)
- [Other platforms](#other-platforms)
- [Experimental API](#experimental-api)
- [Experimental Implementations](#experimental-implementations)
- [Apple Keychain](#apple-keychain)
- [JVM](#jvm)
- [Windows](#windows)
- [Listeners](#listeners)
- [Serialization module](#serialization-module)
- [Coroutine APIs](#coroutine-apis)
- [DataStore](#datastore)
- [Building](#building)
- [Project Structure](#project-structure)
- [License](#license)
* [Adding to your project](#adding-to-your-project)
* [Usage](#usage)
* [Creating a Settings instance](#creating-a-settings-instance)
* [Platform constructors](#platform-constructors)
* [Factories](#factories)
* [No-arg module](#no-arg-module)
* [Settings API](#settings-api)
* [Listeners](#listeners)
* [Testing](#testing)
* [Other platforms](#other-platforms)
* [Experimental API](#experimental-api)
* [Experimental Implementations](#experimental-implementations)
* [Apple Keychain](#apple-keychain)
* [Serialization module](#serialization-module)
* [Coroutine APIs](#coroutine-apis)
* [DataStore](#datastore)
* [Building](#building)
* [License](#license)

## Adding to your project

Expand All @@ -51,7 +48,7 @@ Then, simply add the dependency to your common source-set dependencies
commonMain {
dependencies {
// ...
implementation("com.russhwolf:multiplatform-settings:1.0.0")
implementation("com.russhwolf:multiplatform-settings:1.1.0")
}
}
```
Expand Down Expand Up @@ -188,7 +185,7 @@ the `multiplatform-settings-no-arg` gradle dependency. This exports `multiplatfo
you can use it as a replacement for that default dependency.

```kotlin
implementation("com.russhwolf:multiplatform-settings-no-arg:1.0.0")
implementation("com.russhwolf:multiplatform-settings-no-arg:1.1.0")
```

Then from common code, you can write
Expand Down Expand Up @@ -320,7 +317,7 @@ garbage-collected and stop sending updates.
A testing dependency is available to aid in testing code that interacts with this library.

```kotlin
implementation("com.russhwolf:multiplatform-settings-test:1.0.0")
implementation("com.russhwolf:multiplatform-settings-test:1.1.0")
```

This includes a `MapSettings` implementation of the `Settings` interface, which is backed by an in-memory `MutableMap`
Expand Down Expand Up @@ -351,7 +348,7 @@ them, to help remove that experimental status.
A `kotlinx-serialization` integration exists so it's easier to save non-primitive data

```kotlin
implementation("com.russhwolf:multiplatform-settings-serialization:1.0.0")
implementation("com.russhwolf:multiplatform-settings-serialization:1.1.0")
```

This essentially uses the `Settings` store as a serialization format. Thus for a serializable class
Expand All @@ -371,8 +368,23 @@ val settings: Settings
settings.encodeValue(SomeClass.serializer(), "key", someClass)

// Create a new instance of SomeClass based on the data in settings
val newInstance: SomeClass = settings.decodeValue(SomeClass.serializer(), "someClass", defaultValue)
val nullableNewInstance: SomeClass = settings.decodeValueOrNull(SomeClass.serializer(), "someClass")
val newInstance: SomeClass = settings.decodeValue(SomeClass.serializer(), "key", defaultValue)
val nullableNewInstance: SomeClass = settings.decodeValueOrNull(SomeClass.serializer(), "key")
```

To remove a serialized value, use `removeValue()` rather than `remove()`

```kotlin
settings.removeValue(SomeClass.serializer(), "key")

// Don't remove if not all expected data is preset
settings.removeValue(SomeClass.serializer(), "key", ignorePartial = true)
```

To check for the existance of a serialized value, use `containsValue()` rather than `contains()`.

```kotlin
val isPresent = settings.containsValue(SomeClass.serializer(), "key")
```

There's also a delegate API, similar to that for primitives
Expand All @@ -389,7 +401,7 @@ Usage requires accepting both the `@ExperimentalSettingsApi` and `@ExperimentalS
A separate `multiplatform-settings-coroutines` dependency includes various coroutine APIs.

```kotlin
implementation("com.russhwolf:multiplatform-settings-coroutines:1.0.0")
implementation("com.russhwolf:multiplatform-settings-coroutines:1.1.0")
```

This adds flow extensions for all types which use the listener APIs internally.
Expand Down Expand Up @@ -433,7 +445,7 @@ An implementation of `FlowSettings` on the Android exists in the `multiplatform-
on [Jetpack DataStore](https://developer.android.com/jetpack/androidx/releases/datastore)

```kotlin
implementation("com.russhwolf:multiplatform-settings-datastore:1.0.0")
implementation("com.russhwolf:multiplatform-settings-datastore:1.1.0")
```

This provides a `DataStoreSettings` class
Expand Down
6 changes: 3 additions & 3 deletions buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/

plugins {
kotlin("jvm") version "1.8.0"
kotlin("jvm") version "1.9.10"
}

repositories {
Expand All @@ -26,7 +26,7 @@ repositories {

dependencies {
implementation(kotlin("gradle-plugin"))
implementation("com.android.tools.build:gradle:7.2.2")
implementation("org.jetbrains.dokka:dokka-gradle-plugin:1.7.10")
implementation("com.android.tools.build:gradle:8.1.2")
implementation("org.jetbrains.dokka:dokka-gradle-plugin:1.9.0")
implementation(kotlin("compiler-embeddable"))
}
46 changes: 44 additions & 2 deletions buildSrc/src/main/kotlin/BuildHelpers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,12 @@
@file:Suppress("KDocMissingDocumentation")

import com.android.build.gradle.BaseExtension
import org.gradle.api.JavaVersion
import org.gradle.api.NamedDomainObjectCollection
import org.gradle.api.Project
import org.gradle.api.tasks.testing.AbstractTestTask
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinCompile
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetPreset
Expand All @@ -30,8 +33,10 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmWithJavaTargetPreset
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetPreset
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile
import org.jetbrains.kotlin.konan.target.Architecture
import org.jetbrains.kotlin.konan.target.KonanTarget

Expand All @@ -56,6 +61,21 @@ fun Project.standardConfiguration(
}
configureTests()
}

compatiblityConfig()
}

private fun Project.compatiblityConfig() {
tasks.withType(KotlinJvmCompile::class.java).configureEach {
it.kotlinOptions.apply {
// Keeping 1.8 compatibility until it becomes burdensome
jvmTarget = "1.8"
}
}
android.apply {
// Oops, this was on in 1.0, so now technically a breaking change to turn it off
buildFeatures.buildConfig = true
}
}

private val ideaActive by lazy { System.getProperty("idea.active") == "true" }
Expand All @@ -68,7 +88,7 @@ private val KotlinTarget.isJsTarget: Boolean

private fun KotlinMultiplatformExtension.buildAllTargets(targetPresets: NamedDomainObjectCollection<KotlinTargetPreset<*>>) {
if (targetPresets.findByName("android") != null) {
android {
androidTarget {
publishAllLibraryVariants()
}
}
Expand All @@ -78,12 +98,22 @@ private fun KotlinMultiplatformExtension.buildAllTargets(targetPresets: NamedDom
browser()
}
}
if (targetPresets.findByName("wasm") != null) {
// TODO include nodejs and d8 somehow?
@OptIn(ExperimentalWasmDsl::class)
wasm {
browser()
}
}

// Create empty targets for presets with no specific configuration
targetPresets.forEach {
if (it.name in listOf("iosArm32", "linuxArm32Hfp", "linuxMips32", "linuxMipsel32", "mingwX86", "watchosX86")) {
return@forEach // Ignore deprecated targets
}
if (it is KotlinJvmWithJavaTargetPreset) return@forEach // Probably don't need this, and it chokes on Android plugin
if (it.isJsTargetPreset && targets.any { it.isJsTarget }) return@forEach // Ignore repeat js targets
if (it.name.contains("wasm")) return@forEach // No more Kotlin/Native WASM. TODO re-add new WASM
if (it.name.contains("wasm")) return@forEach // No more Kotlin/Native WASM.
if (targets.findByName(it.name) == null) {
targetFromPreset(it)
}
Expand Down Expand Up @@ -127,6 +157,18 @@ private fun KotlinMultiplatformExtension.linkSourceSets(targetPresets: NamedDoma
findByName("jvmMain")?.dependsOn(jvmCommonMain)
findByName("jvmTest")?.dependsOn(jvmCommonTest)

// shared js and wasm browser code
val browserCommonMain = create("browserCommonMain").apply {
dependsOn(commonMain)
}
val browserCommonTest = create("browserCommonTest").apply {
dependsOn(commonTest)
}
findByName("jsMain")?.dependsOn(browserCommonMain)
findByName("jsTest")?.dependsOn(browserCommonTest)
findByName("wasmMain")?.dependsOn(browserCommonMain)
findByName("wasmTest")?.dependsOn(browserCommonTest)

if (targetPresets.any { it.isNativeTargetPreset }) {

val nativeMain = create("nativeMain").apply {
Expand Down
Loading
Loading