ruport-util 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -18,7 +18,7 @@ end
18
18
 
19
19
  spec = Gem::Specification.new do |spec|
20
20
  spec.name = "ruport-util"
21
- spec.version = "0.1.0"
21
+ spec.version = "0.2.0"
22
22
  spec.platform = Gem::Platform::RUBY
23
23
  spec.summary = "A set of tools and helper libs for Ruby Reports"
24
24
  spec.files = Dir.glob("{example,lib,test,bin}/**/**/*") +
@@ -34,6 +34,7 @@ spec = Gem::Specification.new do |spec|
34
34
  # '--main' << 'README' << '-q'
35
35
  spec.add_dependency('ruport', ">=0.9.3")
36
36
  spec.add_dependency('scruffy', ">=0.2.2")
37
+ spec.add_dependency('mailfactory',">=1.2.3")
37
38
  spec.author = "Gregory Brown"
38
39
  spec.email = " gregory.t.brown@gmail.com"
39
40
  spec.rubyforge_project = "ruport"
@@ -45,8 +46,7 @@ END_DESC
45
46
  end
46
47
 
47
48
  Rake::RDocTask.new do |rdoc|
48
- rdoc.rdoc_files.include( "README",
49
- "TODO", #"CHANGELOG",
49
+ rdoc.rdoc_files.include( "TODO", #"CHANGELOG",
50
50
  "AUTHORS", "COPYING",
51
51
  "LICENSE", "lib/" )
52
52
  rdoc.main = "README"
File without changes
data/example/mailer.rb ADDED
@@ -0,0 +1,29 @@
1
+ require "ruport"
2
+ require "ruport/util/mailer"
3
+ require "fileutils"
4
+ class MyReport < Ruport::Report
5
+ def prepare
6
+ mailer :default,
7
+ :host => "mail.adelphia.net",
8
+ :address => "gregory.t.brown@gmail.com"
9
+ end
10
+
11
+ def generate
12
+ Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }.to_pdf
13
+ end
14
+
15
+ def cleanup
16
+ FileUtils.rm("foo.pdf")
17
+ end
18
+ end
19
+
20
+ MyReport.run do |res|
21
+ res.write "foo.pdf";
22
+ res.send_to("gregory.t.brown@gmail.com") do |mail|
23
+ mail.subject = "Sample report"
24
+ mail.attach "foo.pdf"
25
+ mail.text = <<-EOS
26
+ this is a sample of sending an emailed report from within Ruport.
27
+ EOS
28
+ end
29
+ end
@@ -0,0 +1,179 @@
1
+ # mailer.rb
2
+ # Created by Gregory Brown on 2005-08-16
3
+ # Copyright 2005 (Gregory Brown) All Rights Reserved.
4
+ # This product is free software, you may distribute it as such
5
+ # under your choice of the Ruby license or the GNU GPL
6
+ # See LICENSE for details
7
+ require "net/smtp"
8
+ require "forwardable"
9
+
10
+ module Ruport
11
+
12
+ #
13
+ # === Overview
14
+ #
15
+ # This class uses SMTP to provide a simple mail sending mechanism.
16
+ # It also uses MailFactory to provide attachment and HTML email support.
17
+ #
18
+ # === Example
19
+ #
20
+ # Here is a simple example of a message which attaches a README file:
21
+ #
22
+ # require "ruport"
23
+ #
24
+ # Ruport.configure do |config|
25
+ # config.mailer :default,
26
+ # :host => "mail.adelphia.net",
27
+ # :address => "gregory.t.brown@gmail.com"
28
+ # end
29
+ #
30
+ # mailer = Ruport::Mailer.new
31
+ #
32
+ # mailer.attach "README"
33
+ #
34
+ # mailer.deliver :to => "gregory.t.brown@gmail.com",
35
+ # :from => "gregory.t.brown@gmail.com",
36
+ # :subject => "Hey there",
37
+ # :text => "This is what you asked for"
38
+ #
39
+ class Mailer
40
+ extend Forwardable
41
+
42
+ #
43
+ # Creates a new Mailer object. Optionally, you can select a mailer
44
+ # specified by Ruport::Config.
45
+ #
46
+ # Example:
47
+ #
48
+ # a = Mailer.new # uses the :default mailer
49
+ # a = Mailer.new :foo # uses :foo mail config from Ruport::Config
50
+ #
51
+ def initialize( mailer_label=:default )
52
+ select_mailer(mailer_label);
53
+ mail_object.from = @mailer.address if mail_object.from.to_s.empty?
54
+ rescue
55
+ raise "you need to specify a mailer to use"
56
+ end
57
+
58
+ def_delegators( :@mail, :to, :to=, :from, :from=,
59
+ :subject, :subject=, :attach,
60
+ :text, :text=, :html, :html= )
61
+
62
+ #
63
+ # Sends the message.
64
+ #
65
+ # Example:
66
+ #
67
+ # mailer.deliver :from => "gregory.t.brown@gmail.com",
68
+ # :to => "greg7224@gmail.com"
69
+ #
70
+ def deliver(options={})
71
+ options.each { |k,v| send("#{k}=",v) if respond_to? "#{k}=" }
72
+
73
+ Net::SMTP.start(@host,@port,@host,@user,@password,@auth) do |smtp|
74
+ smtp.send_message((options[:mail_object] || mail_object).to_s, options[:from], options[:to] )
75
+ end
76
+ end
77
+
78
+ private
79
+
80
+ def select_mailer(label)
81
+ @mailer = Ruport::Config.mailers[label]
82
+ @host = @mailer.host
83
+ @user = @mailer.user
84
+ @password = @mailer.password
85
+ @address = @mailer.address
86
+ @port = @mailer.port || 25
87
+ @auth = @mailer.auth_type || :plain
88
+ @mail_klass = @mailer.mail_klass
89
+ end
90
+
91
+ def mail_object
92
+ return @mail if @mail
93
+ return @mail ||= @mail_klass.new if @mail_klass
94
+ require "mailfactory"
95
+ @mail ||= MailFactory.new
96
+ end
97
+
98
+ end
99
+
100
+ class Report
101
+ # Creates a new Mailer and sets the <tt>to</tt> attribute to the addresses
102
+ # specified. Yields a Mailer object, which can be modified before delivery.
103
+ #
104
+ def send_to(adds)
105
+ use_mailer(:default) unless @mailer
106
+ m = Mailer.new
107
+ m.to = adds
108
+ yield(m)
109
+ m.send(:select_mailer,@mailer)
110
+ m.deliver :from => m.from, :to => m.to
111
+ end
112
+
113
+ # Sets the active mailer to the Ruport::Config source requested by <tt>label</tt>.
114
+ def use_mailer(label)
115
+ @mailer = label
116
+ end
117
+
118
+ def_delegator Ruport::Config, :mailer
119
+
120
+ end
121
+
122
+ module Config
123
+ module_function
124
+ # Verifies that you have provided a host for your mailer.
125
+ def check_mailer(settings, label) # :nodoc:
126
+ unless settings.host
127
+ Ruport.log(
128
+ "Missing host for mailer #{label}",
129
+ :status => :fatal, :level => :log_only,
130
+ :raises => ArgumentError
131
+ )
132
+ end
133
+ end
134
+
135
+ # :call-seq:
136
+ # mailer(mailer_name, options)
137
+ #
138
+ # Creates or retrieves a mailer configuration. Available options:
139
+ # <b><tt>:host</tt></b>:: The SMTP host to use.
140
+ # <b><tt>:address</tt></b>:: Address the email is being sent from.
141
+ # <b><tt>:user</tt></b>:: The username to use on the SMTP server
142
+ # <b><tt>:password</tt></b>:: The password to use on the SMTP server.
143
+ # Optional.
144
+ # <b><tt>:port</tt></b>:: The SMTP port to use. Optional, defaults
145
+ # to 25.
146
+ # <b><tt>:auth_type</tt></b>:: SMTP authorization method. Optional,
147
+ # defaults to <tt>:plain</tt>.
148
+ # <b><tt>:mail_klass</tt></b>:: If you don't want to use the default
149
+ # <tt>MailFactory</tt> object, you can
150
+ # pass another mailer to use here.
151
+ #
152
+ # Example (creating a mailer config):
153
+ # mailer :alternate, :host => "mail.test.com",
154
+ # :address => "test@test.com",
155
+ # :user => "test",
156
+ # :password => "blinky"
157
+ # :auth_type => :cram_md5
158
+ #
159
+ # Example (retreiving a mailer config):
160
+ # mail_conf = mailer(:alternate) #=> <OpenStruct ..>
161
+ # mail_conf.address #=> test@test.com
162
+ #
163
+ def mailer(*args)
164
+ return mailers[args.first] if args.length == 1
165
+ mailers[args.first] = OpenStruct.new(*args[1..-1])
166
+ check_mailer(mailers[args.first],args.first)
167
+ end
168
+
169
+ # Alias for <tt>mailers[:default]</tt>.
170
+ def default_mailer
171
+ mailers[:default]
172
+ end
173
+
174
+ # Returns all the <tt>mailer</tt>s defined in this <tt>Config</tt>.
175
+ def mailers; @mailers ||= {}; end
176
+ end
177
+
178
+
179
+ end
@@ -0,0 +1,3 @@
1
+ "col1","col2","col3"
2
+ "a","b","c"
3
+ "d",,"e"
@@ -0,0 +1,205 @@
1
+ require "test/unit"
2
+ begin; require "rubygems"; rescue LoadError; nil end
3
+ require "ruport"
4
+ require "ruport/util/mailer"
5
+ begin
6
+ require 'mocha'
7
+ require 'stubba'
8
+ require 'net/smtp'
9
+ rescue LoadError
10
+ $stderr.puts "Warning: Mocha not found -- skipping some Mailer tests"
11
+ end
12
+
13
+ class TestMailer < Test::Unit::TestCase
14
+
15
+ def setup
16
+ @default_opts = {
17
+ :host => "mail.example.com",
18
+ :address => "sue@example.com",
19
+ :user => "inky",
20
+ :password => "chunky"
21
+ }
22
+
23
+ @other_opts = {
24
+ :host => "moremail.example.com",
25
+ :address => "clyde@example.com",
26
+ :user => "blinky",
27
+ :password => "bacon"
28
+ }
29
+
30
+ Ruport::Config.mailer :default, @default_opts
31
+ Ruport::Config.mailer :other, @other_opts
32
+
33
+ @default_mailer = Ruport::Mailer.new
34
+ @other_mailer = Ruport::Mailer.new :other
35
+ end
36
+
37
+ def assert_mailer_equal(expected, mailer)
38
+ assert_equal expected[:host], mailer.instance_variable_get(:@host)
39
+ assert_equal expected[:address], mailer.instance_variable_get(:@address)
40
+ assert_equal expected[:user], mailer.instance_variable_get(:@user)
41
+ assert_equal expected[:password], mailer.instance_variable_get(:@password)
42
+ end
43
+
44
+ def test_send_to
45
+ return unless Object.const_defined? :Mocha
46
+ setup_mock_report_mailer
47
+ @report = Ruport::Report.new
48
+ assert_equal "250 ok", @report.send_to("clyde@example.com") { |mail|
49
+ mail.subject = "Test Report"
50
+ mail.text = "Test"
51
+ }
52
+ end
53
+
54
+ def test_mail_defaults
55
+ assert_equal( Ruport::Config.mailers[:default],
56
+ Ruport::Config.default_mailer)
57
+ end
58
+
59
+
60
+
61
+ def test_default_constructor
62
+ assert_mailer_equal @default_opts, @default_mailer
63
+ end
64
+
65
+ def test_constructor_with_mailer_label
66
+ assert_mailer_equal @other_opts, @other_mailer
67
+ end
68
+
69
+ def test_constructor_without_mailer
70
+ Ruport::Config.mailers[:default] = nil
71
+ assert_raise(RuntimeError) { Ruport::Mailer.new }
72
+ end
73
+
74
+ def test_select_mailer
75
+ mailer = Ruport::Mailer.new :default
76
+ assert_mailer_equal @default_opts, mailer
77
+
78
+ mailer.send(:select_mailer, :other)
79
+ assert_mailer_equal @other_opts, mailer
80
+ end
81
+
82
+ def test_mailer_config_errors
83
+ assert_raise(ArgumentError) {
84
+ Ruport::Config.mailer :bar, :user => :foo, :address => "foo@bar.com"
85
+ }
86
+ assert_nothing_raised { Ruport::Config.mailer :bar, :host => "localhost" }
87
+ end
88
+
89
+
90
+
91
+ def test_to
92
+ @default_mailer.instance_eval "@mail.to = ['foo@bar.com']"
93
+ assert_equal ['foo@bar.com'], @default_mailer.to
94
+ end
95
+
96
+ def test_to_equals
97
+ @default_mailer.to = ['foo@bar.com']
98
+ assert_equal ['foo@bar.com'], @default_mailer.to
99
+ end
100
+
101
+ def test_from
102
+ @default_mailer.instance_eval "@mail.from = ['foo@bar.com']"
103
+ assert_equal ['foo@bar.com'], @default_mailer.from
104
+ end
105
+
106
+ def test_from_equals
107
+ @default_mailer.from = ['foo@bar.com']
108
+ assert_equal ['foo@bar.com'], @default_mailer.from
109
+ end
110
+
111
+ def test_subject
112
+ @default_mailer.instance_eval "@mail.subject = ['RuportDay!']"
113
+ assert_equal ['RuportDay!'], @default_mailer.subject
114
+ end
115
+
116
+ def test_subject_equals
117
+ @default_mailer.subject = ['RuportDay!']
118
+ assert_equal ['RuportDay!'], @default_mailer.subject
119
+ end
120
+
121
+ def test_send_mail_with_default
122
+ return unless Object.const_defined? :Mocha
123
+ setup_mock_mailer(1)
124
+ assert_equal "250 ok",
125
+ @default_mailer.deliver(:to => "clyde@example.com",
126
+ :from => "sue@example.com",
127
+ :subject => "Hello",
128
+ :text => "This is a test.")
129
+ end
130
+
131
+ def test_send_mail_with_other
132
+ return unless Object.const_defined? :Mocha
133
+ setup_mock_mailer(1, @other_mailer)
134
+ assert_equal "250 ok",
135
+ @other_mailer.deliver(:to => "sue@example.com",
136
+ :from => "clyde@example.com",
137
+ :subject => "Hello",
138
+ :text => "This is a test.")
139
+ end
140
+
141
+ def test_send_mail_without_to
142
+ return unless Object.const_defined? :Mocha
143
+ setup_mock_mailer(1)
144
+ assert_raise(Net::SMTPSyntaxError) {
145
+ @default_mailer.deliver(:from => "sue@example.com",
146
+ :subject => "Hello",
147
+ :text => "This is a test.")
148
+ }
149
+ end
150
+
151
+ def test_send_html_mail
152
+ return unless Object.const_defined? :Mocha
153
+ setup_mock_mailer(1)
154
+ assert_equal "250 ok",
155
+ @default_mailer.deliver(:to => "clyde@example.com",
156
+ :from => "sue@example.com",
157
+ :subject => "Hello",
158
+ :html => "<p>This is a test.</p>")
159
+ end
160
+
161
+ def test_send_mail_with_attachment
162
+ return unless Object.const_defined? :Mocha
163
+ setup_mock_mailer(1)
164
+ @default_mailer.attach 'test/samples/data.csv'
165
+ assert_equal "250 ok",
166
+ @default_mailer.deliver(:to => "clyde@example.com",
167
+ :from => "sue@example.com",
168
+ :subject => "Hello",
169
+ :text => "This is a test.")
170
+ end
171
+
172
+ private
173
+
174
+ def setup_mock_mailer(count, mailer=@default_mailer)
175
+ host = mailer.instance_variable_get(:@host)
176
+ port = mailer.instance_variable_get(:@port)
177
+ user = mailer.instance_variable_get(:@user)
178
+ password = mailer.instance_variable_get(:@password)
179
+ auth = mailer.instance_variable_get(:@auth)
180
+
181
+ @smtp = mock('smtp')
182
+
183
+ Net::SMTP.expects(:start).
184
+ with(host,port,host,user,password,auth).
185
+ yields(@smtp).
186
+ returns("250 ok").times(count)
187
+ @smtp.stubs(:send_message).
188
+ with {|*params| !params[2].nil? }.
189
+ returns("250 ok")
190
+ @smtp.stubs(:send_message).
191
+ with {|*params| params[2].nil? }.
192
+ raises(Net::SMTPSyntaxError)
193
+ end
194
+
195
+ def setup_mock_report_mailer
196
+ @smtp = mock('smtp')
197
+
198
+ Net::SMTP.expects(:start).
199
+ yields(@smtp).
200
+ returns("250 ok").at_least_once
201
+ @smtp.stubs(:send_message).
202
+ returns("250 ok")
203
+ end
204
+ end
205
+
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: ruport-util
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.0
7
- date: 2007-04-04 00:00:00 -04:00
6
+ version: 0.2.0
7
+ date: 2007-04-10 00:00:00 -04:00
8
8
  summary: A set of tools and helper libs for Ruby Reports
