Initial Commit

This commit is contained in:
Riley Schneider
2025-12-03 16:38:10 +01:00
parent c5e26bf594
commit b732d8d4b5
17680 changed files with 5977495 additions and 2 deletions

View File

@@ -0,0 +1,69 @@
package Mojo::Server::Morbo::Backend;
use Mojo::Base -base;
use Carp qw(croak);
has watch => sub { [qw(lib templates)] };
has watch_timeout => sub { $ENV{MOJO_MORBO_TIMEOUT} || 1 };
sub modified_files { croak 'Method "modified_files" not implemented by subclass' }
1;
=encoding utf8
=head1 NAME
Mojo::Server::Morbo::Backend - Morbo backend base class
=head1 SYNOPSIS
package Mojo::Server::Morbo::Backend::Inotify:
use Mojo::Base 'Mojo::Server::Morbo::Backend';
sub modified_files {...}
=head1 DESCRIPTION
L<Mojo::Server::Morbo::Backend> is an abstract base class for Morbo backends, like
L<Mojo::Server::Morbo::Backend::Poll>.
=head1 ATTRIBUTES
L<Mojo::Server::Morbo::Backend> implements the following attributes.
=head2 watch
my $watch = $backend->watch;
$backend = $backend->watch(['/home/sri/my_app']);
Files and directories to watch for changes, defaults to the application script as well as the C<lib> and C<templates>
directories in the current working directory.
=head2 watch_timeout
my $timeout = $backend->watch_timeout;
$backend = $backend->watch_timeout(10);
Maximum amount of time in seconds a backend may block when waiting for files to change, defaults to the value of the
C<MOJO_MORBO_TIMEOUT> environment variable or C<1>.
=head1 METHODS
L<Mojo::Server::Morbo::Backend> inherits all methods from L<Mojo::Base> and implements the following new ones.
=head2 modified_files
my $files = $backend->modified_files;
Check if files from L</"watch"> have been modified since the last check and return an array reference with the results.
Meant to be overloaded in a subclass.
# All files that have been modified
say for @{$backend->modified_files};
=head1 SEE ALSO
L<Mojolicious>, L<Mojolicious::Guides>, L<https://mojolicious.org>.
=cut

View File

@@ -0,0 +1,69 @@
package Mojo::Server::Morbo::Backend::Poll;
use Mojo::Base 'Mojo::Server::Morbo::Backend';
use Mojo::File qw(path);
sub modified_files {
my $self = shift;
my $cache = $self->{cache} //= {};
my @files;
for my $file (map { -f $_ && -r _ ? $_ : _list($_) } @{$self->watch}) {
my ($size, $mtime) = (stat $file)[7, 9];
next unless defined $size and defined $mtime;
my $stats = $cache->{$file} ||= [$^T, $size];
next if $mtime <= $stats->[0] && $size == $stats->[1];
@$stats = ($mtime, $size);
push @files, $file;
}
sleep $self->watch_timeout unless @files;
return \@files;
}
sub _list { path(shift)->list_tree->map('to_string')->each }
1;
=encoding utf8
=head1 NAME
Mojo::Server::Morbo::Backend::Poll - Morbo default backend
=head1 SYNOPSIS
use Mojo::Server::Morbo::Backend::Poll;
my $backend = Mojo::Server::Morbo::Backend::Poll->new;
if (my $files = $backend->modified_files) {
...
}
=head1 DESCRIPTION
L<Mojo::Server::Morbo::Backend:Poll> is the default backend for L<Mojo::Server::Morbo>.
=head1 ATTRIBUTES
L<Mojo::Server::Morbo::Backend::Poll> inherits all attributes from L<Mojo::Server::Morbo::Backend>.
=head1 METHODS
L<Mojo::Server::Morbo::Backend::Poll> inherits all methods from L<Mojo::Server::Morbo::Backend> and implements the
following new ones.
=head2 modified_files
my $files = $backend->modified_files;
Check file size and mtime to determine which files have changed, this is not particularly efficient, but very portable.
# All files that have been modified
say for @{$backend->modified_files};
=head1 SEE ALSO
L<Mojolicious>, L<Mojolicious::Guides>, L<https://mojolicious.org>.
=cut