bodyparts 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/bodyparts.gemspec +2 -2
- data/lib/bodyparts.rb +23 -6
- data/spec/bodyparts_spec.rb +9 -2
- data/spec/emails.yml +9 -1
- data/spec/spec_helper.rb +1 -2
- metadata +3 -3
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.1.
|
|
1
|
+
0.1.7
|
data/bodyparts.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = %q{bodyparts}
|
|
8
|
-
s.version = "0.1.
|
|
8
|
+
s.version = "0.1.7"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Max Ogden"]
|
|
12
|
-
s.date = %q{2010-06-
|
|
12
|
+
s.date = %q{2010-06-21}
|
|
13
13
|
s.description = %q{Separates new messages from included reply chains in the body of emails}
|
|
14
14
|
s.email = %q{max@maxogden.com}
|
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/bodyparts.rb
CHANGED
|
@@ -10,37 +10,54 @@ class BodyParts
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def self.extract_tmail_attributes(tmail_object)
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
if mail_encoding = tmail_object['content_transfer_encoding']
|
|
14
|
+
content_encoding = mail_encoding.to_s
|
|
15
|
+
else
|
|
16
|
+
content_encoding = "not known"
|
|
17
|
+
end
|
|
18
|
+
|
|
15
19
|
body = if tmail_object.multipart?
|
|
16
20
|
tmail_object.parts.first.body
|
|
17
21
|
else
|
|
18
22
|
tmail_object.body
|
|
19
23
|
end
|
|
20
|
-
|
|
24
|
+
|
|
25
|
+
{:content_encoding => content_encoding, :body => body}
|
|
21
26
|
end
|
|
22
27
|
|
|
23
28
|
def self.extract_mail_attributes(mail_object)
|
|
24
|
-
|
|
25
|
-
|
|
29
|
+
if mail_encoding = mail_object['content_transfer_encoding']
|
|
30
|
+
content_encoding = mail_encoding.encoding
|
|
31
|
+
else
|
|
32
|
+
content_encoding = "not known"
|
|
33
|
+
end
|
|
34
|
+
|
|
26
35
|
if mail_object.find_first_mime_type('text/plain')
|
|
27
36
|
body = mail_object.text_part.body.raw_source
|
|
28
37
|
else
|
|
29
38
|
body = mail_object.body.raw_source
|
|
30
39
|
end
|
|
31
|
-
|
|
40
|
+
|
|
41
|
+
{:content_encoding => content_encoding, :body => body}
|
|
32
42
|
end
|
|
33
43
|
|
|
34
44
|
def self.find_reply_in(email)
|
|
35
45
|
email = Mail::Message.new(email) if email.is_a? String
|
|
46
|
+
|
|
36
47
|
mail_attributes = case email.class.to_s
|
|
37
48
|
when "TMail::Mail" then extract_tmail_attributes(email)
|
|
38
49
|
when "Mail::Message" then extract_mail_attributes(email)
|
|
39
50
|
else raise "You must pass in either a TMail or Mail object or raw email source text"
|
|
40
51
|
end
|
|
52
|
+
|
|
41
53
|
body = mail_attributes[:body]
|
|
54
|
+
|
|
55
|
+
if mail_attributes[:content_encoding] == 'base64'
|
|
56
|
+
body = Base64.decode64 body
|
|
57
|
+
end
|
|
42
58
|
|
|
43
59
|
matches = rules.map {|rule| body.match(rule[:reply_delimiter])}.compact!
|
|
60
|
+
|
|
44
61
|
unless matches.empty?
|
|
45
62
|
match = matches.sort_by {|m| m.begin(0)}.first
|
|
46
63
|
new_message = body[0, match.begin(0)]
|
data/spec/bodyparts_spec.rb
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
2
|
|
|
3
3
|
describe "BodyParts" do
|
|
4
|
-
|
|
5
4
|
[TMail::Mail, Mail].each do |mail_object|
|
|
6
5
|
it "should accept and parse #{mail_object} objects as input" do
|
|
7
6
|
generic = FakeMessage.fake_emails[:generic]
|
|
@@ -9,7 +8,7 @@ describe "BodyParts" do
|
|
|
9
8
|
BodyParts.find_reply_in(message)[:new_message].should == generic[:reply_text]
|
|
10
9
|
end
|
|
11
10
|
end
|
|
12
|
-
|
|
11
|
+
|
|
13
12
|
%w(gmail yahoo hotmail aol_webmail generic).each do |mail_server|
|
|
14
13
|
it "should strip out the replies from a #{mail_server} message containing forwarded junk" do
|
|
15
14
|
mail_server = FakeMessage.fake_emails[mail_server.to_sym]
|
|
@@ -41,4 +40,12 @@ describe "BodyParts" do
|
|
|
41
40
|
message = FakeMessage.load_mail(with_attachment[:filename])
|
|
42
41
|
BodyParts.find_reply_in(message)[:new_message].should == with_attachment[:reply_text]
|
|
43
42
|
end
|
|
43
|
+
|
|
44
|
+
[TMail::Mail, Mail].each do |mail_type|
|
|
45
|
+
it "should correctly parse base64 encoded #{mail_type} messages" do
|
|
46
|
+
base64_encoded = FakeMessage.fake_emails[:base64_encoded]
|
|
47
|
+
message = FakeMessage.new_mail(mail_type, base64_encoded[:headers])
|
|
48
|
+
BodyParts.find_reply_in(message)[:new_message].should == base64_encoded[:reply_text]
|
|
49
|
+
end
|
|
50
|
+
end
|
|
44
51
|
end
|
data/spec/emails.yml
CHANGED
data/spec/spec_helper.rb
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
require 'spec'
|
|
2
2
|
require File.expand_path(File.dirname(__FILE__) + '/../lib/bodyparts.rb')
|
|
3
3
|
|
|
4
|
-
|
|
5
4
|
class FakeMessage
|
|
6
5
|
def self.fake_emails
|
|
7
6
|
YAML.load_file(File.expand_path(File.dirname(__FILE__) + '/emails.yml'))
|
|
@@ -26,7 +25,7 @@ class FakeMessage
|
|
|
26
25
|
mail = mail_class.new do
|
|
27
26
|
if mail_class == Mail
|
|
28
27
|
text_part do
|
|
29
|
-
body headers.delete
|
|
28
|
+
body headers.delete "body"
|
|
30
29
|
end
|
|
31
30
|
end
|
|
32
31
|
end
|
metadata
CHANGED
|
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
|
5
5
|
segments:
|
|
6
6
|
- 0
|
|
7
7
|
- 1
|
|
8
|
-
-
|
|
9
|
-
version: 0.1.
|
|
8
|
+
- 7
|
|
9
|
+
version: 0.1.7
|
|
10
10
|
platform: ruby
|
|
11
11
|
authors:
|
|
12
12
|
- Max Ogden
|
|
@@ -14,7 +14,7 @@ autorequire:
|
|
|
14
14
|
bindir: bin
|
|
15
15
|
cert_chain: []
|
|
16
16
|
|
|
17
|
-
date: 2010-06-
|
|
17
|
+
date: 2010-06-21 00:00:00 -07:00
|
|
18
18
|
default_executable:
|
|
19
19
|
dependencies:
|
|
20
20
|
- !ruby/object:Gem::Dependency
|