Skip to content

Commit bfbaa1b

Browse files
committed
Iterated expect DSL
1 parent cefe8bf commit bfbaa1b

27 files changed

Lines changed: 206 additions & 224 deletions

File tree

README.md

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -181,20 +181,23 @@ const val APP_VERSION: String = "0.0.1"
181181

182182
Similar to Android's `buildConfigField`, you can consume an `expect` BuildConfig class from common code,
183183
and provide different values for each platform target:
184+
184185
```kotlin
185186
buildConfig {
186-
buildConfigField("COMMON_VALUE", "aCommonValue")
187-
buildConfigField("IS_MOBILE", expect(false)) // with a default
188-
buildConfigField("PLATFORM", expect<String>()) // without a default
189-
190-
sourceSets.named("androidMain") {
191-
buildConfigField("PLATFORM", "android")
192-
buildConfigField("IS_MOBILE", true)
193-
}
187+
buildConfigField("COMMON_VALUE", "aCommonValue") // any constant value will be automatically 'expect'ed and propagated to the actual classes
188+
buildConfigField("IS_MOBILE", expect(false)) // with a default
189+
buildConfigField("PLATFORM", expect<String>()) // without a default
190+
191+
sourceSets.named("androidMain") {
192+
buildConfigField("PLATFORM", "android")
193+
buildConfigField("IS_MOBILE", true)
194+
buildConfigField("ANDROID_VALUE", "anAndroidValue")
195+
}
194196

195-
sourceSets.named("jvmMain") {
196-
buildConfigField("PLATFORM", "jvm")
197-
}
197+
sourceSets.named("jvmMain") {
198+
buildConfigField("PLATFORM", "jvm")
199+
buildConfigField("JVM_VALUE", "aJVMValue")
200+
}
198201
}
199202
```
200203
It will generate at `commonMain`:
@@ -221,7 +224,7 @@ actual object BuildConfig {
221224
actual const val COMMON_VALUE: String = "aCommonValue"
222225
actual const val PLATFORM: String = "jvm"
223226
actual const val IS_MOBILE: Boolean = false
224-
const val ANDROID_VALUE: String = "anAndroidValue"
227+
const val JVM_VALUE: String = "aJVMValue"
225228
}
226229
```
227230

demo-project/kts-multiplatform/build.gradle.kts

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,26 +44,30 @@ dependencies {
4444
}
4545

4646
buildConfig {
47-
buildConfigField("COMMON_VALUE", "aCommonValue")
48-
buildConfigField("IS_MOBILE", expect(false)) // with a default
49-
buildConfigField("PLATFORM", expect<String>()) // without a default
50-
buildConfigField("DEBUG", expect(false)) // to be changed by an Android variant
51-
buildConfigField("com.eygraber.uri.Uri", "ENDPOINT", expect(expression("Uri.parse(\"https://api.example.com\")")))
47+
buildConfigField("COMMON_VALUE", "aCommonValue") // a constant for all platforms
48+
buildConfigField("PLATFORM", expect<String>()) // expect a platform specific value
49+
buildConfigField("DEBUG", expect(false)) // expect with a default
50+
buildConfigField("com.eygraber.uri.Uri", "ENDPOINT",
51+
expect(expression("Uri.parse(\"https://api.example.com\")")))
5252
buildConfigField("PRODUCT_VALUE", expect<String?>(null))
5353

5454
forClass("i18n") {
5555
useKotlinOutput { topLevelConstants = true }
5656

5757
buildConfigField("i18n_hello", "Hello")
58-
buildConfigField("i18n_greetings", expect("Greetings"))
5958
buildConfigField("i18n_kind", expect<String>())
6059
}
6160

61+
forClass("Single") {
62+
buildConfigField("IS_MOBILE", expect(false))
63+
}
64+
6265
sourceSets.named("androidMain") {
6366
buildConfigField("PLATFORM", "android")
64-
buildConfigField("IS_MOBILE", true)
6567
buildConfigField("ANDROID_VALUE", "anAndroidValue")
68+
buildConfigField("DEBUG", false)
6669
forClass("i18n").buildConfigField("i18n_kind", "android")
70+
forClass("Single").buildConfigField("IS_MOBILE", true)
6771
}
6872

6973
sourceSets.named("androidDebug") {
@@ -86,13 +90,14 @@ buildConfig {
8690
buildConfigField("PLATFORM", "jvm")
8791
buildConfigField("JVM_VALUE", "aJvmValue")
8892
forClass("i18n").buildConfigField("i18n_kind", "jvm")
93+
forClass("Single").buildConfigField("IS_MOBILE", false)
8994
}
9095

9196
sourceSets.named("iosMain") {
9297
buildConfigField("PLATFORM", "ios")
93-
buildConfigField("IS_MOBILE", true)
9498
buildConfigField("IOS_VALUE", "anIOSValue")
9599
forClass("i18n").buildConfigField("i18n_kind", "ios")
100+
forClass("Single").buildConfigField("IS_MOBILE", true)
96101
}
97102

98103
sourceSets.named("webMain") {
@@ -107,17 +112,10 @@ buildConfig {
107112
.build()
108113
}
109114

115+
buildConfigField("PLATFORM", "web")
116+
buildConfigField("WEB_VALUE", "aWebValue")
110117
forClass("i18n").buildConfigField("i18n_kind", "web")
111-
}
112-
113-
sourceSets.named("jsMain") {
114-
buildConfigField("PLATFORM", "js")
115-
buildConfigField("JS_VALUE", "aJsValue")
116-
}
117-
118-
sourceSets.named("wasmJsMain") {
119-
buildConfigField("PLATFORM", "wasmJs")
120-
buildConfigField("WASM_JS_VALUE", "aWebAssemblyJsValue")
118+
forClass("Single").buildConfigField("IS_MOBILE", false)
121119
}
122120
}
123121

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.github.gmazzo.buildconfig.demos.kts_multiplatform
2+
3+
import com.eygraber.uri.Uri
4+
import com.github.gmazzo.buildconfig.demos.android.BuildConfig as AndroidBuildConfig
5+
import kotlin.test.Test
6+
import kotlin.test.assertEquals
7+
8+
class AndroidBuildConfigTest : CommonBuildConfigTest(
9+
expectedPlatform = "android",
10+
expectedMobile = true,
11+
expectedDebug = AndroidBuildConfig.DEBUG,
12+
expectedProduct = "${AndroidBuildConfig.FLAVOR_brand}Value",
13+
expectedUri = Uri.parse("https://${ if (AndroidBuildConfig.FLAVOR_env == "stage") "stage." else "" }api.example.com"),
14+
) {
15+
16+
@Test
17+
fun testAndroidOnlyValues() {
18+
assertEquals("anAndroidValue", BuildConfig.ANDROID_VALUE)
19+
}
20+
21+
}

demo-project/kts-multiplatform/src/androidUnitTest/kotlin/com/github/gmazzo/buildconfig/demos/kts_multiplatform/BuildConfigTest.kt

Lines changed: 0 additions & 18 deletions
This file was deleted.

demo-project/kts-multiplatform/src/androidUnitTest/kotlin/com/github/gmazzo/buildconfig/demos/kts_multiplatform/TestActuals.kt

Lines changed: 0 additions & 3 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,35 @@
11
package com.github.gmazzo.buildconfig.demos.kts_multiplatform
22

3+
import com.eygraber.uri.Uri
34
import kotlin.test.Test
45
import kotlin.test.assertEquals
56

6-
class CommonBuildConfigTest {
7+
abstract class CommonBuildConfigTest(
8+
private val expectedPlatform: String,
9+
private val expectedMobile: Boolean = false,
10+
private val expectedDebug: Boolean = false,
11+
private val expectedUri: Uri = Uri.parse("https://api.example.com"),
12+
private val expectedProduct: String? = null,
13+
) {
714

815
@Test
916
fun testBuildConfigProperties() {
1017
assertEquals("aCommonValue", BuildConfig.COMMON_VALUE)
18+
assertEquals(expectedPlatform, BuildConfig.PLATFORM)
19+
assertEquals(expectedDebug, BuildConfig.DEBUG)
20+
assertEquals(expectedUri, BuildConfig.ENDPOINT)
21+
assertEquals(expectedProduct, BuildConfig.PRODUCT_VALUE)
1122
}
1223

1324
@Test
1425
fun testI18nProperties() {
1526
assertEquals("Hello", i18n_hello)
16-
assertEquals("Greetings", i18n_greetings)
17-
assertEquals(expected_i18n_kind, i18n_kind)
27+
assertEquals(expectedPlatform, i18n_kind)
28+
}
29+
30+
@Test
31+
fun testSingleProperties() {
32+
assertEquals(expectedMobile, Single.IS_MOBILE)
1833
}
1934

2035
}

demo-project/kts-multiplatform/src/commonTest/kotlin/com/github/gmazzo/buildconfig/demos/kts_multiplatform/TestExpects.kt

Lines changed: 0 additions & 3 deletions
This file was deleted.

demo-project/kts-multiplatform/src/iosTest/kotlin/com/github/gmazzo/buildconfig/demos/kts_multiplatform/BuildConfigTest.kt

Lines changed: 0 additions & 16 deletions
This file was deleted.

demo-project/kts-multiplatform/src/iosTest/kotlin/com/github/gmazzo/buildconfig/demos/kts_multiplatform/TestActuals.kt

Lines changed: 0 additions & 3 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.github.gmazzo.buildconfig.demos.kts_multiplatform
2+
3+
import kotlin.test.Test
4+
import kotlin.test.assertEquals
5+
6+
class iOSBuildConfigTest : CommonBuildConfigTest(
7+
expectedPlatform = "ios",
8+
expectedMobile = true,
9+
) {
10+
11+
@Test
12+
fun testIOSOnlyValues() {
13+
assertEquals("anIOSValue", BuildConfig.IOS_VALUE)
14+
}
15+
16+
}

0 commit comments

Comments
 (0)