Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Advice to display Version Catalog aliases #837

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.autonomousapps.jvm

import com.autonomousapps.jvm.projects.GradleVersionCatalogProject

import static com.autonomousapps.utils.Runner.build
import static com.google.common.truth.Truth.assertThat

class GradleVersionCatalogSpec extends AbstractJvmSpec {

def "can write advice with catalog aliases"() {
given:
def project = new GradleVersionCatalogProject()
gradleProject = project.gradleProject

when:
build(gradleVersion, gradleProject.rootDir, 'buildHealth')

then:
assertThat(false)

where:
gradleVersion << gradleVersions()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.autonomousapps.jvm.projects

import com.autonomousapps.AbstractProject
import com.autonomousapps.kit.Source
import com.autonomousapps.kit.Dependency
import com.autonomousapps.kit.GradleProject
import com.autonomousapps.kit.SourceType
import com.autonomousapps.model.Advice
import com.autonomousapps.model.Coordinates
import com.autonomousapps.model.ProjectAdvice

import static com.autonomousapps.AdviceHelper.actualProjectAdvice
import static com.autonomousapps.AdviceHelper.moduleCoordinates
import static com.autonomousapps.AdviceHelper.projectAdviceForDependencies

class GradleVersionCatalogProject extends AbstractProject {

final GradleProject gradleProject

GradleVersionCatalogProject() {
this.gradleProject = build()
}

private GradleProject build() {
def builder = newGradleProjectBuilder()
builder.withRootProject { rootProject ->
rootProject.withBuildScript { buildScript ->
buildScript.dependencies = [
new Dependency('implementation', 'libs.logback.classic'),
new Dependency('implementation', 'libs.kotlin.logging')
]
}
rootProject.sources = [
new Source(
SourceType.KOTLIN,
'Library',
'com/example',
"""\
import mu.KotlinLogging
private val logger = KotlinLogging.logger {}

fun main(args: Array<String>) {
logger.debug { "Args: \${args}" }
}
""".stripIndent()
)
]
}

def project = builder.build()
project.writer().write()
return project
}

Set<ProjectAdvice> actualBuildHealth() {
return actualProjectAdvice(gradleProject)
}

final Set<ProjectAdvice> expectedBuildHealth() {
return projectAdviceForDependencies(
':the-project',
[
Advice.ofChange(moduleCoordinates('ch.qos.logback:logback-classic:1.2.6'), 'implementation', 'runtimeOnly')
] as Set<Advice>
)
}
}
17 changes: 17 additions & 0 deletions src/main/kotlin/com/autonomousapps/subplugin/ProjectPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import com.autonomousapps.services.InMemoryCache
import com.autonomousapps.tasks.*
import org.gradle.api.Project
import org.gradle.api.UnknownTaskException
import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.api.file.RegularFile
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.SourceSet
Expand Down Expand Up @@ -90,6 +91,8 @@ internal class ProjectPlugin(private val project: Project) {
inMemoryCacheProvider = InMemoryCache.register(this)
createSubExtension()

mapVersionCatalogAliases()

// Conditionally disable analysis on some projects
val projectPathRegex = projectPathRegex()
if (!projectPathRegex.matches(path)) {
Expand Down Expand Up @@ -122,6 +125,20 @@ internal class ProjectPlugin(private val project: Project) {
}
}

/** Sets dependency mapping from version catalog alias **/
private fun mapVersionCatalogAliases() {
val map = project.getExtension().dependenciesHandler.map
project.extensions.findByType<VersionCatalogsExtension>()?.forEach { catalog ->
catalog.libraryAliases.forEach { alias ->
catalog.findLibrary(alias).ifPresent{ externalDependency ->
if (externalDependency.isPresent && !map.getting(externalDependency.get().toString()).isPresent) {
map.put(externalDependency.get().toString(), "${catalog.name}.${alias}")
}
}
}
}
}

private fun Project.createSubExtension() {
if (this != rootProject) {
// TODO this doesn't really work. Was trying to make plugin compatible with convention plugin approach
Expand Down