- Added some stuff to MANIFEST.SKIP
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Producer / TTSchema.pm
CommitLineData
2b2601b5 1package SQL::Translator::Producer::TTSchema;
2
fcc6f51d 3# -------------------------------------------------------------------
821a0fde 4# $Id$
fcc6f51d 5# -------------------------------------------------------------------
977651a5 6# Copyright (C) 2002-4 SQLFairy Authors
fcc6f51d 7#
8# This program is free software; you can redistribute it and/or
9# modify it under the terms of the GNU General Public License as
10# published by the Free Software Foundation; version 2.
11#
12# This program is distributed in the hope that it will be useful, but
13# WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15# General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, write to the Free Software
19# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20# 02111-1307 USA
21# -------------------------------------------------------------------
22
2b2601b5 23=pod
24
25=head1 NAME
26
046d668a 27SQL::Translator::Producer::TTSchema -
fcc6f51d 28 Produces output using the Template Toolkit from a SQL schema
29
30=head1 SYNOPSIS
31
32 use SQL::Translator;
33 my $translator = SQL::Translator->new(
34 from => 'MySQL',
35 filename => 'foo_schema.sql',
36 to => 'TTSchema',
37 producer_args => {
046d668a 38 ttfile => 'foo_template.tt', # Template file to use
39
40 # Extra template variables
41 ttargs => {
42 author => "Mr Foo",
43 },
9d6bd3c7 44
45 # Template config options
46 ttargs => {
47 INCLUDE_PATH => '/foo/templates',
48 },
fcc6f51d 49 },
50 );
51 print $translator->translate;
52
53=head1 DESCRIPTION
54
55Produces schema output using a given Template Tookit template.
56
91c59bcf 57It needs one additional producer_arg of C<ttfile> which is the file
046d668a 58name of the template to use. This template will be passed a variable
59called C<schema>, which is the C<SQL::Translator::Producer::Schema> object
60created by the parser. You can then use it to walk the schema via the
61methods documented in that module.
91c59bcf 62
63Here's a brief example of what the template could look like:
64
65 database: [% schema.database %]
66 tables:
67 [% FOREACH table = schema.get_tables %]
68 [% table.name %]
69 ================
70 [% FOREACH field = table.get_fields %]
71 [% field.name %] [% field.data_type %]([% field.size %])
72 [% END -%]
73 [% END %]
fcc6f51d 74
75See F<t/data/template/basic.tt> for a more complete example.
76
046d668a 77The template will also get the set of extra variables given as a hashref via the
9d6bd3c7 78C<tt_vars> producer arg.
046d668a 79
80You can set any of the options used to initiallize the Template object by
9d6bd3c7 81adding a tt_conf producer_arg. See Template Toolkit docs for details of
fcc6f51d 82the options.
9d6bd3c7 83(Note that the old style of passing this config directly in the producer args
84has been deprecated).
85
fcc6f51d 86
87 $translator = SQL::Translator->new(
88 to => 'TT',
89 producer_args => {
90 ttfile => 'foo_template.tt',
10f36920 91 ttargs => {},
9d6bd3c7 92 tt_conf = {
93 INCLUDE_PATH => '/foo/templates/tt',
94 INTERPOLATE => 1,
95 }
fcc6f51d 96 },
97 );
2b2601b5 98
91c59bcf 99You can use this producer to create any type of text output you like,
100even using it to create your own versions of what the other producers
101make. For example, you could create a template that translates the
102schema into MySQL's syntax, your own HTML documentation, your own
103Class::DBI classes (or some other code) -- the opportunities are
104limitless!
105
046d668a 106=head2 Producer Args
107
108=over 4
109
110=item ttfile
111
112The template file to generate the output with.
113
9d6bd3c7 114=item tt_vars
046d668a 115
116A hash ref of extra variables you want to add to the template.
117
9d6bd3c7 118=item tt_conf
119
120A hash ref of configuration options to pass to the L<Template> object's
121constructor.
122
046d668a 123=back
124
2b2601b5 125=cut
126
fcc6f51d 127# -------------------------------------------------------------------
2b2601b5 128
129use strict;
2b2601b5 130
131use vars qw[ $DEBUG $VERSION @EXPORT_OK ];
821a0fde 132$VERSION = sprintf "%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/;
2b2601b5 133$DEBUG = 0 unless defined $DEBUG;
134
fcc6f51d 135use Template;
2b2601b5 136use Data::Dumper;
137use Exporter;
138use base qw(Exporter);
139@EXPORT_OK = qw(produce);
140
91c59bcf 141use SQL::Translator::Utils 'debug';
2b2601b5 142
143sub produce {
144 my $translator = shift;
fcc6f51d 145 local $DEBUG = $translator->debug;
146 my $scma = $translator->schema;
147 my $args = $translator->producer_args;
148 my $file = delete $args->{'ttfile'} or die "No template file!";
9d6bd3c7 149
150 my $tt_vars = delete $args->{'tt_vars'} || {};
329fc3f0 151 if ( exists $args->{ttargs} ) {
152 warn "Use of 'ttargs' producer arg is deprecated."
153 ." Please use 'tt_vars' instead.\n";
9d6bd3c7 154 %$tt_vars = { %{$args->{ttargs}}, %$tt_vars };
155 }
156
157 my %tt_conf = exists $args->{tt_conf} ? %{$args->{tt_conf}} : ();
158 # sqlt passes the producer args for _all_ producers in, so we use this
159 # grep hack to test for the old usage.
bced3fa7 160 debug(Dumper(\%tt_conf));
9d6bd3c7 161 if ( grep /^[A-Z_]+$/, keys %$args ) {
162 warn "Template config directly in the producer args is deprecated."
163 ." Please use 'tt_conf' instead.\n";
164 %tt_conf = ( %tt_conf, %$args );
329fc3f0 165 }
046d668a 166
2b2601b5 167 debug "Processing template $file\n";
168 my $out;
fcc6f51d 169 my $tt = Template->new(
170 DEBUG => $DEBUG,
91c59bcf 171 ABSOLUTE => 1, # Set so we can use from the command line sensibly
fcc6f51d 172 RELATIVE => 1, # Maybe the cmd line code should set it! Security!
9d6bd3c7 173 %tt_conf,
bced3fa7 174 );
175 debug("Template ERROR: " . Template->error. "\n") if(!$tt);
176 $tt || die "Failed to initialize Template object: ".Template->error;
fcc6f51d 177
bced3fa7 178 my $ttproc = $tt->process(
046d668a 179 $file,
9d6bd3c7 180 { schema => $scma , %$tt_vars },
046d668a 181 \$out
bced3fa7 182 );
183 debug("ERROR: ". $tt->error. "\n") if(!$ttproc);
184 $ttproc or die "Error processing template '$file': ".$tt->error;
2b2601b5 185
186 return $out;
187};
188
1891;
190
fcc6f51d 191# -------------------------------------------------------------------
2b2601b5 192
193=pod
194
fcc6f51d 195=head1 AUTHOR
2b2601b5 196
fcc6f51d 197Mark Addison E<lt>grommit@users.sourceforge.netE<gt>.
2b2601b5 198
199=head1 TODO
200
201B<More template vars?> e.g. [% tables %] as a shortcut for
202[% schema.get_tables %].
203
fcc6f51d 204=head1 SEE ALSO
205
206SQL::Translator.
207
2b2601b5 208=cut