Skip to content

Commit

Permalink
Add option to export ImageVector with "public" modifier
Browse files Browse the repository at this point in the history
  • Loading branch information
egorikftp committed Oct 2, 2024
1 parent bbd02f3 commit 81e064f
Show file tree
Hide file tree
Showing 31 changed files with 292 additions and 165 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import com.squareup.kotlinpoet.TypeSpec
private val Indent = " ".repeat(4)
fun FileSpec.Builder.setIndent() = indent(Indent)

fun FileSpec.removeDeadCode(): String = toString()
fun FileSpec.removeExplicitModeCode(): String = toString()
.replace("public ", "")

inline fun objectBuilder(
Expand Down
1 change: 1 addition & 0 deletions components/generator/iconpack/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ plugins {
}

dependencies {
implementation(projects.components.extensions)
implementation(projects.components.generator.common)

implementation(libs.kotlinpoet)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package io.github.composegears.valkyrie.generator.iconpack

import io.github.composegears.valkyrie.generator.ext.fileSpecBuilder
import io.github.composegears.valkyrie.generator.ext.objectBuilder
import io.github.composegears.valkyrie.generator.ext.removeDeadCode
import io.github.composegears.valkyrie.generator.ext.removeExplicitModeCode
import io.github.composegears.valkyrie.generator.ext.setIndent

internal class IconPackFileSpec(private val config: IconPackGeneratorConfig) {
Expand All @@ -21,7 +21,10 @@ internal class IconPackFileSpec(private val config: IconPackGeneratorConfig) {
setIndent()
}
return IconPackSpecOutput(
content = fileSpec.removeDeadCode(),
content = when {
config.useExplicitMode -> fileSpec.toString()
else -> fileSpec.removeExplicitModeCode()
},
name = fileSpec.name,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ data class IconPackGeneratorConfig(
val packageName: String,
val iconPackName: String,
val subPacks: List<String>,
val useExplicitMode: Boolean,
)

data class IconPackSpecOutput(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,53 +2,67 @@ package io.github.composegears.valkyrie.generator.iconpack

import assertk.assertThat
import assertk.assertions.isEqualTo
import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourceText
import org.junit.jupiter.api.Test

class IconPackGeneratorTest {

private fun createConfig(
subPacks: List<String> = emptyList(),
useExplicitMode: Boolean = false,
) = IconPackGeneratorConfig(
packageName = "io.github.composegears.valkyrie.icons",
iconPackName = "ValkyrieIcons",
subPacks = subPacks,
useExplicitMode = useExplicitMode,
)

@Test
fun `generate icon pack`() {
val result = IconPackGenerator.create(
config = IconPackGeneratorConfig(
packageName = "io.github.composegears.valkyrie.icons",
iconPackName = "ValkyrieIcons",
subPacks = emptyList(),
),
)
val result = IconPackGenerator.create(config = createConfig())

val expected = getResourceText("kt/IconPack.kt")

val expectedContent = """
package io.github.composegears.valkyrie.icons
assertThat(result.content).isEqualTo(expected)
assertThat(result.name).isEqualTo("ValkyrieIcons")
}

object ValkyrieIcons
@Test
fun `generate icon pack explicit mode`() {
val result = IconPackGenerator.create(
config = createConfig(useExplicitMode = true),
)

""".trimIndent()
val expected = getResourceText("kt/IconPack.explicit.kt")

assertThat(result.content).isEqualTo(expectedContent)
assertThat(result.content).isEqualTo(expected)
assertThat(result.name).isEqualTo("ValkyrieIcons")
}

@Test
fun `generate nested packs`() {
val result = IconPackGenerator.create(
config = IconPackGeneratorConfig(
packageName = "io.github.composegears.valkyrie.icons",
iconPackName = "ValkyrieIcons",
subPacks = listOf("Filled", "Colored"),
),
config = createConfig(subPacks = listOf("Filled", "Colored")),
)

val expectedContent = """
package io.github.composegears.valkyrie.icons
val expected = getResourceText("kt/IconPack.nested.kt")

object ValkyrieIcons {
object Filled
assertThat(result.content).isEqualTo(expected)
assertThat(result.name).isEqualTo("ValkyrieIcons")
}

object Colored
}
@Test
fun `generate nested packs explicit`() {
val result = IconPackGenerator.create(
config = createConfig(
subPacks = listOf("Filled", "Colored"),
useExplicitMode = true,
),
)

""".trimIndent()
val expected = getResourceText("kt/IconPack.nested.explicit.kt")

assertThat(result.content).isEqualTo(expectedContent)
assertThat(result.content).isEqualTo(expected)
assertThat(result.name).isEqualTo("ValkyrieIcons")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package io.github.composegears.valkyrie.icons

public object ValkyrieIcons
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package io.github.composegears.valkyrie.icons

object ValkyrieIcons
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package io.github.composegears.valkyrie.icons

public object ValkyrieIcons {
public object Filled

public object Colored
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package io.github.composegears.valkyrie.icons

object ValkyrieIcons {
object Filled

object Colored
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ internal data class ImageVectorSpecConfig(
val outputFormat: OutputFormat,
val generatePreview: Boolean,
val useFlatPackage: Boolean,
val useExplicitMode: Boolean,
)

internal class ImageVectorFileSpec(private val config: ImageVectorSpecConfig) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ data class ImageVectorGeneratorConfig(
val outputFormat: OutputFormat,
val generatePreview: Boolean,
val useFlatPackage: Boolean,
val useExplicitMode: Boolean,
)

enum class OutputFormat(val key: String) {
Expand Down Expand Up @@ -48,6 +49,7 @@ object ImageVectorGenerator {
outputFormat = config.outputFormat,
generatePreview = config.generatePreview,
useFlatPackage = config.useFlatPackage,
useExplicitMode = config.useExplicitMode,
),
).createFileFor(vector)
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import com.squareup.kotlinpoet.buildCodeBlock
import io.github.composegears.valkyrie.generator.ext.fileSpecBuilder
import io.github.composegears.valkyrie.generator.ext.getterFunSpecBuilder
import io.github.composegears.valkyrie.generator.ext.propertySpecBuilder
import io.github.composegears.valkyrie.generator.ext.removeDeadCode
import io.github.composegears.valkyrie.generator.ext.removeExplicitModeCode
import io.github.composegears.valkyrie.generator.ext.setIndent
import io.github.composegears.valkyrie.generator.imagevector.ImageVectorSpecConfig
import io.github.composegears.valkyrie.generator.imagevector.ImageVectorSpecOutput
Expand Down Expand Up @@ -48,7 +48,10 @@ internal class BackingPropertySpec(private val config: ImageVectorSpecConfig) {
}

return ImageVectorSpecOutput(
content = fileSpec.removeDeadCode(),
content = when {
config.useExplicitMode -> fileSpec.toString()
else -> fileSpec.removeExplicitModeCode()
},
name = fileSpec.name,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.buildCodeBlock
import io.github.composegears.valkyrie.generator.ext.fileSpecBuilder
import io.github.composegears.valkyrie.generator.ext.propertySpecBuilder
import io.github.composegears.valkyrie.generator.ext.removeDeadCode
import io.github.composegears.valkyrie.generator.ext.removeExplicitModeCode
import io.github.composegears.valkyrie.generator.ext.setIndent
import io.github.composegears.valkyrie.generator.imagevector.ImageVectorSpecConfig
import io.github.composegears.valkyrie.generator.imagevector.ImageVectorSpecOutput
Expand Down Expand Up @@ -38,7 +38,10 @@ internal class LazyPropertySpec(private val config: ImageVectorSpecConfig) {
}

return ImageVectorSpecOutput(
content = fileSpec.removeDeadCode(),
content = when {
config.useExplicitMode -> fileSpec.toString()
else -> fileSpec.removeExplicitModeCode()
},
name = fileSpec.name,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,26 @@ import org.junit.jupiter.params.provider.EnumSource

class CustomPackageTest {

private fun createConfig(
packageName: String = "io.github.composegears.valkyrie.icons",
packName: String = "",
nestedPackName: String = "",
outputFormat: OutputFormat,
generatePreview: Boolean = false,
useFlatPackage: Boolean = true,
useExplicitMode: Boolean = false,
): ImageVectorGeneratorConfig {
return ImageVectorGeneratorConfig(
packageName = packageName,
packName = packName,
nestedPackName = nestedPackName,
outputFormat = outputFormat,
generatePreview = generatePreview,
useFlatPackage = useFlatPackage,
useExplicitMode = useExplicitMode,
)
}

@ParameterizedTest
@EnumSource(value = OutputFormat::class)
fun `flat package without icon pack`(outputFormat: OutputFormat) {
Expand All @@ -18,14 +38,7 @@ class CustomPackageTest {
val output = ImageVectorGenerator.convert(
vector = parserOutput.vector,
kotlinName = parserOutput.kotlinName,
config = ImageVectorGeneratorConfig(
packageName = "io.github.composegears.valkyrie.icons",
packName = "",
nestedPackName = "",
outputFormat = outputFormat,
generatePreview = false,
useFlatPackage = true,
),
config = createConfig(outputFormat = outputFormat),
).content

val expected = outputFormat.toResourceText(
Expand All @@ -43,13 +56,9 @@ class CustomPackageTest {
val output = ImageVectorGenerator.convert(
vector = parserOutput.vector,
kotlinName = parserOutput.kotlinName,
config = ImageVectorGeneratorConfig(
packageName = "io.github.composegears.valkyrie.icons",
config = createConfig(
packName = "ValkyrieIcons",
nestedPackName = "",
outputFormat = outputFormat,
generatePreview = false,
useFlatPackage = true,
),
).content

Expand All @@ -68,13 +77,10 @@ class CustomPackageTest {
val output = ImageVectorGenerator.convert(
vector = parserOutput.vector,
kotlinName = parserOutput.kotlinName,
config = ImageVectorGeneratorConfig(
packageName = "io.github.composegears.valkyrie.icons",
config = createConfig(
packName = "ValkyrieIcons",
nestedPackName = "Filled",
outputFormat = outputFormat,
generatePreview = false,
useFlatPackage = true,
),
).content

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package io.github.composegears.valkyrie.generator.imagevector

import assertk.assertThat
import assertk.assertions.isEqualTo
import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourcePath
import io.github.composegears.valkyrie.generator.imagevector.common.toResourceText
import io.github.composegears.valkyrie.parser.svgxml.SvgXmlParser
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.EnumSource

class ExplicitModeTest {

@ParameterizedTest
@EnumSource(value = OutputFormat::class)
fun `generation with explicit mode`(outputFormat: OutputFormat) {
val icon = getResourcePath("xml/ic_without_path.xml")
val parserOutput = SvgXmlParser.toIrImageVector(icon)
val output = ImageVectorGenerator.convert(
vector = parserOutput.vector,
kotlinName = parserOutput.kotlinName,
config = ImageVectorGeneratorConfig(
packageName = "io.github.composegears.valkyrie.icons",
packName = "",
nestedPackName = "",
outputFormat = outputFormat,
generatePreview = false,
useFlatPackage = false,
useExplicitMode = true,
),
).content

val expected = outputFormat.toResourceText(
pathToBackingProperty = "kt/backing/WithoutPath.explicit.kt",
pathToLazyProperty = "kt/lazy/WithoutPath.explicit.kt",
)
assertThat(output).isEqualTo(expected)
}
}
Loading

0 comments on commit 81e064f

Please sign in to comment.