From cfe5272b3d3fcdb64bdcec741819fb86f2025fd6 Mon Sep 17 00:00:00 2001 From: vladimir-shperling Date: Tue, 9 Jan 2024 14:10:16 +0700 Subject: [PATCH] Initial commit --- .gitignore | 2 + .../executionHistory/executionHistory.bin | Bin 0 -> 164560 bytes build.gradle.kts | 8 + src/main/java/Dependencies.kt | 201 ++++++++++++++++++ src/main/java/DependencyHandlerExtensions.kt | 41 ++++ src/main/java/Plugin.kt | 47 ++++ src/main/java/Version.kt | 42 ++++ 7 files changed, 341 insertions(+) create mode 100644 .gitignore create mode 100644 .gradle/8.2.1/executionHistory/executionHistory.bin create mode 100644 build.gradle.kts create mode 100644 src/main/java/Dependencies.kt create mode 100644 src/main/java/DependencyHandlerExtensions.kt create mode 100644 src/main/java/Plugin.kt create mode 100644 src/main/java/Version.kt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6fbe8a4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.gradle +/build \ No newline at end of file diff --git a/.gradle/8.2.1/executionHistory/executionHistory.bin b/.gradle/8.2.1/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..c10c85abb236313f61bd5ab960276f3518828a2b GIT binary patch literal 164560 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

