[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