Skip to content

Commit

Permalink
added more multi methods
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Oct 7, 2014
1 parent 371f116 commit 2125428
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 29 deletions.
41 changes: 29 additions & 12 deletions lib/Mojo/Message.pm
Expand Up @@ -61,7 +61,7 @@ sub build_body { shift->_build('get_body_chunk') }
sub build_headers { shift->_build('get_header_chunk') }
sub build_start_line { shift->_build('get_start_line_chunk') }

sub cookie { shift->_cache(cookie => @_) }
sub cookie { shift->_cache('cookie', 0, @_) }

sub cookies { croak 'Method "cookies" not implemented by subclass' }

Expand Down Expand Up @@ -139,6 +139,9 @@ sub json {
return $pointer ? Mojo::JSON::Pointer->new($data)->get($pointer) : $data;
}

sub multi_cookie { shift->_cache('cookie', 1, @_) }
sub multi_upload { shift->_cache('upload', 1, @_) }

sub param { shift->body_params->param(@_) }

sub parse {
Expand Down Expand Up @@ -194,7 +197,7 @@ sub to_string {
return $self->build_start_line . $self->build_headers . $self->build_body;
}

sub upload { shift->_cache(upload => @_) }
sub upload { shift->_cache('upload', 0, @_) }

sub uploads {
my $self = shift;
Expand Down Expand Up @@ -234,10 +237,10 @@ sub _build {
}

sub _cache {
my ($self, $method, $name) = @_;
my ($self, $method, $all, $name) = @_;

# Multiple names
return map { scalar $self->$method($_) } @$name if ref $name eq 'ARRAY';
return map { $self->$method($_) } @$name if ref $name eq 'ARRAY';

# Cache objects by name
$method .= 's';
Expand All @@ -246,8 +249,8 @@ sub _cache {
push @{$self->{$method}{$_->name}}, $_ for @{$self->$method};
}

return unless my $objects = $self->{$method}{$name};
return wantarray ? @$objects : $objects->[0];
my $objects = $self->{$method}{$name} || [];
return $all ? $objects : $objects->[0];
}

sub _limit {
Expand Down Expand Up @@ -456,8 +459,7 @@ Render start line.
=head2 cookie
my $foo = $msg->cookie('foo');
my @foo = $msg->cookie('foo');
my $value = $msg->cookie('foo');
my ($foo, $bar) = $msg->cookie(['foo', 'bar']);
Access message cookies, usually L<Mojo::Cookie::Request> or
Expand Down Expand Up @@ -578,11 +580,19 @@ sure it is not excessively large, there's a 10MB limit by default.
say $msg->json->{foo}{bar}[23];
say $msg->json('/foo/bar/23');
=head2 multi_cookie
my $values = $msg->multi_cookie('foo');
Access multiple message cookies with the same name, usually
L<Mojo::Cookie::Request> or L<Mojo::Cookie::Response> objects. Note that this
method caches all data, so it should not be called before all headers have
been received.
=head2 param
my @names = $msg->param;
my $foo = $msg->param('foo');
my @foo = $msg->param('foo');
my $value = $msg->param('foo');
my ($foo, $bar) = $msg->param(['foo', 'bar']);
Access C<POST> parameters extracted from C<application/x-www-form-urlencoded>
Expand Down Expand Up @@ -619,8 +629,7 @@ Render whole message.
=head2 upload
my $foo = $msg->upload('foo');
my @foo = $msg->upload('foo');
my $value = $msg->upload('foo');
my ($foo, $bar) = $msg->upload(['foo', 'bar']);
Access C<multipart/form-data> file uploads, usually L<Mojo::Upload> objects.
Expand All @@ -630,6 +639,14 @@ entire message body has been received.
# Get content of uploaded file
say $msg->upload('foo')->asset->slurp;
=head2 multi_upload
my $values = $msg->multi_upload('foo');
Access multiple C<multipart/form-data> file uploads with the same name,
usually L<Mojo::Upload> objects. Note that this method caches all data, so it
should not be called before the entire message body has been received.
=head2 uploads
my $uploads = $msg->uploads;
Expand Down
2 changes: 1 addition & 1 deletion lib/Mojo/Parameters.pm
Expand Up @@ -54,7 +54,7 @@ sub param {
return sort keys %{$self->to_hash} unless $name;

# Multiple names
return map { scalar $self->param($_) } @$name if ref $name eq 'ARRAY';
return map { $self->param($_) } @$name if ref $name eq 'ARRAY';

# Replace values
$self->remove($name) if defined $_[0];
Expand Down
11 changes: 5 additions & 6 deletions lib/Mojolicious/Controller.pm
Expand Up @@ -42,7 +42,7 @@ sub cookie {
my ($self, $name) = (shift, shift);

# Multiple names
return map { scalar $self->cookie($_) } @$name if ref $name eq 'ARRAY';
return map { $self->cookie($_) } @$name if ref $name eq 'ARRAY';

# Response cookie
if (@_) {
Expand Down Expand Up @@ -94,7 +94,7 @@ sub flash {
sub helpers { $_[0]->app->renderer->get_helper('')->($_[0]) }

sub multi_cookie {
[map { $_->value } shift->req->cookie(shift)];
[map { $_->value } @{shift->req->multi_cookie(shift)}];
}

sub multi_param { _param(@_) }
Expand All @@ -112,7 +112,7 @@ sub param {
my ($self, $name) = (shift, shift);

# Multiple names
return map { scalar $self->param($_) } @$name if ref $name eq 'ARRAY';
return map { $self->param($_) } @$name if ref $name eq 'ARRAY';

# List names
my $captures = $self->stash->{'mojo.captures'} ||= {};
Expand Down Expand Up @@ -274,8 +274,7 @@ sub signed_cookie {
my ($self, $name, $value, $options) = @_;

# Multiple names
return map { scalar $self->signed_cookie($_) } @$name
if ref $name eq 'ARRAY';
return map { $self->signed_cookie($_) } @$name if ref $name eq 'ARRAY';

# Response cookie
my $secrets = $self->stash->{'mojo.secrets'};
Expand Down Expand Up @@ -369,7 +368,7 @@ sub _param {

# Uploads
my $req = $self->req;
return [$req->upload($name)] if $req->upload($name);
if (my $uploads = $req->multi_upload($name)) { return $uploads if @$uploads }

# Param values
return $req->multi_param($name);
Expand Down
24 changes: 18 additions & 6 deletions lib/Mojolicious/Validator/Validation.pm
Expand Up @@ -60,6 +60,8 @@ sub has_error { $_[1] ? exists $_[0]{error}{$_[1]} : !!keys %{$_[0]{error}} }

sub is_valid { exists $_[0]->output->{$_[1] // $_[0]->topic} }

sub multi_param { shift->_param(shift) }

sub optional {
my ($self, $name) = @_;

Expand All @@ -75,14 +77,12 @@ sub param {
my ($self, $name) = @_;

# Multiple names
return map { scalar $self->param($_) } @$name if ref $name eq 'ARRAY';
return map { $self->param($_) } @$name if ref $name eq 'ARRAY';

# List names
return sort keys %{$self->output} unless defined $name;

my $value = $self->output->{$name};
my @values = ref $value eq 'ARRAY' ? @$value : ($value);
return wantarray ? @values : $values[0];
return $self->_param($name)->[0];
}

sub required {
Expand All @@ -91,6 +91,12 @@ sub required {
return $self->error($name => ['required']);
}

sub _param {
my ($self, $name) = @_;
my $value = $self->output->{$name};
return [ref $value eq 'ARRAY' ? @$value : $value];
}

1;

=encoding utf8
Expand Down Expand Up @@ -205,6 +211,13 @@ Check if validation resulted in errors, defaults to checking all fields.
Check if validation was successful and field has a value, defaults to checking
the current L</"topic">.
=head2 multi_param
my $values = $validation->multi_param('foo');
Access multiple validated parameters with the same name, similar to
L<Mojolicious::Controller/"multi_param">.
=head2 optional
$validation = $validation->optional('foo');
Expand All @@ -214,8 +227,7 @@ Change validation L</"topic">.
=head2 param
my @names = $validation->param;
my $foo = $validation->param('foo');
my @foo = $validation->param('foo');
my $value = $validation->param('foo');
my ($foo, $bar) = $validation->param(['foo', 'bar']);
Access validated parameters, similar to L<Mojolicious::Controller/"param">.
Expand Down
4 changes: 2 additions & 2 deletions t/mojo/cookiejar.t
Expand Up @@ -344,7 +344,7 @@ $jar->extract($tx);
$tx = Mojo::Transaction::HTTP->new;
$tx->req->url->parse('http://example.com/test');
$jar->inject($tx);
@cookies = $tx->req->cookie('foo');
@cookies = @{$tx->req->multi_cookie('foo')};
is $cookies[0]->name, 'foo', 'right name';
is $cookies[0]->value, 'without', 'right value';
is $cookies[1]->name, 'foo', 'right name';
Expand All @@ -353,7 +353,7 @@ is $cookies[2], undef, 'no third cookie';
$tx = Mojo::Transaction::HTTP->new;
$tx->req->url->parse('http://www.example.com/test');
$jar->inject($tx);
@cookies = $tx->req->cookie('foo');
@cookies = @{$tx->req->multi_cookie('foo')};
is $cookies[0]->name, 'foo', 'right name';
is $cookies[0]->value, 'with', 'right value';
is $cookies[1], undef, 'no second cookie';
Expand Down
5 changes: 3 additions & 2 deletions t/mojo/request.t
Expand Up @@ -1587,9 +1587,10 @@ is $req2->headers->cookie, 'foo=bar; foo=baz; foo=yada; bar=foo',
'right "Cookie" value';
is $req2->url, '/foo/bar', 'right URL';
is $req2->url->to_abs, 'http://127.0.0.1/foo/bar', 'right absolute URL';
is_deeply [map { $_->value } $req2->cookie('foo')], [qw(bar baz yada)],
is_deeply [map { $_->value } @{$req2->multi_cookie('foo')}],
[qw(bar baz yada)], 'right values';
is_deeply [map { $_->value } @{$req2->multi_cookie('bar')}], ['foo'],
'right values';
is_deeply [map { $_->value } $req2->cookie('bar')], ['foo'], 'right values';
is_deeply [map { $_->value } $req2->cookie([qw(foo bar)])], [qw(bar foo)],
'right values';

Expand Down
2 changes: 2 additions & 0 deletions t/mojolicious/validation_lite_app.t
Expand Up @@ -39,6 +39,7 @@ is_deeply [$validation->error], [], 'no names';
ok $validation->required('foo')->is_valid, 'valid';
is_deeply $validation->output, {foo => 'bar'}, 'right result';
is $validation->param('foo'), 'bar', 'right value';
is_deeply $validation->multi_param('foo'), ['bar'], 'right values';
is_deeply [$validation->param], ['foo'], 'right names';
ok !$validation->has_error, 'no error';
ok $validation->optional('baz')->is_valid, 'valid';
Expand Down Expand Up @@ -77,6 +78,7 @@ is_deeply [$validation->error], [qw(baz yada)], 'right names';
$validation = $t->app->validation->input(
{foo => [qw(bar whatever)], baz => [qw(yada ohoh)]});
ok $validation->required('foo')->in(qw(23 bar whatever))->is_valid, 'valid';
is_deeply $validation->multi_param('foo'), [qw(bar whatever)], 'right results';
is_deeply $validation->output, {foo => [qw(bar whatever)]}, 'right result';
ok !$validation->has_error, 'no error';
ok !$validation->required('baz')->in(qw(yada whatever))->is_valid, 'not valid';
Expand Down

0 comments on commit 2125428

Please sign in to comment.