Mailing List Archive

svn commit: rev 6784 - in incubator/spamassassin/trunk: . lib/Mail lib/Mail/SpamAssassin masses spamd t
Author: jm
Date: Thu Feb 19 15:47:10 2004
New Revision: 6784

Added:
incubator/spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm
incubator/spamassassin/trunk/lib/Mail/SpamAssassin/MsgNode.pm
- copied, changed from rev 6782, incubator/spamassassin/trunk/lib/Mail/SpamAssassin/MsgContainer.pm
Removed:
incubator/spamassassin/trunk/lib/Mail/SpamAssassin/MsgContainer.pm
Modified:
incubator/spamassassin/trunk/MANIFEST
incubator/spamassassin/trunk/lib/Mail/SpamAssassin.pm
incubator/spamassassin/trunk/lib/Mail/SpamAssassin/CmdLearn.pm
incubator/spamassassin/trunk/lib/Mail/SpamAssassin/MsgParser.pm
incubator/spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm
incubator/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin.pm
incubator/spamassassin/trunk/masses/mass-check
incubator/spamassassin/trunk/spamassassin.raw
incubator/spamassassin/trunk/spamd/spamd.raw
incubator/spamassassin/trunk/t/bayesdbm.t
incubator/spamassassin/trunk/t/bayessql.t
incubator/spamassassin/trunk/t/mimeparse.t
incubator/spamassassin/trunk/t/rule_tests.t
Log:
split up MsgContainer into two new classes - Message, for top-level node, and MsgNode for sub-nodes. Message is a subclass of MsgNode with additional features to hold metadata, pristine message representation and top-level message-wide flags

Modified: incubator/spamassassin/trunk/MANIFEST
==============================================================================
--- incubator/spamassassin/trunk/MANIFEST (original)
+++ incubator/spamassassin/trunk/MANIFEST Thu Feb 19 15:47:10 2004
@@ -48,7 +48,8 @@
lib/Mail/SpamAssassin/Locales.pm
lib/Mail/SpamAssassin/Locker.pm
lib/Mail/SpamAssassin/MailingList.pm
-lib/Mail/SpamAssassin/MsgContainer.pm
+lib/Mail/SpamAssassin/Message.pm
+lib/Mail/SpamAssassin/MsgNode.pm
lib/Mail/SpamAssassin/MsgMetadata.pm
lib/Mail/SpamAssassin/MsgParser.pm
lib/Mail/SpamAssassin/NetSet.pm

Modified: incubator/spamassassin/trunk/lib/Mail/SpamAssassin.pm
==============================================================================
--- incubator/spamassassin/trunk/lib/Mail/SpamAssassin.pm (original)
+++ incubator/spamassassin/trunk/lib/Mail/SpamAssassin.pm Thu Feb 19 15:47:10 2004
@@ -69,6 +69,7 @@
use Mail::SpamAssassin::ConfSourceSQL;
use Mail::SpamAssassin::ConfSourceLDAP;
use Mail::SpamAssassin::PerMsgStatus;
+use Mail::SpamAssassin::Message;
use Mail::SpamAssassin::MsgParser;
use Mail::SpamAssassin::Bayes;
use Mail::SpamAssassin::PluginHandler;
@@ -303,16 +304,16 @@

=item parse()

-Parse will return a Mail::SpamAssassin::MsgContainer object. To use it,
+Parse will return a Mail::SpamAssassin::Message object. To use it,
simply call C<Mail::SpamAssassin->parse($msg)>, where $msg is either undef
(will use STDIN), a scalar of the entire message, an array reference
of the message with 1 line per array element, or a file glob with the
entire contents of the message.

-This function will return a base MsgContainer object with just the headers
-being parsed. M::SA::MsgContainer->find_parts() will end up doing a
+This function will return a base Message object with just the headers
+being parsed. M::SA::Message->find_parts() will end up doing a
full recursive mime parse of the message as necessary. That procedure is
-recursive and ends up generating a tree of M::SA::MsgContainer objects.
+recursive and ends up generating a tree of M::SA::MsgNode objects.
parse() will generate the parent node of the tree, then pass the body of
the message to M::SA::MsgParser->parse_body() which begins the recursive
process.
@@ -320,7 +321,7 @@
=cut

# NOTE: This function is allowed (in bad OO form) to modify the
-# MsgContainer object directly as MsgContainer doesn't really have a
+# Message object directly as Message doesn't really have a
# constructor in the traditional OO way of things.

