Skip to content

Instantly share code, notes, and snippets.

@MasseGuillaume
Created June 15, 2018 13:48
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 MasseGuillaume/990898413e7fb7013792034b09055c1f to your computer and use it in GitHub Desktop.
Save MasseGuillaume/990898413e7fb7013792034b09055c1f to your computer and use it in GitHub Desktop.
// see https://github.com/scalacenter/scaladex/blob/master/CONTRIBUTING.md
// import $ivy.`io.verizon.quiver::core:7.0.19`
import quiver._
import ch.epfl.scala.index.model.{Project, Release}
import ch.epfl.scala.index.model.release.ScalaDependency
import ch.epfl.scala.index.data.{DataPaths, LocalPomRepository}
import ch.epfl.scala.index.data.project.ProjectConvert
import ch.epfl.scala.index.data.github.GithubDownload
import ch.epfl.scala.index.data.maven.PomsReader
import scala.collection.mutable.{Map => MMap, Set => MSet}
import scala.util.Success
import java.nio.file.{Files, Paths}
import java.nio.charset.StandardCharsets
import System.{lineSeparator => nl}
val comunity = Set(
"47deg/github4s",
"akka/akka",
"akka/akka-http",
"akka/akka-persistence-cassandra",
"alexarchambault/argonaut-shapeless",
"alexarchambault/scalacheck-shapeless",
"allanrenucci/scala-xml-quote",
"argonaut-io/argonaut",
"atnos-org/eff",
"bmc/classutil",
"bmc/grizzled-scala",
"Chymyst/curryhoward",
"circe/circe",
"circe/circe-config",
"coursier/coursier",
"denisrosset/algebra",
"dispatch/reboot",
"dnvriend/akka-persistence-jdbc",
"eed3si9n/expecty",
"eed3si9n/gigahorse",
"eed3si9n/sjson-new",
"ensime/pcplod",
"ensime/scala-debugger",
"erikvanoosten/metrics-scala",
"estatico/scala-newtype",
"etorreborre/specs2",
"FasterXML/jackson-module-scala",
"foundweekends/giter8",
"fthomas/refined",
"fthomas/singleton-ops",
"functional-streams-for-scala/fs2",
"ghik/silencer",
"hairyfotr/linter",
"hseeberger/akka-http-json",
"http4s/blaze",
"http4s/http4s",
"http4s/http4s-websocket",
"http4s/parboiled2",
"Ichoran/scala-collections-laws",
"japgolly/nyaya",
"json4s/json4s",
"julien-truffaut/Monocle",
"kxbmap/configs",
"lagom/lagom",
"lift/framework",
"lightbend/genjavadoc",
"lightbend/lightbend-emoji",
"lightbend/migration-manager",
"lightbend/scala-logging",
"lightbend/scala-sculpt",
"lightbend/ssl-config",
"lihaoyi/acyclic",
"lihaoyi/ammonite",
"lihaoyi/autowire",
"lihaoyi/fastparse",
"lihaoyi/geny",
"lihaoyi/pprint",
"lihaoyi/scalatags",
"lihaoyi/scalatex",
"lihaoyi/utest",
"Log4s/log4s",
"lomigmegard/akka-http-cors",
"marklister/base64",
"mdedetrich/scalajson",
"milessabin/macro-compat",
"milessabin/shapeless",
"monix/minitest",
"mpilquist/simulacrum",
"nbronson/scala-stm",
"non/jawn",
"non/jawn",
"non/kind-projector",
"non/spire",
"nscala-time/nscala-time",
"olafurpg/metaconfig",
"olafurpg/metaconfig",
"OlegYch/multibot",
"ornicar/scalachess",
"ornicar/scalalib",
"pathikrit/better-files",
"paulbutcher/ScalaMock",
"playframework/cachecontrol",
"playframework/play-doc",
"playframework/play-json",
"playframework/play-webgoat",
"playframework/play-ws",
"playframework/playframework",
"playframework/twirl",
"plokhotnyuk/jsoniter-scala",
"propensive/magnolia",
"rickynils/scalacheck",
"rossabaker/jawn-fs2",
"rssh/scala-gopher",
"sbt/io",
"sbt/librarymanagement",
"sbt/sbinary",
"sbt/sbt",
"sbt/sbt-testng",
"sbt/util",
"sbt/zinc",
"scala-ide/scala-refactoring",
"scala-ide/scalariform",
"scala-js/scala-js",
"scala-js/scala-js",
"scala-records/scala-records",
"scala/scala-async",
"scala/scala-collection-compat",
"scala/scala-continuations",
"scala/scala-java8-compat",
"scala/scala-parser-combinators",
"scala/scala-partest",
"scala/scala-swing",
"scalacenter/scaladex",
"scalacommunitybuild/case-app",
"scalacommunitybuild/fansi",
"scalacommunitybuild/monix",
"scalacommunitybuild/paradise",
"scalacommunitybuild/pureconfig",
"scalacommunitybuild/scalafix",
"scalacommunitybuild/scalameta",
"scalacommunitybuild/ScalaPB",
"scalacommunitybuild/scalasti",
"scalacommunitybuild/scalatest",
"scalacommunitybuild/scapegoat",
"scalacommunitybuild/semanticdb-sbt",
"scalacommunitybuild/sourcecode",
"scalacommunitybuild/sttp",
"scalacommunitybuild/upickle-pprint",
"scalaj/scalaj-http",
"scalameter/scalameter",
"scalapb/Lenses",
"scalaprops/scalaprops",
"scalastyle/scalastyle",
"scalaz/scalaz",
"scalaz/scalaz",
"scalikejdbc/scalikejdbc",
"scallop/scallop",
"scodec/scodec",
"scodec/scodec-bits",
"scopt/scopt",
"scoverage/scalac-scoverage-plugin",
"SethTisue/breeze",
"SethTisue/paradox",
"SethTisue/scalafmt",
"sirthias/parboiled",
"sirthias/parboiled2",
"sirthias/scala-ssh",
"Sizmek/fast-string-interpolator",
"sksamuel/elastic4s",
"sksamuel/exts",
"slick/slick",
"softwaremill/akka-http-session",
"spray/spray-json",
"TomasMikula/pascal",
"tpolecat/atto",
"tpolecat/tut",
"twitter/util",
"typelevel/catalysts",
"typelevel/cats",
"typelevel/cats-effect",
"typelevel/discipline",
"typelevel/machinist",
"typelevel/mouse",
"typelevel/paiges",
"typesafehub/akka-contrib-extra",
"typesafehub/conductr-lib",
"underscoreio/doodle",
"unfiltered/unfiltered",
"wartremover/wartremover",
"wheaties/TwoTails",
"zainab-ali/fs2-reactive-streams"
)
val paths = DataPaths(List(
"../scaladex-contrib",
"../scaladex-index",
"../scaladex-credentials"
))
// val paths = DataPaths(Nil)
val projectConverter = new ProjectConvert(paths)
val centralPoms = PomsReader(LocalPomRepository.MavenCentral, paths).load()
val projectsAndReleases = projectConverter(centralPoms.collect {
case Success(pomAndMeta) => pomAndMeta
})
// ========
val projectLookup = MMap.empty[Release.Reference, Project]
projectsAndReleases.foreach{ case (project, releases) =>
releases.foreach(release => projectLookup += release.reference -> project)
}
def show(project: Project): String = {
import project._
s"$organization/$repository"
}
def filterDependency(dependency: ScalaDependency): Boolean = {
import dependency.reference._
dependency.scope == Some("compile") &&
! (
(organization == "scala" && repository == "scala") ||
(organization == "scala-js" && repository == "scala-js") ||
(organization == "scala-native" && repository == "scala-native")
)
}
val projects = projectsAndReleases.map{ case (project, _) => LNode(show(project), ()) }
val dependencies =
for {
(project, releases) <- projectsAndReleases if (comunity.contains(show(project)))
release <- releases
dependency <- release.scalaDependencies
if filterDependency(dependency)
dependentProject <- projectLookup.get(dependency.reference).toList
} yield LEdge(show(project), show(dependentProject), ())
val graph = empty[String, Unit, Unit].addNodes(projects).addEdges(dependencies)
val style =
"""|
| graph [ bgcolor=lightgray, resolution=128, fontname=Arial, fontcolor=blue,
| fontsize=12 ];
| node [ fontname=Arial, fontcolor=blue, fontsize=11];
| edge [ fontname=Helvetica, fontcolor=red, fontsize=10 ];
|
|""".stripMargin
val dotContent = viz.graphviz(graph, orient = viz.Portrait)
// val h :: t = dotContent.split(nl).toList
// val out = (h :: style :: t).mkString(nl)
Files.write(Paths.get("small.dot"), dotContent.getBytes(StandardCharsets.UTF_8))
// Files.write(Paths.get("small.dot"), out.getBytes(StandardCharsets.UTF_8))
// dot -Tsvg out.dot > dot.svg && chromium dot.svg
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment