Scripts/lom/src/main/kotlin/io/gitlab/jfronny/scripts/GradleExt.kt

49 lines
2.7 KiB
Kotlin

package io.gitlab.jfronny.scripts
import org.gradle.api.Action
import org.gradle.api.DefaultTask
import org.gradle.api.PolymorphicDomainObjectContainer
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.artifacts.Dependency
import org.gradle.api.artifacts.dsl.DependencyHandler
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.tasks.SourceSetContainer
import org.gradle.api.tasks.TaskContainer
import org.gradle.api.tasks.bundling.Jar
import org.gradle.kotlin.dsl.named
import org.gradle.language.jvm.tasks.ProcessResources
import kotlin.reflect.KClass
import kotlin.reflect.KProperty
val Project.java: JavaPluginExtension get() = extensions.getByName("java") as JavaPluginExtension
fun Project.java(configure: Action<JavaPluginExtension>) = extensions.configure("java", configure)
val Project.publishing: PublishingExtension get() = extensions.getByName("publishing") as PublishingExtension
fun Project.publishing(configure: Action<PublishingExtension>) = extensions.configure("publishing", configure)
val Project.sourceSets: SourceSetContainer get() = extensions.getByName("sourceSets") as SourceSetContainer
fun Project.sourceSets(configure: Action<SourceSetContainer>) = extensions.configure("sourceSets", configure)
val TaskContainer.assemble: DefaultTask get() = named<DefaultTask>("assemble").get()
val TaskContainer.build: DefaultTask get() = named<DefaultTask>("build").get()
val TaskContainer.jar: Jar get() = named<Jar>("jar").get()
val TaskContainer.sourcesJar: Jar get() = named<Jar>("sourcesJar").get()
val TaskContainer.publish: Task get() = named("publish").get()
fun TaskContainer.processResources(configure: ProcessResources.() -> Unit) = named<ProcessResources>("processResources").configure(configure)
fun <T : Any, C : PolymorphicDomainObjectContainer<T>, U : T> C.registering(type: KClass<U>, action: U.() -> Unit): PDelegate<T, C, U> = PDelegate(this, type.java, action)
class PDelegate<T : Any, C : PolymorphicDomainObjectContainer<T>, U : T>(private val container: C, private val type: Class<U>, private val action: U.() -> Unit) {
operator fun provideDelegate(thisRef: Any?, property: KProperty<*>): SDelegate<U> = SDelegate(container.register(property.name, type, action).get())
}
class SDelegate<T>(private val delegate: T) {
operator fun getValue(thisRef: Any?, property: KProperty<*>): T = delegate
}
fun Project.prop(name: String, default: String? = null): String =
if (default == null || hasProperty(name)) property(name).toString()
else default
fun DependencyHandler.devProject(path: String): Dependency = project(mapOf("path" to path, "configuration" to "dev"))