Skip to content

Commit f27f1a2

Browse files
authored
Cleanup + version catalog plugin api draft (#124)
* version catalog plugins * cleanup
1 parent 5dba0e3 commit f27f1a2

File tree

6 files changed

+96
-61
lines changed

6 files changed

+96
-61
lines changed

application/build.gradle.kts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ buildscript {
44
minSdk = 21,
55
targetSdk = 31,
66
compileSdk = 31,
7-
kotlinVersion = embeddedKotlinVersion,
87
agpVersion = "7.4.2",
98
dataBinding = true,
109
extraPlugins = listOf(
1110
"androidx.navigation:navigation-safe-args-gradle-plugin:2.5.3",
1211
"com.google.firebase:firebase-crashlytics-gradle:2.9.4",
13-
"tools.forma.demo:dependencies",
12+
libs.plugins.tools.forma.demo.dependencies.get().pluginId,
1413
)
1514
)
1615
}

application/settings.gradle.kts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,26 @@ dependencyResolutionManagement {
2424
create("libs") {
2525
addLibrary("com.jakewharton.timber:timber:4.7.1")
2626
addBundle("coil", "io.coil-kt:coil:$coilVersion", "io.coil-kt:coil-base:$coilVersion")
27+
addPlugin( "tools.forma.demo:dependencies:0.0.1")
2728
}
2829
}
2930
}
3031

32+
fun VersionCatalogBuilder.addPlugin(
33+
groupArtifactVersion: String,
34+
vararg dependencies: String,
35+
nameGenerator: (String) -> String = ::defaultNameGenerator
36+
) {
37+
val (group, artifact, version) = groupArtifactVersion.split(":")
38+
plugin(nameGenerator(groupArtifactVersion), "$group:$artifact").version { strictly(version) }
39+
}
40+
3141
fun VersionCatalogBuilder.addBundle(
3242
name: String,
3343
vararg groupArtifactVersion: String,
3444
nameGenerator: (String) -> String = ::defaultNameGenerator
35-
): String {
45+
) {
3646
bundle(name, groupArtifactVersion.map { addLibrary(it, nameGenerator) })
37-
return name
3847
}
3948

