adzap-ar_mailer 2.1.8 → 2.1.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,8 @@
1
+ = 2.1.9
2
+
3
+ * Merged in minimal environment load option (experimental)
4
+ * Add bundler support in linux init.d script
5
+
1
6
  = 2.1.8
2
7
 
3
8
  * Bugs fixed
@@ -118,6 +118,64 @@ be loaded, so you don't need another TLS plugin to add the capability. This
118
118
  patch allows you to explicit set if the server supports TLS by setting the
119
119
  :tls option to true in your smtp_settings.
120
120
 
121
+
122
+ === EXPERIMENTAL: Minimal environment loading
123
+
124
+ The biggest downside to using ar_mailer is that it loads the entire Rails app
125
+ into memory. For larger apps this can be just a whole lot of wasted memory
126
+ given all you need is to access the email table and mailer settings. We can
127
+ get around this using a few conventions and save around 50% or more of the
128
+ memory used when loading the full app.
129
+
130
+ Loading the database is not much of a problem since the config sits in its own
131
+ yaml which is easy to load in isolation from the app. The mailer settings are
132
+ trickier since they are usually in the environment file which depends on loading
133
+ the Railties system and therefore the whole app.
134
+
135
+ To workaround for this we need to put all the SMTP settings in a yaml config
136
+ file like the database settings. Like so
137
+
138
+ in config/email.yml
139
+
140
+ development:
141
+ domain: example.com
142
+ address: smtp.example.com
143
+ port: 25
144
+
145
+ production:
146
+ domain: example.com
147
+ address: smtp.example.com
148
+ port: 25
149
+
150
+ You can still have ActionMailer settings in each environment file but just be sure
151
+ they don't override these SMTP settings. The other settings aren't needed when
152
+ running ar_sendmail since they only apply to the generation of an email which has
153
+ already happened inside the running application.
154
+
155
+ To avoid duplication of these settings you need to have an initializer which will
156
+ will read the same config file and load these settings. This is in case you switch
157
+ back the normal environment loading. Keeping the email settings here is good idea,
158
+ since just the like the database, they are external connection settings being stored
159
+ in the config folder.
160
+
161
+ The initializer in config/initializers/action_mailer.rb:
162
+
163
+ config_file = "#{Rails.root}/config/email.yml"
164
+ mailer_options = YAML::load(ERB.new(IO.read(config_file)).result)
165
+ if mailer_options[Rails.env]
166
+ ActionMailer::Base.smtp_settings = mailer_options[Rails.env].symbolize_keys
167
+ end
168
+
169
+ At the moment if you are using a database driver that doesn't come with Rails, the gem
170
+ will need to be installed on the target system.
171
+
172
+ Now to run ar_sendmail with minimal environment we do:
173
+
174
+ ar_sendmail -e production -c /path/to/app --minimal
175
+
176
+ If you have any troubles or find any bad assumptions in the minimal set up let me know.
177
+
178
+
121
179
  === Help
122
180
 
123
181
  See ar_sendmail -h for options to ar_sendmail.
@@ -39,10 +39,13 @@ module ActionMailer; end
39
39
 
40
40
  class ActionMailer::ARSendmail
41
41
 
42
+ class RailsEnvironmentFailed < StandardError; end
43
+ class MinimalEnvironmentFailed < StandardError; end
44
+
42
45
  ##
43
46
  # The version of ActionMailer::ARSendmail you are running.
44
47
 
45
- VERSION = '2.1.8'
48
+ VERSION = '2.1.9'
46
49
 
47
50
  ##
48
51
  # Maximum number of times authentication will be consecutively retried
@@ -148,6 +151,7 @@ class ActionMailer::ARSendmail
148
151
  options[:Once] = false
149
152
  options[:RailsEnv] = ENV['RAILS_ENV']
150
153
  options[:Pidfile] = options[:Chdir] + '/log/ar_sendmail.pid'
