Finally implement compound OptDep group augmentation
Peter Rabbitson [Tue, 10 Feb 2015 08:38:51 +0000 (09:38 +0100)]
A group can specify not only what it requires (with includes), but can also
request a specific set of modules IFF another group is required within the
same call. This allows to do e.g. IC::DT+RDBMS dependencies in a sane manner.

Delete test_dt* groups from our optdeps (they were never documented, and a
cpangrep does not show any use) - instead we replace them with an elaborate
network of augments.

16 files changed:
Changes
lib/DBIx/Class/Optional/Dependencies.pm
t/52leaks.t
t/cdbi/70_implicit_inflate.t
t/icdt/core.t
t/icdt/engine_specific/firebird.t
t/icdt/engine_specific/informix.t
t/icdt/engine_specific/msaccess.t
t/icdt/engine_specific/mssql.t
t/icdt/engine_specific/oracle.t
t/icdt/engine_specific/sqlanywhere.t
t/icdt/engine_specific/sqlite.t
t/icdt/engine_specific/sybase.t
t/icdt/offline_mysql.t
t/icdt/offline_pg.t
xt/optional_deps.t

diff --git a/Changes b/Changes
index edfbff9..82929a6 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,4 +1,9 @@
 Revision history for DBIx::Class
+    * New Features
+        - DBIx::Class::Optional::Dependencies now properly understands
+          combinations of requirements and does the right thing with e.g.
+          ->req_list_for([qw( rdbms_oracle icdt )]) bringing in the Oracle
+          specific DateTime::Format dependencies
 
     * Fixes
         - Fix incorrect collapsing-parser source being generated in the
index 2a8b177..e07c732 100644 (file)
@@ -43,8 +43,15 @@ my $dbic_reqs = {
   },
 
   # a common placeholder for engines with IC::DT support based off DT::F::S
