LoginSignup
8
8

More than 5 years have passed since last update.

Ruby | Gviz gem の内部 DSL の基本

Posted at

Ruby | Gviz gem の内部 DSL の基本

概要

Gviz gem の内部 DSL の基本構成要素について。

※ 私は graphviz を単独で使ったことが無い状態で Gviz を利用しはじめています。
その点において、おかしな記述があるかもしれません。

node

ノード。 gviz の DSL では、 route + ノード名(シンボル) によって記述する。
引数が可変長になっているので複数指定も可能。

ソースコード

nodes.rb
require 'gviz'
Graph do
  route :Hubot
  route :Kandan
  route :GitLab, :GitLabCI
  save(:nodes, :png)
end

出力

nodes.png

nodeset によって、定義済みの node のリストにアクセスできます。
Hashを取得したい場合は、 @nodes でアクセスできます。

ソースコード

nodeset.rb
require 'gviz'
require 'pp'

Graph do
  route :Hubot
  route :Kandan
  route :GitLab, :GitLabCI
  pp nodeset
  pp @nodes
end

出力

$ ruby nodeset.rb
[#<struct Gviz::Node id=:Hubot, attrs={}>,
 #<struct Gviz::Node id=:Kandan, attrs={}>,
 #<struct Gviz::Node id=:GitLab, attrs={}>,
 #<struct Gviz::Node id=:GitLabCI, attrs={}>]
 {:Hubot=>#<struct Gviz::Node id=:Hubot, attrs={}>,
 :Kandan=>#<struct Gviz::Node id=:Kandan, attrs={}>,
 :GitLab=>#<struct Gviz::Node id=:GitLab, attrs={}>,
 :GitLabCI=>#<struct Gviz::Node id=:GitLabCI, attrs={}>}

edge

エッジ。gviz の DSL では、 route + エッジ(Hash) によって記述する。
引数が可変長になっているので複数指定も可能。

ソースコード

edges.rb
require 'gviz'
Graph do
  route Kandan: :Hubot
  route Hubot: :Kandan
  route GitLab: :Hubot
  route GitLab: :GitLabCI
  save(:edges, :png)
end

出力

edges.png

edgeset

node と nodeset 、 edge と edgeset は同じ構成なので
edgeset に関する説明は省略。

rank

グラフのランクを以下のシンボルから設定します。

[:same, :min, :max, :source, :sink]

設定例1

rank.rb
require 'gviz'
Graph do
  route Kandan: :Hubot
  route Hubot: :Kandan
  route GitLab: :Hubot
  route GitLab: :GitLabCI
  rank :min, :Kandan
  rank :same, :GitLab, :Hubot
  rank :max, :GitLabCI
  save(:rank1, :png)
end

出力

rank1.png

設定例2

require 'gviz'
Graph do
  route Kandan: :Hubot
  route Hubot: :Kandan
  route GitLab: :Hubot
  route GitLab: :GitLabCI
  rank :max, :Kandan
  rank :same, :GitLab, :Hubot
  rank :min, :GitLabCI
  save(:rank2, :png)
end

出力

rank2.png

subgraph

サブグラフ。

ソースコード

subgraph.rb
require 'gviz'
Graph do
  route Kandan: :Hubot
  route Hubot: :Kandan
  route GitLab: :Hubot
  route GitLab: :GitLabCI
  subgraph do
    global label:'GitLab CI'
    route :GitLabCI => :GitLabCiRunner1
    route :GitLabCI => :GitLabCiRunner2
  end
  save(:subgraph, :png)
end

出力

subgraph.png

参照

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8