clutil 2010.127.0 → 2010.129.0
Sign up to get free protection for your applications and to get access to all the features.
- data/cl/util/smtp.rb +108 -88
- data/cl/util/test.rb +1 -4
- data/cl/util/test/dirsizetest.rb +66 -66
- data/cl/util/test/filetest.rb +2 -2
- data/cl/util/util.rb +2 -2
- metadata +14 -5
data/cl/util/smtp.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# $Id: smtp.rb,v 1.4 2008/12/09 06:58:56 chrismo Exp $
|
2
2
|
=begin
|
3
3
|
--------------------------------------------------------------------------
|
4
|
-
Copyright (c) 2001-
|
4
|
+
Copyright (c) 2001-2010, Chris Morris
|
5
5
|
All rights reserved.
|
6
6
|
|
7
7
|
Redistribution and use in source and binary forms, with or without modification,
|
@@ -32,100 +32,120 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
32
32
|
=end
|
33
33
|
require 'net/smtp'
|
34
34
|
require 'time'
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
35
|
+
|
36
|
+
module ClUtil
|
37
|
+
class Attachment
|
38
|
+
def self.load_from_file(filename)
|
39
|
+
data = nil
|
40
|
+
File.open(filename, 'rb') do |f|
|
41
|
+
data = f.read()
|
42
|
+
end
|
43
|
+
data = [data].pack("m*")
|
44
|
+
Attachment.new(File.basename(filename), data)
|
45
|
+
end
|
46
|
+
|
47
|
+
attr_reader :name, :data
|
48
|
+
|
49
|
+
def initialize(name, data)
|
50
|
+
@name = name
|
51
|
+
@data = data
|
52
|
+
end
|
40
53
|
end
|
41
|
-
data = [data].pack("m*")
|
42
|
-
data
|
43
|
-
end
|
44
54
|
|
45
|
-
|
46
|
-
|
55
|
+
class Smtp
|
56
|
+
attr_reader :attachments
|
57
|
+
attr_accessor :from, :subj, :body, :extra_headers
|
58
|
+
|
59
|
+
def initialize(smtpsrv='localhost')
|
60
|
+
@smtpsrv = smtpsrv
|
61
|
+
@attachments = []
|
62
|
+
end
|
63
|
+
|
64
|
+
def to
|
65
|
+
@to
|
66
|
+
end
|
67
|
+
|
68
|
+
def to=(value)
|
69
|
+
@to = [value].flatten
|
70
|
+
end
|
71
|
+
|
72
|
+
def sendmail
|
73
|
+
msg = build_message
|
74
|
+
Net::SMTP.start(@smtpsrv) do |smtp|
|
75
|
+
smtp.sendmail(msg, @from, @to)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def build_message
|
80
|
+
msg = format_headers
|
81
|
+
boundary = create_boundary
|
82
|
+
|
83
|
+
if !@attachments.empty?
|
84
|
+
msg << [
|
85
|
+
"Content-Type: multipart/mixed; boundary=\"#{boundary}\"\n",
|
86
|
+
"\n",
|
87
|
+
"This is a multi-part message in MIME format.\n",
|
88
|
+
"\n"
|
89
|
+
]
|
90
|
+
end
|
91
|
+
|
92
|
+
if @body
|
93
|
+
msg << [ "--#{boundary}\n" ] if !@attachments.empty?
|
94
|
+
msg << [
|
95
|
+
"Content-Type: text/plain; charset=\"iso-8859-1\"\n",
|
96
|
+
"Content-Transfer-Encoding: 8bit\n",
|
97
|
+
"\n",
|
98
|
+
"#{@body}\n",
|
99
|
+
"\n"
|
100
|
+
]
|
101
|
+
end
|
102
|
+
|
103
|
+
@attachments.each do |attachment|
|
104
|
+
basename = attachment.name
|
105
|
+
msg << [
|
106
|
+
"--#{boundary}\n",
|
107
|
+
"Content-Type: application/octet-stream; name=\"#{basename}\"\n",
|
108
|
+
"Content-Transfer-Encoding: base64\n",
|
109
|
+
"Content-Disposition: attachment; filename=\"#{basename}\"\n",
|
110
|
+
"\n",
|
111
|
+
"#{attachment.data}", # no \n needed
|
112
|
+
"\n"
|
113
|
+
]
|
114
|
+
end
|
115
|
+
|
116
|
+
msg << ["--#{boundary}--\n"] if !@attachments.empty?
|
117
|
+
|
118
|
+
msg.flatten!
|
119
|
+
end
|
120
|
+
|
121
|
+
def create_boundary()
|
122
|
+
return "_____clabs_smtp_boundary______#{Time.new.to_i.to_s}___"
|
123
|
+
end
|
124
|
+
|
125
|
+
def format_headers
|
126
|
+
headers = ["Subject: #{subj}", "From: #{from}", "To: #{to.join(";")}", "Date: #{Time.now.rfc2822}", "MIME-Version: 1.0" ]
|
127
|
+
headers << @extra_headers if @extra_headers
|
128
|
+
headers.flatten!
|
129
|
+
headers.collect! { |hdr| hdr.strip << "\n" }
|
130
|
+
[headers].flatten
|
131
|
+
end
|
132
|
+
end
|
47
133
|
end
|
48
134
|
|
135
|
+
# deprecated - use ClUtil::Smtp instead. The attachments argument is designed
|
136
|
+
# to be either a single filename or an array of filenames.
|
49
137
|
def sendmail(to, from, subj, body, smtpsrv=nil, attachments=nil, extra_headers=nil)
|
50
138
|
smtpsrv = 'localhost' if !smtpsrv
|
139
|
+
smtp = ClUtil::Smtp.new(smtpsrv)
|
140
|
+
smtp.to = to
|
141
|
+
smtp.from = from
|
142
|
+
smtp.subj = subj
|
143
|
+
smtp.body = body
|
144
|
+
smtp.extra_headers = extra_headers
|
51
145
|
attachments = [attachments].flatten
|
52
146
|
attachments.compact!
|
53
|
-
attachments
|
54
|
-
|
55
|
-
|
56
|
-
headers = ["Subject: #{subj}", "From: #{from}", "To: #{to.join(";")}", "Date: #{Time.now.rfc2822}", "MIME-Version: 1.0" ]
|
57
|
-
headers << extra_headers if !extra_headers.nil?
|
58
|
-
headers.flatten!
|
59
|
-
headers.collect! { |hdr| hdr.strip << "\n" }
|
60
|
-
msg = [ headers ].flatten
|
61
|
-
|
62
|
-
boundary = create_boundary
|
63
|
-
|
64
|
-
if attachments
|
65
|
-
msg << [
|
66
|
-
"Content-Type: multipart/mixed; boundary=\"#{boundary}\"\n",
|
67
|
-
"\n",
|
68
|
-
"This is a multi-part message in MIME format.\n",
|
69
|
-
"\n"
|
70
|
-
]
|
147
|
+
attachments.each do |attachment_fn|
|
148
|
+
smtp.attachments << ClUtil::Attachment.load_from_file(attachment_fn)
|
71
149
|
end
|
72
|
-
|
73
|
-
if body
|
74
|
-
msg << [ "--#{boundary}\n" ] if attachments
|
75
|
-
msg << [
|
76
|
-
"Content-Type: text/plain; charset=\"iso-8859-1\"\n",
|
77
|
-
"Content-Transfer-Encoding: 8bit\n",
|
78
|
-
"\n",
|
79
|
-
"#{body}\n",
|
80
|
-
"\n"
|
81
|
-
]
|
82
|
-
end
|
83
|
-
|
84
|
-
attachments.each do |filename|
|
85
|
-
basename = File.basename(filename)
|
86
|
-
filedata = get_filedata(filename)
|
87
|
-
msg << [
|
88
|
-
"--#{boundary}\n",
|
89
|
-
"Content-Type: application/octet-stream; name=\"#{basename}\"\n",
|
90
|
-
"Content-Transfer-Encoding: base64\n",
|
91
|
-
"Content-Disposition: attachment; filename=\"#{basename}\"\n",
|
92
|
-
"\n",
|
93
|
-
"#{filedata}", # no \n needed
|
94
|
-
"\n"
|
95
|
-
]
|
96
|
-
end if attachments
|
97
|
-
|
98
|
-
msg << ["--#{boundary}--\n"] if attachments
|
99
|
-
|
100
|
-
msg.flatten!
|
101
|
-
|
102
|
-
Net::SMTP.start(smtpsrv) do |smtp|
|
103
|
-
smtp.sendmail(msg, from, to)
|
104
|
-
end
|
150
|
+
smtp.sendmail
|
105
151
|
end
|
106
|
-
|
107
|
-
if __FILE__ == $0
|
108
|
-
require 'test/unit'
|
109
|
-
|
110
|
-
class TestSendMail < Test::Unit::TestCase
|
111
|
-
def testsendmail
|
112
|
-
addr = 'chrismo@clabs.org'
|
113
|
-
sendmail(addr, addr, 'unit test', 'this is a unit test')
|
114
|
-
sendmail([addr, addr], addr, 'unit test', 'this is a unit test')
|
115
|
-
end
|
116
|
-
|
117
|
-
def testattachment
|
118
|
-
File.open('test.txt', 'w+') do |f| f.print "test attachment\n" end
|
119
|
-
addr = 'chrismo@clabs.org'
|
120
|
-
sendmail(addr, addr, 'unit test', 'this is a unit test', nil, 'test.txt')
|
121
|
-
sendmail(addr, addr, 'unit test', 'this is a unit test', nil, ['test.txt', 'smtp.rb'])
|
122
|
-
end
|
123
|
-
|
124
|
-
def test_thread
|
125
|
-
addr = 'chrismo@clabs.org'
|
126
|
-
headers = ["In-Reply-To: <foo@clabs.org>"]
|
127
|
-
sendmail(addr, addr, 'smtp.rb thread test', 'body', nil, nil, headers)
|
128
|
-
sendmail(addr, addr, 'smtp.rb thread test', 'body', nil, nil, headers)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
data/cl/util/test.rb
CHANGED
@@ -41,7 +41,7 @@ class TempDirTest < Test::Unit::TestCase
|
|
41
41
|
@tempDir = '/tmp/tests'
|
42
42
|
end
|
43
43
|
|
44
|
-
def
|
44
|
+
def setup
|
45
45
|
@fileNameInc = 0
|
46
46
|
setTempDir
|
47
47
|
File.makedirs(@tempDir) if !FileTest.directory?(@tempDir)
|
@@ -51,9 +51,6 @@ class TempDirTest < Test::Unit::TestCase
|
|
51
51
|
ClUtilFile.delTree(@tempDir)
|
52
52
|
end
|
53
53
|
|
54
|
-
alias setup set_up
|
55
|
-
alias teardown tear_down
|
56
|
-
|
57
54
|
# to ward off the new Test::Unit detection of classes with no test
|
58
55
|
# methods
|
59
56
|
def default_test
|
data/cl/util/test/dirsizetest.rb
CHANGED
@@ -48,91 +48,91 @@ TestData = Struct.new("TestData",
|
|
48
48
|
)
|
49
49
|
|
50
50
|
class TestDirSize < TempDirTest
|
51
|
-
def
|
51
|
+
def setup
|
52
52
|
super
|
53
|
-
@
|
53
|
+
@test_data = TestData.new
|
54
54
|
end
|
55
55
|
|
56
|
-
def
|
56
|
+
def test_larger_singleton
|
57
57
|
makeSampleTextFile('', 5000)
|
58
|
-
@
|
59
|
-
@
|
60
|
-
@
|
61
|
-
@
|
62
|
-
@
|
63
|
-
@
|
64
|
-
@
|
65
|
-
@
|
66
|
-
@
|
67
|
-
|
58
|
+
@test_data.clusterSize = 4096
|
59
|
+
@test_data.expectedFileSize = 5000
|
60
|
+
@test_data.expectedDiskSpace = (4096 * 2)
|
61
|
+
@test_data.expectedFileSizeIncludeSubs = 5000
|
62
|
+
@test_data.expectedDiskSpaceIncludeSubs = (4096 * 2)
|
63
|
+
@test_data.expectedFileCount = 1
|
64
|
+
@test_data.expectedAvgFileSize = 5000
|
65
|
+
@test_data.expectedFileCountIncludeSubs = 1
|
66
|
+
@test_data.expectedAvgFileSizeIncludeSubs = 5000
|
67
|
+
do_test_dir_size(@test_data)
|
68
68
|
end
|
69
69
|
|
70
|
-
def
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
assert_equal(
|
76
|
-
assert_equal(
|
77
|
-
assert_equal(
|
78
|
-
assert_equal(
|
79
|
-
|
80
|
-
assert_equal(
|
81
|
-
|
70
|
+
def do_test_dir_size(test_data)
|
71
|
+
dir_size = DirSize.new
|
72
|
+
dir_size.directory = @tempDir
|
73
|
+
dir_size.clusterSize = test_data.clusterSize
|
74
|
+
dir_size.getSize
|
75
|
+
assert_equal(test_data.expectedFileSize, dir_size.fileSize(false))
|
76
|
+
assert_equal(test_data.expectedDiskSpace, dir_size.diskSpace(false))
|
77
|
+
assert_equal(test_data.expectedFileSizeIncludeSubs, dir_size.fileSize(true))
|
78
|
+
assert_equal(test_data.expectedDiskSpaceIncludeSubs,
|
79
|
+
dir_size.diskSpace(true))
|
80
|
+
assert_equal(test_data.expectedDiskSpace - test_data.expectedFileSize,
|
81
|
+
dir_size.unusedDiskSpace(false))
|
82
82
|
assert_equal(
|
83
|
-
(
|
84
|
-
|
85
|
-
assert_equal(
|
86
|
-
assert_equal(
|
87
|
-
assert_equal(
|
88
|
-
|
89
|
-
assert_equal(
|
90
|
-
|
83
|
+
(test_data.expectedDiskSpaceIncludeSubs -
|
84
|
+
test_data.expectedFileSizeIncludeSubs), dir_size.unusedDiskSpace(true))
|
85
|
+
assert_equal(test_data.expectedFileCount, dir_size.fileCount(false))
|
86
|
+
assert_equal(test_data.expectedAvgFileSize, dir_size.avgFileSize(false))
|
87
|
+
assert_equal(test_data.expectedFileCountIncludeSubs,
|
88
|
+
dir_size.fileCount(true))
|
89
|
+
assert_equal(test_data.expectedAvgFileSizeIncludeSubs,
|
90
|
+
dir_size.avgFileSize(true))
|
91
91
|
end
|
92
92
|
|
93
|
-
def
|
93
|
+
def test_small_singleton
|
94
94
|
makeSampleTextFile('', 1000)
|
95
|
-
@
|
96
|
-
@
|
97
|
-
@
|
98
|
-
@
|
99
|
-
@
|
100
|
-
@
|
101
|
-
@
|
102
|
-
@
|
103
|
-
@
|
104
|
-
|
95
|
+
@test_data.clusterSize = 4096
|
96
|
+
@test_data.expectedFileSize = 1000
|
97
|
+
@test_data.expectedDiskSpace = (4096 * 1)
|
98
|
+
@test_data.expectedFileSizeIncludeSubs = 1000
|
99
|
+
@test_data.expectedDiskSpaceIncludeSubs = (4096 * 1)
|
100
|
+
@test_data.expectedFileCount = 1
|
101
|
+
@test_data.expectedAvgFileSize = 1000
|
102
|
+
@test_data.expectedFileCountIncludeSubs = 1
|
103
|
+
@test_data.expectedAvgFileSizeIncludeSubs = 1000
|
104
|
+
do_test_dir_size(@test_data)
|
105
105
|
end
|
106
106
|
|
107
|
-
def
|
107
|
+
def test_sub_dir
|
108
108
|
makeSubDir('suba')
|
109
109
|
makeSubDir("suba\\suba1")
|
110
110
|
makeSampleTextFile('', 1000)
|
111
111
|
makeSampleTextFile('suba', 1000)
|
112
112
|
makeSampleTextFile("suba\\suba1", 1000)
|
113
113
|
makeSampleTextFile("suba\\suba1", 2000)
|
114
|
-
@
|
115
|
-
@
|
116
|
-
@
|
117
|
-
@
|
118
|
-
@
|
119
|
-
@
|
120
|
-
@
|
121
|
-
@
|
122
|
-
@
|
123
|
-
|
114
|
+
@test_data.clusterSize = 4096
|
115
|
+
@test_data.expectedFileSize = 1000
|
116
|
+
@test_data.expectedDiskSpace = (4096 * 1)
|
117
|
+
@test_data.expectedFileSizeIncludeSubs = 5000
|
118
|
+
@test_data.expectedDiskSpaceIncludeSubs = (4096 * 4)
|
119
|
+
@test_data.expectedFileCount = 1
|
120
|
+
@test_data.expectedAvgFileSize = 1000
|
121
|
+
@test_data.expectedFileCountIncludeSubs = 4
|
122
|
+
@test_data.expectedAvgFileSizeIncludeSubs = 1250
|
123
|
+
do_test_dir_size(@test_data)
|
124
124
|
end
|
125
125
|
|
126
|
-
def
|
127
|
-
@
|
128
|
-
@
|
129
|
-
@
|
130
|
-
@
|
131
|
-
@
|
132
|
-
@
|
133
|
-
@
|
134
|
-
@
|
135
|
-
@
|
136
|
-
|
126
|
+
def test_empty_dir
|
127
|
+
@test_data.clusterSize = 4096
|
128
|
+
@test_data.expectedFileSize = 0
|
129
|
+
@test_data.expectedDiskSpace = 0
|
130
|
+
@test_data.expectedFileCount = 0
|
131
|
+
@test_data.expectedAvgFileSize = 0
|
132
|
+
@test_data.expectedFileCountIncludeSubs = 0
|
133
|
+
@test_data.expectedAvgFileSizeIncludeSubs = 0
|
134
|
+
@test_data.expectedFileSizeIncludeSubs = 0
|
135
|
+
@test_data.expectedDiskSpaceIncludeSubs = 0
|
136
|
+
do_test_dir_size(@test_data)
|
137
137
|
end
|
138
138
|
end
|
data/cl/util/test/filetest.rb
CHANGED
@@ -51,13 +51,13 @@ class TestUtilFile < Test::Unit::TestCase
|
|
51
51
|
File.chmod(attr, fileName)
|
52
52
|
end
|
53
53
|
|
54
|
-
def
|
54
|
+
def setup
|
55
55
|
@files = []
|
56
56
|
end
|
57
57
|
|
58
58
|
def teardown
|
59
59
|
@files.each { | filename | File.delete_all(filename) if File.exists?(filename) }
|
60
|
-
@dirs.reverse_each { | dirname | Dir.delete(dirname) if File.exists?(dirname) }
|
60
|
+
@dirs.reverse_each { | dirname | Dir.delete(dirname) if File.exists?(dirname) } if @dirs
|
61
61
|
end
|
62
62
|
|
63
63
|
def doTestDelTree(attr)
|
data/cl/util/util.rb
CHANGED
@@ -3,8 +3,8 @@ require 'cl/util/version'
|
|
3
3
|
# VERSION auto generated section
|
4
4
|
begin
|
5
5
|
require 'cl/util/version'
|
6
|
-
VERSION = CLabs::Version.new('2010', '
|
6
|
+
VERSION = CLabs::Version.new('2010', '129', '0')
|
7
7
|
rescue LoadError
|
8
|
-
VERSION = '2010.
|
8
|
+
VERSION = '2010.129.0'
|
9
9
|
end
|
10
10
|
# END_VERSION
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clutil
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 2010
|
7
|
+
- 129
|
8
|
+
- 0
|
9
|
+
version: 2010.129.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- chrismo
|
@@ -9,7 +14,7 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-09 00:00:00 -05:00
|
13
18
|
default_executable:
|
14
19
|
dependencies: []
|
15
20
|
|
@@ -62,18 +67,22 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
62
67
|
requirements:
|
63
68
|
- - ">="
|
64
69
|
- !ruby/object:Gem::Version
|
70
|
+
segments:
|
71
|
+
- 0
|
65
72
|
version: "0"
|
66
|
-
version:
|
67
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
74
|
requirements:
|
69
75
|
- - ">="
|
70
76
|
- !ruby/object:Gem::Version
|
77
|
+
segments:
|
78
|
+
- 1
|
79
|
+
- 3
|
80
|
+
- 6
|
71
81
|
version: 1.3.6
|
72
|
-
version:
|
73
82
|
requirements: []
|
74
83
|
|
75
84
|
rubyforge_project: scrapware
|
76
|
-
rubygems_version: 1.3.
|
85
|
+
rubygems_version: 1.3.6
|
77
86
|
signing_key:
|
78
87
|
specification_version: 3
|
79
88
|
summary: cLabs Ruby Utilities
|