pkg

package
v0.2.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 23, 2025 License: Apache-2.0 Imports: 0 Imported by: 0

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:

  1. Dependency Resolution (deps, integrations, httputil)
  2. Graph Data Structures (dag)
  3. Visualization Rendering (render)
  4. 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/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
dag
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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL