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
}
-# 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->{$_} ? qq("$_~>=$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 {
{ ($load_weights->{$b}||0) <=> ($load_weights->{$a}||0) }
keys %{
DBIx::Class::Optional::Dependencies->req_list_for([
- keys %{DBIx::Class::Optional::Dependencies->req_group_list}
+ grep
+ # some DBDs are notoriously problematic to load
+ # hence only show stuff based on test_rdbms which will
+ # take into account necessary ENVs
+ { $_ !~ /^rdbms_/ }
+ keys %{DBIx::Class::Optional::Dependencies->req_group_list}
])
}
;
{
# make module loading impossible, regardless of actual libpath contents
- local @INC = (sub { confess('Optional Dep Test') } );
+ local @INC;
# basic test using the deploy target
for ('deploy', ['deploy']) {
like (
DBIx::Class::Optional::Dependencies->modreq_errorlist_for ($_)->{'SQL::Translator'},
- qr/Optional Dep Test/,
- 'custom exception found in errorlist',
+ qr|\QCan't locate SQL/Translator.pm|,
+ 'correct "unable to locate" exception found in errorlist',
);
#make it so module appears loaded