Updated PAR support
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Helper.pm
index d63ab87..4787359 100644 (file)
@@ -2,13 +2,11 @@ package Catalyst::Helper;
 
 use strict;
 use base 'Class::Accessor::Fast';
-use Config;
 use File::Spec;
 use File::Path;
 use IO::File;
 use FindBin;
 use Template;
-use Catalyst;
 use Catalyst::Utils;
 use Catalyst::Exception;
 
@@ -58,30 +56,39 @@ Create the main application skeleton.
 
 sub mk_app {
     my ( $self, $name ) = @_;
+
+    # Needs to be here for PAR
+    require Catalyst;
+
     return 0 if $name =~ /[^\w\:]/;
     $self->{name} = $name;
     $self->{dir}  = $name;
     $self->{dir} =~ s/\:\:/-/g;
+    $self->{script}    = File::Spec->catdir( $self->{dir}, 'script' );
     $self->{appprefix} = Catalyst::Utils::appprefix($name);
-    $self->{startperl} = $Config{startperl};
+    $self->{startperl} = '#!/usr/bin/perl -w';
     $self->{scriptgen} = $Catalyst::CATALYST_SCRIPT_GEN || 4;
     $self->{author}    = $self->{author} = $ENV{'AUTHOR'}
       || eval { @{ [ getpwuid($<) ] }[6] }
       || 'Catalyst developer';
-    $self->_mk_dirs;
-    $self->_mk_appclass;
-    $self->_mk_build;
-    $self->_mk_makefile;
-    $self->_mk_readme;
-    $self->_mk_changes;
-    $self->_mk_apptest;
+
+    unless ( $self->{scripts} ) {
+        $self->_mk_dirs;
+        $self->_mk_appclass;
+        $self->_mk_build;
+        $self->_mk_makefile;
+        $self->_mk_readme;
+        $self->_mk_changes;
+        $self->_mk_apptest;
+        $self->_mk_images;
+        $self->_mk_favicon;
+        $self->_mk_package;
+    }
     $self->_mk_cgi;
     $self->_mk_fastcgi;
     $self->_mk_server;
     $self->_mk_test;
     $self->_mk_create;
-    $self->_mk_images;
-    $self->_mk_favicon;
     return 1;
 }
 
