mongo_mailer 0.0.0 → 0.1.3

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.

Potentially problematic release.


This version of mongo_mailer might be problematic. Click here for more details.

Files changed (39) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +10 -13
  3. data/.travis.yml +6 -0
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +112 -61
  6. data/README.md +112 -0
  7. data/Rakefile +7 -4
  8. data/bin/console +7 -0
  9. data/bin/mongo_mailer +11 -0
  10. data/bin/worker +6 -0
  11. data/config/boot.rb +12 -0
  12. data/config/mongo_mailer.yml.example +38 -0
  13. data/lib/generators/mongo_mailer/mongo_mailer_generator.rb +10 -0
  14. data/lib/generators/mongo_mailer/templates/mongo_mailer.yml +38 -0
  15. data/lib/mongo_mailer.rb +9 -2
  16. data/lib/mongo_mailer/capistrano.rb +33 -0
  17. data/lib/mongo_mailer/capistrano3.rb +49 -0
  18. data/lib/mongo_mailer/common/deliveries_counter.rb +18 -0
  19. data/lib/mongo_mailer/common/has_mongo_collection.rb +36 -0
  20. data/lib/mongo_mailer/common/mail_queue.rb +49 -0
  21. data/lib/mongo_mailer/configuration.rb +127 -0
  22. data/lib/mongo_mailer/core_ext/hash.rb +12 -0
  23. data/lib/mongo_mailer/delivery_methods/mongo_queue.rb +28 -0
  24. data/lib/mongo_mailer/delivery_methods/test.rb +38 -0
  25. data/lib/mongo_mailer/rails.rb +5 -0
  26. data/lib/mongo_mailer/standalone.rb +6 -0
  27. data/lib/mongo_mailer/standalone/final_deliverer.rb +35 -0
  28. data/lib/mongo_mailer/standalone/worker.rb +23 -0
  29. data/lib/mongo_mailer/version.rb +3 -0
  30. data/log/.gitkeep +0 -0
  31. data/mongo_mailer.gemspec +25 -26
  32. data/spec/lib/common/deliveries_counter_spec.rb +22 -0
  33. data/spec/lib/common/mail_queue_spec.rb +68 -0
  34. data/spec/lib/configuration_spec.rb +26 -0
  35. data/spec/lib/standalone/final_deliverer_spec.rb +40 -0
  36. data/spec/rails/delivery_methods/mongo_queue_spec.rb +33 -0
  37. data/spec/spec_helper.rb +29 -0
  38. metadata +97 -44
  39. data/LICENSE +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 1f28fa35aeba2febbdacacaa1c5ab93966d88bee4bd91d72106bb45f9ca38060
4
- data.tar.gz: 86edf6e41fceec20af13046be6223b27af265528e870d0ae40b3eeb3a9660153
2
+ SHA1:
3
+ metadata.gz: ae32a268782ce6659964b4f2e4730c04daa55f77
4
+ data.tar.gz: f080335933a7bb536e31018fa5d0fb867b13f453
5
5
  SHA512:
6
- metadata.gz: b8cb494a687cb716aa47f8170219e9d3d875ebcb299070d2a5ef03c5d925cd131db2d4d4effe3e4ab3c58635c78ae4b12ea3698a51d6a6ff09f0d46a659593e1
7
- data.tar.gz: 6df867865f4cd2ad758bceee71d2a94777c28c612c64eb67a05838fe615dc32ecab7615aeb0c0454504dc089811a280c918b516b97178220ef45ddf97c6df54b
6
+ metadata.gz: 2fde9a9f5b98b0ecf6df6024f98ea1a8e76700734bea9c104cb234dd29c3a3a04b9de0fd1b5be75523e969e6c2533dc49969b6ef62fe4b4e80d256b73a036cf7
7
+ data.tar.gz: 42f8b6b9d11754fd45a40d36de3d6cb5bfdaf9e0e621327a1fbeb3217c10a627aa2726937cbf643a9442c31504458299845ebe671f9cdbb6cdf0d126863ff38f
data/.gitignore CHANGED
@@ -1,14 +1,11 @@
1
+ .rvmrc
2
+ .ruby-version
3
+ .ruby-gemset
1
4
  *.gem
