App-CatalystStarter-Bloated
view release on metacpan or search on metacpan
lib/App/CatalystStarter/Bloated.pm view on Meta::CPAN
my $tt_pm = _catalyst_path( "TT" );
if ( not -f $tt_pm ) {
l->error( "View module not found where it should be, exiting. " .
"You have to:\n 1: change ext to .tt2 and\n 2: set WRAPPER to wrapper.tt2." );
return;
}
## trust regex to modify the file
my $pm = $tt_pm->slurp;
if ( $pm =~ s/(TEMPLATE_EXTENSION\s*=>\s*'.tt)(',)/${1}2$2/ ) {
l->debug("Changed template extension to .tt2");
}
else {
l->warn("Failed changing template extension to .tt2");
}
if ( $pm =~ s/^(__PACKAGE__->config\()(\s+)/$1$2WRAPPER => 'wrapper.tt2',$2/ms ) {
l->debug( "Added wrapper.tt2" );
}
else {
l->warn( "Failed adding wrapper to view" );
}
$tt_pm->spew( $pm );
## alter config to set default view
my $p = _catalyst_path( "lib", $ARGV{'--name'}.".pm" );
my $config = $p->slurp;
if ( $config =~ s/^(__PACKAGE__->config\()(\s+)/$1$2default_view => '$ARGV{"--TT"}',$2/ms ) {
l->debug( "Configured default view: " . $ARGV{'--TT'} );
$p->spew( $config );
}
else {
l->warn( "Failed configuring default view" );
}
_catalyst_path( "root", "index.tt2" )->spew
( "Welcome to the brand new [% c.config.name %]!" );
l->debug( "Wrote a basic index.tt2" );
_catalyst_path( "root", "wrapper.tt2" )->spew
( "[% content %]\n" );
l->debug( "Wrote an empty wrapper.tt2" );
## make index run template
my $r = _catalyst_path( "C", "Root.pm" );
my $substitute_this = q[$c->response->body( $c->welcome_message );];
(my $root = $r->slurp) =~ s|\Q$substitute_this|# $&| and l->debug( "Commented response body message in sub index" );
$r->spew( $root );
l->info( sprintf "Created TT view as %s::View::%s",
@ARGV{qw/--name --TT/}
);
_verify_TT_view();
_verify_Root_index();
} ## create.tt
sub _create_JSON {
return unless my $json = $ARGV{"--JSON"};
_run_system( _creater() => "view", $json, "JSON" );
my $p = _catalyst_path( "JSON" );
my $json_code = $p->slurp;
my $extra = <<'JSON';
__PACKAGE__->config(
# expose only the json key in stash
expose_stash => [ qw(json) ],
);
JSON
if ( not $json_code =~ s/use base 'Catalyst::View::JSON';/$&\n$extra/ ) {
# l->error("failed configuring expose_stash in json");
}
$p->spew( $json_code );
l->info( sprintf "Created JSON view as %s::View::%s",
@ARGV{qw/--name --JSON/}
);
_verify_JSON_view();
} ## create_json.tt
sub _mk_views {
if ( $ARGV{'--TT'} ) {
_create_TT;
}
if ( $ARGV{'--JSON'} ) {
_create_JSON;
}
}
sub _mk_model {
return unless my $model_name = $ARGV{'--model'};
_run_system( _creater() => "model", $model_name,
"DBIC::Schema", $ARGV{'--schema'},
"create=static",
@ARGV{qw/--dsn --dbuser --dbpass/},
);
l->info(sprintf "Created model: dsn=%s, model=%s and schema=%s",
@ARGV{qw/--dsn --model --schema/}
);
}
sub _mk_html5 {
if ( not $ARGV{'--html5'} ) {
return
}
App::CatalystStarter::Bloated::Initializr::deploy( _catalyst_path("root") );
_catalyst_path( "root", "index.tt2" )->spew(<<'EOS');
<div class="row">
<div class="col-lg-4">
<h2>Hi there</h2>
<p>Welcome to the brand new [% c.config.name %]!</p>
</div>
<div class="col-lg-4">
<h2>Nav bar on top</h2>
<p>Nav bar setup is easily parameterized or edited in source.</p>
</div>
<div class="col-lg-4">
<h2>Jumbotron</h2>
<p>The Jumbotron goes away is c->stash->{jumbotron} is not set. The
template comes from initializr.com. More templates will come in future
updates.</p>
<p><a class="btn btn-default" href="http://www.initializr.com">View details »</a></p>
</div>
</div>
EOS
my $p = _catalyst_path( "C", "Root.pm" );
my $substitute_this = q[$c->response->body( $c->welcome_message );];
my $with_this = q[$c->stash->{jumbotron} = { header => "Splashy message", body => "This is a 'jumbotron' header, view source and check Root controller for details" };] . "\n";
(my $root = $p->slurp) =~ s|(?:# )?\Q$substitute_this|$&\n $with_this|
or l->error("Failed inserting jumbotron");
$p->spew( $root );
_verify_Root_jumbatron();
}
## test related
sub _test_new_cat {
return if $ARGV{'--notest'};
chdir $cat_dir;
## Assumes cwd is at cat_dir
if ( _run_system "perl" => "Makefile.PL" ) {
l->error( "Makefile.PL failed" );
return;
}
elsif ( _run_system "make" ) {
l->error( "make failed" );
return;
}
elsif ( _run_system "make" => "test" ) {
l->error( "make test failed" );
return;
}
l->info( "Catalyst tests ok" );
chdir "..";
}
sub _verify_TT_view {
my $view_file = $_[0] || _catalyst_path( "TT" );
return if not defined $view_file;
eval { require $view_file };
if ( $@ ) {
l->error( "$view_file contains errors and must be edited by hand." );
l->error( "$@" );
return;
}
my $view_class = $ARGV{'--name'} . "::View::" . $ARGV{'--TT'};
my $cnf = $view_class->config;
if ( not defined $cnf->{WRAPPER} or $cnf->{WRAPPER} ne "wrapper.tt2" ) {
l->error( "$view_class didn't get WRAPPER properly configured, must be fixed manually." );
}
if ( not defined $cnf->{TEMPLATE_EXTENSION} or $cnf->{TEMPLATE_EXTENSION} ne ".tt2" ) {
l->error( "$view_class didn't get TEMPLATE_EXTENSION properly configured, must be fixed manually." );
}
l->debug( "Modifications to TT view ok" );
} ## verify_tt.t
sub _verify_Root_index {
my $root_controller_file = $_[0] || _catalyst_path( "C", "Root.pm" );
if ( not ref $root_controller_file ) {
$root_controller_file = path( $root_controller_file );
}
my $root_controller = $root_controller_file->slurp;
if ( $root_controller =~ /^\s+\$c->response->body.*welcome_message/m ) {
l->error( "Failed fixing Root controller. Comment out the response body line." );
l->error( "Root contents:" );
l->error( $root_controller );
}
l->debug( "Root controller set to run index.tt2" );
}
sub _verify_Root_jumbatron {
my $root_controller_file = $_[0] || _catalyst_path( "C", "Root.pm" );
if ( not ref $root_controller_file ) {
$root_controller_file = path( $root_controller_file );
}
my $root_controller = $root_controller_file->slurp;
if ( $root_controller !~ /stash.*jumbotron.*header.*body/ ) {
l->error( "Failed adding jumbotron example to Root controller" );
}
l->debug( "Sample jumbotron data added to Root controller" );
}
sub _verify_JSON_view {
my $view_file = $_[0] || _catalyst_path( "JSON" );
return if not defined $view_file;
eval { require $view_file };
if ( $@ ) {
l->error( "$view_file contains errors and must be edited by hand." );
l->error( "$@" );
return;
}
my $view_class = $ARGV{'--name'} . "::View::" . $ARGV{'--JSON'};
my $cnf = $view_class->config;
if ( not defined $cnf->{expose_stash} or
ref $cnf->{expose_stash} ne "ARRAY" or
$cnf->{expose_stash}[0] ne "json"
) {
l->error( "$view_class didn't get expose_stash properly configured, ".
"must be fixed manually, expected to be ['json']." );
}
l->debug( "Modifications to JSON view ok" );
} ## verify_json.t
## This does it all
sub run {
## complete with logic not covered in G::E
_finalize_argv;
## 1: Create a catalyst
_mk_app;
## 2: Create views
_mk_views;
## 3: Make model
_mk_model;
## 4: setup html template
_mk_html5;
## 5: test new catalyst
_test_new_cat;
l->info( "Catalyst setup done" );
}
1; # Magic true value required at end of module
__END__
=encoding utf8
=head1 NAME
App::CatalystStarter::Bloated - Creates a catalyst app, a TT view, a model and a HTML5 wrapper template from initalizr.com.
=head1 VERSION
This document describes App::CatalystStarter::Bloated version 0.9.3
=head1 SYNOPSIS
# dont use this module, use the installed script
# catalyst-fatstart.pl instead
=head1 DESCRIPTION
This distribution provides an alternative script to start catalyst
projects: catalyst-fatstart.pl
This script takes a number of options, see catalyst-fatstart.pl
--usage , --man and --help
In short it does the following:
=over
=item *
Calls catalyst.pl to create the catalyst project
( run in 3.489 seconds using v1.01-cache-2.11-cpan-0bb4e1dffa6 )