Fix to not test while TT is broken
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Producer / GraphViz.pm
index 8d15372..b86e844 100644 (file)
@@ -1,9 +1,9 @@
 package SQL::Translator::Producer::GraphViz;
 
 # -------------------------------------------------------------------
-# $Id: GraphViz.pm,v 1.9 2004-02-02 20:28:26 allenday Exp $
+# $Id: GraphViz.pm,v 1.13 2007-05-07 20:58:56 mwz444 Exp $
 # -------------------------------------------------------------------
-# Copyright (C) 2003 Ken Y. Clark <kclark@cpan.org>
+# Copyright (C) 2002-4 SQLFairy Authors
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License as
@@ -20,6 +20,161 @@ package SQL::Translator::Producer::GraphViz;
 # 02111-1307  USA
 # -------------------------------------------------------------------
 
+=pod
+
+=head1 NAME
+
+SQL::Translator::Producer::GraphViz - GraphViz producer for SQL::Translator
+
+=head1 SYNOPSIS
+
+  use SQL::Translator;
+
+  my $trans = new SQL::Translator(
+      from => 'MySQL',            # or your db of choice
+      to => 'GraphViz',
+      producer_args => {
+          out_file => 'schema.png',
+          add_color => 1,
+          show_constraints => 1,
+          show_datatypes => 1,
+          show_col_sizes => 1
+      }
+  ) or die SQL::Translator->error;
+
+  $trans->translate or die $trans->error;
+
+=head1 DESCRIPTION
+
+Creates a graph of a schema using the amazing graphviz
+(see http://www.graphviz.org/) application (via
+the GraphViz module).  It's nifty--you should try it!
+
+=head1 PRODUCER ARGS
+
+=over 4
+
+=item * out_file
+
+the name of the file where the graphviz graphic is to be written
+
+=item * layout (DEFAULT: 'dot')
+
+determines which layout algorithm GraphViz will use; possible
+values are 'dot' (the default GraphViz layout for directed graph
+layouts), 'neato' (for undirected graph layouts - spring model)
+or 'twopi' (for undirected graph layouts - circular)
+
+=item * node_shape (DEFAULT: 'record')
+
+sets the node shape of each table in the graph; this can be
+one of 'record', 'plaintext', 'ellipse', 'circle', 'egg',
+'triangle', 'box', 'diamond', 'trapezium', 'parallelogram',
+'house', 'hexagon', or 'octagon'
+
+=item * output_type (DEFAULT: 'png')
+
+sets the file type of the output graphic; possible values are
+'ps', 'hpgl', 'pcl', 'mif', 'pic', 'gd', 'gd2', 'gif', 'jpeg',
+'png', 'wbmp', 'cmap', 'ismap', 'imap', 'vrml', 'vtx', 'mp',
+'fig', 'svg', 'canon', 'plain' or 'text' (see GraphViz for
+details on each of these)
+
+=item * width (DEFAULT: 8.5)
+
+width (in inches) of the output graphic
+
+=item * height (DEFAULT: 11)
+
+height (in inches) of the output grahic
+
+=item * fontsize
+
+custom font size for node and edge labels (note that arbitrarily large
+sizes may be ignored due to page size or graph size constraints)
+
+==item * fontname
+
+custom font name (or full path to font file) for node, edge, and graph
+labels
+
+==item * nodeattrs
+
+reference to a hash of node attribute names and their values; these
+may override general fontname or fontsize parameter
+
+==item * edgeattrs
+
+reference to a hash of edge attribute names and their values; these
+may override general fontname or fontsize parameter
+
+==item * graphattrs
+
+reference to a hash of graph attribute names and their values; these
+may override the general fontname parameter
+
+=item * show_fields (DEFAULT: true)
+
+if set to a true value, the names of the colums in a table will
+be displayed in each table's node
+
+=item * show_fk_only
+
+if set to a true value, only columns which are foreign keys
+will be displayed in each table's node
+
+=item * show_datatypes
+
+if set to a true value, the datatype of each column will be
+displayed next to each column's name; this option will have no
+effect if the value of show_fields is set to false
+
+=item * show_col_sizes
+
+if set to a true value, the size (in bytes) of each CHAR and
+VARCHAR column will be displayed in parentheses next to the
+column's name; this option will have no effect if the value of
+show_fields is set to false
+
+=item * show_constraints
+
+if set to a true value, a field's constraints (i.e., its
+primary-key-ness, its foreign-key-ness and/or its uniqueness)
+will appear as a comma-separated list in brackets next to the
+field's name; this option will have no effect if the value of
+show_fields is set to false
+
+=item * add_color
+
+if set to a true value, the graphic will have a background
+color of 'lightgoldenrodyellow'; otherwise the background
+color will be white
+
+=item * natural_join
+
+if set to a true value, the make_natural_join method of
+SQL::Translator::Schema will be called before generating the
+graph; a true value for join_pk_only (see below) implies a
+true value for this option
+
+=item * join_pk_only
+
+the value of this option will be passed as the value of the
+like-named argument in the make_natural_join method (see
+natural_join above) of SQL::Translator::Schema, if either the
+value of this option or the natural_join option is set to true
+
+=item * skip_fields
+
+the value of this option will be passed as the value of the
+like-named argument in the make_natural_join method (see
+natural_join above) of SQL::Translator::Schema, if either
+the natural_join or join_pk_only options has a true value
+
+=back
+
+=cut
+
 use strict;
 use GraphViz;
 use Data::Dumper;
