Add support for Sankey diagrams

finchie
Apr 23, 2024, 6:47 AM
YA5ITLOV2UWAQZWFJND2WM45DLWG7PTECNJQOLPZAHH2GETPI3HQC

Dependencies

  • [2] C43IWI7G Move visualization logic into separate module
  • [3] JVYWRCPT Add basic chart visualisation
  • [4] B2L26LOA Store index of dependency nodes
  • [5] LOR3KOXG Parse JSON output from `cargo build --timings`
  • [6] 7CVIL7UJ Create simple metadata parser
  • [7] ZPFD3275 Switch from `cargo_metadata`+`petgraph` to `guppy`

Change contents

  • file addition: sankey.rs (----------)
    [2.21]
    use crate::timings;
    use guppy::graph::{DependencyDirection, PackageGraph};
    pub fn nodes(graph: &PackageGraph) -> Vec<&str> {
    graph.packages().map(|pkg| pkg.name()).collect()
    }
    pub fn links<'graph>(
    graph: &'graph PackageGraph,
    timings: &timings::Output,
    ) -> Vec<(&'graph str, &'graph str, f64)> {
    let package_set = graph.resolve_all();
    let mut links = Vec::with_capacity(package_set.len());
    for link in package_set.links(DependencyDirection::Forward) {
    let (from, to) = link.endpoints();
    let time_taken = timings.pkg_time(to.id()).unwrap_or(0_f64);
    // Can't just set the edge weight to duration - if the package has N dependents
    // it would appear to take N times longer, just need to divide duration by
    // direct dependents to fix
    let direct_dependents = to
    .direct_links_directed(DependencyDirection::Reverse)
    .count();
    // Make sure to not divide by 0
    let edge_weight = if direct_dependents == 0 {
    time_taken
    } else {
    time_taken / (direct_dependents as f64)
    };
    links.push((from.name(), to.name(), edge_weight));
    }
    links
    }
  • replacement in src/visualize/mod.rs at line 3
    [2.76][2.76:171]()
    use charming::series::{GraphLayoutForce, Series};
    use charming::{series, Chart, HtmlRenderer};
    [2.76]
    [2.171]
    use charming::series::{Graph, GraphLayoutForce, Sankey, Series};
    use charming::{Chart, HtmlRenderer};
  • edit in src/visualize/mod.rs at line 8
    [2.215]
    [2.215]
    mod sankey;
  • edit in src/visualize/mod.rs at line 13
    [2.274]
    [2.274]
    Sankey,
  • replacement in src/visualize/mod.rs at line 19
    [2.424][2.424:457]()
    series::Graph::new()
    [2.424]
    [2.457]
    Graph::new()
  • edit in src/visualize/mod.rs at line 29
    [2.915]
    [2.915]
    Style::Sankey => Sankey::new()
    .nodes(sankey::nodes(graph))
    .links(sankey::links(graph, timings))
    .into(),
  • replacement in src/main.rs at line 14
    [3.897][2.1137:1214]()
    visualize::for_style(visualize::Style::Graph, &package_graph, &timings);
    [3.897]
    [3.924]
    visualize::for_style(visualize::Style::Sankey, &package_graph, &timings);