You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by jm...@apache.org on 2009/09/24 13:00:31 UTC

svn commit: r818446 - in /spamassassin/trunk: MANIFEST lib/Mail/SpamAssassin/Conf.pm lib/Mail/SpamAssassin/Conf/Parser.pm t/if_can.t

Author: jm
Date: Thu Sep 24 11:00:31 2009
New Revision: 818446

URL: http://svn.apache.org/viewvc?rev=818446&view=rev
Log:
bug 6207: add 'if can(Class::method)' conditional statement, allowing conf settings to be conditionalised on plugin capabilities without requiring new version releases to do so

Added:
    spamassassin/trunk/t/if_can.t
Modified:
    spamassassin/trunk/MANIFEST
    spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm
    spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm

Modified: spamassassin/trunk/MANIFEST
URL: http://svn.apache.org/viewvc/spamassassin/trunk/MANIFEST?rev=818446&r1=818445&r2=818446&view=diff
==============================================================================
--- spamassassin/trunk/MANIFEST (original)
+++ spamassassin/trunk/MANIFEST Thu Sep 24 11:00:31 2009
@@ -518,3 +518,4 @@
 t/db_awl_perms.t
 t/stop_always_matching_regexps.t
 t/cross_user_config_leak.t
+t/if_can.t

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm?rev=818446&r1=818445&r2=818446&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm Thu Sep 24 11:00:31 2009
@@ -3089,6 +3089,13 @@
 This is a function call that returns C<1> if the plugin named
 C<Name::Of::Plugin> is loaded, or C<undef> otherwise.
 
+=item can(Name::Of::Package::function_name)
+
+This is a function call that returns C<1> if the perl package named
+C<Name::Of::Package> includes a function called C<function_name>, or C<undef>
+otherwise.  Note that packages can be SpamAssassin plugins or built-in classes,
+there's no difference in this respect.
+
 =back
 
 If the end of a configuration file is reached while still inside a

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm?rev=818446&r1=818445&r2=818446&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm Thu Sep 24 11:00:31 2009
@@ -499,6 +499,10 @@
       # replace with method call
       $eval .= "\$self->cond_clause_plugin_loaded";
     }
+    elsif ($token eq 'can') {
+      # replace with method call
+      $eval .= "\$self->cond_clause_can";
+    }
     elsif ($token eq 'version') {
       $eval .= $Mail::SpamAssassin::VERSION." ";
     }
@@ -536,6 +540,17 @@
   return $_[0]->{conf}->{plugins_loaded}->{$_[1]};
 }
 
+sub cond_clause_can {
+  my ($self, $method) = @_;
+
+  if ($method =~ /^(.*)::([^:]+)$/) {
+    return UNIVERSAL::can($1, $2);
+  } else {
+    $self->lint_warn("bad 'if' line, cannot find '::' in can($method), ".
+                "in \"$self->{currentfile}\"", undef);
+  }
+}
+
 # Let's do some linting here ...
 # This is called from _parse(), BTW, so we can check for $conf->{tests}
 # easily before finish_parsing() is called and deletes it.

Added: spamassassin/trunk/t/if_can.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/if_can.t?rev=818446&view=auto
==============================================================================
--- spamassassin/trunk/t/if_can.t (added)
+++ spamassassin/trunk/t/if_can.t Thu Sep 24 11:00:31 2009
@@ -0,0 +1,38 @@
+#!/usr/bin/perl
+
+use lib '.'; use lib 't';
+use SATest; sa_t_init("if_can");
+use Test; BEGIN { plan tests => 5 };
+
+# ---------------------------------------------------------------------------
+
+%patterns = (
+
+        q{ GTUBE }, 'gtube',
+        q{ SHOULD_BE_CALLED }, 'should_be_called',
+
+);
+%anti_patterns = (
+
+        q{ SHOULD_NOT_BE_CALLED1 }, 'should_not_be_called1',
+        q{ SHOULD_NOT_BE_CALLED2 }, 'should_not_be_called2',
+
+);
+tstlocalrules (q{
+
+        loadplugin Mail::SpamAssassin::Plugin::Test
+        if !can(Mail::SpamAssassin::Plugin::Test::check_test_plugin)
+          body SHOULD_NOT_BE_CALLED1 /./
+        endif
+        if (can(Mail::SpamAssassin::Plugin::Test::non_existent_method))
+          body SHOULD_NOT_BE_CALLED2 /./
+        endif
+        if (can(Mail::SpamAssassin::Plugin::Test::check_test_plugin))
+          body SHOULD_BE_CALLED /./
+        endif
+
+});
+
+ok (sarun ("-L -t < data/spam/gtube.eml", \&patterns_run_cb));
+ok_all_patterns();
+