summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-01-06 01:14:29 -0600
committerJesse Luehrs <doy@tozt.net>2012-01-06 01:15:25 -0600
commitd0719e8ad715588446409155d68fd1783486aa69 (patch)
tree71121b793602fba6ffad170dba646cc882bf4e3b
parentde76247745ea63176649888b4ef40be01ce3cd16 (diff)
downloadcircular-require-d0719e8ad715588446409155d68fd1783486aa69.tar.gz
circular-require-d0719e8ad715588446409155d68fd1783486aa69.zip
show the entire cycle in the warning0.06
-rw-r--r--Changes1
-rw-r--r--lib/circular/require.pm18
-rw-r--r--t/basic.t6
-rw-r--r--t/hidden_cycle.t2
-rw-r--r--t/hide_middleman.t2
-rw-r--r--t/hide_middleman2.t2
-rw-r--r--t/hide_middleman3.t2
-rw-r--r--t/long_cycle.t23
-rw-r--r--t/long_cycle/Bar.pm3
-rw-r--r--t/long_cycle/Baz.pm3
-rw-r--r--t/long_cycle/Blorg.pm3
-rw-r--r--t/long_cycle/Foo.pm3
-rw-r--r--t/long_cycle/Quux.pm3
13 files changed, 58 insertions, 13 deletions
diff --git a/Changes b/Changes
index 05b13b3..d1a1ffb 100644
--- a/Changes
+++ b/Changes
@@ -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;
diff --git a/t/basic.t b/t/basic.t
index 14eda8d..44fade4 100644
--- a/t/basic.t
+++ b/t/basic.t
@@ -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;