sub parse {
@@ -345,14 +346,8 @@
}

# Generate the main object and parse the appropriate MIME-related headers into it.
- my $msg = Mail::SpamAssassin::MsgContainer->new(already_parsed => 0);
+ my $msg = Mail::SpamAssassin::Message->new(already_parsed => 0);
my $header = '';
- $msg->{'pristine_headers'} = '';
-
- # inform the node that it's a message root, so that it knows that
- # it can have stuff that only root nodes have. TODO: IMO, we should
- # probably just have a subclass of MsgContainer for root nodes!
- $msg->_set_is_root();

# Go through all the headers of the message
while ( my $last = shift @message ) {

Modified: incubator/spamassassin/trunk/lib/Mail/SpamAssassin/CmdLearn.pm
==============================================================================
--- incubator/spamassassin/trunk/lib/Mail/SpamAssassin/CmdLearn.pm (original)
+++ incubator/spamassassin/trunk/lib/Mail/SpamAssassin/CmdLearn.pm Thu Feb 19 15:47:10 2004
@@ -21,7 +21,7 @@

use Mail::SpamAssassin;
use Mail::SpamAssassin::ArchiveIterator;
-use Mail::SpamAssassin::MsgContainer;
+use Mail::SpamAssassin::Message;
use Mail::SpamAssassin::PerMsgLearner;

use Getopt::Long;

Added: incubator/spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm
==============================================================================
--- (empty file)
+++ incubator/spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm Thu Feb 19 15:47:10 2004
@@ -0,0 +1,287 @@
+# <@LICENSE>
+# Copyright 2004 Apache Software Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# </@LICENSE>
+
+=head1 NAME
+
+Mail::SpamAssassin::Message - decode, render, and hold an RFC-2822 message
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+This module will encapsulate an email message and allow access to
+the various MIME message parts and message metadata.
+
+=head1 PUBLIC METHODS
+
+=over 4
+
+=cut
+
+# the message structure is now:
+#
+# Message object, also top-level node in MsgNode tree
+# |
+# +---> MsgNode for other parts in MIME structure
+# | |---> [ more MsgNode parts ... ]
+# | [ others ... ]
+# |
+# +---> MsgMetadata object to hold metadata
+
+package Mail::SpamAssassin::Message;
+use strict;
+use Mail::SpamAssassin;
+use Mail::SpamAssassin::MsgNode;
+use Mail::SpamAssassin::MsgMetadata;
+
+use vars qw(@ISA);
+
+@ISA = qw(Mail::SpamAssassin::MsgNode);
+
+# ---------------------------------------------------------------------------
+
+=item new()
+
+=cut
+
+sub new {
+ my $class = shift;
+ $class = ref($class) || $class;
+ my %opts = @_;
+ my $self = $class->SUPER::new(%opts);
+
+ $self->{pristine_headers} = '';
+ $self->{pristine_body} = '';
+ $self->{already_parsed} = 1;
+
+ # allow callers to set certain options ...
+ foreach ( 'already_parsed' ) {
+ $self->{$_} = $opts{$_} if ( exists $opts{$_} );
+ }
+
+ bless($self,$class);
+
+ # create the metadata holder class
+ $self->{metadata} = Mail::SpamAssassin::MsgMetadata->new($self);
+
+ $self;
+}
+
+# ---------------------------------------------------------------------------
+
+=item _do_parse()
+
+Non-Public function which will initiate a MIME part parse (generates
+a tree) of the current message. Typically called by find_parts()
+as necessary.
+
+=cut
+
+sub _do_parse {
+ my($self) = @_;
+
+ # If we're called when we don't need to be, then just go ahead and return.
+ return if ($self->{'already_parsed'});
+
+ my $toparse = $self->{'toparse'};
+ delete $self->{'toparse'};
+
+ dbg("---- MIME PARSER START ----");
+
+ # Figure out the boundary
+ my ($boundary);
+ ($self->{'type'}, $boundary) = Mail::SpamAssassin::Util::parse_content_type($self->header('content-type'));
+ dbg("main message type: ".$self->{'type'});
+
+ # Make the tree
+ Mail::SpamAssassin::MsgParser->parse_body( $self, $self, $boundary, $toparse, 1 );
+ $self->{'already_parsed'} = 1;
+
+ dbg("---- MIME PARSER END ----");
+}
+
+=item find_parts()
+
+=cut
+
+# Used to find any MIME parts whose simple content-type matches a given regexp
+# Searches it's own and any children parts. Returns an array of MIME
+# objects which match.
+#
+sub find_parts {
+ my ($self, $re, $onlyleaves, $recursive) = @_;
+
+ # ok, we need to do the parsing now...
+ $self->_do_parse() if (!$self->{'already_parsed'});
+
+ # and pass through to the MsgNode version of the method
+ return $self->SUPER::find_parts($re, $onlyleaves, $recursive);
+}
+
+# ---------------------------------------------------------------------------
+
+=item get_pristine_header()
+
+=cut
+
+sub get_pristine_header {
+ my ($self, $hdr) = @_;
+
+ return $self->{pristine_headers} unless $hdr;
+ my(@ret) = $self->{pristine_headers} =~ /^(?:$hdr:[ ]+(.*\n(?:\s+\S.*\n)*))/mig;
+ if (@ret) {
+ return wantarray ? @ret : $ret[-1];
+ }
+ else {
+ return $self->get_header($hdr);
+ }
+}
+
+sub get_mbox_seperator {
+ return $_[0]->{mbox_sep};
+}
+
+=item get_body()
+
+=cut
+
+sub get_body {
+ my ($self) = @_;
+ my @ret = split(/^/m, $self->{pristine_body});
+ return \@ret;
+}
+
+# ---------------------------------------------------------------------------
+
+=item get_pristine()
+
+=cut
+
+sub get_pristine {
+ my ($self) = @_;
+ return $self->{pristine_headers} . $self->{pristine_body};
+}
+
+=item get_pristine_body()
+
+=cut
+
+sub get_pristine_body {
+ my ($self) = @_;
+ return $self->{pristine_body};
+}
+
+# ---------------------------------------------------------------------------
+
+sub extract_message_metadata {
+ my ($self, $main) = @_;
+
+ # do this only once per message, it can be expensive
+ if ($self->{already_extracted_metadata}) { return; }
+ $self->{already_extracted_metadata} = 1;
+
+ $self->{metadata}->extract ($self, $main);
+}
+
+# ---------------------------------------------------------------------------
+
+=item $str = get_metadata($hdr)
+
+=cut
+
+sub get_metadata {
+ my ($self, $hdr) = @_;
+ if (!$self->{metadata}) {
+ warn "oops! get_metadata() called after finish_metadata()"; return;
+ }
+ $self->{metadata}->{strings}->{$hdr};
+}
+
+=item put_metadata($hdr, $text)
+
+=cut
+
+sub put_metadata {
+ my ($self, $hdr, $text) = @_;
+ if (!$self->{metadata}) {
+ warn "oops! put_metadata() called after finish_metadata()"; return;
+ }
+ $self->{metadata}->{strings}->{$hdr} = $text;
+}
+
+=item delete_metadata($hdr)
+
+=cut
+
+sub delete_metadata {
+ my ($self, $hdr) = @_;
+ if (!$self->{metadata}) {
+ warn "oops! delete_metadata() called after finish_metadata()"; return;
+ }
+ delete $self->{metadata}->{strings}->{$hdr};
+}
+
+=item $str = get_all_metadata()
+
+=cut
+
+sub get_all_metadata {
+ my ($self) = @_;
+
+ if (!$self->{metadata}) {
+ warn "oops! get_all_metadata() called after finish_metadata()"; return;
+ }
+ my @ret = ();
+ foreach my $key (sort keys %{$self->{metadata}->{strings}}) {
+ push (@ret, $key, ": ", $self->{metadata}->{strings}->{$key}, "\n");
+ }
+ return join ("", @ret);
+}
+
+# ---------------------------------------------------------------------------
+
+=item finish_metadata()
+
+Destroys the metadata for this message. Once a message has been
+scanned fully, the metadata is no longer required. Destroying
+this will free up some memory.
+
+=cut
+
+sub finish_metadata {
+ my ($self) = @_;
+ if (defined ($self->{metadata})) {
+ $self->{metadata}->finish();
+ delete $self->{metadata};
+ }
+}
+
+=item finish()
+
+Clean up an object so that it can be destroyed.
+
+=cut
+
+sub finish {
+ my ($self) = @_;
+ $self->finish_metadata();
+}
+
+# ---------------------------------------------------------------------------
+
+sub dbg { Mail::SpamAssassin::dbg (@_); }
+
+1;

Copied: incubator/spamassassin/trunk/lib/Mail/SpamAssassin/MsgNode.pm (from rev 6782, incubator/spamassassin/trunk/lib/Mail/SpamAssassin/MsgContainer.pm)
==============================================================================
--- incubator/spamassassin/trunk/lib/Mail/SpamAssassin/MsgContainer.pm (original)
+++ incubator/spamassassin/trunk/lib/Mail/SpamAssassin/MsgNode.pm Thu Feb 19 15:47:10 2004
@@ -18,7 +18,7 @@

=head1 NAME

-Mail::SpamAssassin::MsgContainer - decode, render, and make available MIME message parts
+Mail::SpamAssassin::MsgNode - decode, render, and make available MIME message parts

=head1 SYNOPSIS

@@ -33,12 +33,10 @@

=cut

-package Mail::SpamAssassin::MsgContainer;
+package Mail::SpamAssassin::MsgNode;
use strict;
-use MIME::Base64;
use Mail::SpamAssassin;
use Mail::SpamAssassin::HTML;
-use Mail::SpamAssassin::MsgMetadata;
use MIME::Base64;
use MIME::QuotedPrint;

@@ -46,81 +44,22 @@

=cut

-# M::SA::MIME is an object method used to encapsulate a message's MIME part
-#
sub new {
my $class = shift;
$class = ref($class) || $class;
- my %opts = @_;
+ my %opts = @_; # unused currently in MsgNode, used in Message

my $self = {
headers => {},
raw_headers => {},
body_parts => [],
- header_order => [],
- already_parsed => 1,
- };
-
- # allow callers to set certain options ...
- foreach ( 'already_parsed' ) {
- $self->{$_} = $opts{$_} if ( exists $opts{$_} );
- }
+ header_order => []
+ };

bless($self,$class);
-
$self;
}

