Repository: vanniktech/gradle-dependency-graph-generator-plugin
Pull request #154 (2022-06-04 17:23:53)

Bump actions/setup-java from 1 to 3
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 1 to 3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/actions/setup-java/releases">actions/setup-java's releases</a>.</em></p>
<blockquote>
<h2>v3.0.0</h2>
<p>In scope of this release we changed version of the runtime Node.js for the setup-java action and updated package-lock.json file to  v2.</p>
<h3>Breaking Changes</h3>
<p>With the update to Node 16 in <a href="https://github-redirect.dependabot.com/actions/setup-java/pull/290">#290</a>, all scripts will now be run with Node 16 rather than Node 12.</p>
<h2>v2.5.0</h2>
<p>In scope of this pull request we add support for Microsoft Build of OpenJDK (<a href="https://github-redirect.dependabot.com/actions/setup-java/pull/252">actions/setup-java#252</a>).</p>
<pre lang="yaml"><code>steps:
  - name: Checkout
    uses: actions/checkout@v2
  - name: Setup-java
    uses: actions/setup-java@v2
    with:
      distribution: microsoft
      java-version: 11
</code></pre>
<h3>Supported distributions</h3>
<p>Currently, the following distributions are supported:</p>
<table>
<thead>
<tr>
<th>Keyword</th>
<th>Distribution</th>
<th>Official site</th>
<th>License</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>temurin</code></td>
<td>Eclipse Temurin</td>
<td><a href="https://adoptium.net/">Link</a></td>
<td><a href="https://adoptium.net/about.html">Link</a></td>
</tr>
<tr>
<td><code>zulu</code></td>
<td>Zulu OpenJDK</td>
<td><a href="https://www.azul.com/downloads/zulu-community/?package=jdk">Link</a></td>
<td><a href="https://www.azul.com/products/zulu-and-zulu-enterprise/zulu-terms-of-use/">Link</a></td>
</tr>
<tr>
<td><code>adopt</code> or <code>adopt-hotspot</code></td>
<td>Adopt OpenJDK Hotspot</td>
<td><a href="https://adoptopenjdk.net/">Link</a></td>
<td><a href="https://adoptopenjdk.net/about.html">Link</a></td>
</tr>
<tr>
<td><code>adopt-openj9</code></td>
<td>Adopt OpenJDK OpenJ9</td>
<td><a href="https://adoptopenjdk.net/">Link</a></td>
<td><a href="https://adoptopenjdk.net/about.html">Link</a></td>
</tr>
<tr>
<td><code>liberica</code></td>
<td>Liberica JDK</td>
<td><a href="https://bell-sw.com/">Link</a></td>
<td><a href="https://bell-sw.com/liberica_eula/">Link</a></td>
</tr>
<tr>
<td><code>microsoft</code></td>
<td>Microsoft Build of OpenJDK</td>
<td><a href="https://www.microsoft.com/openjdk">Link</a></td>
<td><a href="https://docs.microsoft.com/java/openjdk/faq">Link</a></td>
</tr>
</tbody>
</table>
<h2>v2.4.0</h2>
<p>In scope of this pull request we add support for Liberica JDK (<a href="https://github-redirect.dependabot.com/actions/setup-java/pull/225">actions/setup-java#225</a>).</p>
<pre lang="yaml"><code>steps:
  - name: Checkout
    uses: actions/checkout@v2
  - name: Setup-java
    uses: actions/setup-java@v2
    with:
      distribution: liberica
      java-version: 11
</code></pre>
<h3>Supported distributions</h3>
<p>Currently, the following distributions are supported:</p>
<table>
<thead>
<tr>
<th>Keyword</th>
<th>Distribution</th>
<th>Official site</th>
<th>License</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>zulu</code></td>
<td>Zulu OpenJDK</td>
<td><a href="https://www.azul.com/downloads/zulu-community/?package=jdk">Link</a></td>
<td><a href="https://www.azul.com/products/zulu-and-zulu-enterprise/zulu-terms-of-use/">Link</a></td>
</tr>
<tr>
<td><code>adopt</code> or <code>adopt-hotspot</code></td>
<td>Adopt OpenJDK Hotspot</td>
<td><a href="https://adoptopenjdk.net/">Link</a></td>
<td><a href="https://adoptopenjdk.net/about.html">Link</a></td>
</tr>
<tr>
<td><code>adopt-openj9</code></td>
<td>Adopt OpenJDK OpenJ9</td>
<td><a href="https://adoptopenjdk.net/">Link</a></td>
<td><a href="https://adoptopenjdk.net/about.html">Link</a></td>
</tr>
<tr>
<td><code>temurin</code></td>
<td>Eclipse Temurin</td>
<td><a href="https://adoptium.net/">Link</a></td>
<td><a href="https://adoptium.net/about.html">Link</a></td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/actions/setup-java/commit/860f60056505705214d223b91ed7a30f173f6142"><code>860f600</code></a> Add Amazon Corretto example and fix links (<a href="https://github-redirect.dependabot.com/actions/setup-java/issues/325">#325</a>)</li>
<li><a href="https://github.com/actions/setup-java/commit/bae3140877a4e25b7fb2aa73013c6245709d0fc0"><code>bae3140</code></a> Add Amazon Corretto distribution (<a href="https://github-redirect.dependabot.com/actions/setup-java/issues/312">#312</a>)</li>
<li><a href="https://github.com/actions/setup-java/commit/dd8085240015149ea4caec57ae4488d9b27b8deb"><code>dd80852</code></a> Housekeeping: Update zeit/ncc to vercel/ncc (<a href="https://github-redirect.dependabot.com/actions/setup-java/issues/270">#270</a>)</li>
<li><a href="https://github.com/actions/setup-java/commit/4fe61d24fe5472910b93bdeffb8aad49f979d862"><code>4fe61d2</code></a> [README] Add sbt as supported package manager for caching (<a href="https://github-redirect.dependabot.com/actions/setup-java/issues/322">#322</a>)</li>
<li><a href="https://github.com/actions/setup-java/commit/055250a105d999e8a448b9b80138d7d4acc7cf7c"><code>055250a</code></a> Add CODE_OF_CONDUCT (<a href="https://github-redirect.dependabot.com/actions/setup-java/issues/318">#318</a>)</li>
<li><a href="https://github.com/actions/setup-java/commit/0ed94a56789e7ec6897b1ec1c1e60d459a6baa5f"><code>0ed94a5</code></a> Add SBT in cache managers. (<a href="https://github-redirect.dependabot.com/actions/setup-java/issues/302">#302</a>)</li>
<li><a href="https://github.com/actions/setup-java/commit/9519cf1382ac8dc61ad461f7f7cb45f033220189"><code>9519cf1</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/actions/setup-java/issues/317">#317</a> from actions/t-dedah/updateCache</li>
<li><a href="https://github.com/actions/setup-java/commit/02c73de3fe82c1eaf0f32c6ccec2cc7072b3124b"><code>02c73de</code></a> Updated action version</li>
<li><a href="https://github.com/actions/setup-java/commit/fd3f6750a0381aef7e9cf0620c6eea3583991a3f"><code>fd3f675</code></a> Updated package-lock.json</li>
<li><a href="https://github.com/actions/setup-java/commit/1aa8bf7608bff99bf8a7ab37bf57a6f8b4702b86"><code>1aa8bf7</code></a> Licensed</li>
<li>Additional commits viewable in <a href="https://github.com/actions/setup-java/compare/v1...v3">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/setup-java&package-manager=github_actions&previous-version=1&new-version=3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>


Patch:
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c81c192..481cea7 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -19,8 +19,9 @@ jobs:
         uses: gradle/wrapper-validation-action@v1
 
       - name: Install JDK ${{ matrix.java_version }}
-        uses: actions/setup-java@v1
+        uses: actions/setup-java@v3
         with:
+          distribution: 'zulu'
           java-version: ${{ matrix.java_version }}
 
       - name: Build with Gradle
diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml
index 5bf953d..adf7eac 100644
--- a/.github/workflows/publish-release.yml
+++ b/.github/workflows/publish-release.yml
@@ -16,8 +16,9 @@ jobs:
         uses: actions/checkout@v3
 
       - name: Install JDK 11
-        uses: actions/setup-java@v1
+        uses: actions/setup-java@v3
         with:
+          distribution: 'zulu'
           java-version: 11
 
       - name: Upload release
diff --git a/.github/workflows/publish-snapshot.yml b/.github/workflows/publish-snapshot.yml
index 9d93a16..94c6b28 100644
--- a/.github/workflows/publish-snapshot.yml
+++ b/.github/workflows/publish-snapshot.yml
@@ -16,8 +16,9 @@ jobs:
         uses: actions/checkout@v3
 
       - name: Install JDK 11
-        uses: actions/setup-java@v1
+        uses: actions/setup-java@v3
         with:
+          distribution: 'zulu'
           java-version: 11
 
       - name: Retrieve version
diff --git a/build.gradle b/build.gradle
index 3532d1f..d38498b 100755
--- a/build.gradle
+++ b/build.gradle
@@ -64,7 +64,7 @@ repositories {
 dependencies {
   implementation localGroovy()
   implementation gradleApi()
-  api "guru.nidi:graphviz-java:0.8.1"
+  api "guru.nidi:graphviz-java:0.18.1"
 
   testImplementation 'junit:junit:4.13.2'
   testImplementation "com.android.tools.build:gradle:7.0.4"
@@ -90,4 +90,5 @@ test {
   testLogging {
     exceptionFormat "full"
   }
+  jvmArgs("-Xmx2048m")
 }
diff --git a/gradle.properties b/gradle.properties
index 6d78bc5..90c2161 100755
--- a/gradle.properties
+++ b/gradle.properties
@@ -18,4 +18,6 @@ POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
 POM_LICENCE_DIST=repo
 
 POM_DEVELOPER_ID=vanniktech
-POM_DEVELOPER_NAME=Niklas Baudy
\ No newline at end of file
+POM_DEVELOPER_NAME=Niklas Baudy
+
+org.gradle.jvmargs=-Xmx2048m
diff --git a/src/main/kotlin/com/vanniktech/dependency/graph/generator/DependencyGraphGenerator.kt b/src/main/kotlin/com/vanniktech/dependency/graph/generator/DependencyGraphGenerator.kt
index 2002746..50d80ca 100644
--- a/src/main/kotlin/com/vanniktech/dependency/graph/generator/DependencyGraphGenerator.kt
+++ b/src/main/kotlin/com/vanniktech/dependency/graph/generator/DependencyGraphGenerator.kt
@@ -1,9 +1,10 @@
 package com.vanniktech.dependency.graph.generator
 
 import com.vanniktech.dependency.graph.generator.DependencyGraphGeneratorExtension.Generator
-import guru.nidi.graphviz.attribute.Font
+import guru.nidi.graphviz.attribute.GraphAttr
 import guru.nidi.graphviz.attribute.Label
 import guru.nidi.graphviz.attribute.Rank
+import guru.nidi.graphviz.attribute.Rank.RankType
 import guru.nidi.graphviz.attribute.Shape
 import guru.nidi.graphviz.model.Factory.graph
 import guru.nidi.graphviz.model.Factory.mutGraph
@@ -25,14 +26,11 @@ internal class DependencyGraphGenerator(
   private val nodes = mutableMapOf<String, MutableNode>()
 
   @Suppress("Detekt.SpreadOperator") fun generateGraph(): MutableGraph {
-    val graph = mutGraph("G").setDirected(true)
-
+    val graph = mutGraph("G").setDirected(true).graphAttrs().add(GraphAttr.dpi(100))
     generator.label?.let {
       graph.graphAttrs().add(it)
     }
 
-    graph.nodeAttrs().add(Font.name("Times New Roman"))
-
     val projects = (if (project.subprojects.size > 0) project.subprojects else setOf(project))
       .filter { generator.includeProject(it) }
 
@@ -67,7 +65,7 @@ internal class DependencyGraphGenerator(
       graph.add(
         graph()
           .graphAttr()
-          .with(Rank.SAME)
+          .with(Rank.inSubgraph(RankType.SAME))
           .with(*rootNodes.map { mutNode(it) }.toTypedArray())
       )
     }
diff --git a/src/main/kotlin/com/vanniktech/dependency/graph/generator/DependencyGraphGeneratorTask.kt b/src/main/kotlin/com/vanniktech/dependency/graph/generator/DependencyGraphGeneratorTask.kt
index f9fea21..0234453 100644
--- a/src/main/kotlin/com/vanniktech/dependency/graph/generator/DependencyGraphGeneratorTask.kt
+++ b/src/main/kotlin/com/vanniktech/dependency/graph/generator/DependencyGraphGeneratorTask.kt
@@ -25,12 +25,15 @@ import java.io.File
   }
 
   @TaskAction fun run() {
-    File(outputDirectory, generator.outputFileNameDot).writeText(graph.toString())
+    val dot = File(outputDirectory, generator.outputFileNameDot)
+    dot.writeText(graph.toString())
 
     val graphviz = Graphviz.fromGraph(graph)
 
-    generator.outputFormats.forEach {
+    val renders = generator.outputFormats.map {
       graphviz.render(it).toFile(File(outputDirectory, generator.outputFileName))
     }
+
+    listOf(dot).plus(renders).forEach { logger.lifecycle(it.absolutePath) }
   }
 }
diff --git a/src/main/kotlin/com/vanniktech/dependency/graph/generator/ProjectDependencyGraphGenerator.kt b/src/main/kotlin/com/vanniktech/dependency/graph/generator/ProjectDependencyGraphGenerator.kt
index 9ea4998..9f651d8 100644
--- a/src/main/kotlin/com/vanniktech/dependency/graph/generator/ProjectDependencyGraphGenerator.kt
+++ b/src/main/kotlin/com/vanniktech/dependency/graph/generator/ProjectDependencyGraphGenerator.kt
@@ -2,8 +2,10 @@ package com.vanniktech.dependency.graph.generator
 
 import guru.nidi.graphviz.attribute.Color
 import guru.nidi.graphviz.attribute.Font
+import guru.nidi.graphviz.attribute.GraphAttr
 import guru.nidi.graphviz.attribute.Label
 import guru.nidi.graphviz.attribute.Rank
+import guru.nidi.graphviz.attribute.Rank.RankType
 import guru.nidi.graphviz.attribute.Shape
 import guru.nidi.graphviz.attribute.Style
 import guru.nidi.graphviz.model.Factory.graph
@@ -38,9 +40,9 @@ internal class ProjectDependencyGraphGenerator(
     }
     project.allprojects.filter { it.isDependingOnOtherProject() }.forEach { addProject(it) }
 
-    val graph = mutGraph().setDirected(true)
+    val graph = mutGraph().setDirected(true).graphAttrs().add(GraphAttr.dpi(100))
     graph.graphAttrs().add(Label.of(project.name).locate(Label.Location.TOP), Font.size(DEFAULT_FONT_SIZE))
-    graph.nodeAttrs().add(Font.name("Times New Roman"), Style.FILLED)
+    graph.nodeAttrs().add(Style.FILLED)
     projects.forEach { addNode(it, dependencies, graph) }
     rankRootProjects(graph, projects, dependencies)
     addDependencies(dependencies, graph)
@@ -72,7 +74,7 @@ internal class ProjectDependencyGraphGenerator(
     graph.add(
       graph()
         .graphAttr()
-        .with(Rank.SAME)
+        .with(Rank.inSubgraph(RankType.SAME))
         .with(*projects.filter { project -> dependencies.none { it.to == project } }.map { mutNode(it.path) }.toTypedArray())
     )
   }
diff --git a/src/main/kotlin/com/vanniktech/dependency/graph/generator/ProjectDependencyGraphGeneratorTask.kt b/src/main/kotlin/com/vanniktech/dependency/graph/generator/ProjectDependencyGraphGeneratorTask.kt
index 14eb945..83abcd3 100644
--- a/src/main/kotlin/com/vanniktech/dependency/graph/generator/ProjectDependencyGraphGeneratorTask.kt
+++ b/src/main/kotlin/com/vanniktech/dependency/graph/generator/ProjectDependencyGraphGeneratorTask.kt
@@ -25,12 +25,15 @@ import java.io.File
   }
 
   @TaskAction fun run() {
-    File(outputDirectory, projectGenerator.outputFileNameDot).writeText(graph.toString())
+    val dot = File(outputDirectory, projectGenerator.outputFileNameDot)
+    dot.writeText(graph.toString())
 
     val graphviz = Graphviz.fromGraph(graph)
 
-    projectGenerator.outputFormats.forEach {
+    val renders = projectGenerator.outputFormats.map {
       graphviz.render(it).toFile(File(outputDirectory, projectGenerator.outputFileName))
     }
+
+    listOf(dot).plus(renders).forEach { logger.lifecycle(it.absolutePath) }
   }
 }


Test patch:
diff --git a/src/test/java/com/vanniktech/dependency/graph/generator/DependencyGraphGeneratorPluginTest.kt b/src/test/java/com/vanniktech/dependency/graph/generator/DependencyGraphGeneratorPluginTest.kt
index 92a5db4..71cae15 100644
--- a/src/test/java/com/vanniktech/dependency/graph/generator/DependencyGraphGeneratorPluginTest.kt
+++ b/src/test/java/com/vanniktech/dependency/graph/generator/DependencyGraphGeneratorPluginTest.kt
@@ -1,5 +1,7 @@
 package com.vanniktech.dependency.graph.generator
 
+import com.vanniktech.dependency.graph.generator.DependencyGraphGeneratorExtension.Generator
+import com.vanniktech.dependency.graph.generator.DependencyGraphGeneratorExtension.ProjectGenerator
 import org.gradle.api.internal.project.DefaultProject
 import org.gradle.api.plugins.JavaLibraryPlugin
 import org.gradle.testfixtures.ProjectBuilder
@@ -33,7 +35,7 @@ class DependencyGraphGeneratorPluginTest {
     singleProject.evaluate() // Need to call this for afterEvaluate() to pick up.
 
     val task = singleProject.tasks.getByName("generateDependencyGraph") as DependencyGraphGeneratorTask
-    assertEquals(true, task.generator === DependencyGraphGeneratorExtension.Generator.ALL)
+    assertEquals(true, task.generator === Generator.ALL)
     assertEquals("reporting", task.group)
     assertEquals("Generates a dependency graph", task.description)
     assertEquals(File(singleProject.buildDir, "reports/dependency-graph/").toString(), task.outputDirectory.toString())
@@ -45,7 +47,7 @@ class DependencyGraphGeneratorPluginTest {
     singleProject.evaluate() // Need to call this for afterEvaluate() to pick up.
 
     val task = singleProject.tasks.getByName("generateProjectDependencyGraph") as ProjectDependencyGraphGeneratorTask
-    assertEquals(true, task.projectGenerator === DependencyGraphGeneratorExtension.ProjectGenerator.ALL)
+    assertEquals(true, task.projectGenerator === ProjectGenerator.ALL)
     assertEquals("reporting", task.group)
     assertEquals("Generates a project dependency graph", task.description)
     assertEquals(File(singleProject.buildDir, "reports/project-dependency-graph/").toString(), task.outputDirectory.toString())
@@ -77,11 +79,11 @@ class DependencyGraphGeneratorPluginTest {
     )
 
     fun runBuild(): BuildResult {
-      return GradleRunner.create()
+      return GradleRunner.create().withDebug(true)
         .withPluginClasspath()
         .withGradleVersion(gradleVersion)
         .withProjectDir(testProjectDir.root)
-        .withArguments("generateDependencyGraph", "generateProjectDependencyGraph")
+        .withArguments("generateDependencyGraph", "generateProjectDependencyGraph", "-Dorg.gradle.jvmargs=-Xmx2048m", "--stacktrace")
         .build()
     }
 
@@ -89,20 +91,33 @@ class DependencyGraphGeneratorPluginTest {
     assertEquals(TaskOutcome.SUCCESS, result.task(":generateDependencyGraph")?.outcome)
     assertEquals(TaskOutcome.SUCCESS, result.task(":generateProjectDependencyGraph")?.outcome)
 
-    // We don't want to assert the content of the images, just that they exist.
-    assertEquals(true, File(testProjectDir.root, "build/reports/dependency-graph/dependency-graph.png").exists())
-    assertEquals(true, File(testProjectDir.root, "build/reports/dependency-graph/dependency-graph.svg").exists())
+    // We don't want to assert the content of the images, just that they exist and that their path is logged
+    Generator.ALL.outputFormats.forEach {
+      val file = File(testProjectDir.root, "build/reports/dependency-graph/dependency-graph.${it.fileExtension}")
+      assertEquals(true, file.exists())
+      assertEquals(true, file.absolutePath in result.output)
+    }
+    Generator.ALL.outputFormats.map {
+      File(testProjectDir.root, "build/reports/dependency-graph/dependency-graph.${it.fileExtension}")
+    }.forEach {
+      assertEquals(true, it.exists())
+      assertEquals(true, it.absolutePath in result.output)
+    }
 
+    val dependencyGraphDot = File(testProjectDir.root, "build/reports/dependency-graph/dependency-graph.dot")
+    assertEquals(true, dependencyGraphDot.absolutePath in result.output)
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "${testProjectDir.root.name}" ["shape"="rectangle","label"="${testProjectDir.root.name}"]
-        "orgjetbrainskotlinkotlinstdlib" ["shape"="rectangle","label"="kotlin-stdlib"]
-        "orgjetbrainsannotations" ["shape"="rectangle","label"="jetbrains-annotations"]
-        "ioreactivexrxjava2rxjava" ["shape"="rectangle","label"="rxjava"]
-        "orgreactivestreamsreactivestreams" ["shape"="rectangle","label"="reactive-streams"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "${testProjectDir.root.name}" ["label"="${testProjectDir.root.name}","shape"="rectangle"]
+        "orgjetbrainskotlinkotlinstdlib" ["label"="kotlin-stdlib","shape"="rectangle"]
+        "orgjetbrainsannotations" ["label"="jetbrains-annotations","shape"="rectangle"]
+        "ioreactivexrxjava2rxjava" ["label"="rxjava","shape"="rectangle"]
+        "orgreactivestreamsreactivestreams" ["label"="reactive-streams","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "${testProjectDir.root.name}"
         }
@@ -112,24 +127,32 @@ class DependencyGraphGeneratorPluginTest {
         "ioreactivexrxjava2rxjava" -> "orgreactivestreamsreactivestreams"
         }
       """.trimIndent(),
-      File(testProjectDir.root, "build/reports/dependency-graph/dependency-graph.dot").readText()
+      dependencyGraphDot.readText()
     )
 
-    // We don't want to assert the content of the images, just that they exist.
-    assertEquals(true, File(testProjectDir.root, "build/reports/project-dependency-graph/project-dependency-graph.png").exists())
-    assertEquals(true, File(testProjectDir.root, "build/reports/project-dependency-graph/project-dependency-graph.svg").exists())
+    // We don't want to assert the content of the images, just that they exist and that their path is logged
+    ProjectGenerator.ALL.outputFormats.map {
+      File(testProjectDir.root, "build/reports/project-dependency-graph/project-dependency-graph.${it.fileExtension}")
+    }.forEach {
+      assertEquals(true, it.exists())
+      assertEquals(true, it.absolutePath in result.output)
+    }
 
+    val projectDependencyGraphDot = File(testProjectDir.root, "build/reports/project-dependency-graph/project-dependency-graph.dot")
+    assertEquals(true, projectDependencyGraphDot.absolutePath in result.output)
     assertEquals(
       """
         digraph {
-        graph ["fontsize"="35","label"="${testProjectDir.root.name}","labelloc"="t"]
-        node ["fontname"="Times New Roman","style"="filled"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100","label"="${testProjectDir.root.name}","labelloc"="t","fontsize"="35"]
+        node ["style"="filled"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         }
         }
       """.trimIndent(),
-      File(testProjectDir.root, "build/reports/project-dependency-graph/project-dependency-graph.dot").readText()
+      projectDependencyGraphDot.readText()
     )
 
     val secondResult = runBuild()
@@ -244,11 +267,11 @@ class DependencyGraphGeneratorPluginTest {
 
     val empty = testProjectDir.newFolder("empty").run { parentFile.name + name }
 
-    val result = GradleRunner.create()
+    val result = GradleRunner.create().withDebug(true)
       .withPluginClasspath()
       .withGradleVersion("7.4.2")
       .withProjectDir(testProjectDir.root)
-      .withArguments("generateDependencyGraph", "generateProjectDependencyGraph", "app:generateProjectDependencyGraph")
+      .withArguments("generateDependencyGraph", "generateProjectDependencyGraph", "app:generateProjectDependencyGraph", "-Dorg.gradle.jvmargs=-Xmx2048m", "--stacktrace")
       .build()
 
     result.tasks.filter { it.path.contains("DependencyGraph") }.forEach {
@@ -261,17 +284,19 @@ class DependencyGraphGeneratorPluginTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "$app" ["shape"="rectangle","label"="app"]
-        "$lib1" ["shape"="rectangle","label"="lib1"]
-        "$lib" ["shape"="rectangle","label"="lib"]
-        "ioreactivexrxjava2rxjava" ["shape"="rectangle","label"="rxjava"]
-        "orgreactivestreamsreactivestreams" ["shape"="rectangle","label"="reactive-streams"]
-        "orgjetbrainskotlinkotlinstdlib" ["shape"="rectangle","label"="kotlin-stdlib"]
-        "orgjetbrainsannotations" ["shape"="rectangle","label"="jetbrains-annotations"]
-        "$lib2" ["shape"="rectangle","label"="lib2"]
-        "$empty" ["shape"="rectangle","label"="empty"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "$app" ["label"="app","shape"="rectangle"]
+        "$lib1" ["label"="lib1","shape"="rectangle"]
+        "$lib" ["label"="lib","shape"="rectangle"]
+        "ioreactivexrxjava2rxjava" ["label"="rxjava","shape"="rectangle"]
+        "orgreactivestreamsreactivestreams" ["label"="reactive-streams","shape"="rectangle"]
+        "orgjetbrainskotlinkotlinstdlib" ["label"="kotlin-stdlib","shape"="rectangle"]
+        "orgjetbrainsannotations" ["label"="jetbrains-annotations","shape"="rectangle"]
+        "$lib2" ["label"="lib2","shape"="rectangle"]
+        "$empty" ["label"="empty","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "$app"
         "$empty"
@@ -294,13 +319,15 @@ class DependencyGraphGeneratorPluginTest {
 
     fun projectDependencyGraph(label: String) = """
         digraph {
-        graph ["fontsize"="35","label"="$label","labelloc"="t"]
-        node ["fontname"="Times New Roman","style"="filled"]
-        ":app" ["fillcolor"="#ff8a65","shape"="rectangle"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100","label"="$label","labelloc"="t","fontsize"="35"]
+        node ["style"="filled"]
+        ":app" ["shape"="rectangle","fillcolor"="#ff8a65"]
         ":lib1" ["fillcolor"="#ff8a65"]
         ":lib" ["fillcolor"="#ff8a65"]
         ":lib2" ["fillcolor"="#ff8a65"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         ":app"
         }
diff --git a/src/test/java/com/vanniktech/dependency/graph/generator/DependencyGraphGeneratorTest.kt b/src/test/java/com/vanniktech/dependency/graph/generator/DependencyGraphGeneratorTest.kt
index 1f2c40a..55907c0 100644
--- a/src/test/java/com/vanniktech/dependency/graph/generator/DependencyGraphGeneratorTest.kt
+++ b/src/test/java/com/vanniktech/dependency/graph/generator/DependencyGraphGeneratorTest.kt
@@ -79,9 +79,11 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "singleempty" ["shape"="rectangle","label"="singleempty"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "singleempty" ["label"="singleempty","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "singleempty"
         }
@@ -95,7 +97,7 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
+        graph ["dpi"="100"]
         }
       """.trimIndent(),
       DependencyGraphGenerator(singleEmpty, ALL.copy(includeProject = { false })).generateGraph().toString()
@@ -106,9 +108,11 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "singleempty" ["shape"="rectangle","label"="singleempty"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "singleempty" ["label"="singleempty","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "singleempty"
         }
@@ -122,8 +126,8 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         graph "G" {
-        node ["fontname"="Times New Roman"]
-        "singleempty" ["shape"="rectangle","label"="singleempty"]
+        graph ["dpi"="100"]
+        "singleempty" ["label"="singleempty","shape"="rectangle"]
         {
         graph ["rank"="same"]
         "singleempty"
@@ -138,10 +142,11 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        graph ["labeljust"="l","labelloc"="t","label"="my custom header"]
-        node ["fontname"="Times New Roman"]
-        "singleempty" ["shape"="rectangle","label"="singleempty"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100","label"="my custom header","labeljust"="l","labelloc"="t"]
+        "singleempty" ["label"="singleempty","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "singleempty"
         }
@@ -155,9 +160,11 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "singleempty" ["shape"="egg","color"="#ff0099","style"="dotted","label"="singleempty"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "singleempty" ["label"="singleempty","shape"="egg","style"="dotted","color"="#ff0099"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "singleempty"
         }
@@ -171,13 +178,15 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "single" ["shape"="rectangle","label"="single"]
-        "orgjetbrainskotlinkotlinstdlib" ["shape"="rectangle","label"="kotlin-stdlib"]
-        "orgjetbrainsannotations" ["shape"="rectangle","label"="jetbrains-annotations"]
-        "ioreactivexrxjava2rxjava" ["shape"="rectangle","label"="rxjava"]
-        "orgreactivestreamsreactivestreams" ["shape"="rectangle","label"="reactive-streams"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "single" ["label"="single","shape"="rectangle"]
+        "orgjetbrainskotlinkotlinstdlib" ["label"="kotlin-stdlib","shape"="rectangle"]
+        "orgjetbrainsannotations" ["label"="jetbrains-annotations","shape"="rectangle"]
+        "ioreactivexrxjava2rxjava" ["label"="rxjava","shape"="rectangle"]
+        "orgreactivestreamsreactivestreams" ["label"="reactive-streams","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "single"
         }
@@ -203,13 +212,15 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "single" ["shape"="rectangle","label"="single"]
-        "orgjetbrainskotlinkotlinstdlib" ["shape"="rectangle","color"="0.833904937402929 0.4047932090555708 0.5440948801677342","style"="filled","label"="kotlin-stdlib"]
-        "orgjetbrainsannotations" ["shape"="rectangle","color"="0.44658757938141413 0.25639393293458856 0.2315484830185478","style"="filled","label"="jetbrains-annotations"]
-        "ioreactivexrxjava2rxjava" ["shape"="rectangle","color"="0.37947834890750454 0.21008099121996504 0.6969226044909884","style"="filled","label"="rxjava"]
-        "orgreactivestreamsreactivestreams" ["shape"="rectangle","color"="0.3100028267238165 0.7876064423347447 0.6784992909440705","style"="filled","label"="reactive-streams"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "single" ["label"="single","shape"="rectangle"]
+        "orgjetbrainskotlinkotlinstdlib" ["label"="kotlin-stdlib","shape"="rectangle","style"="filled","color"="0.833904937402929 0.4047932090555708 0.5440948801677342"]
+        "orgjetbrainsannotations" ["label"="jetbrains-annotations","shape"="rectangle","style"="filled","color"="0.44658757938141413 0.25639393293458856 0.2315484830185478"]
+        "ioreactivexrxjava2rxjava" ["label"="rxjava","shape"="rectangle","style"="filled","color"="0.37947834890750454 0.21008099121996504 0.6969226044909884"]
+        "orgreactivestreamsreactivestreams" ["label"="reactive-streams","shape"="rectangle","style"="filled","color"="0.3100028267238165 0.7876064423347447 0.6784992909440705"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "single"
         }
@@ -227,11 +238,13 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "single" ["shape"="rectangle","label"="single"]
-        "orgjetbrainskotlinkotlinstdlib" ["shape"="rectangle","label"="kotlin-stdlib"]
-        "ioreactivexrxjava2rxjava" ["shape"="rectangle","label"="rxjava"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "single" ["label"="single","shape"="rectangle"]
+        "orgjetbrainskotlinkotlinstdlib" ["label"="kotlin-stdlib","shape"="rectangle"]
+        "ioreactivexrxjava2rxjava" ["label"="rxjava","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "single"
         }
@@ -247,11 +260,13 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "single" ["shape"="rectangle","label"="single"]
-        "orgjetbrainskotlinkotlinstdlib" ["shape"="rectangle","label"="kotlin-stdlib"]
-        "orgjetbrainsannotations" ["shape"="rectangle","label"="jetbrains-annotations"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "single" ["label"="single","shape"="rectangle"]
+        "orgjetbrainskotlinkotlinstdlib" ["label"="kotlin-stdlib","shape"="rectangle"]
+        "orgjetbrainsannotations" ["label"="jetbrains-annotations","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "single"
         }
@@ -269,25 +284,27 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "singleempty" ["shape"="rectangle","label"="singleempty"]
-        "orgapachexmlgraphicsbatikgvt" ["shape"="rectangle","label"="batik-gvt"]
-        "orgapachexmlgraphicsbatikbridge" ["shape"="rectangle","label"="batik-bridge"]
-        "orgapachexmlgraphicsbatikscript" ["shape"="rectangle","label"="batik-script"]
-        "orgapachexmlgraphicsbatikawtutil" ["shape"="rectangle","label"="batik-awt-util"]
-        "orgapachexmlgraphicsbatikutil" ["shape"="rectangle","label"="batik-util"]
-        "xmlapisxmlapis" ["shape"="rectangle","label"="xml-apis"]
-        "orgapachexmlgraphicsbatiksvgdom" ["shape"="rectangle","label"="batik-svg-dom"]
-        "orgapachexmlgraphicsbatikanim" ["shape"="rectangle","label"="batik-anim"]
-        "orgapachexmlgraphicsbatikparser" ["shape"="rectangle","label"="batik-parser"]
-        "orgapachexmlgraphicsbatikxml" ["shape"="rectangle","label"="batik-xml"]
-        "orgapachexmlgraphicsbatikdom" ["shape"="rectangle","label"="batik-dom"]
-        "orgapachexmlgraphicsbatikcss" ["shape"="rectangle","label"="batik-css"]
-        "orgapachexmlgraphicsbatikext" ["shape"="rectangle","label"="batik-ext"]
-        "xmlapisxmlapisext" ["shape"="rectangle","label"="xml-apis-ext"]
-        "xalanxalan" ["shape"="rectangle","label"="xalan"]
-        "orgapachexmlgraphicsbatikjs" ["shape"="rectangle","label"="batik-js"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "singleempty" ["label"="singleempty","shape"="rectangle"]
+        "orgapachexmlgraphicsbatikgvt" ["label"="batik-gvt","shape"="rectangle"]
+        "orgapachexmlgraphicsbatikbridge" ["label"="batik-bridge","shape"="rectangle"]
+        "orgapachexmlgraphicsbatikscript" ["label"="batik-script","shape"="rectangle"]
+        "orgapachexmlgraphicsbatikawtutil" ["label"="batik-awt-util","shape"="rectangle"]
+        "orgapachexmlgraphicsbatikutil" ["label"="batik-util","shape"="rectangle"]
+        "xmlapisxmlapis" ["label"="xml-apis","shape"="rectangle"]
+        "orgapachexmlgraphicsbatiksvgdom" ["label"="batik-svg-dom","shape"="rectangle"]
+        "orgapachexmlgraphicsbatikanim" ["label"="batik-anim","shape"="rectangle"]
+        "orgapachexmlgraphicsbatikparser" ["label"="batik-parser","shape"="rectangle"]
+        "orgapachexmlgraphicsbatikxml" ["label"="batik-xml","shape"="rectangle"]
+        "orgapachexmlgraphicsbatikdom" ["label"="batik-dom","shape"="rectangle"]
+        "orgapachexmlgraphicsbatikcss" ["label"="batik-css","shape"="rectangle"]
+        "orgapachexmlgraphicsbatikext" ["label"="batik-ext","shape"="rectangle"]
+        "xmlapisxmlapisext" ["label"="xml-apis-ext","shape"="rectangle"]
+        "xalanxalan" ["label"="xalan","shape"="rectangle"]
+        "orgapachexmlgraphicsbatikjs" ["label"="batik-js","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "singleempty"
         }
@@ -366,14 +383,16 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "single" ["shape"="rectangle","label"="single"]
-        "orgjetbrainskotlinkotlinstdlib" ["shape"="rectangle","label"="kotlin-stdlib"]
-        "orgjetbrainsannotations" ["shape"="rectangle","label"="jetbrains-annotations"]
-        "ioreactivexrxjava2rxjava" ["shape"="rectangle","label"="rxjava"]
-        "orgreactivestreamsreactivestreams" ["shape"="rectangle","label"="reactive-streams"]
-        "ioreactivexrxjava2rxandroid" ["shape"="rectangle","label"="rxandroid"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "single" ["label"="single","shape"="rectangle"]
+        "orgjetbrainskotlinkotlinstdlib" ["label"="kotlin-stdlib","shape"="rectangle"]
+        "orgjetbrainsannotations" ["label"="jetbrains-annotations","shape"="rectangle"]
+        "ioreactivexrxjava2rxjava" ["label"="rxjava","shape"="rectangle"]
+        "orgreactivestreamsreactivestreams" ["label"="reactive-streams","shape"="rectangle"]
+        "ioreactivexrxjava2rxandroid" ["label"="rxandroid","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "single"
         }
@@ -393,15 +412,17 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "multimulti1" ["shape"="rectangle","label"="multi1"]
-        "orgjetbrainskotlinkotlinstdlib" ["shape"="rectangle","label"="kotlin-stdlib"]
-        "orgjetbrainsannotations" ["shape"="rectangle","label"="jetbrains-annotations"]
-        "ioreactivexrxjava2rxjava" ["shape"="rectangle","label"="rxjava"]
-        "orgreactivestreamsreactivestreams" ["shape"="rectangle","label"="reactive-streams"]
-        "multimulti2" ["shape"="rectangle","label"="multi2"]
-        "ioreactivexrxjava2rxandroid" ["shape"="rectangle","label"="rxandroid"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "multimulti1" ["label"="multi1","shape"="rectangle"]
+        "orgjetbrainskotlinkotlinstdlib" ["label"="kotlin-stdlib","shape"="rectangle"]
+        "orgjetbrainsannotations" ["label"="jetbrains-annotations","shape"="rectangle"]
+        "ioreactivexrxjava2rxjava" ["label"="rxjava","shape"="rectangle"]
+        "orgreactivestreamsreactivestreams" ["label"="reactive-streams","shape"="rectangle"]
+        "multimulti2" ["label"="multi2","shape"="rectangle"]
+        "ioreactivexrxjava2rxandroid" ["label"="rxandroid","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "multimulti1"
         "multimulti2"
@@ -427,18 +448,20 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "android" ["shape"="rectangle","label"="android"]
-        "androidarchpersistenceroomruntime" ["shape"="rectangle","label"="persistence-room-runtime"]
-        "androidarchpersistenceroomcommon" ["shape"="rectangle","label"="persistence-room-common"]
-        "comandroidsupportsupportannotations" ["shape"="rectangle","label"="support-annotations"]
-        "androidarchpersistencedbframework" ["shape"="rectangle","label"="persistence-db-framework"]
-        "androidarchpersistencedb" ["shape"="rectangle","label"="persistence-db"]
-        "androidarchcoreruntime" ["shape"="rectangle","label"="core-runtime"]
-        "androidarchcorecommon" ["shape"="rectangle","label"="core-common"]
-        "comandroidsupportsupportcoreutils" ["shape"="rectangle","label"="support-core-utils"]
-        "comandroidsupportsupportcompat" ["shape"="rectangle","label"="support-compat"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "android" ["label"="android","shape"="rectangle"]
+        "androidarchpersistenceroomruntime" ["label"="persistence-room-runtime","shape"="rectangle"]
+        "androidarchpersistenceroomcommon" ["label"="persistence-room-common","shape"="rectangle"]
+        "comandroidsupportsupportannotations" ["label"="support-annotations","shape"="rectangle"]
+        "androidarchpersistencedbframework" ["label"="persistence-db-framework","shape"="rectangle"]
+        "androidarchpersistencedb" ["label"="persistence-db","shape"="rectangle"]
+        "androidarchcoreruntime" ["label"="core-runtime","shape"="rectangle"]
+        "androidarchcorecommon" ["label"="core-common","shape"="rectangle"]
+        "comandroidsupportsupportcoreutils" ["label"="support-core-utils","shape"="rectangle"]
+        "comandroidsupportsupportcompat" ["label"="support-compat","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "android"
         }
@@ -472,11 +495,13 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "android" ["shape"="rectangle","label"="android"]
-        "comsquareupsqldelightruntime" ["shape"="rectangle","label"="sqldelight-runtime"]
-        "comandroidsupportsupportannotations" ["shape"="rectangle","label"="support-annotations"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "android" ["label"="android","shape"="rectangle"]
+        "comsquareupsqldelightruntime" ["label"="sqldelight-runtime","shape"="rectangle"]
+        "comandroidsupportsupportannotations" ["label"="support-annotations","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "android"
         }
@@ -504,14 +529,16 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "android" ["shape"="rectangle","label"="android"]
-        "ioreactivexrxjava2rxandroid" ["shape"="rectangle","label"="rxandroid"]
-        "ioreactivexrxjava2rxjava" ["shape"="rectangle","label"="rxjava"]
-        "orgreactivestreamsreactivestreams" ["shape"="rectangle","label"="reactive-streams"]
-        "orgjetbrainskotlinkotlinstdlib" ["shape"="rectangle","label"="kotlin-stdlib"]
-        "orgjetbrainsannotations" ["shape"="rectangle","label"="jetbrains-annotations"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "android" ["label"="android","shape"="rectangle"]
+        "ioreactivexrxjava2rxandroid" ["label"="rxandroid","shape"="rectangle"]
+        "ioreactivexrxjava2rxjava" ["label"="rxjava","shape"="rectangle"]
+        "orgreactivestreamsreactivestreams" ["label"="reactive-streams","shape"="rectangle"]
+        "orgjetbrainskotlinkotlinstdlib" ["label"="kotlin-stdlib","shape"="rectangle"]
+        "orgjetbrainsannotations" ["label"="jetbrains-annotations","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "android"
         }
@@ -541,14 +568,16 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "android" ["shape"="rectangle","label"="android"]
-        "ioreactivexrxjava2rxjava" ["shape"="rectangle","label"="rxjava"]
-        "orgreactivestreamsreactivestreams" ["shape"="rectangle","label"="reactive-streams"]
-        "ioreactivexrxjava2rxandroid" ["shape"="rectangle","label"="rxandroid"]
-        "orgjetbrainskotlinkotlinstdlib" ["shape"="rectangle","label"="kotlin-stdlib"]
-        "orgjetbrainsannotations" ["shape"="rectangle","label"="jetbrains-annotations"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "android" ["label"="android","shape"="rectangle"]
+        "ioreactivexrxjava2rxjava" ["label"="rxjava","shape"="rectangle"]
+        "orgreactivestreamsreactivestreams" ["label"="reactive-streams","shape"="rectangle"]
+        "ioreactivexrxjava2rxandroid" ["label"="rxandroid","shape"="rectangle"]
+        "orgjetbrainskotlinkotlinstdlib" ["label"="kotlin-stdlib","shape"="rectangle"]
+        "orgjetbrainsannotations" ["label"="jetbrains-annotations","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "android"
         }
@@ -578,11 +607,13 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "android" ["shape"="rectangle","label"="android"]
-        "orgjetbrainskotlinkotlinstdlib" ["shape"="rectangle","label"="kotlin-stdlib"]
-        "orgjetbrainsannotations" ["shape"="rectangle","label"="jetbrains-annotations"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "android" ["label"="android","shape"="rectangle"]
+        "orgjetbrainskotlinkotlinstdlib" ["label"="kotlin-stdlib","shape"="rectangle"]
+        "orgjetbrainsannotations" ["label"="jetbrains-annotations","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "android"
         }
@@ -602,9 +633,11 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "android" ["shape"="rectangle","label"="android"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "android" ["label"="android","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "android"
         }
@@ -622,9 +655,11 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "android" ["shape"="rectangle","label"="android"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "android" ["label"="android","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "android"
         }
@@ -638,11 +673,13 @@ class DependencyGraphGeneratorTest {
     assertEquals(
       """
         digraph "G" {
-        node ["fontname"="Times New Roman"]
-        "rxjava" ["shape"="rectangle","label"="rxjava"]
-        "ioreactivexrxjava2rxjava" ["shape"="rectangle","label"="rxjava"]
-        "orgreactivestreamsreactivestreams" ["shape"="rectangle","label"="reactive-streams"]
+        edge ["dir"="forward"]
+        graph ["dpi"="100"]
+        "rxjava" ["label"="rxjava","shape"="rectangle"]
+        "ioreactivexrxjava2rxjava" ["label"="rxjava","shape"="rectangle"]
+        "orgreactivestreamsreactivestreams" ["label"="reactive-streams","shape"="rectangle"]
         {
+        edge ["dir"="none"]
         graph ["rank"="same"]
         "rxjava"
         }