aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/WebCoso/Pipeline/Base.pm37
-rw-r--r--lib/WebCoso/Step.pm18
-rw-r--r--lib/WebCoso/X.pm11
-rw-r--r--t/03-pipeline.t35
-rw-r--r--t/lib/WebCoso/Pipeline/Test.pm13
-rw-r--r--t/lib/WebCoso/Step/Step1.pm24
-rw-r--r--t/lib/WebCoso/Step/Step2.pm24
7 files changed, 160 insertions, 2 deletions
diff --git a/lib/WebCoso/Pipeline/Base.pm b/lib/WebCoso/Pipeline/Base.pm
new file mode 100644
index 0000000..7018fc0
--- /dev/null
+++ b/lib/WebCoso/Pipeline/Base.pm
@@ -0,0 +1,37 @@
+package WebCoso::Pipeline::Base;
+use strict;
+use warnings;
+use WebCoso::X;
+use WebCoso::Step;
+use base 'Class::Data::Inheritable';
+
+__PACKAGE__->mk_classdata('_steps');
+
+sub set_steps {
+ my ($class,@steps)=@_;
+
+ my @full_steps=map {
+ my $full_step_name="WebCoso::Step::$_";
+ if (! WebCoso::Step->is_step($full_step_name)) {
+ WebCoso::X::NoSuchStep->throw(
+ pipeline => $class,
+ step => $_,
+ );
+ }
+ $full_step_name;
+ } @steps;
+
+ $class->_steps([@full_steps]);
+}
+
+sub process {
+ my ($class, $resource)=@_;
+
+ for my $step (@{$class->_steps()}) {
+ $resource = $step->process($resource);
+ }
+
+ return 1;
+}
+
+1;
diff --git a/lib/WebCoso/Step.pm b/lib/WebCoso/Step.pm
new file mode 100644
index 0000000..71a4f07
--- /dev/null
+++ b/lib/WebCoso/Step.pm
@@ -0,0 +1,18 @@
+package WebCoso::Step;
+use strict;
+use warnings;
+use Module::Pluggable::Fast
+ name => '_steps',
+ search => [ 'WebCoso::Step' ],
+ require => 1;
+
+my @steps=_steps();
+my %steps;
+@steps{@steps}=();
+
+sub is_step {
+ my ($class,$step_name)=@_;
+ return exists $steps{$step_name};
+}
+
+1;
diff --git a/lib/WebCoso/X.pm b/lib/WebCoso/X.pm
index 1894a28..57acd58 100644
--- a/lib/WebCoso/X.pm
+++ b/lib/WebCoso/X.pm
@@ -37,6 +37,11 @@ use Exception::Class
fields => [ 'resource' ],
description => 'è stata richiesta una risorsa ignota',
},
+ 'WebCoso::X::NoSuchStep' => {
+ isa => 'WebCoso::X::Base',
+ fields => [ 'pipeline', 'step' ],
+ description => 'una pipeline vuole usare uno step ignoto',
+ },
);
WebCoso::X::Base->Trace(1);
@@ -71,4 +76,10 @@ sub WebCoso::X::NoSuchResource::full_message {
return 'Risorsa ignota: ' . $self->resource();
}
+sub WebCoso::X::NoSuchStep::full_message {
+ my ($self)=@_;
+
+ return 'La pipeline ' . $self->pipeline() . ' vuole usare lo step ' . $self->step() . ' che è ignoto';
+}
+
1;
diff --git a/t/03-pipeline.t b/t/03-pipeline.t
new file mode 100644
index 0000000..0095596
--- /dev/null
+++ b/t/03-pipeline.t
@@ -0,0 +1,35 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use Path::Class;
+use Test::More 'no_plan';
+use Test::Exception;
+use lib 't/lib';
+use WebCoso::Config;
+use WebCoso::Driver;
+use WebCoso::Pipeline::Test;
+
+my $thisdir=file($0)->parent->absolute;
+
+my $conf_file=<<'EOF';
+res('src/file1.rest.txt','Test','dst/file.html');
+EOF
+
+WebCoso::Config->read_scalar($conf_file,"$thisdir/config-in-test");
+
+WebCoso::Driver->run();
+
+my @resources=WebCoso::Config->get_all_resources();
+
+my @calls1=WebCoso::Step::Step1->get_calls();
+is(scalar @calls1,1,"1 chiamata a Step1");
+is($calls1[0]->{resource},
+ $resources[0],
+ 'risorsa giusta passata a Step1');
+
+my @calls2=WebCoso::Step::Step2->get_calls();
+is(scalar @calls2,1,"1 chiamata a Step2");
+is($calls2[0]->{resource},
+ $calls1[0]->{out_res},
+ 'risorsa giusta passata a Step2');
+
diff --git a/t/lib/WebCoso/Pipeline/Test.pm b/t/lib/WebCoso/Pipeline/Test.pm
index 239d74b..6920f46 100644
--- a/t/lib/WebCoso/Pipeline/Test.pm
+++ b/t/lib/WebCoso/Pipeline/Test.pm
@@ -1,13 +1,22 @@
package WebCoso::Pipeline::Test;
use strict;
use warnings;
+use base 'WebCoso::Pipeline::Base';
+
+__PACKAGE__->set_steps(qw(Step1 Step2));
my @calls;
sub process {
my ($class,$resource)=@_;
- push @calls, { resource => $resource };
- return 1;
+
+ my $call={ resource => $resource };
+
+ my $ret=$class->SUPER::process($resource);
+
+ push @calls, $call;
+
+ return $ret;
}
sub get_calls {
diff --git a/t/lib/WebCoso/Step/Step1.pm b/t/lib/WebCoso/Step/Step1.pm
new file mode 100644
index 0000000..8a36d1d
--- /dev/null
+++ b/t/lib/WebCoso/Step/Step1.pm
@@ -0,0 +1,24 @@
+package WebCoso::Step::Step1;
+use strict;
+use warnings;
+
+my @calls;
+
+sub process {
+ my ($class,$resource)=@_;
+
+ my $out='stuff';
+
+ push @calls,{
+ resource => $resource,
+ out_res => $out,
+ };
+
+ return $out;
+}
+
+sub get_calls {
+ return @calls;
+}
+
+1;
diff --git a/t/lib/WebCoso/Step/Step2.pm b/t/lib/WebCoso/Step/Step2.pm
new file mode 100644
index 0000000..0868842
--- /dev/null
+++ b/t/lib/WebCoso/Step/Step2.pm
@@ -0,0 +1,24 @@
+package WebCoso::Step::Step2;
+use strict;
+use warnings;
+
+my @calls;
+
+sub process {
+ my ($class,$resource)=@_;
+
+ my $out='other';
+
+ push @calls,{
+ resource => $resource,
+ out_res => $out,
+ };
+
+ return $out;
+}
+
+sub get_calls {
+ return @calls;
+}
+
+1;