From: Peter Rabbitson Date: Tue, 10 Feb 2015 08:38:51 +0000 (+0100) Subject: Finally implement compound OptDep group augmentation X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=2baba3d9dbc029462c5ce8e2b86c74ed650b22c0;hp=a3f8bd014894e2b48c0a8bb12d07e0524c6b9a35;p=dbsrgits%2FDBIx-Class.git Finally implement compound OptDep group augmentation 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. --- diff --git a/Changes b/Changes index edfbff9..82929a6 100644 --- 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 diff --git a/lib/DBIx/Class/Optional/Dependencies.pm b/lib/DBIx/Class/Optional/Dependencies.pm index 2a8b177..e07c732 100644 --- a/lib/DBIx/Class/Optional/Dependencies.pm +++ b/lib/DBIx/Class/Optional/Dependencies.pm @@ -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. ' + . '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 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's F): ... - 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 additionally requires:", + '=over', + ( map + { "=item * $_" . ($newreqs->{$_} ? " >= $newreqs->{$_}" : '') } + ( sort keys %$newreqs ) + ), + '=back', + ); + } + } } diff --git a/t/52leaks.t b/t/52leaks.t index fb8c1c0..a212a49 100644 --- a/t/52leaks.t +++ b/t/52leaks.t @@ -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; diff --git a/t/cdbi/70_implicit_inflate.t b/t/cdbi/70_implicit_inflate.t index 145a467..5c92f75 100644 --- a/t/cdbi/70_implicit_inflate.t +++ b/t/cdbi/70_implicit_inflate.t @@ -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; diff --git a/t/icdt/core.t b/t/icdt/core.t index c33054d..aa92602 100644 --- a/t/icdt/core.t +++ b/t/icdt/core.t @@ -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; diff --git a/t/icdt/engine_specific/firebird.t b/t/icdt/engine_specific/firebird.t index 207df9f..3247851 100644 --- a/t/icdt/engine_specific/firebird.t +++ b/t/icdt/engine_specific/firebird.t @@ -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; diff --git a/t/icdt/engine_specific/informix.t b/t/icdt/engine_specific/informix.t index 8335fc4..339d8cb 100644 --- a/t/icdt/engine_specific/informix.t +++ b/t/icdt/engine_specific/informix.t @@ -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; diff --git a/t/icdt/engine_specific/msaccess.t b/t/icdt/engine_specific/msaccess.t index f012199..4436922 100644 --- a/t/icdt/engine_specific/msaccess.t +++ b/t/icdt/engine_specific/msaccess.t @@ -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 || '' ], diff --git a/t/icdt/engine_specific/mssql.t b/t/icdt/engine_specific/mssql.t index edbac14..8e2dee4 100644 --- a/t/icdt/engine_specific/mssql.t +++ b/t/icdt/engine_specific/mssql.t @@ -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 = ( diff --git a/t/icdt/engine_specific/oracle.t b/t/icdt/engine_specific/oracle.t index bf59df3..d88a268 100644 --- a/t/icdt/engine_specific/oracle.t +++ b/t/icdt/engine_specific/oracle.t @@ -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; diff --git a/t/icdt/engine_specific/sqlanywhere.t b/t/icdt/engine_specific/sqlanywhere.t index 676665f..1c7b3ec 100644 --- a/t/icdt/engine_specific/sqlanywhere.t +++ b/t/icdt/engine_specific/sqlanywhere.t @@ -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 ], diff --git a/t/icdt/engine_specific/sqlite.t b/t/icdt/engine_specific/sqlite.t index 3077371..29a00c0 100644 --- a/t/icdt/engine_specific/sqlite.t +++ b/t/icdt/engine_specific/sqlite.t @@ -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; diff --git a/t/icdt/engine_specific/sybase.t b/t/icdt/engine_specific/sybase.t index e25ddfa..bf834aa 100644 --- a/t/icdt/engine_specific/sybase.t +++ b/t/icdt/engine_specific/sybase.t @@ -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; diff --git a/t/icdt/offline_mysql.t b/t/icdt/offline_mysql.t index 8ca6d3a..ff2d029 100644 --- a/t/icdt/offline_mysql.t +++ b/t/icdt/offline_mysql.t @@ -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; diff --git a/t/icdt/offline_pg.t b/t/icdt/offline_pg.t index 754fa3b..9a49aa8 100644 --- a/t/icdt/offline_pg.t +++ b/t/icdt/offline_pg.t @@ -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; diff --git a/xt/optional_deps.t b/xt/optional_deps.t index e6c0c1d..bf342f9 100644 --- a/xt/optional_deps.t +++ b/xt/optional_deps.t @@ -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', );