Documentation ¶
Overview ¶
Package prettyprinters provides a general interface and concrete implementations for implementing prettyprinters. This package was originally created to facilitate the development of graphviz visualizations for resource graphs, however it is intended to be useful for creating arbitrary output generators so that resource graph data can be used in other applications.
Example (CreateACustomPrintProvider) ¶
package main import ( "fmt" "github.com/asteris-llc/converge/graph" "github.com/asteris-llc/converge/graph/node" "github.com/asteris-llc/converge/prettyprinters" "github.com/asteris-llc/converge/prettyprinters/graphviz" "golang.org/x/net/context" ) func main() { g := graph.New() g.Add(node.New(graph.ID("a"), 1)) g.Add(node.New(graph.ID("a", "b"), 2)) g.Add(node.New(graph.ID("a", "c"), 3)) g.Add(node.New(graph.ID("a", "c", "d"), 4)) g.Add(node.New(graph.ID("a", "c", "e"), 5)) g.Add(node.New(graph.ID("a", "b", "f"), 6)) g.Add(node.New(graph.ID("a", "b", "g"), 7)) g.Add(node.New(graph.ID("a", "c", "d", "h"), 8)) g.Add(node.New(graph.ID("a", "c", "d", "i"), 9)) g.Add(node.New(graph.ID("a", "c", "d", "j"), 10)) g.Add(node.New(graph.ID("a", "c", "e", "k"), 11)) g.Add(node.New(graph.ID("a", "c", "e", "l"), 12)) g.Add(node.New(graph.ID("a", "c", "e", "m"), 13)) g.Add(node.New(graph.ID("a", "b", "f", "n"), 14)) g.Add(node.New(graph.ID("a", "b", "f", "o"), 15)) g.Add(node.New(graph.ID("a", "b", "f", "p"), 16)) g.Add(node.New(graph.ID("a", "b", "g", "q"), 17)) g.Add(node.New(graph.ID("a", "b", "g", "r"), 18)) g.Add(node.New(graph.ID("a", "b", "g", "s"), 19)) g.Connect(graph.ID("a"), graph.ID("a", "b")) g.Connect(graph.ID("a"), graph.ID("a", "c")) g.Connect(graph.ID("a", "c"), graph.ID("a", "c", "d")) g.Connect(graph.ID("a", "c"), graph.ID("a", "c", "e")) g.Connect(graph.ID("a", "b"), graph.ID("a", "b", "f")) g.Connect(graph.ID("a", "b"), graph.ID("a", "b", "g")) g.Connect(graph.ID("a", "c", "d"), graph.ID("a", "c", "d", "h")) g.Connect(graph.ID("a", "c", "d"), graph.ID("a", "c", "d", "i")) g.Connect(graph.ID("a", "c", "d"), graph.ID("a", "c", "d", "j")) g.Connect(graph.ID("a", "c", "e"), graph.ID("a", "c", "e", "k")) g.Connect(graph.ID("a", "c", "e"), graph.ID("a", "c", "e", "l")) g.Connect(graph.ID("a", "c", "e"), graph.ID("a", "c", "e", "m")) g.Connect(graph.ID("a", "b", "f"), graph.ID("a", "b", "f", "n")) g.Connect(graph.ID("a", "b", "f"), graph.ID("a", "b", "f", "o")) g.Connect(graph.ID("a", "b", "f"), graph.ID("a", "b", "f", "p")) g.Connect(graph.ID("a", "b", "g"), graph.ID("a", "b", "g", "q")) g.Connect(graph.ID("a", "b", "g"), graph.ID("a", "b", "g", "r")) g.Connect(graph.ID("a", "b", "g"), graph.ID("a", "b", "g", "s")) numberPrinter := prettyprinters.New(graphviz.New(graphviz.DefaultOptions(), NumberProvider{})) dotCode, _ := numberPrinter.Show(context.Background(), g) fmt.Println(dotCode)
Output:
Example (GenerateAGraphFromAFileOnDisk) ¶
package main import ( "fmt" "os" "github.com/asteris-llc/converge/load" "github.com/asteris-llc/converge/prettyprinters" "github.com/asteris-llc/converge/prettyprinters/graphviz" "github.com/asteris-llc/converge/prettyprinters/graphviz/providers" "golang.org/x/net/context" ) func main() { g, err := load.Load(context.Background(), os.Args[1], false) if err != nil { fmt.Println(err) return } printer := prettyprinters.New(graphviz.New(graphviz.DefaultOptions(), providers.NewRPCProvider())) dotCode, err := printer.Show(context.Background(), g) if err != nil { fmt.Println(err) return } fmt.Println(dotCode) }
Output:
Example (UsingADefaultProvider) ¶
package main import ( "fmt" "github.com/asteris-llc/converge/graph" "github.com/asteris-llc/converge/graph/node" "github.com/asteris-llc/converge/prettyprinters" "github.com/asteris-llc/converge/prettyprinters/graphviz" "golang.org/x/net/context" ) func main() { g := createTestGraph() valuePrinter := prettyprinters.New(graphviz.New(graphviz.DefaultOptions(), graphviz.DefaultProvider())) valueDotCode, _ := valuePrinter.Show(context.Background(), g) fmt.Println(valueDotCode)
Output:
Example (UsingTheIDProvider) ¶
package main import ( "fmt" "github.com/asteris-llc/converge/graph" "github.com/asteris-llc/converge/graph/node" "github.com/asteris-llc/converge/prettyprinters" "github.com/asteris-llc/converge/prettyprinters/graphviz" "golang.org/x/net/context" ) func main() { g := createTestGraph() namePrinter := prettyprinters.New(graphviz.New(graphviz.DefaultOptions(), graphviz.IDProvider())) nameDotCode, _ := namePrinter.Show(context.Background(), g) fmt.Println(nameDotCode)
Output:
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var SubgraphBottomID interface{}
SubgraphBottomID defines the SubgraphID for the bottom subgraph. "⊥" is a reserved SubgraphID and shouldn't be returned as the SubgraphID by any calls to MakeNode.
Functions ¶
This section is empty.
Types ¶
type BasePrinter ¶
type BasePrinter interface{}
BasePrinter is an implementation of some output format that can be used to prettyprint a Directed Graph. Printer is the zero value for these kinds of printers. To get any functionality, printers should implement one or more of the following interfaces.
type EdgePrinter ¶
type EdgePrinter interface { // DrawEdge will be called once for each edge in the graph. It is called with // a graph, the ID of the source vertex, and the ID of the target vertex. It // should return a string representing the edge in the final output, or an // error that will be returned to the user. DrawEdge(graph *graph.Graph, srcNodeID string, dstNodeID string) (Renderable, error) }
EdgePrinter should be implemented by printers that want to render Edges
type EdgeSectionPrinter ¶
type EdgeSectionPrinter interface { // StartEdgeSection will be given a graph and should return a string used to // start the edge section, or an error that will be returned to the user. StartEdgeSection(graph *graph.Graph) (Renderable, error) // FinishEdgeSection will be given a graph and should return a string used to // finish the edge section in the final output, or an error that will be // returned to the user. FinishEdgeSection(graph *graph.Graph) (Renderable, error) }
EdgeSectionPrinter should be implemented by printers that want to render edge sections (TODO: what are these?)
type GraphPrinter ¶
type GraphPrinter interface { // StartPP should take a graph and shall return a string used to start the // graph output, or an error which will be returned to the user. StartPP(graph *graph.Graph) (Renderable, error) // FinishPP will be given a graph and shall return a string used to finalize // graph output, or an error which will be returned to the user. FinishPP(graph *graph.Graph) (Renderable, error) }
GraphPrinter should be implemented by printers that need to add a preamble or addendum to the pretty printed output
type NodePrinter ¶
type NodePrinter interface { // DrawNode will be called once for each node in the graph. The function will // be given a graph and a string ID for the current node in the graph, and // should return a string representing the node in the final output, or an // error that will be returned to the user. DrawNode(graph *graph.Graph, nodeID string) (Renderable, error) }
NodePrinter should be implemented by printers that want to render nodes
type Printer ¶
type Printer struct {
// contains filtered or unexported fields
}
Printer is the top-level structure for a pretty printer.
func New ¶
func New(p BasePrinter) Printer
New creates a new prettyprinter instance from the specified DigraphPrettyPrinter instance.
type Renderable ¶
type Renderable interface { // The Renderable interface should provide an instance of String() to render // the object. fmt.Stringer }
Renderable provides an interface for printable objects
type Subgraph ¶
type Subgraph struct { StartNode *string EndNodes []string ID SubgraphID Nodes []string }
Subgraph is a type that represents a subgraph containing it's ID, it's root node, a list of it's terminal nodes, and any other included nodes.
type SubgraphID ¶
type SubgraphID interface{}
A SubgraphID is an opaque type that is handled by the DigraphPrettyPrinter. SubgraphID must adhere to the following conditions:
- Unique per graph
- Comparable
type SubgraphMap ¶
type SubgraphMap map[SubgraphID]Subgraph
SubgraphMap is a simple type alias for keeping track of SubgraphID -> Subgraph mappings
type SubgraphMarker ¶
type SubgraphMarker struct { SubgraphID SubgraphID // The ID for this subgraph (if Start is true) Start bool // True if this is the start of a new subgraph }
A SubgraphMarker is a structure used to identify graph nodes that mark the beginning or end of a Subgraph. SubgraphMakers are returned by MarkNode(). The SubgraphID field should be set to the name of a unique SubgraphID if start is true. When Start is false the SubgraphID field is ignored.
type SubgraphPrinter ¶
type SubgraphPrinter interface { // MarkNode() is a function used to identify the boundaries of subgraphs // within the larger graph. MarkNode() is called with a graph and the id of a // node within the graph, and should return a *SubgraphMarker with the // SubgraphID and Start fields set to indicate the beginning or end of a // subgraph. If nil is returned the node will be included in the subgraph of // it's parent (or ⊥ if it is not part of any subgraph). // The string "⊥" is reserved for the bottom subgraph element and shouldn't be // used as a NodeID. MarkNode(graph *graph.Graph, nodeID string) *SubgraphMarker // StartSubgraph will be given a graph, the ID of the root node of the // subgraph, and the SubgraphID returned as part of MarkNode(). It should // return the string used to start the subgraph or an error that will be // returned to the user. StartSubgraph(graph *graph.Graph, nodeID string, subgraphID SubgraphID) (Renderable, error) // FinishSubgraph will be given a graph and a SubgraphID returned by MarkNode // and should return a string used to end a subgraph, or an error that will be // returned to the user. FinishSubgraph(graph *graph.Graph, subgraphID SubgraphID) (Renderable, error) }
SubgraphPrinter should be implemented by printers that need to control subgraph rendering (that is, grouping of nodes of any kind)
type VisibleRenderable ¶
type VisibleRenderable interface { Renderable // Visible returns true if the object should be rendered, and false // otherwise. If a consumer chooses to ignore this value, the instance should // still provide a valid string value. Visible() bool }
VisibleRenderable allows checking if a string is visible
func HiddenString ¶
func HiddenString() VisibleRenderable
HiddenString creates a non-renderable string
func RenderableString ¶
func RenderableString(s string, visible bool) VisibleRenderable
RenderableString creates a RenderableString with visibility on or off depending on the value of a boolean parameter.
func SprintfRenderable ¶
func SprintfRenderable(visible bool, fmtStr string, args ...interface{}) VisibleRenderable
SprintfRenderable creates a new visible Renderable from a Sprintf call
func VisibleString ¶
func VisibleString(s string) VisibleRenderable
VisibleString creates a new Renderable that is visible
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package graphviz provides a concrete prettyprinters.DigraphPrettyPrinter implementation for rendering directed graphs as Graphviz-compatible dot source files.
|
Package graphviz provides a concrete prettyprinters.DigraphPrettyPrinter implementation for rendering directed graphs as Graphviz-compatible dot source files. |
providers
Package providers contains an implementation of specific Graphviz PrintProviders that can be used for generating graphs.
|
Package providers contains an implementation of specific Graphviz PrintProviders that can be used for generating graphs. |
Package jsonl implements a pretty printer for JSONL format (jsonlines.org)
|
Package jsonl implements a pretty printer for JSONL format (jsonlines.org) |
Package tmpltools provides extensions to 'text/template' that are useful for prettyprinter formatting.
|
Package tmpltools provides extensions to 'text/template' that are useful for prettyprinter formatting. |