Skip to content

Commit

Permalink
improved Mojolicious::Routes::Pattern to render formats
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Apr 15, 2012
1 parent 1a2eb54 commit bf9f24b
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 19 deletions.
2 changes: 2 additions & 0 deletions Changes
@@ -1,6 +1,8 @@
This file documents the revision history for Perl extension Mojolicious.

2.82 2012-04-16
- Improved Mojolicious::Routes::Pattern to render formats.
- Improved documentation.
- Improved tests.

2.81 2012-04-15
Expand Down
14 changes: 9 additions & 5 deletions lib/Mojolicious/Routes/Pattern.pm
Expand Up @@ -34,7 +34,7 @@ sub parse {
}

sub render {
my ($self, $values) = @_;
my ($self, $values, $format) = @_;
$values ||= {};

# Merge values with defaults
Expand Down Expand Up @@ -68,7 +68,9 @@ sub render {
$string = "$rendered$string";
}

return $string || '/';
# Format is optional
$string ||= '/';
return $format && $values->{format} ? "$string.$values->{format}" : $string;
}

sub shape_match {
Expand Down Expand Up @@ -391,7 +393,7 @@ Construct a new pattern object.
=head2 C<match>
my $result = $pattern->match('/foo/bar');
my $result = $pattern->match('/foo/bar', $detect);
my $result = $pattern->match('/foo/bar', 1);
Match pattern against entire path, format detection is disabled by default.
Expand All @@ -406,13 +408,15 @@ Parse a raw pattern.
=head2 C<render>
my $path = $pattern->render({action => 'foo'});
my $path = $pattern->render({action => 'foo'}, 1);
Render pattern into a path with parameters.
Render pattern into a path with parameters, format rendering is disabled by
default.
=head2 C<shape_match>
my $result = $pattern->shape_match(\$path);
my $result = $pattern->shape_match(\$path, $detect);
my $result = $pattern->shape_match(\$path, 1);
Match pattern against path and remove matching parts, format detection is
disabled by default.
Expand Down
14 changes: 4 additions & 10 deletions lib/Mojolicious/Routes/Route.pm
Expand Up @@ -140,18 +140,12 @@ sub put { shift->_generate_route(PUT => @_) }
sub render {
my ($self, $path, $values) = @_;

# Path prefix
my $prefix = $self->pattern->render($values);
# Render pattern
my $prefix = $self->pattern->render($values, !$path);
$path = "$prefix$path" unless $prefix eq '/';
$path ||= '/' unless my $parent = $self->parent;

# Make sure there is always a root
my $parent = $self->parent;
$path = '/' if !$path && !$parent;

# Format
$path .= ".$values->{format}"
if $values->{format} && !$parent && $path !~ m#\.[^/]+$#;

# Let parent render
return $parent ? $parent->render($path, $values) : $path;
}

Expand Down
9 changes: 5 additions & 4 deletions t/mojolicious/pattern.t
@@ -1,6 +1,6 @@
use Mojo::Base -strict;

use Test::More tests => 87;
use Test::More tests => 89;

# "People said I was dumb, but I proved them."
use Mojo::ByteStream 'b';
Expand Down Expand Up @@ -189,12 +189,13 @@ $result = $pattern->match('/foo/v1.0', 1);
is $result->{test}, 'foo', 'right value';
is $result->{action}, 'index', 'right value';
ok !$result->{format}, 'no value';
is $pattern->render({test => '23'}), '/23/v1.0', 'right result';
is $pattern->render($result), '/foo/v1.0', 'right result';
is $pattern->render($result, 1), '/foo/v1.0', 'right result';
$result = $pattern->match('/foo/v1.0.txt', 1);
is $result->{test}, 'foo', 'right value';
is $result->{action}, 'index', 'right value';
is $result->{format}, 'txt', 'right value';
is $pattern->render({test => '23', format => 'txt'}), '/23/v1.0',
'right result';
is $pattern->render($result), '/foo/v1.0', 'right result';
is $pattern->render($result, 1), '/foo/v1.0.txt', 'right result';
$result = $pattern->match('/foo/v2.0', 1);
is $result, undef, 'no result';

0 comments on commit bf9f24b

Please sign in to comment.