From: Devin Austin Date: Sat, 30 May 2009 06:55:18 +0000 (+0000) Subject: restructured dirs. need to write test to test how helper is invoked. also need to... X-Git-Tag: 1.21_01~1^2~116 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Devel.git;a=commitdiff_plain;h=239b5fc07c4c477f742ddb46fa56651340e68204 restructured dirs. need to write test to test how helper is invoked. also need to get helper to play with new dir struct well --- diff --git a/lib/Catalyst/Helper.pm b/lib/Catalyst/Helper.pm index c2ef31d..66a395a 100644 --- a/lib/Catalyst/Helper.pm +++ b/lib/Catalyst/Helper.pm @@ -15,6 +15,9 @@ use Catalyst::Utils; use Catalyst::Exception; use Path::Class qw/dir file/; use File::ShareDir qw/dist_dir/; +use Moose; +use aliased 'Path::Class::Dir'; + my %cache; @@ -479,6 +482,42 @@ sub _deprecate_file { } } + +## this is so you don't have to do make install after every change to test +sub _find_share_dir { + my ($self, $args) = @_; + my $share_name = $self->name; + if ($share_name =~ s!^/(.*?)/!!) { + my $dist = $1; + $args->{share_base_dir} = eval { + Dir->new(File::ShareDir::dist_dir($dist)) + ->subdir('share'); + }; + if ($@) { + # not installed + my $file = __FILE__; + my $dir = Dir->new(dirname($file)); + my $share_base; + while ($dir->parent) { + if (-d $dir->subdir('share') && -d $dir->subdir('share')->subdir('root')) { + $share_base = $dir->subdir('share')->subdir('root'); + last; + } + $dir = $dir->parent; + } + confess "could not find sharebase by recursion. ended up at $dir, from $file" + unless $share_base; + $args->{share_base_dir} = $share_base; + } + } + my $base = $args->{share_base_dir}->subdir($share_name); + confess "No such share base directory ${base}" + unless -d $base; + $self->share_dir($base); +}; + + + =head1 DESCRIPTION This module is used by B to create a set of scripts for a diff --git a/share/changes.tt b/share/changes.tt new file mode 100644 index 0000000..a0b7459 --- /dev/null +++ b/share/changes.tt @@ -0,0 +1,4 @@ +This file documents the revision history for Perl extension [% name %]. + +0.01 [% time %] + - initial revision, generated by Catalyst diff --git a/share/config.tt b/share/config.tt new file mode 100644 index 0000000..2e3f248 --- /dev/null +++ b/share/config.tt @@ -0,0 +1,3 @@ +# rename this file to [% name %].yml and put a ':' in front of 'name' if +# you want to use YAML like in old versions of Catalyst +name [% name %] diff --git a/share/lib/Helper/compclass.tt b/share/lib/Helper/compclass.tt new file mode 100644 index 0000000..3b0da27 --- /dev/null +++ b/share/lib/Helper/compclass.tt @@ -0,0 +1,42 @@ +package [% class %]; + +use strict; +use warnings; +use parent 'Catalyst::[% long_type %]'; + +=head1 NAME + +[% class %] - Catalyst [% long_type %] + +=head1 DESCRIPTION + +Catalyst [% long_type %]. +[% IF long_type == 'Controller' %] +=head1 METHODS + +=cut + + +=head2 index + +=cut + +sub index :Path :Args(0) { + my ( $self, $c ) = @_; + + $c->response->body('Matched [% class %] in [%name%].'); +} + +[% END %] +=head1 AUTHOR + +[%author%] + +=head1 LICENSE + +This library is free software. You can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut + +1; diff --git a/share/lib/MyApp/Controller/rootclass.tt b/share/lib/MyApp/Controller/rootclass.tt new file mode 100644 index 0000000..edd875f --- /dev/null +++ b/share/lib/MyApp/Controller/rootclass.tt @@ -0,0 +1,61 @@ +package [% rootname %]; + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +# +# Sets the actions in this controller to be registered with no prefix +# so they function identically to actions created in MyApp.pm +# +__PACKAGE__->config->{namespace} = ''; + +=head1 NAME + +[% rootname %] - Root Controller for [% name %] + +=head1 DESCRIPTION + +[enter your description here] + +=head1 METHODS + +=cut + +=head2 index + +=cut + +sub index :Path :Args(0) { + my ( $self, $c ) = @_; + + # Hello World + $c->response->body( $c->welcome_message ); +} + +sub default :Path { + my ( $self, $c ) = @_; + $c->response->body( 'Page not found' ); + $c->response->status(404); +} + +=head2 end + +Attempt to render a view, if needed. + +=cut + +sub end : ActionClass('RenderView') {} + +=head1 AUTHOR + +[% author %] + +=head1 LICENSE + +This library is free software. You can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut + +1; diff --git a/share/lib/appclass.tt b/share/lib/appclass.tt new file mode 100644 index 0000000..cb2a7b7 --- /dev/null +++ b/share/lib/appclass.tt @@ -0,0 +1,64 @@ +package [% name %]; + +use strict; +use warnings; + +use Catalyst::Runtime 5.80; + +# Set flags and add plugins for the application +# +# -Debug: activates the debug mode for very useful log messages +# ConfigLoader: will load the configuration from a Config::General file in the +# application's home directory +# Static::Simple: will serve static files from the application's root +# directory + +use parent qw/Catalyst/; +use Catalyst qw/-Debug + ConfigLoader + Static::Simple/; +our $VERSION = '0.01'; + +# Configure the application. +# +# Note that settings in [% appprefix %].conf (or other external +# configuration file that you set up manually) take precedence +# over this when using ConfigLoader. Thus configuration +# details given here can function as a default configuration, +# with an external configuration file acting as an override for +# local deployment. + +__PACKAGE__->config( name => '[% name %]' ); + +# Start the application +__PACKAGE__->setup(); + + +=head1 NAME + +[% name %] - Catalyst based application + +=head1 SYNOPSIS + + script/[% appprefix %]_server.pl + +=head1 DESCRIPTION + +[enter your description here] + +=head1 SEE ALSO + +L<[% rootname %]>, L + +=head1 AUTHOR + +[% author %] + +=head1 LICENSE + +This library is free software. You can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut + +1; diff --git a/share/makefile.tt b/share/makefile.tt new file mode 100644 index 0000000..a4cfabb --- /dev/null +++ b/share/makefile.tt @@ -0,0 +1,20 @@ +[% startperl %] +# IMPORTANT: if you delete this file your app will not work as +# expected. You have been warned. +use inc::Module::Install; + +name '[% dir %]'; +all_from '[% path %]'; + +requires 'Catalyst::Runtime' => '[% catalyst_version %]'; +requires 'Catalyst::Plugin::ConfigLoader'; +requires 'Catalyst::Plugin::Static::Simple'; +requires 'Catalyst::Action::RenderView'; +requires 'parent'; +requires 'Config::General'; # This should reflect the config file format you've chosen + # See Catalyst::Plugin::ConfigLoader for supported formats +catalyst; + +install_script glob('script/*.pl'); +auto_install; +WriteAll; diff --git a/share/readme.tt b/share/readme.tt new file mode 100644 index 0000000..f3db064 --- /dev/null +++ b/share/readme.tt @@ -0,0 +1 @@ +Run script/[% appprefix %]_server.pl to test the application. diff --git a/share/script/cgi.tt b/share/script/cgi.tt new file mode 100644 index 0000000..e68ffa4 --- /dev/null +++ b/share/script/cgi.tt @@ -0,0 +1,37 @@ +[% startperl %] + +BEGIN { $ENV{CATALYST_ENGINE} ||= 'CGI' } + +use strict; +use warnings; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use [% name %]; + +[% name %]->run; + +1; + +=head1 NAME + +[% appprefix %]_cgi.pl - Catalyst CGI + +=head1 SYNOPSIS + +See L + +=head1 DESCRIPTION + +Run a Catalyst application as a cgi script. + +=head1 AUTHORS + +Catalyst Contributors, see Catalyst.pm + +=head1 COPYRIGHT + + +This library is free software. You can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/share/script/create.tt b/share/script/create.tt new file mode 100644 index 0000000..54603ac --- /dev/null +++ b/share/script/create.tt @@ -0,0 +1,85 @@ +[% startperl %] + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +eval "use Catalyst::Helper;"; + +if ($@) { + die < \$force, + 'mech|mechanize' => \$mech, + 'help|?' => \$help + ); + +pod2usage(1) if ( $help || !$ARGV[0] ); + +my $helper = Catalyst::Helper->new( { '.newfiles' => !$force, mech => $mech } ); + +pod2usage(1) unless $helper->mk_component( '[% name %]', @ARGV ); + +1; + +=head1 NAME + +[% appprefix %]_create.pl - Create a new Catalyst Component + +=head1 SYNOPSIS + +[% appprefix %]_create.pl [options] model|view|controller name [helper] [options] + + Options: + -force don't create a .new file where a file to be created exists + -mechanize use Test::WWW::Mechanize::Catalyst for tests if available + -help display this help and exits + + Examples: + [% appprefix %]_create.pl controller My::Controller + [% appprefix %]_create.pl -mechanize controller My::Controller + [% appprefix %]_create.pl view My::View + [% appprefix %]_create.pl view MyView TT + [% appprefix %]_create.pl view TT TT + [% appprefix %]_create.pl model My::Model + [% appprefix %]_create.pl model SomeDB DBIC::Schema MyApp::Schema create=dynamic\ + dbi:SQLite:/tmp/my.db + [% appprefix %]_create.pl model AnotherDB DBIC::Schema MyApp::Schema create=static\ + dbi:Pg:dbname=foo root 4321 + + See also: + perldoc Catalyst::Manual + perldoc Catalyst::Manual::Intro + +=head1 DESCRIPTION + +Create a new Catalyst Component. + +Existing component files are not overwritten. If any of the component files +to be created already exist the file will be written with a '.new' suffix. +This behavior can be suppressed with the C<-force> option. + +=head1 AUTHORS + +Catalyst Contributors, see Catalyst.pm + +=head1 COPYRIGHT + +This library is free software. You can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/share/script/fastcgi.tt b/share/script/fastcgi.tt new file mode 100644 index 0000000..7c2218f --- /dev/null +++ b/share/script/fastcgi.tt @@ -0,0 +1,79 @@ +[% startperl %] + +BEGIN { $ENV{CATALYST_ENGINE} ||= 'FastCGI' } + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use [% name %]; + +my $help = 0; +my ( $listen, $nproc, $pidfile, $manager, $detach, $keep_stderr ); + +GetOptions( + 'help|?' => \$help, + 'listen|l=s' => \$listen, + 'nproc|n=i' => \$nproc, + 'pidfile|p=s' => \$pidfile, + 'manager|M=s' => \$manager, + 'daemon|d' => \$detach, + 'keeperr|e' => \$keep_stderr, +); + +pod2usage(1) if $help; + +[% name %]->run( + $listen, + { nproc => $nproc, + pidfile => $pidfile, + manager => $manager, + detach => $detach, + keep_stderr => $keep_stderr, + } +); + +1; + +=head1 NAME + +[% appprefix %]_fastcgi.pl - Catalyst FastCGI + +=head1 SYNOPSIS + +[% appprefix %]_fastcgi.pl [options] + + Options: + -? -help display this help and exits + -l -listen Socket path to listen on + (defaults to standard input) + can be HOST:PORT, :PORT or a + filesystem path + -n -nproc specify number of processes to keep + to serve requests (defaults to 1, + requires -listen) + -p -pidfile specify filename for pid file + (requires -listen) + -d -daemon daemonize (requires -listen) + -M -manager specify alternate process manager + (FCGI::ProcManager sub-class) + or empty string to disable + -e -keeperr send error messages to STDOUT, not + to the webserver + +=head1 DESCRIPTION + +Run a Catalyst application as fastcgi. + +=head1 AUTHORS + +Catalyst Contributors, see Catalyst.pm + +=head1 COPYRIGHT + +This library is free software. You can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/share/script/server.tt b/share/script/server.tt new file mode 100644 index 0000000..a2ffc36 --- /dev/null +++ b/share/script/server.tt @@ -0,0 +1,159 @@ +[% startperl %] + +BEGIN { + $ENV{CATALYST_ENGINE} ||= 'HTTP'; + $ENV{CATALYST_SCRIPT_GEN} = [% scriptgen %]; + require Catalyst::Engine::HTTP; +} + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; + +my $debug = 0; +my $fork = 0; +my $help = 0; +my $host = undef; +my $port = $ENV{[% appenv %]_PORT} || $ENV{CATALYST_PORT} || 3000; +my $keepalive = 0; +my $restart = $ENV{[% appenv %]_RELOAD} || $ENV{CATALYST_RELOAD} || 0; +my $background = 0; +my $pidfile = undef; + +my $check_interval; +my $file_regex; +my $watch_directory; +my $follow_symlinks; + +my @argv = @ARGV; + +GetOptions( + 'debug|d' => \$debug, + 'fork|f' => \$fork, + 'help|?' => \$help, + 'host=s' => \$host, + 'port|p=s' => \$port, + 'keepalive|k' => \$keepalive, + 'restart|r' => \$restart, + 'restartdelay|rd=s' => \$check_interval, + 'restartregex|rr=s' => \$file_regex, + 'restartdirectory=s@' => \$watch_directory, + 'followsymlinks' => \$follow_symlinks, + 'background' => \$background, + 'pidfile=s' => \$pidfile, +); + +pod2usage(1) if $help; + +if ( $debug ) { + $ENV{CATALYST_DEBUG} = 1; +} + +# If we load this here, then in the case of a restarter, it does not +# need to be reloaded for each restart. +require Catalyst; + +# If this isn't done, then the Catalyst::Devel tests for the restarter +# fail. +$| = 1 if $ENV{HARNESS_ACTIVE}; + +my $runner = sub { + # This is require instead of use so that the above environment + # variables can be set at runtime. + require [% name %]; + + [% name %]->run( + $port, $host, + { + argv => \@argv, + 'fork' => $fork, + keepalive => $keepalive, + background => $background, + pidfile => $pidfile, + } + ); +}; + +if ( $restart ) { + die "Cannot run in the background and also watch for changed files.\n" + if $background; + + require Catalyst::Restarter; + + my $subclass = Catalyst::Restarter->pick_subclass; + + my %args; + $args{follow_symlinks} = 1 + if $follow_symlinks; + $args{directories} = $watch_directory + if defined $watch_directory; + $args{sleep_interval} = $check_interval + if defined $check_interval; + $args{filter} = qr/$file_regex/ + if defined $file_regex; + + my $restarter = $subclass->new( + %args, + start_sub => $runner, + ); + + $restarter->run_and_watch; +} +else { + $runner->(); +} + +1; + +=head1 NAME + +[% appprefix %]_server.pl - Catalyst Testserver + +=head1 SYNOPSIS + +[% 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 + -host host (defaults to all) + -p -port port (defaults to 3000) + -k -keepalive enable keep-alive connections + -r -restart restart when files get modified + (defaults to false) + -rd -restartdelay delay between file checks + (ignored if you have Linux::Inotify2 installed) + -rr -restartregex regex match files that trigger + a restart when modified + (defaults to '\.yml$|\.yaml$|\.conf|\.pm$') + -restartdirectory the directory to search for + modified files, can be set mulitple times + (defaults to '[SCRIPT_DIR]/..') + -follow_symlinks follow symlinks in search directories + (defaults to false. this is a no-op on Win32) + -background run the process in the background + -pidfile specify filename for pid file + + See also: + perldoc Catalyst::Manual + perldoc Catalyst::Manual::Intro + +=head1 DESCRIPTION + +Run a Catalyst Testserver for this application. + +=head1 AUTHORS + +Catalyst Contributors, see Catalyst.pm + +=head1 COPYRIGHT + +This library is free software. You can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/share/t/apptest.tt b/share/t/apptest.tt new file mode 100644 index 0000000..eb4e09a --- /dev/null +++ b/share/t/apptest.tt @@ -0,0 +1,8 @@ +[% startperl %] +use strict; +use warnings; +use Test::More tests => 2; + +BEGIN { use_ok 'Catalyst::Test', '[% name %]' } + +ok( request('/')->is_success, 'Request should succeed' ); diff --git a/share/t/comptest.tt b/share/t/comptest.tt new file mode 100644 index 0000000..dd2c5e6 --- /dev/null +++ b/share/t/comptest.tt @@ -0,0 +1,23 @@ +use strict; +use warnings; +[% IF long_type == 'Controller' %][% IF mech %]use Test::More; + +eval "use Test::WWW::Mechanize::Catalyst '[% app %]'"; +plan $@ + ? ( skip_all => 'Test::WWW::Mechanize::Catalyst required' ) + : ( tests => 2 ); + +ok( my $mech = Test::WWW::Mechanize::Catalyst->new, 'Created mech object' ); + +$mech->get_ok( 'http://localhost[% uri %]' ); +[% ELSE %]use Test::More tests => 3; + +BEGIN { use_ok 'Catalyst::Test', '[% app %]' } +BEGIN { use_ok '[% class %]' } + +ok( request('[% uri %]')->is_success, 'Request should succeed' ); +[% END %] +[% ELSE %]use Test::More tests => 1; + +BEGIN { use_ok '[% class %]' } +[% END %] diff --git a/share/t/podcoveragetest.tt b/share/t/podcoveragetest.tt new file mode 100644 index 0000000..38147ef --- /dev/null +++ b/share/t/podcoveragetest.tt @@ -0,0 +1,10 @@ +[% startperl %] +use strict; +use warnings; +use Test::More; + +eval "use Test::Pod::Coverage 1.04"; +plan skip_all => 'Test::Pod::Coverage 1.04 required' if $@; +plan skip_all => 'set TEST_POD to enable this test' unless $ENV{TEST_POD}; + +all_pod_coverage_ok(); diff --git a/share/t/podtest.tt b/share/t/podtest.tt new file mode 100644 index 0000000..64fabdd --- /dev/null +++ b/share/t/podtest.tt @@ -0,0 +1,10 @@ +[% startperl %] +use strict; +use warnings; +use Test::More; + +eval "use Test::Pod 1.14"; +plan skip_all => 'Test::Pod 1.14 required' if $@; +plan skip_all => 'set TEST_POD to enable this test' unless $ENV{TEST_POD}; + +all_pod_files_ok(); diff --git a/share/t/test.tt b/share/t/test.tt new file mode 100644 index 0000000..e5cd5e0 --- /dev/null +++ b/share/t/test.tt @@ -0,0 +1,53 @@ +[% startperl %] + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use Catalyst::Test '[% name %]'; + +my $help = 0; + +GetOptions( 'help|?' => \$help ); + +pod2usage(1) if ( $help || !$ARGV[0] ); + +print request($ARGV[0])->content . "\n"; + +1; + +=head1 NAME + +[% appprefix %]_test.pl - Catalyst Test + +=head1 SYNOPSIS + +[% appprefix %]_test.pl [options] uri + + Options: + -help display this help and exits + + Examples: + [% appprefix %]_test.pl http://localhost/some_action + [% appprefix %]_test.pl /some_action + + See also: + perldoc Catalyst::Manual + perldoc Catalyst::Manual::Intro + +=head1 DESCRIPTION + +Run a Catalyst action from the command line. + +=head1 AUTHORS + +Catalyst Contributors, see Catalyst.pm + +=head1 COPYRIGHT + +This library is free software. You can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/t/check_invocation.t b/t/check_invocation.t new file mode 100644 index 0000000..cc7aaa1 --- /dev/null +++ b/t/check_invocation.t @@ -0,0 +1,26 @@ +use strict; +use warnings; + +use FindBin qw/$Bin/; +use Test::More test => 1; + +use lib "$Bin/../lib"; + +use Catalyst::Helper; + +my $helper = Catalyst::Helper->new( + { + '.newfiles' => !$force, + 'makefile' => $makefile, + 'scripts' => $scripts, + 'short' => $short, + } +); + +sub mk_compclass { + my ( $self, $helper ) = @_; + my $file = $helper->{file}; + $helper->render_file( 'compclass.tt', $file ); +} + +ok( $helper->mk_app("TestAppForInvocation"), "app invocation still works");