From 90cb3049e67c573dd479ba9ee5e4f5fe189916c2 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 21 Jun 2013 02:15:12 -0400 Subject: fix refreshing a module first loaded after the first refresh call --- Changes | 2 ++ lib/Class/Refresh.pm | 6 ++++++ t/data/new-modules/after/Foo.pm | 7 +++++++ t/data/new-modules/before/Foo.pm | 7 +++++++ t/data/new-modules/middle/Foo.pm | 7 +++++++ t/new-modules.t | 34 ++++++++++++++++++++++++++++++++++ 6 files changed, 63 insertions(+) create mode 100644 t/data/new-modules/after/Foo.pm create mode 100644 t/data/new-modules/before/Foo.pm create mode 100644 t/data/new-modules/middle/Foo.pm create mode 100644 t/new-modules.t diff --git a/Changes b/Changes index 85c4f27..5307fe2 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,8 @@ Revision history for Class-Refresh {{$NEXT}} + - fix refreshing a module for the first time when it was first loaded + after the first call to refresh 0.03 2013-06-21 - fix the case where reloading after a compilation error wouldn't work diff --git a/lib/Class/Refresh.pm b/lib/Class/Refresh.pm index 24569ab..2cbf0ca 100644 --- a/lib/Class/Refresh.pm +++ b/lib/Class/Refresh.pm @@ -74,6 +74,11 @@ Returns a list of modules which have changed since the last call to C. sub modified_modules { my $class = shift; + if (!%CACHE) { + $class->_update_cache_for($_) for keys %INC; + return; + } + my @ret; for my $file (keys %CACHE) { # refresh files that are in our @@ -89,6 +94,7 @@ sub modified_modules { } else { $class->_update_cache_for($file); + push @ret, $class->_file_to_mod($file); } } diff --git a/t/data/new-modules/after/Foo.pm b/t/data/new-modules/after/Foo.pm new file mode 100644 index 0000000..54b998e --- /dev/null +++ b/t/data/new-modules/after/Foo.pm @@ -0,0 +1,7 @@ +package Foo; +use strict; +use warnings; + +sub bar { 3 } + +1; diff --git a/t/data/new-modules/before/Foo.pm b/t/data/new-modules/before/Foo.pm new file mode 100644 index 0000000..71386af --- /dev/null +++ b/t/data/new-modules/before/Foo.pm @@ -0,0 +1,7 @@ +package Foo; +use strict; +use warnings; + +sub bar { 1 } + +1; diff --git a/t/data/new-modules/middle/Foo.pm b/t/data/new-modules/middle/Foo.pm new file mode 100644 index 0000000..2971777 --- /dev/null +++ b/t/data/new-modules/middle/Foo.pm @@ -0,0 +1,7 @@ +package Foo; +use strict; +use warnings; + +sub bar { 2 } + +1; diff --git a/t/new-modules.t b/t/new-modules.t new file mode 100644 index 0000000..aae0aff --- /dev/null +++ b/t/new-modules.t @@ -0,0 +1,34 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More; +use lib 't/lib'; +use Test::Class::Refresh; + +use Class::Refresh; + +my $dir = prepare_temp_dir_for('new-modules'); +push @INC, $dir->dirname; + +Class::Refresh->refresh; + +# load Foo after the first call to refresh +require Foo; + +is(Foo->bar, 1); + +sleep 2; +update_temp_dir_for('new-modules', $dir, 'middle'); + +Class::Refresh->refresh; + +is(Foo->bar, 2); + +sleep 2; +update_temp_dir_for('new-modules', $dir, 'after'); + +Class::Refresh->refresh; + +is(Foo->bar, 3); + +done_testing; -- cgit v1.2.3-54-g00ecf