The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Changes 08
META.json 46
META.yml 34
cpanfile 01
eg/cron.pl 01
lib/Proclet/Declare.pm 524
lib/Proclet.pm 415
t/02_declare.t 01
t/04_disable_log.t 11
t/30proclet/01_basic.t 01
t/30proclet/02_process.t 01
t/DeclareProclet.pl 09
12 files changed (This is a version diff) 1772
@@ -1,5 +1,13 @@
 Revision history for Perl extension Proclet
 
+0.34 2014-04-10T15:33:21Z
+
+       - support cron like job in Declare (EXPERIMENTAL)
+
+0.33 2014-03-12T15:20:48Z
+
+       - add start and exec message
+
 0.32 2013-12-27T04:39:01Z
 
         - support cron like job (EXPERIMENTAL)
@@ -4,7 +4,7 @@
       "Masahiro Nagano <kazeburo {at} gmail.com>"
    ],
    "dynamic_config" : 0,
-   "generated_by" : "Minilla/v0.11.0",
+   "generated_by" : "Minilla/v0.14.1",
    "license" : [
       "perl_5"
    ],
@@ -36,7 +36,8 @@
       "develop" : {
          "requires" : {
             "Test::CPAN::Meta" : "0",
-            "Test::MinimumVersion" : "0.10108",
+            "Test::MinimumVersion::Fast" : "0.04",
+            "Test::PAUSE::Permissions" : "0.04",
             "Test::Pod" : "1.41",
             "Test::Spellunker" : "v0.2.7"
          }
@@ -49,6 +50,7 @@
             "Log::Minimal" : "0.14",
             "Mouse" : "0",
             "Parallel::Prefork" : "0.13",
+            "String::ShellQuote" : "0",
             "Term::ANSIColor" : "0",
             "Time::Crontab" : "0.01",
             "YAML::XS" : "0.38",
@@ -68,7 +70,7 @@
    "provides" : {
       "Proclet" : {
          "file" : "lib/Proclet.pm",
-         "version" : "0.32"
+         "version" : "0.34"
       },
       "Proclet::Declare" : {
          "file" : "lib/Proclet/Declare.pm"
@@ -85,7 +87,7 @@
          "web" : "https://github.com/kazeburo/Proclet"
       }
    },
-   "version" : "0.32",
+   "version" : "0.34",
    "x_contributors" : [
       "soh335 <sugarbabe335@gmail.com>",
       "Masahiro Nagano <kazeburo@gmail.com>"
@@ -12,7 +12,7 @@ configure_requires:
   CPAN::Meta::Prereqs: 0
   Module::Build: 0.38
 dynamic_config: 0
-generated_by: 'Minilla/v0.11.0, CPAN::Meta::Converter version 2.132830'
+generated_by: 'Minilla/v0.14.1, CPAN::Meta::Converter version 2.132830'
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -31,7 +31,7 @@ no_index:
 provides:
   Proclet:
     file: lib/Proclet.pm
-    version: 0.32
+    version: 0.34
   Proclet::Declare:
     file: lib/Proclet/Declare.pm
 requires:
@@ -41,6 +41,7 @@ requires:
   Log::Minimal: 0.14
   Mouse: 0
   Parallel::Prefork: 0.13
+  String::ShellQuote: 0
   Term::ANSIColor: 0
   Time::Crontab: 0.01
   YAML::XS: 0.38
@@ -50,7 +51,7 @@ resources:
   bugtracker: https://github.com/kazeburo/Proclet/issues
   homepage: https://github.com/kazeburo/Proclet
   repository: git://github.com/kazeburo/Proclet.git
-version: 0.32
+version: 0.34
 x_contributors:
   - 'soh335 <sugarbabe335@gmail.com>'
   - 'Masahiro Nagano <kazeburo@gmail.com>'
@@ -9,6 +9,7 @@ requires 'Term::ANSIColor';
 requires 'YAML::XS', '0.38';
 requires 'parent';
 requires 'Time::Crontab', '0.01';
+requires 'String::ShellQuote';
 
 on test => sub {
     requires 'List::MoreUtils';
@@ -8,6 +8,7 @@ use Log::Minimal;
 
 my $proclet = Proclet->new;
 $proclet->service(
+    tag => 'cron_sample',
     code => sub {
         warnf $0;
         sleep 5;
@@ -5,7 +5,7 @@ use warnings;
 use Proclet;
 use parent qw/Exporter/;
 
-our @EXPORT = qw/color env service worker run/;
+our @EXPORT = qw/color env service scheduled worker run/;
 
 our %REGISTRY;
 
@@ -36,7 +36,17 @@ sub service {
     my $code = ( ref($service[0]) && ref($service[0]) eq 'CODE' )
         ? $service[0] 
         : \@service;
-    push @{_proclet->{service}},[$tag,$code];
+    push @{_proclet->{service}},{ tag => $tag, code => $code };
+}
+
+sub scheduled {
+    my $tag = shift;
+    my $cron = shift;
+    my @service = @_;
+    my $code = ( ref($service[0]) && ref($service[0]) eq 'CODE' )
+        ? $service[0] 
+        : \@service;
+    push @{_proclet->{service}},{ tag => $tag, code => $code, every => $cron };
 }
 
 sub worker {
@@ -52,10 +62,9 @@ sub run() { ## no critic
     }
     my $proclet = Proclet->new(color => _proclet->{color});
     foreach my $service ( @{_proclet->{service}} ) {
-        my ($tag, $code) = @$service;
+        my $tag = $service->{tag};
         $proclet->service(
-            tag => $tag,
-            code => $code,
+            %$service,
             worker => ( exists _proclet->{worker}->{$tag} ) ? _proclet->{worker}->{$tag} : 1
         );
     }
@@ -83,6 +92,7 @@ Proclet::Declare - Declare interface to Proclet
   service('web', 'plackup -p 5963 app.psgi');
   service('memcached', '/usr/local/bin/memcached', '-p', '11211');
   service('worker', './bin/worker');
+  scheduled('tag', '0 12 * * *', sub { MyDailyWork->run });
 
   worker(
     'worker' => 5
@@ -126,6 +136,15 @@ Sets the service
   # exec command
   service('tag', '/usr/local/bin/memcached','-vv');
 
+=item scheduled
+
+scheduled job like cron
+
+  # coderef
+  scheduled('tag', '0 12 * * *', sub { MyDailyWork->run });
+  # exec command
+  scheduled('tag', '0 12 * * *', 'my_daily_job','-execute');
+
 =item worker
 
 Number of children to fork
@@ -12,6 +12,7 @@ use IO::Select;
 use Term::ANSIColor;
 use File::Which;
 use Time::Crontab;
+use String::ShellQuote;
 
 subtype 'ServiceProcs'
     => as 'Int'
@@ -29,9 +30,11 @@ coerce 'Proclet::Service'
         my $command = $_;
         +{generator => sub {
             my @command = @{$command};
+            my @o_command = @command;
             my $bash = which("bash");
             if ( @command == 1 && $bash ) { unshift @command, $bash, "-c" }
             sub {
+                warn "Exec command: ". shell_quote(@o_command)."\n";
                 exec(@command);
                 die $!
             }
@@ -44,16 +47,24 @@ coerce 'Proclet::Service'
             my $command = $o_command; #copy
             $command =~ s/\$PORT/$port/g if $port;
             my @command = ($command);
+            my @o_command = @command;
             if ( my $bash = which("bash") ) { unshift @command, $bash, "-c" }
             sub {
-                exec @command;
+                warn "Exec command: ". shell_quote(@o_command)."\n";
+                exec(@command);
                 die $!
             }
         }}
     }
     => from 'CodeRef' => via {
         my $command = $_;
-        +{generator => sub { $command }};
+        +{generator => sub {
+              my ($port,$tag) = @_;
+              sub {
+                  warn "Start callback: " . $tag  . "\n";
+                  $command->($port);
+              }
+          }};
     };
 
 
@@ -73,7 +84,7 @@ coerce 'Proclet::Scheduler'
 
 no Mouse::Util::TypeConstraints;
 
-our $VERSION = '0.32';
+our $VERSION = '0.34';
 
 has '_services' => (
     is => 'ro',
@@ -165,7 +176,7 @@ sub run {
             $services{$sid} = { %$service };
             my $port =  $services{$sid}{start_port} + $i - 1;
             my $code_generator = $services{$sid}{code}{generator};
-            my $code = $code_generator->($port);
+            my $code = $code_generator->($port, $service->{tag});
             if ( $services{$sid}{cron} ) {
                 $code = $self->cron_worker($code,$services{$sid}{cron});
             }
@@ -9,6 +9,7 @@ $ENV{PROCLET_TESTFILE} = $logfile;
 die $! if ! defined $pid;
 
 if ( $pid == 0 ) {
+    close(STDERR);
     exec $^X, 't/DeclareProclet.pl';
     die $!;
 }
@@ -29,7 +29,7 @@ my $stderr  = Capture::Tiny::capture_stderr {
 
 my $ok = 0;
 for my $l ( split /\n/, $stderr ) {
-    like $l, qr/^proclet disable log at/;
+    like $l, qr/^(Start callback|proclet disable log at)/;
     $ok++ if $l =~ m!^proclet disable log at!;
 }
 ok($ok);
@@ -11,6 +11,7 @@ die $! if ! defined $pid;
 
 if ( $pid == 0 ) {
     chdir 't/30proclet/procfile';
+    close(STDERR);
     exec $^X, '-I../../../lib','../../../bin/proclet', 'start';
     exit;
 }
@@ -11,6 +11,7 @@ die $! if ! defined $pid;
 
 if ( $pid == 0 ) {
     chdir 't/30proclet/procfile';
+    close(STDERR);
     exec $^X, '-I../../../lib','../../../bin/proclet', 'start','-p','3000','w2';
     exit;
 }
@@ -16,6 +16,15 @@ service(
     'for(1..100){ open(my $fh, ">>:unix", $ENV{PROCLET_TESTFILE}) or die $!; print $fh "w2 $$\n"; close $fh; sleep 1}'
 );
 
+scheduled(
+    'c1',
+    '* * * * *',
+    $^X,
+    '-e',
+    'sleep 1;'
+);
+
+
 worker(
     'w2' => 2
 );