Skip to content

Commit b985c74

Browse files
committed
Refactor icon pack generator to use iconpack model for nested packs
1 parent 462f009 commit b985c74

File tree

16 files changed

+235
-26
lines changed

16 files changed

+235
-26
lines changed

cli/src/main/kotlin/io/github/composegears/valkyrie/cli/command/IconPackCommand.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import io.github.composegears.valkyrie.cli.ext.stringOption
1515
import io.github.composegears.valkyrie.extensions.writeToKt
1616
import io.github.composegears.valkyrie.generator.iconpack.IconPackGenerator
1717
import io.github.composegears.valkyrie.generator.iconpack.IconPackGeneratorConfig
18+
import io.github.composegears.valkyrie.generator.model.IconPack
1819
import java.nio.file.Path
1920
import kotlin.io.path.absolutePathString
2021

@@ -91,8 +92,10 @@ private fun generateIconPack(
9192
val iconPack = IconPackGenerator.create(
9293
config = IconPackGeneratorConfig(
9394
packageName = packageName,
94-
iconPackName = iconPackName,
95-
nestedPacks = nestedPacks,
95+
iconPack = IconPack(
96+
name = iconPackName,
97+
nested = nestedPacks.map(::IconPack),
98+
),
9699
useExplicitMode = useExplicitMode,
97100
indentSize = indentSize,
98101
),

cli/src/test/kotlin/io/github/composegears/valkyrie/cli/IconPackCliTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class IconPackCliTest {
4949
fun `generate nested packs`(cliTestType: CliTestType) {
5050
testIconPack(
5151
cliTestType = cliTestType,
52-
expectedResource = "iconpack/IconPack.nested.kt",
52+
expectedResource = "iconpack/IconPack.nested.L2.kt",
5353
nestedPacks = NestedPacks(listOf("Filled", "Colored")),
5454
)
5555
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package io.github.composegears.valkyrie.generator.model
2+
3+
data class IconPack(
4+
val name: String,
5+
val nested: List<IconPack> = emptyList(),
6+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.github.composegears.valkyrie.generator.model
2+
3+
@DslMarker
4+
annotation class IconPackDsl
5+
6+
@IconPackDsl
7+
fun iconpack(name: String, init: PackBuilder.() -> Unit = {}): IconPack {
8+
val builder = PackBuilder(name)
9+
builder.init()
10+
return builder.build()
11+
}
12+
13+
@IconPackDsl
14+
class PackBuilder(private val name: String) {
15+
private val nestedPacks = mutableListOf<IconPack>()
16+
17+
fun pack(name: String, init: PackBuilder.() -> Unit = {}) {
18+
val builder = PackBuilder(name)
19+
builder.init()
20+
nestedPacks.add(builder.build())
21+
}
22+
23+
internal fun build(): IconPack = IconPack(name, nestedPacks)
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package io.github.composegears.valkyrie.generator.model
2+
3+
import assertk.assertThat
4+
import assertk.assertions.hasSize
5+
import assertk.assertions.isEqualTo
6+
import org.junit.jupiter.api.Test
7+
8+
class IconPackDslTest {
9+
10+
@Test
11+
fun `simple iconpack`() {
12+
val iconPack = iconpack(name = "ValkyrieIcons")
13+
14+
assertThat(iconPack.name).isEqualTo("ValkyrieIcons")
15+
assertThat(iconPack.nested).hasSize(0)
16+
}
17+
18+
@Test
19+
fun `pack with one level of nesting`() {
20+
val iconPack = iconpack(name = "ValkyrieIcons") {
21+
pack(name = "Outlined")
22+
pack(name = "Filled")
23+
}
24+
25+
assertThat(iconPack.name).isEqualTo("ValkyrieIcons")
26+
assertThat(iconPack.nested).hasSize(2)
27+
assertThat(iconPack.nested[0].name).isEqualTo("Outlined")
28+
assertThat(iconPack.nested[1].name).isEqualTo("Filled")
29+
}
30+
31+
@Test
32+
fun `iconpack with multiple nested levels`() {
33+
val iconPack = iconpack(name = "ValkyrieIcons") {
34+
pack(name = "Material") {
35+
pack(name = "Rounded") {
36+
pack(name = "Filled")
37+
}
38+
pack(name = "Sharp") {
39+
pack(name = "Outlined")
40+
}
41+
}
42+
pack(name = "Custom") {
43+
pack(name = "Brand")
44+
}
45+
}
46+
47+
assertThat(iconPack.name).isEqualTo("ValkyrieIcons")
48+
assertThat(iconPack.nested).hasSize(2)
49+
50+
val material = iconPack.nested[0]
51+
assertThat(material.name).isEqualTo("Material")
52+
assertThat(material.nested).hasSize(2)
53+
54+
val rounded = material.nested[0]
55+
assertThat(rounded.name).isEqualTo("Rounded")
56+
assertThat(rounded.nested).hasSize(1)
57+
assertThat(rounded.nested[0].name).isEqualTo("Filled")
58+
59+
val sharp = material.nested[1]
60+
assertThat(sharp.name).isEqualTo("Sharp")
61+
assertThat(sharp.nested).hasSize(1)
62+
assertThat(sharp.nested[0].name).isEqualTo("Outlined")
63+
64+
val custom = iconPack.nested[1]
65+
assertThat(custom.name).isEqualTo("Custom")
66+
assertThat(custom.nested).hasSize(1)
67+
assertThat(custom.nested[0].name).isEqualTo("Brand")
68+
}
69+
}

components/generator/iconpack/src/main/kotlin/io/github/composegears/valkyrie/generator/iconpack/IconPackFileSpec.kt

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
package io.github.composegears.valkyrie.generator.iconpack
22

3+
import com.squareup.kotlinpoet.TypeSpec
34
import io.github.composegears.valkyrie.generator.ext.fileSpecBuilder
45
import io.github.composegears.valkyrie.generator.ext.objectBuilder
56
import io.github.composegears.valkyrie.generator.ext.removeExplicitModeCode
67
import io.github.composegears.valkyrie.generator.ext.setIndent
8+
import io.github.composegears.valkyrie.generator.model.IconPack
79

810
internal class IconPackFileSpec(private val config: IconPackGeneratorConfig) {
911

1012
fun createSpec(): IconPackSpecOutput {
11-
val iconPackSpec = objectBuilder(name = config.iconPackName) {
12-
config.nestedPacks.forEach { icon ->
13-
addType(objectBuilder(name = icon))
13+
val iconPackName = config.iconPack.name
14+
15+
val iconPackSpec = objectBuilder(name = iconPackName) {
16+
config.iconPack.nested.forEach { pack ->
17+
addType(createNestedObjectSpec(pack))
1418
}
1519
}
1620
val fileSpec = fileSpecBuilder(
1721
packageName = config.packageName,
18-
fileName = config.iconPackName,
22+
fileName = iconPackName,
1923
) {
2024
addType(iconPackSpec)
2125
setIndent(config.indentSize)
@@ -28,4 +32,12 @@ internal class IconPackFileSpec(private val config: IconPackGeneratorConfig) {
2832
name = fileSpec.name,
2933
)
3034
}
35+
36+
private fun createNestedObjectSpec(pack: IconPack): TypeSpec {
37+
return objectBuilder(name = pack.name) {
38+
pack.nested.forEach { nestedPack ->
39+
addType(createNestedObjectSpec(nestedPack))
40+
}
41+
}
42+
}
3143
}

components/generator/iconpack/src/main/kotlin/io/github/composegears/valkyrie/generator/iconpack/IconPackGenerator.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package io.github.composegears.valkyrie.generator.iconpack
22

3+
import io.github.composegears.valkyrie.generator.model.IconPack
4+
35
data class IconPackGeneratorConfig(
46
val packageName: String,
5-
val iconPackName: String,
6-
val nestedPacks: List<String>,
7+
val iconPack: IconPack,
78
val useExplicitMode: Boolean,
89
val indentSize: Int,
910
)

components/generator/iconpack/src/test/kotlin/io/github/composegears/valkyrie/generator/iconpack/IcoPackWithIndentTest.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,20 @@ package io.github.composegears.valkyrie.generator.iconpack
33
import assertk.assertThat
44
import assertk.assertions.isEqualTo
55
import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourceText
6+
import io.github.composegears.valkyrie.generator.model.iconpack
67
import org.junit.jupiter.api.Test
78

89
class IcoPackWithIndentTest {
910

1011
private fun createConfig(
11-
nestedPacks: List<String> = listOf("Filled", "Colored"),
1212
useExplicitMode: Boolean = false,
1313
indentSize: Int = 4,
1414
) = IconPackGeneratorConfig(
1515
packageName = "io.github.composegears.valkyrie.icons",
16-
iconPackName = "ValkyrieIcons",
17-
nestedPacks = nestedPacks,
16+
iconPack = iconpack(name = "ValkyrieIcons") {
17+
pack(name = "Filled")
18+
pack(name = "Colored")
19+
},
1820
useExplicitMode = useExplicitMode,
1921
indentSize = indentSize,
2022
)

components/generator/iconpack/src/test/kotlin/io/github/composegears/valkyrie/generator/iconpack/IconPackGeneratorTest.kt

Lines changed: 62 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,19 @@ package io.github.composegears.valkyrie.generator.iconpack
33
import assertk.assertThat
44
import assertk.assertions.isEqualTo
55
import io.github.composegears.valkyrie.extensions.ResourceUtils.getResourceText
6+
import io.github.composegears.valkyrie.generator.model.IconPack
7+
import io.github.composegears.valkyrie.generator.model.iconpack
68
import org.junit.jupiter.api.Test
79

810
class IconPackGeneratorTest {
911

1012
private fun createConfig(
11-
nestedPacks: List<String> = emptyList(),
13+
iconPack: IconPack = iconpack(name = "ValkyrieIcons"),
1214
useExplicitMode: Boolean = false,
1315
indentSize: Int = 4,
1416
) = IconPackGeneratorConfig(
1517
packageName = "io.github.composegears.valkyrie.icons",
16-
iconPackName = "ValkyrieIcons",
17-
nestedPacks = nestedPacks,
18+
iconPack = iconPack,
1819
useExplicitMode = useExplicitMode,
1920
indentSize = indentSize,
2021
)
@@ -42,12 +43,63 @@ class IconPackGeneratorTest {
4243
}
4344

4445
@Test
45-
fun `generate nested packs`() {
46+
fun `generate nested pack level 2`() {
4647
val result = IconPackGenerator.create(
47-
config = createConfig(nestedPacks = listOf("Filled", "Colored")),
48+
config = createConfig(
49+
iconPack = iconpack(name = "ValkyrieIcons") {
50+
pack(name = "Filled")
51+
pack(name = "Colored")
52+
},
53+
),
54+
)
55+
56+
val expected = getResourceText("iconpack/IconPack.nested.L2.kt")
57+
58+
assertThat(result.content).isEqualTo(expected)
59+
assertThat(result.name).isEqualTo("ValkyrieIcons")
60+
}
61+
62+
@Test
63+
fun `generate nested pack level 3`() {
64+
val result = IconPackGenerator.create(
65+
config = createConfig(
66+
iconPack = iconpack(name = "ValkyrieIcons") {
67+
pack(name = "Rounded") {
68+
pack(name = "Filled")
69+
}
70+
pack(name = "Sharp") {
71+
pack(name = "Colored")
72+
pack(name = "Dark")
73+
}
74+
},
75+
),
76+
)
77+
78+
val expected = getResourceText("iconpack/IconPack.nested.L3.kt")
79+
80+
assertThat(result.content).isEqualTo(expected)
81+
assertThat(result.name).isEqualTo("ValkyrieIcons")
82+
}
83+
84+
@Test
85+
fun `generate nested pack level 4`() {
86+
val result = IconPackGenerator.create(
87+
config = createConfig(
88+
iconPack = iconpack(name = "ValkyrieIcons") {
89+
pack(name = "Material") {
90+
pack(name = "Rounded") {
91+
pack(name = "Filled")
92+
pack(name = "Outlined")
93+
}
94+
}
95+
pack(name = "Custom") {
96+
pack(name = "Brand")
97+
}
98+
},
99+
),
48100
)
49101

50-
val expected = getResourceText("iconpack/IconPack.nested.kt")
102+
val expected = getResourceText("iconpack/IconPack.nested.L4.kt")
51103

52104
assertThat(result.content).isEqualTo(expected)
53105
assertThat(result.name).isEqualTo("ValkyrieIcons")
@@ -57,7 +109,10 @@ class IconPackGeneratorTest {
57109
fun `generate nested packs explicit`() {
58110
val result = IconPackGenerator.create(
59111
config = createConfig(
60-
nestedPacks = listOf("Filled", "Colored"),
112+
iconPack = iconpack(name = "ValkyrieIcons") {
113+
pack(name = "Filled")
114+
pack(name = "Colored")
115+
},
61116
useExplicitMode = true,
62117
),
63118
)

components/generator/imagevector/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ sourceSets {
1212

1313
dependencies {
1414
implementation(projects.components.extensions)
15-
implementation(projects.components.generator.common)
15+
api(projects.components.generator.common)
1616
implementation(projects.components.ir)
1717

1818
implementation(libs.kotlinpoet)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.github.composegears.valkyrie.icons
2+
3+
object ValkyrieIcons {
4+
object Rounded {
5+
object Filled
6+
}
7+
8+
object Sharp {
9+
object Colored
10+
11+
object Dark
12+
}
13+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.github.composegears.valkyrie.icons
2+
3+
object ValkyrieIcons {
4+
object Material {
5+
object Rounded {
6+
object Filled
7+
8+
object Outlined
9+
}
10+
}
11+
12+
object Custom {
13+
object Brand
14+
}
15+
}

idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/mode/iconpack/creation/common/util/IconPackWriter.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.intellij.openapi.vfs.VirtualFileManager
55
import io.github.composegears.valkyrie.extensions.writeToKt
66
import io.github.composegears.valkyrie.generator.iconpack.IconPackGenerator
77
import io.github.composegears.valkyrie.generator.iconpack.IconPackGeneratorConfig
8+
import io.github.composegears.valkyrie.generator.model.IconPack
89
import io.github.composegears.valkyrie.settings.InMemorySettings
910
import io.github.composegears.valkyrie.settings.updateNestedPack
1011
import io.github.composegears.valkyrie.ui.domain.model.Mode
@@ -31,8 +32,10 @@ object IconPackWriter {
3132
val iconPack = IconPackGenerator.create(
3233
config = IconPackGeneratorConfig(
3334
packageName = currentSettings.packageName,
34-
iconPackName = currentSettings.iconPackName,
35-
nestedPacks = currentSettings.nestedPacks,
35+
iconPack = IconPack(
36+
name = currentSettings.iconPackName,
37+
nested = currentSettings.nestedPacks.map(::IconPack),
38+
),
3639
useExplicitMode = currentSettings.useExplicitMode,
3740
indentSize = currentSettings.indentSize,
3841
),

idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/ui/screen/mode/iconpack/existingpack/ui/viewmodel/ExistingPackViewModel.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.intellij.openapi.project.Project
55
import io.github.composegears.valkyrie.extensions.safeAs
66
import io.github.composegears.valkyrie.generator.iconpack.IconPackGenerator
77
import io.github.composegears.valkyrie.generator.iconpack.IconPackGeneratorConfig
8+
import io.github.composegears.valkyrie.generator.model.IconPack
89
import io.github.composegears.valkyrie.psi.iconpack.IconPackInfo
910
import io.github.composegears.valkyrie.psi.iconpack.IconPackPsiParser
1011
import io.github.composegears.valkyrie.ui.di.DI
@@ -102,8 +103,10 @@ class ExistingPackViewModel : TiamatViewModel() {
102103
val iconPackCode = IconPackGenerator.create(
103104
config = IconPackGeneratorConfig(
104105
packageName = inputFieldState.packageName.text,
105-
iconPackName = inputFieldState.iconPackName.text,
106-
nestedPacks = inputFieldState.nestedPacks.map { it.inputFieldState.text },
106+
iconPack = IconPack(
107+
name = inputFieldState.iconPackName.text,
108+
nested = inputFieldState.nestedPacks.map { IconPack(it.inputFieldState.text) },
109+
),
107110
useExplicitMode = inMemorySettings.current.useExplicitMode,
108111
indentSize = inMemorySettings.current.indentSize,
109112
),

0 commit comments

Comments
 (0)