attachments 0.0.13 → 0.0.14
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/README.rdoc +7 -1
- data/VERSION +1 -1
- data/attachments.gemspec +60 -0
- data/lib/attachments/extract.rb +35 -26
- data/test/test_attachments.rb +18 -7
- metadata +8 -29
- data/.gitignore +0 -21
data/README.rdoc
CHANGED
@@ -18,6 +18,12 @@ times faster at decoding large attachments if you us ruby 1.9 instead of 1.8.
|
|
18
18
|
|
19
19
|
== NEW STUFF:
|
20
20
|
|
21
|
+
Version 0.0.14
|
22
|
+
|
23
|
+
* Support in-memory storage of attachments to support processing on
|
24
|
+
systems without access to file system (i.e. Heroku + Cloudmailin)
|
25
|
+
* Include set in extract.rb to avoid exception in ruby 1.9.2
|
26
|
+
|
21
27
|
Version 0.0.11
|
22
28
|
|
23
29
|
* Convert the subject to utf-8
|
@@ -90,7 +96,7 @@ when they are uncertain.
|
|
90
96
|
puts f.inspect
|
91
97
|
case f[:mime_type]
|
92
98
|
when "text/plain" then
|
93
|
-
puts File.read(f[:tmpfile])
|
99
|
+
puts f[:body] || File.read(f[:tmpfile])
|
94
100
|
end
|
95
101
|
end
|
96
102
|
# Remove tmp files and prepare for new parsing action
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.14
|
data/attachments.gemspec
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{attachments}
|
8
|
+
s.version = "0.0.14"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Rune Myrland"]
|
12
|
+
s.date = %q{2011-04-07}
|
13
|
+
s.description = %q{It's original intention is as a helper class class for filtering email attachments before forwarding. The extracted attachments are saved in the /tmp directory.}
|
14
|
+
s.email = %q{rune@epubify.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
"LICENSE",
|
22
|
+
"README.rdoc",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"attachments.gemspec",
|
26
|
+
"lib/attachments.rb",
|
27
|
+
"lib/attachments/extract.rb",
|
28
|
+
"lib/attachments/filemagic.rb",
|
29
|
+
"test/data/mail_0001.eml",
|
30
|
+
"test/data/mail_0002.eml",
|
31
|
+
"test/data/mail_0002.jpg",
|
32
|
+
"test/data/mail_0004.eml",
|
33
|
+
"test/helper.rb",
|
34
|
+
"test/test_attachments.rb"
|
35
|
+
]
|
36
|
+
s.homepage = %q{http://github.com/wrimle/attachments}
|
37
|
+
s.require_paths = ["lib"]
|
38
|
+
s.rubygems_version = %q{1.6.2}
|
39
|
+
s.summary = %q{Extract mail parts of specified mime types.}
|
40
|
+
s.test_files = [
|
41
|
+
"test/helper.rb",
|
42
|
+
"test/test_attachments.rb"
|
43
|
+
]
|
44
|
+
|
45
|
+
if s.respond_to? :specification_version then
|
46
|
+
s.specification_version = 3
|
47
|
+
|
48
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
49
|
+
s.add_runtime_dependency(%q<mail>, [">= 2.2.5"])
|
50
|
+
s.add_runtime_dependency(%q<uuidtools>, [">= 2.1.1"])
|
51
|
+
else
|
52
|
+
s.add_dependency(%q<mail>, [">= 2.2.5"])
|
53
|
+
s.add_dependency(%q<uuidtools>, [">= 2.1.1"])
|
54
|
+
end
|
55
|
+
else
|
56
|
+
s.add_dependency(%q<mail>, [">= 2.2.5"])
|
57
|
+
s.add_dependency(%q<uuidtools>, [">= 2.1.1"])
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
data/lib/attachments/extract.rb
CHANGED
@@ -5,6 +5,7 @@ require 'uuidtools'
|
|
5
5
|
require 'fileutils'
|
6
6
|
require 'mail'
|
7
7
|
require 'iconv'
|
8
|
+
require 'set'
|
8
9
|
|
9
10
|
|
10
11
|
module Attachments
|
@@ -19,14 +20,15 @@ module Attachments
|
|
19
20
|
UNCERTAIN_TYPES = [ "application/octet-stream" ].to_set
|
20
21
|
|
21
22
|
|
22
|
-
def initialize include_types = [ "text/plain" ]
|
23
|
+
def initialize include_types = [ "text/plain" ], options = { :cache_in_memory => false }
|
23
24
|
@include_types = include_types
|
25
|
+
@cache_in_memory = options [ :cache_in_memory ] || false
|
24
26
|
reset
|
25
27
|
end
|
26
28
|
|
27
29
|
def close
|
28
30
|
files.each do |f|
|
29
|
-
FileUtils::rm(f[:tmpfile])
|
31
|
+
FileUtils::rm(f[:tmpfile]) unless @cache_in_memory
|
30
32
|
end
|
31
33
|
reset
|
32
34
|
end
|
@@ -95,7 +97,7 @@ module Attachments
|
|
95
97
|
end
|
96
98
|
|
97
99
|
def text_body
|
98
|
-
if(@mail &&
|
100
|
+
if(@mail && @mail.text_part && @mail.text_part.body)
|
99
101
|
m = @mail.text_part.body.decoded
|
100
102
|
charset = @mail.text_part.charset
|
101
103
|
text = charset ? Iconv.conv("utf-8", charset, m) : m
|
@@ -173,14 +175,7 @@ module Attachments
|
|
173
175
|
@name = mail.content_type_parameters['name'] || "unnamed"
|
174
176
|
@name.gsub! /[^\w\.\-]/, '_' # Sanitize
|
175
177
|
|
176
|
-
#
|
177
|
-
uuid = UUIDTools::UUID.random_create.hexdigest
|
178
|
-
|
179
|
-
# The filename used for storage
|
180
|
-
filename = "#{@name}.#{uuid}"
|
181
|
-
filepath = "/tmp/#{filename}"
|
182
|
-
|
183
|
-
|
178
|
+
# Extract body
|
184
179
|
body = case ct
|
185
180
|
when "text/plain" then
|
186
181
|
m = mail.body.decoded
|
@@ -207,24 +202,38 @@ module Attachments
|
|
207
202
|
mail.body.decoded
|
208
203
|
end
|
209
204
|
|
210
|
-
#
|
211
|
-
|
212
|
-
f.write(body)
|
213
|
-
f.close
|
205
|
+
# Make it unique
|
206
|
+
uuid = UUIDTools::UUID.random_create.hexdigest
|
214
207
|
|
215
|
-
|
216
|
-
|
217
|
-
return
|
218
|
-
end
|
208
|
+
# The filename used for storage
|
209
|
+
filename = "#{@name}.#{uuid}"
|
219
210
|
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
211
|
+
if @cache_in_memory
|
212
|
+
mime_type = ct
|
213
|
+
@files << { :name => @name, :body => body, :save_as => name, :upload_to => filename, :mime_type => mime_type }
|
214
|
+
else
|
215
|
+
# Tmp file
|
216
|
+
filepath = "/tmp/#{filename}"
|
217
|
+
|
218
|
+
# Save part as it is of a supported type
|
219
|
+
f = File.new(filepath, "wb")
|
220
|
+
f.write(body)
|
221
|
+
f.close
|
222
|
+
|
223
|
+
unless File.exists?(filepath)
|
224
|
+
raise Error::SaveFailed, "Save failed for ", filepath, "\n"
|
225
|
+
return
|
226
|
+
end
|
227
|
+
|
228
|
+
# Sort out the mime type
|
229
|
+
mime_type = ct
|
230
|
+
if(UNCERTAIN_TYPES.include? mime_type)
|
231
|
+
mime_type = FileMagic::mime filename
|
232
|
+
end
|
233
|
+
|
234
|
+
# Save meta-data for further processing
|
235
|
+
@files << { :name => @name, :tmpfile => filepath, :save_as => name, :upload_to => filename, :mime_type => mime_type }
|
224
236
|
end
|
225
|
-
|
226
|
-
# Save meta-data for further processing
|
227
|
-
@files << { :name => @name, :tmpfile => filepath, :save_as => name, :upload_to => filename, :mime_type => mime_type }
|
228
237
|
end
|
229
238
|
end
|
230
239
|
end
|
data/test/test_attachments.rb
CHANGED
@@ -4,7 +4,7 @@ require 'helper'
|
|
4
4
|
require 'iconv'
|
5
5
|
|
6
6
|
class TestAttachments < Test::Unit::TestCase
|
7
|
-
def
|
7
|
+
def compare_extractors_old a, b
|
8
8
|
(0...a.files.length).each do |i|
|
9
9
|
tmp_a = a.files[i][:tmpfile]
|
10
10
|
tmp_b = b.files[i][:tmpfile]
|
@@ -14,9 +14,20 @@ class TestAttachments < Test::Unit::TestCase
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
|
18
|
+
def compare_extractors a, b
|
19
|
+
(0...a.files.length).each do |i|
|
20
|
+
tmp_a = a.files[i][:body] || File.read(a.files[i][:tmpfile])
|
21
|
+
tmp_b = b.files[i][:body] || File.read(a.files[i][:tmpfile])
|
22
|
+
|
23
|
+
isIdentical = (tmp_a === tmp_b)
|
24
|
+
assert(isIdentical)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
17
28
|
context "Parse test cases without crashes" do
|
18
29
|
setup do
|
19
|
-
@extract = Attachments::Extract.new [ "text/plain", "image/jpeg" ]
|
30
|
+
@extract = Attachments::Extract.new [ "text/plain", "image/jpeg" ], { :cache_in_memory => true }
|
20
31
|
end
|
21
32
|
|
22
33
|
teardown do
|
@@ -45,7 +56,7 @@ class TestAttachments < Test::Unit::TestCase
|
|
45
56
|
|
46
57
|
context "Just text text/plain and text/html" do
|
47
58
|
setup do
|
48
|
-
@extract = Attachments::Extract.new [ "text/plain" ]
|
59
|
+
@extract = Attachments::Extract.new [ "text/plain" ], { :cache_in_memory => false }
|
49
60
|
@extract.parse "./test/data/mail_0001.eml"
|
50
61
|
end
|
51
62
|
|
@@ -87,7 +98,7 @@ class TestAttachments < Test::Unit::TestCase
|
|
87
98
|
|
88
99
|
context "UTF-8 and text/plain and image attachment" do
|
89
100
|
setup do
|
90
|
-
@extract = Attachments::Extract.new [ "text/plain", "image/jpeg" ]
|
101
|
+
@extract = Attachments::Extract.new [ "text/plain", "image/jpeg" ], { :cache_in_memory => false }
|
91
102
|
@extract.parse "./test/data/mail_0002.eml"
|
92
103
|
end
|
93
104
|
|
@@ -106,7 +117,7 @@ class TestAttachments < Test::Unit::TestCase
|
|
106
117
|
|
107
118
|
context "convenience accessors" do
|
108
119
|
setup do
|
109
|
-
@extract = Attachments::Extract.new [ "text/plain", "image/jpeg" ]
|
120
|
+
@extract = Attachments::Extract.new [ "text/plain", "image/jpeg" ], { :cache_in_memory => true }
|
110
121
|
@extract.parse "./test/data/mail_0001.eml"
|
111
122
|
end
|
112
123
|
|
@@ -138,8 +149,8 @@ class TestAttachments < Test::Unit::TestCase
|
|
138
149
|
|
139
150
|
context "Parse parameters" do
|
140
151
|
setup do
|
141
|
-
@a = Attachments::Extract.new [ "text/plain", "image/jpeg" ]
|
142
|
-
@b = Attachments::Extract.new [ "text/plain", "image/jpeg" ]
|
152
|
+
@a = Attachments::Extract.new [ "text/plain", "image/jpeg" ], { :cache_in_memory => true }
|
153
|
+
@b = Attachments::Extract.new [ "text/plain", "image/jpeg" ], { :cache_in_memory => true }
|
143
154
|
end
|
144
155
|
|
145
156
|
teardown do
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attachments
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 13
|
10
|
-
version: 0.0.13
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.14
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Rune Myrland
|
@@ -15,7 +10,7 @@ autorequire:
|
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date:
|
13
|
+
date: 2011-04-07 00:00:00 +02:00
|
19
14
|
default_executable:
|
20
15
|
dependencies:
|
21
16
|
- !ruby/object:Gem::Dependency
|
@@ -26,11 +21,6 @@ dependencies:
|
|
26
21
|
requirements:
|
27
22
|
- - ">="
|
28
23
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 13
|
30
|
-
segments:
|
31
|
-
- 2
|
32
|
-
- 2
|
33
|
-
- 5
|
34
24
|
version: 2.2.5
|
35
25
|
type: :runtime
|
36
26
|
version_requirements: *id001
|
@@ -42,11 +32,6 @@ dependencies:
|
|
42
32
|
requirements:
|
43
33
|
- - ">="
|
44
34
|
- !ruby/object:Gem::Version
|
45
|
-
hash: 9
|
46
|
-
segments:
|
47
|
-
- 2
|
48
|
-
- 1
|
49
|
-
- 1
|
50
35
|
version: 2.1.1
|
51
36
|
type: :runtime
|
52
37
|
version_requirements: *id002
|
@@ -61,11 +46,11 @@ extra_rdoc_files:
|
|
61
46
|
- README.rdoc
|
62
47
|
files:
|
63
48
|
- .document
|
64
|
-
- .gitignore
|
65
49
|
- LICENSE
|
66
50
|
- README.rdoc
|
67
51
|
- Rakefile
|
68
52
|
- VERSION
|
53
|
+
- attachments.gemspec
|
69
54
|
- lib/attachments.rb
|
70
55
|
- lib/attachments/extract.rb
|
71
56
|
- lib/attachments/filemagic.rb
|
@@ -80,8 +65,8 @@ homepage: http://github.com/wrimle/attachments
|
|
80
65
|
licenses: []
|
81
66
|
|
82
67
|
post_install_message:
|
83
|
-
rdoc_options:
|
84
|
-
|
68
|
+
rdoc_options: []
|
69
|
+
|
85
70
|
require_paths:
|
86
71
|
- lib
|
87
72
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -89,26 +74,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
89
74
|
requirements:
|
90
75
|
- - ">="
|
91
76
|
- !ruby/object:Gem::Version
|
92
|
-
hash: 3
|
93
|
-
segments:
|
94
|
-
- 0
|
95
77
|
version: "0"
|
96
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
79
|
none: false
|
98
80
|
requirements:
|
99
81
|
- - ">="
|
100
82
|
- !ruby/object:Gem::Version
|
101
|
-
hash: 3
|
102
|
-
segments:
|
103
|
-
- 0
|
104
83
|
version: "0"
|
105
84
|
requirements: []
|
106
85
|
|
107
86
|
rubyforge_project:
|
108
|
-
rubygems_version: 1.
|
87
|
+
rubygems_version: 1.6.2
|
109
88
|
signing_key:
|
110
89
|
specification_version: 3
|
111
90
|
summary: Extract mail parts of specified mime types.
|
112
91
|
test_files:
|
113
|
-
- test/test_attachments.rb
|
114
92
|
- test/helper.rb
|
93
|
+
- test/test_attachments.rb
|