Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package perl-Mojolicious for 
openSUSE:Factory checked in at 2021-02-15 23:14:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Mojolicious (Old)
 and      /work/SRC/openSUSE:Factory/.perl-Mojolicious.new.28504 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "perl-Mojolicious"

Mon Feb 15 23:14:36 2021 rev:153 rq:871184 version:8.73

Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-Mojolicious/perl-Mojolicious.changes        
2021-01-28 21:28:51.208233337 +0100
+++ 
/work/SRC/openSUSE:Factory/.perl-Mojolicious.new.28504/perl-Mojolicious.changes 
    2021-02-15 23:16:51.539445874 +0100
@@ -1,0 +2,18 @@
+Sun Feb  7 03:12:37 UTC 2021 - Tina M??ller <timueller+p...@suse.de>
+
+- updated to 8.73
+   see /usr/share/doc/packages/perl-Mojolicious/Changes
+
+  8.73  2021-02-05
+    - Removed finally keyword from check function in Mojo::Exception.
+    - Changed arguments of check function in Mojo::Exception to be easier to 
use with Perl 5.34 try/catch.
+    - Removed experimental status from preload_namespaces attribute in 
Mojolicious.
+    - Removed experimental status from any, map, timer and timeout methods in 
Mojo::Promise.
+    - Removed experimental status from extname method in Mojo::File.
+    - Removed experimental status from warmup method in Mojolicious.
+    - Removed experimental status from load_classes function in Mojo::Loader.
+    - Removed experimental status from Mojo::DynamicMethods. Still summons old 
gods, use at your own risk!
+    - Removed experimental status from before_command hook in Mojolicious.
+    - Added silent attribute to Mojo::Server::Morbo.
+
+-------------------------------------------------------------------

Old:
----
  Mojolicious-8.72.tar.gz

New:
----
  Mojolicious-8.73.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ perl-Mojolicious.spec ++++++
--- /var/tmp/diff_new_pack.Uo48QE/_old  2021-02-15 23:16:52.103446717 +0100
+++ /var/tmp/diff_new_pack.Uo48QE/_new  2021-02-15 23:16:52.107446722 +0100
@@ -18,7 +18,7 @@
 
 %define cpan_name Mojolicious
 Name:           perl-Mojolicious
-Version:        8.72
+Version:        8.73
 Release:        0
 Summary:        Real-time web framework
 License:        Artistic-2.0

++++++ Mojolicious-8.72.tar.gz -> Mojolicious-8.73.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/Changes new/Mojolicious-8.73/Changes
--- old/Mojolicious-8.72/Changes        2021-01-27 16:01:40.000000000 +0100
+++ new/Mojolicious-8.73/Changes        2021-02-06 17:06:54.000000000 +0100
@@ -1,4 +1,16 @@
 
+8.73  2021-02-05
+  - Removed finally keyword from check function in Mojo::Exception.
+  - Changed arguments of check function in Mojo::Exception to be easier to use 
with Perl 5.34 try/catch.
+  - Removed experimental status from preload_namespaces attribute in 
Mojolicious.
+  - Removed experimental status from any, map, timer and timeout methods in 
Mojo::Promise.
+  - Removed experimental status from extname method in Mojo::File.
+  - Removed experimental status from warmup method in Mojolicious.
+  - Removed experimental status from load_classes function in Mojo::Loader.
+  - Removed experimental status from Mojo::DynamicMethods. Still summons old 
gods, use at your own risk!
+  - Removed experimental status from before_command hook in Mojolicious.
+  - Added silent attribute to Mojo::Server::Morbo.
+
 8.72  2021-01-26
   - Deprecated Mojo::UserAgent::local_address in favor of 
Mojo::UserAgent::socket_options.
   - Deprecated local_address option of connect method in Mojo::IOLoop::Client 
in favor of socket_options.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/MANIFEST 
new/Mojolicious-8.73/MANIFEST
--- old/Mojolicious-8.72/MANIFEST       2021-01-27 16:32:50.000000000 +0100
+++ new/Mojolicious-8.73/MANIFEST       2021-02-06 17:07:51.000000000 +0100
@@ -6,6 +6,14 @@
 examples/fast.pl
 examples/hello-template.pl
 examples/hello.pl
+examples/login/lib/LoginApp.pm
+examples/login/lib/LoginApp/Controller/Login.pm
+examples/login/lib/LoginApp/Model/Users.pm
+examples/login/script/login_app
+examples/login/t/login.t
+examples/login/templates/layouts/default.html.ep
+examples/login/templates/login/index.html.ep
+examples/login/templates/login/protected.html.ep
 examples/microhttpd.pl
 examples/proxy.pl
 examples/responses.pl
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/META.json 
new/Mojolicious-8.73/META.json
--- old/Mojolicious-8.72/META.json      2021-01-27 16:32:50.000000000 +0100
+++ new/Mojolicious-8.73/META.json      2021-02-06 17:07:51.000000000 +0100
@@ -63,6 +63,6 @@
          "web" : "https://webchat.freenode.net/#mojo";
       }
    },
-   "version" : "8.72",
+   "version" : "8.73",
    "x_serialization_backend" : "JSON::PP version 4.06"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/META.yml 
new/Mojolicious-8.73/META.yml
--- old/Mojolicious-8.72/META.yml       2021-01-27 16:32:50.000000000 +0100
+++ new/Mojolicious-8.73/META.yml       2021-02-06 17:07:51.000000000 +0100
@@ -34,5 +34,5 @@
   homepage: https://mojolicious.org
   license: http://www.opensource.org/licenses/artistic-license-2.0
   repository: https://github.com/mojolicious/mojo.git
-version: '8.72'
+version: '8.73'
 x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Mojolicious-8.72/examples/login/lib/LoginApp/Controller/Login.pm 
