Documentation
¶
Overview ¶
Package pkg provides the core libraries for Stacktower dependency visualization.
Overview ¶
Stacktower transforms dependency trees into visual tower diagrams where packages rest on what they depend on—inspired by XKCD #2347 ("Dependency"). The pkg directory contains reusable Go libraries organized into four main areas:
- Dependency Resolution (deps, integrations, httputil)
- Graph Data Structures (dag)
- Visualization Rendering (render)
- Data Import/Export (io)
Architecture ¶
The typical data flow through Stacktower:
Package Registry/Manifest
↓
[deps] package (resolve dependencies)
↓
[dag] package (graph structure + transformations)
↓
[render] package (layout + visualization)
↓
SVG/PDF/PNG/JSON output
Quick Start ¶
Resolve dependencies and render a tower visualization:
import (
"context"
"github.com/matzehuels/stacktower/pkg/deps/python"
"github.com/matzehuels/stacktower/pkg/dag/transform"
"github.com/matzehuels/stacktower/pkg/render/tower/layout"
"github.com/matzehuels/stacktower/pkg/render/tower/sink"
)
// 1. Resolve dependencies
resolver, _ := python.Language.Resolver()
g, _ := resolver.Resolve(context.Background(), "fastapi", deps.Options{
MaxDepth: 10,
MaxNodes: 1000,
})
// 2. Transform the graph
g = transform.Normalize(g, nil)
// 3. Compute layout
l := layout.Build(g, 1200, 800)
// 4. Render to SVG
svg := sink.RenderSVG(l, g)
Main Packages ¶
## Dependency Resolution
deps - Core abstractions for dependency resolution. Supports 7 languages (Python, Rust, JavaScript, Go, Ruby, PHP, Java) via language-specific subpackages. See deps/python, deps/rust, etc. for details.
integrations - Low-level HTTP clients for package registries (PyPI, npm, crates.io, RubyGems, Packagist, Maven, Go proxy). Each subpackage implements registry-specific API calls with caching and retry logic.
httputil - Shared HTTP utilities for caching and retry logic.
deps/metadata - Repository metadata enrichment from GitHub/GitLab (stars, maintainers, activity) used for Nebraska ranking and brittle detection.
## Graph Data Structures
dag - Directed acyclic graph optimized for row-based layered layouts. Nodes are organized into horizontal rows with edges connecting consecutive rows only. Supports regular, subdivider, and auxiliary node types.
dag/transform - Graph transformations: transitive reduction, layering, edge subdivision, and span overlap resolution. [transform.Normalize] runs the complete pipeline.
dag/perm - Permutation algorithms including PQ-trees for efficiently generating valid orderings with partial ordering constraints.
## Visualization
render/tower - Stacktower's signature tower visualization. The rendering pipeline: ordering → layout → transform → sink.
- render/tower/ordering: Minimize edge crossings (barycentric, optimal)
- render/tower/layout: Compute block positions and dimensions
- render/tower/transform: Post-layout (merge subdividers, randomize widths)
- render/tower/sink: Output formats (SVG, PDF, PNG, JSON)
- render/tower/styles: Visual styles (simple, hand-drawn)
- render/tower/feature: Analysis (Nebraska ranking, brittle detection)
render/nodelink - Traditional directed graph diagrams using Graphviz.
render - Top-level utilities for format conversion (SVG to PDF/PNG).
## Data Import/Export
io - Import/export dependency graphs in JSON node-link format.
Common Workflows ¶
Parse a manifest file:
parser := python.PoetryLock{}
result, _ := parser.Parse("poetry.lock", deps.Options{})
g := result.Graph.(*dag.DAG)
Enrich with GitHub metadata:
provider, _ := metadata.NewGitHub(token, 24*time.Hour)
opts := deps.Options{MetadataProviders: []deps.MetadataProvider{provider}}
g, _ := resolver.Resolve(ctx, "fastapi", opts)
Render with custom style:
l := layout.Build(g, 1200, 800) style := handdrawn.New(42) svg := sink.RenderSVG(l, g, sink.WithStyle(style))
Analyze maintainer risk:
rankings := feature.RankNebraska(g, 10)
for _, n := range g.Nodes() {
if feature.IsBrittle(n) {
fmt.Printf("Warning: %s may be unmaintained\n", n.ID)
}
}
Testing ¶
Run tests:
go test ./pkg/... # All tests go test ./pkg/dag/... # Specific package go test -run Example # Examples only go test -tags integration ./pkg/... # Include integration tests
Directories
¶
| Path | Synopsis |
|---|---|
|
Package dag provides a directed acyclic graph (DAG) optimized for row-based layered layouts used in tower visualizations.
|
Package dag provides a directed acyclic graph (DAG) optimized for row-based layered layouts used in tower visualizations. |
|
perm
Package perm provides permutation generation algorithms and the PQ-tree data structure for constrained ordering problems.
|
Package perm provides permutation generation algorithms and the PQ-tree data structure for constrained ordering problems. |
|
transform
Package transform provides graph transformations that prepare a DAG for tower rendering.
|
Package transform provides graph transformations that prepare a DAG for tower rendering. |
|
Package deps provides dependency resolution from package registries and manifest files.
|
Package deps provides dependency resolution from package registries and manifest files. |
|
golang
Package golang provides dependency resolution for Go modules.
|
Package golang provides dependency resolution for Go modules. |
|
java
Package java provides dependency resolution for Maven/Java packages.
|
Package java provides dependency resolution for Maven/Java packages. |
|
javascript
Package javascript provides dependency resolution for npm packages.
|
Package javascript provides dependency resolution for npm packages. |
|
metadata
Package metadata provides metadata enrichment from external sources.
|
Package metadata provides metadata enrichment from external sources. |
|
php
Package php provides dependency resolution for PHP Composer packages.
|
Package php provides dependency resolution for PHP Composer packages. |
|
python
Package python provides dependency resolution for Python packages.
|
Package python provides dependency resolution for Python packages. |
|
ruby
Package ruby provides dependency resolution for Ruby gems.
|
Package ruby provides dependency resolution for Ruby gems. |
|
rust
Package rust provides dependency resolution for Rust crates.
|
Package rust provides dependency resolution for Rust crates. |
|
Package httputil provides HTTP utilities for package registry clients.
|
Package httputil provides HTTP utilities for package registry clients. |
|
Package integrations provides HTTP clients for package registry APIs.
|
Package integrations provides HTTP clients for package registry APIs. |
|
crates
Package crates provides an HTTP client for the crates.io API.
|
Package crates provides an HTTP client for the crates.io API. |
|
github
Package github provides an HTTP client for the GitHub API.
|
Package github provides an HTTP client for the GitHub API. |
|
gitlab
Package gitlab provides an HTTP client for the GitLab API.
|
Package gitlab provides an HTTP client for the GitLab API. |
|
goproxy
Package goproxy provides an HTTP client for the Go Module Proxy.
|
Package goproxy provides an HTTP client for the Go Module Proxy. |
|
maven
Package maven provides an HTTP client for Maven Central.
|
Package maven provides an HTTP client for Maven Central. |
|
npm
Package npm provides an HTTP client for the npm registry API.
|
Package npm provides an HTTP client for the npm registry API. |
|
packagist
Package packagist provides an HTTP client for the Packagist API.
|
Package packagist provides an HTTP client for the Packagist API. |
|
pypi
Package pypi provides an HTTP client for the Python Package Index API.
|
Package pypi provides an HTTP client for the Python Package Index API. |
|
rubygems
Package rubygems provides an HTTP client for the RubyGems.org API.
|
Package rubygems provides an HTTP client for the RubyGems.org API. |
|
Package io provides JSON import and export for directed acyclic graphs (DAGs).
|
Package io provides JSON import and export for directed acyclic graphs (DAGs). |
|
Package render provides visualization rendering for dependency graphs.
|
Package render provides visualization rendering for dependency graphs. |
|
nodelink
Package nodelink renders dependency graphs as traditional node-link diagrams.
|
Package nodelink renders dependency graphs as traditional node-link diagrams. |
|
tower
Package tower provides the physical tower visualization engine.
|
Package tower provides the physical tower visualization engine. |
|
tower/feature
Package feature provides analysis features for tower visualizations.
|
Package feature provides analysis features for tower visualizations. |
|
tower/layout
Package layout computes block positions for tower visualizations.
|
Package layout computes block positions for tower visualizations. |
|
tower/ordering
Package ordering provides algorithms for determining the left-to-right arrangement of nodes within each row of a layered graph.
|
Package ordering provides algorithms for determining the left-to-right arrangement of nodes within each row of a layered graph. |
|
tower/sink
Package sink provides output format renderers for tower visualizations.
|
Package sink provides output format renderers for tower visualizations. |
|
tower/styles
Package styles defines visual styles for tower rendering.
|
Package styles defines visual styles for tower rendering. |
|
tower/styles/handdrawn
Package handdrawn provides an XKCD-inspired hand-drawn visual style.
|
Package handdrawn provides an XKCD-inspired hand-drawn visual style. |
|
tower/transform
Package transform provides post-layout transformations for tower rendering.
|
Package transform provides post-layout transformations for tower rendering. |