154
+ options[:Minimal] = false
151
155
 
152
156
  opts = OptionParser.new do |opts|
153
157
  opts.banner = "Usage: #{name} [options]"
@@ -194,6 +198,12 @@ class ActionMailer::ARSendmail
194
198
  options[:Daemon] = true
195
199
  end
196
200
 
201
+ opts.on( "--minimal",
202
+ "Load a minimal environment with settings from config/email.yml",
203
+ "Default: #{options[:Minimal]}") do |minimal|
204
+ options[:Minimal] = true
205
+ end
206
+
197
207
  opts.on("-p", "--pidfile PIDFILE",
198
208
  "Set the pidfile location",
199
209
  "Default: #{options[:Chdir]}#{options[:Pidfile]}", String) do |pidfile|
@@ -247,21 +257,73 @@ class ActionMailer::ARSendmail
247
257
 
248
258
  ENV['RAILS_ENV'] = options[:RailsEnv]
249
259
 
250
- Dir.chdir options[:Chdir] do
251
- begin
252
- require 'config/environment'
253
- require 'action_mailer/ar_mailer'
254
- rescue LoadError
255
- usage opts, <<-EOF
260
+ begin
261
+ options[:Minimal] ? load_minimal_environment(options[:Chdir]) : load_rails_environment(options[:Chdir])
262
+ rescue RailsEnvironmentFailed
263
+ usage opts, <<-EOF
256
264
  #{name} must be run from a Rails application's root to deliver email.
257
265
  #{Dir.pwd} does not appear to be a Rails application root.
258
- EOF
259
- end
266
+ EOF
267
+ rescue MinimalEnvironmentFailed => e
268
+ usage opts, "Minimal environment loading has failed with error '#{e.message}'. Check minimal environment instructions or use the normal Rails environment loading."
260
269
  end
261
270
 
262
271
  return options
263
272
  end
264
273
 
274
+ # Load full Rails environment
275
+ #
276
+ def self.load_rails_environment(base_path)
277
+ Dir.chdir(base_path) do
278
+ require 'config/environment'
279
+ require 'action_mailer/ar_mailer'
280
+ end
281
+ rescue LoadError
282
+ raise RailsEnvironmentFailed
283
+ end
284
+
285
+ # Load a minimal environment to save memory by not loading the entire Rails app.
286
+ # Requires a vendored Rails or bundler, and a mailer config at config/email.yml.
287
+ #
288
+ def self.load_minimal_environment(base_path)
289
+ Dir.chdir(base_path) do
290
+ Dir.glob('vendor/rails/*/lib').each { |dir| $:.unshift File.expand_path(dir) }
291
+ require 'yaml'
292
+ require 'erb'
293
+ require 'active_record'
294
+ require 'action_mailer'
295
+ require 'action_mailer/ar_mailer'
296
+ require 'app/models/email'
297
+
298
+ env = ENV['RAILS_ENV']
299
+
300
+ logger = ActiveSupport::BufferedLogger.new(File.join('log', "#{env}.log"))
301
+ logger.level = ActiveSupport::BufferedLogger.const_get((env == 'production' ? 'info' : 'debug').upcase)
302
+ ActiveRecord::Base.logger = ActionMailer::Base.logger = logger
303
+
304
+ db_config = read_config('config/database.yml')
305
+ ActiveRecord::Base.establish_connection db_config[env]
306
+
307
+ mailer_config = read_config('config/email.yml')
308
+ ActionMailer::Base.smtp_settings = mailer_config[env].symbolize_keys
309
+ end
310
+ rescue => e
311
+ raise MinimalEnvironmentFailed, e.message
312
+ end
313
+ def default_log_path
314
+ File.join(root_path, 'log', "#{environment}.log")
315
+ end
316
+
317
+ def default_log_level
318
+ environment == 'production' ? :info : :debug
319
+ end
320
+
321
+ # Open yaml config file and parse with ERB
322
+ #
323
+ def self.read_config(file)
324
+ YAML::load(ERB.new(IO.read(file)).result)
325
+ end
326
+
265
327
  ##