9
9
  require_paths:
10
10
  - lib
@@ -29,24 +29,31 @@ post_install_message:
29
29
  authors:
30
30
  - Gregory Brown
31
31
  files:
32
- - example/graph_report.rb
32
+ - example/mailed_report.rb
33
33
  - example/invoice_report.rb
34
34
  - example/managed_report.rb
35
+ - example/mailer.rb
36
+ - example/graph_report.rb
35
37
  - lib/ruport
36
38
  - lib/ruport/util
37
39
  - lib/ruport/util.rb
38
40
  - lib/ruport/util/graph.rb
39
- - lib/ruport/util/invoice.rb
40
41
  - lib/ruport/util/report_manager.rb
42
+ - lib/ruport/util/mailer.rb
43
+ - lib/ruport/util/invoice.rb
44
+ - test/samples
41
45
  - test/init.rb
46
+ - test/test_report_manager.rb
42
47
  - test/test_graph_renderer.rb
48
+ - test/test_mailer.rb
43
49
  - test/test_invoice.rb
44
- - test/test_report_manager.rb
50
+ - test/samples/data.csv
45
51
  - Rakefile
46
52
  test_files:
53
+ - test/test_report_manager.rb
47
54
  - test/test_graph_renderer.rb
55
+ - test/test_mailer.rb
48
56
  - test/test_invoice.rb
49
- - test/test_report_manager.rb
50
57
  rdoc_options:
51
58
  - --title
52
59
  - Ruport Documentation
@@ -77,3 +84,12 @@ dependencies:
77
84
  - !ruby/object:Gem::Version
78
85
  version: 0.2.2
79
86
  version:
87
+ - !ruby/object:Gem::Dependency
88
+ name: mailfactory
89
+ version_requirement:
90
+ version_requirements: !ruby/object:Gem::Version::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 1.2.3
95
+ version: