Merge branch 'chained_fix' into 5.80032_dev
Tomas Doran [Tue, 22 Feb 2011 22:09:40 +0000 (22:09 +0000)]
* chained_fix:
  Apply more correct fix than 8df53b (I hope)
  Rename test
  Make tests more clear
  Merge revert 8df53bed
  Un-TODO abraxxa's tests

lib/Catalyst/DispatchType/Chained.pm
t/aggregate/live_component_controller_action_chained.t
t/aggregate/live_component_controller_action_chained2.t [moved from t/aggregate/live__component_controller_action_chained2.t with 85% similarity]

index 7d0d42a..5ed6088 100644 (file)
@@ -187,7 +187,6 @@ sub recurse_match {
     return () unless $children;
     my $best_action;
     my @captures;
-    my $found=0;
     TRY: foreach my $try_part (sort { length($b) <=> length($a) }
                                    keys %$children) {
                                # $b then $a to try longest part first
@@ -198,7 +197,6 @@ sub recurse_match {
                               splice( # and strip them off @parts as well
                                 @parts, 0, scalar(@{[split('/', $try_part)]})
                               ))); # @{[]} to avoid split to @_
-            $found=1;
         }
         my @try_actions = @{$children->{$try_part}};
         TRY_ACTION: foreach my $action (@try_actions) {
@@ -214,7 +212,7 @@ sub recurse_match {
                 push(@captures, splice(@parts, 0, $capture_attr->[0]));
 
                 # try the remaining parts against children of this action
-                my ($actions, $captures, $action_parts, $found) = $self->recurse_match(
+                my ($actions, $captures, $action_parts, $n_pathparts) = $self->recurse_match(
                                              $c, '/'.$action->reverse, \@parts
                                            );
                 #    No best action currently
@@ -222,16 +220,17 @@ sub recurse_match {
                 # OR The action has equal parts but less captured data (ergo more defined)
                 if ($actions    &&
                     (!$best_action                                 ||
-                      $#$action_parts < $#{$best_action->{parts}}  ||
+                     $#$action_parts < $#{$best_action->{parts}}   ||
                      ($#$action_parts == $#{$best_action->{parts}} &&
-                      $#$captures < $#{$best_action->{captures}} && ($found > $best_action->{found})
-                  ))) {
+                      $#$captures < $#{$best_action->{captures}} &&
+                      $n_pathparts > $best_action->{n_pathparts}))) {
+                    my @pathparts = split /\//, $action->attributes->{PathPart}->[0];
                     $best_action = {
                         actions => [ $action, @$actions ],
                         captures=> [ @captures, @$captures ],
                         parts   => $action_parts,
-                        found=>$found
-                        };
+                        n_pathparts => scalar(@pathparts) + $n_pathparts,
+                    };
                 }
             }
             else {
@@ -240,7 +239,7 @@ sub recurse_match {
                     next TRY_ACTION unless $action->match($c);
                 }
                 my $args_attr = $action->attributes->{Args}->[0];
-
+                my @pathparts = split /\//, $action->attributes->{PathPart}->[0];
                 #    No best action currently
                 # OR This one matches with fewer parts left than the current best action,
                 #    And therefore is a better match
@@ -255,13 +254,13 @@ sub recurse_match {
                         actions => [ $action ],
                         captures=> [],
                         parts   => \@parts,
-                        found=>$found,
-                    }
+                        n_pathparts => scalar(@pathparts),
+                    };
                 }
             }
         }
     }
-    return @$best_action{qw/actions captures parts found/} if $best_action;
+    return @$best_action{qw/actions captures parts n_pathparts/} if $best_action;
     return ();
 }
 
index 20349df..efea301 100644 (file)
@@ -865,12 +865,9 @@ sub run_tests {
 
         ok( my $response = request('http://localhost/chained/mult_nopp2/action'),
             "Complex path with multiple non-capturing pathparts" );
-        TODO: {
-        local $TODO = 'Known bug';
         is( $response->header('X-Catalyst-Executed'),
             $expected, 'Executed actions' );
         is( $response->content, '; ', 'Content OK' );
-        }
     }
 
     #
@@ -12,8 +12,8 @@ content_like('/15/GoldFinger', qr/List project GoldFinger pages/, 'GoldFinger Pr
 content_like('/15/GoldFinger/4/007', qr/This is 007 page of GoldFinger project/, '007 page in GoldFinger Project');
 
 content_like('/account', qr/New account o login/, 'no account');
-content_like('/account/ferz', qr/This is account ferz/, 'account');
-content_like('/account/123', qr/This is account 123/, 'account');
+content_like('/account/ferz', qr/This is account ferz/, '/account/ferz');
+content_like('/account/123', qr/This is account 123/, '/account/123');
 content_like('/account/profile/007/James Bond', qr/This is profile of James Bond/, 'account');
 
 TODO: {