By: Júlio Hoffimann
Re-posted from: https://juliohm.github.io/dataviz/DAG-of-Julia-packages/
If your package is listed below, please consider fixing it:
Instructions
This interactive visualization made with D3 shows the Directed Acyclic Graph (DAG) of all registered Julia packages up until 27-June-2017.
The size of a node represents its influence (i.e. out degree) in the DAG. The color represents the required Julia version.
Hover the mouse over the elements to get more information.
Data
The data was extracted from METADATA with the following script:
UPDATE: An updated version of the script can be found in the JuliaGraphsTutorials repository in the form of a Jupyter notebook. Additional information about the Julia package system is extracted therein with the GitHub.jl package.
using JSON
using LightGraphs
using ProgressMeter
# find all packages in METADATA
pkgs = readdir(Pkg.dir("METADATA"))
filterfunc = p -> isdir(joinpath(Pkg.dir("METADATA"), p)) && p ∉ [".git",".test"]
pkgs = filter(filterfunc, pkgs)
# assign each package an id
pkgdict = Dict{String,Int}()
for (i,pkg) in enumerate(pkgs)
push!(pkgdict, pkg => i)
end
# build DAG
G = DiGraph(length(pkgs))
@showprogress 1 "Building graph..." for pkg in pkgs
children = Pkg.dependents(pkg)
for c in children
add_edge!(G, pkgdict[pkg], pkgdict[c])
end
end
# find required Julia version
juliaversions = String[]
for pkg in pkgs
versiondir = joinpath(Pkg.dir("METADATA"), pkg, "versions")
if isdir(versiondir)
latestversion = readdir(versiondir)[end]
reqfile = joinpath(versiondir, latestversion, "requires")
juliaversion = string(get(Pkg.Reqs.parse(reqfile), "julia", "NA"))
push!(juliaversions, juliaversion)
else
push!(juliaversions, "BOGUS")
end
end
# construct JSON
nodes = [Dict("id"=>pkgs[v],
"indegree"=>indegree(G,v),
"outdegree"=>outdegree(G,v),
"juliaversion"=>juliaversions[v]) for v in vertices(G)]
links = [Dict("source"=>pkgs[u], "target"=>pkgs[v]) for (u,v) in edges(G)]
data = Dict("nodes"=>nodes, "links"=>links)
# write to file
open("DAG-Julia-Pkgs.json", "w") do f
JSON.print(f, data, 2)
end