DBIx-Class-StateMigrations

 view release on metacpan or  search on metacpan

lib/DBIx/Class/StateMigrations.pm  view on Meta::CPAN

package DBIx::Class::StateMigrations;

use strict;
use warnings;

# ABSTRACT: Schema migrations via checksums instead of versions

our $VERSION = '0.002';

use Moo;
use Types::Standard qw(:all);
use Scalar::Util 'blessed';
use Try::Tiny;
use Class::Unload;
use Class::Inspector;

use Path::Class qw/file dir/;
use DBIx::Class::Schema::Diff 1.11;

use DBIx::Class::Schema::Diff::State;
use DBIx::Class::StateMigrations::SchemaState;
use DBIx::Class::StateMigrations::Migration;

sub BUILD {
  my $self = shift;
  try{$self->connected_schema->storage->connected} or die join('',
    'Supplied connected_schema "', $self->connected_schema, '" is not connected'
  );
}

sub load_migrations {
  my $self = shift;
  $self->_validate_Migrations
}

sub load_current_state {
  my $self = shift;
 $self->current_SchemaState
}

sub has_matched_migration { 
  my $self = shift;
  $self->matched_Migration ? 1 : 0
}

sub num_migrations { scalar(@{ (shift)->Migrations }) }
sub all_migrations { @{ (shift)->Migrations } }


sub execute_matched_Migration_routines {
  my $self = shift;
  my $callback = shift;
  
  my $Migration = $self->matched_Migration or die join('',
    'execute_matched_Migration(): no migration matched'
  );
  
  $Migration->execute_routines( $self->connected_schema, $callback )
}

has '__loaded_vagrant_classes', is => 'ro', isa => HashRef, default => sub {{}};


has 'migrations_dir', is => 'ro', default => sub { undef };
has 'connected_schema', is => 'ro', required => 1, isa => InstanceOf['DBIx::Class::Schema'];

has 'DBI_Driver_Name', is => 'ro', init_arg => undef, lazy => 1, default => sub {
  my $self = shift;
  $self->connected_schema->storage->dbh->{Driver}{Name}
}, isa => Str;

has 'schema_class', is => 'ro', lazy => 1, init_arg => 1, default => sub {
  my $self = shift;
  blessed $self->connected_schema ? blessed $self->connected_schema : $self->connected_schema
};

has 'loader_options', is => 'ro', default => sub {{
  naming => { ALL => 'v7'},
  use_namespaces => 1,
  use_moose => 0,
  debug => 0,
  qualify_objects => 1
}}, isa => HashRef;


has 'diff_filters', is => 'ro', default => sub {[
  filter_out => 'isa'
]}, isa => ArrayRef;


has 'Migrations', is => 'ro', lazy => 1, default => sub {
  my $self = shift;
  if(my $dir = $self->migrations_dir) {
    my $Dir = dir( $dir )->absolute;
    -d $Dir or die "migrations dir '$dir' not found or is not a directory";
    
    my @migrations = ();
    
    local $DBIx::Class::StateMigrations::Migration::LOADED_MIGRATION_SUBCLASSES = $self->__loaded_vagrant_classes;
    
    for my $m_dir ($Dir->children) {
      next unless $m_dir->is_dir;
      my $Migration = DBIx::Class::StateMigrations::Migration
        ->new_from_migration_dir($m_dir->absolute->stringify,$self->DBI_Driver_Name);
      push @migrations, $Migration if ($Migration);
    }
    return \@migrations;
  }
  else {
    return []
  }
}, isa => ArrayRef[InstanceOf[
  'DBIx::Class::StateMigrations::Migration',
  'DBIx::Class::StateMigrations::Migration::Invalid'
]];

sub _validate_Migrations {
  my $self = shift;
  
  my (@good,@warns,@dies);
  my @all = $self->all_migrations;



( run in 0.631 second using v1.01-cache-2.11-cpan-39bf76dae61 )