UiX8{_Cdy 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 literal 0 HcmV?d00001 diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..4866817 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + `kotlin-dsl` +} + +repositories { + google() + mavenCentral() +} \ No newline at end of file diff --git a/src/main/java/Dependencies.kt b/src/main/java/Dependencies.kt new file mode 100644 index 0000000..fde0e53 --- /dev/null +++ b/src/main/java/Dependencies.kt @@ -0,0 +1,201 @@ +data class Dependency( + val name: String, + val version: String, +) { + val fullPath get() = "$name:$version" +} + +object Dependencies { + + /** + * Type-safe HTTP client for Android and Java by Square, Inc. + * + * [Documentation](http://square.github.io/retrofit/) + * + * [Github](https://github.com/square/retrofit) + * + * [Apache License 2.0](https://github.com/square/retrofit/blob/master/LICENSE.txt) + * + * [Changelog](https://github.com/square/retrofit/blob/master/CHANGELOG.md) + */ + object Retrofit { + private const val version = "2.9.0" + + val library = Dependency("com.squareup.retrofit2:retrofit", version) + val gsonConverter = Dependency("com.squareup.retrofit2:converter-gson", version) + } + + + /** + * [Documentation](https://developer.android.com/jetpack/androidx) + * + * [Releases](https://developer.android.com/jetpack/androidx/versions). + */ + object AndroidX { + /** + * [androidx.tech](https://androidx.tech/artifacts/appcompat/appcompat/) + * + * [Changelog](https://developer.android.com/jetpack/androidx/releases/appcompat) + */ + val appcompat = Dependency("androidx.appcompat:appcompat", "1.6.1") + + /** + * [androidx.tech](https://androidx.tech/artifacts/recyclerview/recyclerview/) + * + * [Changelog](https://developer.android.com/jetpack/androidx/releases/recyclerview) + */ + val recyclerView = Dependency("androidx.recyclerview:recyclerview", "1.3.2") + + /** + * [androidx.tech](https://androidx.tech/artifacts/cardview/cardview/) + * + * [Changelog](https://developer.android.com/jetpack/androidx/releases/cardview) + */ + val cardView = Dependency("androidx.cardview:cardview", "1.0.0") + + /** + * [androidx.tech](https://androidx.tech/artifacts/gridlayout/gridlayout/) + * + * [Changelog](https://developer.android.com/jetpack/androidx/releases/gridlayout) + */ + val gridLayout = Dependency("androidx.gridlayout:gridlayout", "1.0.0") + + /** + * A ConstraintLayout is a ViewGroup which allows you to position and size widgets in a flexible way. + * + * [Documentation](https://developer.android.com/reference/android/support/constraint/ConstraintLayout) + * + * [androidx.tech](https://androidx.tech/artifacts/constraintlayout/constraintlayout/) + * + * [Changelog](https://developer.android.com/jetpack/androidx/releases/constraintlayout) + */ + val constraintLayout = Dependency("androidx.constraintlayout:constraintlayout", "2.1.4") + + /** + * CoordinatorLayout is a super-powered FrameLayout. + * CoordinatorLayout is intended for two primary use cases: + * 1. As a top-level application decor or chrome layout + * 2. As a container for a specific interaction with one or more child views + * + * [Documentation](https://developer.android.com/jetpack/androidx/releases/coordinatorlayout) + * + * [androidx.tech](https://androidx.tech/artifacts/coordinatorlayout/coordinatorlayout/) + * + * [Changelog](https://developer.android.com/jetpack/androidx/releases/coordinatorlayout) + */ + val coordinatorLayout = Dependency("androidx.coordinatorlayout:coordinatorlayout", "1.2.0") + + /** + * The SwipeRefreshLayout should be used whenever the user + * can refresh the contents of a view via a vertical swipe gesture. + * + * [Documentation](https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout) + * + * [Changelog](https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout) + */ + val swipeRefreshLayout = Dependency("androidx.swiperefreshlayout:swiperefreshlayout", "1.1.0") + + /** + * [Changelog](https://developer.android.com/jetpack/androidx/releases/test/) + */ + object Testing { + + /** + * [androidx.tech](https://androidx.tech/artifacts/test/core/) + * + * [Documentation](https://developer.android.com/training/testing) + */ + val core = Dependency("androidx.test:core", "1.5.0") + + /** + * [androidx.tech](https://androidx.tech/artifacts/test.espresso/espresso-core/) + * + * [Documentation](https://developer.android.com/training/testing/espresso) + */ + object Espresso { + private const val version = "3.5.1" + val core = Dependency("androidx.test.espresso:espresso-core", version) + val intents = Dependency("androidx.test.espresso:espresso-intents", version) + val contrib = Dependency("androidx.test.espresso:espresso-contrib", version) + } + + /** + * [androidx.tech](https://androidx.tech/artifacts/test/runner/) + * + * [Documentation](https://developer.android.com/training/testing/junit-runner) + */ + val runner = Dependency("androidx.test:runner", "1.5.2") + + /** + * [androidx.tech](https://androidx.tech/artifacts/test/rules/) + * + * [Documentation](https://developer.android.com/training/testing/junit-rules) + */ + val rules = Dependency("androidx.test:rules", "1.5.0") + + /** + * [androidx.tech](https://androidx.tech/artifacts/test/orchestrator/) + * + * [Documentation](https://developer.android.com/training/testing/junit-runner#using-android-test-orchestrator) + */ + val orchestrator = Dependency("androidx.test:orchestrator", "1.4.2") + + /** + * [androidx.tech](https://androidx.tech/artifacts/test.uiautomator/uiautomator/) + * + * [Documentation](https://developer.android.com/training/testing/ui-automator) + */ + val uiAutomator = Dependency("androidx.test.uiautomator:uiautomator", "2.2.0") + } + + /** + * [Documentation](https://material.io/develop/android/) + * + * [Github](https://github.com/material-components/material-components-android) + * + * [Changelog](https://github.com/material-components/material-components-android/releases) + */ + val materialDesign = Dependency("com.google.android.material:material", "1.11.0") + + /** + * [androidx.tech](https://androidx.tech/artifacts/lifecycle/lifecycle-viewmodel/) + */ + object Lifecycle { + private const val version = "2.6.1" + + val viewModel = Dependency("androidx.lifecycle:lifecycle-viewmodel-ktx", version) + val common = Dependency("androidx.lifecycle:lifecycle-common", version) + } + } + + /** + * JUnit is a simple framework to write repeatable tests. + * + * [Documentation](https://junit.org/junit4/) + * + * [Github](https://github.com/junit-team/junit4) + * + * [Eclipse Public License 1.0](https://github.com/junit-team/junit4/blob/master/LICENSE-junit.txt) + * + * [Changelog](https://github.com/junit-team/junit4/wiki) + */ + val junit = Dependency("junit:junit", "4.13") + + /** + * Kaspresso is a framework for Android UI testing. Based on Espresso and UI Automator. + * + * [Documentation](https://kasperskylab.github.io/Kaspresso/) + * + * [Github](https://github.com/KasperskyLab/Kaspresso) + * + * [Apache License 2.0](https://github.com/KasperskyLab/Kaspresso/blob/master/LICENSE.txt) + * + * [Changelog](https://github.com/KasperskyLab/Kaspresso/releases) + */ + object Kaspresso { + private const val version = "1.5.3" + val core = Dependency("com.kaspersky.android-components:kaspresso", version) + val composeSupport = Dependency("com.kaspersky.android-components:kaspresso-compose-support", version) + } +} + diff --git a/src/main/java/DependencyHandlerExtensions.kt b/src/main/java/DependencyHandlerExtensions.kt new file mode 100644 index 0000000..a015586 --- /dev/null +++ b/src/main/java/DependencyHandlerExtensions.kt @@ -0,0 +1,41 @@ +import org.gradle.api.artifacts.dsl.DependencyHandler + +fun DependencyHandler.implementation(dependency: Dependency) { + add(Type.IMPLEMENTATION, dependency.fullPath) +} + +fun DependencyHandler.testImplementation(dependency: Dependency) { + add(Type.TEST_IMPLEMENTATION, dependency.fullPath) +} + +fun DependencyHandler.androidTestImplementation(dependency: Dependency) { + add(Type.ANDROID_TEST_IMPLEMENTATION, dependency.fullPath) +} + +fun DependencyHandler.api(dependency: Dependency) { + add(Type.API, dependency.fullPath) +} + +fun DependencyHandler.kapt(dependency: Dependency) { + add(Type.KAPT, dependency.fullPath) +} + +fun DependencyHandler.ksp(dependency: Dependency) { + add(Type.KSP, dependency.fullPath) +} + +fun DependencyHandler.defaultLibrary() { + api(Dependencies.AndroidX.appcompat) + api(Dependencies.AndroidX.materialDesign) + testImplementation(Dependencies.junit) + androidTestImplementation(Dependencies.Kaspresso.core) +} + +private object Type { + const val IMPLEMENTATION = "implementation" + const val TEST_IMPLEMENTATION = "testImplementation" + const val ANDROID_TEST_IMPLEMENTATION = "androidTestImplementation" + const val API = "api" + const val KAPT = "kapt" + const val KSP = "ksp" +} \ No newline at end of file diff --git a/src/main/java/Plugin.kt b/src/main/java/Plugin.kt new file mode 100644 index 0000000..819a9ec --- /dev/null +++ b/src/main/java/Plugin.kt @@ -0,0 +1,47 @@ +import org.gradle.plugin.use.PluginDependenciesSpec +import org.gradle.plugin.use.PluginDependencySpec + +val PluginDependenciesSpec.androidApplication: PluginDependencySpec + get() = id(Plugin.Id.Android.application) +val PluginDependenciesSpec.kotlinJvm: PluginDependencySpec + get() = id(Plugin.Id.Kotlin.jvm) +val PluginDependenciesSpec.kotlinParcelize: PluginDependencySpec + get() = id(Plugin.Id.Kotlin.parcelize) +val PluginDependenciesSpec.kotlinAnnotationProcessor: PluginDependencySpec + get() = id(Plugin.Id.Kotlin.annotationProcessor) +val PluginDependenciesSpec.kotlinSerialization: PluginDependencySpec + get() = id(Plugin.Id.Kotlin.serialization) + +object Plugin { + object Id { + object Android { + /** + * [Documentation](https://google.github.io/android-gradle-dsl/current/) + * [Changelog](https://developer.android.com/studio/releases/gradle-plugin) + */ + const val application = "com.android.application" + } + + object Kotlin { + /** + * Plugin published in https://plugins.gradle.org/ + */ + const val jvm = "org.jetbrains.kotlin.jvm" + + /** + * Plugin published in https://plugins.gradle.org/ + */ + const val parcelize = "kotlin-parcelize" + + /** + * Plugin published in https://plugins.gradle.org/ + */ + const val annotationProcessor = "kapt" + + /** + * Plugin published in https://plugins.gradle.org/ + */ + const val serialization = "plugin.serialization" + } + } +} \ No newline at end of file diff --git a/src/main/java/Version.kt b/src/main/java/Version.kt new file mode 100644 index 0000000..04cad49 --- /dev/null +++ b/src/main/java/Version.kt @@ -0,0 +1,42 @@ +import org.gradle.api.JavaVersion + +object Version { + + /** + * Gradle is an open-source build automation tool focused on flexibility and performance. + * + * [Documentation](https://docs.gradle.org/current/userguide/userguide.html) + * + * [Github](https://github.com/gradle/gradle) + * + * [Apache 2.0 License](https://github.com/gradle/gradle/blob/master/LICENSE) + * + * [Changelog](https://gradle.org/releases/) + */ + const val gradle = "8.2.1" + + object Kotlin { + + /** + * [Documentation](https://kotlinlang.org/) + * + * [Source Code](https://github.com/JetBrains/kotlin/) + * + * [Apache 2.0 License](https://github.com/JetBrains/kotlin/blob/master/license/LICENSE.txt) + * + * [Changelog](https://kotlinlang.org/releases.html) + */ + const val language = "1.9.10" + + val javaSource = JavaVersion.VERSION_1_8 + } + + object Android { + object Sdk { + const val min = 24 + const val compile = 34 + const val target = 34 + } + } + +} \ No newline at end of file