[swiftsieve] [PATCH] Build the 'require [...]' line from actual Rules'/Conditions' requirements.
Vsevolod Kozlov
zaba at thorium.homeunix.org
Thu Feb 19 13:58:10 UTC 2009
---
lib/App/Swiftsieve/Sieve/Condition.pm | 14 ++++++++++++++
lib/App/Swiftsieve/Sieve/Rule.pm | 20 ++++++++++++++++++++
lib/App/Swiftsieve/Sieve/Script.pm | 15 +++++++++++++--
t/sieve-script.t | 18 +++++++++++-------
4 files changed, 58 insertions(+), 9 deletions(-)
diff --git a/lib/App/Swiftsieve/Sieve/Condition.pm b/lib/App/Swiftsieve/Sieve/Condition.pm
index 182cbbb..cd3d311 100644
--- a/lib/App/Swiftsieve/Sieve/Condition.pm
+++ b/lib/App/Swiftsieve/Sieve/Condition.pm
@@ -132,6 +132,20 @@ sub validate {
}
+=item B<requires>
+
+Returns a list of extensions that are required by this condition.
+
+=cut
+sub requires {
+ my($self) = @_;
+
+ my @result = ();
+ if ($self->{operator} eq 'regex') { push @result, "regex"; }
+ return @result;
+}
+
+
=item B<write>
Returns the text representation of this condition.
diff --git a/lib/App/Swiftsieve/Sieve/Rule.pm b/lib/App/Swiftsieve/Sieve/Rule.pm
index 64bb677..b42d7a8 100644
--- a/lib/App/Swiftsieve/Sieve/Rule.pm
+++ b/lib/App/Swiftsieve/Sieve/Rule.pm
@@ -114,6 +114,26 @@ sub validate {
}
+=item B<requires>
+
+Returns an array of extensions the given rule and its conditions require.
+
+=cut
+sub requires {
+ my($self) = @_;
+
+ my @result = ();
+ if ($self->action_command eq "fileinto") { push @result, "fileinto"; }
+ elsif ($self->action_command eq "reject") { push @result, "reject"; }
+
+ foreach ($self->conditions) {
+ push @result, $_->requires;
+ }
+
+ return @result;
+}
+
+
=item B<write>
Returns the textual representation of this rule
diff --git a/lib/App/Swiftsieve/Sieve/Script.pm b/lib/App/Swiftsieve/Sieve/Script.pm
index 1b6c495..3d34f81 100644
--- a/lib/App/Swiftsieve/Sieve/Script.pm
+++ b/lib/App/Swiftsieve/Sieve/Script.pm
@@ -21,6 +21,8 @@ use warnings;
use App::Swiftsieve::Sieve::Rule;
use App::Swiftsieve::Sieve::Condition;
+use List::MoreUtils qw(uniq);
+
=head1 NAME
App::Swiftsieve::Sieve::Script - Handle a limited subset of Sieve
@@ -119,9 +121,18 @@ Returns the Sieve representation of this script
=cut
sub write {
my($self) = @_;
- my $require = 'require ["fileinto", "reject", "regex"];';
+ my @requires = ();
+ my $require = "";
+ foreach my $rule ($self->rules) {
+ push @requires, $rule->requires();
+ }
+ if (scalar(@requires)) {
+ @requires = uniq(@requires);
+ $require .= 'require ["' . join('", "', @requires) . '"];';
+ $require .= "\n";
+ }
my @written_rules = map { $_->write } $self->rules;
- return "$require\n" . join("\nels", @written_rules) . "\n";
+ return "$require" . join("\nels", @written_rules) . "\n";
}
=item B<rules>
diff --git a/t/sieve-script.t b/t/sieve-script.t
index 7881272..5c6162e 100644
--- a/t/sieve-script.t
+++ b/t/sieve-script.t
@@ -43,14 +43,18 @@ is($rules[1]->condition_join, 'allof', 'second rule, condition join');
is($rules[1]->action_command, 'fileinto', 'second rule, action command');
my $new_script = new App::Swiftsieve::Sieve::Script;
-my $mock_rule_1 = new Test::MockObject;
-$mock_rule_1->mock ('write', sub { return "if true { keep; }" });
-$new_script->add_rule($mock_rule_1);
-my $mock_rule_2 = new Test::MockObject;
-$mock_rule_2->mock ('write', sub { return "if true { keep; }" });
-$new_script->add_rule($mock_rule_2);
+
+sub mock_rule {
+ my $mock = new Test::MockObject;
+ $mock->mock(write => sub {return "if true { keep; }"});
+ $mock->mock(requires => sub {return ("foobar")});
+ return $mock;
+}
+
+$new_script->add_rule(mock_rule);
+$new_script->add_rule(mock_rule);
my $should_be = <<END;
-require ["fileinto", "reject", "regex"];
+require ["foobar"];
if true { keep; }
elsif true { keep; }
END
--
1.6.0.6
More information about the Swiftsieve-devel
mailing list