From e9c755abb2537ac3e70fa5525d9f08e51d3e9c2e Mon Sep 17 00:00:00 2001 From: murjune Date: Sat, 7 Sep 2024 20:05:26 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EB=B2=84=EC=A0=84=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-logic/convention/build.gradle.kts | 31 +++- .../plugins/AndroidApplicationPlugin.kt | 36 ++++ .../practice/plugins/AndroidFeaturePlugin.kt | 24 +++ .../practice/plugins/AndroidHiltPlugin.kt | 22 +++ .../practice/plugins/AndroidLibraryPlugin.kt | 26 +++ .../practice/plugins/AndroidTestPlugin.kt | 44 +++++ .../murjune/practice/plugins/ComposePlugin.kt | 28 ++++ .../practice/plugins/KotlinModulePlugin.kt | 2 +- .../{JUnit5Plugin.kt => UnitTestPlugin.kt} | 7 +- .../plugins/utils/AndroidCommonConfigs.kt | 22 +++ .../practice/plugins/utils/KotlinConfigs.kt | 29 ++++ build.gradle.kts | 8 + gradle.properties | 27 +++ gradle/libs.versions.toml | 155 +++++++++++++++++- .../com/murjune/practice/DebuggingEx.kt | 11 -- local.properties | 8 + settings.gradle.kts | 1 + 17 files changed, 453 insertions(+), 28 deletions(-) create mode 100644 build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidApplicationPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidFeaturePlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidHiltPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidLibraryPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidTestPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/ComposePlugin.kt rename build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/{JUnit5Plugin.kt => UnitTestPlugin.kt} (61%) create mode 100644 build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/utils/AndroidCommonConfigs.kt delete mode 100644 kotlin-practice/src/main/kotlin/com/murjune/practice/DebuggingEx.kt create mode 100644 local.properties diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 4bedd72..aaadcc4 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -11,10 +11,37 @@ java { dependencies { compileOnly(libs.kotlin.gradleplugin) + compileOnly(libs.agp) + compileOnly(libs.ksp.gradlePlugin) } gradlePlugin { plugins { + create("android-application") { + id = "com.murjune.practice.application" + implementationClass = + "com.murjune.practice.plugins.AndroidApplicationPlugin" + } + create("android-library") { + id = "com.murjune.practice.library" + implementationClass = "com.murjune.practice.plugins.AndroidLibraryPlugin" + } + create("android-feature") { + id = "com.murjune.practice.feature" + implementationClass = "com.murjune.practice.plugins.AndroidFeaturePlugin" + } + create("android-hilt") { + id = "com.murjune.practice.hilt" + implementationClass = "com.murjune.practice.plugins.AndroidHiltPlugin" + } + create("android-test") { + id = "com.murjune.practice.android.test" + implementationClass = "com.murjune.practice.plugins.AndroidTestPlugin" + } + create("compose") { + id = "com.murjune.practice.compose" + implementationClass = "com.murjune.practice.plugins.ComposePlugin" + } create("kotlin-serialization") { id = "com.murjune.practice.kotlinx_serialization" implementationClass = @@ -26,8 +53,8 @@ gradlePlugin { implementationClass = "com.murjune.practice.plugins.KotlinModulePlugin" } - create("junit5") { - id = "com.murjune.practice.junit5" + create("unit-test") { + id = "com.murjune.practice.unit.test" implementationClass = "com.murjune.practice.plugins.JUnit5Plugin" } diff --git a/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidApplicationPlugin.kt b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidApplicationPlugin.kt new file mode 100644 index 0000000..c379cef --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidApplicationPlugin.kt @@ -0,0 +1,36 @@ +package com.murjune.practice.plugins + +import com.android.build.api.dsl.ApplicationExtension +import com.murjune.practice.plugins.utils.configureAndroidCommonPlugin +import com.murjune.practice.plugins.utils.configureKotlinAndroid +import com.murjune.practice.plugins.utils.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.kotlin + +class AndroidApplicationPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("com.android.application") + apply("kotlin-android") + } + configureAndroidCommonPlugin() + + extensions.configure { + configureKotlinAndroid(this) + defaultConfig.targetSdk = + libs.findVersion("targetSdk").get().requiredVersion.toInt() + } + dependencies { + add("implementation", libs.findLibrary("core.ktx").get()) + add("implementation", libs.findLibrary("appcompat").get()) + add("implementation", libs.findBundle("lifecycle").get()) + add("implementation", libs.findLibrary("material").get()) + add("testImplementation", kotlin("test")) + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidFeaturePlugin.kt b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidFeaturePlugin.kt new file mode 100644 index 0000000..3e27922 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidFeaturePlugin.kt @@ -0,0 +1,24 @@ +package com.murjune.practice.plugins + +import com.murjune.practice.plugins.utils.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.kotlin + +class AndroidFeaturePlugin : Plugin { + override fun apply(target: Project) { + with(target) { + apply() + + dependencies { + add("implementation", libs.findLibrary("core.ktx").get()) + add("implementation", libs.findLibrary("appcompat").get()) + add("implementation", libs.findBundle("lifecycle").get()) + add("implementation", libs.findLibrary("material").get()) + add("testImplementation", kotlin("test")) + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidHiltPlugin.kt b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidHiltPlugin.kt new file mode 100644 index 0000000..9e5232b --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidHiltPlugin.kt @@ -0,0 +1,22 @@ +package com.murjune.practice.plugins + +import com.murjune.practice.plugins.utils.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies + +class AndroidHiltPlugin : Plugin { + override fun apply(target: Project) = + with(target) { + with(plugins) { + apply("com.google.devtools.ksp") + apply("dagger.hilt.android.plugin") + } + + dependencies { + add("implementation", libs.findLibrary("hilt.navigation.compose").get()) + add("implementation", libs.findLibrary("hilt.android").get()) + add("ksp", libs.findLibrary("hilt.compiler").get()) + } + } +} diff --git a/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidLibraryPlugin.kt b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidLibraryPlugin.kt new file mode 100644 index 0000000..06ce0f3 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidLibraryPlugin.kt @@ -0,0 +1,26 @@ +package com.murjune.practice.plugins + +import com.android.build.gradle.LibraryExtension +import com.murjune.practice.plugins.utils.configureAndroidCommonPlugin +import com.murjune.practice.plugins.utils.configureKotlinAndroid +import com.murjune.practice.plugins.utils.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +class AndroidLibraryPlugin : Plugin { + override fun apply(target: Project) = + with(target) { + with(pluginManager) { + apply("com.android.library") + apply("kotlin-android") + } + configureAndroidCommonPlugin() + + extensions.configure { + configureKotlinAndroid(this) + defaultConfig.targetSdk = + libs.findVersion("targetSdk").get().requiredVersion.toInt() + } + } +} diff --git a/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidTestPlugin.kt b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidTestPlugin.kt new file mode 100644 index 0000000..52e8fd9 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/AndroidTestPlugin.kt @@ -0,0 +1,44 @@ +package com.murjune.practice.plugins + +import com.android.build.gradle.BaseExtension +import com.murjune.practice.plugins.utils.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.getByType + +class AndroidTestPlugin : Plugin { + override fun apply(target: Project): Unit = with(target) { + with(pluginManager) { + apply() + apply("de.mannodermaus.android-junit5") + } + + extensions.getByType().apply { + defaultConfig { + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArguments["runnerBuilder"] = + "de.mannodermaus.junit5.AndroidJUnit5Builder" + } + + testOptions { + unitTests { + isIncludeAndroidResources = true + } + } + + packagingOptions { + resources.excludes.add("META-INF/LICENSE*") + } + } + + dependencies { + add("androidTestImplementation", libs.findBundle("unit-test").get()) + add("testImplementation", libs.findLibrary("robolectric").get()) + add("androidTestImplementation", libs.findLibrary("junit5-android-test-core").get()) + add("androidTestRuntimeOnly", libs.findLibrary("junit5-android-test-runner").get()) + add("androidTestImplementation", libs.findBundle("androidx-android-test").get()) + } + } +} diff --git a/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/ComposePlugin.kt b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/ComposePlugin.kt new file mode 100644 index 0000000..d183b2a --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/ComposePlugin.kt @@ -0,0 +1,28 @@ +package com.murjune.practice.plugins + +import com.android.build.gradle.BaseExtension +import com.murjune.practice.plugins.utils.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.getByType + +class ComposePlugin : Plugin { + override fun apply(target: Project) = + with(target) { + extensions.getByType().apply { + buildFeatures.apply { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = + libs.findVersion("composeCompiler").get().toString() + } + } + + dependencies { + add("implementation", platform(libs.findLibrary("compose.bom").get())) + add("implementation", libs.findBundle("compose").get()) + } + } +} diff --git a/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/KotlinModulePlugin.kt b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/KotlinModulePlugin.kt index bd7d1d6..793c01d 100644 --- a/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/KotlinModulePlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/KotlinModulePlugin.kt @@ -11,7 +11,7 @@ class KotlinModulePlugin : Plugin { override fun apply(target: Project) { with(target) { apply() - apply() + apply() } } diff --git a/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/JUnit5Plugin.kt b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/UnitTestPlugin.kt similarity index 61% rename from build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/JUnit5Plugin.kt rename to build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/UnitTestPlugin.kt index 05c6239..2608254 100644 --- a/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/JUnit5Plugin.kt +++ b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/UnitTestPlugin.kt @@ -8,7 +8,7 @@ import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.kotlin import org.gradle.kotlin.dsl.withType -class JUnit5Plugin : Plugin { +class UnitTestPlugin : Plugin { override fun apply(target: Project): Unit = with(target) { @@ -18,10 +18,7 @@ class JUnit5Plugin : Plugin { dependencies { add("testImplementation", kotlin("test")) - add("testImplementation", libs.findBundle("junit5").get()) - add("testImplementation", libs.findLibrary("assertj").get()) - add("testImplementation", libs.findLibrary("kotlin-coroutines-test").get()) - add("testImplementation", libs.findLibrary("kotest").get()) + add("testImplementation", libs.findBundle("unit-test").get()) } } } diff --git a/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/utils/AndroidCommonConfigs.kt b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/utils/AndroidCommonConfigs.kt new file mode 100644 index 0000000..5ec6a71 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/utils/AndroidCommonConfigs.kt @@ -0,0 +1,22 @@ +package com.murjune.practice.plugins.utils + +import com.android.build.gradle.BaseExtension +import com.murjune.practice.plugins.AndroidHiltPlugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.getByType + +internal fun Project.configureAndroidCommonPlugin() { + apply() + + extensions.getByType().apply { + buildFeatures.apply { + buildConfig = true + } + } + + dependencies { + add("implementation", libs.findLibrary("timber").get()) + } +} diff --git a/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/utils/KotlinConfigs.kt b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/utils/KotlinConfigs.kt index bf5fcb6..8997c53 100644 --- a/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/utils/KotlinConfigs.kt +++ b/build-logic/convention/src/main/kotlin/com/murjune/practice/plugins/utils/KotlinConfigs.kt @@ -1,5 +1,6 @@ package com.murjune.practice.plugins.utils +import com.android.build.api.dsl.CommonExtension import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.api.plugins.JavaPluginExtension @@ -8,6 +9,34 @@ import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +/** + * Configure base Kotlin with Android options + */ +internal fun Project.configureKotlinAndroid( + commonExtension: CommonExtension<*, *, *, *, *>, +) { + commonExtension.apply { + compileSdk = libs.findVersion("compileSdk").get().requiredVersion.toInt() + + defaultConfig { + minSdk = libs.findVersion("minSdk").get().requiredVersion.toInt() + } + + compileOptions { +// isCoreLibraryDesugaringEnabled = true + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + } + + configureKotlin() + + dependencies { + add("implementation", libs.findLibrary("kotlin").get()) + add("implementation", libs.findLibrary("kotlin.coroutines.android").get()) + } +} + /** * Configure base Kotlin options for JVM (non-Android) */ diff --git a/build.gradle.kts b/build.gradle.kts index 27c0b05..eb2bc70 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,11 +7,19 @@ buildscript { dependencies { classpath(libs.kotlin.gradleplugin) + classpath(libs.hilt.plugin) + classpath(libs.agp) classpath(libs.ktlint) } } plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.kotlin.kapt) apply false + alias(libs.plugins.dagger.hilt) apply false + alias(libs.plugins.ksp) apply false alias(libs.plugins.kotlinx.serialization) apply false alias(libs.plugins.junit5) apply false alias(libs.plugins.ktlint) apply false diff --git a/gradle.properties b/gradle.properties index 7fc6f1f..3c2fd43 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1,28 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +org.gradle.parallel=true +# Enable caching between builds. +org.gradle.caching=true + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true +android.enableJetifier=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4f069f7..b8f2b97 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,10 +1,30 @@ [versions] +compileSdk = "34" +minSdk = "28" +targetSdk = "34" version = "1.0-SNAPSHOT" versionCode = "10001" +# Android +core-ktx = "1.13.1" +fragment = "1.8.1" +appcompat = "1.7.0" +activity = "1.9.0" +lifecycle = "2.8.3" +material = "1.12.0" +startup = "1.1.1" +room = "2.6.1" +constraintlayout = "2.1.4" +flexbox = "3.0.0" +dagger-hilt = "2.50" +dagger-hilt-navigation-compose = "1.0.0" +composeCompiler = "1.5.8" +compose-bom = "2024.01.00" + # kotlin kotlin = "1.9.22" kotlinx-serialization-json = "1.6.2" +kotlinx-datetime = "0.5.0" kotlinx-coroutines = "1.7.3" # test @@ -16,34 +36,139 @@ assertj = "3.25.3" mockk = "1.13.9" mock-webserver = "4.9.1" +# android test +robolectric = "4.11.1" +androidx-test-espresso = "3.5.1" +android-junit5-plugin = "1.10.0.0" +android-junit5-core = "1.4.0" +androidx-test = "1.6.1" +androidx-test-junit = "1.2.1" +androidx-test-fragment = "1.8.1" +android-test-esspreso-contrib = "3.6.1" +androidx-test-espresso-core = "3.6.1" +androidx-test-core = "1.6.1" +androidx-test-runner = "1.5.0" + +# gradle +agp = "8.2.1" +ksp = "1.9.22-1.0.17" + # third party -ktlint = "12.1.0" okhttp = "4.12.0" +retrofit = "2.9.0" +timber = "5.0.1" +coil = "2.5.0" +lottie = "6.0.1" +kakao = "2.14.0" +splash-screen = "1.0.1" +ktlint = "12.1.0" +javax-inject = "1" +junitVersion = "4.13.2" +runner = "1.0.2" +espressoCore = "3.0.2" +appcompatV7 = "28.0.0" +appcompatV7Version = "28.0.0" +design = "28.0.0" +supportAnnotations = "28.0.0" +constraintLayoutVersion = "2.0.4" +livedata = "1.1.1" +viewmodel = "1.1.1" [libraries] +agp = { module = "com.android.tools.build:gradle", version.ref = "agp" } + # kotlin kotlin = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "kotlin" } kotlin-gradleplugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } +ksp-gradlePlugin = { group = "com.google.devtools.ksp", name = "com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" } kotlin-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" } +kotlinx-datetime = { group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version.ref = "kotlinx-datetime" } # coroutines +kotlin-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinx-coroutines" } kotlin-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } -# test -kotest = { group = "io.kotest", name = "kotest-runner-junit5", version.ref = "kotest" } +# android +core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" } +lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" } +lifecycle = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle" } +appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +material = { group = "com.google.android.material", name = "material", version.ref = "material" } +startup = { module = "androidx.startup:startup-runtime", version.ref = "startup" } +javax-inject = { group = "javax.inject", name = "javax.inject", version.ref = "javax-inject" } + +# dagger-hilt +hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "dagger-hilt" } +hilt-compiler = { module = "com.google.dagger:hilt-compiler", name = "hilt-compiler", version.ref = "dagger-hilt" } +hilt-plugin = { group = "com.google.dagger", name = "hilt-android-gradle-plugin", version.ref = "dagger-hilt" } +hilt-testing = { module = "com.google.dagger:hilt-android-testing", version.ref = "dagger-hilt" } +hilt-testing-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "dagger-hilt" } + +# compose +compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } +ui = { group = "androidx.compose.ui", name = "ui" } +ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } +ui-foundation = { group = "androidx.compose.foundation", name = "foundation" } +material3-compose = { group = "androidx.compose.material3", name = "material3" } +coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" } +activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activity" } +hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "dagger-hilt-navigation-compose" } +lifecycle-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycle" } +compose-lottie = { group = "com.airbnb.android", name = "lottie-compose", version.ref = "lottie" } + +# unit test +kotest-junit5-runner = { group = "io.kotest", name = "kotest-runner-junit5", version.ref = "kotest" } assertj = { group = "org.assertj", name = "assertj-core", version.ref = "assertj" } kotlin-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "kotlinx-coroutines" } -junit5 = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit5-jupiter" } -junit5-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit5-jupiter" } -junit5-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "junit5-jupiter" } -junit5-vintage = { module = "org.junit.vintage:junit-vintage-engine", version.ref = "junit5-jupiter" } +junit5 = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit5-jupiter" } mockk = { module = "io.mockk:mockk", version.ref = "mockk" } mockk-webserver = { module = "com.squareup.okhttp3:mockwebserver", version.ref = "okhttp" } +# android test +androidx-test-junit = { module = "androidx.test.ext:junit", version.ref = "androidx-test-junit" } +androidx-test-espresso = { module = "androidx.test.espresso:espresso-core", version.ref = "androidx-test-espresso" } +androidx-test-core = { module = "androidx.test:core", version.ref = "androidx-test-core" } +androidx-test-rules = { module = "androidx.test:rules", version.ref = "androidx-test-core" } +androidx-test-runner = { group = "androidx.test", name = "runner", version.ref = "androidx-test" } +androidx-test-junit-ktx = { group = "androidx.test.ext", name = "junit-ktx", version.ref = "androidx-test-junit" } +## android-junit5 +junit5-android-test-core = { module = "de.mannodermaus.junit5:android-test-core", version = "1.3.0" } +junit5-android-test-runner = { module = "de.mannodermaus.junit5:android-test-runner", version = "1.3.0" } +## robolectric +robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" } + # third party ktlint = { module = "org.jlleitschuh.gradle:ktlint-gradle", version.ref = "ktlint" } +okhttp-bom = { module = "com.squareup.okhttp3:okhttp-bom", version.ref = "okhttp" } +okhttp = { module = "com.squareup.okhttp3:okhttp" } +okhttp-logging-interceptor = { module = "com.squareup.okhttp3:logging-interceptor" } +retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } + +timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" } +coil-core = { module = "io.coil-kt:coil", version.ref = "coil" } +splash-screen = { module = "androidx.core:core-splashscreen", version.ref = "splash-screen" } +appcompat-v7 = { group = "com.android.support", name = "appcompat-v7", version.ref = "appcompatV7Version" } +design = { group = "com.android.support", name = "design", version.ref = "design" } +support-annotations = { group = "com.android.support", name = "support-annotations", version.ref = "supportAnnotations" } +constraint-layout = { group = "com.android.support.constraint", name = "constraint-layout", version.ref = "constraintLayoutVersion" } +livedata = { group = "android.arch.lifecycle", name = "livedata", version.ref = "livedata" } +viewmodel = { group = "android.arch.lifecycle", name = "viewmodel", version.ref = "viewmodel" } + [plugins] +# android +android-application = { id = "com.android.application", version.ref = "agp" } +android-library = { id = "com.android.library", version.ref = "agp" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } +dagger-hilt = { id = "com.google.dagger.hilt.android", version.ref = "dagger-hilt" } +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } + +# jvm kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } junit5 = { id = "de.mannodermaus.android-junit5", version.ref = "junit5-plugin" } ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" } @@ -52,7 +177,19 @@ ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" } murjune-junit5 = { id = "com.murjune.practice.junit5", version = "unspecified" } murjune-jvm-library = { id = "com.murjune.practice.jvm.library", version = "unspecified" } murjune-kotlin-serialization = { id = "com.murjune.practice.kotlinx_serialization", version = "unspecified" } -murjune-kotlin-module = {id = "com.murjune.practice.kotlin.module", version = "unspecified"} +murjune-kotlin-module = { id = "com.murjune.practice.kotlin.module", version = "unspecified" } +# Plugins defined by Android +murjune-application = { id = "com.murjune.practice.application", version = "unspecified" } +murjune-android-library = { id = "com.murjune.practice.library", version = "unspecified" } +murjune-feature = { id = "com.murjune.practice.feature", version = "unspecified" } +murjune-hilt = { id = "com.murjune.practice.hilt", version = "unspecified" } +murjune-android-test = { id = "com.murjune.practice.android.test", version = "unspecified" } +murjune-unit-test = { id = "com.murjune.practice.unit.test", version = "unspecified" } +murjune-compose = { id = "com.murjune.practice.compose", version = "unspecified" } [bundles] -junit5 = ["junit5", "junit5-engine", "junit5-params", "junit5-vintage"] +unit-test = ["junit5", "kotest-junit5-runner", "assertj", "mockk", "mockk-webserver", "kotlin-coroutines-test"] +lifecycle = ["lifecycle", "lifecycle-viewmodel"] +compose = ["ui", "ui-graphics", "ui-tooling", "ui-tooling-preview", "material3-compose", "coil-compose", "ui-foundation", "activity-compose", "lifecycle-compose"] +retrofit = ["retrofit"] +androidx-android-test = ["androidx-test-core", "androidx-test-espresso", "androidx-test-junit", "androidx-test-junit-ktx", "androidx-test-rules", "androidx-test-runner"] \ No newline at end of file diff --git a/kotlin-practice/src/main/kotlin/com/murjune/practice/DebuggingEx.kt b/kotlin-practice/src/main/kotlin/com/murjune/practice/DebuggingEx.kt deleted file mode 100644 index 00e6306..0000000 --- a/kotlin-practice/src/main/kotlin/com/murjune/practice/DebuggingEx.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.murjune.practice - - -fun main() { - val a = ArrayDeque(listOf(1, 2, 3, 4, 5)) - while (a.isNotEmpty()) { - val num = a.removeFirst() - println(num) - } - val a2 = fun(a: Int): Int = 1 -} diff --git a/local.properties b/local.properties new file mode 100644 index 0000000..a1be78b --- /dev/null +++ b/local.properties @@ -0,0 +1,8 @@ +## This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +#Wed Sep 04 12:35:11 KST 2024 +sdk.dir=/Users/junw/Library/Android/sdk diff --git a/settings.gradle.kts b/settings.gradle.kts index 15c74d7..998380d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -22,3 +22,4 @@ rootProject.name = "kotlin-study-murjune" include("kotlin-practice") include("design-pattern") include("coroutine") +include(":robolectric")