@@ -27,7 +182,7 @@ use SQL::Translator::Schema::Constants;
 use SQL::Translator::Utils qw(debug);
 
 use vars qw[ $VERSION $DEBUG ];
-$VERSION = sprintf "%d.%02d", q$Revision: 1.9 $ =~ /(\d+)\.(\d+)/;
+$VERSION = sprintf "%d.%02d", q$Revision: 1.13 $ =~ /(\d+)\.(\d+)/;
 $DEBUG   = 0 unless defined $DEBUG;
 
 use constant VALID_LAYOUT => {
@@ -83,27 +238,32 @@ sub produce {
     my $args       = $t->producer_args;
     local $DEBUG   = $t->debug;
 
-    my $out_file        = $args->{'out_file'}    || '';
-    my $layout          = $args->{'layout'}      || 'dot';
-    my $node_shape      = $args->{'node_shape'}  || 'record';
-    my $output_type     = $args->{'output_type'} || 'png';
-    my $width           = defined $args->{'width'} 
-                          ? $args->{'width'} : 8.5;
-    my $height          = defined $args->{'height'}
-                          ? $args->{'height'} : 11;
-    my $show_fields     = defined $args->{'show_fields'} 
-                          ? $args->{'show_fields'} : 1;
-    my $add_color       = $args->{'add_color'};
-    my $natural_join    = $args->{'natural_join'};
-    my $show_fk_only    = $args->{'show_fk_only'};
-    my $show_datatypes  = $args->{'show_datatypes'};
-    my $show_sizes      = $args->{'show_sizes'};
+    my $out_file         = $args->{'out_file'}    || '';
+    my $layout           = $args->{'layout'}      || 'dot';
+    my $node_shape       = $args->{'node_shape'}  || 'record';
+    my $output_type      = $args->{'output_type'} || 'png';
+    my $width            = defined $args->{'width'} 
+                           ? $args->{'width'} : 8.5;
+    my $height           = defined $args->{'height'}
+                           ? $args->{'height'} : 11;
+    my $fontsize         = $args->{'fontsize'};
+    my $fontname         = $args->{'fontname'};
+    my $edgeattrs        = $args->{'edgeattrs'} || {};
+    my $graphattrs       = $args->{'graphattrs'} || {};
+    my $nodeattrs        = $args->{'nodeattrs'} || {};
+    my $show_fields      = defined $args->{'show_fields'} 
+                           ? $args->{'show_fields'} : 1;
+    my $add_color        = $args->{'add_color'};
+    my $natural_join     = $args->{'natural_join'};
+    my $show_fk_only     = $args->{'show_fk_only'};
+    my $show_datatypes   = $args->{'show_datatypes'};
+    my $show_sizes       = $args->{'show_sizes'};
     my $show_constraints = $args->{'show_constraints'};
-    my $join_pk_only    = $args->{'join_pk_only'};
-    my $skip_fields     = $args->{'skip_fields'};
-    my %skip            = map { s/^\s+|\s+$//g; $_, 1 }
-                          split ( /,/, $skip_fields );
-    $natural_join     ||= $join_pk_only;
+    my $join_pk_only     = $args->{'join_pk_only'};
+    my $skip_fields      = $args->{'skip_fields'};
+    my %skip             = map { s/^\s+|\s+$//g; $_, 1 }
+                           split ( /,/, $skip_fields );
+    $natural_join      ||= $join_pk_only;
 
     $schema->make_natural_joins(
         join_pk_only => $join_pk_only,
@@ -132,11 +292,40 @@ sub produce {
         node          => { 
             shape     => $node_shape, 
             style     => 'filled', 
-            fillcolor => 'white' 
-        }
+            fillcolor => 'white',
+        },
     );
     $args{'width'}  = $width  if $width;
     $args{'height'} = $height if $height;
+    # set fontsize for edge and node labels if specified
+    if ($fontsize) {
+        $args{'node'}->{'fontsize'} = $fontsize;
+        $args{'edge'} = {} unless $args{'edge'};
+        $args{'edge'}->{'fontsize'} = $fontsize;        
+    }
+    # set the font name globally for node, edge, and graph labels if
+    # specified (use node, edge, or graph attributes for individual
+    # font specification)
+    if ($fontname) {
+        $args{'node'}->{'fontname'} = $fontname;
+        $args{'edge'} = {} unless $args{'edge'};
+        $args{'edge'}->{'fontname'} = $fontname;        
+        $args{'graph'} = {} unless $args{'graph'};
+        $args{'graph'}->{'fontname'} = $fontname;        
+    }
+    # set additional node, edge, and graph attributes; these may
+    # possibly override ones set before
+    while (my ($key,$val) = each %$nodeattrs) {
+        $args{'node'}->{$key} = $val;
+    }
+    $args{'edge'} = {} if %$edgeattrs && !$args{'edge'};
+    while (my ($key,$val) = each %$edgeattrs) {
+        $args{'edge'}->{$key} = $val;
+    }
+    $args{'graph'} = {} if %$edgeattrs && !$args{'graph'};
+    while (my ($key,$val) = each %$graphattrs) {
+        $args{'graph'}->{$key} = $val;
+    }
 
     my $gv =  GraphViz->new( %args ) or die "Can't create GraphViz object\n";
 
@@ -157,7 +346,7 @@ sub produce {
                 . $_->name
                 . ( $show_datatypes ? '\ ' . $_->data_type : '')
                 . ( $show_sizes && ! $show_datatypes ? '\ ' : '')
-                . ( $show_sizes && $_->data_type =~ /^(VARCHAR2?|CHAR)$/ ? '(' . $_->size . ')' : '')
+                . ( $show_sizes && $_->data_type =~ /^(VAR)?CHAR2?$/i ? '(' . $_->size . ')' : '')
                 . ( $show_constraints ?
                     ( $_->is_primary_key || $_->is_foreign_key || $_->is_unique ? '\ [' : '' )
                     . ( $_->is_primary_key ? 'PK' : '' )
@@ -260,14 +449,16 @@ sub produce {
 
 1;
 
-=pod
-
-=head1 NAME
+# -------------------------------------------------------------------
 
-SQL::Translator::Producer::GraphViz - GraphViz producer for SQL::Translator
+=pod
 
 =head1 AUTHOR
 
 Ken Y. Clark E<lt>kclark@cpan.orgE<gt>
 
+=head1 SEE ALSO
+
+SQL::Translator, GraphViz
+
 =cut