Mojolicious-Plugin-DbicSchemaViewer
view release on metacpan or search on metacpan
lib/Mojolicious/Plugin/DbicSchemaViewer.pm view on Meta::CPAN
my %unique_constraints = $rs->unique_constraints;
foreach my $unique_constraint (keys %unique_constraints) {
foreach my $column ($unique_constraints{ $unique_constraint }->@*) {
if(!exists $uniques->{ $column }) {
$uniques->{ $column } = [];
}
push $uniques->{ $column }->@* => $unique_constraint;
}
}
my $clean_name = lc $source_name =~ s{::}{_}gr;
my $source = {
name => $source_name,
clean_name => $clean_name,
primary_columns => [$rs->primary_columns],
unique_constraints => [$rs->unique_constraints],
uniques => $uniques,
columns_info => [],
relationships => [],
};
foreach my $column_name ($rs->columns) {
my $column_info = { $rs->column_info($column_name)->%* };
my $data_type = delete $column_info->{'data_type'};
$data_type = $column_info->{'is_enum'} && scalar $column_info->{'extra'}{'list'}->@* ? "enum/$data_type" : $data_type;
push $source->{'columns'}->@* => {
name => $column_name,
$column_info->%*,
data_type => $data_type,
};
}
foreach my $relation_name (sort $rs->relationships) {
my $relation = $rs->relationship_info($relation_name);
my $class_name = $relation->{'class'} =~ s{^.*?::Result::}{}r;
my $condition;
# simple one column to one column relation: this_result_id => relation_name.that_result_id
if(ref $relation->{'cond'} eq 'HASH' && scalar keys $relation->{'cond'}->%* == 1) {
my @cleaned_condition = ((values $relation->{'cond'}->%*)[0] =~ s{^self\.}{}rx);
push @cleaned_condition => (keys $relation->{'cond'}->%*)[0] =~ s{^foreign(?=\.)}{$relation_name}rx;
$condition = join ' => ', @cleaned_condition;
}
# more complicated relation: dump relation to text and remove boilerplate
else {
$condition = Dump($relation->{'cond'})->Out;
# cleanup the dump
$condition =~ s{^.*?\{}{\{};
$condition =~ s{\n\s*?package .*?\n}{\n};
$condition =~ s{\n\s*?BEGIN.*?\n}{\n};
$condition =~ s{\n\s*?use strict.*?\n}{\n}g;
$condition =~ s{\n\s*?use feature.*?\n}{\n}g;
$condition =~ s{\n\s*?no feature.*?\n}{\n}g;
$condition =~ s{\n\s{3,}\}}{\n\}};
$condition =~ s{\n\s{8,8}}{\n }g;
}
my $on_cascade = [ sort map { $_ =~ s{^cascade_}{}rm } grep { m/^cascade/ && $relation->{'attrs'}{ $_ } } keys $relation->{'attrs'}->%* ];
# do not reorder
my $relation_type = $relation->{'attrs'}{'accessor'} eq 'multi' ? 'has_many'
: $relation->{'attrs'}{'is_depends_on'} ? 'belongs_to'
: exists $relation->{'attrs'}{'join_type'} ? 'might_have'
: 'has_one'
;
push $source->{'relationships'}->@* => {
name => $relation_name,
class_name => $class_name,
clean_name => lc $class_name =~ s{::}{_}rg,
condition => $condition,
on_cascade => $on_cascade,
$relation->%*,
relation_type => $relation_type,
has_reverse_relation => keys $rs->reverse_relationship_info($relation_name)->%* ? 1 : 0,
};
}
push $db->{'sources'}->@* => $source;
}
return $db;
}
1;
__END__
=pod
=encoding utf-8
=head1 NAME
Mojolicious::Plugin::DbicSchemaViewer - Viewer for DBIx::Class schema definitions
=begin html
<p>
<img src="https://img.shields.io/badge/perl-5.20+-blue.svg" alt="Requires Perl 5.20+" />
<a href="https://travis-ci.org/Csson/p5-Mojolicious-Plugin-DbicSchemaViewer"><img src="https://api.travis-ci.org/Csson/p5-Mojolicious-Plugin-DbicSchemaViewer.svg?branch=master" alt="Travis status" /></a>
<a href="http://cpants.cpanauthors.org/release/CSSON/Mojolicious-Plugin-DbicSchemaViewer-0.0200"><img src="http://badgedepot.code301.com/badge/kwalitee/CSSON/Mojolicious-Plugin-DbicSchemaViewer/0.0200" alt="Distribution kwalitee" /></a>
<a href="http://matrix.cpantesters.org/?dist=Mojolicious-Plugin-DbicSchemaViewer%200.0200"><img src="http://badgedepot.code301.com/badge/cpantesters/Mojolicious-Plugin-DbicSchemaViewer/0.0200" alt="CPAN Testers result" /></a>
<img src="https://img.shields.io/badge/coverage-59.0%-red.svg" alt="coverage 59.0%" />
</p>
=end html
=head1 VERSION
Version 0.0200, released 2016-09-20.
=head1 SYNOPSIS
$self->plugin(DbicSchemaViewer => {
schema => Your::Schema->connect(...),
});
=head1 DESCRIPTION
This plugin is a definition viewer for L<DBIx::Class> schemas. It currently offers two different views on the schema:
=over 4
=item *
It lists all result sources with column definitions and and their relationships in table form.
=item *
It uses L<DBIx::Class::Visualizer> to generate an entity-relationship model.
( run in 0.590 second using v1.01-cache-2.11-cpan-f56aa216473 )