Commit | Line | Data |
2a267f86 |
1 | package SQL::Translator::Producer::POD; |
2 | |
20770e44 |
3 | =head1 NAME |
4 | |
5 | SQL::Translator::Producer::POD - POD producer for SQL::Translator |
6 | |
7 | =head1 SYNOPSIS |
8 | |
9 | use SQL::Translator; |
10 | |
11 | my $t = SQL::Translator->new( parser => '...', producer => 'POD', '...' ); |
12 | print $t->translate; |
13 | |
14 | =head1 DESCRIPTION |
15 | |
ea93df61 |
16 | Creates a POD description of each table, field, index, and constraint. |
17 | A good starting point for text documentation of a schema. You can |
18 | easily convert the output to HTML or text using "perldoc" or other |
20770e44 |
19 | interesting formats using Pod::POM or Template::Toolkit's POD plugin. |
20 | |
21 | =cut |
22 | |
2a267f86 |
23 | use strict; |
f27f9229 |
24 | use warnings; |
0c04c5a2 |
25 | our $VERSION = '1.59'; |
2a267f86 |
26 | |
27 | use SQL::Translator::Schema::Constants; |
28 | use SQL::Translator::Utils qw(header_comment); |
29 | |
2a267f86 |
30 | sub produce { |
31 | my $t = shift; |
32 | my $schema = $t->schema; |
33 | my $schema_name = $schema->name || 'Schema'; |
34 | my $args = $t->producer_args; |
cb002bb5 |
35 | my $title = $args->{'title'} || $schema_name; |
2a267f86 |
36 | |
cb002bb5 |
37 | my $pod = "=pod\n\n=head1 DESCRIPTION\n\n$title\n\n=head1 TABLES\n\n"; |
2a267f86 |
38 | |
39 | for my $table ( $schema->get_tables ) { |
40 | my $table_name = $table->name or next; |
41 | my @fields = $table->get_fields or next; |
42 | $pod .= "=head2 $table_name\n\n=head3 FIELDS\n\n"; |
43 | |
44 | # |
45 | # Fields |
46 | # |
b9124e4b |
47 | for my $field ( @fields ) { |
2a267f86 |
48 | $pod .= "=head4 " . $field->name . "\n\n=over 4\n\n"; |
49 | |
50 | my $data_type = $field->data_type; |
51 | my $size = $field->size; |
52 | $data_type .= "($size)" if $size; |
53 | |
54 | $pod .= "=item * $data_type\n\n"; |
55 | $pod .= "=item * PRIMARY KEY\n\n" if $field->is_primary_key; |
56 | |
57 | my $default = $field->default_value; |
58 | $pod .= "=item * Default '$default' \n\n" if defined $default; |
59 | |
60 | $pod .= sprintf( "=item * Nullable '%s' \n\n", |
61 | $field->is_nullable ? 'Yes' : 'No' ); |
62 | |
63 | $pod .= "=back\n\n"; |
64 | } |
65 | |
66 | # |
67 | # Indices |
68 | # |
69 | if ( my @indices = $table->get_indices ) { |
70 | $pod .= "=head3 INDICES\n\n"; |
71 | for my $index ( @indices ) { |
72 | $pod .= "=head4 " . $index->type . "\n\n=over 4\n\n"; |
ea93df61 |
73 | $pod .= "=item * Fields = " . |
2a267f86 |
74 | join(', ', $index->fields ) . "\n\n"; |
75 | $pod .= "=back\n\n"; |
76 | } |
77 | } |
78 | |
79 | # |
80 | # Constraints |
81 | # |
82 | if ( my @constraints = $table->get_constraints ) { |
83 | $pod .= "=head3 CONSTRAINTS\n\n"; |
84 | for my $c ( @constraints ) { |
85 | $pod .= "=head4 " . $c->type . "\n\n=over 4\n\n"; |
ea93df61 |
86 | $pod .= "=item * Fields = " . |
2a267f86 |
87 | join(', ', $c->fields ) . "\n\n"; |
88 | |
89 | if ( $c->type eq FOREIGN_KEY ) { |
ea93df61 |
90 | $pod .= "=item * Reference Table = L</" . |
b9124e4b |
91 | $c->reference_table . ">\n\n"; |
ea93df61 |
92 | $pod .= "=item * Reference Fields = " . |
93 | join(', ', map {"L</$_>"} $c->reference_fields ) . |
b9124e4b |
94 | "\n\n"; |
2a267f86 |
95 | } |
96 | |
97 | if ( my $update = $c->on_update ) { |
4e4608c6 |
98 | $pod .= "=item * On update = $update\n\n"; |
2a267f86 |
99 | } |
100 | |
101 | if ( my $delete = $c->on_delete ) { |
4e4608c6 |
102 | $pod .= "=item * On delete = $delete\n\n"; |
2a267f86 |
103 | } |
104 | |
105 | $pod .= "=back\n\n"; |
106 | } |
107 | } |
108 | } |
109 | |
b9124e4b |
110 | my $header = ( map { $_ || () } split( /\n/, header_comment('', '') ) )[0]; |
111 | $header =~ s/^Created by //; |
112 | $pod .= "=head1 PRODUCED BY\n\n$header\n\n=cut"; |
113 | |
2a267f86 |
114 | return $pod; |
115 | } |
116 | |
117 | 1; |
118 | |
119 | # ------------------------------------------------------------------- |
120 | # Expect poison from the standing water. |
121 | # William Blake |
122 | # ------------------------------------------------------------------- |
123 | |
20770e44 |
124 | =pod |
2a267f86 |
125 | |
126 | =head1 AUTHOR |
127 | |
f997b9ab |
128 | Ken Youens-Clark E<lt>kclark@cpan.orgE<gt>. |
2a267f86 |
129 | |
38ecb2bf |
130 | =head2 CONTRIBUTORS |
131 | |
132 | Jonathan Yu E<lt>frequency@cpan.orgE<gt> |
133 | |
2a267f86 |
134 | =head1 SEE ALSO |
135 | |
20770e44 |
136 | perldoc, perlpod, Pod::POM, Template::Manual::Plugins. |
2a267f86 |
137 | |
138 | =cut |