-  # currently unused on purpose (see next commits)
-  _icdt_strptime_based => {},
+  _icdt_strptime_based => {
+    augment => {
+      icdt => {
+        req => {
+          'DateTime::Format::Strptime' => '1.2',
+        },
+      },
+    }
+  },
 
   _rdbms_generic_odbc => {
     req => {
@@ -108,6 +115,20 @@ my $dbic_reqs = {
     },
   },
 
+  icdt => {
+    req => {
+      'DateTime' => '0.55',
+    },
+    pod => {
+      title => 'InflateColumn::DateTime support',
+      desc =>
+        'Modules required for L<DBIx::Class::InflateColumn::DateTime>. '
+      . 'Note that this group does not require much on its own, but '
+      . 'instead is augmented by various RDBMS-specific groups. See the '
+      . 'documentation of each C<rbms_*> group for details',
+    },
+  },
+
   id_shortener => {
     req => {
       'Math::BigInt' => '1.80',
@@ -178,42 +199,8 @@ my $dbic_reqs = {
     },
   },
 
-  test_dt => {
-    req => {
-      'DateTime'                    => '0.55',
-      'DateTime::Format::Strptime'  => '1.2',
-    },
-  },
-
-  test_dt_sqlite => {
-    include => 'test_dt',
-    req => {
-      # t/36datetime.t
-      # t/60core.t
-      'DateTime::Format::SQLite'  => '0',
-    },
-  },
-
-  test_dt_mysql => {
-    include => 'test_dt',
-    req => {
-      # t/inflate/datetime_mysql.t
-      # (doesn't need Mysql itself)
-      'DateTime::Format::MySQL'   => '0',
-    },
-  },
-
-  test_dt_pg => {
-    include => 'test_dt',
-    req => {
-      # t/inflate/datetime_pg.t
-      # (doesn't need PG itself)
-      'DateTime::Format::Pg'      => '0.16004',
-    },
-  },
-
   test_cdbicompat => {
-    include => 'test_dt',
+    include => 'icdt',
     req => {
       'Class::DBI::Plugin::DeepAbstractSearch' => '0',
       'Time::Piece::MySQL'        => '0',
@@ -231,9 +218,30 @@ my $dbic_reqs = {
       title => 'SQLite support',
       desc => 'Modules required to connect to SQLite',
     },
+    augment => {
+      icdt => {
+        req => {
+          'DateTime::Format::SQLite' => '0',
+        },
+      },
+    },
+  },
+
+  # centralize the specification, as we have ICDT tests which can
+  # test the full behavior of RDBMS-specific ICDT on top of bare SQLite
+  # not _-prefixed so that it will show up under req_group_list
+  icdt_pg => {
+    augment => {
+      icdt => {
+        req => {
+          'DateTime::Format::Pg' => '0.16004',
+        },
+      },
+    },
   },
 
   rdbms_pg => {
+    include => 'icdt_pg',
     req => {
       # when changing this list make sure to adjust xt/optional_deps.t
       'DBD::Pg' => 0,
@@ -295,7 +303,21 @@ my $dbic_reqs = {
     },
   },
 
+  # centralize the specification, as we have ICDT tests which can
+  # test the full behavior of RDBMS-specific ICDT on top of bare SQLite
+  # not _-prefixed so that it will show up under req_group_list
+  icdt_mysql => {
+    augment => {
+      icdt => {
+        req => {
+          'DateTime::Format::MySQL' => '0',
+        },
+      },
+    },
+  },
+
   rdbms_mysql => {
+    include => 'icdt_mysql',
     req => {
       'DBD::mysql' => 0,
     },
@@ -314,6 +336,13 @@ my $dbic_reqs = {
       title => 'Oracle support',
       desc => 'Modules required to connect to Oracle',
     },
+    augment => {
+      icdt => {
+        req => {
+          'DateTime::Format::Oracle' => '0',
+        },
+      },
+    },
   },
 
   rdbms_ase => {
@@ -328,6 +357,13 @@ my $dbic_reqs = {
   },
 
   _rdbms_db2_common => {
+    augment => {
+      icdt => {
+        req => {
+          'DateTime::Format::DB2' => '0',
+        },
+      },
+    },
   },
 
   rdbms_db2 => {
@@ -514,7 +550,6 @@ my $dbic_reqs = {
       DBICTEST_ORA_PASS => 0,
     ],
     req => {
-      'DateTime::Format::Oracle' => '0',
       'DBD::Oracle'              => '1.24',
     },
   },
@@ -879,6 +914,7 @@ sub __expand_includes {
       idx => 1 + keys %$rv,
       missing_envvars => $missing_envvars->{$_},
     } for @ret;
+    $rv->{$_}{user_requested} = 1 for @$groups;
     $rv;
   };
 }
@@ -903,20 +939,59 @@ sub _groups_to_reqs {
 
   my $all_groups = __expand_includes($groups);
 
+  # pre-assemble list of augmentations, perform basic sanity checks
+  # Note that below we *DO NOT* respect the source/target reationship, but
+  # instead always default to augment the "later" group
+  # This is done so that the "stable/variable" boundary keeps working as
+  # expected
+  my $augmentations;
+  for my $requesting_group (keys %$all_groups) {
+    if (my $ag = $dbic_reqs->{$requesting_group}{augment}) {
+      for my $target_group (keys %$ag) {
+
+        croak "Group '$requesting_group' claims to augment a non-existent group '$target_group'"
+          unless $dbic_reqs->{$target_group};
+
+        croak "Augmentation combined with variable effective_modreqs currently unsupported for group '$requesting_group'"
+          if $dbic_reqs->{$requesting_group}{env};
+
+        croak "Augmentation of group '$target_group' with variable effective_modreqs unsupported (requested by '$requesting_group')"
+          if $dbic_reqs->{$target_group}{env};
+
+        if (my @foreign = grep { $_ ne 'req' } keys %{$ag->{$target_group}} ) {
+          croak "Only 'req' augmentations are currently supported (group '$requesting_group' attempts to alter '$foreign[0]' of group '$target_group'";
+        }
+
+        $ret->{augments}{$target_group} = 1;
+
+        # no augmentation for stuff that hasn't been selected
+        if ( $all_groups->{$target_group} and my $ar = $ag->{$target_group}{req} ) {
+          push @{$augmentations->{
+            ( $all_groups->{$requesting_group}{idx} < $all_groups->{$target_group}{idx} )
+              ? $target_group
+              : $requesting_group
+          }}, $ar;
+        }
+      }
+    }
+  }
+
   for my $group (sort { $all_groups->{$a}{idx} <=> $all_groups->{$b}{idx} } keys %$all_groups ) {
 
     my $group_reqs = $dbic_reqs->{$group}{req};
 
     # sanity-check
-    for (keys %$group_reqs) {
+    for my $req_bag ($group_reqs, @{ $augmentations->{$group} || [] } ) {
+      for (keys %$req_bag) {
 
-      $_ =~ /\A [A-Z_a-z][0-9A-Z_a-z]* (?:::[0-9A-Z_a-z]+)* \z /x
-        or croak "Requirement '$_' in group '$group' is not a valid module name";
+        $_ =~ /\A [A-Z_a-z][0-9A-Z_a-z]* (?:::[0-9A-Z_a-z]+)* \z /x
+          or croak "Requirement '$_' in group '$group' is not a valid module name";
 
-      # !!!DO NOT CHANGE!!!
-      # remember - version.pm may not be available on the system
-      croak "Requirement '$_' in group '$group' specifies an invalid version '$group_reqs->{$_}' (only plain non-underscored floating point decimals are supported)"
-        if ( ($group_reqs->{$_}||0) !~ / \A [0-9]+ (?: \. [0-9]+ )? \z /x );
+        # !!!DO NOT CHANGE!!!
+        # remember - version.pm may not be available on the system
+        croak "Requirement '$_' in group '$group' specifies an invalid version '$req_bag->{$_}' (only plain non-underscored floating point decimals are supported)"
+          if ( ($req_bag->{$_}||0) !~ / \A [0-9]+ (?: \. [0-9]+ )? \z /x );
+      }
     }
 
     if (my $e = $all_groups->{$group}{missing_envvars}) {
@@ -928,7 +1003,7 @@ sub _groups_to_reqs {
       'modreqs',
       ( $ret->{missing_envvars} ? () : 'effective_modreqs' ),
     ) {
-      for my $req_bag ($group_reqs) {
+      for my $req_bag ($group_reqs, @{ $augmentations->{$group} || [] } ) {
         for my $mod (keys %$req_bag) {
 
           $ret->{$type}{$mod} = $req_bag->{$mod}||0 if (
@@ -943,7 +1018,8 @@ sub _groups_to_reqs {
       }
     }
 
-    $ret->{modreqs_fully_documented} &&= !!$dbic_reqs->{$group}{pod};
+    $ret->{modreqs_fully_documented} &&= !!$dbic_reqs->{$group}{pod}
+      if $all_groups->{$group}{user_requested};
 
     $ret->{release_testing_mandatory} ||= !!$dbic_reqs->{$group}{release_testing_mandatory};
   }
@@ -1048,13 +1124,13 @@ Somewhere in your build-file (e.g. L<ExtUtils::MakeMaker>'s F<Makefile.PL>):
 
   ...
 
-  my %DBIC_DEPLOY_DEPS = %{ eval {
+  my %DBIC_DEPLOY_AND_ORACLE_DEPS = %{ eval {
     require $class;
-    $class->req_list_for('deploy');
+    $class->req_list_for([qw( deploy rdbms_oracle icdt )]);
   } || {} };
 
   \$EUMM_ARGS{PREREQ_PM} = {
-    \%DBIC_DEPLOY_DEPS,
+    \%DBIC_DEPLOY_AND_ORACLE_DEPS,
     \%{ \$EUMM_ARGS{PREREQ_PM} || {} },
   };
 
@@ -1108,22 +1184,63 @@ EOC
 #@@
   push @chunks, '=head1 CURRENT REQUIREMENT GROUPS';
 
+  my $standalone_info;
+
   for my $group (sort keys %$dbic_reqs) {
-    my $p = $dbic_reqs->{$group}{pod}
-      or next;
 
-    my $modlist = $class->modreq_list_for($group);
+    my $info = $standalone_info->{$group} ||= $class->_groups_to_reqs($group);
 
-    next unless keys %$modlist;
+    next unless (
+      $info->{modreqs_fully_documented}
+        and
+      ( $info->{augments} or $info->{modreqs} )
+    );
+
+    my $p = $dbic_reqs->{$group}{pod};
 
     push @chunks, (
       "=head2 $p->{title}",
-      "$p->{desc}",
+      "=head3 $group",
+      $p->{desc},
       '=over',
-      ( map { "=item * $_" . ($modlist->{$_} ? " >= $modlist->{$_}" : '') } (sort keys %$modlist) ),
-      '=back',
-      "Requirement group: B<$group>",
     );
+
+    if ( keys %{ $info->{modreqs}||{} } ) {
+      push @chunks, map
+        { "=item * $_" . ($info->{modreqs}{$_} ? " >= $info->{modreqs}{$_}" : '') }
+        ( sort keys %{ $info->{modreqs} } )
+      ;
+    }
+    else {
+      push @chunks, '=item * No standalone requirements',
+    }
+
+    push @chunks, '=back';
+
+    for my $ag ( sort keys %{ $info->{augments} || {} } ) {
+      my $ag_info = $standalone_info->{$ag} ||= $class->_groups_to_reqs($ag);
+
+      my $newreqs = $class->modreq_list_for([ $group, $ag ]);
+      for (keys %$newreqs) {
+        delete $newreqs->{$_} if (
+          ( defined $info->{modreqs}{$_}    and $info->{modreqs}{$_}    == $newreqs->{$_} )
+            or
+          ( defined $ag_info->{modreqs}{$_} and $ag_info->{modreqs}{$_} == $newreqs->{$_} )
+        );
+      }
+
+      if (keys %$newreqs) {
+        push @chunks, (
+          "Combined with L</$ag> additionally requires:",
+          '=over',
+          ( map
+            { "=item * $_" . ($newreqs->{$_} ? " >= $newreqs->{$_}" : '') }
+            ( sort keys %$newreqs )
+          ),
+          '=back',
+        );
+      }
+    }
   }
 
 
index fb8c1c0..a212a49 100644 (file)
@@ -117,7 +117,7 @@ unless (DBICTest::RunMode->is_plain) {
   # Load them and empty the registry
 
   # this loads the DT armada
-  $has_dt = DBIx::Class::Optional::Dependencies->req_ok_for('test_dt_sqlite');
+  $has_dt = DBIx::Class::Optional::Dependencies->req_ok_for([qw( test_rdbms_sqlite icdt )]);
 
   require Errno;
   require DBI;
index 145a467..5c92f75 100644 (file)
@@ -1,4 +1,4 @@
-use DBIx::Class::Optional::Dependencies -skip_all_without => 'test_dt_sqlite';
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( rdbms_sqlite icdt );
 
 use strict;
 use warnings;
index c33054d..aa92602 100644 (file)
@@ -1,4 +1,4 @@
-use DBIx::Class::Optional::Dependencies -skip_all_without => 'test_dt';
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( test_rdbms_sqlite icdt );
 
 use strict;
 use warnings;
index 207df9f..3247851 100644 (file)
@@ -1,4 +1,4 @@
-use DBIx::Class::Optional::Dependencies -skip_all_without => 'test_dt';
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( icdt _rdbms_firebird_common );
 
 use strict;
 use warnings;
@@ -14,13 +14,14 @@ my $env2optdep = {
   DBICTEST_FIREBIRD_ODBC => 'test_rdbms_firebird_odbc',
 };
 
-plan skip_all => join (' ',
-  'Set $ENV{DBICTEST_FIREBIRD_DSN} and/or $ENV{DBICTEST_FIREBIRD_INTERBASE_DSN}',
-  'and/or $ENV{DBICTEST_FIREBIRD_ODBC_DSN},',
-  '_USER and _PASS to run these tests.',
-
-  "WARNING: This test drops and creates a table called 'event'",
-) unless grep { $ENV{"${_}_DSN"} } keys %$env2optdep;
+my @tdeps = values %$env2optdep;
+plan skip_all => 'Test needs  ' . (join '  OR  ', map
+  { "[ @{[ DBIx::Class::Optional::Dependencies->req_missing_for( $_ ) ]} ]" }
+  @tdeps
+) unless scalar grep
+  { DBIx::Class::Optional::Dependencies->req_ok_for( $_ ) }
+  @tdeps
+;
 
 my $schema;
 
index 8335fc4..339d8cb 100644 (file)
@@ -1,4 +1,4 @@
-use DBIx::Class::Optional::Dependencies -skip_all_without => qw( test_dt test_rdbms_informix );
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( icdt test_rdbms_informix );
 
 use strict;
 use warnings;
index f012199..4436922 100644 (file)
@@ -1,34 +1,26 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( icdt _rdbms_msaccess_common );
+
 use strict;
 use warnings;
 
 use Test::More;
 use Scope::Guard ();
 use Try::Tiny;
-use DBIx::Class::Optional::Dependencies ();
 use lib qw(t/lib);
 use DBICTest;
 
+my @tdeps = qw( test_rdbms_msaccess_odbc test_rdbms_msaccess_ado );
+plan skip_all => 'Test needs  ' . (join '  OR  ', map
+  { "[ @{[ DBIx::Class::Optional::Dependencies->req_missing_for( $_ ) ]} ]" }
+  @tdeps
+) unless scalar grep
+  { DBIx::Class::Optional::Dependencies->req_ok_for( $_ ) }
+  @tdeps
+;
+
 my ($dsn,  $user,  $pass)  = @ENV{map { "DBICTEST_MSACCESS_ODBC_${_}" } qw/DSN USER PASS/};
 my ($dsn2, $user2, $pass2) = @ENV{map { "DBICTEST_MSACCESS_ADO_${_}" }  qw/DSN USER PASS/};
 
-plan skip_all => 'Test needs ' .
-  (join ' and ', map { $_ ? $_ : () }
-    DBIx::Class::Optional::Dependencies->req_missing_for('test_dt'),
-    (join ' or ', map { $_ ? $_ : () }
-      DBIx::Class::Optional::Dependencies->req_missing_for('test_rdbms_msaccess_odbc'),
-      DBIx::Class::Optional::Dependencies->req_missing_for('test_rdbms_msaccess_ado')))
-  unless
-    DBIx::Class::Optional::Dependencies->req_ok_for ('test_dt') && (
-    $dsn && DBIx::Class::Optional::Dependencies->req_ok_for('test_rdbms_msaccess_odbc')
-    or
-    $dsn2 && DBIx::Class::Optional::Dependencies->req_ok_for('test_rdbms_msaccess_ado'))
-      or (not $dsn || $dsn2);
-
-plan skip_all => <<'EOF' unless $dsn || $dsn2;
-Set $ENV{DBICTEST_MSACCESS_ODBC_DSN} and/or $ENV{DBICTEST_MSACCESS_ADO_DSN} (and optionally _USER and _PASS) to run these tests.
-Warning: this test drops and creates the table 'track'.
-EOF
-
 my @connect_info = (
   [ $dsn,  $user  || '', $pass  || '' ],
   [ $dsn2, $user2 || '', $pass2 || '' ],
index edbac14..8e2dee4 100644 (file)
@@ -1,3 +1,5 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( icdt _rdbms_mssql_common );
+
 use strict;
 use warnings;
 
@@ -5,38 +7,22 @@ use Test::More;
 use Test::Exception;
 use Scope::Guard ();
 use Try::Tiny;
-use DBIx::Class::Optional::Dependencies ();
 use lib qw(t/lib);
 use DBICTest;
 
+my @tdeps = qw( test_rdbms_mssql_odbc test_rdbms_mssql_sybase test_rdbms_mssql_ado );
+plan skip_all => 'Test needs  ' . (join '  OR  ', map
+  { "[ @{[ DBIx::Class::Optional::Dependencies->req_missing_for( $_ ) ]} ]" }
+  @tdeps
+) unless scalar grep
+  { DBIx::Class::Optional::Dependencies->req_ok_for( $_ ) }
+  @tdeps
+;
+
 my ($dsn,  $user,  $pass)  = @ENV{map { "DBICTEST_MSSQL_ODBC_${_}" } qw/DSN USER PASS/};
 my ($dsn2, $user2, $pass2) = @ENV{map { "DBICTEST_MSSQL_${_}" }      qw/DSN USER PASS/};
 my ($dsn3, $user3, $pass3) = @ENV{map { "DBICTEST_MSSQL_ADO_${_}" }  qw/DSN USER PASS/};
 
-plan skip_all => 'Test needs ' .
-  (join ' and ', map { $_ ? $_ : () }
-    DBIx::Class::Optional::Dependencies->req_missing_for('test_dt'),
-    (join ' or ', map { $_ ? $_ : () }
-      DBIx::Class::Optional::Dependencies->req_missing_for('test_rdbms_mssql_odbc'),
-      DBIx::Class::Optional::Dependencies->req_missing_for('test_rdbms_mssql_sybase'),
-      DBIx::Class::Optional::Dependencies->req_missing_for('test_rdbms_mssql_ado')))
-  unless
-    DBIx::Class::Optional::Dependencies->req_ok_for ('test_dt') && (
-    $dsn && DBIx::Class::Optional::Dependencies->req_ok_for('test_rdbms_mssql_odbc')
-    or
-    $dsn2 && DBIx::Class::Optional::Dependencies->req_ok_for('test_rdbms_mssql_sybase')
-    or
-    $dsn3 && DBIx::Class::Optional::Dependencies->req_ok_for('test_rdbms_mssql_ado'))
-      or (not $dsn || $dsn2 || $dsn3);
-
-if (not ($dsn || $dsn2 || $dsn3)) {
-  plan skip_all =>
-    'Set $ENV{DBICTEST_MSSQL_ODBC_DSN} and/or $ENV{DBICTEST_MSSQL_DSN} and/or '
-    .'$ENV{DBICTEST_MSSQL_ADO_DSN} _USER and _PASS to run this test' .
-    "\nWarning: This test drops and creates tables called 'event_small_dt' and"
-    ." 'track'.";
-}
-
 DBICTest::Schema->load_classes('EventSmallDT');
 
 my @connect_info = (
index bf59df3..d88a268 100644 (file)
@@ -1,4 +1,4 @@
-use DBIx::Class::Optional::Dependencies -skip_all_without => 'test_rdbms_oracle';
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( icdt test_rdbms_oracle );
 
 use strict;
 use warnings;
index 676665f..1c7b3ec 100644 (file)
@@ -1,36 +1,25 @@
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( icdt _rdbms_sqlanywhere_common );
+
 use strict;
 use warnings;
 
 use Test::More;
 use Scope::Guard ();
-use DBIx::Class::Optional::Dependencies ();
 use lib qw(t/lib);
 use DBICTest;
 
+my @tdeps = qw( test_rdbms_sqlanywhere test_rdbms_sqlanywhere_odbc );
+plan skip_all => 'Test needs  ' . (join '  OR  ', map
+  { "[ @{[ DBIx::Class::Optional::Dependencies->req_missing_for( $_ ) ]} ]" }
+  @tdeps
+) unless scalar grep
+  { DBIx::Class::Optional::Dependencies->req_ok_for( $_ ) }
+  @tdeps
+;
+
 my ($dsn, $user, $pass)    = @ENV{map { "DBICTEST_SQLANYWHERE_${_}" }      qw/DSN USER PASS/};
 my ($dsn2, $user2, $pass2) = @ENV{map { "DBICTEST_SQLANYWHERE_ODBC_${_}" } qw/DSN USER PASS/};
 
-plan skip_all => 'Test needs ' .
-  (join ' and ', map { $_ ? $_ : () }
-    DBIx::Class::Optional::Dependencies->req_missing_for('test_dt'),
-    (join ' or ', map { $_ ? $_ : () }
-      DBIx::Class::Optional::Dependencies->req_missing_for('test_rdbms_sqlanywhere'),
-      DBIx::Class::Optional::Dependencies->req_missing_for('test_rdbms_sqlanywhere_odbc')))
-  unless
-    DBIx::Class::Optional::Dependencies->req_ok_for ('test_dt') && (
-    $dsn && DBIx::Class::Optional::Dependencies->req_ok_for('test_rdbms_sqlanywhere')
-    or
-    $dsn2 && DBIx::Class::Optional::Dependencies->req_ok_for('test_rdbms_sqlanywhere_odbc'))
-      or (not $dsn || $dsn2);
-
-if (not ($dsn || $dsn2)) {
-  plan skip_all => <<'EOF';
-Set $ENV{DBICTEST_SQLANYWHERE_DSN} and/or $ENV{DBICTEST_SQLANYWHERE_ODBC_DSN}
-_USER and _PASS to run this test'.
-Warning: This test drops and creates a table called 'event'";
-EOF
-}
-
 my @info = (
   [ $dsn,  $user,  $pass  ],
   [ $dsn2, $user2, $pass2 ],
index 3077371..29a00c0 100644 (file)
@@ -1,4 +1,4 @@
-use DBIx::Class::Optional::Dependencies -skip_all_without => 'test_dt_sqlite';
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( icdt test_rdbms_sqlite );
 
 use strict;
 use warnings;
index e25ddfa..bf834aa 100644 (file)
@@ -1,4 +1,4 @@
-use DBIx::Class::Optional::Dependencies -skip_all_without => qw(test_dt test_rdbms_ase);
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( icdt test_rdbms_ase );
 
 use strict;
 use warnings;
index 8ca6d3a..ff2d029 100644 (file)
@@ -1,4 +1,4 @@
-use DBIx::Class::Optional::Dependencies -skip_all_without => 'test_dt_mysql';
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( icdt icdt_mysql );
 
 use strict;
 use warnings;
index 754fa3b..9a49aa8 100644 (file)
@@ -1,4 +1,4 @@
-use DBIx::Class::Optional::Dependencies -skip_all_without => 'test_dt_pg';
+use DBIx::Class::Optional::Dependencies -skip_all_without => qw( icdt icdt_pg );
 
 use strict;
 use warnings;
index e6c0c1d..bf342f9 100644 (file)
@@ -27,7 +27,6 @@ is_deeply (
   'Nothing loaded other than DBIx::Class::OptDeps',
 ) unless $ENV{RELEASE_TESTING};
 
-
 # check the project-local groups for sanity
 lives_ok {
   DBIx::Class::Optional::Dependencies->req_group_list
@@ -130,6 +129,7 @@ is_deeply (
   local $ENV{DBICTEST_MYSQL_DSN};
   local $ENV{DBICTEST_PG_DSN};
 
+# regular
   is_deeply(
     DBIx::Class::Optional::Dependencies->modreq_list_for('test_rdbms_pg'),
     { 'DBD::Pg' => '2.009002' },
@@ -186,35 +186,66 @@ is_deeply (
     'optional dependencies error text for testing Postgres matches with evvar',
   );
 
+# ICDT augmentation
+  my $mysql_icdt = [shuffle qw( test_rdbms_mysql icdt )];
+
+  is_deeply(
+    DBIx::Class::Optional::Dependencies->modreq_list_for($mysql_icdt),
+    {
+      'DateTime' => '0.55',
+      'DBD::mysql' => 0,
+      'DateTime::Format::MySQL' => 0,
+    },
+    'optional module dependencies list for testing ICDT MySQL without envvar',
+  );
+
+  is_deeply(
+    DBIx::Class::Optional::Dependencies->req_list_for($mysql_icdt),
+    {
+      'DateTime' => '0.55',
+    },
+    'optional dependencies list for testing ICDT MySQL without envvar',
+  );
+
+  is(
+    DBIx::Class::Optional::Dependencies->req_missing_for($mysql_icdt),
+    '"DateTime~>=0.55" DateTime::Format::MySQL DBD::mysql as well as the following group(s) of environment variables: DBICTEST_MYSQL_DSN/..._USER/..._PASS',
+    'missing optional dependencies for testing ICDT MySQL without envvars'
+  );
+
 # test multi-level include with a variable and mandatory part converging on same included dep
   local $ENV{DBICTEST_MSACCESS_ODBC_DSN};
   local $ENV{DBICTEST_MSSQL_ODBC_DSN} = 'foo';
-  my $msaccess_mssql = [ shuffle qw( test_rdbms_msaccess_odbc test_rdbms_mssql_odbc ) ];
+  my $msaccess_mssql_icdt = [ shuffle qw( test_rdbms_msaccess_odbc test_rdbms_mssql_odbc icdt ) ];
   is_deeply(
-    DBIx::Class::Optional::Dependencies->req_missing_for($msaccess_mssql),
-    'Data::GUID DBD::ODBC as well as the following group(s) of environment variables: DBICTEST_MSACCESS_ODBC_DSN/..._USER/..._PASS',
+    DBIx::Class::Optional::Dependencies->req_missing_for($msaccess_mssql_icdt),
+    'Data::GUID "DateTime~>=0.55" "DateTime::Format::Strptime~>=1.2" DBD::ODBC as well as the following group(s) of environment variables: DBICTEST_MSACCESS_ODBC_DSN/..._USER/..._PASS',
     'Correct req_missing_for on multi-level converging include',
   );
 
   is_deeply(
-    DBIx::Class::Optional::Dependencies->modreq_missing_for($msaccess_mssql),
-    'Data::GUID DBD::ODBC',
+    DBIx::Class::Optional::Dependencies->modreq_missing_for($msaccess_mssql_icdt),
+    'Data::GUID "DateTime~>=0.55" "DateTime::Format::Strptime~>=1.2" DBD::ODBC',
     'Correct modreq_missing_for on multi-level converging include',
   );
 
   is_deeply(
-    DBIx::Class::Optional::Dependencies->req_list_for($msaccess_mssql),
+    DBIx::Class::Optional::Dependencies->req_list_for($msaccess_mssql_icdt),
     {
       'DBD::ODBC' => 0,
+      'DateTime' => '0.55',
+      'DateTime::Format::Strptime' => '1.2',
     },
     'Correct req_list_for on multi-level converging include',
   );
 
   is_deeply(
-    DBIx::Class::Optional::Dependencies->modreq_list_for($msaccess_mssql),
+    DBIx::Class::Optional::Dependencies->modreq_list_for($msaccess_mssql_icdt),
     {
       'DBD::ODBC' => 0,
       'Data::GUID' => 0,
+      'DateTime' => '0.55',
+      'DateTime::Format::Strptime' => '1.2',
     },
     'Correct modreq_list_for on multi-level converging include',
   );