Hello community,

here is the log from the commit of package perl-Mojolicious for 
openSUSE:Factory checked in at 2020-12-01 14:23:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Mojolicious (Old)
 and      /work/SRC/openSUSE:Factory/.perl-Mojolicious.new.5913 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "perl-Mojolicious"

Tue Dec  1 14:23:43 2020 rev:148 rq:852070 version:8.66

Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-Mojolicious/perl-Mojolicious.changes        
2020-11-12 22:49:56.250802304 +0100
+++ 
/work/SRC/openSUSE:Factory/.perl-Mojolicious.new.5913/perl-Mojolicious.changes  
    2020-12-01 14:24:02.829675139 +0100
@@ -1,0 +2,21 @@
+Tue Dec  1 03:12:40 UTC 2020 - Tina Müller <[email protected]>
+
+- updated to 8.66
+   see /usr/share/doc/packages/perl-Mojolicious/Changes
+
+  8.66  2020-11-28
+    - Deprecated logging to "log/$mode.log" (if a log directory exists) in 
Mojolicious. The default will simply be STDERR
+      in the future.
+    - Added support for preloading controllers and other classes during 
startup of Mojolicious applications.
+    - Added EXPERIMENTAL preload_namespaces attribute to Mojolicious.
+    - Added EXPERIMENTAL warmup method to Mojolicious.
+    - Added EXPERIMENTAL load_classes function to Mojo::Loader.
+    - Removed experimental status from humanize_bytes method in 
Mojo::ByteStream.
+    - Removed experimental status from humanize_bytes function in Mojo::Util.
+    - Improved find_modules function in Mojo::Loader with recursive option.
+    - Improved Mojo::DOM::CSS to throw exceptions for unknown CSS selectors.
+    - Fixed a bug in Mojolicious::Commands where help messages would not be 
displayed correctly for some commands.
+      (kiwiroy)
+    - Fixed a bug in Mojolicious::Routes::Pattern where type_start was treated 
as a regex. (Grinnz)
+
+-------------------------------------------------------------------

Old:
----
  Mojolicious-8.65.tar.gz

New:
----
  Mojolicious-8.66.tar.gz

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

Other differences:
------------------
++++++ perl-Mojolicious.spec ++++++
--- /var/tmp/diff_new_pack.JtpyaX/_old  2020-12-01 14:24:03.237675580 +0100
+++ /var/tmp/diff_new_pack.JtpyaX/_new  2020-12-01 14:24:03.241675585 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           perl-Mojolicious
-Version:        8.65
+Version:        8.66
 Release:        0
 %define cpan_name Mojolicious
 Summary:        Real-time web framework

++++++ Mojolicious-8.65.tar.gz -> Mojolicious-8.66.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/Changes new/Mojolicious-8.66/Changes
--- old/Mojolicious-8.65/Changes        2020-11-10 20:33:34.000000000 +0100
+++ new/Mojolicious-8.66/Changes        2020-11-30 10:37:34.000000000 +0100
@@ -1,4 +1,19 @@
 
+8.66  2020-11-28
+  - Deprecated logging to "log/$mode.log" (if a log directory exists) in 
Mojolicious. The default will simply be STDERR
+    in the future.
+  - Added support for preloading controllers and other classes during startup 
of Mojolicious applications.
+  - Added EXPERIMENTAL preload_namespaces attribute to Mojolicious.
+  - Added EXPERIMENTAL warmup method to Mojolicious.
+  - Added EXPERIMENTAL load_classes function to Mojo::Loader.
+  - Removed experimental status from humanize_bytes method in Mojo::ByteStream.
+  - Removed experimental status from humanize_bytes function in Mojo::Util.
+  - Improved find_modules function in Mojo::Loader with recursive option.
+  - Improved Mojo::DOM::CSS to throw exceptions for unknown CSS selectors.
+  - Fixed a bug in Mojolicious::Commands where help messages would not be 
displayed correctly for some commands.
+    (kiwiroy)
+  - Fixed a bug in Mojolicious::Routes::Pattern where type_start was treated 
as a regex. (Grinnz)
+
 8.65  2020-11-10
   - Added generate dockerfile command. (tianon)
   - Improved cookbook with container deployment recipe.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/MANIFEST 
new/Mojolicious-8.66/MANIFEST
--- old/Mojolicious-8.65/MANIFEST       2020-11-11 20:55:18.000000000 +0100
+++ new/Mojolicious-8.66/MANIFEST       2020-11-30 11:40:54.000000000 +0100
@@ -208,6 +208,10 @@
 t/mojo/lib/Mojo/LoaderTest/A.pm
 t/mojo/lib/Mojo/LoaderTest/B.pm
 t/mojo/lib/Mojo/LoaderTest/C.pm
+t/mojo/lib/Mojo/LoaderTest/D.txt
+t/mojo/lib/Mojo/LoaderTest/E/F.pm
+t/mojo/lib/Mojo/LoaderTest/E/G.txt
+t/mojo/lib/Mojo/LoaderTestException/A.pm
 t/mojo/lib/Mojo/Server/Morbo/Backend/TestBackend.pm
 t/mojo/lib/Mojo/TestConnectProxy.pm
 t/mojo/lib/myapp.pl
@@ -286,9 +290,9 @@
 t/mojolicious/lib/MojoliciousTest/Baz.pm
 t/mojolicious/lib/MojoliciousTest/Command/_test2_command.pm
 t/mojolicious/lib/MojoliciousTest/Command/test_command.pm
+t/mojolicious/lib/MojoliciousTest/Controller/Foo/Bar.pm
 t/mojolicious/lib/MojoliciousTest/Exceptional.pm
 t/mojolicious/lib/MojoliciousTest/Foo.pm
-t/mojolicious/lib/MojoliciousTest/Foo/Bar.pm
 t/mojolicious/lib/MojoliciousTest/Plugin/Test/SomePlugin2.pm
 t/mojolicious/lib/MojoliciousTest/Plugin/UPPERCASETestPlugin.pm
 t/mojolicious/lib/MojoliciousTest/PODTest.pm
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/META.json 
new/Mojolicious-8.66/META.json
--- old/Mojolicious-8.65/META.json      2020-11-11 20:55:18.000000000 +0100
+++ new/Mojolicious-8.66/META.json      2020-11-30 11:40:54.000000000 +0100
@@ -4,7 +4,7 @@
       "Sebastian Riedel <[email protected]>"
    ],
    "dynamic_config" : 0,
-   "generated_by" : "ExtUtils::MakeMaker version 7.52, CPAN::Meta::Converter 
version 2.150010",
+   "generated_by" : "ExtUtils::MakeMaker version 7.56, CPAN::Meta::Converter 
version 2.150010",
    "license" : [
       "artistic_2"
    ],
@@ -63,6 +63,6 @@
          "web" : "https://webchat.freenode.net/#mojo";
       }
    },
-   "version" : "8.65",
+   "version" : "8.66",
    "x_serialization_backend" : "JSON::PP version 4.05"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/META.yml 
new/Mojolicious-8.66/META.yml
--- old/Mojolicious-8.65/META.yml       2020-11-11 20:55:18.000000000 +0100
+++ new/Mojolicious-8.66/META.yml       2020-11-30 11:40:54.000000000 +0100
@@ -7,7 +7,7 @@
 configure_requires:
   ExtUtils::MakeMaker: '0'
 dynamic_config: 0
