### This may look crazy, but it in fact tangibly ( by 50(!)% ) shortens
# the skip-test time when everything requested is unavailable
-use if $ENV{RELEASE_TESTING} => 'warnings';
-use if $ENV{RELEASE_TESTING} => 'strict';
+BEGIN {
+ if ( $ENV{RELEASE_TESTING} ) {
+ require warnings and warnings->import;
+ require strict and strict->import;
+ }
+}
sub croak {
require Carp;
},
# a common placeholder for engines with IC::DT support based off DT::F::S
- _icdt_strptime_based => {
+ _ic_dt_strptime_based => {
augment => {
- icdt => {
+ ic_dt => {
req => {
'DateTime::Format::Strptime' => '1.2',
},
# 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',
},
},
},
},
- icdt => {
+ ic_dt => {
req => {
'DateTime' => '0.55',
+ 'DateTime::TimeZone::OlsonDB' => 0,
},
pod => {
title => 'InflateColumn::DateTime support',
},
},
+ 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',
},
},
- 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
desc => 'Modules required to connect to SQLite',
},
augment => {
- icdt => {
+ ic_dt => {
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 => {
+ _ic_dt_pg_base => {
augment => {
- icdt => {
+ ic_dt => {
req => {
'DateTime::Format::Pg' => '0.16004',
},
},
},
+ ic_dt_pg => {
+ include => [qw( ic_dt _ic_dt_pg_base )],
+ },
+
rdbms_pg => {
- include => 'icdt_pg',
+ include => '_ic_dt_pg_base',
req => {
# when changing this list make sure to adjust xt/optional_deps.t
'DBD::Pg' => 0,
},
_rdbms_mssql_common => {
- include => '_icdt_strptime_based',
+ include => '_ic_dt_strptime_based',
},
rdbms_mssql_odbc => {
},
_rdbms_msaccess_common => {
- include => '_icdt_strptime_based',
+ include => '_ic_dt_strptime_based',
},
rdbms_msaccess_odbc => {
# 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 => {
+ _ic_dt_mysql_base => {
augment => {
- icdt => {
+ ic_dt => {
req => {
'DateTime::Format::MySQL' => '0',
},
},
},
+ ic_dt_mysql => {
+ include => [qw( ic_dt _ic_dt_mysql_base )],
+ },
+
rdbms_mysql => {
- include => 'icdt_mysql',
+ include => '_ic_dt_mysql_base',
req => {
'DBD::mysql' => 0,
},
desc => 'Modules required to connect to Oracle',
},
augment => {
- icdt => {
+ ic_dt => {
req => {
'DateTime::Format::Oracle' => '0',
},
},
rdbms_ase => {
- include => '_icdt_strptime_based',
+ include => '_ic_dt_strptime_based',
req => {
'DBD::Sybase' => 0,
},
_rdbms_db2_common => {
augment => {
- icdt => {
+ ic_dt => {
req => {
'DateTime::Format::DB2' => '0',
},
},
rdbms_informix => {
- include => '_icdt_strptime_based',
+ include => '_ic_dt_strptime_based',
req => {
'DBD::Informix' => 0,
},
},
_rdbms_sqlanywhere_common => {
- inclide => '_icdt_strptime_based',
+ include => '_ic_dt_strptime_based',
},
rdbms_sqlanywhere => {
},
_rdbms_firebird_common => {
- include => '_icdt_strptime_based',
+ include => '_ic_dt_strptime_based',
},
rdbms_firebird => {
# we need to run the dbicadmin so we can self-generate its POD
# also we do not want surprises in case JSON::XS is in the path
# so make sure we get an always-working JSON::Any
- include => [qw( admin_script _json_xs_compatible_json_any )],
+ include => [qw(
+ admin_script
+ _json_xs_compatible_json_any
+ id_shortener
+ deploy
+ test_pod
+ test_podcoverage
+ test_whitespace
+ test_strictures
+ )],
req => {
'ExtUtils::MakeMaker' => '6.64',
+ 'Module::Install' => '1.06',
'Pod::Inherit' => '0.91',
},
},
my ($self, $groups) = @_;
my $reqs = $self->_groups_to_reqs($groups);
- my $mods_missing = $self->modreq_missing_for($groups);
+
+ my $mods_missing = $reqs->{missing_envvars}
+ ? $self->_list_physically_missing_modules( $reqs->{modreqs} )
+ : $self->modreq_missing_for($groups)
+ ;
return '' if
! $mods_missing
or return '';
join ' ', map
- { $reqs->{modreqs}{$_} ? qq("$_~>=$reqs->{modreqs}{$_}") : $_ }
+ { $reqs->{modreqs}{$_} ? "$_~$reqs->{modreqs}{$_}" : $_ }
sort { lc($a) cmp lc($b) } keys %$modreq_errors
;
}
}
-# this method tries to load specified modreqs and returns a hashref of
+# this method tries to find/load specified modreqs and returns a hashref of
# module/loaderror pairs for anything that failed
sub _errorlist_for_modreqs {
# args supposedly already went through _groups_to_reqs and are therefore sanitized
$ret;
}
+# Unlike the above DO NOT try to load anything
+# This is executed when some needed envvars are not available
+# which in turn means a module load will never be reached anyway
+# This is important because some modules (especially DBDs) can be
+# *really* fickle when a require() is attempted, with pretty confusing
+# side-effects (especially on windows)
+sub _list_physically_missing_modules {
+ my ($self, $modreqs) = @_;
+
+ # in case there is a coderef in @INC there is nothing we can definitively prove
+ # so short circuit directly
+ return '' if grep { length ref $_ } @INC;
+
+ my @definitely_missing;
+ for my $mod (keys %$modreqs) {
+ (my $fn = $mod . '.pm') =~ s|::|/|g;
+
+ push @definitely_missing, $mod unless grep
+ # this should work on any combination of slashes
+ { $_ and -d $_ and -f "$_/$fn" and -r "$_/$fn" }
+ @INC
+ ;
+ }
+
+ join ' ', map
+ { $modreqs->{$_} ? "$_~$modreqs->{$_}" : $_ }
+ sort { lc($a) cmp lc($b) } @definitely_missing
+ ;
+}
+
# This is to be called by the author only (automatically in Makefile.PL)
sub _gen_pod {
my %DBIC_DEPLOY_AND_ORACLE_DEPS = %{ eval {
require $class;
- $class->req_list_for([qw( deploy rdbms_oracle icdt )]);
+ $class->req_list_for([qw( deploy rdbms_oracle ic_dt )]);
} || {} };
\$EUMM_ARGS{PREREQ_PM} = {
the returned string could look like:
EOC
- push @chunks, qq{ "SQL::Translator~>=$sqltver" (see $class documentation for details)};
+ push @chunks, qq{ "SQL::Translator~$sqltver" (see $class documentation for details)};
push @chunks, <<'EOC';
The author is expected to prepend the necessary text to this message before
the returned string could look like:
EOC
- push @chunks, qq{ "SQL::Translator~>=$sqltver"};
+ push @chunks, qq{ "SQL::Translator~$sqltver"};
push @chunks, <<'EOC';