From: Robert 'phaylon' Sedlacek Date: Sat, 1 Aug 2009 00:27:36 +0000 (+0200) Subject: added example application X-Git-Tag: 0.001~1 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=aa7921c5f6441fede177c448fd95898eb53c40d0;hp=eebffd0a940cb2b6552b6ae21db857ac5f80b481;p=catagits%2FCatalystX-Declare.git added example application --- diff --git a/Makefile.PL b/Makefile.PL index 83d0d37..7a90bbd 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -7,7 +7,8 @@ license 'perl'; all_from 'lib/CatalystX/Declare.pm'; readme_from 'lib/CatalystX/Declare.pm'; -author_tests 'xt'; +tests 't/*.t'; +author_tests 'xt', 'examples/MyApp-Web/t'; requires 'Carp', '1.08'; requires 'Class::Inspector', '1.24'; diff --git a/examples/MyApp-Web/Changes b/examples/MyApp-Web/Changes new file mode 100644 index 0000000..14aa51b --- /dev/null +++ b/examples/MyApp-Web/Changes @@ -0,0 +1,4 @@ +This file documents the revision history for Perl extension MyApp::Web. + +0.01 2009-07-31 21:19:01 + - initial revision, generated by Catalyst diff --git a/examples/MyApp-Web/Makefile.PL b/examples/MyApp-Web/Makefile.PL new file mode 100644 index 0000000..a9f7569 --- /dev/null +++ b/examples/MyApp-Web/Makefile.PL @@ -0,0 +1,21 @@ +#!/usr/bin/env perl +# IMPORTANT: if you delete this file your app will not work as +# expected. You have been warned. +use inc::Module::Install; + +name 'MyApp-Web'; +all_from 'lib/MyApp/Web.pm'; + +requires 'CatalystX::Declare' => '0.001'; +requires 'Catalyst::Runtime' => '5.80007'; +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/examples/MyApp-Web/README b/examples/MyApp-Web/README new file mode 100644 index 0000000..f95e29c --- /dev/null +++ b/examples/MyApp-Web/README @@ -0,0 +1 @@ +Run script/myapp_web_server.pl to test the application. diff --git a/examples/MyApp-Web/lib/MyApp/Web.pm b/examples/MyApp-Web/lib/MyApp/Web.pm new file mode 100644 index 0000000..86b07c5 --- /dev/null +++ b/examples/MyApp-Web/lib/MyApp/Web.pm @@ -0,0 +1,10 @@ +use CatalystX::Declare; + +# specified roles (or rather: plugins) will be passed to ->setup(). +application MyApp::Web + with ConfigLoader + with Static::Simple { + + # the $CLASS variable is automatically provided via CLASS.pm + $CLASS->config(name => 'MyApp-Web'); +} diff --git a/examples/MyApp-Web/lib/MyApp/Web/Controller/Foo.pm b/examples/MyApp-Web/lib/MyApp/Web/Controller/Foo.pm new file mode 100644 index 0000000..a5d5fd9 --- /dev/null +++ b/examples/MyApp-Web/lib/MyApp/Web/Controller/Foo.pm @@ -0,0 +1,34 @@ +use CatalystX::Declare; + +# a normal controller example +controller MyApp::Web::Controller::Foo { + + # this local base action chains to the root /base action + action base under '/base' as 'foo'; + + # all that's below base + under base { + + # say hello + final action hello { + $ctx->stash(hello => 'rendering via root controller role'); + } + + # collecto two ints from the uri + action nums (Int $x, Int $y) as '' under base { + + # stash the two values + $ctx->stash(x => $x, y => $y); + } + + # the nums action above has to two chain parts below it + under nums { + + # one end-point where we add the numbers + final action add { $ctx->res->body( $ctx->stash->{x} + $ctx->stash->{y} ) } + + # and one end-point where we multiply them + final action multiply { $ctx->res->body( $ctx->stash->{x} * $ctx->stash->{y} ) } + } + } +} diff --git a/examples/MyApp-Web/lib/MyApp/Web/Controller/Root.pm b/examples/MyApp-Web/lib/MyApp/Web/Controller/Root.pm new file mode 100644 index 0000000..3f2e3d6 --- /dev/null +++ b/examples/MyApp-Web/lib/MyApp/Web/Controller/Root.pm @@ -0,0 +1,32 @@ +use CatalystX::Declare; + +# we consume a role that does what the RenderView action class +# would normally do +controller MyApp::Web::Controller::Root + with MyApp::Web::ControllerRole::RenderView { + + # $CLASS is provided by CLASS.pm + $CLASS->config(namespace => ''); + + + # this is the common root action for all other actions + action base under '/' as ''; + + # we group all our root actions under the common base + under base { + + # this action catches / + final action root as '' { + + $ctx->response->body( $ctx->welcome_message ); + } + + # this action takes all other /* parts. the (@) signature + # says we don't care about the arguments + final action not_found (@) as '' { + + $ctx->response->body( 'Page Not Found' ); + $ctx->response->status( 404 ); + } + } +} diff --git a/examples/MyApp-Web/lib/MyApp/Web/ControllerRole/RenderView.pm b/examples/MyApp-Web/lib/MyApp/Web/ControllerRole/RenderView.pm new file mode 100644 index 0000000..be42a91 --- /dev/null +++ b/examples/MyApp-Web/lib/MyApp/Web/ControllerRole/RenderView.pm @@ -0,0 +1,37 @@ +use CatalystX::Declare; + +# almost like a normal Moose role +controller_role MyApp::Web::ControllerRole::RenderView { + + # we can use the whole Moose infrastructure + use MooseX::Types::Moose qw( Str ); + + # a normal attribute that can be passed by config + has default_content_type => ( + is => 'ro', + isa => Str, + required => 1, + default => 'text/html; charset=utf-8', + ); + + # this private end action is a cheap ripoff of Catalyst::Action::RenderView + action end (@) { + + # do nothing if rendering wouldn't make sense + return + if $ctx->request->method eq 'HEAD' + or ( defined( $ctx->response->body ) and length( $ctx->response->body ) ) + or $ctx->response->status =~ /^(?:204|3\d\d)$/; + + # set the content type from our attribute unless it is already set + $ctx->response->content_type( $self->default_content_type ) + unless $ctx->response->content_type; + + # find a view + my $view = $ctx->view + or die "Unable to find a view to forward to"; + + # and forward to it + $ctx->forward( $view ); + } +} diff --git a/examples/MyApp-Web/lib/MyApp/Web/View/Hello.pm b/examples/MyApp-Web/lib/MyApp/Web/View/Hello.pm new file mode 100644 index 0000000..39ddf64 --- /dev/null +++ b/examples/MyApp-Web/lib/MyApp/Web/View/Hello.pm @@ -0,0 +1,16 @@ +use MooseX::Declare; + +# nothing special here, so it's just normal MooseX::Declare syntax +class MyApp::Web::View::Hello extends Catalyst::View { + + # the process method is the standard method that is forwarded to + method process (Object $ctx) { + + # render something + $ctx->response->body( + sprintf + '