266
328
  # Processes +args+ and runs as appropriate
267
329
 
@@ -29,7 +29,12 @@ def start(app, options)
29
29
  switches = ""
30
30
  options.each {|k, v| switches << " --#{k} #{v}"}
31
31
  STDOUT.write "Starting mailer for #{app} in #{options['environment']} mode ... "
32
- status = system("ar_sendmail -d #{switches}") ? "started" : "failed"
32
+ status = nil
33
+ Dir.chdir(options.delete('chdir')) do
34
+ command = 'ar_sendmail'
35
+ command = 'bundle exec ' + command if File.exists?('Gemfile')
36
+ status = system("#{command} -d #{switches}") ? "started" : "failed"
37
+ end
33
38
  puts status
34
39
  end
35
40
 
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adzap-ar_mailer
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.8
4
+ hash: 25
5
+ prerelease:
6
+ segments:
7
+ - 2
8
+ - 1
9
+ - 9
10
+ version: 2.1.9
5
11
  platform: ruby
6
12
  authors:
7
13
  - Eric Hodel
@@ -10,29 +16,41 @@ autorequire:
10
16
  bindir: bin
11
17
  cert_chain: []
12
18
 
13
- date: 2010-03-17 00:00:00 +11:00
19
+ date: 2011-11-09 00:00:00 +11:00
14
20
  default_executable: ar_sendmail
15
21
  dependencies:
16
22
  - !ruby/object:Gem::Dependency
17
23
  name: minitest
18
- type: :development
19
- version_requirement:
20
- version_requirements: !ruby/object:Gem::Requirement
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
21
27
  requirements:
22
28
  - - ">="
23
29
  - !ruby/object:Gem::Version
30
+ hash: 3
31
+ segments:
32
+ - 1
33
+ - 5
34
+ - 0
24
35
  version: 1.5.0
25
- version:
36
+ type: :development
37
+ version_requirements: *id001
26
38
  - !ruby/object:Gem::Dependency
27
39
  name: mocha
28
- type: :development
29
- version_requirement:
30
- version_requirements: !ruby/object:Gem::Requirement
40
+ prerelease: false
41
+ requirement: &id002 !ruby/object:Gem::Requirement
42
+ none: false
31
43
  requirements:
32
44
  - - ">="
33
45
  - !ruby/object:Gem::Version
46
+ hash: 43
47
+ segments:
48
+ - 0
49
+ - 9
50
+ - 8
34
51
  version: 0.9.8
35
- version:
52
+ type: :development
53
+ version_requirements: *id002
36
54
  description: Even delivering email to the local machine may take too long when you have to send hundreds of messages. ar_mailer allows you to store messages into the database for later delivery by a separate process, ar_sendmail.
37
55
  email: adam.meehan@gmail.com
38
56
  executables:
@@ -74,21 +92,27 @@ rdoc_options:
74
92
  require_paths:
75
93
  - lib
76
94
  required_ruby_version: !ruby/object:Gem::Requirement
95
+ none: false
77
96
  requirements:
78
97
  - - ">="
79
98
  - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
80
102
  version: "0"
81
- version:
82
103
  required_rubygems_version: !ruby/object:Gem::Requirement
104
+ none: false
83
105
  requirements:
84
106
  - - ">="
85
107
  - !ruby/object:Gem::Version
108
+ hash: 3
109
+ segments:
110
+ - 0
86
111
  version: "0"
87
- version:
88
112
  requirements: []
89
113
 
90
114
  rubyforge_project: seattlerb
91
- rubygems_version: 1.3.5
115
+ rubygems_version: 1.5.2
92
116
  signing_key:
93
117
  specification_version: 3
94
118
  summary: A two-phase delivery agent for ActionMailer