diff options
author | Jesse Luehrs <doy@tozt.net> | 2012-01-06 01:14:29 -0600 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2012-01-06 01:15:25 -0600 |
commit | d0719e8ad715588446409155d68fd1783486aa69 (patch) | |
tree | 71121b793602fba6ffad170dba646cc882bf4e3b | |
parent | de76247745ea63176649888b4ef40be01ce3cd16 (diff) | |
download | circular-require-d0719e8ad715588446409155d68fd1783486aa69.tar.gz circular-require-d0719e8ad715588446409155d68fd1783486aa69.zip |
show the entire cycle in the warning0.06
-rw-r--r-- | Changes | 1 | ||||
-rw-r--r-- | lib/circular/require.pm | 18 | ||||
-rw-r--r-- | t/basic.t | 6 | ||||
-rw-r--r-- | t/hidden_cycle.t | 2 | ||||
-rw-r--r-- | t/hide_middleman.t | 2 | ||||
-rw-r--r-- | t/hide_middleman2.t | 2 | ||||
-rw-r--r-- | t/hide_middleman3.t | 2 | ||||
-rw-r--r-- | t/long_cycle.t | 23 | ||||
-rw-r--r-- | t/long_cycle/Bar.pm | 3 | ||||
-rw-r--r-- | t/long_cycle/Baz.pm | 3 | ||||
-rw-r--r-- | t/long_cycle/Blorg.pm | 3 | ||||
-rw-r--r-- | t/long_cycle/Foo.pm | 3 | ||||
-rw-r--r-- | t/long_cycle/Quux.pm | 3 |
13 files changed, 58 insertions, 13 deletions
@@ -1,6 +1,7 @@ Revision history for circular-require {{$NEXT}} + - show the entire cycle in the warning 0.05 2012-01-04 - allow using -hide to avoid reporting unhelpful packages in the error diff --git a/lib/circular/require.pm b/lib/circular/require.pm index 5cc4657..6216653 100644 --- a/lib/circular/require.pm +++ b/lib/circular/require.pm @@ -60,17 +60,23 @@ sub _require { # string contexts at all my $string_file = $file; if (exists $loaded_from{$string_file}) { + my @cycle = ($string_file); + my $caller = $previous_file; - while (grep { m/^$caller$/ } @hide) { + while (defined($caller)) { + unshift @cycle, $caller + unless grep { /^$caller$/ } @hide; + last if $caller eq $string_file; $caller = $loaded_from{$caller}; - if (!defined($caller) || $caller eq $string_file) { - $caller = '<unknown file>'; - last; - } } - warn "Circular require detected: $string_file (from $caller)\n"; + if (@cycle > 1) { + warn "Circular require detected:\n " . join("\n ", @cycle) . "\n"; + } + else { + warn "Circular require detected in $string_file (from unknown file)\n"; + } } local $loaded_from{$string_file} = $previous_file; local $previous_file = $string_file; @@ -12,7 +12,7 @@ circular::require->unimport; my $warnings; local $SIG{__WARN__} = sub { $warnings .= $_[0] }; use_ok('Foo'); - is($warnings, "Circular require detected: Foo.pm (from Baz.pm)\nCircular require detected: Baz.pm (from Bar.pm)\n", "correct warnings"); + is($warnings, "Circular require detected:\n Foo.pm\n Baz.pm\n Foo.pm\nCircular require detected:\n Baz.pm\n Bar.pm\n Baz.pm\n", "correct warnings"); undef $warnings; use_ok('Foo'); @@ -25,7 +25,7 @@ circular::require->unimport; my $warnings; local $SIG{__WARN__} = sub { $warnings .= $_[0] }; use_ok('Bar'); - is($warnings, "Circular require detected: Baz.pm (from Foo.pm)\nCircular require detected: Bar.pm (from Baz.pm)\n", "correct warnings"); + is($warnings, "Circular require detected:\n Baz.pm\n Foo.pm\n Baz.pm\nCircular require detected:\n Bar.pm\n Baz.pm\n Bar.pm\n", "correct warnings"); clear(); } @@ -33,7 +33,7 @@ circular::require->unimport; my $warnings; local $SIG{__WARN__} = sub { $warnings .= $_[0] }; use_ok('Baz'); - is($warnings, "Circular require detected: Baz.pm (from Foo.pm)\nCircular require detected: Baz.pm (from Bar.pm)\n", "correct warnings"); + is($warnings, "Circular require detected:\n Baz.pm\n Foo.pm\n Baz.pm\nCircular require detected:\n Baz.pm\n Bar.pm\n Baz.pm\n", "correct warnings"); clear(); } diff --git a/t/hidden_cycle.t b/t/hidden_cycle.t index a2b33f1..39d03bc 100644 --- a/t/hidden_cycle.t +++ b/t/hidden_cycle.t @@ -16,7 +16,7 @@ my @warnings; is_deeply( \@warnings, - ["Circular require detected: Bar.pm (from <unknown file>)\n"], + ["Circular require detected in Bar.pm (from unknown file)\n"], "hiding all packages in the cycle shouldn't report a package outside of the cycle as being the source" ); diff --git a/t/hide_middleman.t b/t/hide_middleman.t index 90950b2..1bdb627 100644 --- a/t/hide_middleman.t +++ b/t/hide_middleman.t @@ -16,7 +16,7 @@ my @warnings; is_deeply( \@warnings, - ["Circular require detected: Foo.pm (from Bar.pm)\n"], + ["Circular require detected:\n Foo.pm\n Bar.pm\n Foo.pm\n"], "Show the module that used base, instead of 'base' when a cycle occurs from a use base." ); diff --git a/t/hide_middleman2.t b/t/hide_middleman2.t index bb3092a..f0cfae3 100644 --- a/t/hide_middleman2.t +++ b/t/hide_middleman2.t @@ -16,7 +16,7 @@ my @warnings; is_deeply( \@warnings, - ["Circular require detected: Foo.pm (from Bar.pm)\n"], + ["Circular require detected:\n Foo.pm\n Bar.pm\n Foo.pm\n"], "Show the module that used base, instead of 'base' when a cycle occurs from a use base." ); diff --git a/t/hide_middleman3.t b/t/hide_middleman3.t index 361eb45..1f888b3 100644 --- a/t/hide_middleman3.t +++ b/t/hide_middleman3.t @@ -19,7 +19,7 @@ my @warnings; is_deeply( \@warnings, - ["Circular require detected: Foo.pm (from <unknown file>)\n"], + ["Circular require detected in Foo.pm (from unknown file)\n"], "don't loop infinitely if all packages are hidden" ); diff --git a/t/long_cycle.t b/t/long_cycle.t new file mode 100644 index 0000000..fb0c703 --- /dev/null +++ b/t/long_cycle.t @@ -0,0 +1,23 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More; +use lib 't/long_cycle'; + +no circular::require; + +my @warnings; + +{ + $SIG{__WARN__} = sub { push @warnings => @_ }; + + use_ok( 'Foo' ); +} + +is_deeply( + \@warnings, + ["Circular require detected:\n Bar.pm\n Baz.pm\n Quux.pm\n Blorg.pm\n Bar.pm\n"], + "detection of longer cycles" +); + +done_testing; diff --git a/t/long_cycle/Bar.pm b/t/long_cycle/Bar.pm new file mode 100644 index 0000000..5d7209a --- /dev/null +++ b/t/long_cycle/Bar.pm @@ -0,0 +1,3 @@ +package Bar; +use Baz; +1; diff --git a/t/long_cycle/Baz.pm b/t/long_cycle/Baz.pm new file mode 100644 index 0000000..0ece003 --- /dev/null +++ b/t/long_cycle/Baz.pm @@ -0,0 +1,3 @@ +package Baz; +use Quux; +1; diff --git a/t/long_cycle/Blorg.pm b/t/long_cycle/Blorg.pm new file mode 100644 index 0000000..d84c3fc --- /dev/null +++ b/t/long_cycle/Blorg.pm @@ -0,0 +1,3 @@ +package Blorg; +use Bar; +1; diff --git a/t/long_cycle/Foo.pm b/t/long_cycle/Foo.pm new file mode 100644 index 0000000..1558402 --- /dev/null +++ b/t/long_cycle/Foo.pm @@ -0,0 +1,3 @@ +package Foo; +use Bar; +1; diff --git a/t/long_cycle/Quux.pm b/t/long_cycle/Quux.pm new file mode 100644 index 0000000..d0357d4 --- /dev/null +++ b/t/long_cycle/Quux.pm @@ -0,0 +1,3 @@ +package Quux; +use Blorg; +1; |