-=item _set_is_root()
-
-Non-Public function to inform this node that it's the root, and
-can hold stuff that only a root should do.
-
-(TODO: IMO, we should just have a subclass of MsgContainer for
-root nodes.)
-
-=cut
-
-sub _set_is_root {
- my($self) = @_;
-
- # create the metadata holder class
- $self->{metadata} = Mail::SpamAssassin::MsgMetadata->new($self);
-}
-
-=item _do_parse()
-
-Non-Public function which will initiate a MIME part part (generates
-a tree) of the current message. Typically called by find_parts()
-as necessary.
-
-=cut
-
-sub _do_parse {
- my($self) = @_;
-
- # If we're called when we don't need to be, then just go ahead and return.
- return if ($self->{'already_parsed'});
-
- my $toparse = $self->{'toparse'};
- delete $self->{'toparse'};
-
- dbg("---- MIME PARSER START ----");
-
- # Figure out the boundary
- my ($boundary);
- ($self->{'type'}, $boundary) = Mail::SpamAssassin::Util::parse_content_type($self->header('content-type'));
- dbg("main message type: ".$self->{'type'});
-
- # Make the tree
- Mail::SpamAssassin::MsgParser->parse_body( $self, $self, $boundary, $toparse, 1 );
- $self->{'already_parsed'} = 1;
-
- dbg("---- MIME PARSER END ----");
-
- return;
-}
-
=item find_parts()

