X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FDispatchType%2FChained.pm;h=8446173fd7cbb71fcd66ca1beb3f557a202d29a3;hp=8600ac083c8bf7ab51232a7716d7901a972791bc;hb=48d435ba6a0925260fd58c8c18ff425e99708eae;hpb=6ab73369947422004890abb05035c491b086283f diff --git a/lib/Catalyst/DispatchType/Chained.pm b/lib/Catalyst/DispatchType/Chained.pm index 8600ac0..8446173 100644 --- a/lib/Catalyst/DispatchType/Chained.pm +++ b/lib/Catalyst/DispatchType/Chained.pm @@ -7,6 +7,7 @@ use Text::SimpleTable; use Catalyst::ActionChain; use Catalyst::Utils; use URI; +use Scalar::Util (); has _endpoints => ( is => 'rw', @@ -79,14 +80,16 @@ sub list { return unless $self->_endpoints; - my $column_width = Catalyst::Utils::term_width() - 35 - 9; + my $avail_width = Catalyst::Utils::term_width() - 9; + my $col1_width = ($avail_width * .50) < 35 ? 35 : int($avail_width * .50); + my $col2_width = $avail_width - $col1_width; my $paths = Text::SimpleTable->new( - [ 35, 'Path Spec' ], [ $column_width, 'Private' ], + [ $col1_width, 'Path Spec' ], [ $col2_width, 'Private' ], ); my $has_unattached_actions; my $unattached_actions = Text::SimpleTable->new( - [ 35, 'Private' ], [ $column_width, 'Missing parent' ], + [ $col1_width, 'Private' ], [ $col2_width, 'Missing parent' ], ); ENDPOINT: foreach my $endpoint ( @@ -151,7 +154,13 @@ sub match { my @parts = split('/', $path); my ($chain, $captures, $parts) = $self->recurse_match($c, '/', \@parts); - push @{$request->args}, @$parts if $parts && @$parts; + + if ($parts && @$parts) { + for my $arg (@$parts) { + $arg =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; + push @{$request->args}, $arg; + } + } return 0 unless $chain; @@ -226,12 +235,15 @@ sub recurse_match { local $c->req->{arguments} = [ @{$c->req->args}, @parts ]; next TRY_ACTION unless $action->match($c); } + + # Default args is blank, not 0, since Args() my $args_attr = $action->attributes->{Args}->[0]; + $args_attr = '' unless defined $args_attr; # No best action currently # OR This one matches with fewer parts left than the current best action, # And therefore is a better match - # OR No parts and this expects 0 + # OR No parts and this expects 0 # The current best action might also be Args(0), # but we couldn't chose between then anyway so we'll take the last seen @@ -301,6 +313,23 @@ sub register { $self->_actions->{'/'.$action->reverse} = $action; + if (exists $action->attributes->{Args}) { + my $args = $action->attributes->{Args}->[0]; + if (defined($args) and not ( + Scalar::Util::looks_like_number($args) and + int($args) == $args + )) { + require Data::Dumper; + local $Data::Dumper::Terse = 1; + local $Data::Dumper::Indent = 0; + $args = Data::Dumper::Dumper($args); + Catalyst::Exception->throw( + "Invalid Args($args) for action " . $action->reverse() . + " (use 'Args' or 'Args()'" + ); + } + } + unless ($action->attributes->{CaptureArgs}) { unshift(@{ $self->_endpoints }, $action); } @@ -329,9 +358,7 @@ sub uri_for_action { if (my $cap = $curr->attributes->{CaptureArgs}) { return undef unless @captures >= $cap->[0]; # not enough captures if ($cap->[0]) { - unshift(@parts, - map { s/([^A-Za-z0-9\-_.!~*'()])/$URI::Escape::escapes{$1}/go; $_; } - splice(@captures, -$cap->[0])); + unshift(@parts, splice(@captures, -$cap->[0])); } } if (my $pp = $curr->attributes->{PartPath}) { @@ -352,7 +379,7 @@ sub uri_for_action { =head2 $c->expand_action($action) -Return a list of actions that represents a chained action. See +Return a list of actions that represents a chained action. See L for more info. You probably want to use the expand_action it provides rather than this directly. @@ -535,7 +562,7 @@ this debugging output: '-----------------------+------------------------------' ... -Here's a more detailed specification of the attributes belonging to +Here's a more detailed specification of the attributes belonging to C<:Chained>: =head2 Attributes @@ -651,7 +678,7 @@ Catalyst Contributors, see Catalyst.pm =head1 COPYRIGHT -This program is free software, you can redistribute it and/or modify it under +This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself. =cut