/usr/local/CPAN/SweetPea-Cli/SweetPea/Cli/Make.pm
package SweetPea::Cli::Make;
use warnings;
use strict;
use SweetPea::Application;
use SweetPea::Cli::Util;
use SweetPea::Cli::Flash;
use SweetPea::Cli::Error;
use SweetPea::Cli::Help;
# SweetPea::Cli::Make - Application builder for use with SweetPea-Cli
my @return = (
'SweetPea application files were created successfully.',
'',
'Attention, you may need to fix permissions for generated files.',
'Remember to secure your application, try the following commands:',
'',
'sudo chown -R www-data *',
'sudo chmod -R 0700 *',
'sudo chmod -R 0755 static/ .htaccess .routes .pl',
'',
'Next! Create database data profiles. See help data;'
);
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
my $c = $self->{c} = shift;
my $f = SweetPea::Cli::Flash->new;
my $e = SweetPea::Cli::Error->new;
$self->{commands} = [
{
name => 'make',
code => sub {
$self->make(@_)
},
args => {
'script' => {
aliases => ['s']
},
'basic' => {
aliases => ['b']
},
'stack' => {
aliases => ['f']
},
'profile' => {
aliases => ['p']
}
},
help => 'generate a script, basic or full-stack app.'
}
];
return $self;
}
sub make {
my $self = shift;
my $c = shift;
my $f = SweetPea::Cli::Flash->new;
my $e = SweetPea::Cli::Error->new;
my $u = SweetPea::Cli::Util->new;
my $h = SweetPea::Cli::Help->new;
my $type;
if ($c->options->{basic}) {
# build basic app
return $self->basic($c);
}
elsif ($c->options->{script}) {
# build script-only app
return $self->script($c);
}
elsif ($c->options->{stack}) {
# build full-stack app
return $self->stack($c);
}
elsif ($c->options->{profile}) {
# build data profile
return $self->profile($c);
}
else {
return $h->display('make', $c);
}
}
sub script {
my $self = shift;
my $c = shift;
my $f = SweetPea::Cli::Flash->new;
my $e = SweetPea::Cli::Error->new;
my $u = SweetPea::Cli::Util->new;
# make files
$self->_write(0755, '.htaccess', 'generated/htaccess.tt');
$self->_write(0755, '.pl', 'generated/script/pl.tt');
$self->_write(0754, '.server', 'generated/server.tt');
$self->_write(0755, 'routes.pl', 'generated/routes.tt');
$self->_write(0754, 'extras/Makefile.PL', 'generated/makefile.tt');
$self->_write(0754, 'extras/TODO', 'placeholder');
$self->_write(0754, 'extras/Changes', 'placeholder');
return $f->flash(@return)->report($c);
}
sub basic {
my $self = shift;
my $c = shift;
my $f = SweetPea::Cli::Flash->new;
my $e = SweetPea::Cli::Error->new;
my $u = SweetPea::Cli::Util->new;
# make files
$self->_write(0755, '.htaccess', 'generated/htaccess.tt');
$self->_write(0755, '.pl', 'generated/basic/pl.tt');
$self->_write(0754, '.server', 'generated/server.tt');
$self->_write(0755, 'routes.pl', 'generated/routes.tt');
$self->_write(0754, 'sweet/application/Controller/Root.pm', 'generated/controller/root.tt');
$self->_write(0754, 'sweet/application/Controller/Sweet.pm', 'generated/controller/basic/sweet.tt');
$self->_write(0754, 'sweet/application/Model/Schema.pm', 'generated/model/schema.tt');
$self->_write(0754, 'sweet/application/View/Main.pm', 'generated/view/main.tt');
$self->_write(0754, 'sweet/App.pm', 'generated/app.tt');
$self->_write(0777, 'sweet/sessions/empty', 'placeholder');
$self->_write(0754, 'sweet/templates/empty', 'placeholder');
$self->_write(0755, 'static/empty', 'placeholder');
$self->_write(0754, 'extras/Makefile.PL', 'generated/makefile.tt');
$self->_write(0754, 'extras/TODO', 'placeholder');
$self->_write(0754, 'extras/Changes', 'placeholder');
return $f->flash(@return)->report($c);
}
sub stack {
my $self = shift;
my $c = shift;
my $f = SweetPea::Cli::Flash->new;
my $e = SweetPea::Cli::Error->new;
# make files
$self->_write(0755, '.htaccess', 'generated/htaccess.tt');
$self->_write(0755, '.pl', 'generated/stack/pl.tt');
$self->_write(0755, 'routes.pl', 'generated/routes.tt');
$self->_write(0754, '.server', 'generated/server.tt');
$self->_write(0754, 'sweet/application/Controller/Root.pm', 'generated/controller/root.tt');
$self->_write(0754, 'sweet/application/Controller/Sweet.pm', 'generated/controller/stack/sweet.tt');
$self->_write(0754, 'sweet/application/Model/Schema.pm', 'generated/model/schema.tt');
$self->_write(0754, 'sweet/application/View/Main.pm', 'generated/view/main.tt');
$self->_write(0754, 'sweet/App.pm', 'generated/app.tt');
$self->_write(0777, 'sweet/sessions/empty', 'placeholder');
$self->_write(0754, 'sweet/templates/empty', 'placeholder');
$self->_write(0755, 'static/empty', 'placeholder');
$self->_write(0754, 'extras/Makefile.PL', 'generated/makefile.tt');
$self->_write(0754, 'extras/TODO', 'placeholder');
$self->_write(0754, 'extras/Changes', 'placeholder');
$self->_write(0754, 'sweet/configuration/datastores/development/empty', 'placeholder');
$self->_write(0754, 'sweet/configuration/datastores/production/empty', 'placeholder');
$self->_write(0754, 'sweet/configuration/application.yml', 'generated/config/application.tt');
$self->_write(0754, 'sweet/configuration/datastores.yml', 'generated/config/datastores.tt');
$self->_write(0754, 'sweet/configuration/permissions.yml', 'generated/config/permissions.tt');
$self->_write(0754, 'sweet/locales/en.yml', 'generated/locale/english.tt');
$self->_write(0754, 'sweet/templates/elements/form.tt', 'generated/element/form.tt');
$self->_write(0754, 'sweet/templates/elements/grid.tt', 'generated/element/grid.tt');
$self->_write(0754, 'sweet/templates/layouts/default.tt', 'data');
$self->_write(0754, 'sweet/templates/index.tt', 'Now go be fruitful and multiply.');
$self->_write(0754, 'extras/t/00-load.t', 'generated/stack/test-00.tt');
return $f->flash(@return)->report($c);
}
sub profile {
my $self = shift;
my $c = shift;
my $f = SweetPea::Cli::Flash->new;
my $e = SweetPea::Cli::Error->new;
my $u = SweetPea::Cli::Util->new;
my $profile = $c->argv->[0];
if ($profile) {
$profile =~ s/^[\\\/]+//;
$profile =~ s/\.yml$//;
$profile =~ s/\\/\//g;
$profile .= '.yml';
# make files
$self->_write(0754, "sweet/configuration/$profile", 'generated/config/profile/new.tt');
my @return = (
"Data profile $profile created successfully."
);
return $f->flash(@return)->report($c);
}
else {
my @return = (
'No data profile specified. Use `help make;` for instructions.'
);
return $e->error(@return)->report($c);
}
}
sub _write {
my $self = shift;
my ($mask, $to, $from, $type) = @_;
my $f = SweetPea::Cli::Flash->new;
my $e = SweetPea::Cli::Error->new;
my $u = SweetPea::Cli::Util->new;
my $stash = {
shebang => $^X,
sver => $SweetPea::VERSION,
saver => $SweetPea::Application::VERSION,
head => '---',
fruitful => 'Now go be fruitful and multiply.',
};
my $content = '';
if ($from eq "placeholder") {
$content = "placeholder";
}
elsif ($from eq "data") {
$content .= $_ while (<DATA>);
}
else {
if ($from !~ /\.tt$/) {
$content = $from;
}
else {
$content = $u->template($from, $stash);
}
}
$u->makefile(
'file' => $to,
'content' => $content,
'bitmask' => $mask
);
}
1; # End of SweetPea::Cli::Make
__DATA__
<!doctype html>
<head><title>Welcome to the SweetPea Web Framework</title></head>
<body>
<h2>Thanks for trying the SweetPea-Application Web Framework!</h2>
SweetPea::Application is a full stack web application framework
utilizing conventional wisdom and granular configuration over a highly
sophisticated Push MVC architecture.<br/>
[% content %]
</body>
</html>