Skip to content

Commit 7b2d66e

Browse files
authored
Added initial Koin support. (#39)
1 parent d816270 commit 7b2d66e

26 files changed

+615
-352
lines changed

cli/src/main/kotlin/com/mitteloupe/cag/cli/AppArgumentProcessor.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.mitteloupe.cag.cli.request.FeatureRequest
1616
import com.mitteloupe.cag.cli.request.ProjectTemplateRequest
1717
import com.mitteloupe.cag.cli.request.UseCaseRequest
1818
import com.mitteloupe.cag.cli.request.ViewModelRequest
19+
import com.mitteloupe.cag.core.option.DependencyInjection
1920

2021
private val PRIMARY_FLAGS =
2122
setOf(
@@ -126,7 +127,7 @@ class AppArgumentProcessor(
126127
.parsePrimaryWithSecondaries(arguments = arguments, primaryFlag = NewArchitecturePrimary)
127128
.map { secondaries ->
128129
ArchitectureRequest(
129-
enableHilt = true,
130+
dependencyInjection = DependencyInjection.Hilt,
130131
enableCompose = !secondaries.containsKey(SecondaryFlagConstants.NO_COMPOSE),
131132
enableKtlint = secondaries.containsKey(SecondaryFlagConstants.KTLINT),
132133
enableDetekt = secondaries.containsKey(SecondaryFlagConstants.DETEKT),
@@ -142,7 +143,7 @@ class AppArgumentProcessor(
142143
ProjectTemplateRequest(
143144
projectName = secondaries[SecondaryFlagConstants.NAME].orEmpty(),
144145
packageName = secondaries[SecondaryFlagConstants.PACKAGE].orEmpty(),
145-
enableHilt = true,
146+
dependencyInjection = DependencyInjection.Hilt,
146147
enableCompose = !secondaries.containsKey(SecondaryFlagConstants.NO_COMPOSE),
147148
enableKtlint = secondaries.containsKey(SecondaryFlagConstants.KTLINT),
148149
enableDetekt = secondaries.containsKey(SecondaryFlagConstants.DETEKT),

cli/src/main/kotlin/com/mitteloupe/cag/cli/Main.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ fun main(arguments: Array<String>) {
8888
packageName = request.packageName,
8989
overrideMinimumAndroidSdk = null,
9090
overrideAndroidGradlePluginVersion = null,
91-
enableHilt = request.enableHilt,
91+
dependencyInjection = request.dependencyInjection,
9292
enableCompose = request.enableCompose,
9393
enableKtlint = request.enableKtlint,
9494
enableDetekt = request.enableDetekt,
@@ -118,7 +118,7 @@ fun main(arguments: Array<String>) {
118118
GenerateArchitectureRequest(
119119
destinationRootDirectory = destinationRootDirectory,
120120
architecturePackageName = architecturePackageName,
121-
enableHilt = request.enableHilt,
121+
dependencyInjection = request.dependencyInjection,
122122
enableCompose = request.enableCompose,
123123
enableKtlint = request.enableKtlint,
124124
enableDetekt = request.enableDetekt

cli/src/main/kotlin/com/mitteloupe/cag/cli/request/ArchitectureRequest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.mitteloupe.cag.cli.request
22

3+
import com.mitteloupe.cag.core.option.DependencyInjection
4+
35
data class ArchitectureRequest(
4-
val enableHilt: Boolean,
6+
val dependencyInjection: DependencyInjection,
57
val enableCompose: Boolean,
68
val enableKtlint: Boolean,
79
val enableDetekt: Boolean,

cli/src/main/kotlin/com/mitteloupe/cag/cli/request/ProjectTemplateRequest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.mitteloupe.cag.cli.request
22

3+
import com.mitteloupe.cag.core.option.DependencyInjection
4+
35
data class ProjectTemplateRequest(
46
val projectName: String,
57
val packageName: String,
6-
val enableHilt: Boolean,
8+
val dependencyInjection: DependencyInjection,
79
val enableCompose: Boolean,
810
val enableKtlint: Boolean,
911
val enableDetekt: Boolean,

cli/src/test/kotlin/com/mitteloupe/cag/cli/AppArgumentProcessorTest.kt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.mitteloupe.cag.cli.request.FeatureRequest
55
import com.mitteloupe.cag.cli.request.ProjectTemplateRequest
66
import com.mitteloupe.cag.cli.request.UseCaseRequest
77
import com.mitteloupe.cag.cli.request.ViewModelRequest
8+
import com.mitteloupe.cag.core.option.DependencyInjection
89
import org.junit.Assert.assertEquals
910
import org.junit.Assert.assertFalse
1011
import org.junit.Assert.assertTrue
@@ -750,7 +751,7 @@ class AppArgumentProcessorTest {
750751
ProjectTemplateRequest(
751752
projectName = "MyApp",
752753
packageName = "com.example",
753-
enableHilt = true,
754+
dependencyInjection = DependencyInjection.Hilt,
754755
enableCompose = true,
755756
enableKtlint = true,
756757
enableDetekt = true,
@@ -774,7 +775,7 @@ class AppArgumentProcessorTest {
774775
ProjectTemplateRequest(
775776
projectName = "TestApp",
776777
packageName = "com.test",
777-
enableHilt = true,
778+
dependencyInjection = DependencyInjection.Hilt,
778779
enableCompose = false,
779780
enableKtlint = true,
780781
enableDetekt = true,
@@ -798,7 +799,7 @@ class AppArgumentProcessorTest {
798799
ProjectTemplateRequest(
799800
projectName = "MinimalApp",
800801
packageName = "",
801-
enableHilt = true,
802+
dependencyInjection = DependencyInjection.Hilt,
802803
enableCompose = true,
803804
enableKtlint = false,
804805
enableDetekt = false,
@@ -822,7 +823,7 @@ class AppArgumentProcessorTest {
822823
ProjectTemplateRequest(
823824
projectName = "NoComposeApp",
824825
packageName = "",
825-
enableHilt = true,
826+
dependencyInjection = DependencyInjection.Hilt,
826827
enableCompose = false,
827828
enableKtlint = false,
828829
enableDetekt = false,
@@ -846,7 +847,7 @@ class AppArgumentProcessorTest {
846847
ProjectTemplateRequest(
847848
projectName = "First",
848849
packageName = "com.first",
849-
enableHilt = true,
850+
dependencyInjection = DependencyInjection.Hilt,
850851
enableCompose = true,
851852
enableKtlint = false,
852853
enableDetekt = false,
@@ -858,7 +859,7 @@ class AppArgumentProcessorTest {
858859
ProjectTemplateRequest(
859860
projectName = "Second",
860861
packageName = "",
861-
enableHilt = true,
862+
dependencyInjection = DependencyInjection.Hilt,
862863
enableCompose = true,
863864
enableKtlint = false,
864865
enableDetekt = false,
@@ -980,7 +981,7 @@ class AppArgumentProcessorTest {
980981
ProjectTemplateRequest(
981982
projectName = "GitApp",
982983
packageName = "",
983-
enableHilt = true,
984+
dependencyInjection = DependencyInjection.Hilt,
984985
enableCompose = true,
985986
enableKtlint = false,
986987
enableDetekt = false,

core/src/main/kotlin/com/mitteloupe/cag/core/Generator.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class Generator(
8383
architectureFilesGenerator.generateArchitecture(
8484
destinationRootDirectory = request.destinationRootDirectory,
8585
architecturePackageName = request.architecturePackageName,
86-
enableHilt = request.enableHilt,
86+
dependencyInjection = request.dependencyInjection,
8787
enableCompose = request.enableCompose,
8888
enableKtlint = request.enableKtlint,
8989
enableDetekt = request.enableDetekt
@@ -97,7 +97,7 @@ class Generator(
9797
packageName = request.packageName,
9898
overrideMinimumAndroidSdk = request.overrideMinimumAndroidSdk,
9999
overrideAndroidGradlePluginVersion = request.overrideAndroidGradlePluginVersion,
100-
enableHilt = request.enableHilt,
100+
dependencyInjection = request.dependencyInjection,
101101
enableCompose = request.enableCompose,
102102
enableKtlint = request.enableKtlint,
103103
enableDetekt = request.enableDetekt,

core/src/main/kotlin/com/mitteloupe/cag/core/content/AppGradleBuilder.kt

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ import com.mitteloupe.cag.core.generation.versioncatalog.LibraryConstants
44
import com.mitteloupe.cag.core.generation.versioncatalog.PluginConstants
55
import com.mitteloupe.cag.core.generation.versioncatalog.VersionCatalogReader
66
import com.mitteloupe.cag.core.generation.versioncatalog.asAccessor
7+
import com.mitteloupe.cag.core.option.DependencyInjection
78

89
fun buildAppGradleScript(
910
packageName: String,
10-
enableHilt: Boolean,
11+
dependencyInjection: DependencyInjection,
1112
enableCompose: Boolean,
1213
catalog: VersionCatalogReader
1314
): String {
@@ -57,7 +58,7 @@ fun buildAppGradleScript(
5758
val aliasKotlinAndroid = catalog.getResolvedPluginAliasFor(PluginConstants.KOTLIN_ANDROID).asAccessor
5859
val aliasKsp = catalog.getResolvedPluginAliasFor(PluginConstants.KSP).asAccessor
5960
val hiltPlugin =
60-
if (enableHilt) {
61+
if (dependencyInjection == DependencyInjection.Hilt) {
6162
val aliasPluginHilt = catalog.getResolvedPluginAliasFor(PluginConstants.HILT_ANDROID).asAccessor
6263
"""
6364
alias(libs.plugins.$aliasPluginHilt)"""
@@ -67,11 +68,25 @@ fun buildAppGradleScript(
6768
val aliasMaterial = catalog.getResolvedLibraryAliasForModule(LibraryConstants.MATERIAL).asAccessor
6869
val aliasCoreKtx = catalog.getResolvedLibraryAliasForModule(LibraryConstants.ANDROIDX_CORE_KTX).asAccessor
6970
val aliasLifecycleRuntimeKtx = catalog.getResolvedLibraryAliasForModule(LibraryConstants.ANDROIDX_LIFECYCLE_RUNTIME_KTX).asAccessor
70-
val aliasHiltAndroid = catalog.getResolvedLibraryAliasForModule(LibraryConstants.HILT_ANDROID).asAccessor
71-
val aliasHiltAndroidCompiler = catalog.getResolvedLibraryAliasForModule(LibraryConstants.HILT_ANDROID_COMPILER).asAccessor
7271
val aliasTestJunit = catalog.getResolvedLibraryAliasForModule(LibraryConstants.TEST_JUNIT).asAccessor
7372
val aliasTestAndroidxJunit = catalog.getResolvedLibraryAliasForModule(LibraryConstants.TEST_ANDROIDX_JUNIT).asAccessor
7473
val aliasTestAndroidxEspressoCore = catalog.getResolvedLibraryAliasForModule(LibraryConstants.TEST_ANDROIDX_ESPRESSO_CORE).asAccessor
74+
val dependencyInjectionDependencies =
75+
when (dependencyInjection) {
76+
DependencyInjection.Hilt -> {
77+
val aliasHiltAndroid = catalog.getResolvedLibraryAliasForModule(LibraryConstants.HILT_ANDROID).asAccessor
78+
val aliasHiltAndroidCompiler = catalog.getResolvedLibraryAliasForModule(LibraryConstants.HILT_ANDROID_COMPILER).asAccessor
79+
"""
80+
implementation(libs.$aliasHiltAndroid)
81+
ksp(libs.$aliasHiltAndroidCompiler)"""
82+
}
83+
DependencyInjection.Koin -> {
84+
val aliasKoinAndroid = catalog.getResolvedLibraryAliasForModule(LibraryConstants.KOIN_ANDROID).asAccessor
85+
"""
86+
implementation(libs.$aliasKoinAndroid)"""
87+
}
88+
DependencyInjection.None -> ""
89+
}
7590
val result =
7691
"""
7792
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
@@ -132,9 +147,7 @@ fun buildAppGradleScript(
132147
dependencies {
133148
implementation(libs.$aliasMaterial)
134149
implementation(libs.$aliasCoreKtx)
135-
implementation(libs.$aliasLifecycleRuntimeKtx)
136-
implementation(libs.$aliasHiltAndroid)
137-
ksp(libs.$aliasHiltAndroidCompiler)$viewDependencies
150+
implementation(libs.$aliasLifecycleRuntimeKtx)$dependencyInjectionDependencies$viewDependencies
138151
implementation(projects.architecture.ui)
139152
implementation(projects.architecture.presentation)
140153
implementation(projects.architecture.domain)
@@ -149,6 +162,7 @@ fun buildAppGradleScript(
149162
androidTestImplementation(libs.$aliasTestAndroidxJunit)
150163
androidTestImplementation(libs.$aliasTestAndroidxEspressoCore)
151164
}
165+
152166
""".trimIndent()
153167
return result
154168
}
Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,68 @@
11
package com.mitteloupe.cag.core.content
22

3+
import com.mitteloupe.cag.core.generation.format.optimizeImports
4+
import com.mitteloupe.cag.core.option.DependencyInjection
5+
36
fun buildApplicationKotlinFile(
47
projectNamespace: String,
5-
appName: String
8+
appName: String,
9+
dependencyInjection: DependencyInjection
610
): String =
7-
"""
8-
package $projectNamespace
11+
when (dependencyInjection) {
12+
DependencyInjection.Hilt -> {
13+
"""
14+
package $projectNamespace
15+
16+
import android.app.Application
17+
import dagger.hilt.android.HiltAndroidApp
18+
19+
@HiltAndroidApp
20+
class ${appName}Application : Application()
21+
22+
""".trimIndent()
23+
}
24+
DependencyInjection.Koin -> {
25+
val optimizedImports =
26+
"""import $projectNamespace.di.architectureModule
27+
import android.app.Application
28+
import org.koin.android.ext.koin.androidContext
29+
import org.koin.android.ext.koin.androidLogger
30+
import org.koin.core.context.GlobalContext.startKoin
31+
import org.koin.dsl.KoinAppDeclaration
32+
import org.koin.dsl.includes
33+
""".optimizeImports()
34+
35+
"""
36+
package $projectNamespace
37+
38+
$optimizedImports
39+
class ${appName}Application : Application() {
40+
private fun initKoin(config : KoinAppDeclaration? = null){
41+
startKoin {
42+
includes(config)
43+
modules(architectureModule)
44+
}
45+
}
46+
47+
override fun onCreate() {
48+
super.onCreate()
49+
50+
initKoin {
51+
androidContext(this@${appName}Application)
52+
androidLogger()
53+
}
54+
}
55+
}
56+
"""
57+
}
58+
DependencyInjection.None -> {
59+
"""
60+
package $projectNamespace
961
10-
import android.app.Application
11-
import dagger.hilt.android.HiltAndroidApp
62+
import android.app.Application
1263
13-
@HiltAndroidApp
14-
class ${appName}Application : Application()
64+
class ${appName}Application : Application()
1565
16-
""".trimIndent()
66+
""".trimIndent()
67+
}
68+
}

core/src/main/kotlin/com/mitteloupe/cag/core/content/ProjectGradleScriptBuilder.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import com.mitteloupe.cag.core.content.gradle.GradleFileExtender
44
import com.mitteloupe.cag.core.generation.versioncatalog.PluginConstants
55
import com.mitteloupe.cag.core.generation.versioncatalog.VersionCatalogReader
66
import com.mitteloupe.cag.core.generation.versioncatalog.asAccessor
7+
import com.mitteloupe.cag.core.option.DependencyInjection
78

89
fun buildProjectGradleScript(
9-
enableHilt: Boolean,
10+
dependencyInjection: DependencyInjection,
1011
enableKtlint: Boolean,
1112
enableDetekt: Boolean,
1213
catalog: VersionCatalogReader
@@ -46,7 +47,7 @@ fun buildProjectGradleScript(
4647
val aliasKotlinJvm = catalog.getResolvedPluginAliasFor(PluginConstants.KOTLIN_JVM).asAccessor
4748
val aliasKsp = catalog.getResolvedPluginAliasFor(PluginConstants.KSP).asAccessor
4849
val hiltPlugin =
49-
if (enableHilt) {
50+
if (dependencyInjection == DependencyInjection.Hilt) {
5051
val aliasHilt = catalog.getResolvedPluginAliasFor(PluginConstants.HILT_ANDROID).asAccessor
5152
"""
5253
alias(libs.plugins.$aliasHilt) apply false"""

core/src/main/kotlin/com/mitteloupe/cag/core/content/architecture/ArchitectureInstrumentationTestGradleScriptBuilder.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import com.mitteloupe.cag.core.generation.versioncatalog.LibraryConstants
55
import com.mitteloupe.cag.core.generation.versioncatalog.PluginConstants
66
import com.mitteloupe.cag.core.generation.versioncatalog.VersionCatalogReader
77
import com.mitteloupe.cag.core.generation.versioncatalog.asAccessor
8+
import com.mitteloupe.cag.core.option.DependencyInjection
89

910
fun buildArchitectureInstrumentationTestGradleScript(
1011
architecturePackageName: String,
11-
enableHilt: Boolean,
12+
dependencyInjection: DependencyInjection,
1213
catalog: VersionCatalogReader
1314
): String {
1415
val aliasAndroidLibrary = catalog.getResolvedPluginAliasFor(PluginConstants.ANDROID_LIBRARY).asAccessor
@@ -40,7 +41,7 @@ fun buildArchitectureInstrumentationTestGradleScript(
4041

4142
val configurations = "$ktlintConfiguration$detektConfiguration".trimIndent()
4243
val hiltDependency =
43-
if (enableHilt) {
44+
if (dependencyInjection == DependencyInjection.Hilt) {
4445
val aliasTestAndroidHilt = catalog.getResolvedLibraryAliasForModule(LibraryConstants.TEST_ANDROID_HILT).asAccessor
4546
"""
4647
implementation(libs.$aliasTestAndroidHilt)"""

0 commit comments

Comments
 (0)