From 82e07fa5acdd35f346a4d4521359d4c12b6bfc56 Mon Sep 17 00:00:00 2001 From: slam Date: Wed, 31 Jan 2024 20:18:59 +0800 Subject: [PATCH] fix(#235): spm should support custom tools version and platforms improvement - use dsl make it's more readable --- .../dependencymanager/SpmDependencyManager.kt | 70 ++++++++++++--- .../dependencyManager/SpmConfigTest.kt | 87 +++++++++++++++++++ 2 files changed, 147 insertions(+), 10 deletions(-) create mode 100644 kmmbridge/src/test/kotlin/co/touchlab/faktory/dependencyManager/SpmConfigTest.kt diff --git a/kmmbridge/src/main/kotlin/co/touchlab/faktory/dependencymanager/SpmDependencyManager.kt b/kmmbridge/src/main/kotlin/co/touchlab/faktory/dependencymanager/SpmDependencyManager.kt index a5cdb050..f3020ef2 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/faktory/dependencymanager/SpmDependencyManager.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/faktory/dependencymanager/SpmDependencyManager.kt @@ -35,8 +35,8 @@ class SpmDependencyManager( ) : DependencyManager, LocalDevManager { private fun Project.swiftPackageFolder(): String = _swiftPackageFolder ?: this.findRepoRoot() private fun Project.swiftPackageFilePath(): String = "${stripEndSlash(swiftPackageFolder())}/Package.swift" - private fun Project.swiftPackageToolsVersion(): String = spmConfig.swiftToolsVersion ?: "5.3" - private fun Project.swiftPackagePlatforms(): List = spmConfig.platforms ?: listOf("iOS(.v13)") + private fun Project.swiftPackageToolsVersion(): String = spmConfig.swiftToolsVersion + private fun Project.swiftPackagePlatforms(): String = spmConfig.getPlatformsAsFormattedText() override fun configure(project: Project, uploadTask: TaskProvider, publishRemoteTask: TaskProvider) { if (useCustomPackageFile && !project.hasKmmbridgeVariablesSection()) { @@ -177,7 +177,7 @@ internal fun stripEndSlash(path: String): String { private fun makeLocalDevPackageFileText( swiftPackageFolder: String, swiftPackageToolsVersion: String, - swiftPackagePlatforms: List, + swiftPackagePlatforms: String, frameworkName: String, project: Project, ): String { @@ -195,7 +195,7 @@ let packageName = "$frameworkName" let package = Package( name: packageName, platforms: [ - ${swiftPackagePlatforms.joinToString(",\n ")} +$swiftPackagePlatforms ], products: [ .library( @@ -258,7 +258,7 @@ internal fun getModifiedPackageFileText( private fun makePackageFileText( packageName: String, swiftPackageToolsVersion: String, - swiftPackagePlatforms: List, + swiftPackagePlatforms: String, url: String, checksum: String, ): String = """ // swift-tools-version:$swiftPackageToolsVersion @@ -273,7 +273,7 @@ $KMMBRIDGE_END let package = Package( name: packageName, platforms: [ - ${swiftPackagePlatforms.joinToString(",\n ")} + ${swiftPackagePlatforms} ], products: [ .library( @@ -314,7 +314,57 @@ private val CUSTOM_PACKAGE_FILE_ERROR = """.trimIndent() -data class SpmConfig( - var swiftToolsVersion: String? = null, - var platforms: List? = null, -) \ No newline at end of file + +class SpmConfig { + var swiftToolsVersion: String = "5.9" + var platforms = mutableListOf() + + fun platforms(block: List.() -> Unit) { + platforms.apply(block) + } + + fun iOS(block: PlatformVersion.() -> Unit) { + platforms.add(Platform(PlatformName.IOS, PlatformVersion().apply(block))) + } + + fun macOS(block: PlatformVersion.() -> Unit) { + platforms.add(Platform(PlatformName.MacOS, PlatformVersion().apply(block))) + } + + fun tvOS(block: PlatformVersion.() -> Unit) { + platforms.add(Platform(PlatformName.TvOS, PlatformVersion().apply(block))) + } + + fun watchOS(block: PlatformVersion.() -> Unit) { + platforms.add(Platform(PlatformName.WatchOS, PlatformVersion().apply(block))) + } + + fun getPlatformsAsFormattedText(): String { + val formattedPlatforms = platforms.joinToString(",\n") { platform -> + " .${platform.name.value}(.v${platform.version.version})" + } + return formattedPlatforms + } + +} + +data class Platform( + val name: PlatformName, + val version: PlatformVersion, +) + +enum class PlatformName(val value: String) { + IOS("iOS"), + MacOS("macOS"), + TvOS("tvOS"), + WatchOS("watchOS"), +} + +class PlatformVersion { + var version: String? = null + + fun v(version: String) { + this.version = version + } +} + diff --git a/kmmbridge/src/test/kotlin/co/touchlab/faktory/dependencyManager/SpmConfigTest.kt b/kmmbridge/src/test/kotlin/co/touchlab/faktory/dependencyManager/SpmConfigTest.kt new file mode 100644 index 00000000..934072ce --- /dev/null +++ b/kmmbridge/src/test/kotlin/co/touchlab/faktory/dependencyManager/SpmConfigTest.kt @@ -0,0 +1,87 @@ +package co.touchlab.faktory.dependencyManager + +import co.touchlab.faktory.dependencymanager.SpmConfig +import org.junit.Test +import kotlin.test.assertEquals + +class SpmConfigTest { + + @Test + fun addMultiplePlatforms() { + val config = SpmConfig().apply(fun SpmConfig.() { + platforms { + iOS { + v("14") + } + macOS { + v("13") + } + watchOS { + v("7") + } + tvOS { + v("14") + } + } + }) + + assertEquals(""" + .iOS(.v14), + .macOS(.v13), + .watchOS(.v7), + .tvOS(.v14)""".trimMargin(), config.getPlatformsAsFormattedText()) + } + + + @Test + fun addWatchOSToPlatforms() { + val config = SpmConfig().apply(fun SpmConfig.() { + platforms { + watchOS { + v("7") + } + } + }) + + assertEquals(".watchOS(.v7)", config.getPlatformsAsFormattedText().trimIndent()) + } + + @Test + fun addTvOSToPlatforms() { + val config = SpmConfig().apply(fun SpmConfig.() { + platforms { + tvOS { + v("14") + } + } + }) + + assertEquals(".tvOS(.v14)", config.getPlatformsAsFormattedText().trimIndent()) + } + + @Test + fun addMacOSToPlatforms() { + val config = SpmConfig().apply(fun SpmConfig.() { + platforms { + macOS { + v("13") + } + } + }) + + assertEquals(".macOS(.v13)", config.getPlatformsAsFormattedText().trimIndent()) + } + + @Test + fun addIOSToPlatforms() { + val config = SpmConfig().apply(fun SpmConfig.() { + platforms { + iOS { + v("14") + } + } + }) + + assertEquals(".iOS(.v14)", config.getPlatformsAsFormattedText().trimIndent()) + } +} \ No newline at end of file