File Coverage

blib/lib/SQL/Translator/Producer/GraphQL.pm
Criterion Covered Total %
statement 136 136 100.0
branch 5 8 62.5
condition 2 4 50.0
subroutine 29 29 100.0
pod 0 2 0.0
total 172 179 96.0


line stmt bran cond sub pod time code
1             package SQL::Translator::Producer::GraphQL;
2 3     3   753823 use strict;
  3         20  
  3         98  
3 3     3   21 use warnings;
  3         7  
  3         90  
4 3     3   491 use GraphQL::Plugin::Convert::DBIC;
  3         29  
  3         560  
5              
6             our $VERSION = "0.05";
7              
8             my $dbic_schema_class_track = 'CLASS00000';
9             sub produce {
10 3     3 0 1574640 my $translator = shift;
11 3         65 my $schema = $translator->schema;
12 3         157 my $dbic_schema_class = ++$dbic_schema_class_track;
13 3         87 my $dbic_translator = bless { %$translator }, ref $translator;
14 3         79 $dbic_translator->producer_args({ prefix => $dbic_schema_class });
15 3         186 my $perl = dbic_produce($dbic_translator);
16 3     2   443 eval $perl;
  2     2   24  
  2     2   6  
  2     2   908  
  2     2   20566  
  2     2   5  
  2     2   51  
  2     2   10  
  2     2   6  
  2     2   321  
  2     2   14  
  2     2   5  
  2     2   225  
  2     2   15  
  2     2   4  
  2     2   52  
  2     2   11  
  2     2   5  
  2     1   538  
  2     1   15  
  2     1   6  
  2         764  
  2         9958  
  2         5  
  2         43  
  2         14  
  2         7  
  2         389  
  2         27  
  2         5  
  2         247  
  2         14  
  2         5  
  2         45  
  2         10  
  2         4  
  2         378  
  2         16  
  2         6  
  2         185  
  2         17  
  2         6  
  2         48  
  2         11  
  2         4  
  2         278  
  2         15  
  2         5  
  2         205  
  2         16  
  2         11  
  2         40  
  2         10  
  2         4  
  2         278  
  1         6  
  1         3  
  1         96  
  1         7  
  1         3  
  1         34  
  1         6  
  1         2  
  1         110  
17 3 50       19 die "Failed to make DBIx::Class::Schema: $@" if $@;
18 3         37 my $converted = GraphQL::Plugin::Convert::DBIC->to_graphql($dbic_schema_class->connect);
19 3         931451 $converted->{schema}->to_doc;
20             }
21              
22             {
23             # from SQL::Translator::Producer::DBIx::Class::File;
24 3     3   1087 use SQL::Translator::Schema::Constants;
  3         724  
  3         325  
25 3     3   1499 use SQL::Translator::Utils qw(header_comment);
  3         6395  
  3         171  
26 3     3   641 use Data::Dumper ();
  3         6953  
  3         2134  
27              
28             ## Skip all column type translation, as we want to use whatever the parser got.
29              
30             ## Translate parsers -> PK::Auto::Foo, however
31              
32             my %parser2PK = (
33             MySQL => 'PK::Auto::MySQL',
34             PostgreSQL => 'PK::Auto::Pg',
35             DB2 => 'PK::Auto::DB2',
36             Oracle => 'PK::Auto::Oracle',
37             );
38              
39             sub dbic_produce
40             {
41 3     3 0 12 my ($translator) = @_;
42 3         64 my $no_comments = $translator->no_comments;
43 3         76 my $add_drop_table = $translator->add_drop_table;
44 3         78 my $schema = $translator->schema;
45 3         144 my $output = '';
46              
47             # Steal the XML producers "prefix" arg for our namespace?
48             my $dbixschema = $translator->producer_args()->{prefix} ||
49 3   50     56 $schema->name || 'My::Schema';
50 3   50     207 my $pkclass = $parser2PK{$translator->parser_type} || '';
51              
52 3         130 my %tt_vars = ();
53 3         22 $tt_vars{dbixschema} = $dbixschema;
54 3         11 $tt_vars{pkclass} = $pkclass;
55              
56 3         18 my $schemaoutput .= << "DATA";
57              
58             package ${dbixschema};
59             use base 'DBIx::Class::Schema';
60             use strict;
61             use warnings;
62             DATA
63              
64 3         9 my %tableoutput = ();
65 3         18 my %tableextras = ();
66 3         26 foreach my $table ($schema->get_tables)
67             {
68 10         1708 my $tname = $table->name;
69 10         1092 my $output .= qq{
70              
71             package ${dbixschema}::${tname};
72             use base 'DBIx::Class';
73             use strict;
74             use warnings;
75              
76             __PACKAGE__->load_components(qw/${pkclass} Core/);
77             __PACKAGE__->table('${tname}');
78              
79             };
80              
81             my @fields = map
82             {
83 10         36 { $_->name => {
84             name => $_->name,
85             is_auto_increment => $_->is_auto_increment,
86             is_foreign_key => $_->is_foreign_key,
87             is_nullable => $_->is_nullable,
88             default_value => $_->default_value,
89             data_type => $_->data_type,
90             size => $_->size,
91 71 50       90351 ($_->{extra} ? (extra => $_->{extra}) : ()),
92             } }
93             } ($table->get_fields);
94              
95 10         18951 $output .= "\n__PACKAGE__->add_columns(";
96 10         34 foreach my $f (@fields)
97             {
98 71         137 local $Data::Dumper::Terse = 1;
99 71         240 $output .= "\n '" . (keys %$f)[0] . "' => " ;
100 71         307 my $colinfo =
101             Data::Dumper->Dump([values %$f],
102             [''] # keys %$f]
103             );
104 71         4673 chomp($colinfo);
105 71         319 $output .= $colinfo . ",";
106             }
107 10         23 $output .= "\n);\n";
108              
109 10         38 my $pk = $table->primary_key;
110 10 50       1973 if($pk)
111             {
112 10         40 my @pk = map { $_->name } ($pk->fields);
  10         3952  
113 10         989 $output .= "__PACKAGE__->set_primary_key(";
114 10         44 $output .= "'" . join("', '", @pk) . "');\n";
115             }
116              
117 10         70 foreach my $cont ($table->get_constraints)
118             {
119             # print Data::Dumper::Dumper($cont->type);
120 17 100       1182 if($cont->type =~ /foreign key/i)
121             {
122             # $output .= "\n__PACKAGE__->belongs_to('" .
123             # $cont->fields->[0]->name . "', '" .
124             # "${dbixschema}::" . $cont->reference_table . "');\n";
125              
126 5         553 $tableextras{$table->name} .= "\n__PACKAGE__->belongs_to('" .
127             $cont->fields->[0]->name . "', '" .
128             "${dbixschema}::" . $cont->reference_table . "');\n";
129              
130 5         2975 my $other = "\n__PACKAGE__->has_many('" .
131             $table->name. "', '" .
132             "${dbixschema}::" . $table->name. "', '" .
133             $cont->fields->[0]->name . "');";
134 5         3453 $tableextras{$cont->reference_table} .= $other;
135             }
136             }
137              
138 10         762 $tableoutput{$table->name} .= $output;
139             }
140              
141 3         359 foreach my $to (keys %tableoutput)
142             {
143 10         70 $output .= $tableoutput{$to};
144 10         37 $schemaoutput .= "\n__PACKAGE__->register_class('${to}', '${dbixschema}::${to}');\n";
145             }
146              
147 3         14 foreach my $te (keys %tableextras)
148             {
149 8         23 $output .= "\npackage ${dbixschema}::$te;\n";
150 8         23 $output .= $tableextras{$te} . "\n";
151             # $tableoutput{$te} .= $tableextras{$te} . "\n";
152             }
153              
154             # print "$output\n";
155 3         83 return "${output}\n\n${schemaoutput}\n1;\n";
156             }
157             }
158              
159             =encoding utf-8
160              
161             =head1 NAME
162              
163             SQL::Translator::Producer::GraphQL - GraphQL schema producer for SQL::Translator
164              
165             =begin markdown
166              
167             # PROJECT STATUS
168              
169             | OS | Build status |
170             |:-------:|--------------:|
171             | Linux | [![Build Status](https://travis-ci.org/graphql-perl/SQL-Translator-Producer-GraphQL.svg?branch=master)](https://travis-ci.org/graphql-perl/SQL-Translator-Producer-GraphQL) |
172              
173             [![CPAN version](https://badge.fury.io/pl/SQL-Translator-Producer-GraphQL.svg)](https://metacpan.org/pod/SQL::Translator::Producer::GraphQL)
174              
175             =end markdown
176              
177             =head1 SYNOPSIS
178              
179             use SQL::Translator;
180             use SQL::Translator::Producer::GraphQL;
181             my $t = SQL::Translator->new( parser => '...' );
182             $t->producer('GraphQL');
183             $t->translate;
184              
185             =head1 DESCRIPTION
186              
187             This module will produce a L<GraphQL::Schema> from the given
188             L<SQL::Translator::Schema>. It does this by first
189             turning it into a L<DBIx::Class::Schema> using
190             L<SQL::Translator::Producer::DBIx::Class::File>, then passing it to
191             L<GraphQL::Plugin::Convert::DBIC/to_graphql>.
192              
193             =head1 ARGUMENTS
194              
195             Currently none.
196              
197             =head1 DEBUGGING
198              
199             To debug, set environment variable C<GRAPHQL_DEBUG> to a true value.
200              
201             =head1 AUTHOR
202              
203             Ed J, C<< <etj at cpan.org> >>
204              
205             Based heavily on L<SQL::Translator::Producer::DBIxSchemaDSL>.
206              
207             =head1 LICENSE
208              
209             Copyright (C) Ed J
210              
211             This library is free software; you can redistribute it and/or modify
212             it under the same terms as Perl itself.
213              
214             =cut
215              
216             1;