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();
+