-generated_by: 'ExtUtils::MakeMaker version 7.52, CPAN::Meta::Converter version 
2.150010'
+generated_by: 'ExtUtils::MakeMaker version 7.56, CPAN::Meta::Converter version 
2.150010'
 license: artistic_2
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -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.65'
+version: '8.66'
 x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/ByteStream.pm 
new/Mojolicious-8.66/lib/Mojo/ByteStream.pm
--- old/Mojolicious-8.65/lib/Mojo/ByteStream.pm 2020-10-24 13:05:06.000000000 
+0200
+++ new/Mojolicious-8.66/lib/Mojo/ByteStream.pm 2020-11-30 10:38:10.000000000 
+0100
@@ -200,8 +200,7 @@
 
   $stream = $stream->humanize_bytes;
 
-Turn number of bytes into a simplified human readable format for bytestream 
with L<Mojo::Util/"humanize_bytes">. Note
-that this method is B<EXPERIMENTAL> and might change without warning!
+Turn number of bytes into a simplified human readable format for bytestream 
with L<Mojo::Util/"humanize_bytes">.
 
 =head2 md5_bytes
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/DOM/CSS.pm 
new/Mojolicious-8.66/lib/Mojo/DOM/CSS.pm
--- old/Mojolicious-8.65/lib/Mojo/DOM/CSS.pm    2020-10-28 21:12:36.000000000 
+0100
+++ new/Mojolicious-8.66/lib/Mojo/DOM/CSS.pm    2020-11-30 10:38:17.000000000 
+0100
@@ -1,6 +1,7 @@
 package Mojo::DOM::CSS;
 use Mojo::Base -base;
 
+use Carp qw(croak);
 use Mojo::Util qw(dumper trim);
 
 use constant DEBUG => $ENV{MOJO_DOM_CSS_DEBUG} || 0;
@@ -129,7 +130,7 @@
       push @$last, ['tag', $name eq '*' ? undef : _name($name), 
_unescape($ns)];
     }
 
-    else {last}
+    else { pos $css < length $css ? croak "Unknown CSS selector: $css" : last }
   }
 
   warn qq{-- CSS Selector ($css)\n@{[dumper $group]}} if DEBUG;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/Exception.pm 
new/Mojolicious-8.66/lib/Mojo/Exception.pm
--- old/Mojolicious-8.65/lib/Mojo/Exception.pm  2020-10-24 13:05:02.000000000 
+0200
+++ new/Mojolicious-8.66/lib/Mojo/Exception.pm  2020-11-30 10:38:05.000000000 
+0100
@@ -65,7 +65,7 @@
   }
 
   # Search for context in sources
-  $self->_context($files[-1][1], [map { [split "\n"] } @sources]) if @sources;
+  $self->_context($files[-1][1], [map { [split /\n/] } @sources]) if @sources;
 
   return $self;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/Home.pm 
