Port to Dancer
This commit is contained in:
parent
42f9317151
commit
ee93a98d35
|
@ -0,0 +1,19 @@
|
|||
MANIFEST
|
||||
bin/app.pl
|
||||
config.yml
|
||||
environments/development.yml
|
||||
environments/production.yml
|
||||
views/index.tt
|
||||
views/layouts/main.tt
|
||||
MANIFEST.SKIP
|
||||
lib/genregenerator.pm
|
||||
public/css/style.css
|
||||
public/css/error.css
|
||||
public/404.html
|
||||
public/dispatch.fcgi
|
||||
public/javascripts/jquery.js
|
||||
public/dispatch.cgi
|
||||
public/500.html
|
||||
t/002_index_route.t
|
||||
t/001_base.t
|
||||
Makefile.PL
|
|
@ -0,0 +1,13 @@
|
|||
^\.git\/
|
||||
maint
|
||||
^tags$
|
||||
.last_cover_stats
|
||||
Makefile$
|
||||
^blib
|
||||
^pm_to_blib
|
||||
^.*.bak
|
||||
^.*.old
|
||||
^t.*sessions
|
||||
^cover_db
|
||||
^.*\.log
|
||||
^.*\.swp$
|
|
@ -0,0 +1,21 @@
|
|||
use strict;
|
||||
use warnings;
|
||||
use ExtUtils::MakeMaker;
|
||||
|
||||
WriteMakefile(
|
||||
NAME => 'genregenerator',
|
||||
AUTHOR => q{YOUR NAME <youremail@example.com>},
|
||||
VERSION_FROM => 'lib/genregenerator.pm',
|
||||
ABSTRACT => 'YOUR APPLICATION ABSTRACT',
|
||||
($ExtUtils::MakeMaker::VERSION >= 6.3002
|
||||
? ('LICENSE'=> 'perl')
|
||||
: ()),
|
||||
PL_FILES => {},
|
||||
PREREQ_PM => {
|
||||
'Test::More' => 0,
|
||||
'YAML' => 0,
|
||||
'Dancer' => 1.3060,
|
||||
},
|
||||
dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', },
|
||||
clean => { FILES => 'genregenerator-*' },
|
||||
);
|
67
app.psgi
67
app.psgi
|
@ -1,67 +0,0 @@
|
|||
#!/usr/bin/env perl
|
||||
# Copyright 2011 Maximilian Gaß <mxey@ghosthacking.net>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Data::Random qw(rand_enum);
|
||||
use Plack::App::File;
|
||||
use Plack::Builder;
|
||||
use YAML::XS qw(LoadFile);
|
||||
use Template;
|
||||
|
||||
chdir ('/srv/www/de.genregenerator');
|
||||
my $data = LoadFile('genres.yaml');
|
||||
|
||||
my $template = Template->new({
|
||||
INCLUDE_PATH => '.',
|
||||
});
|
||||
|
||||
sub chance {
|
||||
my ($percent) = @_;
|
||||
return int(rand(100 / $percent)) == 0;
|
||||
}
|
||||
|
||||
sub generate_genre {
|
||||
my @genre;
|
||||
|
||||
if (chance(10)) {
|
||||
push @genre, rand_enum(set => $data->{cities});
|
||||
}
|
||||
|
||||
if (chance(70)) {
|
||||
push @genre, rand_enum(set => $data->{subgroup});
|
||||
}
|
||||
|
||||
|
||||
push @genre, rand_enum(set => $data->{subgroup});
|
||||
push @genre, rand_enum(set => $data->{group});
|
||||
|
||||
return join ' ', @genre;
|
||||
}
|
||||
|
||||
builder {
|
||||
mount '/static' => Plack::App::File->new(root => 'static')->to_app(),
|
||||
mount '/' => sub {
|
||||
my $genre = generate_genre();
|
||||
my $out = '';
|
||||
$template->process('index.tt', { genre => $genre }, \$out);
|
||||
return [
|
||||
200,
|
||||
[ 'Content-Type' => 'text/html' ],
|
||||
[ $out ]
|
||||
];
|
||||
},
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
#!/usr/bin/env perl
|
||||
use Dancer;
|
||||
use App::Genregenerator;
|
||||
|
||||
dance;
|
|
@ -0,0 +1,9 @@
|
|||
# Your application's name
|
||||
appname: "genregenerator"
|
||||
|
||||
# when the charset is set to UTF-8 Dancer will handle for you
|
||||
# all the magic of encoding and decoding. You should not care
|
||||
# about unicode within your app when this setting is set (recommended).
|
||||
charset: "UTF-8"
|
||||
|
||||
template: "simple"
|
|
@ -0,0 +1,27 @@
|
|||
# configuration file for development environment
|
||||
|
||||
# the logger engine to use
|
||||
# console: log messages to STDOUT (your console where you started the
|
||||
# application server)
|
||||
# file: log message to a file in log/
|
||||
logger: "console"
|
||||
|
||||
# the log level for this environement
|
||||
# core is the lowest, it shows Dancer's core log messages as well as yours
|
||||
# (debug, warning and error)
|
||||
log: "core"
|
||||
|
||||
# should Dancer consider warnings as critical errors?
|
||||
warnings: 1
|
||||
|
||||
# should Dancer show a stacktrace when an error is caught?
|
||||
show_errors: 1
|
||||
|
||||
# auto_reload is a development and experimental feature
|
||||
# you should enable it by yourself if you want it
|
||||
# Module::Refresh is needed
|
||||
#
|
||||
# Be aware it's unstable and may cause a memory leak.
|
||||
# DO NOT EVER USE THAT FEATURE IN PRODUCTION
|
||||
# OR TINY KITTENS SHALL DIE WITH LOTS OF SUFFERING
|
||||
auto_reload: 0
|
|
@ -0,0 +1,17 @@
|
|||
# configuration file for production environment
|
||||
|
||||
# only log warning and error messsages
|
||||
log: "warning"
|
||||
|
||||
# log message to a file in logs/
|
||||
logger: "null"
|
||||
|
||||
# don't consider warnings critical
|
||||
warnings: 0
|
||||
|
||||
# hide errors
|
||||
show_errors: 0
|
||||
|
||||
# cache route resolution for maximum performance
|
||||
route_cache: 1
|
||||
|
28
index.tt
28
index.tt
|
@ -1,28 +0,0 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" type="text/css" href="static/style.css" />
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="title">
|
||||
Listen to
|
||||
</div>
|
||||
|
||||
<div id="genre">
|
||||
<a href="/">[% genre %]</a>
|
||||
</div>
|
||||
|
||||
<div id="twitter">
|
||||
<a href="http://twitter.com/share" class="twitter-share-button" data-text="I listen to [% genre %] #genregenerator" data-count="horizontal">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script><br />
|
||||
</div>
|
||||
|
||||
<div id="impressum">
|
||||
Created by <a href="http://www.thehappy.de/~xeno/">xeno</a> and <a href="http://ghosthacking.net">mxey</a> | <a href="http://ghosthacking.net/git/genregenerator.git">git</a>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,28 @@
|
|||
package App::Genregenerator;
|
||||
use Dancer ':syntax';
|
||||
use Data::Random qw(rand_enum);
|
||||
use YAML::XS qw(LoadFile);
|
||||
|
||||
my $data = LoadFile('genres.yml');
|
||||
|
||||
sub chance {
|
||||
my ($percent) = @_;
|
||||
return int(rand(100 / $percent)) == 0;
|
||||
}
|
||||
|
||||
sub generate_genre {
|
||||
my @genre;
|
||||
|
||||
push @genre, rand_enum(set => $data->{cities}) if chance 10;
|
||||
push @genre, rand_enum(set => $data->{subgroup}) if chance 70;
|
||||
push @genre, rand_enum(set => $data->{subgroup});
|
||||
push @genre, rand_enum(set => $data->{group});
|
||||
|
||||
return join ' ', @genre;
|
||||
}
|
||||
|
||||
get '/' => sub {
|
||||
template 'index', { genre => generate_genre() };
|
||||
};
|
||||
|
||||
true;
|
|
@ -0,0 +1,18 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>Error 404</title>
|
||||
<link rel="stylesheet" href="/css/error.css" />
|
||||
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Error 404</h1>
|
||||
<div id="content">
|
||||
<h2>Page Not Found</h2><p>Sorry, this is the void.</p>
|
||||
</div>
|
||||
<div id="footer">
|
||||
Powered by <a href="http://perldancer.org/">Dancer</a> 1.3060
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,18 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>Error 500</title>
|
||||
<link rel="stylesheet" href="/css/error.css" />
|
||||
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Error 500</h1>
|
||||
<div id="content">
|
||||
<h2>Internal Server Error</h2><p>Wooops, something went wrong</p>
|
||||
</div>
|
||||
<div id="footer">
|
||||
Powered by <a href="http://perldancer.org/">Dancer</a> 1.3060
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,70 @@
|
|||
body {
|
||||
font-family: Lucida,sans-serif;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: #AA0000;
|
||||
border-bottom: 1px solid #444;
|
||||
}
|
||||
|
||||
h2 { color: #444; }
|
||||
|
||||
pre {
|
||||
font-family: "lucida console","monaco","andale mono","bitstream vera sans mono","consolas",monospace;
|
||||
font-size: 12px;
|
||||
border-left: 2px solid #777;
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
footer {
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
span.key {
|
||||
color: #449;
|
||||
font-weight: bold;
|
||||
width: 120px;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
span.value {
|
||||
color: #494;
|
||||
}
|
||||
|
||||
/* these are for the message boxes */
|
||||
|
||||
pre.content {
|
||||
background-color: #eee;
|
||||
color: #000;
|
||||
padding: 1em;
|
||||
margin: 0;
|
||||
border: 1px solid #aaa;
|
||||
border-top: 0;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
div.title {
|
||||
font-family: "lucida console","monaco","andale mono","bitstream vera sans mono","consolas",monospace;
|
||||
font-size: 12px;
|
||||
background-color: #aaa;
|
||||
color: #444;
|
||||
font-weight: bold;
|
||||
padding: 3px;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
pre.content span.nu {
|
||||
color: #889;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
pre.error {
|
||||
background: #334;
|
||||
color: #ccd;
|
||||
padding: 1em;
|
||||
border-top: 1px solid #000;
|
||||
border-left: 1px solid #000;
|
||||
border-right: 1px solid #eee;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
#!/usr/bin/env perl
|
||||
use Dancer ':syntax';
|
||||
use FindBin '$RealBin';
|
||||
use Plack::Runner;
|
||||
|
||||
# For some reason Apache SetEnv directives dont propagate
|
||||
# correctly to the dispatchers, so forcing PSGI and env here
|
||||
# is safer.
|
||||
set apphandler => 'PSGI';
|
||||
set environment => 'production';
|
||||
|
||||
my $psgi = path($RealBin, '..', 'bin', 'app.pl');
|
||||
die "Unable to read startup script: $psgi" unless -r $psgi;
|
||||
|
||||
Plack::Runner->run($psgi);
|
|
@ -0,0 +1,17 @@
|
|||
#!/usr/bin/env perl
|
||||
use Dancer ':syntax';
|
||||
use FindBin '$RealBin';
|
||||
use Plack::Handler::FCGI;
|
||||
|
||||
# For some reason Apache SetEnv directives dont propagate
|
||||
# correctly to the dispatchers, so forcing PSGI and env here
|
||||
# is safer.
|
||||
set apphandler => 'PSGI';
|
||||
set environment => 'production';
|
||||
|
||||
my $psgi = path($RealBin, '..', 'bin', 'app.pl');
|
||||
my $app = do($psgi);
|
||||
die "Unable to read startup script: $@" if $@;
|
||||
my $server = Plack::Handler::FCGI->new(nproc => 5, detach => 1);
|
||||
|
||||
$server->run($app);
|
|
@ -0,0 +1 @@
|
|||
/usr/share/javascript/jquery/jquery.js
|
|
@ -0,0 +1,5 @@
|
|||
use Test::More tests => 1;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use_ok 'App::Genregenerator';
|
|
@ -0,0 +1,10 @@
|
|||
use Test::More tests => 2;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
# the order is important
|
||||
use App::Genregenerator;
|
||||
use Dancer::Test;
|
||||
|
||||
route_exists [GET => '/'], 'a route handler is defined for /';
|
||||
response_status_is ['GET' => '/'], 200, 'response status is 200 for /';
|
|
@ -0,0 +1,28 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" type="text/css" href="/css/style.css" />
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="title">
|
||||
Listen to
|
||||
</div>
|
||||
|
||||
<div id="genre">
|
||||
<a href="/"><% genre %></a>
|
||||
</div>
|
||||
|
||||
<div id="twitter">
|
||||
<a href="http://twitter.com/share" class="twitter-share-button" data-text="I listen to <% genre %> #genregenerator" data-count="horizontal">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script><br />
|
||||
</div>
|
||||
|
||||
<div id="impressum">
|
||||
Created by <a href="http://www.thehappy.de/~xeno/">xeno</a> and <a href="http://ghosthacking.net">mxey</a> | <a href="http://ghosthacking.net/git/genregenerator.git">git</a>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue