Switch CDBICompat and its tests to OptDeps
Peter Rabbitson [Tue, 10 Feb 2015 15:17:55 +0000 (16:17 +0100)]
This work is a direct descendant of ilmari's c8dc7d33, even though it does
not contain almost any of the original code. While the original approach was
a big improvement, this commit is taking advantage of all improvements that
took place in OptDep handling in earlier commits. The result (at the expense
of a much much larger changeset) is a skip time of < 0.5s for the entire cdbi
set

ilmari++ # this revamp would not have taken place without your first nudge

47 files changed:
lib/DBIx/Class/CDBICompat.pm
lib/DBIx/Class/Optional/Dependencies.pm
t/cdbi/01-columns.t
t/cdbi/02-Film.t
t/cdbi/03-subclassing.t
t/cdbi/04-lazy.t
t/cdbi/06-hasa.t
t/cdbi/08-inheritcols.t
t/cdbi/09-has_many.t
t/cdbi/11-triggers.t
t/cdbi/12-filter.t
t/cdbi/13-constraint.t
t/cdbi/14-might_have.t
t/cdbi/15-accessor.t
t/cdbi/16-reserved.t
t/cdbi/18-has_a.t
t/cdbi/19-set_sql.t
t/cdbi/21-iterator.t
t/cdbi/22-deflate_order.t
t/cdbi/22-self_referential.t
t/cdbi/23-cascade.t
t/cdbi/24-meta_info.t
t/cdbi/26-mutator.t
t/cdbi/30-pager.t
t/cdbi/68-inflate_has_a.t
t/cdbi/70_implicit_inflate.t
t/cdbi/71_column_object.t
t/cdbi/98-failure.t
t/cdbi/DeepAbstractSearch/01_search.t
t/cdbi/abstract/search_where.t
t/cdbi/columns_as_hashes.t
t/cdbi/columns_dont_override_custom_accessors.t
t/cdbi/construct.t
t/cdbi/copy.t
t/cdbi/early_column_heisenbug.t
t/cdbi/has_many_loads_foreign_class.t
t/cdbi/hasa_without_loading.t
t/cdbi/max_min_value_of.t
t/cdbi/mk_group_accessors.t
t/cdbi/multi_column_set.t
t/cdbi/object_cache.t
t/cdbi/retrieve_from_sql_with_limit.t
t/cdbi/set_to_undef.t
t/cdbi/set_vs_DateTime.t
t/cdbi/sweet/08pager.t
t/cdbi/testlib/DBIC/Test/SQLite.pm
t/cdbi/testlib/MyBase.pm

index f2bb881..f3697c2 100644 (file)
@@ -2,22 +2,15 @@ package DBIx::Class::CDBICompat;
 
 use strict;
 use warnings;
-use base qw/DBIx::Class::Core DBIx::Class::DB/;
-
-# Modules CDBICompat needs that DBIx::Class does not.
-my @Extra_Modules = qw(
-    Class::Trigger
-    DBIx::ContextualFetch
-    Clone
-);
 
