From: Mark Grimes Date: Wed, 27 Mar 2013 16:20:44 +0000 (-0400) Subject: Remove Regex/LocalRegex code and tests from core X-Git-Tag: 5.90030~11 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=9c1fc6d6a8c4701fa842fa5229c99d103aee1afa Remove Regex/LocalRegex code and tests from core Signed-off-by: John Napiorkowski --- diff --git a/lib/Catalyst/Controller.pm b/lib/Catalyst/Controller.pm index b04ce96..1594172 100644 --- a/lib/Catalyst/Controller.pm +++ b/lib/Catalyst/Controller.pm @@ -477,25 +477,6 @@ sub _parse_Path_attr { } } -sub _parse_Regex_attr { - my ( $self, $c, $name, $value ) = @_; - return ( 'Regex', $value ); -} - -sub _parse_Regexp_attr { shift->_parse_Regex_attr(@_); } - -sub _parse_LocalRegex_attr { - my ( $self, $c, $name, $value ) = @_; - unless ( $value =~ s/^\^// ) { $value = "(?:.*?)$value"; } - - my $prefix = $self->path_prefix( $c ); - $prefix .= '/' if length( $prefix ); - - return ( 'Regex', "^${prefix}${value}" ); -} - -sub _parse_LocalRegexp_attr { shift->_parse_LocalRegex_attr(@_); } - sub _parse_Chained_attr { my ($self, $c, $name, $value) = @_; diff --git a/lib/Catalyst/DispatchType/Regex.pm b/lib/Catalyst/DispatchType/Regex.pm deleted file mode 100644 index 4b1beae..0000000 --- a/lib/Catalyst/DispatchType/Regex.pm +++ /dev/null @@ -1,185 +0,0 @@ -package Catalyst::DispatchType::Regex; - -use Moose; -extends 'Catalyst::DispatchType::Path'; - -use Text::SimpleTable; -use Catalyst::Utils; -use Text::Balanced (); - -has _compiled => ( - is => 'rw', - isa => 'ArrayRef', - required => 1, - default => sub{ [] }, - ); - -no Moose; - -=head1 NAME - -Catalyst::DispatchType::Regex - Regex DispatchType - -=head1 SYNOPSIS - -See L. - -=head1 DESCRIPTION - -Dispatch type managing path-matching behaviour using regexes. For -more information on dispatch types, see: - -=over 4 - -=item * L for how they affect application authors - -=item * L for implementation information. - -=back - -=head1 METHODS - -=head2 $self->list($c) - -Output a table of all regex actions, and their private equivalent. - -=cut - -sub list { - my ( $self, $c ) = @_; - 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 $re = Text::SimpleTable->new( - [ $col1_width, 'Regex' ], [ $col2_width, 'Private' ] - ); - for my $regex ( @{ $self->_compiled } ) { - my $action = $regex->{action}; - $re->row( $regex->{path}, "/$action" ); - } - $c->log->debug( "Loaded Regex actions:\n" . $re->draw . "\n" ) - if ( @{ $self->_compiled } ); -} - -=head2 $self->match( $c, $path ) - -Checks path against every compiled regex, and offers the action for any regex -which matches a chance to match the request. If it succeeds, sets action, -match and captures on $c->req and returns 1. If not, returns 0 without -altering $c. - -=cut - -sub match { - my ( $self, $c, $path ) = @_; - - return if $self->SUPER::match( $c, $path ); - - # Check path against plain text first - - foreach my $compiled ( @{ $self->_compiled } ) { - if ( my @captures = ( $path =~ $compiled->{re} ) ) { - next unless $compiled->{action}->match($c); - $c->req->action( $compiled->{path} ); - $c->req->match($path); - $c->req->captures( \@captures ); - $c->action( $compiled->{action} ); - $c->namespace( $compiled->{action}->namespace ); - return 1; - } - } - - return 0; -} - -=head2 $self->register( $c, $action ) - -Registers one or more regex actions for an action object. -Also registers them as literal paths. - -Returns 1 if any regexps were registered. - -=cut - -sub register { - my ( $self, $c, $action ) = @_; - my $attrs = $action->attributes; - my @register = @{ $attrs->{'Regex'} || [] }; - - foreach my $r (@register) { - $self->register_path( $c, $r, $action ); - $self->register_regex( $c, $r, $action ); - } - - return 1 if @register; - return 0; -} - -=head2 $self->register_regex($c, $re, $action) - -Register an individual regex on the action. Usually called from the -register method. - -=cut - -sub register_regex { - my ( $self, $c, $re, $action ) = @_; - push( - @{ $self->_compiled }, # and compiled regex for us - { - re => qr#$re#, - action => $action, - path => $re, - } - ); -} - -=head2 $self->uri_for_action($action, $captures) - -returns a URI for this action if it can find a regex attributes that contains -the correct number of () captures. Note that this may function incorrectly -in the case of nested captures - if your regex does (...(..))..(..) you'll -need to pass the first and third captures only. - -=cut - -sub uri_for_action { - my ( $self, $action, $captures ) = @_; - - if (my $regexes = $action->attributes->{Regex}) { - REGEX: foreach my $orig (@$regexes) { - my $re = "$orig"; - $re =~ s/^\^//; - $re =~ s/\$$//; - $re =~ s/\\([^\\])/$1/g; - my $final = '/'; - my @captures = @$captures; - while (my ($front, $rest) = split(/\(/, $re, 2)) { - last unless defined $rest; - ($rest, $re) = - Text::Balanced::extract_bracketed("(${rest}", '('); - next REGEX unless @captures; - $final .= $front.shift(@captures); - } - $final .= $re; - next REGEX if @captures; - return $final; - } - } - return undef; -} - -=head1 AUTHORS - -Catalyst Contributors, see Catalyst.pm - -=head1 COPYRIGHT - -This library is free software. You can redistribute it and/or modify it under -the same terms as Perl itself. - -=cut - -__PACKAGE__->meta->make_immutable; - -1; diff --git a/lib/Catalyst/Dispatcher.pm b/lib/Catalyst/Dispatcher.pm index fb1efea..bb557ca 100644 --- a/lib/Catalyst/Dispatcher.pm +++ b/lib/Catalyst/Dispatcher.pm @@ -22,7 +22,7 @@ use namespace::clean -except => 'meta'; # See Catalyst-Plugin-Server for them being added to, which should be much less ugly. # Preload these action types -our @PRELOAD = qw/Index Path Regex/; +our @PRELOAD = qw/Index Path/; # Postload these action types our @POSTLOAD = qw/Default/; diff --git a/t/aggregate/live_component_controller_action_regexp.t b/t/aggregate/live_component_controller_action_regexp.t deleted file mode 100644 index fd65665..0000000 --- a/t/aggregate/live_component_controller_action_regexp.t +++ /dev/null @@ -1,141 +0,0 @@ -#!perl - -use strict; -use warnings; - -use FindBin; -use lib "$FindBin::Bin/../lib"; - -our $iters; - -BEGIN { $iters = $ENV{CAT_BENCH_ITERS} || 1; } - -use Test::More tests => 38*$iters; -use Catalyst::Test 'TestApp'; - -use Catalyst::Request; - -if ( $ENV{CAT_BENCHMARK} ) { - require Benchmark; - Benchmark::timethis( $iters, \&run_tests ); -} -else { - for ( 1 .. $iters ) { - run_tests(); - } -} - -sub run_tests { - { - ok( my $response = request('http://localhost/action/regexp/10/hello'), - 'Request' ); - ok( $response->is_success, 'Response Successful 2xx' ); - is( $response->content_type, 'text/plain', 'Response Content-Type' ); - is( $response->header('X-Catalyst-Action'), - '^action/regexp/(\d+)/(\w+)$', 'Test Action' ); - is( - $response->header('X-Test-Class'), - 'TestApp::Controller::Action::Regexp', - 'Test Class' - ); - like( - $response->content, - qr/^bless\( .* 'Catalyst::Request' \)$/s, - 'Content is a serialized Catalyst::Request' - ); - } - - { - ok( my $response = request('http://localhost/action/regexp/hello/10'), - 'Request' ); - ok( $response->is_success, 'Response Successful 2xx' ); - is( $response->content_type, 'text/plain', 'Response Content-Type' ); - is( $response->header('X-Catalyst-Action'), - '^action/regexp/(\w+)/(\d+)$', 'Test Action' ); - is( - $response->header('X-Test-Class'), - 'TestApp::Controller::Action::Regexp', - 'Test Class' - ); - like( - $response->content, - qr/^bless\( .* 'Catalyst::Request' \)$/s, - 'Content is a serialized Catalyst::Request' - ); - } - - { - ok( my $response = request('http://localhost/action/regexp/mandatory'), - 'Request' ); - ok( $response->is_success, 'Response Successful 2xx' ); - is( $response->content_type, 'text/plain', 'Response Content-Type' ); - is( $response->header('X-Catalyst-Action'), - '^action/regexp/(mandatory)(/optional)?$', 'Test Action' ); - is( - $response->header('X-Test-Class'), - 'TestApp::Controller::Action::Regexp', - 'Test Class' - ); - my $content = $response->content; - my $req = eval $content; - - is( scalar @{ $req->captures }, 2, 'number of captures' ); - is( $req->captures->[ 0 ], 'mandatory', 'mandatory capture' ); - ok( !defined $req->captures->[ 1 ], 'optional capture' ); - } - - { - ok( my $response = request('http://localhost/action/regexp/mandatory/optional'), - 'Request' ); - ok( $response->is_success, 'Response Successful 2xx' ); - is( $response->content_type, 'text/plain', 'Response Content-Type' ); - is( $response->header('X-Catalyst-Action'), - '^action/regexp/(mandatory)(/optional)?$', 'Test Action' ); - is( - $response->header('X-Test-Class'), - 'TestApp::Controller::Action::Regexp', - 'Test Class' - ); - my $content = $response->content; - my $req = eval $content; - - is( scalar @{ $req->captures }, 2, 'number of captures' ); - is( $req->captures->[ 0 ], 'mandatory', 'mandatory capture' ); - is( $req->captures->[ 1 ], '/optional', 'optional capture' ); - } - - # test localregex in the root controller - { - ok( my $response = request('http://localhost/localregex'), - 'Request' ); - ok( $response->is_success, 'Response Successful 2xx' ); - is( $response->content_type, 'text/plain', 'Response Content-Type' ); - is( $response->header('X-Catalyst-Action'), - '^localregex$', 'Test Action' ); - is( - $response->header('X-Test-Class'), - 'TestApp::Controller::Root', - 'Test Class' - ); - } - - { - my $url = 'http://localhost/action/regexp/redirect/life/universe/42/everything'; - ok( my $response = request($url), - 'Request' ); - ok( $response->is_redirect, 'Response is redirect' ); - is( $response->header('X-Catalyst-Action'), - '^action/regexp/redirect/(\w+)/universe/(\d+)/everything$', 'Test Action' ); - is( - $response->header('X-Test-Class'), - 'TestApp::Controller::Action::Regexp', - 'Test Class' - ); - is( - $response->header('location'), - $response->request->uri, - 'Redirect URI is the same as the request URI' - ); - } -} - diff --git a/t/aggregate/live_priorities.t b/t/aggregate/live_priorities.t index 1e05747..bd28d25 100644 --- a/t/aggregate/live_priorities.t +++ b/t/aggregate/live_priorities.t @@ -6,7 +6,7 @@ use warnings; use FindBin; use lib "$FindBin::Bin/../lib"; -use Test::More tests => 28; +use Test::More tests => 14; use Catalyst::Test 'TestApp'; local $^W = 0; @@ -15,18 +15,11 @@ my $uri_base = 'http://localhost/priorities'; my @tests = ( # Simple - 'Regex vs. Local', { path => '/re_vs_loc', expect => 'local' }, - 'Regex vs. LocalRegex', { path => '/re_vs_locre', expect => 'regex' }, - 'Regex vs. Path', { path => '/re_vs_path', expect => 'path' }, - 'Local vs. LocalRegex', { path => '/loc_vs_locre', expect => 'local' }, 'Local vs. Path 1', { path => '/loc_vs_path1', expect => 'local' }, 'Local vs. Path 2', { path => '/loc_vs_path2', expect => 'path' }, - 'Path vs. LocalRegex', { path => '/path_vs_locre', expect => 'path' }, # index - 'index vs. Regex', { path => '/re_vs_index', expect => 'index' }, 'index vs. Local', { path => '/loc_vs_index', expect => 'index' }, - 'index vs. LocalRegex', { path => '/locre_vs_index', expect => 'index' }, 'index vs. Path', { path => '/path_vs_index', expect => 'index' }, 'multimethod zero', { path => '/multimethod', expect => 'zero' }, diff --git a/t/aggregate/unit_core_uri_for_action.t b/t/aggregate/unit_core_uri_for_action.t index 9b34229..156f79e 100644 --- a/t/aggregate/unit_core_uri_for_action.t +++ b/t/aggregate/unit_core_uri_for_action.t @@ -36,38 +36,6 @@ ok(!defined($dispatcher->uri_for_action($path_action, [ 'foo' ])), "no URI returned for Path action when snippets are given"); # -# Regex Action -# -my $regex_action = $dispatcher->get_action_by_path( - '/action/regexp/one' - ); - -ok(!defined($dispatcher->uri_for_action($regex_action)), - "Regex action without captures returns undef"); - -ok(!defined($dispatcher->uri_for_action($regex_action, [ 1, 2, 3 ])), - "Regex action with too many captures returns undef"); - -is($dispatcher->uri_for_action($regex_action, [ 'foo', 123 ]), - "/action/regexp/foo/123", - "Regex action interpolates captures correctly"); - -my $regex_action_bs = $dispatcher->get_action_by_path( - '/action/regexp/one_backslashes' - ); - -ok(!defined($dispatcher->uri_for_action($regex_action_bs)), - "Regex action without captures returns undef"); - -ok(!defined($dispatcher->uri_for_action($regex_action_bs, [ 1, 2, 3 ])), - "Regex action with too many captures returns undef"); - -is($dispatcher->uri_for_action($regex_action_bs, [ 'foo', 123 ]), - "/action/regexp/foo/123.html", - "Regex action interpolates captures correctly"); - - -# # Index Action # my $index_action = $dispatcher->get_action_by_path( @@ -126,10 +94,6 @@ is($context->uri_for($path_action, qw/one two/, { q => 1 }), ok(!defined($context->uri_for($path_action, [ 'blah' ])), "no URI returned by uri_for for Path action with snippets"); -is($context->uri_for($regex_action, [ 'foo', 123 ], qw/bar baz/, { q => 1 }), - "http://127.0.0.1/foo/action/regexp/foo/123/bar/baz?q=1", - "uri_for correct for regex with captures, args and query"); - is($context->uri_for($chained_action, [ 1 ], 2, { q => 1 }), "http://127.0.0.1/foo/chained/foo/1/end/2?q=1", "uri_for correct for chained with captures, args and query"); diff --git a/t/lib/TestApp/Controller/Action/Regexp.pm b/t/lib/TestApp/Controller/Action/Regexp.pm deleted file mode 100644 index 7966874..0000000 --- a/t/lib/TestApp/Controller/Action/Regexp.pm +++ /dev/null @@ -1,35 +0,0 @@ -package TestApp::Controller::Action::Regexp; - -use strict; -use base 'TestApp::Controller::Action'; - -sub one : Action Regex('^action/regexp/(\w+)/(\d+)$') { - my ( $self, $c ) = @_; - $c->forward('TestApp::View::Dump::Request'); -} - -sub two : Action LocalRegexp('^(\d+)/(\w+)$') { - my ( $self, $c ) = @_; - $c->forward('TestApp::View::Dump::Request'); -} - -sub three : Action LocalRegex('^(mandatory)(/optional)?$'){ - my ( $self, $c ) = @_; - $c->forward('TestApp::View::Dump::Request'); -} - -sub four : Action Regex('^action/regexp/redirect/(\w+)/universe/(\d+)/everything$') { - my ( $self, $c ) = @_; - $c->res->redirect( - $c->uri_for($c->action, $c->req->captures, - @{$c->req->arguments}, $c->req->params - ) - ); -} - -sub one_backslashes : Action Regex('^action/regexp/(\w+)/(\d+)\.html$') { - my ( $self, $c ) = @_; - $c->forward('TestApp::View::Dump::Request'); -} - -1; diff --git a/t/lib/TestApp/Controller/Priorities.pm b/t/lib/TestApp/Controller/Priorities.pm index 751270b..b9daa88 100644 --- a/t/lib/TestApp/Controller/Priorities.pm +++ b/t/lib/TestApp/Controller/Priorities.pm @@ -4,34 +4,6 @@ use strict; use base 'Catalyst::Controller'; # -# Regex vs. Local -# - -sub re_vs_loc_re :Regex('/priorities/re_vs_loc') { $_[1]->res->body( 'regex' ) } -sub re_vs_loc :Local { $_[1]->res->body( 'local' ) } - -# -# Regex vs. LocalRegex -# - -sub re_vs_locre_locre :LocalRegex('re_vs_(locre)') { $_[1]->res->body( 'local_regex' ) } -sub re_vs_locre_re :Regex('/priorities/re_vs_locre') { $_[1]->res->body( 'regex' ) } - -# -# Regex vs. Path -# - -sub re_vs_path_path :Path('/priorities/re_vs_path') { $_[1]->res->body( 'path' ) } -sub re_vs_path_re :Regex('/priorities/re_vs_path') { $_[1]->res->body( 'regex' ) } - -# -# Local vs. LocalRegex -# - -sub loc_vs_locre_locre :LocalRegex('loc_vs_locre') { $_[1]->res->body( 'local_regex' ) } -sub loc_vs_locre :Local { $_[1]->res->body( 'local' ) } - -# # Local vs. Path (depends on definition order) # @@ -42,31 +14,12 @@ sub loc_vs_path2 :Local { $_[1]->res->body( 'loca sub loc_vs_path2_loc :Path('/priorities/loc_vs_path2') { $_[1]->res->body( 'path' ) } # -# Path vs. LocalRegex -# - -sub path_vs_locre_locre :LocalRegex('path_vs_(locre)') { $_[1]->res->body( 'local_regex' ) } -sub path_vs_locre_path :Path('/priorities/path_vs_locre') { $_[1]->res->body( 'path' ) } - -# -# Regex vs. index (has sub controller) -# - -sub re_vs_idx :Regex('/priorities/re_vs_index') { $_[1]->res->body( 'regex' ) } - -# # Local vs. index (has sub controller) # sub loc_vs_index :Local { $_[1]->res->body( 'local' ) } # -# LocalRegex vs. index (has sub controller) -# - -sub locre_vs_idx :LocalRegex('locre_vs_index') { $_[1]->res->body( 'local_regex' ) } - -# # Path vs. index (has sub controller) # diff --git a/t/lib/TestApp/Controller/Priorities/re_vs_index.pm b/t/lib/TestApp/Controller/Priorities/re_vs_index.pm deleted file mode 100644 index da56b89..0000000 --- a/t/lib/TestApp/Controller/Priorities/re_vs_index.pm +++ /dev/null @@ -1,8 +0,0 @@ -package TestApp::Controller::Priorities::re_vs_index; - -use strict; -use base 'Catalyst::Controller'; - -sub index :Private { $_[1]->res->body( 'index' ) } - -1; diff --git a/t/lib/TestApp/Controller/Root.pm b/t/lib/TestApp/Controller/Root.pm index e5137e0..f2acb21 100644 --- a/t/lib/TestApp/Controller/Root.pm +++ b/t/lib/TestApp/Controller/Root.pm @@ -24,13 +24,6 @@ sub emptybody : Local { $c->res->body(''); } -sub localregex : LocalRegex('^localregex$') { - my ( $self, $c ) = @_; - $c->res->header( 'X-Test-Class' => ref($self) ); - $c->response->content_type('text/plain; charset=utf-8'); - $c->forward('TestApp::View::Dump::Request'); -} - sub index : Private { my ( $self, $c ) = @_; $c->res->body('root index');