File Coverage

blib/lib/SQL/Translator/Producer/YAML.pm
Criterion Covered Total %
statement 44 45 97.7
branch 27 32 84.3
condition 2 5 40.0
subroutine 11 11 100.0
pod 0 8 0.0
total 84 101 83.1


line stmt bran cond sub pod time code
1             package SQL::Translator::Producer::YAML;
2              
3             =head1 NAME
4              
5             SQL::Translator::Producer::YAML - A YAML producer for SQL::Translator
6              
7             =head1 SYNOPSIS
8              
9             use SQL::Translator;
10              
11             my $translator = SQL::Translator->new(producer => 'YAML');
12              
13             =head1 DESCRIPTION
14              
15             This module uses YAML to serialize a schema to a string so that it
16             can be saved to disk. Serializing a schema and then calling producers
17             on the stored can realize significant performance gains when parsing
18             takes a long time.
19              
20             =cut
21              
22 5     5   3260 use strict;
  5         12  
  5         172  
23 5     5   21 use warnings;
  5         9  
  5         319  
24             our $VERSION = '1.66';
25              
26 5     5   968 use YAML qw(Dump);
  5         14036  
  5         5539  
27              
28             sub produce {
29 6     6 0 15 my $translator = shift;
30 6         101 my $schema = $translator->schema;
31              
32             return Dump({
33             schema => {
34 15         251 tables => { map { ($_->name => view_table($_)) } $schema->get_tables, },
35 3         18 views => { map { ($_->name => view_view($_)) } $schema->get_views, },
36 7         28 triggers => { map { ($_->name => view_trigger($_)) } $schema->get_triggers, },
37 2         11 procedures => { map { ($_->name => view_procedure($_)) } $schema->get_procedures, },
38             },
39             translator => {
40             add_drop_table => $translator->add_drop_table,
41             filename => $translator->filename,
42             no_comments => $translator->no_comments,
43             parser_args => $translator->parser_args,
44             producer_args => $translator->producer_args,
45             parser_type => $translator->parser_type,
46             producer_type => $translator->producer_type,
47             show_warnings => $translator->show_warnings,
48             trace => $translator->trace,
49             version => $translator->version,
50             },
51 6 50       66 keys %{ $schema->extra } ? ('extra' => { $schema->extra }) : (),
  6         118  
52             });
53             }
54              
55             sub view_table {
56 15     15 0 348 my $table = shift;
57              
58             return {
59             'name' => $table->name,
60             'order' => $table->order,
61             'options' => $table->options || [],
62             $table->comments ? ('comments' => [ $table->comments ]) : (),
63             'constraints' => [
64 16         93 map { view_constraint($_) } $table->get_constraints
65             ],
66             'indices' => [
67 4         29 map { view_index($_) } $table->get_indices
68             ],
69             'fields' => {
70 43         724 map { ($_->name => view_field($_)) }
71             $table->get_fields
72             },
73 15 100 50     275 keys %{ $table->extra } ? ('extra' => { $table->extra }) : (),
  15 100       311  
74             };
75             }
76              
77             sub view_constraint {
78 16     16 0 25 my $constraint = shift;
79              
80             return {
81             'deferrable' => scalar $constraint->deferrable,
82             'expression' => scalar $constraint->expression,
83 16 100       268 'fields' => [ map { ref $_ ? $_->name : $_ } $constraint->field_names ],
84             'match_type' => scalar $constraint->match_type,
85             'name' => scalar $constraint->name,
86             'options' => scalar $constraint->options,
87             'on_delete' => scalar $constraint->on_delete,
88             'on_update' => scalar $constraint->on_update,
89 3 50       66 'reference_fields' => [ map { ref $_ ? $_->name : $_ } $constraint->reference_fields ],
90             'reference_table' => scalar $constraint->reference_table,
91             'type' => scalar $constraint->type,
92 16 100       217 keys %{ $constraint->extra }
  16         493  
93             ? ('extra' => { $constraint->extra })
94             : (),
95             };
96             }
97              
98             sub view_field {
99 43     43 0 764 my $field = shift;
100              
101             return {
102             'order' => scalar $field->order,
103             'name' => scalar $field->name,
104             'data_type' => scalar $field->data_type,
105             'size' => [ $field->size ],
106             'default_value' => scalar $field->default_value,
107             'is_nullable' => scalar $field->is_nullable,
108             'is_primary_key' => scalar $field->is_primary_key,
109             'is_unique' => scalar $field->is_unique,
110             $field->is_auto_increment ? ('is_auto_increment' => 1) : (),
111             $field->comments ? ('comments' => [ $field->comments ]) : (),
112 43 100       626 keys %{ $field->extra } ? ('extra' => { $field->extra }) : (),
  43 100       928  
    100          
113             };
114             }
115              
116             sub view_procedure {
117 2     2 0 4 my $procedure = shift;
118              
119             return {
120             'order' => scalar $procedure->order,
121             'name' => scalar $procedure->name,
122             'sql' => scalar $procedure->sql,
123             'parameters' => scalar $procedure->parameters,
124             'owner' => scalar $procedure->owner,
125             $procedure->comments ? ('comments' => [ $procedure->comments ]) : (),
126 2 50       58 keys %{ $procedure->extra } ? ('extra' => { $procedure->extra }) : (),
  2 50       53  
127             };
128             }
129              
130             sub view_trigger {
131 7     7 0 10 my $trigger = shift;
132              
133             return {
134             'order' => scalar $trigger->order,
135             'name' => scalar $trigger->name,
136             'perform_action_when' => scalar $trigger->perform_action_when,
137             'database_events' => scalar $trigger->database_events,
138             'fields' => scalar $trigger->fields,
139             'on_table' => scalar $trigger->on_table,
140             'action' => scalar $trigger->action,
141             (
142             defined $trigger->scope
143             ? ('scope' => scalar $trigger->scope,)
144             : ()
145             ),
146 7 100       153 keys %{ $trigger->extra } ? ('extra' => { $trigger->extra }) : (),
  7 100       260  
147             };
148             }
149              
150             sub view_view {
151 3     3 0 6 my $view = shift;
152              
153             return {
154             'order' => scalar $view->order,
155             'name' => scalar $view->name,
156             'sql' => scalar $view->sql,
157             'fields' => scalar $view->fields,
158 3 100       52 keys %{ $view->extra } ? ('extra' => { $view->extra }) : (),
  3         58  
159             };
160             }
161              
162             sub view_index {
163 4     4 0 7 my $index = shift;
164              
165             return {
166             'name' => scalar $index->name,
167             'type' => scalar $index->type,
168              
169             # If the index has extra properties, make sure these are written too
170             'fields' => [
171 4 50 33     30 map { ref($_) && $_->extra && keys %{ $_->extra } ? { name => $_->name, %{ $_->extra } } : "$_" }
  0         0  
172             $index->fields
173             ],
174             'options' => scalar $index->options,
175 4 100       70 keys %{ $index->extra } ? ('extra' => { $index->extra }) : (),
  4         1499  
176             };
177             }
178              
179             1;
180              
181             =head1 SEE ALSO
182              
183             SQL::Translator, YAML, http://www.yaml.org/.
184              
185             =head1 AUTHORS
186              
187             darren chamberlain Edarren@cpan.orgE,
188             Ken Youens-Clark Ekclark@cpan.orgE.
189              
190             =cut