@@ -210,12 +217,14 @@ sub mk_file {
     my ( $self, $file, $content ) = @_;
     if ( -e $file ) {
         print qq/ exists "$file"\n/;
-        return 0 unless $self->{'.newfiles'};
-        if ( my $f = IO::File->new("< $file") ) {
-            my $oldcontent = join( '', (<$f>) );
-            return 0 if $content eq $oldcontent;
+        return 0 unless ( $self->{'.newfiles'} || $self->{scripts} );
+        if ( $self->{'.newfiles'} ) {
+            if ( my $f = IO::File->new("< $file") ) {
+                my $oldcontent = join( '', (<$f>) );
+                return 0 if $content eq $oldcontent;
+            }
+            $file .= '.new';
         }
-        $file .= '.new';
     }
     if ( my $f = IO::File->new("> $file") ) {
         binmode $f;
@@ -275,7 +284,6 @@ sub render_file {
 sub _mk_dirs {
     my $self = shift;
     $self->mk_dir( $self->{dir} );
-    $self->{script} = File::Spec->catdir( $self->{dir}, 'script' );
     $self->mk_dir( $self->{script} );
     $self->{lib} = File::Spec->catdir( $self->{dir}, 'lib' );
     $self->mk_dir( $self->{lib} );
@@ -436,6 +444,14 @@ sub _mk_favicon {
 
 }
 
+sub _mk_package {
+    my $self      = shift;
+    my $script    = $self->{script};
+    my $appprefix = $self->{appprefix};
+    $self->render_file( 'package', "$script\/$appprefix\_package.pl" );
+    chmod 0700, "$script/$appprefix\_package.pl";
+}
+
 =head1 HELPERS
 
 Helpers are classes that provide two methods.
@@ -486,16 +502,24 @@ package [% name %];
 use strict;
 use warnings;
 
-# -Debug activates the debug mode for very useful log messages
-# Static::Simple will serve static files from the root directory
+#
+# Set flags and add plugins for the application
+#
+#         -Debug: activates the debug mode for very useful log messages
+# Static::Simple: will serve static files from the applications root directory
+#
 use Catalyst qw/-Debug Static::Simple/;
 
 our $VERSION = '0.01';
 
+#
 # Configure the application
+#
 __PACKAGE__->config( name => '[% name %]' );
 
+#
 # Start the application
+#
 __PACKAGE__->setup;
 
 =head1 NAME
@@ -518,7 +542,9 @@ Catalyst based application.
 
 =cut
 
+#
 # Output a friendly welcome message
+#
 sub default : Private {
     my ( $self, $c ) = @_;
 
@@ -526,7 +552,9 @@ sub default : Private {
     $c->response->body( $c->welcome_message );
 }
 
-# Uncomment and modify this end action after adding a View class
+#
+# Uncomment and modify this end action after adding a View component
+#
 #=item end
 #
 #=cut
@@ -535,7 +563,7 @@ sub default : Private {
 #    my ( $self, $c ) = @_;
 #
 #    # Forward to View unless response body is already defined
-#    $c->forward('MyApp::V::') unless $c->response->body;
+#    $c->forward('View::') unless $c->response->body;
 #}
 
 =back
@@ -587,10 +615,9 @@ use strict;
 use Catalyst::Build;
 
 my $build = Catalyst::Build->new(
-    create_makefile_pl => 'passthrough',
     license            => 'perl',
     module_name        => '[% name %]',
-    requires           => { Catalyst => '5.10' },
+    requires           => { Catalyst => '5.49' },
     create_makefile_pl => 'passthrough',
     script_files       => [ glob('script/*') ],
     test_files         => [ glob('t/*.t'), glob('t/*/*.t') ]
@@ -674,17 +701,23 @@ use lib "$FindBin::Bin/../lib";
 use [% name %];
 
 my $help = 0;
-my ( $listen, $nproc );
+my ( $listen, $nproc, $pidfile );
  
 GetOptions(
-    'help|?'     => \$help,
-    'listen|l=s' => \$listen,
-    'nproc|n=i'  => \$nproc,
+    'help|?'      => \$help,
+    'listen|l=s'  => \$listen,
+    'nproc|n=i'   => \$nproc,
+    'pidfile|p=s' => \$pidfile,
 );
 
 pod2usage(1) if $help;
 
-[% name %]->run( $listen, { nproc => $nproc } );
+[% name %]->run( 
+    $listen, 
+    {   nproc   => $nproc,
+        pidfile => $pidfile, 
+    }
+);
 
 1;
 
@@ -703,7 +736,10 @@ pod2usage(1) if $help;
                  can be HOST:PORT, :PORT or a
                  filesystem path
    -n -nproc     specify number of processes to keep
-                 to serve requests (defaults to 1)
+                 to serve requests (defaults to 1,
+                 requires -listen)
+   -p -pidfile   specify filename for pid file
+                 (requires -listen)
 
 =head1 DESCRIPTION
 
@@ -735,6 +771,7 @@ use Pod::Usage;
 use FindBin;
 use lib "$FindBin::Bin/../lib";
 
+my $debug         = 0;
 my $fork          = 0;
 my $help          = 0;
 my $host          = undef;
@@ -746,6 +783,7 @@ my $restart_regex = '\.yml$|\.yaml$|\.pm$';
 my @argv = @ARGV;
 
 GetOptions(
+    'debug|d'           => \$debug,
     'fork'              => \$fork,
     'help|?'            => \$help,
     'host=s'            => \$host,
@@ -760,6 +798,9 @@ pod2usage(1) if $help;
 if ( $restart ) {
     $ENV{CATALYST_ENGINE} = 'HTTP::Restarter';
 }
+if ( $debug ) {
+    $ENV{CATALYST_DEBUG} = 1;
+}
 
 require [% name %];
 
@@ -782,6 +823,7 @@ require [% name %];
 [% appprefix %]_server.pl [options]
 
  Options:
+   -d -debug          force debug mode
    -f -fork           handle each request in a new process
                       (defaults to false)
    -? -help           display this help and exits
@@ -817,14 +859,12 @@ it under the same terms as Perl itself.
 __test__
 [% startperl %] -w
 
-BEGIN { $ENV{CATALYST_ENGINE} ||= 'Test' }
-
 use strict;
 use Getopt::Long;
 use Pod::Usage;
 use FindBin;
 use lib "$FindBin::Bin/../lib";
-use [% name %];
+use Catalyst::Test '[% name %]';
 
 my $help = 0;
 
@@ -832,7 +872,7 @@ GetOptions( 'help|?' => \$help );
 
 pod2usage(1) if ( $help || !$ARGV[0] );
 
-print [% name %]->run($ARGV[0])->content . "\n";
+print request($ARGV[0])->content . "\n";
 
 1;
 
@@ -934,7 +974,87 @@ This behavior can be suppressed with the C<-nonew> option.
 
 =head1 AUTHOR
 
-Sebastian Riedel, C<sri\@oook.de>
+Sebastian Riedel, C<sri@oook.de>
+
+=head1 COPYRIGHT
+
+Copyright 2004 Sebastian Riedel. All rights reserved.
+
+This library is free software, you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+__package__
+[% startperl %] -w
+
+use strict;
+use Getopt::Long;
+use Pod::Usage;
+use Catalyst::PAR;
+
+my $core      = 0;
+my $classes   = '';
+my $engine    = 'CGI';
+my $help      = 0;
+my $multiarch = 0;
+my $par       = '[% appprefix %].par';
+
+GetOptions(
+    'classes=s' => \$classes,
+    'core'      => \$core,
+    'engine=s'  => \$engine,
+    'help|?'    => \$help,
+    'multiarch' => \$multiarch,
+    'par=s'     => \$par
+);
+
+pod2usage(1) if $help;
+
+Catalyst::PAR->new->package( {
+    classes   => $classes,
+    core      => $core,
+    engine    => $engine,
+    par       => $par,
+    multiarch => $multiarch,
+    class     => '[% name %]'
+} );
+
+1;
+
+=head1 NAME
+
+[% appprefix %]_package.pl - Package a Catalyst application
+
+=head1 SYNOPSIS
+
+[% appprefix %]_package.pl
+
+ Options:
+   -classes      comma separated list of additional classes to
+                 include in package
+   -core         also include modules bundled with Perl (defaults to false)
+   -engine       engine to use for dependency detection (defaults to CGI)
+   -help         display this help and exits
+   -multiarch    enable multiarch support (defaults to false)
+   -par          name for the par archive (defaults to [% appprefix %].par)
+
+ Examples:
+   [% appprefix %]_package.pl -engine FastCGI
+   [% appprefix %]_package.pl -par foo_linux_i386_apache2.par -engine Apache2
+   [% appprefix %]_package.pl -classes Test::More,Foo::Bar -par foo.par
+
+ See also:
+   perldoc Catalyst::Manual
+   perldoc Catalyst::Manual::Intro
+   perldoc pp
+
+=head1 DESCRIPTION
+
+Package a Catalyst application with L<PAR>.
+
+=head1 AUTHOR
+
+Sebastian Riedel, C<sri@oook.de>
 
 =head1 COPYRIGHT
 
@@ -967,7 +1087,9 @@ Catalyst [% long_type %].
 
 =over 4
 
-# Uncomment, modify and add new actions to fit your needs
+#
+# Uncomment and modify this or add new actions to fit your needs
+#
 #=item default
 #
 #=cut