File Coverage

blib/lib/SQL/Translator/Producer/JSON.pm
Criterion Covered Total %
statement 37 47 78.7
branch 16 32 50.0
condition 1 5 20.0
subroutine 9 11 81.8
pod 0 8 0.0
total 63 103 61.1


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