From da7297134b7596b6dc70db5548ee03bbf93264ea Mon Sep 17 00:00:00 2001 From: Josef Raska <6277721+jraska@users.noreply.github.com> Date: Thu, 21 Nov 2019 22:59:57 +0100 Subject: [PATCH] Update structure of buildSrc (#212) --- build.gradle | 2 +- .../github/client/GenerateModulesGraphTask.kt | 18 ---- ...ory.kt => GradleDependencyGraphFactory.kt} | 11 +-- .../client/{ => graph}/DependencyGraph.kt | 18 ++-- .../client/{ => graph}/GraphStatistics.kt | 2 +- .../GraphvizWriter.kt} | 4 +- .../github/client/{ => graph}/LongestPath.kt | 2 +- .../AssertCrossLayerDependencies.kt | 13 ++- .../{ => tasks}/AssertInLayerDependencies.kt | 6 +- .../{ => tasks}/AssertModuleTreeHeightTask.kt | 5 +- .../client/tasks/GenerateModulesGraphTask.kt | 20 +++++ .../{ => tasks}/GenerateOneModuleGraphTask.kt | 8 +- .../github/client/DependencyGraphTest.kt | 81 ----------------- .../client/graph/DependencyGraphTest.kt | 87 +++++++++++++++++++ 14 files changed, 146 insertions(+), 131 deletions(-) delete mode 100644 buildSrc/src/main/java/com/jraska/github/client/GenerateModulesGraphTask.kt rename buildSrc/src/main/java/com/jraska/github/client/{DependencyTreeFactory.kt => GradleDependencyGraphFactory.kt} (84%) rename buildSrc/src/main/java/com/jraska/github/client/{ => graph}/DependencyGraph.kt (87%) rename buildSrc/src/main/java/com/jraska/github/client/{ => graph}/GraphStatistics.kt (71%) rename buildSrc/src/main/java/com/jraska/github/client/{GraphvizGenerator.kt => graph/GraphvizWriter.kt} (96%) rename buildSrc/src/main/java/com/jraska/github/client/{ => graph}/LongestPath.kt (77%) rename buildSrc/src/main/java/com/jraska/github/client/{ => tasks}/AssertCrossLayerDependencies.kt (77%) rename buildSrc/src/main/java/com/jraska/github/client/{ => tasks}/AssertInLayerDependencies.kt (84%) rename buildSrc/src/main/java/com/jraska/github/client/{ => tasks}/AssertModuleTreeHeightTask.kt (79%) create mode 100644 buildSrc/src/main/java/com/jraska/github/client/tasks/GenerateModulesGraphTask.kt rename buildSrc/src/main/java/com/jraska/github/client/{ => tasks}/GenerateOneModuleGraphTask.kt (55%) delete mode 100644 buildSrc/src/test/java/com/jraska/github/client/DependencyGraphTest.kt create mode 100644 buildSrc/src/test/java/com/jraska/github/client/graph/DependencyGraphTest.kt diff --git a/build.gradle b/build.gradle index 5d0abea4..1a486a3d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -import com.jraska.github.client.* +import com.jraska.github.client.tasks.* buildscript { ext.kotlin_version = '1.3.50' diff --git a/buildSrc/src/main/java/com/jraska/github/client/GenerateModulesGraphTask.kt b/buildSrc/src/main/java/com/jraska/github/client/GenerateModulesGraphTask.kt deleted file mode 100644 index 338d690d..00000000 --- a/buildSrc/src/main/java/com/jraska/github/client/GenerateModulesGraphTask.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.jraska.github.client - -import org.gradle.api.DefaultTask -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.TaskAction - -open class GenerateModulesGraphTask : DefaultTask() { - @Input - var layers: Array = emptyArray() - - @TaskAction - fun run() { - val allModulesTree = DependencyTreeFactory.create(project) - - println(allModulesTree.statistics()) - println(GraphvizGenerator.toGraphviz(allModulesTree, layers.toSet())) - } -} diff --git a/buildSrc/src/main/java/com/jraska/github/client/DependencyTreeFactory.kt b/buildSrc/src/main/java/com/jraska/github/client/GradleDependencyGraphFactory.kt similarity index 84% rename from buildSrc/src/main/java/com/jraska/github/client/DependencyTreeFactory.kt rename to buildSrc/src/main/java/com/jraska/github/client/GradleDependencyGraphFactory.kt index efcd368d..c5ed24ef 100644 --- a/buildSrc/src/main/java/com/jraska/github/client/DependencyTreeFactory.kt +++ b/buildSrc/src/main/java/com/jraska/github/client/GradleDependencyGraphFactory.kt @@ -1,19 +1,14 @@ package com.jraska.github.client +import com.jraska.github.client.graph.DependencyGraph import org.gradle.api.Project import org.gradle.api.internal.artifacts.dependencies.DefaultProjectDependency -object DependencyTreeFactory { +object GradleDependencyGraphFactory { fun create(project: Project): DependencyGraph { val dependencies = project.listDependencyPairs() - - val modulesTree = DependencyGraph() - dependencies.forEach { - modulesTree.addEdge(it.first, it.second) - } - - return modulesTree + return DependencyGraph.create(dependencies) } private fun Project.listDependencyPairs(): List> { diff --git a/buildSrc/src/main/java/com/jraska/github/client/DependencyGraph.kt b/buildSrc/src/main/java/com/jraska/github/client/graph/DependencyGraph.kt similarity index 87% rename from buildSrc/src/main/java/com/jraska/github/client/DependencyGraph.kt rename to buildSrc/src/main/java/com/jraska/github/client/graph/DependencyGraph.kt index c7b58e22..42e3fe95 100644 --- a/buildSrc/src/main/java/com/jraska/github/client/DependencyGraph.kt +++ b/buildSrc/src/main/java/com/jraska/github/client/graph/DependencyGraph.kt @@ -1,4 +1,4 @@ -package com.jraska.github.client +package com.jraska.github.client.graph class DependencyGraph() { private val nodes = mutableMapOf() @@ -47,10 +47,6 @@ class DependencyGraph() { ) } - fun addEdge(from: String, to: String) { - getOrCreate(from).dependsOn.add(getOrCreate(to)) - } - fun subTree(key: String): DependencyGraph { val dependencyTree = DependencyGraph() @@ -66,6 +62,10 @@ class DependencyGraph() { } } + private fun addEdge(from: String, to: String) { + getOrCreate(from).dependsOn.add(getOrCreate(to)) + } + private fun countEdges(): Int { return nodes().flatMap { node -> node.dependsOn }.count() } @@ -100,4 +100,12 @@ class DependencyGraph() { } } } + + companion object { + fun create(dependencies: List>): DependencyGraph { + val graph = DependencyGraph() + dependencies.forEach { graph.addEdge(it.first, it.second) } + return graph + } + } } diff --git a/buildSrc/src/main/java/com/jraska/github/client/GraphStatistics.kt b/buildSrc/src/main/java/com/jraska/github/client/graph/GraphStatistics.kt similarity index 71% rename from buildSrc/src/main/java/com/jraska/github/client/GraphStatistics.kt rename to buildSrc/src/main/java/com/jraska/github/client/graph/GraphStatistics.kt index cbd93b60..04003937 100644 --- a/buildSrc/src/main/java/com/jraska/github/client/GraphStatistics.kt +++ b/buildSrc/src/main/java/com/jraska/github/client/graph/GraphStatistics.kt @@ -1,4 +1,4 @@ -package com.jraska.github.client +package com.jraska.github.client.graph data class GraphStatistics( val modulesCount: Int, diff --git a/buildSrc/src/main/java/com/jraska/github/client/GraphvizGenerator.kt b/buildSrc/src/main/java/com/jraska/github/client/graph/GraphvizWriter.kt similarity index 96% rename from buildSrc/src/main/java/com/jraska/github/client/GraphvizGenerator.kt rename to buildSrc/src/main/java/com/jraska/github/client/graph/GraphvizWriter.kt index 15f8a909..4344a20c 100644 --- a/buildSrc/src/main/java/com/jraska/github/client/GraphvizGenerator.kt +++ b/buildSrc/src/main/java/com/jraska/github/client/graph/GraphvizWriter.kt @@ -1,6 +1,6 @@ -package com.jraska.github.client +package com.jraska.github.client.graph -object GraphvizGenerator { +object GraphvizWriter { fun toGraphviz(dependencyGraph: DependencyGraph, groups: Set = emptySet()): String { val longestPathConnections = dependencyGraph.longestPath() diff --git a/buildSrc/src/main/java/com/jraska/github/client/LongestPath.kt b/buildSrc/src/main/java/com/jraska/github/client/graph/LongestPath.kt similarity index 77% rename from buildSrc/src/main/java/com/jraska/github/client/LongestPath.kt rename to buildSrc/src/main/java/com/jraska/github/client/graph/LongestPath.kt index 6ecda079..3adbcdf2 100644 --- a/buildSrc/src/main/java/com/jraska/github/client/LongestPath.kt +++ b/buildSrc/src/main/java/com/jraska/github/client/graph/LongestPath.kt @@ -1,4 +1,4 @@ -package com.jraska.github.client +package com.jraska.github.client.graph class LongestPath( val nodeNames: List diff --git a/buildSrc/src/main/java/com/jraska/github/client/AssertCrossLayerDependencies.kt b/buildSrc/src/main/java/com/jraska/github/client/tasks/AssertCrossLayerDependencies.kt similarity index 77% rename from buildSrc/src/main/java/com/jraska/github/client/AssertCrossLayerDependencies.kt rename to buildSrc/src/main/java/com/jraska/github/client/tasks/AssertCrossLayerDependencies.kt index ed1673fd..2679c16f 100644 --- a/buildSrc/src/main/java/com/jraska/github/client/AssertCrossLayerDependencies.kt +++ b/buildSrc/src/main/java/com/jraska/github/client/tasks/AssertCrossLayerDependencies.kt @@ -1,5 +1,7 @@ -package com.jraska.github.client +package com.jraska.github.client.tasks +import com.jraska.github.client.GradleDependencyGraphFactory +import com.jraska.github.client.graph.DependencyGraph import org.gradle.api.DefaultTask import org.gradle.api.GradleException import org.gradle.api.tasks.Input @@ -11,7 +13,7 @@ open class AssertCrossLayerDependencies : DefaultTask() { @TaskAction fun run() { - val modulesTree = DependencyTreeFactory.create(project) + val modulesTree = GradleDependencyGraphFactory.create(project) verifyAllLayersHaveModule(modulesTree) @@ -27,7 +29,7 @@ open class AssertCrossLayerDependencies : DefaultTask() { private fun buildErrorMessage(againstLayerDependencies: List>): String { val errorsMessage = againstLayerDependencies.joinToString("\n") { " Module '${it.first.key}' cannot depend on '${it.second.key}'." } - return "Dependencies agaist direction of layers '${layersDependencyString()}' are not allowed. The violating dependencies are: \n$errorsMessage" + return "Dependencies against direction of layers '${layersDependencyString()}' are not allowed. The violating dependencies are: \n$errorsMessage" } private fun layersDependencyString(): String { @@ -38,10 +40,7 @@ open class AssertCrossLayerDependencies : DefaultTask() { val nodes = modulesTree.nodes() for (layerPrefix in layersFromTheTop) { - val someNodeInLayer = nodes.find { it.key.startsWith(layerPrefix) } - if (someNodeInLayer == null) { - throw GradleException("There is no module, which belongs to layer '$layerPrefix'") - } + nodes.find { it.key.startsWith(layerPrefix) } ?: throw GradleException("There is no module, which belongs to layer '$layerPrefix'") } } diff --git a/buildSrc/src/main/java/com/jraska/github/client/AssertInLayerDependencies.kt b/buildSrc/src/main/java/com/jraska/github/client/tasks/AssertInLayerDependencies.kt similarity index 84% rename from buildSrc/src/main/java/com/jraska/github/client/AssertInLayerDependencies.kt rename to buildSrc/src/main/java/com/jraska/github/client/tasks/AssertInLayerDependencies.kt index 2eaadff7..e215ce37 100644 --- a/buildSrc/src/main/java/com/jraska/github/client/AssertInLayerDependencies.kt +++ b/buildSrc/src/main/java/com/jraska/github/client/tasks/AssertInLayerDependencies.kt @@ -1,5 +1,7 @@ -package com.jraska.github.client +package com.jraska.github.client.tasks +import com.jraska.github.client.GradleDependencyGraphFactory +import com.jraska.github.client.graph.DependencyGraph import org.gradle.api.DefaultTask import org.gradle.api.GradleException import org.gradle.api.tasks.Input @@ -11,7 +13,7 @@ open class AssertInLayerDependencies : DefaultTask() { @TaskAction fun run() { - val modulesTree = DependencyTreeFactory.create(project) + val modulesTree = GradleDependencyGraphFactory.create(project) val inLayerDependencies = modulesTree.nodes() .filter { it.key.startsWith(layerPrefix) } diff --git a/buildSrc/src/main/java/com/jraska/github/client/AssertModuleTreeHeightTask.kt b/buildSrc/src/main/java/com/jraska/github/client/tasks/AssertModuleTreeHeightTask.kt similarity index 79% rename from buildSrc/src/main/java/com/jraska/github/client/AssertModuleTreeHeightTask.kt rename to buildSrc/src/main/java/com/jraska/github/client/tasks/AssertModuleTreeHeightTask.kt index 42c34bed..a74e05b6 100644 --- a/buildSrc/src/main/java/com/jraska/github/client/AssertModuleTreeHeightTask.kt +++ b/buildSrc/src/main/java/com/jraska/github/client/tasks/AssertModuleTreeHeightTask.kt @@ -1,5 +1,6 @@ -package com.jraska.github.client +package com.jraska.github.client.tasks +import com.jraska.github.client.GradleDependencyGraphFactory import org.gradle.api.DefaultTask import org.gradle.api.GradleException import org.gradle.api.tasks.Input @@ -14,7 +15,7 @@ open class AssertModuleTreeHeightTask : DefaultTask() { @TaskAction fun run() { - val modulesTree = DependencyTreeFactory.create(project) + val modulesTree = GradleDependencyGraphFactory.create(project) val height = modulesTree.heightOf(moduleName) if (height > maxHeight) { diff --git a/buildSrc/src/main/java/com/jraska/github/client/tasks/GenerateModulesGraphTask.kt b/buildSrc/src/main/java/com/jraska/github/client/tasks/GenerateModulesGraphTask.kt new file mode 100644 index 00000000..718d269f --- /dev/null +++ b/buildSrc/src/main/java/com/jraska/github/client/tasks/GenerateModulesGraphTask.kt @@ -0,0 +1,20 @@ +package com.jraska.github.client.tasks + +import com.jraska.github.client.GradleDependencyGraphFactory +import com.jraska.github.client.graph.GraphvizWriter +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.TaskAction + +open class GenerateModulesGraphTask : DefaultTask() { + @Input + var layers: Array = emptyArray() + + @TaskAction + fun run() { + val allModulesTree = GradleDependencyGraphFactory.create(project) + + println(allModulesTree.statistics()) + println(GraphvizWriter.toGraphviz(allModulesTree, layers.toSet())) + } +} diff --git a/buildSrc/src/main/java/com/jraska/github/client/GenerateOneModuleGraphTask.kt b/buildSrc/src/main/java/com/jraska/github/client/tasks/GenerateOneModuleGraphTask.kt similarity index 55% rename from buildSrc/src/main/java/com/jraska/github/client/GenerateOneModuleGraphTask.kt rename to buildSrc/src/main/java/com/jraska/github/client/tasks/GenerateOneModuleGraphTask.kt index d047e924..d5fb555d 100644 --- a/buildSrc/src/main/java/com/jraska/github/client/GenerateOneModuleGraphTask.kt +++ b/buildSrc/src/main/java/com/jraska/github/client/tasks/GenerateOneModuleGraphTask.kt @@ -1,5 +1,7 @@ -package com.jraska.github.client +package com.jraska.github.client.tasks +import com.jraska.github.client.GradleDependencyGraphFactory +import com.jraska.github.client.graph.GraphvizWriter import org.gradle.api.DefaultTask import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction @@ -10,10 +12,10 @@ open class GenerateOneModuleGraphTask : DefaultTask() { @TaskAction fun run() { - val allModulesTree = DependencyTreeFactory.create(project) + val allModulesTree = GradleDependencyGraphFactory.create(project) val moduleTree = allModulesTree.subTree(moduleName) println(moduleTree.statistics()) - println(GraphvizGenerator.toGraphviz(moduleTree)) + println(GraphvizWriter.toGraphviz(moduleTree)) } } diff --git a/buildSrc/src/test/java/com/jraska/github/client/DependencyGraphTest.kt b/buildSrc/src/test/java/com/jraska/github/client/DependencyGraphTest.kt deleted file mode 100644 index c52637af..00000000 --- a/buildSrc/src/test/java/com/jraska/github/client/DependencyGraphTest.kt +++ /dev/null @@ -1,81 +0,0 @@ -package com.jraska.github.client - -import org.junit.Test - -class DependencyGraphTest { - @Test - fun correctHeightIsMaintained() { - val dependencyTree = DependencyGraph() - - dependencyTree.addEdge("app", "feature") - assert(dependencyTree.heightOf("app") == 1) - - dependencyTree.addEdge("app", "lib") - assert(dependencyTree.heightOf("app") == 1) - - dependencyTree.addEdge("feature", "lib") - dependencyTree.addEdge("lib", "core") - - assert(dependencyTree.heightOf("app") == 3) - } - - @Test - fun findsProperLongestPath() { - val dependencyTree = DependencyGraph() - - dependencyTree.addEdge("app", "feature") - dependencyTree.addEdge("app", "lib") - dependencyTree.addEdge("app", "core") - dependencyTree.addEdge("feature", "lib") - dependencyTree.addEdge("lib", "core") - - assert(dependencyTree.longestPath("app").nodeNames == listOf("app", "feature", "lib", "core")) - } - - @Test - fun findsProperRoot() { - val dependencyTree = DependencyGraph() - - dependencyTree.addEdge("feature", "lib") - dependencyTree.addEdge("lib", "core") - dependencyTree.addEdge("app", "feature") - dependencyTree.addEdge("app", "lib") - dependencyTree.addEdge("app", "core") - - assert(dependencyTree.findRoot().key == "app") - } - - @Test - fun createSubtreeProperly() { - val dependencyTree = DependencyGraph() - - dependencyTree.addEdge("feature", "lib") - dependencyTree.addEdge("lib", "core") - dependencyTree.addEdge("app", "feature") - dependencyTree.addEdge("feature", "core") - dependencyTree.addEdge("app", "core") - - val subTree = dependencyTree.subTree("feature") - - assert(subTree.findRoot().key == "feature") - assert(subTree.heightOf("feature") == 2) - assert(subTree.longestPath("feature").nodeNames == listOf("feature", "lib", "core")) - } - - @Test - fun createCountStatisticsWell() { - val dependencyTree = DependencyGraph() - - dependencyTree.addEdge("feature", "lib") - dependencyTree.addEdge("lib", "core") - dependencyTree.addEdge("app", "feature") - dependencyTree.addEdge("feature", "core") - dependencyTree.addEdge("app", "core") - - val statistics = dependencyTree.statistics() - - assert(statistics.height == 3) - assert(statistics.modulesCount == 4) - assert(statistics.edgesCount == 5) - } -} diff --git a/buildSrc/src/test/java/com/jraska/github/client/graph/DependencyGraphTest.kt b/buildSrc/src/test/java/com/jraska/github/client/graph/DependencyGraphTest.kt new file mode 100644 index 00000000..02cf63a8 --- /dev/null +++ b/buildSrc/src/test/java/com/jraska/github/client/graph/DependencyGraphTest.kt @@ -0,0 +1,87 @@ +package com.jraska.github.client.graph + +import org.junit.Test + +class DependencyGraphTest { + @Test + fun correctHeightIsMaintained() { + val dependencyTree = DependencyGraph.create( + listOf( + "app" to "feature", + "app" to "lib", + "feature" to "lib", + "lib" to "core" + ) + ) + + assert(dependencyTree.heightOf("app") == 3) + } + + @Test + fun findsProperLongestPath() { + val dependencyTree = DependencyGraph.create( + listOf( + "app" to "feature", + "app" to "lib", + "app" to "core", + "feature" to "lib", + "lib" to "core" + ) + ) + + assert(dependencyTree.longestPath("app").nodeNames == listOf("app", "feature", "lib", "core")) + } + + @Test + fun findsProperRoot() { + val dependencyTree = DependencyGraph.create( + listOf( + "feature" to "lib", + "lib" to "core", + "app" to "feature", + "app" to "lib", + "app" to "core" + ) + ) + + assert(dependencyTree.findRoot().key == "app") + } + + @Test + fun createSubtreeProperly() { + val dependencyTree = DependencyGraph.create( + listOf( + "feature" to "lib", + "lib" to "core", + "app" to "feature", + "feature" to "core", + "app" to "core" + ) + ) + + val subTree = dependencyTree.subTree("feature") + + assert(subTree.findRoot().key == "feature") + assert(subTree.heightOf("feature") == 2) + assert(subTree.longestPath("feature").nodeNames == listOf("feature", "lib", "core")) + } + + @Test + fun createCountStatisticsWell() { + val dependencyTree = DependencyGraph.create( + listOf( + "feature" to "lib", + "lib" to "core", + "app" to "feature", + "feature" to "core", + "app" to "core" + ) + ) + + val statistics = dependencyTree.statistics() + + assert(statistics.height == 3) + assert(statistics.modulesCount == 4) + assert(statistics.edgesCount == 5) + } +}