new/Mojolicious-8.73/examples/login/lib/LoginApp/Controller/Login.pm
--- old/Mojolicious-8.72/examples/login/lib/LoginApp/Controller/Login.pm        
1970-01-01 01:00:00.000000000 +0100
+++ new/Mojolicious-8.73/examples/login/lib/LoginApp/Controller/Login.pm        
2021-02-03 22:29:39.000000000 +0100
@@ -0,0 +1,25 @@
+package LoginApp::Controller::Login;
+use Mojo::Base 'Mojolicious::Controller', -signatures;
+
+sub index ($self) {
+  my $user = $self->param('user') || '';
+  my $pass = $self->param('pass') || '';
+  return $self->render unless $self->users->check($user, $pass);
+
+  $self->session(user => $user);
+  $self->flash(message => 'Thanks for logging in.');
+  $self->redirect_to('protected');
+}
+
+sub logged_in ($self) {
+  return 1 if $self->session('user');
+  $self->redirect_to('index');
+  return undef;
+}
+
+sub logout ($self) {
+  $self->session(expires => 1);
+  $self->redirect_to('index');
+}
+
+1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Mojolicious-8.72/examples/login/lib/LoginApp/Model/Users.pm 
new/Mojolicious-8.73/examples/login/lib/LoginApp/Model/Users.pm
--- old/Mojolicious-8.72/examples/login/lib/LoginApp/Model/Users.pm     
1970-01-01 01:00:00.000000000 +0100
+++ new/Mojolicious-8.73/examples/login/lib/LoginApp/Model/Users.pm     
2021-02-03 22:29:39.000000000 +0100
@@ -0,0 +1,22 @@
+package LoginApp::Model::Users;
+
+use strict;
+use warnings;
+use experimental qw(signatures);
+
+use Mojo::Util qw(secure_compare);
+
+my $USERS = {joel => 'las3rs', marcus => 'lulz', sebastian => 'secr3t'};
+
+sub new ($class) { bless {}, $class }
+
+sub check ($self, $user, $pass) {
+
+  # Success
+  return 1 if $USERS->{$user} && secure_compare $USERS->{$user}, $pass;
+
+  # Fail
+  return undef;
+}
+
+1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/examples/login/lib/LoginApp.pm 
new/Mojolicious-8.73/examples/login/lib/LoginApp.pm
--- old/Mojolicious-8.72/examples/login/lib/LoginApp.pm 1970-01-01 
01:00:00.000000000 +0100
+++ new/Mojolicious-8.73/examples/login/lib/LoginApp.pm 2021-02-03 
22:29:39.000000000 +0100
@@ -0,0 +1,20 @@
+package LoginApp;
+use Mojo::Base 'Mojolicious', -signatures;
+
+use LoginApp::Model::Users;
+
+sub startup ($self) {
+
+  $self->secrets(['Mojolicious rocks']);
+  $self->helper(users => sub { state $users = LoginApp::Model::Users->new });
+
+  my $r = $self->routes;
+  $r->any('/')->to('login#index')->name('index');
+
+  my $logged_in = $r->under('/')->to('login#logged_in');
+  $logged_in->get('/protected')->to('login#protected');
+
+  $r->get('/logout')->to('login#logout');
+}
+
+1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/examples/login/script/login_app 
new/Mojolicious-8.73/examples/login/script/login_app
--- old/Mojolicious-8.72/examples/login/script/login_app        1970-01-01 
01:00:00.000000000 +0100
+++ new/Mojolicious-8.73/examples/login/script/login_app        2021-02-03 
22:29:39.000000000 +0100
@@ -0,0 +1,11 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use Mojo::File qw(curfile);
+use lib curfile->dirname->sibling('lib')->to_string;
+use Mojolicious::Commands;
+
+# Start command line interface for application
+Mojolicious::Commands->start_app('LoginApp');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/examples/login/t/login.t 
new/Mojolicious-8.73/examples/login/t/login.t
--- old/Mojolicious-8.72/examples/login/t/login.t       1970-01-01 
01:00:00.000000000 +0100
+++ new/Mojolicious-8.73/examples/login/t/login.t       2021-02-03 
22:29:39.000000000 +0100
@@ -0,0 +1,22 @@
+use Mojo::Base -strict;
+
+use Test::More;
+use Test::Mojo;
+
+my $t = Test::Mojo->new('LoginApp');
+$t->ua->max_redirects(1);
+
+subtest 'Test login workflow' => sub {
+  $t->get_ok('/')->status_is(200)->element_exists('form 
input[name="user"]')->element_exists('form input[name="pass"]')
+    ->element_exists('form input[type="submit"]');
+
+  $t->post_ok('/' => form => {user => 'sebastian', pass => 
'secr3t'})->status_is(200)
+    ->text_like('html body' => qr/Welcome sebastian/);
+
+  $t->get_ok('/protected')->status_is(200)->text_like('a' => qr/Logout/);
+
+  $t->get_ok('/logout')->status_is(200)->element_exists('form 
input[name="user"]')
+    ->element_exists('form input[name="pass"]')->element_exists('form 
input[type="submit"]');
+};
+
+done_testing();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Mojolicious-8.72/examples/login/templates/layouts/default.html.ep 
new/Mojolicious-8.73/examples/login/templates/layouts/default.html.ep
--- old/Mojolicious-8.72/examples/login/templates/layouts/default.html.ep       
1970-01-01 01:00:00.000000000 +0100
+++ new/Mojolicious-8.73/examples/login/templates/layouts/default.html.ep       
2021-02-03 22:29:39.000000000 +0100
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<html>
+  <head><title>Login Manager</title></head>
+  <body><%= content %></body>
+</html
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Mojolicious-8.72/examples/login/templates/login/index.html.ep 
new/Mojolicious-8.73/examples/login/templates/login/index.html.ep
--- old/Mojolicious-8.72/examples/login/templates/login/index.html.ep   
1970-01-01 01:00:00.000000000 +0100
+++ new/Mojolicious-8.73/examples/login/templates/login/index.html.ep   
2021-02-03 22:29:39.000000000 +0100
@@ -0,0 +1,12 @@
+% layout 'default';
+%= form_for index => begin
+  % if (param 'user') {
+    <b>Wrong name or password, please try again.</b><br>
+  % }
+  Name:<br>
+  %= text_field 'user'
+  <br>Password:<br>
+  %= password_field 'pass'
+  <br>
+  %= submit_button 'Login'
+% end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Mojolicious-8.72/examples/login/templates/login/protected.html.ep 
new/Mojolicious-8.73/examples/login/templates/login/protected.html.ep
--- old/Mojolicious-8.72/examples/login/templates/login/protected.html.ep       
1970-01-01 01:00:00.000000000 +0100
+++ new/Mojolicious-8.73/examples/login/templates/login/protected.html.ep       
2021-02-03 22:29:39.000000000 +0100
@@ -0,0 +1,6 @@
+% layout 'default';
+% if (my $msg = flash 'message') {
+  <b><%= $msg %></b><br>
+% }
+Welcome <%= session 'user' %>.<br>
+%= link_to Logout => 'logout'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojo/DynamicMethods.pm 
new/Mojolicious-8.73/lib/Mojo/DynamicMethods.pm
--- old/Mojolicious-8.72/lib/Mojo/DynamicMethods.pm     2021-01-21 
01:50:05.000000000 +0100
+++ new/Mojolicious-8.73/lib/Mojo/DynamicMethods.pm     2021-02-05 
18:20:25.000000000 +0100
@@ -39,7 +39,7 @@
   $dyn_methods{$object}{$name} = $code;
 }
 
-1;
+"Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn";
 
 =encoding utf8
 
@@ -90,7 +90,7 @@
     };
   }
 
-Note that this module is B<EXPERIMENTAL> and might change without warning!
+Note that this module will summon B<Cthulhu>, use it at your own risk!
 
 =head1 FUNCTIONS
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojo/Exception.pm 
new/Mojolicious-8.73/lib/Mojo/Exception.pm
--- old/Mojolicious-8.72/lib/Mojo/Exception.pm  2021-01-21 01:50:01.000000000 
+0100
+++ new/Mojolicious-8.73/lib/Mojo/Exception.pm  2021-02-05 18:20:25.000000000 
+0100
@@ -2,8 +2,9 @@
 use Mojo::Base -base;
 use overload bool => sub {1}, '""' => sub { shift->to_string }, fallback => 1;
 
+use Carp qw(croak);
 use Exporter qw(import);
-use Mojo::Util qw(decode scope_guard);
+use Mojo::Util qw(decode);
 use Scalar::Util qw(blessed);
 
 has [qw(frames line lines_after lines_before)] => sub { [] };
