Skip to content

Commit

Permalink
Merged Lamework
Browse files Browse the repository at this point in the history
  • Loading branch information
vti committed Apr 4, 2011
2 parents fe88edb + aed27ef commit 5ecf944
Show file tree
Hide file tree
Showing 49 changed files with 1,547 additions and 0 deletions.
55 changes: 55 additions & 0 deletions contrib/lamework/Makefile.PL
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/usr/bin/env perl

use 5.008007;

use strict;
use warnings;

use ExtUtils::MakeMaker;

my ($mm) = $ExtUtils::MakeMaker::VERSION =~ /^([^_]+)/;

WriteMakefile(
NAME => 'Lamework',
VERSION_FROM => 'lib/Lamework.pm',
ABSTRACT => 'Lamework',
AUTHOR => 'Viacheslav Tykhanovskyi <vti@cpan.org>',

($mm < 6.3002 ? () : ('LICENSE' => 'artistic_2')),

( $mm < 6.46
? ()
: ( META_MERGE => {
requires => {perl => '5.008007'},
resources => {
license => 'http://dev.perl.org/licenses/',
repository => 'http://github.com/vti/lamework'
},
no_index => {directory => [qw/t/]}
},
META_ADD => {
build_requires => {},
configure_requires => {}
},
)
),

PREREQ_PM => {
'Carp' => '0',
'Class::Load' => '0',
'Config::Tiny' => '0',
'Cwd' => '0',
'Encode' => '0',
'File::Basename' => '0',
'File::Spec' => '0',
'I18N::LangTags' => '0',
'I18N::LangTags::Detect' => '0',
'Plack' => '0',
'Routes::Tiny' => '0',
'Scalar::Util' => '0',
'String::CamelCase' => '0',
'Text::Caml' => '0',
'Try::Tiny' => '0',
},
test => {TESTS => 't/*.t t/*/*.t t/*/*/*.t t/*/*/*/*.t'}
);
136 changes: 136 additions & 0 deletions contrib/lamework/lib/Lamework.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
package Lamework;

use strict;
use warnings;

use Plack::Builder;

use Cwd ();
use File::Basename ();
use File::Spec ();
use String::CamelCase ();

use Lamework::Config;
use Lamework::Displayer;
use Lamework::Renderer::Caml;
use Lamework::Home;
use Lamework::Registry;
use Lamework::Routes;

use overload q(&{}) => sub { shift->psgi_app }, fallback => 1;

sub new {
my $class = shift;

my $self = {@_};
bless $self, $class;

$self->init;

$self->startup;

return $self;
}

sub init {
my $self = shift;

Lamework::Registry->set(app => $self, weaken => 1);

my $home = Lamework::Home->new($self->_detect_home);
Lamework::Registry->set(home => $home);

Lamework::Registry->set(routes => $self->routes);
Lamework::Registry->set(displayer => $self->displayer);

my $app_name = String::CamelCase::decamelize($self->namespace);
my $config_file = $home->catfile("$app_name.ini");

if (-f $config_file) {
my $config = Lamework::Config->new->load($config_file);
Lamework::Registry->set(config => $config);
}
}

sub startup { }

sub namespace {
my $self = shift;

return ref $self;
}

sub routes {
my $self = shift;

$self->{routes} ||= Lamework::Routes->new;

return $self->{routes};
}

sub home {
my $self = shift;

return Lamework::Registry->get('home');
}

sub displayer {
my $self = shift;

$self->{displayer} ||= Lamework::Displayer->new(
formats => {
caml => Lamework::Renderer::Caml->new(
templates_path => $self->home->catfile('templates')
)
}
);

return $self->{displayer};
}

sub psgi_app {
my $self = shift;

return $self->{psgi_app} ||= $self->compile_psgi_app;
}

sub compile_psgi_app {
my $self = shift;

my $app = sub {
my $env = shift;

return [404, [], ['404 Not Found']];
};

builder {
enable 'Static' => path =>
qr{\.(?:js|css|jpe?g|gif|png|html?|js|css|swf|ico)$},
root => "htdocs";

enable 'SimpleLogger', level => $ENV{PLACK_ENV}
&& $ENV{PLACK_ENV} eq 'development' ? 'debug' : 'error';

enable '+Lamework::Middleware::RoutesDispatcher';

enable '+Lamework::Middleware::ActionBuilder';

enable '+Lamework::Middleware::ViewDisplayer';

$app;
};
}

sub _detect_home {
my $self = shift;

my $home = $INC{$self->namespace . '.pm'};
if (defined $home) {
$home = Cwd::realpath(
File::Spec->catfile(File::Basename::dirname($home), '..'));
}

return $home;
}

1;
147 changes: 147 additions & 0 deletions contrib/lamework/lib/Lamework/Action.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
package Lamework::Action;

use strict;
use warnings;

use Scalar::Util qw(weaken);

use Lamework::Logger;
use Lamework::Registry;
use Lamework::Request;
use Lamework::Response;

sub new {
my $class = shift;

my $self = {@_};
bless $self, $class;

weaken $self->{env};

return $self;
}

sub log {
my $self = shift;

$self->{logger}
||= Lamework::Logger->new(logger => $self->{env}->{'psgix.logger'});

return $self->{logger};
}

sub captures {
my $self = shift;

return $self->{env}->{'lamework.routes.match'}->params;
}

sub env {
my $self = shift;

return $self->{env};
}

sub req {
my $self = shift;

$self->{req} ||= Lamework::Request->new($self->{env});

return $self->{req};
}

sub res {
my $self = shift;

$self->{res} ||= $self->req->new_response;

return $self->{res};
}

sub url_for {
my $self = shift;

my $url;

if ($_[0] =~ m{^/}) {
my $path = $_[0];
$path =~ s{^/}{};

$url = $self->req->base;
$url->path($url->path . $path);
}
elsif ($_[0] =~ m{^https?://}) {
$url = $_[0];
}
else {
my $routes = Lamework::Registry->get('routes');

my $path = $routes->build_path(@_);
$path =~ s{^/}{};

$url = $self->req->base;
$url->path($url->path . $path);
}

return $url;
}

sub set_var {
my $self = shift;
my ($key, $value) = @_;

$self->{env}->{'lamework.displayer.vars'}->{$key} = $value;
}

sub set_template {
my $self = shift;
my ($template) = @_;

$self->{env}->{'lamework.displayer.template'} = $template;
}

sub redirect {
my $self = shift;
my (@args) = @_;

my $url = $self->url_for(@_);
$self->res->redirect($url);

return $self;
}

sub render_file {
my $self = shift;

my $displayer = Lamework::Registry->get('displayer');

my $body = $displayer->render_file(@_);

unless (defined $self->res->code) {
$self->res->code(200);
}

$self->res->body($body);

return $self;
}

sub render_forbidden {
my $self = shift;

$self->res->code(403);
$self->render_file('forbidden', @_);

return $self;
}

sub render_not_found {
my $self = shift;

$self->res->code(404);
$self->render_file('not_found', @_);

return $self;
}

1;
26 changes: 26 additions & 0 deletions contrib/lamework/lib/Lamework/Config.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package Lamework::Config;

use strict;
use warnings;

use Config::Tiny;

sub new {
my $class = shift;

my $self = {@_};
bless $self, $class;

return $self;
}

sub load {
my $self = shift;
my ($file) = @_;

die "Can't open config file '$file'" unless -f $file;

return Config::Tiny->read($file);
}

1;
Loading

0 comments on commit 5ecf944

Please sign in to comment.