Skip to content

Instantly share code, notes, and snippets.

@ulaserdegor
Last active December 28, 2023 09:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ulaserdegor/cfb30dbf61b23927e2c3dc01b55c2335 to your computer and use it in GitHub Desktop.
Save ulaserdegor/cfb30dbf61b23927e2c3dc01b55c2335 to your computer and use it in GitHub Desktop.
tasks.register('featuresHepsiexpressDependencyGraph') {
doLast {
def dot = new File(rootProject.buildDir, 'reports/dependency-graph/project.dot')
dot.parentFile.mkdirs()
dot.delete()
def rootProjectPath = ':features:hepsiexpress'
dot << 'digraph {\n'
dot << " graph [label=\"${rootProjectPath}\\n \",labelloc=t,fontsize=30,ranksep=1.4];\n"
dot << ' node [style=filled, fillcolor="#8F21BB"];\n'
dot << ' rankdir=TR;' // Şemayı dikeyden yataya çevir
def rootProject = project(rootProjectPath)
def projects = new LinkedHashSet<Project>()
def dependencies = new LinkedHashMap<Tuple2<Project, Project>, List<String>>()
def queue = [rootProject]
while (!queue.isEmpty()) {
def project = queue.remove(0)
queue.addAll(project.childProjects.values())
project.configurations.configureEach { config ->
config.dependencies
.withType(ProjectDependency)
.collect { it.dependencyProject }
.each { dependency ->
if (project != dependency) {
projects.add(project)
projects.add(dependency)
def graphKey = new Tuple2<Project, Project>(project, dependency)
def traits = dependencies.computeIfAbsent(graphKey) { new ArrayList<String>() }
if (project.path == rootProjectPath || project == rootProject) {
traits.add('style=invis')
} else if (config.name.toLowerCase().endsWith('implementation')) {
traits.add('style=dotted')
} else if (config.name.toLowerCase().endsWith('api')) {
traits.add('color=green')
} else {
//traits.add('color=green')
}
}
}
}
}
projects = projects.sort { it.path }
dot << '\n # Projects\n\n'
for (project in projects) {
def traits = []
if (project == rootProject) {
traits.add('shape=box')
}
if (!dependencies.keySet().findAll { it.first() == project }) {
traits.add('fillcolor="#FF0000"') // Bağımlılığı yok
} else {
traits.add('fillcolor="#FFD700"') // Bağımlılığı var
}
dot << " \"${project.path}\" [${traits.join(", ")}];\n"
}
// Filtreleme: Yalnızca bağımlılığı olan projeleri içerir
def projectsWithDependencies = dependencies.keySet().collectMany { [it.first(), it.get(1)] }.toSet()
def projectsWithoutDependencies = projects.findAll { project -> !projectsWithDependencies.contains(project) }
dot << '\n {rank = same;'
for (project in projectsWithoutDependencies) {
dot << " \"${project.path}\";"
}
dot << '}\n'
dot << '\n # Dependencies\n\n'
dependencies.forEach { key, traits ->
dot << " \"${key.first().path}\" -> \"${key.get(1).path}\""
if (!traits.isEmpty()) {
if (traits.contains('style=dotted')) {
dot << " [color=red, ${traits.join(", ")}]"
} else {
dot << " [${traits.join(", ")}]"
}
}
dot << '\n'
}
dot << '}\n'
def p = 'dot -Tpng -O project.dot'.execute([], dot.parentFile)
p.waitFor()
if (p.exitValue() != 0) {
throw new RuntimeException(p.errorStream.text)
}
println("Project module dependency graph created at ${dot.absolutePath}.png")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment