diff --git a/plugin/src/main/kotlin/com/jraska/module/graph/assertion/GradleDependencyGraphFactory.kt b/plugin/src/main/kotlin/com/jraska/module/graph/assertion/GradleDependencyGraphFactory.kt index fcaaaa2..a060b2c 100644 --- a/plugin/src/main/kotlin/com/jraska/module/graph/assertion/GradleDependencyGraphFactory.kt +++ b/plugin/src/main/kotlin/com/jraska/module/graph/assertion/GradleDependencyGraphFactory.kt @@ -7,31 +7,38 @@ import org.gradle.api.Project object GradleDependencyGraphFactory { fun create(project: Project, configurationsToLook: Set): DependencyGraph { - val dependencies = project.listAllDependencyPairs(configurationsToLook) + val modulesWithDependencies = project.listAllDependencies(configurationsToLook) + val dependencies = modulesWithDependencies.flatMap { module -> + module.second.map { module.first to it } + } - if (dependencies.isEmpty()) { - return DependencyGraph.createSingular(project.moduleDisplayName()) + val moduleDisplayName = project.moduleDisplayName() + if(dependencies.isEmpty()) { + return DependencyGraph.createSingular(moduleDisplayName) } val fullDependencyGraph = DependencyGraph.create(dependencies) - return if (project == project.rootProject) { - fullDependencyGraph - } else { - fullDependencyGraph.subTree(project.moduleDisplayName()) + if (project == project.rootProject) { + return fullDependencyGraph } + + modulesWithDependencies.find { it.first == moduleDisplayName && it.second.isNotEmpty() } + ?: return DependencyGraph.createSingular(moduleDisplayName) + + return fullDependencyGraph.subTree(moduleDisplayName) } - private fun Project.listAllDependencyPairs(configurationsToLook: Set): List> { + private fun Project.listAllDependencies(configurationsToLook: Set): List>> { return rootProject.subprojects - .flatMap { project -> - project.configurations + .map { project -> + project.moduleDisplayName() to project.configurations .filter { configurationsToLook.contains(it.name) } .flatMap { configuration -> configuration.dependencies.filterIsInstance(ProjectDependency::class.java) .map { it.dependencyProject } } - .map { project.moduleDisplayName() to it.moduleDisplayName() } + .map { it.moduleDisplayName() } } } } diff --git a/plugin/src/test/kotlin/com/jraska/module/graph/assertion/FullProjectMultipleAppliedGradleTest.kt b/plugin/src/test/kotlin/com/jraska/module/graph/assertion/FullProjectMultipleAppliedGradleTest.kt new file mode 100644 index 0000000..83cf2c0 --- /dev/null +++ b/plugin/src/test/kotlin/com/jraska/module/graph/assertion/FullProjectMultipleAppliedGradleTest.kt @@ -0,0 +1,83 @@ +package com.jraska.module.graph.assertion + +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder +import java.io.File + +class FullProjectMultipleAppliedGradleTest { + @get:Rule + val testProjectDir: TemporaryFolder = TemporaryFolder() + + @Before + fun setup() { + testProjectDir.newFile("settings.gradle") + .writeText("include ':app', ':core', 'core-api', 'no-dependencies'") + + createModule( + "core-api", content = """ + apply plugin: 'java-library' + """ + ) + + createModule( + "core", content = """ + apply plugin: 'java-library' + + dependencies { + implementation project(":core-api") + } + """ + ) + + createModule( + "app", content = """ + plugins { + id 'com.jraska.module.graph.assertion' + } + apply plugin: 'java-library' + + moduleGraphAssert { + maxHeight = 2 + } + + dependencies { + implementation project(":core-api") + implementation project(":core") + } + """ + ) + + createModule( + "no-dependencies", content = """ + plugins { + id 'com.jraska.module.graph.assertion' + } + apply plugin: 'java-library' + + moduleGraphAssert { + maxHeight = 0 + } + """ + ) + } + + @Test + fun printsBothCorrectStatistics() { + val output = + runGradleAssertModuleGraph(testProjectDir.root, "generateModulesGraphStatistics").output + + println(output) + assert(output.contains("> Task :app:generateModulesGraphStatistics\n" + + "GraphStatistics(modulesCount=3, edgesCount=3, height=2, longestPath=':app -> :core -> :core-api')\n" + + "\n" + + "> Task :no-dependencies:generateModulesGraphStatistics\n" + + "GraphStatistics(modulesCount=1, edgesCount=0, height=0, longestPath=':no-dependencies')")) + } + + private fun createModule(dir: String, content: String) { + val newFolder = testProjectDir.newFolder(dir) + File(newFolder, "build.gradle").writeText(content) + } +}