Follow me
RSS feed
My sources
My Viadeo

GraphViz, GraphViz et encore GraphViz...

Greg | 02 Aug 2010

Projets Cela fait un bout de temps (plus de 2 mois) que je n'avais rien écrit sur ce site... Ceci s'explique par une activité professionnelle et personnelle très chargée. Sur ce dernier point, j'ai passé beaucoup de temps sur GraphViz (sans rire). J'ai mainte fois constaté que cet outil est très mal connu des développeurs. Il permet pourtant de rendre de grands services. Cette méconnaissance est probablement due à son image vieillissante. Il existe cependant de très bon outils qui l'utilisent, dont ruby-prof.

Parlons donc de GraphViz !

Ruby/GraphViz

Ce projet avant à grands pas avec neuf nouvelles révisions depuis janvier. Pour mémoire, il s'agit d'un module Ruby permettant de générer des graphs en utilisant GraphViz. Soit de passer de cela :

require 'graphviz'

GraphViz.graph( :G ) { |g|
  g.hello << g.world
}.output( :png => "hello.png" )

A cela :

Ruby/GraphViz output

Au programme des modifications, la plus importante est certainement l'API de parsing. L'idée est de permettre de créer un objet GraphViz, à partir d'un fichier dot, objet que l'on pourra par la suite modifier à sa guise. Par exemple, en partant du script suivant :

digraph G {Hello->World;}

En utilisant le code suivant :

require "graphviz"

g = GraphViz.parse( "hello.dot" ) { |g|
  g.graph[:color] = "blue"
  g.node[:color] = "red"
  g.edge[:color] = "yellow"
  g.get_node("Hello") { |n|
    n.label = "Bonjour"
  }
  g.get_node("World") { |n|
    n.label = "Le Monde"
  }
}

puts g.output(:none => String)

Nous obtenons la sortie suivante :

digraph g {
  Hello [label = "Bonjour"];
  Hello -> World
  World [label = "Le Monde"];
  color = "blue";
  node [color = "red"];
  edge [color = "yellow"];
}

A l'origine, ce parseur avait été développé en utilisant Treetop. Depuis, j'ai totalement repensé la solution et j'utilise maintenant gvpr. Il reste encore quelques détails à régler, mais cette solution m'a fait gagner pas mal de temps. J'ai profité de cette modification pour ajouter à Ruby/GraphViz un nouvel outil : dot2ruby. Comme son nom l'indique, cet utilitaire génère un script Ruby à partir d'un fichier dot.

Sont également apparus deux nouveaux utilitaires : git2gv et xml2gv. Le premier tire son inspiration d'un post de madx et permet de visualiser un repository git sous forme de graph. Le second permet de transformer un fichier XML en graph. Personnellement je l'utilise pour visualiser des enveloppes SOAP.

dotgraph.net

.Graph est un service qui permet facilement d'ajouter dans une page Web une image générée via GraphViz, un peu à la manière de ce que propose WebDot. L'avantage ici est que vous n'avez pas besoin d'installer quoi que ce soit sur votre serveur. Pour cela vous disposez d'une API très simple sous la forme :

http://dotgraph.net/embed/[my_domain]/image?src=http://[my_domain]/my_graph.dot

Placé comme source d'une image, cela vous permettra d'afficher le résultat rendu par GraphViz. Vous avez à votre disposition plusieurs paramètres permettant de contrôler la sortie.

Ce service est actuellement en tests et devrait subir pas mal de changement avant une ouverture à tous.

Leonhard

Voici une vidéo qui vous en dira plus qu'un (trop) long descriptif...

Cet outil, développé avec MacRuby est plus une preuve de concept qu'un véritable outil utilisable. La philosophie est cependant là. Je souhaite faire pas mal d'amélioration dans le code avant de publier une première release. Pour cela j'ai en premier besoin de trouver une solution de syntax highlithing un peu moins expérimentale que celle que j'ai mise en place. Si vous avez des idées sur le sujet, je suis à l'écoute !

Copyright © 2009 - 2011 Grégoire Lejeune.
All documents licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License, except ones with specified licence.
Powered by Jekyll.