2
- .bundle
3
- .config
4
- .yardoc
5
- _yardoc
6
- coverage
7
- doc/
8
- lib/bundler/man
9
- pkg
10
- rdoc
11
- spec/reports
12
- tmp
13
- .coveralls.yml
14
- spec/examples.txt
5
+ *.swp
6
+ .DS_Store
7
+
8
+ tmp/
9
+ log/
10
+ coverage/
11
+ config/*.yml
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ services: mongodb
3
+ rvm:
4
+ - "2.2"
5
+ - "2.3"
6
+ - "2.4"
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
- source 'https://rubygems.org'
1
+ source 'http://rubygems.org'
2
2
 
3
3
  gemspec
data/Gemfile.lock CHANGED
@@ -1,76 +1,127 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mongo_mailer (0.0.0)
5
- mail
6
- mongo (~> 2.15)
4
+ mongo_mailer (0.1.2)
5
+ activesupport (>= 4.2.8)
6
+ bson_ext (~> 1.9.2)
7
+ daemons (~> 1.1.9)
8
+ mail (~> 2.5.5)
9
+ mongo (~> 1.9.2)
7
10
 
8
11
  GEM
9
- remote: https://rubygems.org/
12
+ remote: http://rubygems.org/
10
13
  specs:
11
- ast (2.4.2)
12
- bson (4.12.1)
13
- coderay (1.1.3)
14
- diff-lcs (1.4.4)
15
- mail (2.7.1)
16
- mini_mime (>= 0.1.1)
17
- method_source (1.0.0)
18
- mini_mime (1.1.0)
19
- mongo (2.15.0)
20
- bson (>= 4.8.2, < 5.0.0)
21
- parallel (1.20.1)
22
- parser (3.0.2.0)
23
- ast (~> 2.4.1)
24
- pry (0.14.1)
25
- coderay (~> 1.1)
26
- method_source (~> 1.0)
27
- rainbow (3.0.0)
28
- rake (13.0.6)
29
- regexp_parser (2.1.1)
30
- rexml (3.2.5)
31
- rspec (3.10.0)
32
- rspec-core (~> 3.10.0)
33
- rspec-expectations (~> 3.10.0)
34
- rspec-mocks (~> 3.10.0)
35
- rspec-core (3.10.1)
36
- rspec-support (~> 3.10.0)
37
- rspec-expectations (3.10.1)
14
+ actionmailer (4.2.9)
15
+ actionpack (= 4.2.9)
16
+ actionview (= 4.2.9)
17
+ activejob (= 4.2.9)
18
+ mail (~> 2.5, >= 2.5.4)
19
+ rails-dom-testing (~> 1.0, >= 1.0.5)
20
+ actionpack (4.2.9)
21
+ actionview (= 4.2.9)
22
+ activesupport (= 4.2.9)
23
+ rack (~> 1.6)
24
+ rack-test (~> 0.6.2)
25
+ rails-dom-testing (~> 1.0, >= 1.0.5)
26
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
27
+ actionview (4.2.9)
28
+ activesupport (= 4.2.9)
29
+ builder (~> 3.1)
30
+ erubis (~> 2.7.0)
31
+ rails-dom-testing (~> 1.0, >= 1.0.5)
32
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
33
+ activejob (4.2.9)
34
+ activesupport (= 4.2.9)
35
+ globalid (>= 0.3.0)
36
+ activesupport (4.2.9)
37
+ i18n (~> 0.7)
38
+ minitest (~> 5.1)
39
+ thread_safe (~> 0.3, >= 0.3.4)
40
+ tzinfo (~> 1.1)
41
+ bson (1.9.2)
42
+ bson_ext (1.9.2)
43
+ bson (~> 1.9.2)
44
+ builder (3.2.3)
45
+ coveralls (0.7.0)
46
+ multi_json (~> 1.3)
47
+ rest-client
48
+ simplecov (>= 0.7)
49
+ term-ansicolor
50
+ thor
51
+ daemons (1.1.9)
52
+ diff-lcs (1.3)
53
+ docile (1.1.5)
54
+ erubis (2.7.0)
55
+ globalid (0.4.0)
56
+ activesupport (>= 4.2.0)
57
+ i18n (0.8.4)
58
+ json (2.1.0)
59
+ loofah (2.0.3)
60
+ nokogiri (>= 1.5.9)
61
+ mail (2.5.5)
62
+ mime-types (~> 1.16)
63
+ treetop (~> 1.4.8)
64
+ mime-types (1.25.1)
65
+ mini_portile2 (2.2.0)
66
+ minitest (5.10.2)
67
+ mongo (1.9.2)
68
+ bson (~> 1.9.2)
69
+ multi_json (1.12.1)
70
+ nokogiri (1.8.0)
71
+ mini_portile2 (~> 2.2.0)
72
+ polyglot (0.3.5)
73
+ rack (1.6.8)
74
+ rack-test (0.6.3)
75
+ rack (>= 1.0)
76
+ rails-deprecated_sanitizer (1.0.3)
77
+ activesupport (>= 4.2.0.alpha)
78
+ rails-dom-testing (1.0.8)
79
+ activesupport (>= 4.2.0.beta, < 5.0)
80
+ nokogiri (~> 1.6)
81
+ rails-deprecated_sanitizer (>= 1.0.1)
82
+ rails-html-sanitizer (1.0.3)
83
+ loofah (~> 2.0)
84
+ rake (10.1.1)
85
+ rest-client (1.6.7)
86
+ mime-types (>= 1.16)
87
+ rspec (3.6.0)
88
+ rspec-core (~> 3.6.0)
89
+ rspec-expectations (~> 3.6.0)
90
+ rspec-mocks (~> 3.6.0)
91
+ rspec-core (3.6.0)
92
+ rspec-support (~> 3.6.0)
93
+ rspec-expectations (3.6.0)
38
94
  diff-lcs (>= 1.2.0, < 2.0)
39
- rspec-support (~> 3.10.0)
40
- rspec-mocks (3.10.2)
95
+ rspec-support (~> 3.6.0)
96
+ rspec-mocks (3.6.0)
41
97
  diff-lcs (>= 1.2.0, < 2.0)
42
- rspec-support (~> 3.10.0)
43
- rspec-support (3.10.2)
44
- rubocop (1.18.4)
45
- parallel (~> 1.10)
46
- parser (>= 3.0.0.0)
47
- rainbow (>= 2.2.2, < 4.0)
48
- regexp_parser (>= 1.8, < 3.0)
49
- rexml
50
- rubocop-ast (>= 1.8.0, < 2.0)
51
- ruby-progressbar (~> 1.7)
52
- unicode-display_width (>= 1.4.0, < 3.0)
53
- rubocop-ast (1.8.0)
54
- parser (>= 3.0.1.1)
55
- rubocop-rake (0.6.0)
56
- rubocop (~> 1.0)
57
- rubocop-rspec (2.4.0)
58
- rubocop (~> 1.0)
59
- rubocop-ast (>= 1.1.0)
60
- ruby-progressbar (1.11.0)
61
- unicode-display_width (2.0.0)
98
+ rspec-support (~> 3.6.0)
99
+ rspec-support (3.6.0)
100
+ simplecov (0.14.1)
101
+ docile (~> 1.1.0)
102
+ json (>= 1.8, < 3)
103
+ simplecov-html (~> 0.10.0)
104
+ simplecov-html (0.10.1)
105
+ term-ansicolor (1.2.2)
106
+ tins (~> 0.8)
107
+ thor (0.18.1)
108
+ thread_safe (0.3.6)
109
+ tins (0.13.1)
110
+ treetop (1.4.15)
111
+ polyglot
112
+ polyglot (>= 0.3.1)
113
+ tzinfo (1.2.3)
114
+ thread_safe (~> 0.1)
62
115
 
63
116
  PLATFORMS
64
- x86_64-darwin-20
117
+ ruby
65
118
 
66
119
  DEPENDENCIES
120
+ actionmailer (>= 4.2.8)
121
+ coveralls
67
122
  mongo_mailer!
68
- pry
69
- rake
70
- rspec
71
- rubocop
72
- rubocop-rake
73
- rubocop-rspec
123
+ rake (>= 10.0.4)
124
+ rspec (>= 2.14.0)
74
125
 
75
126
  BUNDLED WITH
76
- 2.2.24
127
+ 1.15.1
data/README.md ADDED
@@ -0,0 +1,112 @@
1
+ # MongoMailer
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/mongo_mailer.png)][gem_version]
4
+ [![Build status](https://secure.travis-ci.org/infakt/mongo_mailer.png?branch=master)][travis]
5
+ [![Code Climate](https://codeclimate.com/github/infakt/mongo_mailer.png)][codeclimate]
6
+ [![Coverage Status](https://coveralls.io/repos/infakt/mongo_mailer/badge.png?branch=master)][coveralls]
7
+
8
+ [gem_version]: https://rubygems.org/gems/mongo_mailer
9
+ [travis]: http://travis-ci.org/infakt/mongo_mailer
10
+ [codeclimate]: https://codeclimate.com/github/infakt/mongo_mailer
11
+ [coveralls]: https://coveralls.io/r/infakt/mongo_mailer
12
+
13
+
14
+ ## Asynchronous mail delivery with mongodb for Rails
15
+
16
+ ### Elements
17
+
18
+ * Rails plugin containing delivery_method, generators, capistrano recipies
19
+ * worker daemon fetching mails for queue and doing the final delivery using two methods: base and emergency, if base delivery fails, then emergency is being used.
20
+
21
+ ### Rails plugin
22
+
23
+ Add mongo_mailer to your `Gemfile`:
24
+ <pre>
25
+ gem 'mongo_mailer', require: 'mongo_mailer/rails'
26
+ </pre>
27
+
28
+ Run the generator:
29
+ <pre>
30
+ bundle exec rails generate mongo_mailer
31
+ </pre>
32
+ which creates `config/mongo_mailer.yml.example`
33
+
34
+ Based on example configuration file, create `mongo_mailer.yml` and add it to gitignored.
35
+ `mongo_mailer.yml` contains configuration of mongo database and final delivery methods used by worker.
36
+
37
+ Set `ActionMailer::Base` delivery method in your environment file:
38
+ <pre>
39
+ config.action_mailer.delivery_method :mongo_queue
40
+ </pre>
41
+
42
+ Add mongo_mailer capistrano recipies, by adding:
43
+ <pre>
44
+ require 'mongo_mailer/capistrano'
45
+ </pre>
46
+ to your `deploy.rb`. Since then you have access to `cap mongo_mailer:start|stop|restart` recipies.
47
+
48
+ ### Standalone worker
49
+
50
+ Worker can be used within a rails app or as a standalone application. In both cases only mongo_mailer related stuff is used - rails are never being loaded.
51
+
52
+ Worker usees [daemons](https://rubygems.org/gems/daemons) to daemonize the process, continuously polls mongo queue for new mail and does the final delivery.
53
+
54
+ * to start, stop or restart worker just run:
55
+ <pre>
56
+ bundle exec mongo_mailer start|stop|restart [rails_env]
57
+ </pre>
58
+ within a rails app, or:
59
+ <pre>
60
+ bundle exec worker start|stop|restart [app_env]
61
+ </pre>
62
+ in a standalone version.
63
+
64
+ * by default workers activity and pids are being loged in the app's `log` directory:
65
+ <pre>
66
+ log/mongo_mailer.output
67
+ log/mongo_mailer.log
68
+ log/mongo_mailer.pid
69
+ </pre>
70
+ you can change it, by modifying proper daemon options in `mongo_mailer.yml`.
71
+
72
+ * all sent mail are logged into:
73
+ <pre>
74
+ log/mongo_queue.log
75
+ </pre>
76
+
77
+ ### Debugging & stats
78
+
79
+ mongo_mailer doesn't have any web interface, so irb console is the only interface to get information :)
80
+
81
+ #### Getting number of sent messages for each delivery method:
82
+
83
+ <pre>
84
+ MongoMailer::DeliveriesCounter.instance.by_type(:base)
85
+ => {"_id"=>BSON::ObjectId('5177ecb0df30cc350e3fbdf3'), "type"=>:base, "value"=>11}
86
+
87
+ MongoMailer::DeliveriesCounter.instance.by_type(:emergency)
88
+ => {"_id"=>BSON::ObjectId('5178f501df30cc350e3fbdf4'), "type"=>:base, "value"=>1}
89
+
90
+ MongoMailer::DeliveriesCounter.instance.all
91
+ => [{"_id"=>BSON::ObjectId('5177ecb0df30cc350e3fbdf3'), "type"=>:base, "value"=>11}, {"_id"=>BSON::ObjectId('5178f501df30cc350e3fbdf4'), "type"=>:emergency, "value"=>1}]
92
+ </pre>
93
+
94
+ #### Getting list of unsent message due to errors:
95
+
96
+ <pre>
97
+ MongoMailer::MailQueue.instance.invalid_items
98
+ </pre>
99
+
100
+ #### Clearing the list of unsent messages:
101
+
102
+ <pre>
103
+ MongoMailer::MailQueue.instance.clear_invalid_items!
104
+ </pre>
105
+
106
+ ## Contributing
107
+
108
+ 1. Fork it
109
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
110
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
111
+ 4. Push to the branch (`git push origin my-new-feature`)
112
+ 5. Create new Pull Request
data/Rakefile CHANGED
@@ -1,8 +1,11 @@
1
+ #!/usr/bin/env rake
1
2
  require 'bundler/gem_tasks'
2
3
  require 'rspec/core/rake_task'
3
- require 'rubocop/rake_task'
4
4
 
5
- RSpec::Core::RakeTask.new(:spec)
6
- RuboCop::RakeTask.new
5
+ desc 'Run all specs'
6
+ RSpec::Core::RakeTask.new(:spec) do |t|
7
+ t.pattern = './spec/**/*_spec.rb'
8
+ t.rspec_opts = ['--profile', '--color']
9
+ end
7
10
 