-my @didnt_load;
-for my $module (@Extra_Modules) {
-    push @didnt_load, $module unless eval qq{require $module};
+BEGIN {
+  require DBIx::Class::Optional::Dependencies;
+  if (my $missing = DBIx::Class::Optional::Dependencies->req_missing_for('cdbicompat')) {
+    die "The following extra modules are required for DBIx::Class::CDBICompat: $missing\n";
+  }
 }
-__PACKAGE__->throw_exception("@{[ join ', ', @didnt_load ]} are missing and are required for CDBICompat")
-    if @didnt_load;
 
+use base qw/DBIx::Class::Core DBIx::Class::DB/;
 
 __PACKAGE__->load_own_components(qw/
   Constraints
index 0ceeb19..56f04dc 100644 (file)
@@ -69,9 +69,13 @@ my $dbic_reqs = {
   # this prevents the "skips due to forgotten deps" issue
   test_adhoc => {
     req => {
+      'Class::DBI::Plugin::DeepAbstractSearch' => '0',
+      'Class::DBI' => '3.000005',
       'Date::Simple' => '3.03',
       'YAML' => '0',
       'Class::Unload' => '0.07',
+      'Time::Piece' => '0',
+      'Time::Piece::MySQL' => '0',
     },
   },
 
@@ -146,6 +150,19 @@ my $dbic_reqs = {
     },
   },
 
+  cdbicompat => {
+    req => {
+      'Class::Data::Inheritable' => '0',
+      'Class::Trigger' => '0',
+      'DBIx::ContextualFetch' => '0',
+      'Clone' => '0.32',
+    },
+    pod => {
+      title => 'DBIx::Class::CDBICompat support',
+      desc => 'Modules required for L<DBIx::Class::CDBICompat>'
+    },
+  },
+
   test_pod => {
     req => {
       'Test::Pod'                 => '1.42',
@@ -203,13 +220,6 @@ my $dbic_reqs = {
     },
   },
 
-  test_cdbicompat => {
-    include => 'icdt',
-    req => {
-      'Class::DBI::Plugin::DeepAbstractSearch' => '0',
-      'Time::Piece::MySQL'        => '0',
-    },
-  },
 
   # this is just for completeness as SQLite
   # is a core dep of DBIC for testing
index 275ed4a..76bce52 100644 (file)
@@ -1,3 +1,5 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
 
@@ -97,8 +99,8 @@ ok(!State->find_column('HGLAGAGlAG'), '!find_column HGLAGAGlAG');
 }
 
 {
-  SKIP: {
-    skip "No column objects", 1;
+  {
+    local $TODO = "No column objects";
 
     eval { my @grps = State->__grouper->groups_for("Huh"); };
     ok $@, "Huh not in groups";
index 111a4f0..7a6f9e9 100644 (file)
@@ -1,3 +1,5 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
 
index 767b341..8a73a09 100644 (file)
@@ -1,3 +1,5 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
 
index ca28b07..2e37827 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 use Test::Warn;
 
index 3c47caa..d191b65 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 use Test::Exception;
 use DBIx::Class::_Util 'sigwarn_silencer';
index 5550e59..bc9b90a 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index 0c751a0..a19500a 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index c944248..cd322e5 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index 9a715ed..de68fa1 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index 4191fe5..ba9f654 100644 (file)
@@ -1,6 +1,10 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
+use Test::Exception;
 
 use lib 't/cdbi/testlib';
 use Film;
@@ -58,10 +62,10 @@ ok $fred, "Got fred";
     like $@, qr/fails.*constraint/, "Fails listref constraint";
     my $ok = eval { Film->create({ Rating => 'U' }) };
     is $@, '', "Can create with rating U";
-    SKIP: {
-        skip "No column objects", 2;
-    ok +Film->find_column('rating')->is_constrained, "Rating is constrained";
-    ok +Film->find_column('director')->is_constrained, "Director is not";
+    {
+      local $TODO = "No column objects";
+      lives_ok { Film->find_column('rating')->is_constrained || die } "Rating is constrained";
+      lives_ok { Film->find_column('director')->is_constrained || die } "Director is not";
     }
 }
 
index 73318ac..52a2abd 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index f5c0099..85f8464 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index e54d0ae..ce8a4b3 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index e1deb09..dfb5819 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 use Test::Exception;
 use DBIx::Class::_Util 'sigwarn_silencer';
index 41040af..a981810 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index f49bf68..14a1b30 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index d4e9935..71d8d7d 100644 (file)
@@ -1,3 +1,5 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( cdbicompat test_rdbms_mysql Time::Piece::MySQL>=0 );
+
 $| = 1;
 use warnings;
 use strict;
@@ -5,10 +7,6 @@ use strict;
 use Test::More;
 
 use lib 't/cdbi/testlib';
-use DBIC::Test::SQLite (); # this will issue the necessary SKIPs on missing reqs
-
-eval { require Time::Piece::MySQL }
-  or plan skip_all => 'Time::Piece::MySQL required for this test';
 
 use_ok ('Log');
 
index 1538ef4..43ad050 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index 79fed22..809f458 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 use Data::Dumper;
 
index f2fc57f..703e3fd 100644 (file)
@@ -1,14 +1,11 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( cdbicompat Time::Piece>=0 );
+
 use strict;
 use warnings;
+
 use Test::More;
 use Test::Warn;
 
-use lib 't/cdbi/testlib';
-use DBIC::Test::SQLite (); # this will issue the necessary SKIPs on missing reqs
-
-eval { require Time::Piece }
-  or plan skip_all => 'Time::Piece required for this test';
-
 package Temp::DBI;
 use base qw(DBIx::Class::CDBICompat);
 Temp::DBI->columns(All => qw(id date));
index a203059..54a4229 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index 9ee838a..d192d97 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index 246a319..ed4f4fe 100644 (file)
@@ -1,14 +1,11 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( icdt cdbicompat );
+
 use strict;
 use warnings;
-use Test::More;
 
-use lib qw(t/cdbi/testlib);
-use DBIC::Test::SQLite (); # this will issue the necessary SKIPs on missing reqs
-
-BEGIN {
-  eval { require DateTime; DateTime->VERSION(0.55) }
-    or plan skip_all => 'DateTime 0.55 required for this test';
-}
+use Test::More;
+use lib 't/lib';
+use DBICTest;
 
 my $schema = DBICTest->init_schema();
 
index 5c92f75..4a3fd6f 100644 (file)
@@ -1,4 +1,4 @@
-use DBIx::Class::Optional::Dependencies -skip_all_without => qw( rdbms_sqlite icdt );
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( cdbicompat rdbms_sqlite icdt );
 
 use strict;
 use warnings;
index a97960f..e00820b 100644 (file)
@@ -1,16 +1,13 @@
+# Columns in CDBI could be defined as Class::DBI::Column objects rather than
+# or as well as with __PACKAGE__->columns();
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( cdbicompat Class::DBI>=3.000005 );
+
 use strict;
 use warnings;
 
 use Test::More;
-use lib 't/cdbi/testlib';
-
-# Columns in CDBI could be defined as Class::DBI::Column objects rather than
-# or as well as with __PACKAGE__->columns();
-BEGIN {
-  eval { require Class::DBI and Class::DBI->VERSION('3.0.5') }
-    or plan skip_all => 'The tested functionality is only available in Class::DBI >= 3.0.5'
-}
 
+use lib 't/cdbi/testlib';
 use ColumnObject;
 
 ok(ColumnObject->can('db_Main'), 'set_db()');
index 1a42e03..9a993c4 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 #----------------------------------------------------------------------
index 95ad021..f4911c7 100644 (file)
@@ -1,14 +1,12 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( cdbicompat Class::DBI::Plugin::DeepAbstractSearch>=0 );
+
 use strict;
 use warnings;
-use Test::More;
 
-use lib 't/cdbi/testlib';
-use DBIC::Test::SQLite (); # this will issue the necessary SKIPs on missing reqs
+use Test::More;
 
-BEGIN {
-  eval { require Class::DBI::Plugin::DeepAbstractSearch }
-    or plan skip_all => 'Class::DBI::Plugin::DeepAbstractSearch required for this test';
-}
+use lib 't/lib';
+use DBICTest;
 
 my $DB = DBICTest->_sqlite_dbname(sqlite_use_file => 1);;
 
index 8c4c629..2c15ecc 100644 (file)
@@ -1,8 +1,10 @@
-use Test::More;
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
 
 use strict;
 use warnings;
 
+use Test::More;
+
 use lib 't/cdbi/testlib';
 use Film;
 
index cddb264..9731ae3 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 use Test::Warn;
 
index 27a96fd..5748b6e 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 use lib 't/cdbi/testlib';
 
index 103877d..d10e6a1 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index d87b73e..f587ae0 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index 859d43d..e91b401 100644 (file)
@@ -1,11 +1,10 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
 
 use Test::More;
 
-use lib 't/cdbi/testlib';
-use DBIC::Test::SQLite (); # this will issue the necessary SKIPs on missing reqs
-
 {
     package Thing;
     use base qw(DBIx::Class::CDBICompat);
index bba66e8..5485972 100644 (file)
@@ -1,15 +1,17 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
-use Test::More;
-use Class::Inspector ();
 
+use Test::More;
 
 use lib 't/cdbi/testlib';
 use Director;
 
-# Test that has_many() will load the foreign class.
+# Test that has_many() will load the foreign class
+require Class::Inspector;
 ok !Class::Inspector->loaded( 'Film' );
-ok eval { Director->has_many( films => 'Film' ); 1; } || diag $@;
+ok eval { Director->has_many( films => 'Film' ); 1; } or diag $@;
 
 my $shan_hua = Director->create({
     Name    => "Shan Hua",
index 5f92df2..3b92c4d 100644 (file)
@@ -1,9 +1,11 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
-use DBIC::Test::SQLite (); # this will issue the necessary SKIPs on missing reqs
 
 package Foo;
 
index 5dc2f1a..aba3821 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 #----------------------------------------------------------------------
index b3e850a..5fc1994 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index 8ca3bcf..1f1d1ac 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 use lib 't/cdbi/testlib';
 
index 22841c4..db0dc06 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 $| = 1;
 
index f362896..4045361 100644 (file)
@@ -1,5 +1,8 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
+
 use Test::More;
 
 use lib 't/cdbi/testlib';
index 03fe0ca..81f6f8a 100644 (file)
@@ -1,15 +1,10 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( icdt cdbicompat );
+
 use strict;
 use warnings;
-use Test::More;
 
+use Test::More;
 use lib 't/cdbi/testlib';
-use DBIC::Test::SQLite (); # this will issue the necessary SKIPs on missing reqs
-
-BEGIN {
-  eval { require DateTime; DateTime->VERSION(0.55) }
-    or plan skip_all => 'DateTime 0.55 required for this test';
-}
-
 
 # Don't use Test::NoWarnings because of an unrelated DBD::SQLite warning.
 my @warnings;
index 08fe4c9..e246b13 100644 (file)
@@ -1,15 +1,12 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( icdt cdbicompat );
+
 use strict;
 use warnings;
+
 use Test::More;
 use Test::Exception;
 
 use lib 't/cdbi/testlib';
-use DBIC::Test::SQLite (); # this will issue the necessary SKIPs on missing reqs
-
-BEGIN {
-  eval { require DateTime; DateTime->VERSION(0.55) }
-    or plan skip_all => 'DateTime 0.55 required for this test';
-}
 
 {
     package Thing;
index f645276..e14c4fa 100644 (file)
@@ -1,10 +1,12 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => 'cdbicompat';
+
 use strict;
 use warnings;
 
 use Test::More;
 
-use lib 't/cdbi/testlib';
-use DBIC::Test::SQLite;
+use lib 't/lib';
+use DBICTest;
 
 DBICTest::Schema::CD->load_components(qw/CDBICompat CDBICompat::Pager/);
 
index 905ed88..76822cd 100644 (file)
@@ -1,6 +1,9 @@
 package # hide from PAUSE
     DBIC::Test::SQLite;
 
+use strict;
+use warnings;
+
 =head1 NAME
 
 DBIx::Class::Test::SQLite - Base class for running Class::DBI tests against DBIx::Class compat layer, shamelessly ripped from Class::DBI::Test::SQLite
@@ -31,11 +34,6 @@ table, and tie it to the class.
 
 =cut
 
-use strict;
-use warnings;
-
-use Test::More;
-
 # adding implicit search criteria to the iterator will alter the test
 # mechanics - leave everything as-is instead, and hope SQLite won't
 # change too much
@@ -44,11 +42,6 @@ BEGIN { $ENV{DBIC_SHUFFLE_UNORDERED_RESULTSETS} = 0 }
 use lib 't/lib';
 use DBICTest;
 
-BEGIN {
-  eval { require DBIx::Class::CDBICompat }
-    or plan skip_all => 'Class::DBI required for this test';
-}
-
 use base qw/DBIx::Class/;
 
 __PACKAGE__->load_components(qw/CDBICompat Core DB/);
index 1fc77d0..1fe9317 100644 (file)
@@ -11,33 +11,13 @@ use DBICTest;
 
 use base qw(DBIx::Class::CDBICompat);
 
-our $dbh;
-
-my $err;
-if (! $ENV{DBICTEST_MYSQL_DSN} ) {
-  $err = 'Set $ENV{DBICTEST_MYSQL_DSN}, _USER and _PASS to run this test';
-}
-elsif ( ! DBIx::Class::Optional::Dependencies->req_ok_for ('test_rdbms_mysql') ) {
-  $err = 'Test needs ' . DBIx::Class::Optional::Dependencies->req_missing_for ('test_rdbms_mysql')
-}
-
-if ($err) {
-  my $t = eval { Test::Builder->new };
-  if ($t and ! $t->current_test) {
-    $t->skip_all ($err);
-  }
-  else {
-    die "$err\n";
-  }
-}
-
 my @connect = (@ENV{map { "DBICTEST_MYSQL_${_}" } qw/DSN USER PASS/}, { PrintError => 0});
 # this is only so we grab a lock on mysql
 {
   my $x = DBICTest::Schema->connect(@connect);
 }
 
-$dbh = DBI->connect(@connect) or die DBI->errstr;
+our $dbh = DBI->connect(@connect) or die DBI->errstr;
 my @table;
 
 END {