Hello community, here is the log from the commit of package perl-Mojolicious for openSUSE:Factory checked in at 2016-09-23 11:24:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/perl-Mojolicious (Old) and /work/SRC/openSUSE:Factory/.perl-Mojolicious.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Mojolicious" Changes: -------- --- /work/SRC/openSUSE:Factory/perl-Mojolicious/perl-Mojolicious.changes 2016-09-05 21:18:16.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.perl-Mojolicious.new/perl-Mojolicious.changes 2016-09-23 11:24:54.000000000 +0200 @@ -1,0 +2,20 @@ +Wed Sep 21 05:46:53 UTC 2016 - co...@suse.com + +- updated to 7.07 + see /usr/share/doc/packages/perl-Mojolicious/Changes + + 7.07 2016-09-20 + - Fixed bug in Mojo::UserAgent::Transactor where 303 redirects would not be + followed correctly with GET requests. (jberger) + +------------------------------------------------------------------- +Sun Sep 18 05:42:57 UTC 2016 - co...@suse.com + +- updated to 7.06 + see /usr/share/doc/packages/perl-Mojolicious/Changes + + 7.06 2016-09-17 + - Fixed bug where Mojolicious::Renderer would wrap text in layouts. + - Fixed a few test description encoding bugs in Test::Mojo. + +------------------------------------------------------------------- Old: ---- Mojolicious-7.05.tar.gz New: ---- Mojolicious-7.07.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ perl-Mojolicious.spec ++++++ --- /var/tmp/diff_new_pack.KD1ZLX/_old 2016-09-23 11:24:55.000000000 +0200 +++ /var/tmp/diff_new_pack.KD1ZLX/_new 2016-09-23 11:24:55.000000000 +0200 @@ -17,14 +17,14 @@ Name: perl-Mojolicious -Version: 7.05 +Version: 7.07 Release: 0 %define cpan_name Mojolicious Summary: Real-time web framework License: Artistic-2.0 Group: Development/Libraries/Perl Url: http://search.cpan.org/dist/Mojolicious/ -Source0: http://www.cpan.org/authors/id/S/SR/SRI/%{cpan_name}-%{version}.tar.gz +Source0: http://www.cpan.org/authors/id/J/JB/JBERGER/%{cpan_name}-%{version}.tar.gz Source1: cpanspec.yml BuildArch: noarch BuildRoot: %{_tmppath}/%{name}-%{version}-build ++++++ Mojolicious-7.05.tar.gz -> Mojolicious-7.07.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/Changes new/Mojolicious-7.07/Changes --- old/Mojolicious-7.05/Changes 2016-08-29 17:10:48.000000000 +0200 +++ new/Mojolicious-7.07/Changes 2016-09-20 14:20:08.000000000 +0200 @@ -1,4 +1,12 @@ +7.07 2016-09-20 + - Fixed bug in Mojo::UserAgent::Transactor where 303 redirects would not be + followed correctly with GET requests. (jberger) + +7.06 2016-09-17 + - Fixed bug where Mojolicious::Renderer would wrap text in layouts. + - Fixed a few test description encoding bugs in Test::Mojo. + 7.05 2016-08-29 - Fixed bug in Mojo::IOLoop::Subprocess where EV would steal the subprocess exit status. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/META.json new/Mojolicious-7.07/META.json --- old/Mojolicious-7.05/META.json 2016-08-29 18:43:03.000000000 +0200 +++ new/Mojolicious-7.07/META.json 2016-09-20 14:29:33.000000000 +0200 @@ -4,7 +4,7 @@ "Sebastian Riedel <s...@cpan.org>" ], "dynamic_config" : 0, - "generated_by" : "ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter version 2.150010", + "generated_by" : "ExtUtils::MakeMaker version 7.22, CPAN::Meta::Converter version 2.150005", "license" : [ "artistic_2" ], @@ -58,6 +58,6 @@ }, "x_IRC" : "irc://irc.perl.org/#mojo" }, - "version" : "7.05", + "version" : "7.07", "x_serialization_backend" : "JSON::PP version 2.27400" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/META.yml new/Mojolicious-7.07/META.yml --- old/Mojolicious-7.05/META.yml 2016-08-29 18:43:03.000000000 +0200 +++ new/Mojolicious-7.07/META.yml 2016-09-20 14:29:33.000000000 +0200 @@ -7,7 +7,7 @@ configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 0 -generated_by: 'ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter version 2.150010' +generated_by: 'ExtUtils::MakeMaker version 7.22, CPAN::Meta::Converter version 2.150005' license: artistic_2 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html @@ -31,5 +31,5 @@ homepage: http://mojolicious.org license: http://www.opensource.org/licenses/artistic-license-2.0 repository: https://github.com/kraih/mojo.git -version: '7.05' +version: '7.07' x_serialization_backend: 'CPAN::Meta::YAML version 0.018' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/lib/Mojo/UserAgent/Transactor.pm new/Mojolicious-7.07/lib/Mojo/UserAgent/Transactor.pm --- old/Mojolicious-7.05/lib/Mojo/UserAgent/Transactor.pm 2016-08-21 18:02:29.000000000 +0200 +++ new/Mojolicious-7.07/lib/Mojo/UserAgent/Transactor.pm 2016-09-20 14:18:46.000000000 +0200 @@ -89,8 +89,8 @@ $new->req($clone); } else { - my $method = uc $req->method; - my $headers = $new->req->method($method eq 'POST' ? 'GET' : $method) + my $m = uc $req->method; + my $headers = $new->req->method($code == 303 || $m eq 'POST' ? 'GET' : $m) ->content->headers($req->headers->clone)->headers; $headers->remove($_) for grep {/^content-/i} @{$headers->names}; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/lib/Mojolicious/Controller.pm new/Mojolicious-7.07/lib/Mojolicious/Controller.pm --- old/Mojolicious-7.05/lib/Mojolicious/Controller.pm 2016-08-27 14:19:33.000000000 +0200 +++ new/Mojolicious-7.07/lib/Mojolicious/Controller.pm 2016-09-18 05:52:14.000000000 +0200 @@ -736,6 +736,7 @@ my $bytes = $c->req->body; my $str = $c->req->text; my $hash = $c->req->params->to_hash; + my $all = $c->req->uploads; my $value = $c->req->json; my $foo = $c->req->json('/23/foo'); my $dom = $c->req->dom; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/lib/Mojolicious/Guides/Cookbook.pod new/Mojolicious-7.07/lib/Mojolicious/Guides/Cookbook.pod --- old/Mojolicious-7.05/lib/Mojolicious/Guides/Cookbook.pod 2016-08-01 02:03:56.000000000 +0200 +++ new/Mojolicious-7.07/lib/Mojolicious/Guides/Cookbook.pod 2016-09-18 05:52:14.000000000 +0200 @@ -122,9 +122,9 @@ =head2 Hypnotoad For bigger applications L<Mojolicious> contains the UNIX optimized pre-forking -web server L<Mojo::Server::Hypnotoad>, which can take advantage of multiple CPU -cores and copy-on-write memory management to scale up to thousands of -concurrent client connections. +web server L<Hypnotoad|Mojo::Server::Hypnotoad>, which can take advantage of +multiple CPU cores and copy-on-write memory management to scale up to thousands +of concurrent client connections. Mojo::Server::Hypnotoad |- Mojo::Server::Daemon [1] @@ -172,15 +172,16 @@ $ hypnotoad ./script/my_app Starting hot deployment for Hypnotoad server 31841. -You might also want to enable proxy support if you're using Hypnotoad behind a -reverse proxy. This allows L<Mojolicious> to automatically pick up the -C<X-Forwarded-For> and C<X-Forwarded-Proto> headers. +You might also want to enable proxy support if you're using +L<Hypnotoad|Mojo::Server::Hypnotoad> behind a reverse proxy. This allows +L<Mojolicious> to automatically pick up the C<X-Forwarded-For> and +C<X-Forwarded-Proto> headers. # myapp.conf {hypnotoad => {proxy => 1}}; -To manage Hypnotoad with systemd, you can use a unit configuration file like -this. +To manage L<Hypnotoad|Mojo::Server::Hypnotoad> with systemd, you can use a unit +configuration file like this. [Unit] Description=My Mojolicious application @@ -198,10 +199,10 @@ =head2 Zero downtime software upgrades -Hypnotoad makes zero downtime software upgrades (hot deployment) very simple, -as you can see above, but on modern operating systems that support the -C<SO_REUSEPORT> socket option, there is also another method available that -works with all built-in web servers. +L<Hypnotoad|Mojo::Server::Hypnotoad> makes zero downtime software upgrades (hot +deployment) very simple, as you can see above, but on modern operating systems +that support the C<SO_REUSEPORT> socket option, there is also another method +available that works with all built-in web servers. $ ./script/my_app prefork -P /tmp/first.pid -l http://*:8080?reuse=1 Server available at http://127.0.0.1:8080 @@ -218,9 +219,9 @@ =head2 Nginx -One of the most popular setups these days is Hypnotoad behind an -L<Nginx|http://nginx.org> reverse proxy, which even supports WebSockets in -newer versions. +One of the most popular setups these days is +L<Hypnotoad|Mojo::Server::Hypnotoad> behind an L<Nginx|http://nginx.org> reverse +proxy, which even supports WebSockets in newer versions. upstream myapp { server 127.0.0.1:8080; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/lib/Mojolicious/Guides/FAQ.pod new/Mojolicious-7.07/lib/Mojolicious/Guides/FAQ.pod --- old/Mojolicious-7.05/lib/Mojolicious/Guides/FAQ.pod 2016-08-27 14:23:36.000000000 +0200 +++ new/Mojolicious-7.07/lib/Mojolicious/Guides/FAQ.pod 2016-09-18 05:52:14.000000000 +0200 @@ -78,9 +78,16 @@ legacy version that we deem worthy of supporting, but not specifically optimize for it, this is currently 5.10.1. +=head2 How well is Windows supported by Mojolicious? + +Windows is fully supported by L<Mojolicious>, some of the more advanced +features, such as L<subprocesses|Mojo::IOLoop/"subprocess"> and the +L<Hypnotoad|Mojo::Server::Hypnotoad> web server, will however require the use of +the L<Windows Subsystem for Linux|https://msdn.microsoft.com/commandline/wsl/>. + =head2 Do I need to clean my environment before testing Mojolicious? -Mojolicious uses many environment variables both internally and externally, +L<Mojolicious> uses many environment variables both internally and externally, notably (but not exclusively) those starting with the prefix C<MOJO_*> and C<PLACK_ENV>. The test suite expects a clean environment; testing with a non-standard environment is unsupported and is unlikely to succeed. Therefore @@ -114,10 +121,12 @@ No, it is not possible to magically make Perl code non-blocking. While L<Mojolicious> has been designed from the ground up for non-blocking I/O and -event loops, taking advantage of this requires specialized code available -through modules like L<Mojo::IOLoop> and L<Mojo::UserAgent>, or third-party -event loops. In the documentation we often refer to this as real-time web, for -more information see also L<Mojolicious::Guides::Cookbook/"REAL-TIME WEB">. +event loops, taking advantage of this requires blocking code to be wrapped in +L<subprocesses|Mojo::IOLoop/"subprocess">, and the use of specialized +non-blocking code available through modules like L<Mojo::IOLoop> and +L<Mojo::UserAgent>, or third-party event loops. In the documentation we often +refer to this as real-time web, for more information see also +L<Mojolicious::Guides::Cookbook/"REAL-TIME WEB">. =head2 What is an event loop? @@ -155,11 +164,11 @@ =head2 Can I configure Hypnotoad from the command line? -No, you can't, Hypnotoad is a bit special in this regard. Because when you -initiate a zero downtime software upgrade (hot deployment), you are only really -sending a C<USR2> signal to the already running server, and no other information -can be passed along. What you can do instead, is to use a -L<Mojolicious::Plugin::Config> or L<Mojolicious::Plugin::JSONConfig> +No, you can't, L<Hypnotoad|Mojo::Server::Hypnotoad> is a bit special in this +regard. Because when you initiate a zero downtime software upgrade (hot +deployment), you are only really sending a C<USR2> signal to the already running +server, and no other information can be passed along. What you can do instead, +is to use a L<Mojolicious::Plugin::Config> or L<Mojolicious::Plugin::JSONConfig> configuration file. # myapp.conf diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/lib/Mojolicious/Guides/Tutorial.pod new/Mojolicious-7.07/lib/Mojolicious/Guides/Tutorial.pod --- old/Mojolicious-7.05/lib/Mojolicious/Guides/Tutorial.pod 2016-08-16 16:57:46.000000000 +0200 +++ new/Mojolicious-7.07/lib/Mojolicious/Guides/Tutorial.pod 2016-09-18 05:52:14.000000000 +0200 @@ -791,10 +791,11 @@ =head2 File uploads All files uploaded via C<multipart/form-data> request are automatically -available as L<Mojo::Upload> objects. And you don't have to worry about memory -usage, because all files above 250KB will be automatically streamed into a -temporary file. To build HTML forms more efficiently, you can also use tag -helpers like L<Mojolicious::Plugin::TagHelpers/"form_for">. +available as L<Mojo::Upload> objects from L<Mojolicious::Controller/"param">. +And you don't have to worry about memory usage, because all files above 250KB +will be automatically streamed into a temporary file. To build HTML forms more +efficiently, you can also use tag helpers like +L<Mojolicious::Plugin::TagHelpers/"form_for">. use Mojolicious::Lite; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/lib/Mojolicious/Renderer.pm new/Mojolicious-7.07/lib/Mojolicious/Renderer.pm --- old/Mojolicious-7.05/lib/Mojolicious/Renderer.pm 2016-07-19 02:38:18.000000000 +0200 +++ new/Mojolicious-7.07/lib/Mojolicious/Renderer.pm 2016-09-18 05:52:14.000000000 +0200 @@ -99,17 +99,16 @@ # Data return delete $stash->{data}, $options->{format} if defined $stash->{data}; + # Text + return _maybe($options->{encoding}, delete $stash->{text}), $options->{format} + if defined $stash->{text}; + # JSON return encode_json(delete $stash->{json}), 'json' if exists $stash->{json}; - # Text - my $output = delete $stash->{text}; - # Template or templateless handler - unless (defined $output) { - $options->{template} //= $self->template_for($c); - return () unless $self->_render_template($c, \$output, $options); - } + $options->{template} //= $self->template_for($c); + return () unless $self->_render_template($c, \my $output, $options); # Inheritance my $content = $stash->{'mojo.content'} ||= {}; @@ -122,11 +121,8 @@ $content->{content} //= $output if $output =~ /\S/; } - # Encoding - $output = encode $options->{encoding}, $output - if !$string && $options->{encoding} && $output; - - return $output, $options->{format}; + return $string ? $output : _maybe($options->{encoding}, $output), + $options->{format}; } sub template_for { @@ -195,6 +191,8 @@ } } +sub _maybe { $_[0] ? encode @_ : $_[1] } + sub _next { my $stash = shift; return delete $stash->{extends} if $stash->{extends}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/lib/Mojolicious.pm new/Mojolicious-7.07/lib/Mojolicious.pm --- old/Mojolicious-7.05/lib/Mojolicious.pm 2016-08-29 16:00:05.000000000 +0200 +++ new/Mojolicious-7.07/lib/Mojolicious.pm 2016-09-20 14:20:47.000000000 +0200 @@ -43,7 +43,7 @@ has validator => sub { Mojolicious::Validator->new }; our $CODENAME = 'Doughnut'; -our $VERSION = '7.05'; +our $VERSION = '7.07'; sub AUTOLOAD { my $self = shift; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/lib/Test/Mojo.pm new/Mojolicious-7.07/lib/Test/Mojo.pm --- old/Mojolicious-7.05/lib/Test/Mojo.pm 2016-07-19 02:38:18.000000000 +0200 +++ new/Mojolicious-7.07/lib/Test/Mojo.pm 2016-09-18 05:52:14.000000000 +0200 @@ -31,74 +31,74 @@ sub content_is { my ($self, $value, $desc) = @_; - $desc ||= 'exact match for content'; - return $self->_test('is', $self->tx->res->text, $value, $desc); + return $self->_test('is', $self->tx->res->text, + $value, _desc($desc, 'exact match for content')); } sub content_isnt { my ($self, $value, $desc) = @_; - $desc ||= 'no match for content'; - return $self->_test('isnt', $self->tx->res->text, $value, $desc); + return $self->_test('isnt', $self->tx->res->text, + $value, _desc($desc, 'no match for content')); } sub content_like { my ($self, $regex, $desc) = @_; - $desc ||= 'content is similar'; - return $self->_test('like', $self->tx->res->text, $regex, $desc); + return $self->_test('like', $self->tx->res->text, + $regex, _desc($desc, 'content is similar')); } sub content_type_is { my ($self, $type, $desc) = @_; - $desc ||= "Content-Type: $type"; + $desc = _desc($desc, "Content-Type: $type"); return $self->_test('is', $self->tx->res->headers->content_type, $type, $desc); } sub content_type_isnt { my ($self, $type, $desc) = @_; - $desc ||= "not Content-Type: $type"; + $desc = _desc($desc, "not Content-Type: $type"); return $self->_test('isnt', $self->tx->res->headers->content_type, $type, $desc); } sub content_type_like { my ($self, $regex, $desc) = @_; - $desc ||= 'Content-Type is similar'; + $desc = _desc($desc, 'Content-Type is similar'); return $self->_test('like', $self->tx->res->headers->content_type, $regex, $desc); } sub content_type_unlike { my ($self, $regex, $desc) = @_; - $desc ||= 'Content-Type is not similar'; + $desc = _desc($desc, 'Content-Type is not similar'); return $self->_test('unlike', $self->tx->res->headers->content_type, $regex, $desc); } sub content_unlike { my ($self, $regex, $desc) = @_; - $desc ||= 'content is not similar'; - return $self->_test('unlike', $self->tx->res->text, $regex, $desc); + return $self->_test('unlike', $self->tx->res->text, + $regex, _desc($desc, 'content is not similar')); } sub delete_ok { shift->_build_ok(DELETE => @_) } sub element_count_is { my ($self, $selector, $count, $desc) = @_; - $desc ||= encode 'UTF-8', qq{element count for selector "$selector"}; my $size = $self->tx->res->dom->find($selector)->size; - return $self->_test('is', $size, $count, $desc); + return $self->_test('is', $size, $count, + _desc($desc, qq{element count for selector "$selector"})); } sub element_exists { my ($self, $selector, $desc) = @_; - $desc ||= encode 'UTF-8', qq{element for selector "$selector" exists}; + $desc = _desc($desc, qq{element for selector "$selector" exists}); return $self->_test('ok', $self->tx->res->dom->at($selector), $desc); } sub element_exists_not { my ($self, $selector, $desc) = @_; - $desc ||= encode 'UTF-8', qq{no element for selector "$selector"}; + $desc = _desc($desc, qq{no element for selector "$selector"}); return $self->_test('ok', !$self->tx->res->dom->at($selector), $desc); } @@ -122,42 +122,42 @@ sub header_is { my ($self, $name, $value, $desc) = @_; - $desc ||= "$name: " . ($value // ''); + $desc = _desc($desc, "$name: " . ($value // '')); return $self->_test('is', $self->tx->res->headers->header($name), $value, $desc); } sub header_isnt { my ($self, $name, $value, $desc) = @_; - $desc ||= "not $name: " . ($value // ''); + $desc = _desc($desc, "not $name: " . ($value // '')); return $self->_test('isnt', $self->tx->res->headers->header($name), $value, $desc); } sub header_like { my ($self, $name, $regex, $desc) = @_; - $desc ||= "$name is similar"; + $desc = _desc($desc, "$name is similar"); return $self->_test('like', $self->tx->res->headers->header($name), $regex, $desc); } sub header_unlike { my ($self, $name, $regex, $desc) = @_; - $desc ||= "$name is not similar"; + $desc = _desc($desc, "$name is not similar"); return $self->_test('unlike', $self->tx->res->headers->header($name), $regex, $desc); } sub json_has { my ($self, $p, $desc) = @_; - $desc ||= encode 'UTF-8', qq{has value for JSON Pointer "$p"}; + $desc = _desc($desc, qq{has value for JSON Pointer "$p"}); return $self->_test('ok', !!Mojo::JSON::Pointer->new($self->tx->res->json)->contains($p), $desc); } sub json_hasnt { my ($self, $p, $desc) = @_; - $desc ||= encode 'UTF-8', qq{has no value for JSON Pointer "$p"}; + $desc = _desc($desc, qq{has no value for JSON Pointer "$p"}); return $self->_test('ok', !Mojo::JSON::Pointer->new($self->tx->res->json)->contains($p), $desc); } @@ -165,76 +165,77 @@ sub json_is { my $self = shift; my ($p, $data) = @_ > 1 ? (shift, shift) : ('', shift); - my $desc = encode 'UTF-8', shift || qq{exact match for JSON Pointer "$p"}; + my $desc = _desc(shift, qq{exact match for JSON Pointer "$p"}); return $self->_test('is_deeply', $self->tx->res->json($p), $data, $desc); } sub json_like { my ($self, $p, $regex, $desc) = @_; - $desc ||= encode 'UTF-8', qq{similar match for JSON Pointer "$p"}; - return $self->_test('like', $self->tx->res->json($p), $regex, $desc); + return $self->_test('like', $self->tx->res->json($p), + $regex, _desc($desc, qq{similar match for JSON Pointer "$p"})); } sub json_message_has { my ($self, $p, $desc) = @_; - $desc ||= encode 'UTF-8', qq{has value for JSON Pointer "$p"}; + $desc = _desc($desc, qq{has value for JSON Pointer "$p"}); return $self->_test('ok', $self->_json(contains => $p), $desc); } sub json_message_hasnt { my ($self, $p, $desc) = @_; - $desc ||= encode 'UTF-8', qq{has no value for JSON Pointer "$p"}; + $desc = _desc($desc, qq{has no value for JSON Pointer "$p"}); return $self->_test('ok', !$self->_json(contains => $p), $desc); } sub json_message_is { my $self = shift; my ($p, $data) = @_ > 1 ? (shift, shift) : ('', shift); - my $desc = encode 'UTF-8', shift || qq{exact match for JSON Pointer "$p"}; + my $desc = _desc(shift, qq{exact match for JSON Pointer "$p"}); return $self->_test('is_deeply', $self->_json(get => $p), $data, $desc); } sub json_message_like { my ($self, $p, $regex, $desc) = @_; - $desc ||= encode 'UTF-8', qq{similar match for JSON Pointer "$p"}; - return $self->_test('like', $self->_json(get => $p), $regex, $desc); + return $self->_test('like', $self->_json(get => $p), + $regex, _desc($desc, qq{similar match for JSON Pointer "$p"})); } sub json_message_unlike { my ($self, $p, $regex, $desc) = @_; - $desc ||= encode 'UTF-8', qq{no similar match for JSON Pointer "$p"}; - return $self->_test('unlike', $self->_json(get => $p), $regex, $desc); + return $self->_test('unlike', $self->_json(get => $p), + $regex, _desc($desc, qq{no similar match for JSON Pointer "$p"})); } sub json_unlike { my ($self, $p, $regex, $desc) = @_; - $desc ||= encode 'UTF-8', qq{no similar match for JSON Pointer "$p"}; - return $self->_test('unlike', $self->tx->res->json($p), $regex, $desc); + return $self->_test('unlike', $self->tx->res->json($p), + $regex, _desc($desc, qq{no similar match for JSON Pointer "$p"})); } sub message_is { my ($self, $value, $desc) = @_; - return $self->_message('is', $value, $desc || 'exact match for message'); + return $self->_message('is', $value, _desc($desc, 'exact match for message')); } sub message_isnt { my ($self, $value, $desc) = @_; - return $self->_message('isnt', $value, $desc || 'no match for message'); + return $self->_message('isnt', $value, _desc($desc, 'no match for message')); } sub message_like { my ($self, $regex, $desc) = @_; - return $self->_message('like', $regex, $desc || 'message is similar'); + return $self->_message('like', $regex, _desc($desc, 'message is similar')); } sub message_ok { my ($self, $desc) = @_; - return $self->_test('ok', !!$self->_wait, $desc || 'message received'); + return $self->_test('ok', !!$self->_wait, _desc($desc, 'message received')); } sub message_unlike { my ($self, $regex, $desc) = @_; - return $self->_message('unlike', $regex, $desc || 'message is not similar'); + return $self->_message('unlike', $regex, + _desc($desc, 'message is not similar')); } sub new { @@ -266,7 +267,7 @@ sub send_ok { my ($self, $msg, $desc) = @_; - $desc ||= 'send message'; + $desc = _desc($desc, 'send message'); return $self->_test('ok', 0, $desc) unless $self->tx->is_websocket; $self->tx->send($msg => sub { Mojo::IOLoop->stop }); @@ -276,38 +277,39 @@ sub status_is { my ($self, $status, $desc) = @_; - $desc ||= "$status " . $self->tx->res->default_message($status); + $desc = _desc($desc, "$status " . $self->tx->res->default_message($status)); return $self->_test('is', $self->tx->res->code, $status, $desc); } sub status_isnt { my ($self, $status, $desc) = @_; - $desc ||= "not $status " . $self->tx->res->default_message($status); - return $self->_test('isnt', $self->tx->res->code, $status, $desc); + return $self->_test('isnt', $self->tx->res->code, + $status, + _desc($desc, "not $status " . $self->tx->res->default_message($status))); } sub text_is { my ($self, $selector, $value, $desc) = @_; - $desc ||= encode 'UTF-8', qq{exact match for selector "$selector"}; - return $self->_test('is', $self->_text($selector), $value, $desc); + return $self->_test('is', $self->_text($selector), + $value, _desc($desc, qq{exact match for selector "$selector"})); } sub text_isnt { my ($self, $selector, $value, $desc) = @_; - $desc ||= encode 'UTF-8', qq{no match for selector "$selector"}; - return $self->_test('isnt', $self->_text($selector), $value, $desc); + return $self->_test('isnt', $self->_text($selector), + $value, _desc($desc, qq{no match for selector "$selector"})); } sub text_like { my ($self, $selector, $regex, $desc) = @_; - $desc ||= encode 'UTF-8', qq{similar match for selector "$selector"}; - return $self->_test('like', $self->_text($selector), $regex, $desc); + return $self->_test('like', $self->_text($selector), + $regex, _desc($desc, qq{similar match for selector "$selector"})); } sub text_unlike { my ($self, $selector, $regex, $desc) = @_; - $desc ||= encode 'UTF-8', qq{no similar match for selector "$selector"}; - return $self->_test('unlike', $self->_text($selector), $regex, $desc); + return $self->_test('unlike', $self->_text($selector), + $regex, _desc($desc, qq{no similar match for selector "$selector"})); } sub websocket_ok { @@ -321,6 +323,8 @@ return $self->_request_ok($self->ua->build_tx($method, $url, @_), $url); } +sub _desc { encode 'UTF-8', shift || shift } + sub _json { my ($self, $method, $p) = @_; return Mojo::JSON::Pointer->new(j(@{$self->message // []}[1]))->$method($p); @@ -364,7 +368,7 @@ ); Mojo::IOLoop->start; - my $desc = encode 'UTF-8', "WebSocket handshake with $url"; + my $desc = _desc("WebSocket handshake with $url"); return $self->_test('ok', $self->tx->is_websocket, $desc); } @@ -373,8 +377,7 @@ my $err = $self->tx->error; Test::More::diag $err->{message} if !(my $ok = !$err->{message} || $err->{code}) && $err; - my $desc = encode 'UTF-8', "@{[uc $tx->req->method]} $url"; - return $self->_test('ok', $ok, $desc); + return $self->_test('ok', $ok, _desc("@{[uc $tx->req->method]} $url")); } sub _test { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/script/hypnotoad new/Mojolicious-7.07/script/hypnotoad --- old/Mojolicious-7.05/script/hypnotoad 2016-07-19 02:38:18.000000000 +0200 +++ new/Mojolicious-7.07/script/hypnotoad 2016-09-18 05:52:14.000000000 +0200 @@ -43,7 +43,7 @@ =head1 DESCRIPTION Start L<Mojolicious> and L<Mojolicious::Lite> applications with the -L<Mojo::Server::Hypnotoad> web server. +L<Hypnotoad|Mojo::Server::Hypnotoad> web server. =head1 SEE ALSO diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/t/mojo/transactor.t new/Mojolicious-7.07/t/mojo/transactor.t --- old/Mojolicious-7.05/t/mojo/transactor.t 2016-08-21 17:49:10.000000000 +0200 +++ new/Mojolicious-7.07/t/mojo/transactor.t 2016-09-20 14:18:46.000000000 +0200 @@ -720,7 +720,7 @@ is $tx->res->headers->location, undef, 'no "Location" value'; # 303 redirect (dynamic) -$tx = $t->tx(POST => 'http://mojolicious.org/foo'); +$tx = $t->tx(PUT => 'http://mojolicious.org/foo'); $tx->res->code(303); $tx->res->headers->location('http://example.com/bar'); $tx->req->content->write_chunk('whatever' => sub { shift->finish }); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/t/mojo/user_agent_online.t new/Mojolicious-7.07/t/mojo/user_agent_online.t --- old/Mojolicious-7.05/t/mojo/user_agent_online.t 2016-07-19 02:38:18.000000000 +0200 +++ new/Mojolicious-7.07/t/mojo/user_agent_online.t 2016-09-18 05:52:14.000000000 +0200 @@ -189,14 +189,6 @@ is $tx->req->url, 'https://metacpan.org', 'right url'; is $tx->res->code, 200, 'right status'; -# HTTPS request that requires SNI -SKIP: { - skip 'SNI support required!', 1 unless IO::Socket::SSL->can_client_sni; - $tx = $ua->get('https://cpanmin.us'); - is $tx->res->code, 302, 'right status'; - like $tx->res->headers->location, qr/github/, 'right "Location" header'; -} - # Fresh user agent again $ua = Mojo::UserAgent->new; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Mojolicious-7.05/t/mojolicious/lite_app.t new/Mojolicious-7.07/t/mojolicious/lite_app.t --- old/Mojolicious-7.05/t/mojolicious/lite_app.t 2016-07-19 02:38:18.000000000 +0200 +++ new/Mojolicious-7.07/t/mojolicious/lite_app.t 2016-09-18 05:52:14.000000000 +0200 @@ -133,7 +133,7 @@ get '/null/:null' => sub { my $c = shift; - $c->render(text => $c->param('null'), layout => 'layout'); + $c->render(text => $c->param('null')); }; get '/action_template' => {controller => 'foo'} => sub { @@ -284,12 +284,7 @@ }; get '/layout' => sub { - shift->render( - text => 'Yea baby!', - layout => 'layout', - handler => 'epl', - title => 'Layout' - ); + shift->render(layout => 'layout', handler => 'epl', title => 'Layout'); }; post '/template' => 'index'; @@ -622,7 +617,7 @@ # Captured "0" $t->get_ok('/null/0')->status_is(200) - ->header_is(Server => 'Mojolicious (Perl)')->content_like(qr/layouted 0/); + ->header_is(Server => 'Mojolicious (Perl)')->content_is('0'); # Render action $t->get_ok('/action_template')->status_is(200) @@ -1103,6 +1098,9 @@ @@ layouts/app23.html.ep app layout <%= content %><%= app->mode %> +@@ layout.html.epl +Yea baby!\ + @@ app.html.ep <% layout layout . 23; %><%= layout %>