=cut
@@ -137,15 +76,12 @@

$onlyleaves = 0 unless defined $onlyleaves;
$recursive = 1 unless defined $recursive;
-
- # ok, we need to do the parsing now...
- $self->_do_parse() if (!$self->{'already_parsed'});

return $self->_find_parts($re, $onlyleaves, $recursive);
}

# We have 2 functions in find_parts() to optimize out the penalty of
-# 'already_parsed'... It also lets us avoid checking $onlyleaves, $re,
+# 'already_parsed' (in Message), $onlyleaves, $re,
# and $recursive over and over again.
#
sub _find_parts {
@@ -496,24 +432,6 @@
return $header;
}

-=item get_pristine_header()
-
-=cut
-
-
-sub get_pristine_header {
- my ($self, $hdr) = @_;
-
- return $self->{pristine_headers} unless $hdr;
- my(@ret) = $self->{pristine_headers} =~ /^(?:$hdr:[ ]+(.*\n(?:\s+\S.*\n)*))/mig;
- if (@ret) {
- return wantarray ? @ret : $ret[-1];
- }
- else {
- return $self->get_header($hdr);
- }
-}
-
=item get_header()

=cut
@@ -566,134 +484,17 @@
}
}

-sub get_mbox_seperator {
- return $_[0]->{mbox_sep};
-}
-
-=item get_body()
-
-=cut
-
-sub get_body {
- my ($self) = @_;
- my @ret = split(/^/m, $self->{pristine_body});
- return \@ret;
-}
-
-# ---------------------------------------------------------------------------
-
-=item get_pristine()
-
-=cut
-
-sub get_pristine {
- my ($self) = @_;
- return $self->{pristine_headers} . $self->{pristine_body};
-}
-
-=item get_pristine_body()
-
-=cut
-
-sub get_pristine_body {
- my ($self) = @_;
- return $self->{pristine_body};
-}
-
-# ---------------------------------------------------------------------------
-
-sub extract_message_metadata {
- my ($self, $main) = @_;
-
- # do this only once per message, it can be expensive
- if ($self->{already_extracted_metadata}) { return; }
- $self->{already_extracted_metadata} = 1;
-
- $self->{metadata}->extract ($self, $main);
-}
-
-# ---------------------------------------------------------------------------
-
-=item $str = get_metadata($hdr)
-
-=cut
-
-sub get_metadata {
- my ($self, $hdr) = @_;
- if (!$self->{metadata}) {
- warn "oops! get_metadata() called after finish_metadata()"; return;
- }
- $self->{metadata}->{strings}->{$hdr};
-}
-
-=item put_metadata($hdr, $text)
-
-=cut
-
-sub put_metadata {
- my ($self, $hdr, $text) = @_;
- if (!$self->{metadata}) {
- warn "oops! put_metadata() called after finish_metadata()"; return;
- }
- $self->{metadata}->{strings}->{$hdr} = $text;
-}
-
-=item delete_metadata($hdr)
-
-=cut
-
-sub delete_metadata {
- my ($self, $hdr) = @_;
- if (!$self->{metadata}) {
- warn "oops! delete_metadata() called after finish_metadata()"; return;
- }
- delete $self->{metadata}->{strings}->{$hdr};
-}
-
-=item $str = get_all_metadata()
-
-=cut
-
-sub get_all_metadata {
- my ($self) = @_;
-
- if (!$self->{metadata}) {
- warn "oops! get_all_metadata() called after finish_metadata()"; return;
- }
- my @ret = ();
- foreach my $key (sort keys %{$self->{metadata}->{strings}}) {
- push (@ret, $key, ": ", $self->{metadata}->{strings}->{$key}, "\n");
- }
- return join ("", @ret);
-}
-
# ---------------------------------------------------------------------------