4049
fun VersionCatalogBuilder.addLibrary(
@@ -50,6 +59,7 @@ fun VersionCatalogBuilder.addLibrary(
5059
fun defaultNameGenerator(groupArtifactVersion: String) =
5160
groupArtifactVersion
5261
.split(":")
62+
.verifyVersion()
5363
.dropLast(1)
5464
.fold(emptyList<String>()) { acc, s -> acc + s.split(".", "-") }
5565
.filter { it !in filteredTokens }
@@ -60,3 +70,9 @@ fun defaultNameGenerator(groupArtifactVersion: String) =
6070
// refer to this issue https://github.com/gradle/gradle/issues/18536
6171
// tools.forma.dependencies are applied in buildscript {} block
6272
includeBuild("../build-dependencies")
73+
74+
fun List<String>.verifyVersion(): List<String> {
75+
// Very naive check if last string contains version
76+
if (!last().last().isDigit()) throw IllegalArgumentException("Version is not specified")
77+
return this
78+
}

build-dependencies/dependencies/src/main/kotlin/Tools.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,23 @@
22

33
import tools.forma.config.FormaConfigurationStore
44

5+
val configuration = FormaConfigurationStore.configuration
6+
57
object dataBinding {
68
val viewBinding = transitiveDeps(
7-
"androidx.databinding:viewbinding:${FormaConfigurationStore.configuration.agpVersion}"
9+
"androidx.databinding:viewbinding:${configuration.agpVersion}"
810
)
911

1012
val runtime = transitiveDeps(
11-
"androidx.databinding:databinding-runtime:${FormaConfigurationStore.configuration.agpVersion}"
13+
"androidx.databinding:databinding-runtime:${configuration.agpVersion}"
1214
)
1315

1416
val common = transitiveDeps(
15-
"androidx.databinding:databinding-common:${FormaConfigurationStore.configuration.agpVersion}"
17+
"androidx.databinding:databinding-common:${configuration.agpVersion}"
1618
)
1719

1820
val adapters = transitiveDeps(
19-
"androidx.databinding:databinding-adapters:${FormaConfigurationStore.configuration.agpVersion}"
21+
"androidx.databinding:databinding-adapters:${configuration.agpVersion}"
2022
)
2123
}
2224

plugins/android/build.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
@file:Suppress("UnstableApiUsage")
2+
3+
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
4+
15
plugins {
26
id("org.gradle.kotlin.kotlin-dsl")
37
id("com.gradle.plugin-publish")
@@ -6,6 +10,12 @@ plugins {
610
group = "tools.forma"
711
version = "0.0.1"
812

13+
tasks.named("compileKotlin", KotlinCompilationTask::class.java) {
14+
compilerOptions {
15+
freeCompilerArgs.add("-Xcontext-receivers")
16+
}
17+
}
18+
919
dependencies {
1020
implementation("com.android.tools.build:gradle:7.4.2")
1121
implementation(embeddedKotlin("gradle-plugin"))
Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
@file:Suppress("ObjectPropertyName")
2-
31
import org.gradle.api.JavaVersion
42
import org.gradle.api.Project
53
import org.gradle.api.artifacts.dsl.RepositoryHandler
64
import org.gradle.api.tasks.Delete
75
import org.gradle.kotlin.dsl.ScriptHandlerScope
6+
import org.gradle.kotlin.dsl.embeddedKotlinVersion
87
import org.gradle.kotlin.dsl.repositories
8+
import tools.forma.android.utils.register
9+
import tools.forma.config.ConfigurationStore
910
import tools.forma.config.FormaConfiguration
1011
import tools.forma.config.FormaConfigurationStore
11-
import tools.forma.android.utils.register
1212

1313
// TODO: add docs for every fun param
1414
/**
@@ -22,45 +22,49 @@ import tools.forma.android.utils.register
2222
* @param mandatoryOwners is a flag that enables mandatory owners for all modules
2323
* @param extraPlugins is a list of extra plugins that will be applied to project
2424
*/
25+
2526
fun ScriptHandlerScope.androidProjectConfiguration(
2627
project: Project,
2728
minSdk: Int,
2829
targetSdk: Int,
2930
compileSdk: Int,
30-
kotlinVersion: String,
31+
kotlinVersion: String = embeddedKotlinVersion,
3132
agpVersion: String,
3233
repositories: RepositoryHandler.() -> Unit = {},
3334
dataBinding: Boolean = false,
35+
compose: Boolean = false,
3436
javaVersionCompatibility: JavaVersion = JavaVersion.VERSION_1_8, // Java/Kotlin configuration
3537
mandatoryOwners: Boolean = false,
36-
extraPlugins: List<Any>
38+
vectorDrawablesUseSupportLibrary: Boolean = false,
39+
extraPlugins: List<String> = emptyList()
3740
) {
38-
Forma.buildScriptConfiguration(this, extraPlugins)
39-
with(project) {
41+
buildScriptConfiguration(this, extraPlugins)
4042

41-
/**
42-
* Default Android project clean task implementation
43-
*/
43+
/**
44+
* Default Android project clean task implementation
45+
*/
46+
with(project) {
4447
tasks.register("clean", Delete::class) {
4548
delete(project.buildDir)
4649
}
50+
}
4751

48-
val configuration = FormaConfiguration(
49-
minSdk = minSdk,
50-
targetSdk = targetSdk,
51-
compileSdk = compileSdk,
52-
// we don't need check properties for exist, we read it successfully in forma configuration
53-
kotlinVersion = kotlinVersion,
54-
agpVersion = agpVersion,
55-
repositories = repositories,
56-
dataBinding = dataBinding,
57-
javaVersionCompatibility = javaVersionCompatibility,
58-
mandatoryOwners = mandatoryOwners
59-
)
60-
61-
Forma.store(configuration)
52+
val configuration = FormaConfiguration(
53+
minSdk = minSdk,
54+
targetSdk = targetSdk,
55+
compileSdk = compileSdk,
56+
// we don't need check properties for exist, we read it successfully in forma configuration
57+
kotlinVersion = kotlinVersion,
58+
agpVersion = agpVersion,
59+
repositories = repositories,
60+
dataBinding = dataBinding,
61+
javaVersionCompatibility = javaVersionCompatibility,
62+
mandatoryOwners = mandatoryOwners,
63+
compose = compose,
64+
vectorDrawablesUseSupportLibrary = vectorDrawablesUseSupportLibrary
65+
)
6266

63-
}
67+
Forma.store(configuration)
6468
}
6569

6670
@Deprecated("Old approach to configuration, use ScriptHandlerScope Extension")
@@ -76,6 +80,8 @@ fun Project.androidProjectConfiguration(
7680
generateMissedManifests: Boolean = false,
7781
javaVersionCompatibility: JavaVersion = JavaVersion.VERSION_1_8, // Java/Kotlin configuration
7882
mandatoryOwners: Boolean = false,
83+
compose: Boolean = false,
84+
vectorDrawablesUseSupportLibrary: Boolean = true,
7985
) {
8086

8187
/**
@@ -95,29 +101,27 @@ fun Project.androidProjectConfiguration(
95101
repositories = repositories,
96102
dataBinding = dataBinding,
97103
javaVersionCompatibility = javaVersionCompatibility,
98-
mandatoryOwners = mandatoryOwners
104+
mandatoryOwners = mandatoryOwners,
105+
compose = compose,
106+
vectorDrawablesUseSupportLibrary = vectorDrawablesUseSupportLibrary
99107
)
100108

101109
Forma.store(configuration)
102110
}
103111

112+
val buildScriptConfiguration: ScriptHandlerScope.(List<Any>) -> Unit = { classpathDeps ->
113+
// TODO pass repositories configuration
114+
repositories {
115+
google()
116+
mavenCentral()
117+
}
118+
dependencies {
119+
classpathDeps.forEach { classpath(it) }
120+
}
121+
}
122+
104123
/**
105124
* Singleton project configuration store
125+
* TODO remove
106126
*/
107-
object Forma {
108-
109-
val configuration: FormaConfiguration get() = FormaConfigurationStore.configuration
110-
111-
fun store(configuration: FormaConfiguration) = FormaConfigurationStore.store(configuration)
112-
113-
val buildScriptConfiguration: ScriptHandlerScope.(List<Any>) -> Unit = { classpathDeps ->
114-
// TODO pass repositories configuration
115-
repositories {
116-
google()
117-
mavenCentral()
118-
}
119-
dependencies {
120-
classpathDeps.forEach { classpath(it) }
121-
}
122-
}
123-
}
127+
object Forma: ConfigurationStore<FormaConfiguration> by FormaConfigurationStore

plugins/config/src/main/java/tools/forma/config/FormaConfiguration.kt

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,27 @@ data class FormaConfiguration(
2626
val kotlinVersion: String,
2727
val agpVersion: String,
2828
val repositories: RepositoryHandler.() -> Unit,
29-
// Databinding is Application level feature, android_binary will be infering dataBinding flag, developers does not need to know about
30-
val dataBinding: Boolean = false,
31-
val compose: Boolean = false,
32-
val vectorDrawablesUseSupportLibrary: Boolean = true,
33-
val javaVersionCompatibility: JavaVersion = JavaVersion.VERSION_1_8, // Java/Kotlin configuration
29+
// Databinding is Application level feature, android_binary will be inferring dataBinding flag, developers does not need to know about
30+
val dataBinding: Boolean,
31+
val compose: Boolean,
32+
val vectorDrawablesUseSupportLibrary: Boolean,
33+
val javaVersionCompatibility: JavaVersion, // Java/Kotlin configuration
3434
val mandatoryOwners: Boolean
3535
)
3636

3737
/**
38-
* Singleton project configuration store
38+
* Singleton project configuration store, used by internal plugins
3939
*/
40-
object FormaConfigurationStore {
41-
40+
object FormaConfigurationStore : ConfigurationStore<FormaConfiguration> {
4241
private lateinit var _configuration: FormaConfiguration
43-
val configuration: FormaConfiguration get() = _configuration
42+
override val configuration: FormaConfiguration get() = _configuration
4443

45-
fun store(configuration: FormaConfiguration) {
44+
override fun store(configuration: FormaConfiguration) {
4645
_configuration = configuration
4746
}
4847
}
48+
49+
interface ConfigurationStore<T : Any> {
50+
val configuration: T
51+
fun store(configuration: T)
52+
}

0 commit comments

Comments
 (0)