summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-01-22 09:13:06 -0800
committerJesse Luehrs <doy@tozt.net>2014-01-22 09:13:06 -0800
commitb80006332c52b13b3c5eaae92d362fb20992a65c (patch)
tree5e4c6273f6e5fc0bd67e4101308c1d1c72de469c
parentf0153f9e0aa32910bef579d7956e59d933108261 (diff)
parenta117735e35a304fbf9a1c1ad1139d2845e2bf39e (diff)
downloadclass-refresh-b80006332c52b13b3c5eaae92d362fb20992a65c.tar.gz
class-refresh-b80006332c52b13b3c5eaae92d362fb20992a65c.zip
Merge pull request #2 from amacleay/master
Do not die if last require failed
-rw-r--r--lib/Class/Refresh.pm11
-rw-r--r--t/basic.t12
-rw-r--r--t/data/basic/after/Bar.pm5
3 files changed, 27 insertions, 1 deletions
diff --git a/lib/Class/Refresh.pm b/lib/Class/Refresh.pm
index eb1dda8..320490d 100644
--- a/lib/Class/Refresh.pm
+++ b/lib/Class/Refresh.pm
@@ -187,11 +187,20 @@ sub load_module {
my ($mod) = @_;
$mod = $class->_file_to_mod($mod);
+ my $file = $class->_mod_to_file($mod);
+ my $last_require_failed = exists $INC{$file} && !defined $INC{$file};
+
try {
Class::Load::load_class($mod);
}
catch {
- die $_;
+ if ($last_require_failed) {
+ # This file failed to load previously.
+ # Presumably that error has already been caught, so that's fine
+ }
+ else {
+ die $_;
+ }
}
finally {
$class->_update_cache_for($mod);
diff --git a/t/basic.t b/t/basic.t
index 9b7eb8a..9cf56a8 100644
--- a/t/basic.t
+++ b/t/basic.t
@@ -2,8 +2,10 @@
use strict;
use warnings;
use Test::More;
+use Test::Fatal;
use lib 't/lib';
use Test::Class::Refresh;
+use Try::Tiny;
use Class::Refresh;
@@ -37,4 +39,14 @@ is(eval '$Foo::FOO', 10, "package global exists with new value");
ok(!defined(eval '$Foo::BAR'), "other package global doesn't exist");
is(eval '$Foo::BAZ', 30, "third package global exists");
+try { require Bar } catch { "We expect this to fail, that's alright and happens sometimes" };
+Class::Refresh->refresh;
+ok(exists $INC{'Bar.pm'}, "Failed package \$INC value exists");
+ok(!defined $INC{'Bar.pm'}, "Failed package \$INC value is not defined after failed load");
+
+# Now do the same thing to validate that there's no error in repopulating %CACHE
+isnt(exception{ Class::Refresh->refresh }, "Second refresh is not an error");
+ok(exists $INC{'Bar.pm'}, "Failed package \$INC value exists: second attempt");
+ok(!defined $INC{'Bar.pm'}, "Failed package \$INC value is not defined after failed load: second attempt");
+
done_testing;
diff --git a/t/data/basic/after/Bar.pm b/t/data/basic/after/Bar.pm
new file mode 100644
index 0000000..06875fb
--- /dev/null
+++ b/t/data/basic/after/Bar.pm
@@ -0,0 +1,5 @@
+package Bar;
+
+use Bar::Fake;
+
+1;