-=item finish_metadata()
-
-Destroys the metadata for this message. Once a message has been
-scanned fully, the metadata is no longer required. Destroying
-this will free up some memory.
-
-=cut
-
-sub finish_metadata {
- my ($self) = @_;
- if (defined ($self->{metadata})) {
- $self->{metadata}->finish();
- delete $self->{metadata};
- }
-}
-
=item finish()

-Clean up an object so that it can be destroyed.
+Clean up an object so that it can be destroyed. no-op for MIME parts
+currently.

=cut

sub finish {
my ($self) = @_;
- $self->finish_metadata();
}

# ---------------------------------------------------------------------------

Modified: incubator/spamassassin/trunk/lib/Mail/SpamAssassin/MsgParser.pm
==============================================================================
--- incubator/spamassassin/trunk/lib/Mail/SpamAssassin/MsgParser.pm (original)
+++ incubator/spamassassin/trunk/lib/Mail/SpamAssassin/MsgParser.pm Thu Feb 19 15:47:10 2004
@@ -39,7 +39,7 @@
use strict;

use Mail::SpamAssassin;
-use Mail::SpamAssassin::MsgContainer;
+use Mail::SpamAssassin::MsgNode;

use constant MAX_BODY_LINE_LENGTH => 2048;

@@ -117,7 +117,7 @@
# Else, there's no boundary, so leave the whole part...
}

- my $part_msg = Mail::SpamAssassin::MsgContainer->new(); # prepare a new tree node
+ my $part_msg = Mail::SpamAssassin::MsgNode->new(); # prepare a new tree node
my $in_body = 0;
my $header;
my $part_array;
@@ -151,7 +151,7 @@

# make sure we start with a new clean node
$in_body = 0;
- $part_msg = Mail::SpamAssassin::MsgContainer->new();
+ $part_msg = Mail::SpamAssassin::MsgNode->new();
undef $part_array;
undef $header;

@@ -242,6 +242,7 @@
=head1 SEE ALSO

