App-DBCritic
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/App/DBCritic/Policy/DuplicateRelationships.pm view on Meta::CPAN
package App::DBCritic::Policy::DuplicateRelationships;
# ABSTRACT: Check for ResultSources with unnecessary duplicate relationships
#pod =head1 SYNOPSIS
#pod
#pod use App::DBCritic;
#pod
#pod my $critic = App::DBCritic->new(
#pod dsn => 'dbi:Oracle:HR', username => 'scott', password => 'tiger');
#pod $critic->critique();
#pod
#pod =head1 DESCRIPTION
#pod
#pod This policy returns a violation if a
#pod L<DBIx::Class::ResultSource|DBIx::Class::ResultSource> has relationships to
#pod other tables that are identical in everything but name.
#pod
#pod =cut
use strict;
use utf8;
use Modern::Perl '2011'; ## no critic (Modules::ProhibitUseQuotedVersion)
our $VERSION = '0.023'; # VERSION
use Algorithm::Combinatorics 'combinations';
use Data::Compare;
use English '-no_match_vars';
use Moo;
use Sub::Quote;
use namespace::autoclean -also => qr{\A _}xms;
has description => (
is => 'ro',
default => quote_sub q{'Duplicate relationships'},
);
#pod =attr description
#pod
#pod "Duplicate relationships"
#pod
#pod =cut
has explanation => (
is => 'ro',
default => quote_sub
q{'Each connection between tables should only be expressed once.'},
);
#pod =attr explanation
#pod
#pod "Each connection between tables should only be expressed once."
#pod
#pod =cut
sub violates {
my $source = shift->element;
return if $source->relationships < 2;
return join "\n" => map { sprintf '%s and %s are duplicates', @{$_} }
grep {
Compare( map { $source->relationship_info($_) } @{$_} )
} combinations( [ $source->relationships ], 2 );
}
#pod =method violates
#pod
#pod Returns details if the
#pod L<"current element"|App::DBCritic::Policy>'s C<relationship_info>
#pod hashes for any defined relationships are duplicated.
#pod
#pod =cut
with 'App::DBCritic::PolicyType::ResultSource';
#pod =attr applies_to
#pod
#pod This policy applies to L<ResultSource|DBIx::Class::ResultSource>s.
#pod
#pod =cut
1;
view all matches for this distributionview release on metacpan - search on metacpan
( run in 2.456 seconds using v1.00-cache-2.02-grep-82fe00e-cpan-72ae3ad1e6da )