Skip to content

Commit

Permalink
optimizing configuring project (#181)
Browse files Browse the repository at this point in the history
  • Loading branch information
jaredsburrows committed Apr 11, 2022
1 parent 8fd380d commit 6ae74a2
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 99 deletions.
49 changes: 49 additions & 0 deletions src/main/kotlin/com/jaredsburrows/license/BaseLicenseReportTask.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.jaredsburrows.license

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.OutputFile
import java.io.File

/** A [org.gradle.api.Task] that is common for both Java and Android projects. */
open class BaseLicenseReportTask : DefaultTask() {

// Task annotations cannot be internal
@OutputFile var csvFile: File
@OutputFile var htmlFile: File
@OutputFile var jsonFile: File
@Input var generateCsvReport = false
@Input var generateHtmlReport = false
@Input var generateJsonReport = false
@Input var copyCsvReportToAssets = false
@Input var copyHtmlReportToAssets = false
@Input var copyJsonReportToAssets = false
private var outputPath: String

init {
// From DefaultTask
description = "Outputs licenses report for $name."
group = "Reporting"

// Customizing internal task options
outputPath = "${project.buildDir}/reports/licenses/".replace('/', File.separatorChar)
csvFile = File(outputPath, "$name$CSV_EXT")
htmlFile = File(outputPath, "$name$HTML_EXT")
jsonFile = File(outputPath, "$name$JSON_EXT")

// Customizing internal task options from extension
val extension = project.extensions.getByType(LicenseReportExtension::class.java)
generateCsvReport = extension.generateCsvReport
generateHtmlReport = extension.generateHtmlReport
generateJsonReport = extension.generateJsonReport
copyCsvReportToAssets = extension.copyCsvReportToAssets
copyHtmlReportToAssets = extension.copyHtmlReportToAssets
copyJsonReportToAssets = extension.copyJsonReportToAssets
}

internal companion object {
const val CSV_EXT = ".csv"
const val HTML_EXT = ".html"
const val JSON_EXT = ".json"
}
}
107 changes: 32 additions & 75 deletions src/main/kotlin/com/jaredsburrows/license/LicensePlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,106 +11,63 @@ 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.ExtensionContainer
import org.gradle.api.plugins.JavaPlugin
import java.io.File
import java.util.Locale
import kotlin.reflect.KClass

/** A [Plugin] which grabs the POM.xml files from maven dependencies. */
class LicensePlugin : Plugin<Project> {
override fun apply(project: Project) {
val extension = project.extensions.create("licenseReport", LicenseReportExtension::class.java)
project.extensions.add("licenseReport", LicenseReportExtension::class.java)

project.plugins.all {
when (it) {
is JavaPlugin -> configureJavaProject(project, extension)
is JavaPlugin -> project.configureJavaProject()
is FeaturePlugin -> {
project.extensions[FeatureExtension::class].run {
configureAndroidProject(project, extension, featureVariants)
configureAndroidProject(project, extension, libraryVariants)
project.extensions.getByType(FeatureExtension::class.java).run {
project.configureAndroidProject(featureVariants)
project.configureAndroidProject(libraryVariants)
}
}
is LibraryPlugin -> {
project.extensions[LibraryExtension::class].run {
configureAndroidProject(project, extension, libraryVariants)
project.extensions.getByType(LibraryExtension::class.java).run {
project.configureAndroidProject(libraryVariants)
}
}
is AppPlugin -> {
project.extensions[AppExtension::class].run {
configureAndroidProject(project, extension, applicationVariants)
project.extensions.getByType(AppExtension::class.java).run {
project.configureAndroidProject(applicationVariants)
}
}
}
}
}
}

/** Configure for Java projects. */
private fun configureJavaProject(project: Project, extension: LicenseReportExtension) {
val taskName = "licenseReport"
val path = "${project.buildDir}/reports/licenses/$taskName".replace('/', File.separatorChar)

// Create tasks
project.tasks.register(taskName, LicenseReportTask::class.java) {
it.description = "Outputs licenses report."
it.group = "Reporting"
it.csvFile = File(path + LicenseReportTask.CSV_EXT)
it.htmlFile = File(path + LicenseReportTask.HTML_EXT)
it.jsonFile = File(path + LicenseReportTask.JSON_EXT)
it.generateCsvReport = extension.generateCsvReport
it.generateHtmlReport = extension.generateHtmlReport
it.generateJsonReport = extension.generateJsonReport
it.copyCsvReportToAssets = false
it.copyHtmlReportToAssets = false
it.copyJsonReportToAssets = false
}
}

/** Configure for Android projects. */
private fun configureAndroidProject(
project: Project,
extension: LicenseReportExtension,
variants: DomainObjectSet<out BaseVariant>? = null
) {
// Configure tasks for all variants
variants?.all { variant ->
val name = variant.name.replaceFirstChar {
if (it.isLowerCase()) {
it.titlecase(Locale.getDefault())
} else {
it.toString()
}
}
val taskName = "license${name}Report"
val path = "${project.buildDir}/reports/licenses/$taskName".replace('/', File.separatorChar)
/** Configure for Java projects. */
private fun Project.configureJavaProject() {
tasks.register("licenseReport", LicenseReportTask::class.java)
}

// Create tasks based on variant
project.tasks.register(taskName, LicenseReportTask::class.java) {
it.description = "Outputs licenses report for $name variant."
it.group = "Reporting"
it.csvFile = File(path + LicenseReportTask.CSV_EXT)
it.htmlFile = File(path + LicenseReportTask.HTML_EXT)
it.jsonFile = File(path + LicenseReportTask.JSON_EXT)
it.generateCsvReport = extension.generateCsvReport
it.generateHtmlReport = extension.generateHtmlReport
it.generateJsonReport = extension.generateJsonReport
it.copyCsvReportToAssets = extension.copyCsvReportToAssets
it.copyHtmlReportToAssets = extension.copyHtmlReportToAssets
it.copyJsonReportToAssets = extension.copyJsonReportToAssets
it.assetDirs = (project.extensions.getByName("android") as BaseExtension)
.sourceSets
.getByName("main")
.assets
.srcDirs
.toList()
it.buildType = variant.buildType.name
it.variantName = variant.name
it.productFlavors = variant.productFlavors
/** Configure for Android projects. */
private fun Project.configureAndroidProject(variants: DomainObjectSet<out BaseVariant>? = null) {
// Configure tasks for all variants
variants?.all { variant ->
val name = variant.name.replaceFirstChar {
if (it.isLowerCase()) {
it.titlecase(Locale.getDefault())
} else {
it.toString()
}
}
}

private operator fun <T : Any> ExtensionContainer.get(type: KClass<T>): T {
return getByType(type.java)
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
}
}
}
29 changes: 5 additions & 24 deletions src/main/kotlin/com/jaredsburrows/license/LicenseReportTask.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.jaredsburrows.license

import com.android.builder.model.ProductFlavor
import com.jaredsburrows.license.internal.ConsoleRenderer
import com.jaredsburrows.license.internal.pom.Developer
import com.jaredsburrows.license.internal.pom.License
Expand All @@ -12,48 +11,33 @@ import groovy.namespace.QName
import groovy.util.Node
import groovy.util.NodeList
import groovy.xml.XmlParser
import org.gradle.api.DefaultTask
import org.gradle.api.Task
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ResolvedArtifact
import org.gradle.api.artifacts.ResolvedDependency
import org.gradle.api.logging.LogLevel
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import java.io.File
import java.net.URI
import java.net.URL
import java.util.Locale
import java.util.UUID

/** A [Task] that creates HTML and JSON reports of the current projects dependencies. */
internal open class LicenseReportTask : DefaultTask() { // tasks can't be final
/** A [org.gradle.api.Task] that creates HTML and JSON reports of the current projects dependencies. */
internal open class LicenseReportTask : BaseLicenseReportTask() { // tasks can't be final

@Internal var projects = mutableListOf<Project>()
@Input var assetDirs = emptyList<File>()
@Input var generateCsvReport = false
@Input var generateHtmlReport = false
@Input var generateJsonReport = false
@Input var copyCsvReportToAssets = false
@Input var copyHtmlReportToAssets = false
@Input var copyJsonReportToAssets = false

@Optional @Input
var buildType: String? = null

@Optional @Input
var variantName: String? = null
@Internal var productFlavors = listOf<ProductFlavor>()
@OutputFile lateinit var csvFile: File
@OutputFile lateinit var htmlFile: File
@OutputFile lateinit var jsonFile: File
private var pomConfiguration = "poms"
private var tempPomConfiguration = "tempPoms"

@TaskAction fun licenseReport() {
@TaskAction
fun licenseReport() {
setupEnvironment()
initDependencies()
generatePOMInfo()
Expand Down Expand Up @@ -113,7 +97,7 @@ internal open class LicenseReportTask : DefaultTask() { // tasks can't be final
}
}

// Iterate through all the configurations's dependencies
// Iterate through all the configuration's dependencies
configurationSet.forEach { configuration ->
if (configuration.isCanBeResolved) {
val allDeps = configuration.resolvedConfiguration.lenientConfiguration.allModuleDependencies
Expand Down Expand Up @@ -507,8 +491,5 @@ internal open class LicenseReportTask : DefaultTask() { // tasks can't be final
private const val APACHE_LICENSE_NAME = "The Apache Software License"
private const val APACHE_LICENSE_URL = "http://www.apache.org/licenses/LICENSE-2.0.txt"
private const val OPEN_SOURCE_LICENSES = "open_source_licenses"
const val CSV_EXT = ".csv"
const val HTML_EXT = ".html"
const val JSON_EXT = ".json"
}
}

0 comments on commit 6ae74a2

Please sign in to comment.