Sha256: 2c1f40bd443014328b14239aa4cd8cf1e9bf89de0a235e06398530901fe735a5

Contents?: true

Size: 1.73 KB

Versions: 8

Compression:

Stored size: 1.73 KB

Contents

module Gush
  class Graph
    attr_reader :workflow, :filename, :path, :start, :end_node

    def initialize(workflow, options: {})
      @workflow = workflow
      @filename = options.fetch(:filename, "graph.png")
      @path = options.fetch(:path, Pathname.new(Dir.tmpdir).join(filename))
    end

    def viz
      GraphViz.new(:G, graph_options) do |graph|
        set_node_options!(graph)
        set_edge_options!(graph)

        @start = graph.start(shape: 'diamond', fillcolor: '#CFF09E')
        @end_node = graph.end(shape: 'diamond', fillcolor: '#F56991')

        workflow.jobs.each do |job|
          add_job(graph, job)
        end

        graph.output(png: path)
      end
    end

    def path
      @path.to_s
    end

    private
    def add_job(graph, job)
      name = job.class.to_s
      graph.add_nodes(name)

      if job.incoming.empty?
        graph.add_edges(start, name)
      end

      if job.outgoing.empty?
        graph.add_edges(name, end_node)
      else
        job.outgoing.each do |out|
          graph.add_edges(name, out)
        end
      end
    end

    def set_node_options!(graph)
      node_options.each do |key, value|
        graph.node[key] = value
      end
    end

    def set_edge_options!(graph)
      edge_options.each do |key, value|
        graph.edge[key] = value
      end
    end

    def graph_options
      {
        type: :digraph,
        dpi: 200,
        compound: true,
        rankdir: "LR",
        center: true
      }
    end

    def node_options
      {
        shape: "ellipse",
        style: "filled",
        color: "#555555",
        fillcolor: "white"
      }
    end

    def edge_options
      {
        dir: "forward",
        penwidth: 1,
        color: "#555555"
      }
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
gush-0.3 lib/gush/graph.rb
gush-0.2.3 lib/gush/graph.rb
gush-0.2.2 lib/gush/graph.rb
gush-0.2.1 lib/gush/graph.rb
gush-0.2.0 lib/gush/graph.rb
gush-0.1.2 lib/gush/graph.rb
gush-0.1.1 lib/gush/graph.rb
gush-0.1 lib/gush/graph.rb