Hello View: %s

', + ($ctx->stash->{hello} || 'Hello World!'), + ); + } +} diff --git a/examples/MyApp-Web/myapp_web.conf b/examples/MyApp-Web/myapp_web.conf new file mode 100644 index 0000000..fdab707 --- /dev/null +++ b/examples/MyApp-Web/myapp_web.conf @@ -0,0 +1,3 @@ +# rename this file to MyApp::Web.yml and put a ':' in front of 'name' if +# you want to use YAML like in old versions of Catalyst +name MyApp-Web (CatalystX::Declare Example) diff --git a/examples/MyApp-Web/root/favicon.ico b/examples/MyApp-Web/root/favicon.ico new file mode 100644 index 0000000..5ad723d Binary files /dev/null and b/examples/MyApp-Web/root/favicon.ico differ diff --git a/examples/MyApp-Web/root/static/images/btn_120x50_built.png b/examples/MyApp-Web/root/static/images/btn_120x50_built.png new file mode 100644 index 0000000..c709fd6 Binary files /dev/null and b/examples/MyApp-Web/root/static/images/btn_120x50_built.png differ diff --git a/examples/MyApp-Web/root/static/images/btn_120x50_built_shadow.png b/examples/MyApp-Web/root/static/images/btn_120x50_built_shadow.png new file mode 100644 index 0000000..15142fe Binary files /dev/null and b/examples/MyApp-Web/root/static/images/btn_120x50_built_shadow.png differ diff --git a/examples/MyApp-Web/root/static/images/btn_120x50_powered.png b/examples/MyApp-Web/root/static/images/btn_120x50_powered.png new file mode 100644 index 0000000..7249b47 Binary files /dev/null and b/examples/MyApp-Web/root/static/images/btn_120x50_powered.png differ diff --git a/examples/MyApp-Web/root/static/images/btn_120x50_powered_shadow.png b/examples/MyApp-Web/root/static/images/btn_120x50_powered_shadow.png new file mode 100644 index 0000000..e6876c0 Binary files /dev/null and b/examples/MyApp-Web/root/static/images/btn_120x50_powered_shadow.png differ diff --git a/examples/MyApp-Web/root/static/images/btn_88x31_built.png b/examples/MyApp-Web/root/static/images/btn_88x31_built.png new file mode 100644 index 0000000..007b5db Binary files /dev/null and b/examples/MyApp-Web/root/static/images/btn_88x31_built.png differ diff --git a/examples/MyApp-Web/root/static/images/btn_88x31_built_shadow.png b/examples/MyApp-Web/root/static/images/btn_88x31_built_shadow.png new file mode 100644 index 0000000..ccf4624 Binary files /dev/null and b/examples/MyApp-Web/root/static/images/btn_88x31_built_shadow.png differ diff --git a/examples/MyApp-Web/root/static/images/btn_88x31_powered.png b/examples/MyApp-Web/root/static/images/btn_88x31_powered.png new file mode 100644 index 0000000..8f0cd9f Binary files /dev/null and b/examples/MyApp-Web/root/static/images/btn_88x31_powered.png differ diff --git a/examples/MyApp-Web/root/static/images/btn_88x31_powered_shadow.png b/examples/MyApp-Web/root/static/images/btn_88x31_powered_shadow.png new file mode 100644 index 0000000..aa776fa Binary files /dev/null and b/examples/MyApp-Web/root/static/images/btn_88x31_powered_shadow.png differ diff --git a/examples/MyApp-Web/root/static/images/catalyst_logo.png b/examples/MyApp-Web/root/static/images/catalyst_logo.png new file mode 100644 index 0000000..21f1cac Binary files /dev/null and b/examples/MyApp-Web/root/static/images/catalyst_logo.png differ diff --git a/examples/MyApp-Web/script/myapp_web_cgi.pl b/examples/MyApp-Web/script/myapp_web_cgi.pl new file mode 100755 index 0000000..0c92833 --- /dev/null +++ b/examples/MyApp-Web/script/myapp_web_cgi.pl @@ -0,0 +1,37 @@ +#!/usr/bin/env perl + +BEGIN { $ENV{CATALYST_ENGINE} ||= 'CGI' } + +use strict; +use warnings; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use MyApp::Web; + +MyApp::Web->run; + +1; + +=head1 NAME + +myapp_web_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/examples/MyApp-Web/script/myapp_web_create.pl b/examples/MyApp-Web/script/myapp_web_create.pl new file mode 100755 index 0000000..a802efd --- /dev/null +++ b/examples/MyApp-Web/script/myapp_web_create.pl @@ -0,0 +1,85 @@ +#!/usr/bin/env perl + +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( 'MyApp::Web', @ARGV ); + +1; + +=head1 NAME + +myapp_web_create.pl - Create a new Catalyst Component + +=head1 SYNOPSIS + +myapp_web_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: + myapp_web_create.pl controller My::Controller + myapp_web_create.pl -mechanize controller My::Controller + myapp_web_create.pl view My::View + myapp_web_create.pl view MyView TT + myapp_web_create.pl view TT TT + myapp_web_create.pl model My::Model + myapp_web_create.pl model SomeDB DBIC::Schema MyApp::Schema create=dynamic\ + dbi:SQLite:/tmp/my.db + myapp_web_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/examples/MyApp-Web/script/myapp_web_fastcgi.pl b/examples/MyApp-Web/script/myapp_web_fastcgi.pl new file mode 100755 index 0000000..ba33d17 --- /dev/null +++ b/examples/MyApp-Web/script/myapp_web_fastcgi.pl @@ -0,0 +1,79 @@ +#!/usr/bin/env perl + +BEGIN { $ENV{CATALYST_ENGINE} ||= 'FastCGI' } + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use MyApp::Web; + +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; + +MyApp::Web->run( + $listen, + { nproc => $nproc, + pidfile => $pidfile, + manager => $manager, + detach => $detach, + keep_stderr => $keep_stderr, + } +); + +1; + +=head1 NAME + +myapp_web_fastcgi.pl - Catalyst FastCGI + +=head1 SYNOPSIS + +myapp_web_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/examples/MyApp-Web/script/myapp_web_server.pl b/examples/MyApp-Web/script/myapp_web_server.pl new file mode 100755 index 0000000..9830ac4 --- /dev/null +++ b/examples/MyApp-Web/script/myapp_web_server.pl @@ -0,0 +1,159 @@ +#!/usr/bin/env perl + +BEGIN { + $ENV{CATALYST_ENGINE} ||= 'HTTP'; + $ENV{CATALYST_SCRIPT_GEN} = 38; + 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{MYAPP_WEB_PORT} || $ENV{CATALYST_PORT} || 3000; +my $keepalive = 0; +my $restart = $ENV{MYAPP_WEB_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 MyApp::Web; + + MyApp::Web->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 + +myapp_web_server.pl - Catalyst Testserver + +=head1 SYNOPSIS + +myapp_web_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/examples/MyApp-Web/script/myapp_web_test.pl b/examples/MyApp-Web/script/myapp_web_test.pl new file mode 100755 index 0000000..83615b9 --- /dev/null +++ b/examples/MyApp-Web/script/myapp_web_test.pl @@ -0,0 +1,53 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use Catalyst::Test 'MyApp::Web'; + +my $help = 0; + +GetOptions( 'help|?' => \$help ); + +pod2usage(1) if ( $help || !$ARGV[0] ); + +print request($ARGV[0])->content . "\n"; + +1; + +=head1 NAME + +myapp_web_test.pl - Catalyst Test + +=head1 SYNOPSIS + +myapp_web_test.pl [options] uri + + Options: + -help display this help and exits + + Examples: + myapp_web_test.pl http://localhost/some_action + myapp_web_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/examples/MyApp-Web/t/01app.t b/examples/MyApp-Web/t/01app.t new file mode 100644 index 0000000..b929013 --- /dev/null +++ b/examples/MyApp-Web/t/01app.t @@ -0,0 +1,11 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More tests => 2; + +use FindBin; +use lib "$FindBin::Bin/../lib"; + +BEGIN { use_ok 'Catalyst::Test', 'MyApp::Web' } + +ok( request('/')->is_success, 'Request should succeed' );