Changeset 26689
- Timestamp:
- 12/14/08 23:53:12 (4 years ago)
- Location:
- lang/perl/HTTP-Router/branches/merb-like/lib/HTTP
- Files:
-
- 5 modified
-
Router.pm (modified) (3 diffs)
-
Router/Mapper.pm (modified) (2 diffs)
-
Router/Match.pm (modified) (2 diffs)
-
Router/Route.pm (modified) (8 diffs)
-
Router/Routes.pm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
lang/perl/HTTP-Router/branches/merb-like/lib/HTTP/Router.pm
r26593 r26689 3 3 use 5.8.1; 4 4 use Moose; 5 use Hash::Merge ();6 5 use HTTP::Router::Mapper; 7 6 use HTTP::Router::Routes; … … 9 8 our $VERSION = '0.01'; 10 9 11 has ' _routes' => (10 has 'routeset' => ( 12 11 is => 'rw', 13 12 isa => 'HTTP::Router::Routes', 14 13 default => sub { HTTP::Router::Routes->new }, 15 handles => { routes => 'all' , add_route => 'push'},14 handles => { routes => 'all' }, 16 15 ); 17 16 17 sub to_mapper { HTTP::Router::Mapper->new(routeset => shift->routeset) } 18 18 19 sub match { 19 my ($self, $path, $conditions) = @_; 20 return HTTP::Router::Mapper->new( 21 routes => $self->_routes, 22 path => $path, 23 conditions => $conditions || {}, 24 ); 20 my $self = shift; 21 return $self->to_mapper->match(@_); 25 22 } 26 23 27 sub connect { 28 my ($self, $path, $params) = @_; 29 30 $params ||= {}; 31 my $conditions = delete $params->{conditions} || {}; 32 my $requirements = delete $params->{requirements} || {}; 33 $conditions = Hash::Merge::merge($conditions, $requirements); 34 35 return $self->match($path, $conditions)->to($params); 36 } 37 38 sub route_for { 24 sub find { 39 25 my ( $self, $path, $conditions ) = @_; 40 26 … … 61 47 } 62 48 63 __PACKAGE__->meta->make_immutable; 64 65 no Moose; 66 67 1; 49 no Moose; __PACKAGE__->meta->make_immutable; 68 50 69 51 =head1 NAME -
lang/perl/HTTP-Router/branches/merb-like/lib/HTTP/Router/Mapper.pm
r26593 r26689 2 2 3 3 use Moose; 4 use MooseX::AttributeHelpers; 4 5 use Hash::Merge qw(merge); 5 6 use URI::Template; 6 7 use HTTP::Router::Route; 8 use HTTP::Router::Routes; 7 9 8 has 'routes' => (is => 'rw', isa => 'HTTP::Router::Routes'); 9 has 'path' => (is => 'rw', isa => 'Str'); 10 has 'conditions' => (is => 'rw', isa => 'HashRef', default => sub { +{} }); 10 has 'routeset' => ( 11 is => 'rw', 12 isa => 'HTTP::Router::Routes', 13 required => 1, 14 ); 15 16 has 'route' => ( 17 is => 'rw', 18 isa => 'HTTP::Router::Route', 19 predicate => 'has_route', 20 ); 21 22 has 'path' => ( 23 metaclass => 'String', 24 is => 'rw', 25 isa => 'Str', 26 default => '', 27 provides => { append => 'add_path' }, 28 ); 29 30 has 'conditions' => ( 31 is => 'rw', 32 isa => 'HashRef', 33 default => sub { +{} }, 34 ); 35 36 sub add_route { 37 my ($self, $route) = @_; 38 $self->routeset->push($route); 39 $self->route($route); 40 } 11 41 12 42 sub match { 13 43 my ($self, $path, $conditions) = @_; 44 return $self if $self->has_route; 14 45 15 $self-> path($self->path .$path);46 $self->add_path($path); 16 47 $self->conditions(merge $self->conditions, $conditions || {}); 17 48 … … 22 53 sub to { 23 54 my ($self, $params) = @_; 55 return $self if $self->has_route; 24 56 25 57 my $route = HTTP::Router::Route->new( 26 path => URI::Template->new($self->path),27 params => $params || {},58 path => URI::Template->new($self->path), 59 params => $params || {}, 28 60 conditions => $self->conditions, 29 61 ); 30 $self->routes->push($route);31 62 32 return $route; 63 $self->add_route($route); 64 65 return $self; 33 66 } 34 67 -
lang/perl/HTTP-Router/branches/merb-like/lib/HTTP/Router/Match.pm
r25886 r26689 3 3 use Moose; 4 4 5 has 'path' => (6 is => 'rw',7 isa => 'Str',8 required => 1,9 );10 11 5 has 'params' => ( 12 6 is => 'rw', 13 7 isa => 'HashRef', 14 required => 1, 8 default => sub { +{} }, 9 ); 10 11 has 'captures' => ( 12 is => 'rw', 13 isa => 'HashRef', 15 14 default => sub { +{} }, 16 15 ); 17 16 18 17 has 'route' => ( 19 is => 'rw', 20 isa => 'HTTP::Router::Route', 21 required => 1, 22 handles => ['uri_for'], 18 is => 'rw', 19 isa => 'HTTP::Router::Route', 20 handles => ['uri_for'], 23 21 ); 24 22 25 __PACKAGE__->meta->make_immutable; 26 27 no Moose; 28 29 1; 23 no Moose; __PACKAGE__->meta->make_immutable; 30 24 31 25 =for stopwords params … … 41 35 =head1 PROPERTIES 42 36 43 =head2 pa th37 =head2 params 44 38 45 =head2 params39 =head2 captures 46 40 47 41 =head2 route -
lang/perl/HTTP-Router/branches/merb-like/lib/HTTP/Router/Route.pm
r26123 r26689 2 2 3 3 use Moose; 4 use Moose::Util::TypeConstraints;5 4 use MooseX::AttributeHelpers; 6 use List::MoreUtils qw(all true);7 use Storable qw(dclone);5 use Hash::Merge qw(merge); 6 use List::MoreUtils qw(any); 8 7 use URI::Template 0.13; 8 use namespace::clean -except => ['meta']; 9 9 10 use HTTP::Router::Match; 10 11 class_type 'URI::Template';12 13 coerce 'URI::Template' => from 'Str' => via { URI::Template->new($_) };14 11 15 12 has 'path' => ( 16 13 is => 'rw', 17 isa => ' URI::Template',14 isa => 'Str', 18 15 required => 1, 19 coerce => 1, 16 trigger => sub { 17 my ($self, $path) = @_; 18 $self->parts([ split m!/! => $path ]); 19 $self->templates(URI::Template->new($path)); 20 }, 21 ); 22 23 has 'parts' => ( 24 metaclass => 'Collection::Array', 25 is => 'rw', 26 isa => 'ArrayRef[Str]', 27 provides => { count => 'part_size' }, 28 ); 29 30 has 'templates' => ( 31 is => 'rw', 32 isa => 'URI::Template', 33 handles => ['variables'], 20 34 ); 21 35 … … 27 41 28 42 has 'conditions' => ( 29 is => 'rw', 30 isa => 'HashRef[ Str | RegexpRef | ArrayRef ]', 31 default => sub { +{} }, 43 metaclass => 'Collection::Hash', 44 is => 'rw', 45 isa => 'HashRef[ Str | RegexpRef | ArrayRef ]', 46 default => sub { +{} }, 47 provides => { get => 'condition_for', keys => 'all_condition_names' }, 32 48 ); 33 49 34 has 'requirements' => ( 35 is => 'rw', 36 isa => 'HashRef[ Str | RegexpRef | ArrayRef ]', 37 default => sub { +{} }, 38 ); 50 sub condition_names { 51 my $self = shift; 52 my @all = $self->all_condition_names; 53 my @var = $self->variables; 54 require Array::Diff; 55 return @{ Array::Diff->diff(\@all, \@var)->deleted }; 56 } 39 57 40 sub slashes { 41 return scalar @{[ shift->path->as_string =~ m!/!g ]}; 58 sub validate { 59 my ($self, $input, $expected) = @_; 60 return 1 unless defined $expected; 61 return $input =~ $expected if ref $expected eq 'Regexp'; 62 return any { $input eq $_ } @$expected if ref $expected eq 'ARRAY'; 63 return $input eq $expected; 42 64 } 43 65 … … 45 67 my ($self, $path, $conditions) = @_; 46 68 47 # check slashes 48 return unless $self->_check_slashes($path); 49 # check path 50 return unless $path eq $self->path->as_string; 51 # check conditions 52 return unless $self->_check_conditions($conditions); 69 # part size 70 my $size = scalar split m!/! => $path; 71 return unless $size == $self->part_size; 53 72 54 return $self->_build_match($path, dclone $self->params); 55 } 56 57 sub match_with_expansions { 58 my ($self, $path, $conditions) = @_; 59 60 # check slashes 61 return unless $self->_check_slashes($path); 62 # check path 63 my %captures = $self->path->deparse($path); 64 return unless all { defined } values %captures; 65 # check requirements 66 return unless $self->_check_requirements(\%captures); 67 # check conditions 68 return unless $self->_check_conditions($conditions); 69 70 my $params = dclone $self->params; 71 $params = { %$params, %captures }; 72 73 return $self->_build_match($path, $params); 74 } 75 76 sub uri_for { 77 my ($self, $args) = @_; 78 79 my $params = $args || {}; 80 81 if ($self->path->variables > 0) { 82 return unless $self->_check_requirements($params); 73 # path, captures 74 my %captures = $self->templates->deparse($path); 75 if (%captures) { 76 return unless $self->check_captures(\%captures); 77 } 78 else { 79 return unless $path eq $self->path; 83 80 } 84 81 85 return $self->path->process_to_string(%$params); 86 } 87 88 sub _build_match { 89 my ($self, $path, $params) = @_; 82 # conditions 83 return unless $self->check_conditions($conditions); 90 84 91 85 return HTTP::Router::Match->new( 92 pa th => $path,93 params => $params,94 route => $self,86 params => merge($self->params, \%captures), 87 captures => \%captures, 88 route => $self, 95 89 ); 96 90 } 97 91 98 sub _check_slashes { 99 my ($self, $path) = @_; 100 return scalar @{[ $path =~ m!/!g ]} == $self->slashes; 101 } 92 sub check_captures { 93 my ($self, $captures) = @_; 102 94 103 sub _check_requirements { 104 my ($self, $args) = @_; 105 106 # not exists 107 return 1 unless keys %{ $self->requirements } > 0; 108 # not supplied 109 return unless defined $args and keys %$args > 0; 110 111 # check 112 while (my ($key, $value) = each %$args) { 113 next unless exists $self->requirements->{$key}; 114 return unless $self->_validate($value, $self->requirements->{$key}); 95 for my $name (keys %$captures) { 96 next unless my $expected = $self->condition_for($name); 97 return 0 unless $self->validate($captures->{$name}, $expected); 115 98 } 116 99 … … 118 101 } 119 102 120 sub _check_conditions {121 my ($self, $ args) = @_;103 sub check_conditions { 104 my ($self, $conditions) = @_; 122 105 123 # not exists 124 return 1 unless my @keys = keys %{ $self->conditions }; 125 # not supplied 126 return unless defined $args and keys %$args > 0; 127 128 # check 129 for my $key (@keys) { 130 return unless exists $args->{$key}; 131 return unless $self->_validate($args->{$key}, $self->conditions->{$key}); 106 for my $name ($self->condition_names) { 107 return 0 unless my $input = $conditions->{$name}; 108 return 0 unless $self->validate($input, $self->condition_for($name)); 132 109 } 133 110 … … 135 112 } 136 113 137 sub _validate { 138 my ($self, $input, $expected) = @_; 139 140 return $input =~ $expected if ref $expected eq 'Regexp'; 141 return true { $input eq $_ } @$expected if ref $expected eq 'ARRAY'; 142 return $input eq $expected; 114 sub uri_for { 115 my ($self, $args) = @_; 116 return $self->templates->process_to_string(%{ $args || {} }); 143 117 } 144 118 145 __PACKAGE__->meta->make_immutable; 146 147 no Moose; 148 149 1; 119 no Moose; __PACKAGE__->meta->make_immutable; 150 120 151 121 =for stopwords params … … 159 129 =head2 match($path, $conditions) 160 130 161 =head2 match_with_expansions($path, $conditions)162 163 131 =head2 uri_for($args) 164 132 … … 167 135 =head2 path 168 136 169 =head2 slashes 137 =head2 templates 138 139 =head2 variables 140 141 =head2 parts 142 143 =head2 part_size 170 144 171 145 =head2 params … … 173 147 =head2 conditions 174 148 175 =head2 requirements 149 =head2 condition_names 150 151 =head1 INTERNALS 152 153 =head2 validate 154 155 =head2 check_captures 156 157 =head2 check_conditions 158 159 =head2 condition_for 176 160 177 161 =head1 AUTHOR -
lang/perl/HTTP-Router/branches/merb-like/lib/HTTP/Router/Routes.pm
r26593 r26689 2 2 3 3 use Moose; 4 use MooseX::AttributeHelpers; 4 5 use HTTP::Router::Route; 5 6 6 has '_routes' => ( 7 is => 'rw', 8 isa => 'ArrayRef[HTTP::Router::Route]', 9 default => sub { [] }, 7 has 'routes' => ( 8 metaclass => 'Collection::Array', 9 is => 'rw', 10 isa => 'ArrayRef[HTTP::Router::Route]', 11 default => sub { [] }, 12 provides => { elements => 'all', push => 'push' }, 10 13 ); 11 14 12 sub all {13 my $self = shift;14 return @{ $self->_routes };15 }16 17 sub push {18 my ($self, $route) = @_;19 CORE::push @{ $self->_routes }, $route;20 }21 22 15 no Moose; __PACKAGE__->meta->make_immutable;
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)