[Catalyst-commits] r6413 - in trunk/Catalyst-Runtime: . lib t
ash at dev.catalyst.perl.org
ash at dev.catalyst.perl.org
Mon May 21 21:41:56 GMT 2007
Author: ash
Date: 2007-05-21 21:41:55 +0100 (Mon, 21 May 2007)
New Revision: 6413
Modified:
trunk/Catalyst-Runtime/Changes
trunk/Catalyst-Runtime/lib/Catalyst.pm
trunk/Catalyst-Runtime/t/unit_core_component_loading.t
Log:
Fix bug where a nested component would be setup twice
Modified: trunk/Catalyst-Runtime/Changes
===================================================================
--- trunk/Catalyst-Runtime/Changes 2007-05-19 22:20:31 UTC (rev 6412)
+++ trunk/Catalyst-Runtime/Changes 2007-05-21 20:41:55 UTC (rev 6413)
@@ -1,5 +1,7 @@
This file documents the revision history for Perl extension Catalyst.
+ - Fix bug where a nested component would be setup twice
+
5.7008
- Fixed a bug where Content-Length could be set to 0 if a filehandle
object in $c->response->body did not report a size.
Modified: trunk/Catalyst-Runtime/lib/Catalyst.pm
===================================================================
--- trunk/Catalyst-Runtime/lib/Catalyst.pm 2007-05-19 22:20:31 UTC (rev 6412)
+++ trunk/Catalyst-Runtime/lib/Catalyst.pm 2007-05-21 20:41:55 UTC (rev 6413)
@@ -1856,8 +1856,11 @@
search_path => [ map { s/^(?=::)/$class/; $_; } @paths ],
%$config
);
+
+ my @comps = sort { length $a <=> length $b } $locator->plugins;
+ my %comps = map { $_ => 1 } @comps;
- for my $component ( sort { length $a <=> length $b } $locator->plugins ) {
+ for my $component ( @comps ) {
Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } );
my $module = $class->setup_component( $component );
@@ -1865,6 +1868,8 @@
$component => $module,
map {
$_ => $class->setup_component( $_ )
+ } grep {
+ not exists $comps{$_}
} Devel::InnerPackage::list_packages( $component )
);
Modified: trunk/Catalyst-Runtime/t/unit_core_component_loading.t
===================================================================
--- trunk/Catalyst-Runtime/t/unit_core_component_loading.t 2007-05-19 22:20:31 UTC (rev 6412)
+++ trunk/Catalyst-Runtime/t/unit_core_component_loading.t 2007-05-21 20:41:55 UTC (rev 6413)
@@ -1,7 +1,7 @@
# 2 initial tests, and 6 per component in the loop below
# (do not forget to update the number of components in test 3 as well)
-# 4 extra tests for the loading options
-use Test::More tests => 2 + 6 * 24 + 4;
+# 5 extra tests for the loading options
+use Test::More tests => 2 + 6 * 24 + 5;
use strict;
use warnings;
@@ -40,6 +40,18 @@
{ type => 'View', prefix => 'View', name => 'Foo' },
);
+sub write_component_file {
+ my ($dir_list, $module_name, $content) = @_;
+
+ my $dir = File::Spec->catdir(@$dir_list);
+ my $file = File::Spec->catfile($dir, $module_name . '.pm');
+
+ mkpath(join(q{/}, @$dir_list) );
+ open(my $fh, '>', $file) or die "Could not open file $file for writing: $!";
+ print $fh $content;
+ close $fh;
+}
+
sub make_component_file {
my ($type, $prefix, $name) = @_;
@@ -48,13 +60,8 @@
my @namedirs = split(/::/, $name);
my $name_final = pop(@namedirs);
my @dir_list = ($libdir, $appclass, $prefix, @namedirs);
- my $dir_ux = join(q{/}, @dir_list);
- my $dir = File::Spec->catdir(@dir_list);
- my $file = File::Spec->catfile($dir, $name_final . '.pm');
- mkpath($dir_ux); # mkpath wants unix '/' seperators :p
- open(my $fh, '>', $file) or die "Could not open file $file for writing: $!";
- print $fh <<EOF;
+ write_component_file(\@dir_list, $name_final, <<EOF);
package $fullname;
use base '$compbase';
sub COMPONENT {
@@ -66,8 +73,6 @@
1;
EOF
-
- close($fh);
}
foreach my $component (@components) {
@@ -151,4 +156,41 @@
ok( !exists $complist->{ "${appclass}::Controller::Foo" }, 'Controller::Foo was skipped' );
ok( exists $complist->{ "${appclass}::Extra::Foo" }, 'Extra::Foo was loaded' );
-rmtree($libdir);
\ No newline at end of file
+rmtree($libdir);
+
+$appclass = "ComponentOnce";
+
+write_component_file([$libdir, $appclass, 'Model'], 'TopLevel', <<EOF);
+package ${appclass}::Model::TopLevel;
+use base 'Catalyst::Model';
+sub COMPONENT {
+
+ my \$self = shift->NEXT::COMPONENT(\@_);
+ no strict 'refs';
+ *{\__PACKAGE__ . "::whoami"} = sub { return \__PACKAGE__; };
+ \$self;
+}
+
+package ${appclass}::Model::TopLevel::Nested;
+
+sub COMPONENT { die "COMPONENT called in the wrong order!"; }
+
+1;
+
+EOF
+
+write_component_file([$libdir, $appclass, 'Model', 'TopLevel'], 'Nested', <<EOF);
+package ${appclass}::Model::TopLevel::Nested;
+use base 'Catalyst::Model';
+
+no warnings 'redefine';
+sub COMPONENT { return shift->NEXT::COMPONENT(\@_); }
+1;
+
+EOF
+
+eval "package $appclass; use Catalyst; __PACKAGE__->setup";
+
+is($@, '', "Didn't load component twice");
+
+rmtree($libdir);
More information about the Catalyst-commits
mailing list