X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FHelper.pm;h=ecba3064eb8a6fd1184becbb512ac65276e6fc01;hb=2cb998f9641810b7479af3dafaf2190f5a0d0cce;hp=508e7788ab85e32e38739a9ccb67336a516eb1f3;hpb=3c24e97e23801a20139ce3c2153f20034a1b5dbe;p=catagits%2FCatalyst-Devel.git diff --git a/lib/Catalyst/Helper.pm b/lib/Catalyst/Helper.pm index 508e778..ecba306 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; @@ -28,20 +31,43 @@ Catalyst::Helper - Bootstrap a Catalyst application =cut + + sub get_sharedir_file { my ($self, @filename) = @_; - my $file = file( dist_dir('Catalyst-Devel'), @filename); - warn $file; + my $dist_dir; + if (-d "inc/.author") { # Can't use sharedir if we're in a checkout + # this feels horrible, better ideas? + $dist_dir = 'share'; + } + else { + $dist_dir = dist_dir('Catalyst-Devel'); + } + my $file = file( $dist_dir, @filename); my $contents = $file->slurp; return $contents; } +# Do not touch this method, *EVER*, it is needed for back compat. sub get_file { - my ( $self, $file ) = @_; - - return $self->get_sharedir_file($file); + my ( $self, $class, $file ) = @_; + unless ( $cache{$class} ) { + local $/; + $cache{$class} = eval "package $class; "; + } + my $data = $cache{$class}; + Carp::confess("Could not get data from __DATA__ segment for $class") + unless $data; + my @files = split /^__(.+)__\r?\n/m, $data; + shift @files; + while (@files) { + my ( $name, $content ) = splice @files, 0, 2; + return $content if $name eq $file; + } + return 0; } + sub mk_app { my ( $self, $name ) = @_; @@ -202,7 +228,7 @@ sub mk_dir { sub mk_file { my ( $self, $file, $content ) = @_; - if ( -e $file ) { + if ( -e $file && -s _ ) { print qq/ exists "$file"\n/; return 0 unless ( $self->{'.newfiles'} @@ -246,16 +272,31 @@ sub next_test { return File::Spec->catfile( $dir, "$type\_$tname" ); } +# Do not touch this method, *EVER*, it is needed for back compat. +## addendum: we had to split this method so we could have backwards +## compatability. otherwise, we'd have no way to pass stuff from __DATA__ + sub render_file { my ( $self, $file, $path, $vars ) = @_; + my $template = $self->get_file( ( caller(0) )[0], $file ); + $self->render_file_contents($template, $path, $vars); +} + +sub render_sharedir_file { + my ( $self, $file, $path, $vars ) = @_; + my $template = $self->get_sharedir_file( $file ); + $self->render_file_contents($template, $path, $vars); +} + +sub render_file_contents { + my ( $self, $template, $path, $vars ) = @_; $vars ||= {}; my $t = Template->new; - my $template = $self->get_sharedir_file( 'root', $file ); return 0 unless $template; my $output; $t->process( \$template, { %{$self}, %$vars }, \$output ) || Catalyst::Exception->throw( - message => qq/Couldn't process "$file", / . $t->error() ); + message => qq/Couldn't process "$template", / . $t->error() ); $self->mk_file( $path, $output ); } @@ -308,12 +349,12 @@ sub _mk_dirs { sub _mk_appclass { my $self = shift; my $mod = $self->{mod}; - $self->render_file( 'appclass.tt', "$mod.pm" ); + $self->render_sharedir_file( 'lib/MyApp.pm.tt', "$mod.pm" ); } sub _mk_rootclass { my $self = shift; - $self->render_file( 'rootclass.tt', + $self->render_sharedir_file( 'lib/MyApp/Controller/Root.pm.tt', File::Spec->catfile( $self->{c}, "Root.pm" ) ); } @@ -322,7 +363,7 @@ sub _mk_makefile { $self->{path} = File::Spec->catfile( 'lib', split( '::', $self->{name} ) ); $self->{path} .= '.pm'; my $dir = $self->{dir}; - $self->render_file( 'makefile.tt', "$dir\/Makefile.PL" ); + $self->render_sharedir_file( 'Makefile.PL.tt', "$dir\/Makefile.PL" ); if ( $self->{makefile} ) { @@ -336,36 +377,36 @@ sub _mk_config { my $self = shift; my $dir = $self->{dir}; my $appprefix = $self->{appprefix}; - $self->render_file( 'config.tt', + $self->render_sharedir_file( 'myapp.conf.tt', File::Spec->catfile( $dir, "$appprefix.conf" ) ); } sub _mk_readme { my $self = shift; my $dir = $self->{dir}; - $self->render_file( 'readme.tt', "$dir\/README" ); + $self->render_sharedir_file( 'README.tt', "$dir\/README" ); } sub _mk_changes { my $self = shift; my $dir = $self->{dir}; my $time = strftime('%Y-%m-%d %H:%M:%S', localtime time); - $self->render_file( 'changes.tt', "$dir\/Changes", { time => $time } ); + $self->render_sharedir_file( 'Changes.tt', "$dir\/Changes", { time => $time } ); } sub _mk_apptest { my $self = shift; my $t = $self->{t}; - $self->render_file( 'apptest.tt', "$t\/01app.t" ); - $self->render_file( 'podtest.tt', "$t\/02pod.t" ); - $self->render_file( 'podcoveragetest.tt', "$t\/03podcoverage.t" ); + $self->render_sharedir_file( 't/01app.t.tt', "$t\/01app.t" ); + $self->render_sharedir_file( 't/02pod.t.tt', "$t\/02pod.t" ); + $self->render_sharedir_file( 't/03podcoverage.t.tt', "$t\/03podcoverage.t" ); } sub _mk_cgi { my $self = shift; my $script = $self->{script}; my $appprefix = $self->{appprefix}; - $self->render_file( 'cgi.tt', "$script\/$appprefix\_cgi.pl" ); + $self->render_sharedir_file( 'script/myapp_cgi.pl.tt', "$script\/$appprefix\_cgi.pl" ); chmod 0700, "$script/$appprefix\_cgi.pl"; } @@ -373,7 +414,7 @@ sub _mk_fastcgi { my $self = shift; my $script = $self->{script}; my $appprefix = $self->{appprefix}; - $self->render_file( 'fastcgi.tt', "$script\/$appprefix\_fastcgi.pl" ); + $self->render_sharedir_file( 'script/myapp_fastcgi.pl.tt', "$script\/$appprefix\_fastcgi.pl" ); chmod 0700, "$script/$appprefix\_fastcgi.pl"; } @@ -381,7 +422,7 @@ sub _mk_server { my $self = shift; my $script = $self->{script}; my $appprefix = $self->{appprefix}; - $self->render_file( 'server.tt', "$script\/$appprefix\_server.pl" ); + $self->render_sharedir_file( 'script/myapp_server.pl.tt', "$script\/$appprefix\_server.pl" ); chmod 0700, "$script/$appprefix\_server.pl"; } @@ -389,7 +430,7 @@ sub _mk_test { my $self = shift; my $script = $self->{script}; my $appprefix = $self->{appprefix}; - $self->render_file( 'test.tt', "$script/$appprefix\_test.pl" ); + $self->render_sharedir_file( 'script/myapp_test.pl.tt', "$script/$appprefix\_test.pl" ); chmod 0700, "$script/$appprefix\_test.pl"; } @@ -397,20 +438,20 @@ sub _mk_create { my $self = shift; my $script = $self->{script}; my $appprefix = $self->{appprefix}; - $self->render_file( 'create.tt', "$script\/$appprefix\_create.pl" ); + $self->render_sharedir_file( 'script/myapp_create.pl.tt', "$script\/$appprefix\_create.pl" ); chmod 0700, "$script/$appprefix\_create.pl"; } sub _mk_compclass { my $self = shift; my $file = $self->{file}; - return $self->render_file( 'compclass.tt', "$file" ); + return $self->render_sharedir_file( 'myapp_compclass.pl.tt', "$file" ); } sub _mk_comptest { my $self = shift; my $test = $self->{test}; - $self->render_file( 'comptest.tt', "$test" ); + $self->render_sharedir_file( 'comptest.tt', "$test" ); ## wtf do i rename this to? } sub _mk_images { @@ -421,7 +462,7 @@ sub _mk_images { btn_120x50_powered btn_120x50_powered_shadow btn_88x31_built btn_88x31_built_shadow btn_88x31_powered btn_88x31_powered_shadow/; for my $name (@images) { - my $image = $self->get_file("$name.png"); + my $image = $self->get_sharedir_file("root", "static", "images", "$name.png.bin"); $self->mk_file( File::Spec->catfile( $images, "$name.png" ), $image ); } } @@ -429,7 +470,7 @@ sub _mk_images { sub _mk_favicon { my $self = shift; my $root = $self->{root}; - my $favicon = $self->get_sharedir_file( 'root', 'favicon.ico' ); + my $favicon = $self->get_sharedir_file( 'root', 'favicon.ico.bin' ); my $dest = File::Spec->catfile( $root, "favicon.ico" ); $self->mk_file( $dest, $favicon ); @@ -456,6 +497,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 @@ -615,6 +692,31 @@ Writes content to a file. Called by L. Calculates the name of the next numbered test file and returns it. Don't give the number or the .t suffix for the test name. +=head2 Dir + +Alias for L + +=cut + +=head2 get_sharedir_file + +Method for getting a file out of share/ + +=cut + +=head2 render_file_contents + +Process a L template. + +=cut + +=head2 render_sharedir_file + +Render a template/image file from our share directory + +=cut + + =head1 NOTE The helpers will read author name from /etc/passwd by default.