8
- task default: %i[rubocop spec]
11
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "irb"
4
+ require "irb/completion"
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+
7
+ IRB.start
data/bin/mongo_mailer ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ ENV['RAILS_ENV'] = ENV['APP_ENV'] = ARGV[1] || 'development'
3
+
4
+ require 'mongo_mailer/standalone'
5
+
6
+ rails_root = File.dirname(ENV['BUNDLE_GEMFILE'])
7
+
8
+ MongoMailer::Configuration.instance.root = rails_root
9
+ MongoMailer::Configuration.instance.load!
10
+
11
+ MongoMailer::Worker.new.run!
data/bin/worker ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ ENV['RAILS_ENV'] = ENV['APP_ENV'] = ARGV[1] || 'development'
3
+
4
+ require File.expand_path('../../config/boot', __FILE__)
5
+
6
+ MongoMailer::Worker.new.run!
data/config/boot.rb ADDED
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+
3
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
4
+ ENV['RAILS_ENV'] ||= 'development'
5
+
6
+ require 'bundler/setup'
7
+ Bundler.require
8
+
9
+ require 'mongo_mailer/standalone'
10
+
11
+ MongoMailer::Configuration.instance.root = File.expand_path("../..", __FILE__)
12
+ MongoMailer::Configuration.instance.load!
@@ -0,0 +1,38 @@
1
+ development: &development
2
+ mongodb:
3
+ host: localhost
4
+ port: 27017
5
+ name: mongo_mailer
6
+ base_delivery_method: smtp
7
+ base_delivery_settings:
8
+ user_name: "username"
9
+ password: "apikey"
10
+ domain: "example.com"
11
+ address: "smtp1.example.com"
12
+ port: 587
13
+ authentication: plain
14
+ enable_starttls_auto: true
15
+ emergency_delivery_method: smtp
16
+ emergency_delivery_settings:
17
+ user_name: "username"
18
+ password: "apikey"
19
+ domain: "example.com"
20
+ address: "smtp2.example.com"
21
+ port: 587
22
+ authentication: plain
23
+ enable_starttls_auto: true
24
+ log_level: info
25
+ daemon_options:
26
+ dir_mode: !ruby/symbol normal
27
+ log_dir: log
28
+ dir: log
29
+ log_output: true
30
+ backtrace: true
31
+ multiple: false
32
+ production:
33
+ <<: *development
34
+ test:
35
+ <<: *development
36
+ base_delivery_method: test1
37
+ emergency_delivery_method: test2
38
+ log_level: error