run arbitrary perl in upgrade/downgrade/schema
Arthur Axel 'fREW' Schmidt [Sun, 28 Mar 2010 16:00:26 +0000 (11:00 -0500)]
TODO
lib/DBIx/Class/DeploymentHandler/DeployMethod/SQL/Translator.pm
t/deploy_methods/sql_translator.t

diff --git a/TODO b/TODO
index a80091d..4385256 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,4 +1,3 @@
 make recommended bundle (monotonic)
-run arbitrary perl from migration scripts (tests)
 make deploy_version_storage
 pod
index 637a983..6d00bdd 100644 (file)
@@ -162,8 +162,17 @@ method _run_sql_and_perl($filenames) {
         }
         $storage->_query_end($line);
       }
-    } elsif ( $filename =~ /\.pl$/ ) {
-      qx( $^X $filename );
+    } elsif ( $filename =~ /^(.+)\.pl$/ ) {
+      my $package = $1;
+      my $filedata = do { local( @ARGV, $/ ) = $filename; <> };
+      # make the package name more palateable to perl
+      $package =~ s/\W/_/g;
+
+      no warnings 'redefine';
+      eval "package $package;\n\n$filedata";
+      use warnings;
+
+      $package->can('run')->($self->schema);
     } else {
       croak "A file got to deploy that wasn't sql or perl!";
     }
index 17d35e9..eca08c8 100644 (file)
@@ -78,6 +78,7 @@ VERSION2: {
       upgrade_directory => $sql_dir,
       databases         => ['SQLite'],
       sqltargs          => { add_drop_table => 0 },
+               txn_wrap          => 1,
    });
 
    ok( $dm, 'DBIC::DH::SQL::Translator w/2.0 instantiates correctly');
@@ -126,11 +127,28 @@ VERSION2: {
    print {$common} qq<INSERT INTO Foo (bar, baz) VALUES ("hello", "world");\n\n>;
    close $common;
 
+   open my $common_pl, '>',
+      catfile(qw( t sql _common up 1.0-2.0 003-semiautomatic.pl ));
+   print {$common_pl} q|
+               sub run {
+                       my $schema = shift;
+                       $schema->resultset('Foo')->create({
+                               bar => 'goodbye',
+                               baz => 'blue skies',
+                       })
+               }
+       |;
+   close $common_pl;
+
    $dm->upgrade_single_step([qw( 1.0 2.0 )]);
    is( $s->resultset('Foo')->search({
          bar => 'hello',
          baz => 'world',
       })->count, 1, '_common migration got run');
+   is( $s->resultset('Foo')->search({
+         bar => 'goodbye',
+         #baz => 'blue skies',
+      })->count, 1, '_common perl migration got run');
    lives_ok {
       $s->resultset('Foo')->create({
          bar => 'frew',