@@ -13,20 +14,16 @@
 our @EXPORT_OK = qw(check raise);
 
 sub check {
-  my ($err, @spec) = @_ % 2 ? @_ : ($@, @_);
-
-  # Finally (search backwards since it is usually at the end)
-  my $guard;
-  for (my $i = $#spec - 1; $i >= 0; $i -= 2) {
-    ($guard = scope_guard($spec[$i + 1])) and last if $spec[$i] eq 'finally';
-  }
-
+  my ($err, $spec) = @_;
   return undef unless $err;
 
+  croak "Array reference of pattern/handler pairs required to dispatch 
exceptions"
+    if ref $spec ne 'ARRAY' || @$spec % 2;
+
   my ($default, $handler);
   my ($is_obj,  $str) = (!!blessed($err), "$err");
-CHECK: for (my $i = 0; $i < @spec; $i += 2) {
-    my ($checks, $cb) = @spec[$i, $i + 1];
+CHECK: for (my $i = 0; $i < @$spec; $i += 2) {
+    my ($checks, $cb) = @{$spec}[$i, $i + 1];
 
     ($default = $cb) and next if $checks eq 'default';
 
@@ -171,20 +168,20 @@
   eval {
     MyApp::X::Foo->throw('Something went wrong!');
   };
-  check(
+  check $@ => [
     'MyApp::X::Foo' => sub { say "Foo: $_" },
     'MyApp::X::Bar' => sub { say "Bar: $_" }
-  );
+  ];
 
   # Generate exception classes on demand
   use Mojo::Exception qw(check raise);
   eval {
     raise 'MyApp::X::Name', 'The name Minion is already taken';
   };
-  check(
+  check $@ => [
     'MyApp::X::Name' => sub { say "Name error: $_" },
     default          => sub { say "Error: $_" }
-  );
+  ];
 
 =head1 DESCRIPTION
 
@@ -196,23 +193,20 @@
 
 =head2 check
 
-  my $bool = check 'MyApp::X::Foo' => sub {...};
-  my $bool = check $err, 'MyApp::X::Foo' => sub {...};
+  my $bool = check $err => ['MyApp::X::Foo' => sub {...}];
 
 Process exceptions by dispatching them to handlers with one or more matching 
conditions. Exceptions that could not be
-handled will be rethrown automatically. By default C<$@> will be used as 
exception source, so C<check> needs to be
-called right after C<eval>. Note that this function is B<EXPERIMENTAL> and 
might change without warning!
+handled will be rethrown automatically. Note that this function is 
B<EXPERIMENTAL> and might change without warning!
 
   # Handle various types of exceptions
   eval {
     dangerous_code();
   };
-  check(
+  check $@ => [
     'MyApp::X::Foo'     => sub { say "Foo: $_" },
     qr/^Could not open/ => sub { say "Open error: $_" },
-    default             => sub { say "Something went wrong: $_" },
-    finally             => sub { say 'Dangerous code is done' }
-  );
+    default             => sub { say "Something went wrong: $_" }
+  ];
 
 Matching conditions can be class names for ISA checks on exception objects, or 
regular expressions to match string
 exceptions and stringified exception objects. The matching exception will be 
the first argument passed to the callback,
@@ -222,10 +216,10 @@
   eval {
     dangerous_code();
   };
-  check(
+  check $@ => [
     'MyApp::X::Foo'     => sub { say "Foo: $_" },
     qr/^Could not open/ => sub { say "Open error: $_" }
-  );
+  ];
 
 An array reference can be used to share the same handler with multiple 
conditions, of which only one needs to match.
 And since exception handlers are just callbacks, they can also throw their own 
exceptions.
@@ -234,22 +228,20 @@
   eval {
     dangerous_code();
   };
-  check(
+  check $@ => [
     ['MyApp::X::Foo', 'MyApp::X::Bar'] => sub { die "Foo/Bar: $_" }
-  );
+  ];
 
-There are currently two keywords you can use to set special handlers. The 
C<default> handler is used when no other
-handler matched. And the C<finally> handler runs always, it does not affect 
normal handlers and even runs if the
-exception was rethrown or if there was no exception to be handled at all.
+There is currently only one keywords you can use to set special handlers. The 
C<default> handler is used when no other
+handler matched.
 
   # Use "default" to catch everything
   eval {
     dangerous_code();
   };
-  check(
-    default => sub { say "Error: $_" },
-    finally => sub { say 'Dangerous code is done' }
-  );
+  check $@ => [
+    default => sub { say "Error: $_" }
+  ];
 
 =head2 raise
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojo/File.pm 
new/Mojolicious-8.73/lib/Mojo/File.pm
--- old/Mojolicious-8.72/lib/Mojo/File.pm       2021-01-21 01:50:09.000000000 
+0100
+++ new/Mojolicious-8.73/lib/Mojo/File.pm       2021-02-05 18:20:25.000000000 
+0100
@@ -297,7 +297,7 @@
 
   my $ext = $path->extname;
 
-Return file extension of the path. Note that this method is B<EXPERIMENTAL> 
and might change without warning!
+Return file extension of the path.
 
   # "js"
   path('/home/sri/test.js')->extname;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojo/Loader.pm 
new/Mojolicious-8.73/lib/Mojo/Loader.pm
--- old/Mojolicious-8.72/lib/Mojo/Loader.pm     2021-01-21 01:50:12.000000000 
+0100
+++ new/Mojolicious-8.73/lib/Mojo/Loader.pm     2021-02-05 18:20:25.000000000 
+0100
@@ -203,8 +203,7 @@
 
   my @classes = load_classes 'Foo::Bar';
 
-Load all classes in a namespace recursively. Note that this function is 
B<EXPERIMENTAL> and might change without
-warning!
+Load all classes in a namespace recursively.
 
 =head1 SEE ALSO
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojo/Promise.pm 
new/Mojolicious-8.73/lib/Mojo/Promise.pm
--- old/Mojolicious-8.72/lib/Mojo/Promise.pm    2021-01-21 01:50:02.000000000 
+0100
+++ new/Mojolicious-8.73/lib/Mojo/Promise.pm    2021-02-05 18:20:25.000000000 
+0100
@@ -367,8 +367,7 @@
   my $new = Mojo::Promise->any(@promises);
 
 Returns a new L<Mojo::Promise> object that fulfills as soon as one of the 
passed L<Mojo::Promise> objects fulfills,
-with the value from that promise. If no promises fulfill, it is rejected with 
the reasons from the rejected promises in
-the same order as the passed promises. Note that this method is 
B<EXPERIMENTAL> and might change without warning!
+with the value from that promise.
 
 =head2 catch
 
@@ -412,8 +411,7 @@
 
 Apply a function that returns a L<Mojo::Promise> to each item in a list of 
items while optionally limiting concurrency.
 Returns a L<Mojo::Promise> that collects the results in the same manner as 
L</all>. If any item's promise is rejected,
-any remaining items which have not yet been mapped will not be. Note that this 
method is B<EXPERIMENTAL> and might
-change without warning!
+any remaining items which have not yet been mapped will not be.
 
   # Perform 3 requests at a time concurrently
   Mojo::Promise->map({concurrency => 3}, sub { $ua->get_p($_) }, @urls)
@@ -507,8 +505,7 @@
   $promise = $promise->timer(5);
 
 Create a new L<Mojo::Promise> object with a timer or attach a timer to an 
existing promise. The promise will be
-resolved after the given amount of time in seconds with or without a value. 
Note that this method is B<EXPERIMENTAL>
-and might change without warning!
+resolved after the given amount of time in seconds with or without a value.
 
 =head2 timeout
 
@@ -517,8 +514,7 @@
   $promise = $promise->timeout(5);
 
 Create a new L<Mojo::Promise> object with a timeout or attach a timeout to an 
existing promise. The promise will be
-rejected after the given amount of time in seconds with a reason, which 
defaults to C<Promise timeout>. Note that this
-method is B<EXPERIMENTAL> and might change without warning!
+rejected after the given amount of time in seconds with a reason, which 
defaults to C<Promise timeout>.
 
 =head2 wait
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojo/Reactor/Poll.pm 
new/Mojolicious-8.73/lib/Mojo/Reactor/Poll.pm
--- old/Mojolicious-8.72/lib/Mojo/Reactor/Poll.pm       2021-01-21 
01:50:17.000000000 +0100
+++ new/Mojolicious-8.73/lib/Mojo/Reactor/Poll.pm       2021-02-03 
13:45:57.000000000 +0100
@@ -93,9 +93,7 @@
   return !!delete $self->{io}{fileno($remove) // croak 'Handle is closed'};
 }
 
-sub reset {
-  delete @{shift()}{qw(events io next_tick next_timer running timers)};
-}
+sub reset { delete @{shift()}{qw(events io next_tick next_timer running 
timers)} }
 
 sub start {
   my $self = shift;
@@ -133,11 +131,8 @@
 
 sub _timer {
   my ($self, $recurring, $after, $cb) = @_;
-
-  my $id    = $self->_id;
-  my $timer = $self->{timers}{$id}
-    = {cb => $cb, after => $after, recurring => $recurring, time => 
steady_time + $after};
-
+  my $id = $self->_id;
+  $self->{timers}{$id} = {cb => $cb, after => $after, recurring => $recurring, 
time => steady_time + $after};
   return $id;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojo/Server/Morbo.pm 
new/Mojolicious-8.73/lib/Mojo/Server/Morbo.pm
--- old/Mojolicious-8.72/lib/Mojo/Server/Morbo.pm       2021-01-21 
01:50:08.000000000 +0100
+++ new/Mojolicious-8.73/lib/Mojo/Server/Morbo.pm       2021-02-05 
18:20:25.000000000 +0100
@@ -16,6 +16,7 @@
   die qq{Can't find Morbo backend class "$backend" in \@INC. (@INC)\n};
 };
 has daemon => sub { Mojo::Server::Daemon->new };
+has silent => 1;
 
 sub run {
   my ($self, $app) = @_;
@@ -42,7 +43,7 @@
     say @files == 1
       ? qq{File "@{[$files[0]]}" changed, restarting.}
       : qq{@{[scalar @files]} files changed, restarting.}
-      if $ENV{MORBO_VERBOSE};
+      unless $self->silent;
     kill 'TERM', $self->{worker} if $self->{worker};
     $self->{modified} = 1;
   }
@@ -130,6 +131,13 @@
 
 L<Mojo::Server::Daemon> object this server manages.
 
+=head2 silent
+
+  my $bool = $morbo->silent;
+  $morbo   = $morbo->silent($bool);
+
+Disable console messages, defaults to a true value.
+
 =head1 METHODS
 
 L<Mojo::Server::Morbo> inherits all methods from L<Mojo::Base> and implements 
the following new ones.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojolicious/Guides/FAQ.pod 
new/Mojolicious-8.73/lib/Mojolicious/Guides/FAQ.pod
--- old/Mojolicious-8.72/lib/Mojolicious/Guides/FAQ.pod 2021-01-17 
15:56:36.000000000 +0100
+++ new/Mojolicious-8.73/lib/Mojolicious/Guides/FAQ.pod 2021-02-05 
18:20:25.000000000 +0100
@@ -52,7 +52,7 @@
 anything in return. It would only make sense if we wanted to pass ownership of 
a module to a new maintainer, which we
 already have done in the past.
 
-=head2 Where can i discuss my patches for Mojolicious?
+=head2 Where can I discuss my patches for Mojolicious?
 
 We'd love to discuss your contributions to L<Mojolicious> on our official IRC 
channel C<#mojo> on C<chat.freenode.net>
 (L<chat now!|https://webchat.freenode.net/#mojo>).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojolicious/Guides/Growing.pod 
new/Mojolicious-8.73/lib/Mojolicious/Guides/Growing.pod
--- old/Mojolicious-8.72/lib/Mojolicious/Guides/Growing.pod     2021-01-17 
15:56:36.000000000 +0100
+++ new/Mojolicious-8.73/lib/Mojolicious/Guides/Growing.pod     2021-02-03 
22:29:39.000000000 +0100
@@ -254,7 +254,7 @@
     sebastian => 'secr3t'
   };
 
-  sub new { bless {}, shift }
+  sub new ($class) { bless {}, $class }
 
   sub check ($self, $user, $pass) {
 
@@ -706,30 +706,33 @@
 
 Full L<Mojolicious> applications are a little easier to test, so C<t/login.t> 
can be simplified.
 
+  use Mojo::Base -strict;
+
   use Test::More;
   use Test::Mojo;
 
-  # Load application class
   my $t = Test::Mojo->new('MyApp');
   $t->ua->max_redirects(1);
 
-  $t->get_ok('/')
-    ->status_is(200)
-    ->element_exists('form input[name="user"]')
-    ->element_exists('form input[name="pass"]')
-    ->element_exists('form input[type="submit"]');
-
-  $t->post_ok('/' => form => {user => 'sebastian', pass => 'secr3t'})
-    ->status_is(200)
-    ->text_like('html body' => qr/Welcome sebastian/);
-
-  $t->get_ok('/protected')->status_is(200)->text_like('a' => qr/Logout/);
-
-  $t->get_ok('/logout')
-    ->status_is(200)
-    ->element_exists('form input[name="user"]')
-    ->element_exists('form input[name="pass"]')
-    ->element_exists('form input[type="submit"]');
+  subtest 'Test login workflow' => sub {
+    $t->get_ok('/')
+      ->status_is(200)
+      ->element_exists('form input[name="user"]')
+      ->element_exists('form input[name="pass"]')
+      ->element_exists('form input[type="submit"]');
+
+    $t->post_ok('/' => form => {user => 'sebastian', pass => 'secr3t'})
+      ->status_is(200)
+      ->text_like('html body' => qr/Welcome sebastian/);
+
+    $t->get_ok('/protected')->status_is(200)->text_like('a' => qr/Logout/);
+
+    $t->get_ok('/logout')
+      ->status_is(200)
+      ->element_exists('form input[name="user"]')
+      ->element_exists('form input[name="pass"]')
+      ->element_exists('form input[type="submit"]');
+  };
 
   done_testing();
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojolicious/Guides/Routing.pod 
new/Mojolicious-8.73/lib/Mojolicious/Guides/Routing.pod
--- old/Mojolicious-8.72/lib/Mojolicious/Guides/Routing.pod     2021-01-17 
15:56:36.000000000 +0100
+++ new/Mojolicious-8.73/lib/Mojolicious/Guides/Routing.pod     2021-02-06 
17:06:54.000000000 +0100
@@ -47,30 +47,30 @@
 While regular expressions are quite powerful they also tend to be unpleasant 
to look at and are generally overkill for
 ordinary path matching.
 
-  qr!/user/show/(\d+)! -> $c->render(text => $users{$1});
+  qr!/user/admin/(\d+)! -> $c->render(text => $users{$1});
 
 This is where routes come into play, they have been designed from the ground 
up to represent paths with placeholders.
 
-  /user/show/:id -> $c->render(text => $users{$id});
+  /user/admin/:id -> $c->render(text => $users{$id});
 
 The only difference between a static path and the route above is the C<:id> 
placeholder. One or more placeholders can
 be anywhere in the route.
 
-  /user/:action/:id
+  /user/:role/:id
 
 A fundamental concept of the L<Mojolicious> router is that extracted 
placeholder values are turned into a hash.
 
-  /user/show/23 -> /user/:action/:id -> {action => 'show', id => 23}
+  /user/admin/23 -> /user/:role/:id -> {role => 'admin', id => 23}
 
 This hash is basically the center of every L<Mojolicious> application, you 
will learn more about this later on.
 Internally, routes get compiled to regular expressions, so you can get the 
best of both worlds with a little bit of
 experience.
 
-  /user/show/:id -> qr/(?-xism:^\/user\/show\/([^\/.]+))/
+  /user/admin/:id -> qr/(?-xism:^\/user\/admin\/([^\/.]+))/
 
 A trailing slash in the path is always optional.
 
-  /user/show/23/ -> /user/:action/:id -> {action => 'show', id => 23}
+  /user/admin/23/ -> /user/:role/:id -> {role => 'admin', id => 23}
 
 =head2 Reversibility
 
@@ -585,11 +585,11 @@
 
 A C<format> value can also be passed to L<Mojolicious::Controller/"url_for">.
 
-  # /foo/bar.txt -> {controller => 'foo', action => 'bar', format => 'txt'}
-  $r->get('/foo/:action')->to('foo#')->name('baz');
+  # /foo/23.txt -> {controller => 'foo', action => 'bar', id => 23, format => 
'txt'}
+  $r->get('/foo/:id')->to('foo#bar')->name('baz');
 
-  # Generate URL "/foo/bar.txt" for route "baz"
-  my $url = $c->url_for('baz', action => 'bar', format => 'txt');
+  # Generate URL "/foo/24.txt" for route "baz"
+  my $url = $c->url_for('baz', id => 24, format => 'txt');
 
 Or you can just disable format detection with a special type of restrictive 
placeholder, which gets inherited by nested
 routes, and then re-enable it on demand.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Mojolicious-8.72/lib/Mojolicious/Plugin/HeaderCondition.pm 
new/Mojolicious-8.73/lib/Mojolicious/Plugin/HeaderCondition.pm
--- old/Mojolicious-8.72/lib/Mojolicious/Plugin/HeaderCondition.pm      
2021-01-21 01:50:20.000000000 +0100
+++ new/Mojolicious-8.73/lib/Mojolicious/Plugin/HeaderCondition.pm      
2021-02-05 19:43:24.000000000 +0100
@@ -39,15 +39,14 @@
 
   # Mojolicious
   $app->plugin('HeaderCondition');
-  $app->routes->get('/:controller/:action')
-    ->requires(headers => {Referer => qr/example\.com/});
+  $app->routes->get('/foo')->requires(headers => {Referer => 
qr/example\.com/});
 
   # Mojolicious::Lite
   plugin 'HeaderCondition';
   get '/' => (headers => {Referer => qr/example\.com/}) => sub {...};
 
   # All headers need to match
-  $app->routes->get('/:controller/:action')->requires(headers => {
+  $app->routes->get('/foo')->requires(headers => {
     'X-Secret-Header' => 'Foo',
     Referer => qr/example\.com/
   });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojolicious/Routes/Match.pm 
new/Mojolicious-8.73/lib/Mojolicious/Routes/Match.pm
--- old/Mojolicious-8.72/lib/Mojolicious/Routes/Match.pm        2021-01-21 
01:50:26.000000000 +0100
+++ new/Mojolicious-8.73/lib/Mojolicious/Routes/Match.pm        2021-02-05 
19:43:24.000000000 +0100
@@ -101,19 +101,18 @@
 
   # Routes
   my $r = Mojolicious::Routes->new;
-  $r->get('/:controller/:action');
-  $r->put('/:controller/:action');
+  $r->get('/user/:id');
+  $r->put('/user/:id');
 
   # Match
   my $c = Mojolicious::Controller->new;
   my $match = Mojolicious::Routes::Match->new(root => $r);
-  $match->find($c => {method => 'PUT', path => '/foo/bar'});
-  say $match->stack->[0]{controller};
-  say $match->stack->[0]{action};
+  $match->find($c => {method => 'PUT', path => '/user/23'});
+  say $match->stack->[0]{id};
 
   # Render
   say $match->path_for->{path};
-  say $match->path_for(action => 'baz')->{path};
+  say $match->path_for(id => 24)->{path};
 
 =head1 DESCRIPTION
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojolicious/Routes/Pattern.pm 
new/Mojolicious-8.73/lib/Mojolicious/Routes/Pattern.pm
--- old/Mojolicious-8.72/lib/Mojolicious/Routes/Pattern.pm      2021-01-21 
01:50:26.000000000 +0100
+++ new/Mojolicious-8.73/lib/Mojolicious/Routes/Pattern.pm      2021-02-06 
17:06:54.000000000 +0100
@@ -338,25 +338,24 @@
 =head2 new
 
   my $pattern = Mojolicious::Routes::Pattern->new;
-  my $pattern = Mojolicious::Routes::Pattern->new('/:action');
-  my $pattern
-    = Mojolicious::Routes::Pattern->new('/:action', action => qr/\w+/);
+  my $pattern = Mojolicious::Routes::Pattern->new('/users/:id');
+  my $pattern = Mojolicious::Routes::Pattern->new('/user/:id', id => qr/\d+/);
   my $pattern = Mojolicious::Routes::Pattern->new(format => 0);
 
 Construct a new L<Mojolicious::Routes::Pattern> object and L</"parse"> pattern 
if necessary.
 
 =head2 parse
 
-  $pattern = $pattern->parse('/:action');
-  $pattern = $pattern->parse('/:action', action => qr/\w+/);
+  $pattern = $pattern->parse('/user/:id');
+  $pattern = $pattern->parse('/user/:id', id=> qr/\d+/);
   $pattern = $pattern->parse(format => 0);
 
 Parse pattern.
 
 =head2 render
 
-  my $path = $pattern->render({action => 'foo'});
-  my $path = $pattern->render({action => 'foo'}, 1);
+  my $path = $pattern->render({id => 24});
+  my $path = $pattern->render({id => 24}, 1);
 
 Render pattern into a path with parameters, format rendering is disabled by 
default.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojolicious/Routes/Route.pm 
new/Mojolicious-8.73/lib/Mojolicious/Routes/Route.pm
--- old/Mojolicious-8.72/lib/Mojolicious/Routes/Route.pm        2021-01-27 
16:01:40.000000000 +0100
+++ new/Mojolicious-8.73/lib/Mojolicious/Routes/Route.pm        2021-02-06 
17:06:54.000000000 +0100
@@ -467,8 +467,8 @@
 
 =head2 parse
 
-  $r = $r->parse('/:action');
-  $r = $r->parse('/:action', action => qr/\w+/);
+  $r = $r->parse('/user/:id');
+  $r = $r->parse('/user/:id', id => qr/\d+/);
   $r = $r->parse(format => 0);
 
 Parse pattern.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/lib/Mojolicious.pm 
new/Mojolicious-8.73/lib/Mojolicious.pm
--- old/Mojolicious-8.72/lib/Mojolicious.pm     2021-01-27 16:01:40.000000000 
+0100
+++ new/Mojolicious-8.73/lib/Mojolicious.pm     2021-02-06 17:06:54.000000000 
+0100
@@ -64,7 +64,7 @@
 has validator => sub { Mojolicious::Validator->new };
 
 our $CODENAME = 'Supervillain';
-our $VERSION  = '8.72';
+our $VERSION  = '8.73';
 
 sub BUILD_DYNAMIC {
   my ($class, $method, $dyn_methods) = @_;
@@ -256,8 +256,7 @@
 
 =head2 before_command
 
-Emitted right before the application runs a command through the command line 
interface. Note that this hook is
-B<EXPERIMENTAL> and might change without warning!
+Emitted right before the application runs a command through the command line 
interface.
 
   $app->hook(before_command => sub ($command, $args) {...});
 
@@ -457,8 +456,7 @@
   my $namespaces = $app->preload_namespaces;
   $app           = $app->preload_namespaces(['MyApp:Controller']);
 
-Namespaces to preload classes from during application startup. Note that this 
attribute is B<EXPERIMENTAL> and might
-change without warning!
+Namespaces to preload classes from during application startup.
 
 =head2 renderer
 
@@ -737,8 +735,7 @@
 
   $app->warmup;
 
-Preload classes from L</"preload_namespaces"> for future use. Note that this 
method is B<EXPERIMENTAL> and might change
-without warning!
+Preload classes from L</"preload_namespaces"> for future use.
 
 =head1 HELPERS
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/script/morbo 
new/Mojolicious-8.73/script/morbo
--- old/Mojolicious-8.72/script/morbo   2020-06-14 18:18:32.000000000 +0200
+++ new/Mojolicious-8.73/script/morbo   2021-02-05 18:20:25.000000000 +0100
@@ -9,11 +9,11 @@
   'h|help'      => \my $help,
   'l|listen=s'  => \my @listen,
   'm|mode=s'    => \$ENV{MOJO_MODE},
-  'v|verbose'   => \$ENV{MORBO_VERBOSE},
+  'v|verbose'   => \my $verbose,
   'w|watch=s'   => \my @watch;
 
 die extract_usage if $help || !(my $app = shift);
-my $morbo = Mojo::Server::Morbo->new;
+my $morbo = Mojo::Server::Morbo->new(silent => !$verbose);
 $morbo->daemon->listen(\@listen) if @listen;
 $morbo->backend->watch(\@watch)  if @watch;
 $morbo->run($app);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/t/mojo/daemon_ipv6_tls.t 
new/Mojolicious-8.73/t/mojo/daemon_ipv6_tls.t
--- old/Mojolicious-8.72/t/mojo/daemon_ipv6_tls.t       2021-01-27 
16:04:29.000000000 +0100
+++ new/Mojolicious-8.73/t/mojo/daemon_ipv6_tls.t       2021-02-03 
13:45:57.000000000 +0100
@@ -59,7 +59,7 @@
   is $tx->res->body, 'works!', 'right content';
   ok !$tx->error, 'no error';
   $tx = $ua->get("https://has.no.cert/";);
-  like $tx->error->{message}, qr/hostname verification failed/, 'right error';
+  like $tx->error->{message}, qr/name/, 'right error';
 };
 
 done_testing();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/t/mojo/exception.t 
new/Mojolicious-8.73/t/mojo/exception.t
--- old/Mojolicious-8.72/t/mojo/exception.t     2021-01-27 16:04:37.000000000 
+0100
+++ new/Mojolicious-8.73/t/mojo/exception.t     2021-02-05 18:20:25.000000000 
+0100
@@ -165,112 +165,100 @@
 subtest 'Check (string exception)' => sub {
   my $result;
   eval { die "test1\n" };
-  ok check(default => sub { $result = $_ }), 'exception handled';
+  ok check($@ => [default => sub { $result = $_ }]), 'exception handled';
   is $result, "test1\n", 'exception arrived in handler';
   $result = undef;
   eval { die "test2\n" };
-  ok check(default => sub { $result = shift }), 'exception handled';
+  ok check($@ => [default => sub { $result = shift }]), 'exception handled';
   is $result, "test2\n", 'exception arrived in handler';
   $result = undef;
   eval { die "test3\n" };
-  check
+  check $@ => [
     default    => sub { $result = 'fail' },
     qr/^test2/ => sub { $result = 'fail' },
     qr/^test3/ => sub { $result = 'test10' },
-    qr/^test4/ => sub { $result = 'fail' };
+    qr/^test4/ => sub { $result = 'fail' }
+  ];
   is $result, 'test10', 'regular expression matched';
   $result = undef;
-  check "test4\n",
+  check "test4\n" => [
     qr/^test3/ => sub { $result = 'fail' },
     qr/^test4/ => sub { $result = 'test11' },
-    qr/^test5/ => sub { $result = 'fail' };
+    qr/^test5/ => sub { $result = 'fail' }
+  ];
   is $result, 'test11', 'regular expression matched';
 };
 
 subtest 'Check (exception objects)' => sub {
   my $result;
   eval { MojoTest::X::Foo->throw('fail') };
-  check
+  check $@ => [
     default            => sub { $result = 'fail' },
     'MojoTest::X::Foo' => sub { $result = 'test12' },
-    'MojoTest::X::Bar' => sub { $result = 'fail' };
+    'MojoTest::X::Bar' => sub { $result = 'fail' }
+  ];
   is $result, 'test12', 'class matched';
   $result = undef;
   eval { MojoTest::X::Bar->throw('fail') };
-  check
-    'MojoTest::X::Foo' => sub { $result = 'fail' },
-    'MojoTest::X::Bar' => sub { $result = 'test13' };
+  check $@ => ['MojoTest::X::Foo' => sub { $result = 'fail' }, 
'MojoTest::X::Bar' => sub { $result = 'test13' }];
   is $result, 'test13', 'class matched';
   $result = undef;
   check(
-    MojoTest::X::Yada->new('fail'),
-    qr/^MojoTest/      => sub { $result = 'fail' },
-    'MojoTest::X::Foo' => sub { $result = 'fail' },
-    'MojoTest::X::Bar' => sub { $result = 'test14' }
+    MojoTest::X::Yada->new('fail') => [
+      qr/^MojoTest/      => sub { $result = 'fail' },
+      'MojoTest::X::Foo' => sub { $result = 'fail' },
+      'MojoTest::X::Bar' => sub { $result = 'test14' }
+    ]
   );
   is $result, 'test14', 'class matched';
   $result = undef;
-  check(
-    MojoTest::X::Yada->new('whatever'),
-    'MojoTest::X::Foo' => sub { $result = 'fail' },
-    qr/^whatever/      => sub { $result = 'test23' },
-  );
+  check(MojoTest::X::Yada->new('whatever') =>
+      ['MojoTest::X::Foo' => sub { $result = 'fail' }, qr/^whatever/ => sub { 
$result = 'test23' }]);
   is $result, 'test23', 'regex matched';
 };
 
 subtest 'Check (multiple)' => sub {
   my $result = undef;
-  check(
-    MojoTest::X::Yada->new('whatever'), ['MojoTest::X::Foo', 
'MojoTest::X::Bar'] => sub { $result = 'test15' },
-    default => sub { $result = 'fail' }
-  );
+  check(MojoTest::X::Yada->new('whatever') =>
+      [['MojoTest::X::Foo', 'MojoTest::X::Bar'] => sub { $result = 'test15' }, 
default => sub { $result = 'fail' }]);
   is $result, 'test15', 'class matched';
   $result = undef;
   check(
-    MojoTest::X::Bar->new('whatever'), ['MojoTest::X::Foo', 
'MojoTest::X::Yada'] => sub { $result = 'fail' },
-    ['MojoTest::X::Bar'] => sub { $result = 'test16' }
+    MojoTest::X::Bar->new('whatever') => [
+      ['MojoTest::X::Foo', 'MojoTest::X::Yada'] => sub { $result = 'fail' },
+      ['MojoTest::X::Bar']                      => sub { $result = 'test16' }
+    ]
   );
   is $result, 'test16', 'class matched';
 };
 
 subtest 'Check (rethrow)' => sub {
   eval {
-    check "test5\n", qr/test4/ => sub { die 'fail' };
+    check "test5\n" => [qr/test4/ => sub { die 'fail' }];
   };
   is $@, "test5\n", 'exception has been rethrown';
 };
 
-subtest 'Check (finally)' => sub {
-  my $finally;
-  eval {
-    check "test7\n", finally => sub { $finally = 'finally7' };
-  };
-  is $@,       "test7\n",  'exception has been rethrown';
-  is $finally, 'finally7', 'finally handler used';
-  my $result = [];
-  check "test8\n",
-    qr/test7/ => sub { push @$result, 'fail' },
-    default   => sub { push @$result, $_ },
-    finally   => sub { push @$result, 'finally8' };
-  is_deeply $result, ["test8\n", 'finally8'], 'default and finally handlers 
used';
-  $finally = undef;
-  eval {
-    check "fail\n",
-      default => sub { die "test17\n" },
-      finally => sub { $finally = 'finally17' };
-  };
-  is $@,       "test17\n",  'right exception';
-  is $finally, 'finally17', 'finally handler used';
-};
-
 subtest 'Check (nothing)' => sub {
-  ok !check(undef, default => sub { die 'fail' }), 'no exception';
+  ok !check(undef() => [default => sub { die 'fail' }]), 'no exception';
   {
     local $@;
-    ok !check(default => sub { die 'fail' }), 'no exception';
+    ok !check($@ => [default => sub { die 'fail' }]), 'no exception';
   }
 };
 
+subtest 'Check (bad spec)' => sub {
+  eval {
+    check test => {
+      default => sub { }
+    };
+  };
+  like $@, qr/Array reference of pattern\/handler pairs required to dispatch 
exceptions/, 'right error';
+
+  eval { check test => ['default']; };
+  like $@, qr/Array reference of pattern\/handler pairs required to dispatch 
exceptions/, 'right error';
+};
+
 subtest 'Raise' => sub {
   eval { raise 'MyApp::X::Baz', 'test19' };
   my $err = $@;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/t/mojo/lib/Mojo/BaseTest/Base2.pm 
new/Mojolicious-8.73/t/mojo/lib/Mojo/BaseTest/Base2.pm
--- old/Mojolicious-8.72/t/mojo/lib/Mojo/BaseTest/Base2.pm      2020-05-21 
23:27:22.000000000 +0200
+++ new/Mojolicious-8.73/t/mojo/lib/Mojo/BaseTest/Base2.pm      2021-01-29 
19:19:14.000000000 +0100
@@ -2,6 +2,6 @@
 use Mojo::Base 'Mojo::BaseTest::Base1';
 
 has [qw(bar baz)] => sub {2};
-has yada => 0;
+has yada          => 0;
 
 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/t/mojo/template.t 
new/Mojolicious-8.73/t/mojo/template.t
--- old/Mojolicious-8.72/t/mojo/template.t      2021-01-27 16:04:40.000000000 
+0100
+++ new/Mojolicious-8.73/t/mojo/template.t      2021-01-29 19:19:14.000000000 
+0100
@@ -578,13 +578,13 @@
 subtest 'End and begin in the same perl line' => sub {
   my $concat = 'no warnings "redefine"; sub concat { $_[0]->() . $_[1]->() }';
   my $mt     = Mojo::Template->new(prepend => $concat);
-  my $output = $mt->render(<<'  EOF');
+  my $output = $mt->render(<<'EOF');
   %= concat begin
     1
   % end, begin
     2
   % end
-  EOF
+EOF
   is $output, "  \n    1\n    2\n", 'end, begin';
 };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/t/mojo/tls.t 
new/Mojolicious-8.73/t/mojo/tls.t
--- old/Mojolicious-8.72/t/mojo/tls.t   2021-01-27 16:04:21.000000000 +0100
+++ new/Mojolicious-8.73/t/mojo/tls.t   2021-01-29 19:19:14.000000000 +0100
@@ -12,51 +12,54 @@
 use Mojo::Promise;
 use Socket;
 
-# Built-in certificate
-socketpair(my $client_sock, my $server_sock, AF_UNIX, SOCK_STREAM, PF_UNSPEC) 
or die "Couldn't create socket pair: $!";
-$client_sock->blocking(0);
-$server_sock->blocking(0);
-my $promise  = Mojo::Promise->new;
-my $promise2 = Mojo::Promise->new;
-my $server   = Mojo::IOLoop::TLS->new($server_sock);
-$server->once(upgrade => sub { $promise->resolve(pop) });
-$server->once(error   => sub { warn pop });
-$server->negotiate({server => 1});
-my $client = Mojo::IOLoop::TLS->new($client_sock);
-$client->once(upgrade => sub { $promise2->resolve(pop) });
-$client->once(error   => sub { warn pop });
-$client->negotiate(tls_options => {SSL_verify_mode => 0x00});
-my ($client_result, $server_result);
-Mojo::Promise->all($promise, $promise2)->then(sub {
-  ($server_result, $client_result) = map { $_->[0] } @_;
-})->wait;
-is ref $client_result, 'IO::Socket::SSL', 'right class';
-is ref $server_result, 'IO::Socket::SSL', 'right class';
+subtest 'Built-in certificate' => sub {
+  socketpair(my $client_sock, my $server_sock, AF_UNIX, SOCK_STREAM, PF_UNSPEC)
+    or die "Couldn't create socket pair: $!";
+  $client_sock->blocking(0);
+  $server_sock->blocking(0);
+  my $promise  = Mojo::Promise->new;
+  my $promise2 = Mojo::Promise->new;
+  my $server   = Mojo::IOLoop::TLS->new($server_sock);
+  $server->once(upgrade => sub { $promise->resolve(pop) });
+  $server->once(error   => sub { warn pop });
+  $server->negotiate({server => 1});
+  my $client = Mojo::IOLoop::TLS->new($client_sock);
+  $client->once(upgrade => sub { $promise2->resolve(pop) });
+  $client->once(error   => sub { warn pop });
+  $client->negotiate(tls_options => {SSL_verify_mode => 0x00});
+  my ($client_result, $server_result);
+  Mojo::Promise->all($promise, $promise2)->then(sub {
+    ($server_result, $client_result) = map { $_->[0] } @_;
+  })->wait;
+  is ref $client_result, 'IO::Socket::SSL', 'right class';
+  is ref $server_result, 'IO::Socket::SSL', 'right class';
+};
 
-# Built-in certificate (custom event loop and cipher)
-my $loop = Mojo::IOLoop->new;
-socketpair(my $client_sock2, my $server_sock2, AF_UNIX, SOCK_STREAM, PF_UNSPEC)
-  or die "Couldn't create socket pair: $!";
-$client_sock2->blocking(0);
-$server_sock2->blocking(0);
-$promise  = Mojo::Promise->new->ioloop($loop);
-$promise2 = Mojo::Promise->new->ioloop($loop);
-$server   = Mojo::IOLoop::TLS->new($server_sock2)->reactor($loop->reactor);
-$server->once(upgrade => sub { $promise->resolve(pop) });
-$server->once(error   => sub { warn pop });
-$server->negotiate(server => 1, tls_options => {SSL_cipher_list => 
'AES256-SHA:ALL'});
-$client = Mojo::IOLoop::TLS->new($client_sock2)->reactor($loop->reactor);
-$client->once(upgrade => sub { $promise2->resolve(pop) });
-$client->once(error   => sub { warn pop });
-$client->negotiate(tls_options => {SSL_verify_mode => 0x00});
-$client_result = $server_result = undef;
-Mojo::Promise->all($promise, $promise2)->then(sub {
-  ($server_result, $client_result) = map { $_->[0] } @_;
-})->wait;
-is ref $client_result, 'IO::Socket::SSL', 'right class';
-is ref $server_result, 'IO::Socket::SSL', 'right class';
-my $expect = $server_result->get_sslversion eq 'TLSv1_3' ? 
'TLS_AES_256_GCM_SHA384' : 'AES256-SHA';
-is $client_result->get_cipher, $expect, "$expect has been negotiatied";
-is $server_result->get_cipher, $expect, "$expect has been negotiatied";
+subtest 'Built-in certificate (custom event loop and cipher)' => sub {
+  my $loop = Mojo::IOLoop->new;
+  socketpair(my $client_sock2, my $server_sock2, AF_UNIX, SOCK_STREAM, 
PF_UNSPEC)
+    or die "Couldn't create socket pair: $!";
+  $client_sock2->blocking(0);
+  $server_sock2->blocking(0);
+  my $promise  = Mojo::Promise->new->ioloop($loop);
+  my $promise2 = Mojo::Promise->new->ioloop($loop);
+  my $server   = 
Mojo::IOLoop::TLS->new($server_sock2)->reactor($loop->reactor);
+  $server->once(upgrade => sub { $promise->resolve(pop) });
+  $server->once(error   => sub { warn pop });
+  $server->negotiate(server => 1, tls_options => {SSL_cipher_list => 
'AES256-SHA:ALL'});
+  my $client = Mojo::IOLoop::TLS->new($client_sock2)->reactor($loop->reactor);
+  $client->once(upgrade => sub { $promise2->resolve(pop) });
+  $client->once(error   => sub { warn pop });
+  $client->negotiate(tls_options => {SSL_verify_mode => 0x00});
+  my ($client_result, $server_result);
+  Mojo::Promise->all($promise, $promise2)->then(sub {
+    ($server_result, $client_result) = map { $_->[0] } @_;
+  })->wait;
+  is ref $client_result, 'IO::Socket::SSL', 'right class';
+  is ref $server_result, 'IO::Socket::SSL', 'right class';
+  my $expect = $server_result->get_sslversion eq 'TLSv1_3' ? 
'TLS_AES_256_GCM_SHA384' : 'AES256-SHA';
+  is $client_result->get_cipher, $expect, "$expect has been negotiatied";
+  is $server_result->get_cipher, $expect, "$expect has been negotiatied";
+};
 
 done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/t/mojolicious/embedded_app.t 
new/Mojolicious-8.73/t/mojolicious/embedded_app.t
--- old/Mojolicious-8.72/t/mojolicious/embedded_app.t   2021-01-27 
16:04:50.000000000 +0100
+++ new/Mojolicious-8.73/t/mojolicious/embedded_app.t   2021-02-03 
13:45:57.000000000 +0100
@@ -36,57 +36,74 @@
 
 my $t = Test::Mojo->new;
 
-# Normal request
-$t->get_ok('/hello')->status_is(200)->content_is("Hello from the main app!\n");
-
-# Session
-$t->get_ok('/primary')->status_is(200)->content_is(1);
-$t->get_ok('/primary')->status_is(200)->content_is(2);
-
-# Session in external app
-$t->get_ok('/x/1/secondary')->status_is(200)->content_is(11);
-
-# Session again
-$t->get_ok('/primary')->status_is(200)->content_is(3);
-
-# Session in external app again
-$t->get_ok('/x/1/secondary')->status_is(200)->content_is(22);
-
-# External app
-$t->get_ok('/x/1')->status_is(200)->content_is('too%21');
-
-# Static file from external app
-$t->get_ok('/x/1/index.html')->status_is(200)->content_is("External static 
file!\n");
-
-# External app with different prefix
-$t->get_ok('/x/1/test')->status_is(200)->content_is('works%21');
-
-# External app with Unicode prefix
-$t->get_ok('/x/???')->status_is(200)->content_is('too%21');
-
-# Static file from external app with Unicode prefix
-$t->get_ok('/x/???/index.html')->status_is(200)->content_is("External static 
file!\n");
-
-# External app with Unicode prefix again
-$t->get_ok('/x/???/test')->status_is(200)->content_is('works%21');
-
-# External app with domain
-$t->get_ok('/' => {Host => 
'mojolicious.org'})->status_is(200)->content_is('too%21');
-
-# Static file from external app with domain
-$t->get_ok('/index.html' => {Host => 
'mojolicious.org'})->status_is(200)->content_is("External static file!\n");
-
-# External app with domain again
-$t->get_ok('/test' => {Host => 
'mojolicious.org'})->status_is(200)->content_is('works%21');
-
-# External app with a bit of everything
-$t->get_ok('/???/123/' => {Host => 
'test.foo-bar.de'})->status_is(200)->content_is('too%21');
-
-# Static file from external app with a bit of everything
-$t->get_ok('/???/123/index.html' => {Host => 
'test.foo-bar.de'})->status_is(200)->content_is("External static file!\n");
-
-# External app with a bit of everything again
-$t->get_ok('/???/123/test' => {Host => 
'test.foo-bar.de'})->status_is(200)->content_is('works%21');
+subtest 'Normal request' => sub {
+  $t->get_ok('/hello')->status_is(200)->content_is("Hello from the main 
app!\n");
+};
+
+subtest 'Session' => sub {
+  $t->get_ok('/primary')->status_is(200)->content_is(1);
+  $t->get_ok('/primary')->status_is(200)->content_is(2);
+};
+
+subtest 'Session in external app' => sub {
+  $t->get_ok('/x/1/secondary')->status_is(200)->content_is(11);
+};
+
+subtest 'Session again' => sub {
+  $t->get_ok('/primary')->status_is(200)->content_is(3);
+};
+
+subtest 'Session in external app again' => sub {
+  $t->get_ok('/x/1/secondary')->status_is(200)->content_is(22);
+};
+
+subtest 'External app' => sub {
+  $t->get_ok('/x/1')->status_is(200)->content_is('too%21');
+};
+
+subtest 'Static file from external app' => sub {
+  $t->get_ok('/x/1/index.html')->status_is(200)->content_is("External static 
file!\n");
+};
+
+subtest 'External app with different prefix' => sub {
+  $t->get_ok('/x/1/test')->status_is(200)->content_is('works%21');
+};
+
+subtest 'External app with Unicode prefix' => sub {
+  $t->get_ok('/x/???')->status_is(200)->content_is('too%21');
+};
+
+subtest 'Static file from external app with Unicode prefix' => sub {
+  $t->get_ok('/x/???/index.html')->status_is(200)->content_is("External static 
file!\n");
+};
+
+subtest 'External app with Unicode prefix again' => sub {
+  $t->get_ok('/x/???/test')->status_is(200)->content_is('works%21');
+};
+
+subtest 'External app with domain' => sub {
+  $t->get_ok('/' => {Host => 
'mojolicious.org'})->status_is(200)->content_is('too%21');
+};
+
+subtest 'Static file from external app with domain' => sub {
+  $t->get_ok('/index.html' => {Host => 
'mojolicious.org'})->status_is(200)->content_is("External static file!\n");
+};
+
+subtest 'External app with domain again' => sub {
+  $t->get_ok('/test' => {Host => 
'mojolicious.org'})->status_is(200)->content_is('works%21');
+};
+
+subtest 'External app with a bit of everything' => sub {
+  $t->get_ok('/???/123/' => {Host => 
'test.foo-bar.de'})->status_is(200)->content_is('too%21');
+};
+
+subtest 'Static file from external app with a bit of everything' => sub {
+  $t->get_ok('/???/123/index.html' => {Host => 
'test.foo-bar.de'})->status_is(200)->content_is("External static file!\n");
+};
+
+subtest 'External app with a bit of everything again' => sub {
+  $t->get_ok('/???/123/test' => {Host => 
'test.foo-bar.de'})->status_is(200)->content_is('works%21');
+};
 
 done_testing();
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.72/t/mojolicious/external_app.t 
new/Mojolicious-8.73/t/mojolicious/external_app.t
--- old/Mojolicious-8.72/t/mojolicious/external_app.t   2021-01-27 
16:04:47.000000000 +0100
+++ new/Mojolicious-8.73/t/mojolicious/external_app.t   2021-02-03 
13:45:57.000000000 +0100
@@ -14,28 +14,35 @@
 
 my $t = Test::Mojo->new('MyApp');
 
-# Text from config file
-$t->get_ok('/')->status_is(200)->content_is('too%21');
-
-# Static file
-$t->get_ok('/index.html')->status_is(200)->content_is("External static 
file!\n");
-
-# More text from config file
-$t->get_ok('/test')->status_is(200)->content_is('works%21');
+subtest 'Text from config file' => sub {
+  $t->get_ok('/')->status_is(200)->content_is('too%21');
+};
+
+subtest 'Static file' => sub {
+  $t->get_ok('/index.html')->status_is(200)->content_is("External static 
file!\n");
+};
+
+subtest 'More text from config file' => sub {
+  $t->get_ok('/test')->status_is(200)->content_is('works%21');
+};
 
 # Config override
 $t = Test::Mojo->new(MyApp => {whatever => 'override!', works => 'override 
two!'});
 
-# Text from config override
-$t->get_ok('/')->status_is(200)->content_is('override two!');
-
-# Static file again
-$t->get_ok('/index.html')->status_is(200)->content_is("External static 
file!\n");
-
-# More text from config override
-$t->get_ok('/test')->status_is(200)->content_is('override!');
-
-# Config stash value from template
-$t->get_ok('/inline')->status_is(200)->content_is('override!');
+subtest 'Text from config override' => sub {
+  $t->get_ok('/')->status_is(200)->content_is('override two!');
+};
+
+subtest 'Static file again' => sub {
+  $t->get_ok('/index.html')->status_is(200)->content_is("External static 
file!\n");
+};
+
+subtest 'More text from config override' => sub {
+  $t->get_ok('/test')->status_is(200)->content_is('override!');
+};
+
+subtest 'Config stash value from template' => sub {
+  $t->get_ok('/inline')->status_is(200)->content_is('override!');
+};
 
 done_testing();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Mojolicious-8.72/t/mojolicious/upload_stream_lite_app.t 
new/Mojolicious-8.73/t/mojolicious/upload_stream_lite_app.t
--- old/Mojolicious-8.72/t/mojolicious/upload_stream_lite_app.t 2021-01-27 
16:04:43.000000000 +0100
+++ new/Mojolicious-8.73/t/mojolicious/upload_stream_lite_app.t 2021-02-03 
13:45:57.000000000 +0100
@@ -50,20 +50,25 @@
 
 my $t = Test::Mojo->new;
 
-# Small upload
-$t->post_ok('/upload?id=23' => form => {my_file => {content => 
'whatever'}})->status_is(200)->content_is('whatever');
-
-# Small download
-$t->get_ok('/download?id=23')->status_is(200)->content_is('whatever');
-
-# Big upload
-$t->post_ok('/upload?id=24' => form => {my_file => {content => '1234' x 
131072}})->status_is(200)
-  ->content_is('1234' x 131072);
-
-# Big download
-$t->get_ok('/download?id=24')->status_is(200)->content_is('1234' x 131072);
-
-# Small download again
-$t->get_ok('/download?id=23')->status_is(200)->content_is('whatever');
+subtest 'Small upload' => sub {
+  $t->post_ok('/upload?id=23' => form => {my_file => {content => 
'whatever'}})->status_is(200)->content_is('whatever');
+};
+
+subtest 'Small download' => sub {
+  $t->get_ok('/download?id=23')->status_is(200)->content_is('whatever');
+};
+
+subtest 'Big upload' => sub {
+  $t->post_ok('/upload?id=24' => form => {my_file => {content => '1234' x 
131072}})->status_is(200)
+    ->content_is('1234' x 131072);
+};
+
+subtest 'Big download' => sub {
+  $t->get_ok('/download?id=24')->status_is(200)->content_is('1234' x 131072);
+};
+
+subtest 'Small download again' => sub {
+  $t->get_ok('/download?id=23')->status_is(200)->content_is('whatever');
+};
 
 done_testing();

Reply via email to