diff --git a/README.md b/README.md index 354ff9a0..b5d9c002 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Also, for Android projects the license HTML file will be copied to `/sr buildscript { repositories { mavenCentral() - google() + google() // For Android projects } dependencies { @@ -37,7 +37,7 @@ Release versions are available in the [Sonatype's release repository](https://re buildscript { repositories { maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } - google() + google() // For Android projects } dependencies { diff --git a/build.gradle b/build.gradle index 087f9c66..b638bb93 100644 --- a/build.gradle +++ b/build.gradle @@ -47,20 +47,23 @@ task createClasspathManifest() { outputDir.mkdirs() // Combine both main and test plugin classpaths file("$outputDir/plugin-classpath.txt").text = sourceSets.main.runtimeClasspath.join('\n') + - '\n' + - sourceSets.test.runtimeClasspath.join('\n') + '\n' + sourceSets.test.runtimeClasspath.join('\n') } } dependencies { + compileOnly gradleApi() + compileOnly deps.android.tools.build.gradle + implementation deps.kotlin.stdlib.jdk implementation deps.kotlinx.html implementation deps.gson - implementation deps.android.tools.build.gradle testRuntimeOnly files(createClasspathManifest) + testRuntimeOnly deps.android.tools.build.gradle testImplementation localGroovy() + testImplementation gradleTestKit() testImplementation deps.spock, { exclude module: 'groovy-all' } // Use localGroovy() testImplementation deps.xmlunit.matchers testImplementation deps.commons.csv diff --git a/src/main/kotlin/com/jaredsburrows/license/LicensePlugin.kt b/src/main/kotlin/com/jaredsburrows/license/LicensePlugin.kt index 16aa5e1d..2754ebb3 100644 --- a/src/main/kotlin/com/jaredsburrows/license/LicensePlugin.kt +++ b/src/main/kotlin/com/jaredsburrows/license/LicensePlugin.kt @@ -1,73 +1,19 @@ package com.jaredsburrows.license -import com.android.build.gradle.AppExtension -import com.android.build.gradle.AppPlugin -import com.android.build.gradle.BaseExtension -import com.android.build.gradle.FeatureExtension -import com.android.build.gradle.FeaturePlugin -import com.android.build.gradle.LibraryExtension -import com.android.build.gradle.LibraryPlugin -import com.android.build.gradle.api.BaseVariant -import org.gradle.api.DomainObjectSet import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.plugins.JavaPlugin -import java.util.Locale /** A [Plugin] which grabs the POM.xml files from maven dependencies. */ class LicensePlugin : Plugin { override fun apply(project: Project) { project.extensions.add("licenseReport", LicenseReportExtension::class.java) - project.plugins.all { - when (it) { - is JavaPlugin -> project.configureJavaProject() - is FeaturePlugin -> { - project.extensions.getByType(FeatureExtension::class.java).run { - project.configureAndroidProject(featureVariants) - project.configureAndroidProject(libraryVariants) - } - } - is LibraryPlugin -> { - project.extensions.getByType(LibraryExtension::class.java).run { - project.configureAndroidProject(libraryVariants) - } - } - is AppPlugin -> { - project.extensions.getByType(AppExtension::class.java).run { - project.configureAndroidProject(applicationVariants) - } - } + project.afterEvaluate { + when { + project.isAndroidProject() -> project.configureAndroidProject() + project.isJavaProject() -> project.configureJavaProject() + else -> throw UnsupportedOperationException("'com.jaredsburrows.license' requires Java or Android Gradle Plugins.") } } } } - -/** Configure for Java projects. */ -private fun Project.configureJavaProject() { - tasks.register("licenseReport", LicenseReportTask::class.java) -} - -/** Configure for Android projects. */ -private fun Project.configureAndroidProject(variants: DomainObjectSet? = null) { - // Configure tasks for all variants - variants?.all { variant -> - val name = variant.name.replaceFirstChar { - if (it.isLowerCase()) { - it.titlecase(Locale.getDefault()) - } else { - it.toString() - } - } - - tasks.register("license${name}Report", LicenseReportTask::class.java) { - it.assetDirs = (extensions.getByName("android") as BaseExtension) - .sourceSets - .getByName("main") - .assets - .srcDirs - .toList() - it.variantName = variant.name - } - } -} diff --git a/src/main/kotlin/com/jaredsburrows/license/projectAndroid.kt b/src/main/kotlin/com/jaredsburrows/license/projectAndroid.kt new file mode 100644 index 00000000..2b83e756 --- /dev/null +++ b/src/main/kotlin/com/jaredsburrows/license/projectAndroid.kt @@ -0,0 +1,71 @@ +package com.jaredsburrows.license + +import com.android.build.gradle.AppExtension +import com.android.build.gradle.AppPlugin +import com.android.build.gradle.BaseExtension +import com.android.build.gradle.FeatureExtension +import com.android.build.gradle.FeaturePlugin +import com.android.build.gradle.LibraryExtension +import com.android.build.gradle.LibraryPlugin +import com.android.build.gradle.api.BaseVariant +import org.gradle.api.DomainObjectSet +import org.gradle.api.Project +import java.util.Locale + +/** Returns true if Android Gradle project */ +internal fun Project.isAndroidProject(): Boolean { + return project.plugins.hasPlugin("android") +} + +/** + * Configure for Android projects. + * + * AppPlugin - "android", "com.android.application" + * FeaturePlugin - "com.android.feature" + * LibraryPlugin - "android-library", "com.android.library" + */ +internal fun Project.configureAndroidProject() { + project.plugins.all { + when (it) { + is AppPlugin -> { + project.extensions.getByType(AppExtension::class.java).run { + configureVariant(applicationVariants) + } + } + is FeaturePlugin -> { + project.extensions.getByType(FeatureExtension::class.java).run { + configureVariant(featureVariants) + configureVariant(libraryVariants) + } + } + is LibraryPlugin -> { + project.extensions.getByType(LibraryExtension::class.java).run { + configureVariant(libraryVariants) + } + } + } + } +} + +private fun Project.configureVariant(variants: DomainObjectSet? = null) { + // Configure tasks for all variants + variants?.all { variant -> + val name = variant.name.replaceFirstChar { + if (it.isLowerCase()) { + it.titlecase(Locale.getDefault()) + } else { + it.toString() + } + } + + tasks.register("license${name}Report", LicenseReportTask::class.java) { + it.assetDirs = (extensions.getByName("android") as BaseExtension) + .sourceSets + .getByName("main") + .assets + .srcDirs + .toList() + it.variantName = variant.name + } + } +} diff --git a/src/main/kotlin/com/jaredsburrows/license/projectJava.kt b/src/main/kotlin/com/jaredsburrows/license/projectJava.kt new file mode 100644 index 00000000..10f0d7a7 --- /dev/null +++ b/src/main/kotlin/com/jaredsburrows/license/projectJava.kt @@ -0,0 +1,18 @@ +package com.jaredsburrows.license + +import org.gradle.api.Project + +/** Returns true if Java Gradle project */ +internal fun Project.isJavaProject(): Boolean { + return project.plugins.hasPlugin("java") +} + +/** + * Configure for Java projects. + * + * JavaPlugin - "java" - also applies JavaBasePlugin + * JavaLibraryPlugin - "java-library" - also applies JavaPlugin + */ +internal fun Project.configureJavaProject() { + tasks.register("licenseReport", LicenseReportTask::class.java) +}