new/Mojolicious-8.66/lib/Mojo/Home.pm
--- old/Mojolicious-8.65/lib/Mojo/Home.pm       2020-10-24 13:05:05.000000000 
+0200
+++ new/Mojolicious-8.66/lib/Mojo/Home.pm       2020-11-30 10:38:09.000000000 
+0100
@@ -13,7 +13,7 @@
   # Location of the application class (Windows mixes backslash and slash)
   elsif ($class && (my $path = $INC{my $file = class_to_path $class})) {
     $home = Mojo::File->new($path)->to_array;
-    splice @$home, (my @dummy = split('/', $file)) * -1;
+    splice @$home, (my @dummy = split(/\//, $file)) * -1;
     @$home && $home->[-1] eq $_ && pop @$home for qw(lib blib);
   }
 
@@ -21,7 +21,7 @@
   return $self;
 }
 
-sub rel_file { shift->child(split('/', shift)) }
+sub rel_file { shift->child(split(/\//, shift)) }
 
 1;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/JSON/Pointer.pm 
new/Mojolicious-8.66/lib/Mojo/JSON/Pointer.pm
--- old/Mojolicious-8.65/lib/Mojo/JSON/Pointer.pm       2020-10-24 
13:05:11.000000000 +0200
+++ new/Mojolicious-8.66/lib/Mojo/JSON/Pointer.pm       2020-11-30 
10:38:14.000000000 +0100
@@ -13,7 +13,7 @@
 
   my $data = $self->data;
   return length $pointer ? undef : $get ? $data : 1 unless $pointer =~ s!^/!!;
-  for my $p (length $pointer ? (split '/', $pointer, -1) : ($pointer)) {
+  for my $p (length $pointer ? (split /\//, $pointer, -1) : ($pointer)) {
     $p =~ s!~1!/!g;
     $p =~ s/~0/~/g;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/JSON.pm 
new/Mojolicious-8.66/lib/Mojo/JSON.pm
--- old/Mojolicious-8.65/lib/Mojo/JSON.pm       2020-10-24 13:05:19.000000000 
+0200
+++ new/Mojolicious-8.66/lib/Mojo/JSON.pm       2020-11-30 10:38:21.000000000 
+0100
@@ -268,7 +268,7 @@
   my $context = 'Malformed JSON: ' . shift;
   if (m/\G\z/gc) { $context .= ' before end of data' }
   else {
-    my @lines = split "\n", substr($_, 0, pos);
+    my @lines = split /\n/, substr($_, 0, pos);
     $context .= ' at line ' . @lines . ', offset ' . length(pop @lines || '');
   }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/Loader.pm 
new/Mojolicious-8.66/lib/Mojo/Loader.pm
--- old/Mojolicious-8.65/lib/Mojo/Loader.pm     2020-10-24 13:05:13.000000000 
+0200
+++ new/Mojolicious-8.66/lib/Mojo/Loader.pm     2020-11-30 10:38:16.000000000 
+0100
@@ -6,7 +6,7 @@
 use Mojo::File qw(path);
 use Mojo::Util qw(b64_decode class_to_path);
 
-our @EXPORT_OK = qw(data_section file_is_binary find_modules find_packages 
load_class);
+our @EXPORT_OK = qw(data_section file_is_binary find_modules find_packages 
load_class load_classes);
 
 my (%BIN, %CACHE);
 
@@ -15,12 +15,17 @@
 sub file_is_binary { keys %{_all($_[0])} ? !!$BIN{$_[0]}{$_[1]} : undef }
 
 sub find_modules {
-  my $ns = shift;
+  my ($ns, $options) = (shift, shift // {});
+
+  my @ns  = split /::/, $ns;
+  my @inc = grep { -d $$_ } map { path($_, @ns) } @INC;
 
   my %modules;
-  for my $directory (@INC) {
-    next unless -d (my $path = path($directory, split(/::|'/, $ns)));
-    $modules{"${ns}::$_"}++ for $path->list->grep(qr/\.pm$/)->map('basename', 
'.pm')->each;
+  for my $dir (@inc) {
+    for my $file ($options->{recursive} ? $dir->list_tree->each : 
$dir->list->each) {
+      next unless $$file =~ s/\.pm$//;
+      $modules{join('::', $ns, @{$file->to_rel($$dir)})}++;
+    }
   }
 
   return sort keys %modules;
@@ -48,6 +53,18 @@
   return Mojo::Exception->new($@)->inspect;
 }
 
+sub load_classes {
+  my $ns = shift;
+
+  my @classes;
+  for my $module (find_modules($ns, {recursive => 1})) {
+    push @classes, $module unless my $e = load_class($module);
+    die $e if ref $e;
+  }
+
+  return @classes;
+}
+
 sub _all {
   my $class = shift;
 
@@ -153,8 +170,21 @@
 =head2 find_modules
 
   my @modules = find_modules 'MyApp::Namespace';
+  my @modules = find_modules 'MyApp::Namespace', {recursive => 1};
+
+Search for modules in a namespace.
 
-Search for modules in a namespace non-recursively.
+These options are currently available:
+
+=over 2
+
+=item recursive
+
+  recursive => 1
+
+Search namespace recursively.
+
+=back
 
 =head2 load_class
 
@@ -169,6 +199,13 @@
     die ref $e ? "Exception: $e" : 'Not found!';
   }
 
+=head2 load_classes
+
+  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!
+
 =head1 SEE ALSO
 
 L<Mojolicious>, L<Mojolicious::Guides>, L<https://mojolicious.org>.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/Parameters.pm 
new/Mojolicious-8.66/lib/Mojo/Parameters.pm
--- old/Mojolicious-8.65/lib/Mojo/Parameters.pm 2020-10-24 13:05:13.000000000 
+0200
+++ new/Mojolicious-8.66/lib/Mojo/Parameters.pm 2020-11-30 10:38:16.000000000 
+0100
@@ -78,7 +78,7 @@
     return $pairs unless length $str;
 
     my $charset = $self->charset;
-    for my $pair (split '&', $str) {
+    for my $pair (split /&/, $str) {
       next unless $pair =~ /^([^=]+)(?:=(.*))?$/;
       my ($name, $value) = ($1, $2 // '');
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/Path.pm 
new/Mojolicious-8.66/lib/Mojo/Path.pm
--- old/Mojolicious-8.65/lib/Mojo/Path.pm       2020-10-24 13:05:18.000000000 
+0200
+++ new/Mojolicious-8.66/lib/Mojo/Path.pm       2020-11-30 10:38:20.000000000 
+0100
@@ -107,7 +107,7 @@
     $path                   = decode($charset, $path) // $path if $charset;
     $self->{leading_slash}  = $path =~ s!^/!!;
     $self->{trailing_slash} = $path =~ s!/$!!;
-    $self->{parts}          = [split '/', $path, -1];
+    $self->{parts}          = [split /\//, $path, -1];
   }
 
   return $self->{$name} unless @_;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/Promise.pm 
new/Mojolicious-8.66/lib/Mojo/Promise.pm
--- old/Mojolicious-8.65/lib/Mojo/Promise.pm    2020-11-09 12:44:30.000000000 
+0100
+++ new/Mojolicious-8.66/lib/Mojo/Promise.pm    2020-11-30 10:38:06.000000000 
+0100
@@ -10,6 +10,8 @@
 
 has ioloop => sub { Mojo::IOLoop->singleton }, weak => 1;
 
+sub AWAIT_CHAIN_CANCEL { }
+
 sub AWAIT_CLONE { _await('clone', @_) }
 
 sub AWAIT_DONE { shift->resolve(@_) }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/Server/Daemon.pm 
new/Mojolicious-8.66/lib/Mojo/Server/Daemon.pm
--- old/Mojolicious-8.65/lib/Mojo/Server/Daemon.pm      2020-10-24 
13:05:10.000000000 +0200
+++ new/Mojolicious-8.66/lib/Mojo/Server/Daemon.pm      2020-11-30 
10:38:13.000000000 +0100
@@ -16,7 +16,7 @@
 has inactivity_timeout => sub { $ENV{MOJO_INACTIVITY_TIMEOUT} // 30 };
 has ioloop             => sub { Mojo::IOLoop->singleton };
 has keep_alive_timeout => sub { $ENV{MOJO_KEEP_ALIVE_TIMEOUT} // 5 };
-has listen             => sub { [split ',', $ENV{MOJO_LISTEN} || 
'http://*:3000'] };
+has listen             => sub { [split /,/, $ENV{MOJO_LISTEN} || 
'http://*:3000'] };
 has max_requests       => 100;
 
 sub DESTROY {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/Template.pm 
new/Mojolicious-8.66/lib/Mojo/Template.pm
--- old/Mojolicious-8.65/lib/Mojo/Template.pm   2020-11-09 13:06:50.000000000 
+0100
+++ new/Mojolicious-8.66/lib/Mojo/Template.pm   2020-11-30 10:38:15.000000000 
+0100
@@ -59,7 +59,7 @@
   # Split lines
   my $op = 'text';
   my ($trimming, $capture);
-  for my $line (split "\n", $template) {
+  for my $line (split /\n/, $template) {
 
     # Turn Perl line into mixed line
     if ($op eq 'text' && $line =~ $line_re) {
@@ -188,7 +188,7 @@
 
     # Text (quote and fix line ending)
     if ($op eq 'text') {
-      $value = join "\n", map { quotemeta $_ } split("\n", $value, -1);
+      $value = join "\n", map { quotemeta $_ } split(/\n/, $value, -1);
       $value      .= '\n'                          if $newline;
       $blocks[-1] .= "\$_O .= \"" . $value . "\";" if length $value;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/Transaction/WebSocket.pm 
new/Mojolicious-8.66/lib/Mojo/Transaction/WebSocket.pm
--- old/Mojolicious-8.65/lib/Mojo/Transaction/WebSocket.pm      2020-10-24 
13:05:03.000000000 +0200
+++ new/Mojolicious-8.66/lib/Mojo/Transaction/WebSocket.pm      2020-11-30 
10:38:06.000000000 +0100
@@ -151,7 +151,7 @@
 sub with_protocols {
   my $self = shift;
 
-  my %protos = map { trim($_) => 1 } split ',', 
$self->req->headers->sec_websocket_protocol // '';
+  my %protos = map { trim($_) => 1 } split /,/, 
$self->req->headers->sec_websocket_protocol // '';
   return undef unless defined(my $proto = first { $protos{$_} } @_);
 
   $self->res->headers->sec_websocket_protocol($proto);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/UserAgent/Proxy.pm 
new/Mojolicious-8.66/lib/Mojo/UserAgent/Proxy.pm
--- old/Mojolicious-8.65/lib/Mojo/UserAgent/Proxy.pm    2020-10-24 
13:05:04.000000000 +0200
+++ new/Mojolicious-8.66/lib/Mojo/UserAgent/Proxy.pm    2020-11-30 
10:38:07.000000000 +0100
@@ -9,7 +9,7 @@
   my $self = shift;
   $self->http($ENV{HTTP_PROXY}   || $ENV{http_proxy});
   $self->https($ENV{HTTPS_PROXY} || $ENV{https_proxy});
-  return $self->not([split ',', $ENV{NO_PROXY} || $ENV{no_proxy} || '']);
+  return $self->not([split /,/, $ENV{NO_PROXY} || $ENV{no_proxy} || '']);
 }
 
 sub is_needed {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/UserAgent.pm 
new/Mojolicious-8.66/lib/Mojo/UserAgent.pm
--- old/Mojolicious-8.65/lib/Mojo/UserAgent.pm  2020-10-27 18:31:19.000000000 
+0100
+++ new/Mojolicious-8.66/lib/Mojo/UserAgent.pm  2020-11-30 10:38:09.000000000 
+0100
@@ -109,7 +109,7 @@
     @options{qw(socks_address socks_port)} = @options{qw(address port)};
     ($proto, @options{qw(address port)}) = $t->endpoint($tx);
     my $userinfo = $tx->req->via_proxy(0)->proxy->userinfo;
-    @options{qw(socks_user socks_pass)} = split ':', $userinfo if $userinfo;
+    @options{qw(socks_user socks_pass)} = split /:/, $userinfo if $userinfo;
   }
 
   # TLS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojo/Util.pm 
new/Mojolicious-8.66/lib/Mojo/Util.pm
--- old/Mojolicious-8.65/lib/Mojo/Util.pm       2020-11-10 16:16:09.000000000 
+0100
+++ new/Mojolicious-8.66/lib/Mojo/Util.pm       2020-11-30 10:38:10.000000000 
+0100
@@ -44,7 +44,7 @@
   open my $file, '<', $path or croak "Unable to open html entities file 
($path): $!";
   my $lines = do { local $/; <$file> };
 
-  for my $line (split "\n", $lines) {
+  for my $line (split /\n/, $lines) {
     next unless $line =~ /^(\S+)\s+U\+(\S+)(?:\s+U\+(\S+))?/;
     $ENTITIES{$1} = defined $3 ? (chr(hex $2) . chr(hex $3)) : chr(hex $2);
   }
@@ -91,8 +91,8 @@
 
   # CamelCase words
   return join '::', map {
-    join('', map { ucfirst lc } split '_')
-  } split '-', $str;
+    join('', map { ucfirst lc } split /_/)
+  } split /-/, $str;
 }
 
 sub class_to_file {
@@ -111,7 +111,7 @@
   # snake_case words
   return join '-', map {
     join('_', map {lc} grep {length} split /([A-Z]{1}[^A-Z]*)/)
-  } split '::', $str;
+  } split /::/, $str;
 }
 
 sub decode {
@@ -193,7 +193,7 @@
   my ($n, $i, $bias, @output) = (PC_INITIAL_N, 0, PC_INITIAL_BIAS);
 
   # Consume all code points before the last delimiter
-  push @output, split('', $1) if $input =~ s/(.*)\x2d//s;
+  push @output, split(//, $1) if $input =~ s/(.*)\x2d//s;
 
   while (length $input) {
     my ($oldi, $w) = ($i, 1);
@@ -226,7 +226,7 @@
   my ($n, $delta, $bias) = (PC_INITIAL_N, 0, PC_INITIAL_BIAS);
 
   # Extract basic code points
-  my @input = map {ord} split '', $output;
+  my @input = map {ord} split //, $output;
   $output =~ s/[^\x00-\x7f]+//gs;
   my $h = my $basic = length $output;
   $output .= "\x2d" if $basic > 0;
@@ -334,7 +334,7 @@
 
 sub unindent {
   my $str = shift;
-  my $min = min map { m/^([ \t]*)/; length $1 || () } split "\n", $str;
+  my $min = min map { m/^([ \t]*)/; length $1 || () } split /\n/, $str;
   $str =~ s/^[ \t]{0,$min}//gm if $min;
   return $str;
 }
@@ -710,8 +710,7 @@
 
   my $str = humanize_bytes 1234;
 
-Turn number of bytes into a simplified human readable format. Note that this 
function is B<EXPERIMENTAL> and might
-change without warning!
+Turn number of bytes into a simplified human readable format.
 
   # "1B"
   humanize_bytes 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Mojolicious-8.65/lib/Mojolicious/Command/Author/generate/plugin.pm 
new/Mojolicious-8.66/lib/Mojolicious/Command/Author/generate/plugin.pm
--- old/Mojolicious-8.65/lib/Mojolicious/Command/Author/generate/plugin.pm      
2020-10-24 13:05:25.000000000 +0200
+++ new/Mojolicious-8.66/lib/Mojolicious/Command/Author/generate/plugin.pm      
2020-11-30 10:38:27.000000000 +0100
@@ -14,7 +14,7 @@
   # Class
   my $name  = $args[0] // 'MyPlugin';
   my $class = $full ? $name : "Mojolicious::Plugin::$name";
-  my $dir   = join '-', split('::', $class);
+  my $dir   = join '-', split(/::/, $class);
   my $app   = class_to_path $class;
   $self->render_to_rel_file('class', "$dir/lib/$app", {class => $class, name 
=> $name});
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojolicious/Command.pm 
new/Mojolicious-8.66/lib/Mojolicious/Command.pm
--- old/Mojolicious-8.65/lib/Mojolicious/Command.pm     2020-10-24 
13:05:20.000000000 +0200
+++ new/Mojolicious-8.66/lib/Mojolicious/Command.pm     2020-11-30 
10:38:22.000000000 +0100
@@ -34,7 +34,7 @@
 
 sub help { print shift->usage }
 
-sub rel_file { path->child(split('/', pop)) }
+sub rel_file { path->child(split(/\//, pop)) }
 
 sub render_data {
   my ($self, $name) = (shift, shift);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojolicious/Commands.pm 
new/Mojolicious-8.66/lib/Mojolicious/Commands.pm
--- old/Mojolicious-8.65/lib/Mojolicious/Commands.pm    2020-11-09 
20:04:57.000000000 +0100
+++ new/Mojolicious-8.66/lib/Mojolicious/Commands.pm    2020-11-30 
10:38:30.000000000 +0100
@@ -35,11 +35,11 @@
 
   # Run command
   if ($name && $name =~ /^\w[\w-]+$/ && ($name ne 'help' || $args[0])) {
-    $name =~ s/-/_/g;
 
     # Help
     $name = shift @args if my $help = $name eq 'help';
     local $ENV{MOJO_HELP} = $help = $ENV{MOJO_HELP} || $help;
+    $name =~ s/-/_/g;
 
     # Remove options shared by all commands before loading the command
     _args(\@args);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojolicious/Guides/Tutorial.pod 
new/Mojolicious-8.66/lib/Mojolicious/Guides/Tutorial.pod
--- old/Mojolicious-8.65/lib/Mojolicious/Guides/Tutorial.pod    2020-08-19 
22:42:23.000000000 +0200
+++ new/Mojolicious-8.66/lib/Mojolicious/Guides/Tutorial.pod    2020-11-28 
18:47:21.000000000 +0100
@@ -912,14 +912,10 @@
 
 The default operating mode will usually be C<development> and can be changed 
with command line options or the
 C<MOJO_MODE> and C<PLACK_ENV> environment variables. A mode other than 
C<development> will raise the log level from
-C<debug> to C<info>.
+C<debug> to C<info>. All messages will be written to C<STDERR> by default.
 
   $ ./myapp.pl daemon -m production
 
-All messages will be written to C<STDERR> or a C<log/$mode.log> file if a 
C<log> directory exists.
-
-  $ mkdir log
-
 Mode changes also affect a few other aspects of the framework, such as the 
built-in C<exception> and C<not_found>
 pages. Once you switch modes from C<development> to C<production>, no 
sensitive information will be revealed on those
 pages anymore.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojolicious/Renderer.pm 
new/Mojolicious-8.66/lib/Mojolicious/Renderer.pm
--- old/Mojolicious-8.65/lib/Mojolicious/Renderer.pm    2020-10-24 
13:05:21.000000000 +0200
+++ new/Mojolicious-8.66/lib/Mojolicious/Renderer.pm    2020-11-30 
10:38:23.000000000 +0100
@@ -141,7 +141,7 @@
   # Normal default template
   my $stash = $c->stash;
   my ($controller, $action) = @$stash{qw(controller action)};
-  return join '/', split('-', decamelize $controller), $action if $controller 
&& $action;
+  return join '/', split(/-/, decamelize $controller), $action if $controller 
&& $action;
 
   # Try the route name if we don't have controller and action
   return undef unless my $route = $c->match->endpoint;
@@ -178,7 +178,7 @@
 sub template_path {
   my ($self, $options) = @_;
   return undef unless my $name = $self->template_name($options);
-  my @parts = split '/', $name;
+  my @parts = split /\//, $name;
   -r and return $_ for map { path($_, @parts)->to_string } @{$self->paths}, 
$TEMPLATES;
   return undef;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojolicious/Routes/Pattern.pm 
new/Mojolicious-8.66/lib/Mojolicious/Routes/Pattern.pm
--- old/Mojolicious-8.65/lib/Mojolicious/Routes/Pattern.pm      2020-10-24 
13:05:28.000000000 +0200
+++ new/Mojolicious-8.66/lib/Mojolicious/Routes/Pattern.pm      2020-11-30 
10:38:30.000000000 +0100
@@ -71,7 +71,7 @@
 
     # Placeholder
     else {
-      my $name    = (split $start, $value)[0] // '';
+      my $name    = (split /\Q$start/, $value)[0] // '';
       my $default = $self->defaults->{$name};
       $part = $values->{$name} // $default // '';
       if    (!defined $default || ($default ne $part)) { $optional = 0 }
@@ -165,7 +165,7 @@
   my $wildcard    = $self->wildcard_start;
 
   my (@tree, $spec, $more);
-  for my $char (split '', $pattern) {
+  for my $char (split //, $pattern) {
 
     # Quoted
     if    ($char eq $quote_start) { push @tree, ['placeholder', ''] if ++$spec 
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojolicious/Static.pm 
new/Mojolicious-8.66/lib/Mojolicious/Static.pm
--- old/Mojolicious-8.65/lib/Mojolicious/Static.pm      2020-10-24 
13:05:23.000000000 +0200
+++ new/Mojolicious-8.66/lib/Mojolicious/Static.pm      2020-11-30 
10:38:25.000000000 +0100
@@ -41,7 +41,7 @@
   my ($self, $rel) = @_;
 
   # Search all paths
-  my @parts = split '/', $rel;
+  my @parts = split /\//, $rel;
   for my $path (@{$self->paths}) {
     next unless my $asset = _get_file(path($path, @parts)->to_string);
     return $asset;
@@ -70,7 +70,7 @@
 
   # If-None-Match
   $etag //= $res_headers->etag // '';
-  return undef if $match && !grep { $_ eq $etag || "W/$_" eq $etag } map { 
trim($_) } split ',', $match;
+  return undef if $match && !grep { $_ eq $etag || "W/$_" eq $etag } map { 
trim($_) } split /,/, $match;
 
   # If-Modified-Since
   return !!$match unless ($last //= $res_headers->last_modified) && $since;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojolicious/Types.pm 
new/Mojolicious-8.66/lib/Mojolicious/Types.pm
--- old/Mojolicious-8.65/lib/Mojolicious/Types.pm       2020-10-24 
13:05:23.000000000 +0200
+++ new/Mojolicious-8.66/lib/Mojolicious/Types.pm       2020-11-30 
10:38:25.000000000 +0100
@@ -50,7 +50,7 @@
 
   # Extract and prioritize MIME types
   my %types;
-  /^\s*([^,; ]+)(?:\s*\;\s*q\s*=\s*(\d+(?:\.\d+)?))?\s*$/i and $types{lc $1} = 
$2 // 1 for split ',', $accept // '';
+  /^\s*([^,; ]+)(?:\s*\;\s*q\s*=\s*(\d+(?:\.\d+)?))?\s*$/i and $types{lc $1} = 
$2 // 1 for split /,/, $accept // '';
   my @detected = sort { $types{$b} <=> $types{$a} } sort keys %types;
 
   # Detect extensions from MIME types
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/lib/Mojolicious.pm 
new/Mojolicious-8.66/lib/Mojolicious.pm
--- old/Mojolicious-8.65/lib/Mojolicious.pm     2020-11-10 16:19:27.000000000 
+0100
+++ new/Mojolicious-8.66/lib/Mojolicious.pm     2020-11-30 10:38:05.000000000 
+0100
@@ -6,6 +6,7 @@
 use Mojo::DynamicMethods -dispatch;
 use Mojo::Exception;
 use Mojo::Home;
+use Mojo::Loader;
 use Mojo::Log;
 use Mojo::Util;
 use Mojo::UserAgent;
@@ -26,23 +27,28 @@
 has log              => sub {
   my $self = shift;
 
-  # Check if we have a log directory that is writable
+  my $mode = $self->mode;
   my $log  = Mojo::Log->new;
+
+  # DEPRECATED!
   my $home = $self->home;
-  my $mode = $self->mode;
-  $log->path($home->child('log', "$mode.log")) if -d $home->child('log') && -w 
_;
+  if (-d $home->child('log') && -w _) {
+    $log->path($home->child('log', "$mode.log"));
+    Mojo::Util::deprecated(qq{Logging to "log/$mode.log" is DEPRECATED});
+  }
 
   # Reduced log output outside of development mode
   return $log->level($ENV{MOJO_LOG_LEVEL}) if $ENV{MOJO_LOG_LEVEL};
   return $mode eq 'development' ? $log : $log->level('info');
 };
 has 'max_request_size';
-has mode     => sub { $ENV{MOJO_MODE} || $ENV{PLACK_ENV} || 'development' };
-has moniker  => sub { Mojo::Util::decamelize ref shift };
-has plugins  => sub { Mojolicious::Plugins->new };
-has renderer => sub { Mojolicious::Renderer->new };
-has routes   => sub { Mojolicious::Routes->new };
-has secrets  => sub {
+has mode               => sub { $ENV{MOJO_MODE} || $ENV{PLACK_ENV} || 
'development' };
+has moniker            => sub { Mojo::Util::decamelize ref shift };
+has plugins            => sub { Mojolicious::Plugins->new };
+has preload_namespaces => sub { [] };
+has renderer           => sub { Mojolicious::Renderer->new };
+has routes             => sub { Mojolicious::Routes->new };
+has secrets            => sub {
   my $self = shift;
 
   # Warn developers about insecure default
@@ -58,7 +64,7 @@
 has validator => sub { Mojolicious::Validator->new };
 
 our $CODENAME = 'Supervillain';
-our $VERSION  = '8.65';
+our $VERSION  = '8.66';
 
 sub BUILD_DYNAMIC {
   my ($class, $method, $dyn_methods) = @_;
@@ -156,7 +162,8 @@
   push @{$self->static->paths},   $home->child('public')->to_string;
 
   # Default to controller and application namespace
-  my $r = $self->routes->namespaces(["@{[ref $self]}::Controller", ref $self]);
+  my $controller = "@{[ref $self]}::Controller";
+  my $r          = 
$self->preload_namespaces([$controller])->routes->namespaces([$controller, ref 
$self]);
 
   # Hide controller attributes/methods
   $r->hide(qw(app continue cookie every_cookie every_param every_signed_cookie 
finish helpers match on param render));
@@ -169,6 +176,7 @@
   $self->hook(around_dispatch => \&_exception);
 
   $self->startup;
+  $self->warmup;
 
   return $self;
 }
@@ -188,6 +196,8 @@
 
 sub startup { }
 
+sub warmup { Mojo::Loader::load_classes $_ for @{shift->preload_namespaces} }
+
 sub _action {
   my ($next, $c, $action, $last) = @_;
   my $val = $action->($c);
@@ -400,7 +410,7 @@
 
 The logging layer of your application, defaults to a L<Mojo::Log> object. The 
level will default to either the
 C<MOJO_LOG_LEVEL> environment variable, C<debug> if the L</mode> is 
C<development>, or C<info> otherwise. All messages
-will be written to C<STDERR>, or a C<log/$mode.log> file if a C<log> directory 
exists.
+will be written to C<STDERR> by default.
 
   # Log debug message
   $app->log->debug('It works');
@@ -442,6 +452,14 @@
   # Add another namespace to load plugins from
   push @{$app->plugins->namespaces}, 'MyApp::Plugin';
 
+=head2 preload_namespaces
+
+  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!
+
 =head2 renderer
 
   my $renderer = $app->renderer;
@@ -715,6 +733,13 @@
 
   sub startup ($self) {...}
 
+=head2 warmup
+
+  $app->warmup;
+
+Preload classes from L</"preload_namespaces"> for future use. Note that this 
method is B<EXPERIMENTAL> and might change
+without warning!
+
 =head1 HELPERS
 
 In addition to the L</"ATTRIBUTES"> and L</"METHODS"> above you can also call 
helpers on L<Mojolicious> objects. This
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/t/mojo/dom.t 
new/Mojolicious-8.66/t/mojo/dom.t
--- old/Mojolicious-8.65/t/mojo/dom.t   2020-10-28 21:15:18.000000000 +0100
+++ new/Mojolicious-8.66/t/mojo/dom.t   2020-11-30 10:37:34.000000000 +0100
@@ -2918,4 +2918,12 @@
   is $dom->at(':scope:first-child'), undef, 'no result';
 };
 
+subtest 'Unknown CSS selector' => sub {
+  my $dom = 
Mojo::DOM->new('<html><head></head><body><div><div>x</div></div></body></html>');
+  eval { $dom->at('div[') };
+  like $@, qr/Unknown CSS selector: div\[/, 'right error';
+  eval { $dom->find('p[') };
+  like $@, qr/Unknown CSS selector: p\[/, 'right error';
+};
+
 done_testing();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/t/mojo/file.t 
new/Mojolicious-8.66/t/mojo/file.t
--- old/Mojolicious-8.65/t/mojo/file.t  2020-10-24 13:04:02.000000000 +0200
+++ new/Mojolicious-8.66/t/mojo/file.t  2020-11-30 10:38:47.000000000 +0100
@@ -239,33 +239,35 @@
   is_deeply path('does_not_exist')->list->to_array, [], 'no files';
   is_deeply curfile->list->to_array, [], 'no files';
   my $lib   = curfile->sibling('lib', 'Mojo');
-  my @files = map { path($lib)->child(split '/') }
+  my @files = map { path($lib)->child(split /\//) }
     ('DeprecationTest.pm', 'LoaderException.pm', 'LoaderException2.pm', 
'TestConnectProxy.pm');
   is_deeply path($lib)->list->map('to_string')->to_array, \@files, 'right 
files';
   unshift @files, $lib->child('.hidden.txt')->to_string;
   is_deeply path($lib)->list({hidden => 1})->map('to_string')->to_array, 
\@files, 'right files';
-  @files = map { path($lib)->child(split '/') } (
-    'BaseTest',   'DeprecationTest.pm', 'LoaderException.pm', 
'LoaderException2.pm',
-    'LoaderTest', 'Server',             'TestConnectProxy.pm'
+  @files = map { path($lib)->child(split /\//) } (
+    'BaseTest',   'DeprecationTest.pm',  'LoaderException.pm', 
'LoaderException2.pm',
+    'LoaderTest', 'LoaderTestException', 'Server',             
'TestConnectProxy.pm'
   );
   is_deeply path($lib)->list({dir => 1})->map('to_string')->to_array, \@files, 
'right files';
-  my @hidden = map { path($lib)->child(split '/') } '.hidden.txt', '.test';
+  my @hidden = map { path($lib)->child(split /\//) } '.hidden.txt', '.test';
   is_deeply path($lib)->list({dir => 1, hidden => 
1})->map('to_string')->to_array, [@hidden, @files], 'right files';
 
   is_deeply path('does_not_exist')->list_tree->to_array, [], 'no files';
   is_deeply curfile->list_tree->to_array, [], 'no files';
-  @files = map { path($lib)->child(split '/') } (
-    'BaseTest/Base1.pm',  'BaseTest/Base2.pm',
-    'BaseTest/Base3.pm',  'DeprecationTest.pm',
-    'LoaderException.pm', 'LoaderException2.pm',
-    'LoaderTest/A.pm',    'LoaderTest/B.pm',
-    'LoaderTest/C.pm',    'Server/Morbo/Backend/TestBackend.pm',
+  @files = map { path($lib)->child(split /\//) } (
+    'BaseTest/Base1.pm',        'BaseTest/Base2.pm',
+    'BaseTest/Base3.pm',        'DeprecationTest.pm',
+    'LoaderException.pm',       'LoaderException2.pm',
+    'LoaderTest/A.pm',          'LoaderTest/B.pm',
+    'LoaderTest/C.pm',          'LoaderTest/D.txt',
+    'LoaderTest/E/F.pm',        'LoaderTest/E/G.txt',
+    'LoaderTestException/A.pm', 'Server/Morbo/Backend/TestBackend.pm',
     'TestConnectProxy.pm'
   );
   is_deeply path($lib)->list_tree->map('to_string')->to_array, \@files, 'right 
files';
-  @hidden = map { path($lib)->child(split '/') } '.hidden.txt', 
'.test/hidden.txt';
+  @hidden = map { path($lib)->child(split /\//) } '.hidden.txt', 
'.test/hidden.txt';
   is_deeply path($lib)->list_tree({hidden => 1})->map('to_string')->to_array, 
[@hidden, @files], 'right files';
-  my @all = map { path($lib)->child(split '/') } (
+  my @all = map { path($lib)->child(split /\//) } (
     '.hidden.txt',          '.test',
     '.test/hidden.txt',     'BaseTest',
     'BaseTest/Base1.pm',    'BaseTest/Base2.pm',
@@ -273,31 +275,35 @@
     'LoaderException.pm',   'LoaderException2.pm',
     'LoaderTest',           'LoaderTest/A.pm',
     'LoaderTest/B.pm',      'LoaderTest/C.pm',
+    'LoaderTest/D.txt',     'LoaderTest/E',
+    'LoaderTest/E/F.pm',    'LoaderTest/E/G.txt',
+    'LoaderTestException',  'LoaderTestException/A.pm',
     'Server',               'Server/Morbo',
     'Server/Morbo/Backend', 'Server/Morbo/Backend/TestBackend.pm',
     'TestConnectProxy.pm'
   );
   is_deeply path($lib)->list_tree({dir => 1, hidden => 
1})->map('to_string')->to_array, [@all], 'right files';
-  my @one = map { path($lib)->child(split '/') }
+  my @one = map { path($lib)->child(split /\//) }
     ('DeprecationTest.pm', 'LoaderException.pm', 'LoaderException2.pm', 
'TestConnectProxy.pm');
   is_deeply path($lib)->list_tree({max_depth => 
1})->map('to_string')->to_array, [@one], 'right files';
-  my @one_dir = map { path($lib)->child(split '/') } (
-    'BaseTest',   'DeprecationTest.pm', 'LoaderException.pm', 
'LoaderException2.pm',
-    'LoaderTest', 'Server',             'TestConnectProxy.pm'
+  my @one_dir = map { path($lib)->child(split /\//) } (
+    'BaseTest',   'DeprecationTest.pm',  'LoaderException.pm', 
'LoaderException2.pm',
+    'LoaderTest', 'LoaderTestException', 'Server',             
'TestConnectProxy.pm'
   );
   is_deeply path($lib)->list_tree({dir => 1, max_depth => 
1})->map('to_string')->to_array, [@one_dir], 'right files';
-  my @two = map { path($lib)->child(split '/') } (
-    'BaseTest/Base1.pm',  'BaseTest/Base2.pm',   'BaseTest/Base3.pm', 
'DeprecationTest.pm',
-    'LoaderException.pm', 'LoaderException2.pm', 'LoaderTest/A.pm',   
'LoaderTest/B.pm',
-    'LoaderTest/C.pm',    'TestConnectProxy.pm'
+  my @two = map { path($lib)->child(split /\//) } (
+    'BaseTest/Base1.pm',  'BaseTest/Base2.pm',   'BaseTest/Base3.pm',        
'DeprecationTest.pm',
+    'LoaderException.pm', 'LoaderException2.pm', 'LoaderTest/A.pm',          
'LoaderTest/B.pm',
+    'LoaderTest/C.pm',    'LoaderTest/D.txt',    'LoaderTestException/A.pm', 
'TestConnectProxy.pm'
   );
   is_deeply path($lib)->list_tree({max_depth => 
2})->map('to_string')->to_array, [@two], 'right files';
-  my @three = map { path($lib)->child(split '/') } (
-    '.hidden.txt',          '.test',               '.test/hidden.txt',  
'BaseTest',
-    'BaseTest/Base1.pm',    'BaseTest/Base2.pm',   'BaseTest/Base3.pm', 
'DeprecationTest.pm',
-    'LoaderException.pm',   'LoaderException2.pm', 'LoaderTest',        
'LoaderTest/A.pm',
-    'LoaderTest/B.pm',      'LoaderTest/C.pm',     'Server',            
'Server/Morbo',
-    'Server/Morbo/Backend', 'TestConnectProxy.pm'
+  my @three = map { path($lib)->child(split /\//) } (
+    '.hidden.txt',        '.test',               '.test/hidden.txt',     
'BaseTest',
+    'BaseTest/Base1.pm',  'BaseTest/Base2.pm',   'BaseTest/Base3.pm',    
'DeprecationTest.pm',
+    'LoaderException.pm', 'LoaderException2.pm', 'LoaderTest',           
'LoaderTest/A.pm',
+    'LoaderTest/B.pm',    'LoaderTest/C.pm',     'LoaderTest/D.txt',     
'LoaderTest/E',
+    'LoaderTest/E/F.pm',  'LoaderTest/E/G.txt',  'LoaderTestException',  
'LoaderTestException/A.pm',
+    'Server',             'Server/Morbo',        'Server/Morbo/Backend', 
'TestConnectProxy.pm'
   );
   is_deeply path($lib)->list_tree({dir => 1, hidden => 1, max_depth => 
3})->map('to_string')->to_array, [@three],
     'right files';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTest/A.pm 
new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTest/A.pm
--- old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTest/A.pm        2020-05-21 
23:27:22.000000000 +0200
+++ new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTest/A.pm        2020-11-28 
19:31:09.000000000 +0100
@@ -1,5 +1,4 @@
 package Mojo::LoaderTest::A;
-
 use Mojo::Base -base;
 
 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTest/B.pm 
new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTest/B.pm
--- old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTest/B.pm        2020-05-21 
23:27:22.000000000 +0200
+++ new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTest/B.pm        2020-11-28 
19:31:09.000000000 +0100
@@ -1,5 +1,4 @@
 package Mojo::LoaderTest::B;
-
 use Mojo::Base -base;
 
 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTest/C.pm 
new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTest/C.pm
--- old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTest/C.pm        2020-05-21 
23:27:22.000000000 +0200
+++ new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTest/C.pm        2020-11-28 
19:31:09.000000000 +0100
@@ -1,5 +1,4 @@
 package Mojo::LoaderTest::C;
-
 use Mojo::Base -base;
 
 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTest/D.txt 
new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTest/D.txt
--- old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTest/D.txt       1970-01-01 
01:00:00.000000000 +0100
+++ new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTest/D.txt       2020-11-28 
19:31:09.000000000 +0100
@@ -0,0 +1 @@
+This is not a module.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTest/E/F.pm 
new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTest/E/F.pm
--- old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTest/E/F.pm      1970-01-01 
01:00:00.000000000 +0100
+++ new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTest/E/F.pm      2020-11-28 
19:31:09.000000000 +0100
@@ -0,0 +1,4 @@
+package Mojo::LoaderTest::E::F;
+use Mojo::Base -base;
+
+1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTest/E/G.txt 
new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTest/E/G.txt
--- old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTest/E/G.txt     1970-01-01 
01:00:00.000000000 +0100
+++ new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTest/E/G.txt     2020-11-28 
19:31:09.000000000 +0100
@@ -0,0 +1 @@
+Also not a module.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTestException/A.pm 
new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTestException/A.pm
--- old/Mojolicious-8.65/t/mojo/lib/Mojo/LoaderTestException/A.pm       
1970-01-01 01:00:00.000000000 +0100
+++ new/Mojolicious-8.66/t/mojo/lib/Mojo/LoaderTestException/A.pm       
2020-11-28 19:31:09.000000000 +0100
@@ -0,0 +1,8 @@
+package Mojo::LoaderException::A;
+use Mojo::Base -base;
+
+sub new { }
+
+foo {
+
+1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/t/mojo/loader.t 
new/Mojolicious-8.66/t/mojo/loader.t
--- old/Mojolicious-8.65/t/mojo/loader.t        2020-10-24 13:04:07.000000000 
+0200
+++ new/Mojolicious-8.66/t/mojo/loader.t        2020-11-28 19:31:09.000000000 
+0100
@@ -7,7 +7,7 @@
 use Mojo::File qw(curfile);
 use lib curfile->sibling('lib')->to_string;
 
-use Mojo::Loader qw(data_section file_is_binary find_packages find_modules 
load_class);
+use Mojo::Loader qw(data_section file_is_binary find_packages find_modules 
load_class load_classes);
 
 package MyLoaderTest::Foo::Bar;
 
@@ -59,11 +59,14 @@
 };
 
 subtest 'Search modules' => sub {
-  my @modules = find_modules 'Mojo::LoaderTest';
-  is_deeply \@modules, [qw(Mojo::LoaderTest::A Mojo::LoaderTest::B 
Mojo::LoaderTest::C)], 'found the right modules';
-  is_deeply [find_modules "Mojo'LoaderTest"], [qw(Mojo'LoaderTest::A 
Mojo'LoaderTest::B Mojo'LoaderTest::C)],
+  is_deeply [find_modules 'Mojo::LoaderTest'], [qw(Mojo::LoaderTest::A 
Mojo::LoaderTest::B Mojo::LoaderTest::C)],
     'found the right modules';
+
+  is_deeply [find_modules 'Mojo::LoaderTest', {recursive => 1}],
+    [qw(Mojo::LoaderTest::A Mojo::LoaderTest::B Mojo::LoaderTest::C 
Mojo::LoaderTest::E::F)], 'found the right modules';
+
   is_deeply [find_modules 'MyLoaderTest::DoesNotExist'], [], 'no modules 
found';
+  is_deeply [find_modules 'MyLoaderTest::DoesNotExist', {recursive => 1}], [], 
'no modules found';
 };
 
 subtest 'Search packages' => sub {
@@ -96,6 +99,17 @@
   is load_class('Mojolicious::Lite'),     undef, 'loaded successfully';
 };
 
+subtest 'Load classes recursively' => sub {
+  is_deeply [load_classes 'Mojo::LoaderTest'],
+    ['Mojo::LoaderTest::A', 'Mojo::LoaderTest::B', 'Mojo::LoaderTest::C', 
'Mojo::LoaderTest::E::F'], 'classes loaded';
+  ok !!Mojo::LoaderTest::E::F->can('new'), 'loaded successfully';
+};
+
+subtest 'Exception in namespace' => sub {
+  eval { load_classes 'Mojo::LoaderTestException' };
+  like $@, qr/Missing right curly.*A\.pm/, 'right error';
+};
+
 subtest 'UNIX DATA templates' => sub {
   my $unix = "@@ template1\nFirst Template\n@@ template2\r\nSecond Template\n";
   open my $data, '<', \$unix;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/t/mojolicious/app.t 
new/Mojolicious-8.66/t/mojolicious/app.t
--- old/Mojolicious-8.65/t/mojolicious/app.t    2020-10-24 13:04:23.000000000 
+0200
+++ new/Mojolicious-8.66/t/mojolicious/app.t    2020-11-28 20:42:48.000000000 
+0100
@@ -58,6 +58,11 @@
 
 $t = Test::Mojo->new('MojoliciousTest');
 
+subtest 'Preload namespaces' => sub {
+  is_deeply $t->app->preload_namespaces, ['MojoliciousTest::Controller'], 
'right namespaces';
+  ok !!MojoliciousTest::Controller::Foo::Bar->can('new'), 'preloaded 
controller';
+};
+
 # Application is already available
 is $t->app->routes->find('something')->to_string, '/test4/:something', 'right 
pattern';
 is $t->app->routes->find('test3')->pattern->defaults->{namespace},      
'MojoliciousTestController', 'right namespace';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/t/mojolicious/commands.t 
new/Mojolicious-8.66/t/mojolicious/commands.t
--- old/Mojolicious-8.65/t/mojolicious/commands.t       2020-11-09 
20:05:09.000000000 +0100
+++ new/Mojolicious-8.66/t/mojolicious/commands.t       2020-11-17 
18:03:37.000000000 +0100
@@ -141,6 +141,13 @@
 {
   open my $handle, '>', \$buffer;
   local *STDOUT = $handle;
+  $commands->run('generate', 'help', 'lite-app');
+}
+like $buffer, qr/Usage: APPLICATION generate lite-app \[OPTIONS\] \[NAME\]/, 
'right output';
+$buffer = '';
+{
+  open my $handle, '>', \$buffer;
+  local *STDOUT = $handle;
   $commands->run('generate', 'app', '-h');
 }
 like $buffer, qr/Usage: APPLICATION generate app \[OPTIONS\] \[NAME\]/, 'right 
output';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Mojolicious-8.65/t/mojolicious/lib/MojoliciousTest/Controller/Foo/Bar.pm 
new/Mojolicious-8.66/t/mojolicious/lib/MojoliciousTest/Controller/Foo/Bar.pm
--- 
old/Mojolicious-8.65/t/mojolicious/lib/MojoliciousTest/Controller/Foo/Bar.pm    
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/Mojolicious-8.66/t/mojolicious/lib/MojoliciousTest/Controller/Foo/Bar.pm    
    2020-11-28 20:22:41.000000000 +0100
@@ -0,0 +1,8 @@
+package MojoliciousTest::Controller::Foo::Bar;
+use Mojolicious::Controller -base;
+
+sub index {1}
+
+sub test { shift->stash(msg => 'works') }
+
+1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Mojolicious-8.65/t/mojolicious/lib/MojoliciousTest/Foo/Bar.pm 
new/Mojolicious-8.66/t/mojolicious/lib/MojoliciousTest/Foo/Bar.pm
--- old/Mojolicious-8.65/t/mojolicious/lib/MojoliciousTest/Foo/Bar.pm   
2020-05-21 23:27:22.000000000 +0200
+++ new/Mojolicious-8.66/t/mojolicious/lib/MojoliciousTest/Foo/Bar.pm   
1970-01-01 01:00:00.000000000 +0100
@@ -1,8 +0,0 @@
-package MojoliciousTest::Foo::Bar;
-use Mojolicious::Controller -base;
-
-sub index {1}
-
-sub test { shift->stash(msg => 'works') }
-
-1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/t/mojolicious/pattern.t 
new/Mojolicious-8.66/t/mojolicious/pattern.t
--- old/Mojolicious-8.65/t/mojolicious/pattern.t        2020-10-24 
13:04:24.000000000 +0200
+++ new/Mojolicious-8.66/t/mojolicious/pattern.t        2020-11-29 
16:22:47.000000000 +0100
@@ -250,4 +250,23 @@
 is $pattern->render($result, 1), '/foo/23/baz', 'right result';
 ok !$pattern->match('/foo/bar/baz', 1), 'no result';
 
+subtest 'Alternate placeholder characters' => sub {
+  my $pattern = 
Mojolicious::Routes::Pattern->new->placeholder_start('|')->parse('/|test');
+  my $result  = $pattern->match('/foo');
+  is_deeply $result, {test => 'foo'}, 'right structure';
+  is $pattern->render($result, 1), '/foo', 'right result';
+  $pattern = 
Mojolicious::Routes::Pattern->new->relaxed_start('|')->parse('/|test');
+  $result  = $pattern->match('/foo');
+  is_deeply $result, {test => 'foo'}, 'right structure';
+  is $pattern->render($result, 1), '/foo', 'right result';
+  $pattern = 
Mojolicious::Routes::Pattern->new->wildcard_start('|')->parse('/|test');
+  $result  = $pattern->match('/foo');
+  is_deeply $result, {test => 'foo'}, 'right structure';
+  is $pattern->render($result, 1), '/foo', 'right result';
+  $pattern = Mojolicious::Routes::Pattern->new->types({num => 
qr/\d+/})->type_start('|')->parse('/<test|num>');
+  $result  = $pattern->match('/42');
+  is_deeply $result, {test => '42'}, 'right structure';
+  is $pattern->render($result, 1), '/42', 'right result';
+};
+
 done_testing();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Mojolicious-8.65/t/pod_coverage.t 
new/Mojolicious-8.66/t/pod_coverage.t
--- old/Mojolicious-8.65/t/pod_coverage.t       2020-11-10 10:32:52.000000000 
+0100
+++ new/Mojolicious-8.66/t/pod_coverage.t       2020-11-19 01:30:56.000000000 
+0100
@@ -7,8 +7,8 @@
 
 # async/await hooks
 my @await = (
-  qw(AWAIT_CLONE AWAIT_DONE AWAIT_FAIL AWAIT_GET AWAIT_IS_CANCELLED 
AWAIT_IS_READY AWAIT_NEW_DONE AWAIT_NEW_FAIL),
-  qw(AWAIT_ON_CANCEL AWAIT_ON_READY)
+  qw(AWAIT_CHAIN_CANCEL AWAIT_CLONE AWAIT_DONE AWAIT_FAIL AWAIT_GET 
AWAIT_IS_CANCELLED AWAIT_IS_READY AWAIT_NEW_DONE),
+  qw(AWAIT_NEW_FAIL AWAIT_ON_CANCEL AWAIT_ON_READY)
 );
 
 all_pod_coverage_ok({also_private => ['BUILD_DYNAMIC', @await, 'success']});
_______________________________________________
openSUSE Commits mailing list -- [email protected]
To unsubscribe, email [email protected]
List Netiquette: https://en.opensuse.org/openSUSE:Mailing_list_netiquette
List Archives: 
https://lists.opensuse.org/archives/list/[email protected]

Reply via email to