From 2ea4470757a83d2bae2c1435da8357267e92ff77 Mon Sep 17 00:00:00 2001 From: Leon Sixt Date: Fri, 21 Dec 2012 18:48:39 +0100 Subject: [PATCH] more customisation for dot output with dependency-dot-head you can now define your own dot head. dependency-dot-node-label lets you customise the labels of the nodes --- README.md | 3 ++ .../sbt/graph/IvyGraphMLDependencies.scala | 23 ++++++----- .../net/virtualvoid/sbt/graph/Plugin.scala | 20 ++++++++- .../testDotFileGeneration/project/build.scala | 41 ++++++++++--------- .../testDotFileGeneration/test | 3 +- 5 files changed, 57 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 20eb2a260..76b648a64 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,9 @@ Tasks & Settings you want the scala-library dependency to appear in the output. (default: true) * `dependency-graph-ml-file`: a setting which allows configuring the output path of `dependency-graph-ml`. * `dependency-dot-file`: a setting which allows configuring the output path of `dependency-dot`. + * `dependency-dot-head`: a setting to customize the head of the dot file. (e.g. to set your preferred node shapes) + * `dependency-dot-nodes-label`: defines the formation of a node label + (default set to `[organisation]
[name]
[version]`) * `ivy-report`: let's ivy generate the resolution report for you project. Use `show ivy-report` for the filename of the generated report diff --git a/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala b/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala index 6803696fe..3d75ac66d 100644 --- a/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala +++ b/src/main/scala/net/virtualvoid/sbt/graph/IvyGraphMLDependencies.scala @@ -195,7 +195,17 @@ object IvyGraphMLDependencies extends App { XML.save(outputFile, xml) } - def saveAsDot(graph : ModuleGraph, outputFile: File) : File = { + def saveAsDot(graph : ModuleGraph, + dotHead : String, + nodeFormation : Function3[String,String,String,String], + outputFile: File + ) : File = { + val nodes = { + for (n <- graph.nodes) + yield + """ "%s"[label=%s]""".format(n.id.idString, + nodeFormation(n.id.organisation, n.id.name, n.id.version)) + }.mkString("\n") val edges = { for ( e <- graph.edges) @@ -203,16 +213,7 @@ object IvyGraphMLDependencies extends App { """ "%s" -> "%s"""".format(e._1.idString, e._2.idString) }.mkString("\n") - val dot = - """digraph "dependency-graph" { - | graph[rankdir="LR"] - | node [ - | shape="record" - | ] - | edge [ - | arrowtail="none" - | ] - |""".stripMargin + edges + "\n}" + val dot = "%s\n%s\n%s\n}".format(dotHead, nodes, edges) sbt.IO.write(outputFile, dot) outputFile diff --git a/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala b/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala index 500ba99d5..7707cae99 100755 --- a/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala +++ b/src/main/scala/net/virtualvoid/sbt/graph/Plugin.scala @@ -30,6 +30,10 @@ object Plugin extends sbt.Plugin { "Creates a graphml file containing the dependency-graph for a project") val dependencyDotFile = SettingKey[File]("dependency-dot-file", "The location the dot file should be generated at") + val dependencyDotNodeLabel = SettingKey[(String,String,String) => String]("dependency-dot-node-label", + "Returns a formated string of a dependency. Takes organisation, name and version as parameters") + val dependencyDotHead = SettingKey[String]("dependency-dot-head", + "The head of the dot file. (e.g. to set your preferred node shapes)") val dependencyDot = TaskKey[File]("dependency-dot", "Creates a dot file containing the dpendency-graph for a project") val moduleGraph = TaskKey[IvyGraphMLDependencies.ModuleGraph]("module-graph", @@ -110,6 +114,17 @@ object Plugin extends sbt.Plugin { dependencyGraphML <<= dependencyGraphMLTask, dependencyDotFile <<= target / "dependencies-%s.dot".format(config.toString), dependencyDot <<= dependencyDotTask, + dependencyDotHead := """digraph "dependency-graph" { + | graph[rankdir="LR"] + | node [ + | shape="record" + | ] + | edge [ + | arrowtail="none" + | ]""".stripMargin, + dependencyDotNodeLabel := { (organisation : String, name : String, version : String) => + """<%s
%s
%s>""".format(organisation, name, version) + }, whatDependsOn <<= InputTask(artifactIdParser) { module => (module, streams, moduleGraph) map { (module, streams, graph) => streams.log.info(IvyGraphMLDependencies.asciiTree(IvyGraphMLDependencies.reverseGraphStartingAt(graph, module))) @@ -128,8 +143,9 @@ object Plugin extends sbt.Plugin { resultFile } def dependencyDotTask = - (moduleGraph, dependencyDotFile, streams) map { (graph, outFile, streams) => - val resultFile = IvyGraphMLDependencies.saveAsDot(graph, outFile) + (moduleGraph, dependencyDotHead, dependencyDotNodeLabel, dependencyDotFile, streams). + map { (graph, dotHead, nodeLabelFormation, outFile, streams) => + val resultFile = IvyGraphMLDependencies.saveAsDot(graph, dotHead, nodeLabelFormation, outFile) streams.log.info("Wrote dependency graph to '%s'" format resultFile) resultFile } diff --git a/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/build.scala b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/build.scala index 1d7e148ca..62a50047e 100644 --- a/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/build.scala +++ b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/project/build.scala @@ -35,26 +35,29 @@ object Build extends sbt.Build { resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/", TaskKey[Unit]("check") <<= (dependencyDot in Compile) map { (dotFile) => - def sanitize(str: String): String = str.split('\n').drop(1).mkString("\n") - val expectedGraph = - """digraph "dependency-graph" { - | graph[rankdir="LR"] - | node [ - | shape="record" - | ] - | edge [ - | arrowtail="none" - | ] - | "test-dot-file-generation:test-dot-file-generation_2.9.2:0.1-SNAPSHOT" -> "just-a-transitive-dependency:just-a-transitive-dependency_2.9.2:0.1-SNAPSHOT" - | "just-a-transitive-dependency:just-a-transitive-dependency_2.9.2:0.1-SNAPSHOT" -> "just-a-transitive-dependency-endpoint:just-a-transitive-dependency-endpoint_2.9.2:0.1-SNAPSHOT" - | "test-dot-file-generation:test-dot-file-generation_2.9.2:0.1-SNAPSHOT" -> "just-a-dependency:just-a-dependency_2.9.2:0.1-SNAPSHOT" - |} - """.stripMargin + val expectedGraph = + """digraph "dependency-graph" { + | graph[rankdir="LR"] + | node [ + | shape="record" + | ] + | edge [ + | arrowtail="none" + | ] + | "test-dot-file-generation:test-dot-file-generation_2.9.2:0.1-SNAPSHOT"[label=test-dot-file-generation_2.9.2
0.1-SNAPSHOT>] + | "just-a-transitive-dependency:just-a-transitive-dependency_2.9.2:0.1-SNAPSHOT"[label=just-a-transitive-dependency_2.9.2
0.1-SNAPSHOT>] + | "just-a-transitive-dependency-endpoint:just-a-transitive-dependency-endpoint_2.9.2:0.1-SNAPSHOT"[label=just-a-transitive-dependency-endpoint_2.9.2
0.1-SNAPSHOT>] + | "just-a-dependency:just-a-dependency_2.9.2:0.1-SNAPSHOT"[label=just-a-dependency_2.9.2
0.1-SNAPSHOT>] + | "test-dot-file-generation:test-dot-file-generation_2.9.2:0.1-SNAPSHOT" -> "just-a-transitive-dependency:just-a-transitive-dependency_2.9.2:0.1-SNAPSHOT" + | "just-a-transitive-dependency:just-a-transitive-dependency_2.9.2:0.1-SNAPSHOT" -> "just-a-transitive-dependency-endpoint:just-a-transitive-dependency-endpoint_2.9.2:0.1-SNAPSHOT" + | "test-dot-file-generation:test-dot-file-generation_2.9.2:0.1-SNAPSHOT" -> "just-a-dependency:just-a-dependency_2.9.2:0.1-SNAPSHOT" + |} + """.stripMargin - val graph : String = scala.io.Source.fromFile(dotFile.getAbsolutePath).mkString - val errors = compareByLine(graph, expectedGraph) - require(errors.isEmpty , errors.mkString("\n")) - () + val graph : String = scala.io.Source.fromFile(dotFile.getAbsolutePath).mkString + val errors = compareByLine(graph, expectedGraph) + require(errors.isEmpty , errors.mkString("\n")) + () } ) ).dependsOn(justADependencyProject, justATransitiveDependencyProject) diff --git a/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/test b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/test index 1461a7105..f9fa19e83 100644 --- a/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/test +++ b/src/sbt-test/sbt-dependency-graph/testDotFileGeneration/test @@ -1 +1,2 @@ -> test-dot-file-generation/check \ No newline at end of file +> project test-dot-file-generation +> check