The mooncakes.io registry as a dependency graph: what depends on what, ranked by direct, transitive and other-owner dependents, with a tree(1)-like CLI.
moon add gaato/mooncakes-graphmoon install gaato/mooncakes-graph/cmd/mooncakes-graphmoon update
moonx gaato/mooncakes-graph/cmd/mooncakes-graph dependents gaato/http| command | output |
|---|---|
| dependents MODULE... | What depends on MODULE, as a tree like tree(1) |
| deps MODULE... | What MODULE depends on, as a tree |
| top [-n N] [--by direct\|transitive\|owners] | The most depended-on modules, as TSV |
| stats | Counts of modules, versions and edges, as JSON |
| versions, modules | Every version, and each module's description, as JSONL |
///|
test "rank modules by their dependents" {
let graph = @graph.Graph::from_records([
@mooncakes_index.VersionRecord::new("a/core", version="0.1.0"),
@mooncakes_index.VersionRecord::new("b/app", version="0.1.0", deps=[
@mooncakes_index.Dep::new("a/core", version="0.1.0"),
]),
@mooncakes_index.VersionRecord::new("c/tool", version="0.2.0", deps=[
@mooncakes_index.Dep::new("b/app", version="0.1.0"),
]),
])
let metrics = graph.metrics()
let core = graph.find("a/core").unwrap()
assert_eq(metrics.get(core, Direct), 1)
assert_eq(metrics.get(core, Transitive), 2)
assert_eq(metrics.ranking(Transitive).map(n => graph.name(n)), [
"a/core", "b/app", "c/tool",
])
}type Graphtest {
let g = @graph.Graph::from_records([
@mooncakes_index.VersionRecord::new("a/core", version="0.1.0"),
@mooncakes_index.VersionRecord::new("b/app", version="0.1.0", deps=[
@mooncakes_index.Dep::new("a/core", version="0.1.0"),
]),
])
let core = g.find("a/core").unwrap()
assert_eq(g.dependents(core).map(n => g.name(n)), ["b/app"])
}test {
let g = @graph.Graph::from_records([
@mooncakes_index.VersionRecord::new("a/core", version="0.1.0"),
@mooncakes_index.VersionRecord::new("b/app", version="0.1.0", deps=[
@mooncakes_index.Dep::new("a/core", version="0.1.0"),
]),
])
let f = g.forest([g.find("a/core").unwrap()], Dependents)
assert_eq(f.modules, 1)
assert_eq(g.name(f.roots[0].children[0].node), "b/app")
}test {
let g = @graph.Graph::from_records([
@mooncakes_index.VersionRecord::new("a/core", version="0.1.0"),
@mooncakes_index.VersionRecord::new("a/core", version="0.2.0"),
@mooncakes_index.VersionRecord::new("b/app", version="0.1.0", deps=[
@mooncakes_index.Dep::new("a/core", version="0.1.0"),
]),
])
let r = g
.requirement(
dependent=g.find("b/app").unwrap(),
dependency=g.find("a/core").unwrap(),
)
.unwrap()
assert_eq(r.asked, Some("0.1.0"))
assert_true(r.behind)
}type Metricstest {
let g = @graph.Graph::from_records([
@mooncakes_index.VersionRecord::new("a/core", version="0.1.0"),
@mooncakes_index.VersionRecord::new("b/app", version="0.1.0", deps=[
@mooncakes_index.Dep::new("a/core", version="0.1.0"),
]),
])
let top = g.metrics().ranking(Transitive)
assert_eq(top.map(n => g.name(n)), ["a/core", "b/app"])
}Install
Download zipThe mooncakes.io registry as a dependency graph: what depends on what, ranked by direct, transitive and other-owner dependents, with a tree(1)-like CLI.