C<Mail::SpamAssassin>
-C<Mail::SpamAssassin::MsgContainer>
+C<Mail::SpamAssassin::Message>
+C<Mail::SpamAssassin::MsgNode>
C<spamassassin>


Modified: incubator/spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm
==============================================================================
--- incubator/spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm (original)
+++ incubator/spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm Thu Feb 19 15:47:10 2004
@@ -56,7 +56,6 @@
use Mail::SpamAssassin::AutoWhitelist;
use Mail::SpamAssassin::Conf;
use Mail::SpamAssassin::Util;
-use Mail::SpamAssassin::MsgContainer;

use vars qw{
@ISA

Modified: incubator/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin.pm
==============================================================================
--- incubator/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin.pm (original)
+++ incubator/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin.pm Thu Feb 19 15:47:10 2004
@@ -223,7 +223,7 @@

=item msg

-The C<Mail::SpamAssassin::MsgContainer> object for this message.
+The C<Mail::SpamAssassin::Message> object for this message.

=back


Modified: incubator/spamassassin/trunk/masses/mass-check
==============================================================================
--- incubator/spamassassin/trunk/masses/mass-check (original)
+++ incubator/spamassassin/trunk/masses/mass-check Thu Feb 19 15:47:10 2004
@@ -77,7 +77,6 @@
eval "use bytes";
use Mail::SpamAssassin::ArchiveIterator;
use Mail::SpamAssassin;
-use Mail::SpamAssassin::MsgContainer;
use Getopt::Long;
use POSIX qw(strftime);
use constant HAS_TIME_PARSEDATE => eval { require Time::ParseDate; };

Modified: incubator/spamassassin/trunk/spamassassin.raw
==============================================================================
--- incubator/spamassassin/trunk/spamassassin.raw (original)
+++ incubator/spamassassin/trunk/spamassassin.raw Thu Feb 19 15:47:10 2004
@@ -80,7 +80,6 @@

eval {
require Mail::SpamAssassin;
- require Mail::SpamAssassin::MsgContainer;

# gnu_getopt is not available in Getopt::Long 2.24, see bug 732
# gnu_compat neither.

Modified: incubator/spamassassin/trunk/spamd/spamd.raw
==============================================================================
--- incubator/spamassassin/trunk/spamd/spamd.raw (original)
+++ incubator/spamassassin/trunk/spamd/spamd.raw Thu Feb 19 15:47:10 2004
@@ -38,7 +38,6 @@
use IO::Pipe;

use Mail::SpamAssassin;
-use Mail::SpamAssassin::MsgContainer;
use Mail::SpamAssassin::NetSet;

use Getopt::Long;

Modified: incubator/spamassassin/trunk/t/bayesdbm.t
==============================================================================
--- incubator/spamassassin/trunk/t/bayesdbm.t (original)
+++ incubator/spamassassin/trunk/t/bayesdbm.t Thu Feb 19 15:47:10 2004
@@ -26,7 +26,6 @@
");

use Mail::SpamAssassin;
-use Mail::SpamAssassin::MsgContainer;

my $sa = create_saobj();


Modified: incubator/spamassassin/trunk/t/bayessql.t
==============================================================================
--- incubator/spamassassin/trunk/t/bayessql.t (original)
+++ incubator/spamassassin/trunk/t/bayessql.t Thu Feb 19 15:47:10 2004
@@ -59,7 +59,6 @@
");

use Mail::SpamAssassin;
-use Mail::SpamAssassin::MsgContainer;

my $sa = create_saobj();


Modified: incubator/spamassassin/trunk/t/mimeparse.t
==============================================================================
--- incubator/spamassassin/trunk/t/mimeparse.t (original)
+++ incubator/spamassassin/trunk/t/mimeparse.t Thu Feb 19 15:47:10 2004
@@ -17,7 +17,7 @@

use strict;
use Test;
-use Mail::SpamAssassin::MsgContainer;
+use Mail::SpamAssassin;
use Mail::SpamAssassin::SHA1;

my %files = (

Modified: incubator/spamassassin/trunk/t/rule_tests.t
==============================================================================
--- incubator/spamassassin/trunk/t/rule_tests.t (original)
+++ incubator/spamassassin/trunk/t/rule_tests.t Thu Feb 19 15:47:10 2004
@@ -18,7 +18,6 @@
use strict;
use Test;
use Mail::SpamAssassin;
-use Mail::SpamAssassin::MsgContainer;
use vars qw($num_tests);

$num_tests = 1;