improvements to generate command
[scpubgit/App-SCS.git] / lib / App / SCS / Plugin / Generate.pm
CommitLineData
2f1cc197 1package App::SCS::Plugin::Generate;
2
3use IO::All;
4use Moo;
5use Module::Runtime qw(use_module);
6no warnings::illegalproto;
7
8with 'App::SCS::Role::Plugin';
9
10has dir => (
11 is => 'ro',
12 default => sub { $_[0]->config->{dir} || 'out' }
13);
14
15has host => (
16 is => 'ro',
17 default => sub { $_[0]->config->{host} || 'www.example.com' }
18);
19
20sub run_command_generate (dir=s;host=s;only=s) {
21 my ($self, $env) = @_;
22 my $opt = $env->{options};
23 my @all_paths = map $_->provides_pages, @{$self->app->plugins};
24 my $dir = io->dir($opt->{dir} || $self->dir);
25 $dir->mkpath;
26 my $prefix = 'http://'.($opt->{host} || $self->host);
27 if (my $only = $opt->{only}) {
b9125661 28 my $re = qr/^${only}/;
2f1cc197 29 @all_paths = grep /$re/, @all_paths;
30 }
b9125661 31 my @fail;
2f1cc197 32 foreach my $path (@all_paths) {
33 warn "Generating ${path}\n";
b9125661 34 my $res = $self->app->web->run_test_request(GET => "${prefix}${path}");
35
36 unless ($res->is_success) {
37 warn "ERROR on ${path}\n";
38 push @fail, [ $path, $res ];
39 next;
40 }
41
2f1cc197 42 my $dir = $dir->catdir($path);
43 $dir->mkpath;
2f1cc197 44 # text/html -> html
45 # application/atom+xml -> atom
46 my ($ext) = $res->content_type =~ m{\/(\w+)}
47 or die "Couldn't parse extension"
48 ." from content type ${\$res->content_type}"
49 ." for path ${path}";
50 $dir->catfile("index.${ext}")->print($res->content);
51 }
b9125661 52 warn "\nERRORS GENERATING PAGES:\n";
53 foreach my $fail (@fail) {
54 my ($path, $res) = @$fail;
55 warn "\nFailed to generate ${path}:\n";
56 my $error = $res->content||'';
57 $error =~ s/^/ /mg;
58 $error .= "\n" unless $error =~ /\n\Z/;
59 warn $error;
60 }
2f1cc197 61}
62
63sub run_command_staticserver {
64 my ($self, $env) = @_;
65 my @args = @{$env->{argv}};
66 my $opt = $env->{options};
67 my $dir = io->dir($opt->{dir} || $self->dir);
68 my $s = use_module('App::SCS::Plugin::Generate::StaticServer')->new(
69 dir => $dir, app => $self->app,
70 )->run_server($env);
71}
72
731;