mail_room 0.5.2 → 0.6.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +28 -0
- data/lib/mail_room.rb +0 -9
- data/lib/mail_room/arbitration.rb +16 -0
- data/lib/mail_room/arbitration/noop.rb +18 -0
- data/lib/mail_room/arbitration/redis.rb +60 -0
- data/lib/mail_room/delivery.rb +24 -0
- data/lib/mail_room/mailbox.rb +35 -23
- data/lib/mail_room/mailbox_handler.rb +7 -9
- data/lib/mail_room/version.rb +1 -1
- data/mail_room.gemspec +2 -1
- data/spec/lib/arbitration/redis_spec.rb +63 -0
- data/spec/lib/mailbox_handler_spec.rb +32 -11
- data/spec/lib/mailbox_spec.rb +33 -5
- data/spec/spec_helper.rb +1 -0
- metadata +23 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e839c7e9c2857c75d399aca74fe627438432c17
|
4
|
+
data.tar.gz: 97d5cbe394fbd50ee36814785ce03af51381c1ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5dfcca4fe8a7323d5207b232a48351bb78cd4df53f8301aa719c198186d08ceb09ca3ce7dd3178af2d80f513f330a52488ba9bad5a6aa079aa9a0b19f649e002
|
7
|
+
data.tar.gz: e2ec188a14291548bc1891459e3ce18066109daa8566d584714d26fc2be3bb3fc17a54b17e1925c5758d785d1daa4e8292735a7db17cba04f045c6801b035a02
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## mail_room 0.6.0 ##
|
2
|
+
|
3
|
+
* Add redis Arbitration to reduce multiple deliveries of the same message when running multiple MailRoom instances on the same inbox
|
4
|
+
|
5
|
+
*Douwe Maan <@DouweM>*
|
6
|
+
|
1
7
|
## mail_room 0.5.2 ##
|
2
8
|
|
3
9
|
* Fix Sidekiq delivery method for non-UTF8 email
|
data/README.md
CHANGED
@@ -203,6 +203,34 @@ If you're seeing the error `Please log in via your web browser: https://support.
|
|
203
203
|
|
204
204
|
I suggest running with either upstart or init.d. Check out this wiki page for some example scripts for both: https://github.com/tpitale/mail_room/wiki/Init-Scripts-for-Running-mail_room
|
205
205
|
|
206
|
+
## Arbitration ##
|
207
|
+
|
208
|
+
When running multiple instances of MailRoom against a single mailbox, to try to prevent delivery of the same message multiple times, we can configure Arbitration using Redis.
|
209
|
+
|
210
|
+
```yaml
|
211
|
+
:mailboxes:
|
212
|
+
-
|
213
|
+
:email: "user1@gmail.com"
|
214
|
+
:password: "password"
|
215
|
+
:name: "inbox"
|
216
|
+
:delivery_method: postback
|
217
|
+
:delivery_options:
|
218
|
+
:delivery_url: "http://localhost:3000/inbox"
|
219
|
+
:delivery_token: "abcdefg"
|
220
|
+
|
221
|
+
:arbitration_method: redis
|
222
|
+
:arbitration_options:
|
223
|
+
# The Redis server to connect with. Defaults to redis://localhost:6379.
|
224
|
+
:redis_url: redis://redis.example.com:6379
|
225
|
+
# The Redis namespace to house the Redis keys under. Optional.
|
226
|
+
:namespace: mail_room
|
227
|
+
|
228
|
+
```
|
229
|
+
|
230
|
+
**Note:** This will likely never be a _perfect_ system for preventing multiple deliveries of the same message, so I would advise checking the unique `message_id` if you are running in this situation.
|
231
|
+
|
232
|
+
**Note:** There are other scenarios for preventing duplication of messages at scale that _may_ be more appropriate in your particular setup. One such example is using multiple inboxes in reply-by-email situations. Another is to use labels and configure a different `SEARCH` command for each instance of MailRoom.
|
233
|
+
|
206
234
|
## Contributing ##
|
207
235
|
|
208
236
|
1. Fork it
|
data/lib/mail_room.rb
CHANGED
@@ -2,16 +2,7 @@ require 'net/imap'
|
|
2
2
|
require 'optparse'
|
3
3
|
require 'yaml'
|
4
4
|
|
5
|
-
# The MailRoom namespace
|
6
5
|
module MailRoom
|
7
|
-
# The MailRoom Delivery namespace holds any defined delivery methods
|
8
|
-
# including:
|
9
|
-
#
|
10
|
-
# * postback (default)
|
11
|
-
# * letter_opener
|
12
|
-
# * logger
|
13
|
-
# * noop
|
14
|
-
module Delivery; end
|
15
6
|
end
|
16
7
|
|
17
8
|
require "mail_room/version"
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require "redis"
|
2
|
+
|
3
|
+
module MailRoom
|
4
|
+
module Arbitration
|
5
|
+
class Redis
|
6
|
+
Options = Struct.new(:redis_url, :namespace) do
|
7
|
+
def initialize(mailbox)
|
8
|
+
redis_url = mailbox.arbitration_options[:redis_url] || "redis://localhost:6379"
|
9
|
+
namespace = mailbox.arbitration_options[:namespace]
|
10
|
+
|
11
|
+
super(redis_url, namespace)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Expire after 10 minutes so Redis doesn't get filled up with outdated data.
|
16
|
+
EXPIRATION = 600
|
17
|
+
|
18
|
+
attr_accessor :options
|
19
|
+
|
20
|
+
def initialize(options)
|
21
|
+
@options = options
|
22
|
+
end
|
23
|
+
|
24
|
+
def deliver?(uid)
|
25
|
+
key = "delivered:#{uid}"
|
26
|
+
|
27
|
+
incr = nil
|
28
|
+
redis.multi do |client|
|
29
|
+
# At this point, `incr` is a future, which will get its value after
|
30
|
+
# the MULTI command returns.
|
31
|
+
incr = client.incr(key)
|
32
|
+
|
33
|
+
client.expire(key, EXPIRATION)
|
34
|
+
end
|
35
|
+
|
36
|
+
# If INCR returns 1, that means the key didn't exist before, which means
|
37
|
+
# we are the first mail_room to try to deliver this message, so we get to.
|
38
|
+
# If we get any other value, another mail_room already (tried to) deliver
|
39
|
+
# the message, so we don't have to anymore.
|
40
|
+
incr.value == 1
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def redis
|
46
|
+
@redis ||= begin
|
47
|
+
redis = ::Redis.new(url: options.redis_url)
|
48
|
+
|
49
|
+
namespace = options.namespace
|
50
|
+
if namespace
|
51
|
+
require 'redis/namespace'
|
52
|
+
::Redis::Namespace.new(namespace, redis: redis)
|
53
|
+
else
|
54
|
+
redis
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module MailRoom
|
2
|
+
module Delivery
|
3
|
+
def [](name)
|
4
|
+
require_relative("./delivery/#{name}")
|
5
|
+
|
6
|
+
case name
|
7
|
+
when "postback"
|
8
|
+
Delivery::Postback
|
9
|
+
when "logger"
|
10
|
+
Delivery::Logger
|
11
|
+
when "letter_opener"
|
12
|
+
Delivery::LetterOpener
|
13
|
+
when "sidekiq"
|
14
|
+
Delivery::Sidekiq
|
15
|
+
when "que"
|
16
|
+
Delivery::Que
|
17
|
+
else
|
18
|
+
Delivery::Noop
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module_function :[]
|
23
|
+
end
|
24
|
+
end
|
data/lib/mail_room/mailbox.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require "mail_room/delivery"
|
2
|
+
require "mail_room/arbitration"
|
3
|
+
|
1
4
|
module MailRoom
|
2
5
|
# Mailbox Configuration fields
|
3
6
|
MAILBOX_FIELDS = [
|
@@ -15,7 +18,9 @@ module MailRoom
|
|
15
18
|
:delivery_url, # for postback
|
16
19
|
:delivery_token, # for postback
|
17
20
|
:location, # for letter_opener
|
18
|
-
:delivery_options
|
21
|
+
:delivery_options,
|
22
|
+
:arbitration_method,
|
23
|
+
:arbitration_options
|
19
24
|
]
|
20
25
|
|
21
26
|
# Holds configuration for each of the email accounts we wish to monitor
|
@@ -30,45 +35,52 @@ module MailRoom
|
|
30
35
|
:ssl => true,
|
31
36
|
:start_tls => false,
|
32
37
|
:delete_after_delivery => false,
|
33
|
-
:delivery_options => {}
|
38
|
+
:delivery_options => {},
|
39
|
+
:arbitration_method => 'noop',
|
40
|
+
:arbitration_options => {}
|
34
41
|
}
|
35
42
|
|
36
43
|
# Store the configuration and require the appropriate delivery method
|
37
44
|
# @param attributes [Hash] configuration options
|
38
45
|
def initialize(attributes={})
|
39
46
|
super(*DEFAULTS.merge(attributes).values_at(*members))
|
40
|
-
|
41
|
-
require_relative("./delivery/#{(delivery_method)}")
|
42
47
|
end
|
43
48
|
|
44
|
-
# move to a mailbox deliverer class?
|
45
49
|
def delivery_klass
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
50
|
+
Delivery[delivery_method]
|
51
|
+
end
|
52
|
+
|
53
|
+
def arbitration_klass
|
54
|
+
Arbitration[arbitration_method]
|
55
|
+
end
|
56
|
+
|
57
|
+
def delivery
|
58
|
+
@delivery ||= delivery_klass.new(parsed_delivery_options)
|
59
|
+
end
|
60
|
+
|
61
|
+
def arbitrator
|
62
|
+
@arbitrator ||= arbitration_klass.new(parsed_arbitration_options)
|
63
|
+
end
|
64
|
+
|
65
|
+
def deliver?(uid)
|
66
|
+
arbitrator.deliver?(uid)
|
60
67
|
end
|
61
68
|
|
62
69
|
# deliver the imap email message
|
63
70
|
# @param message [Net::IMAP::FetchData]
|
64
71
|
def deliver(message)
|
65
|
-
|
66
|
-
return true unless
|
67
|
-
|
68
|
-
|
72
|
+
body = message.attr['RFC822']
|
73
|
+
return true unless body
|
74
|
+
|
75
|
+
delivery.deliver(body)
|
69
76
|
end
|
70
77
|
|
71
78
|
private
|
79
|
+
|
80
|
+
def parsed_arbitration_options
|
81
|
+
arbitration_klass::Options.new(self)
|
82
|
+
end
|
83
|
+
|
72
84
|
def parsed_delivery_options
|
73
85
|
delivery_klass::Options.new(self)
|
74
86
|
end
|
@@ -14,14 +14,12 @@ module MailRoom
|
|
14
14
|
def process
|
15
15
|
# return if idling? || !running?
|
16
16
|
|
17
|
-
new_messages.each do |
|
18
|
-
# puts msg.attr['RFC822']
|
19
|
-
|
17
|
+
new_messages.each do |message|
|
20
18
|
# loop over delivery methods and deliver each
|
21
|
-
delivered = @mailbox.deliver(
|
19
|
+
delivered = @mailbox.deliver(message)
|
22
20
|
|
23
21
|
if delivered && @mailbox.delete_after_delivery
|
24
|
-
@imap.store(
|
22
|
+
@imap.store(message.seqno, "+FLAGS", [Net::IMAP::DELETED])
|
25
23
|
end
|
26
24
|
end
|
27
25
|
|
@@ -45,17 +43,17 @@ module MailRoom
|
|
45
43
|
# search for all new (unseen) message ids
|
46
44
|
# @return [Array<Integer>] message ids
|
47
45
|
def new_message_ids
|
48
|
-
@imap.
|
46
|
+
@imap.uid_search(@mailbox.search_command).select { |uid| @mailbox.deliver?(uid) }
|
49
47
|
end
|
50
48
|
|
51
49
|
# @private
|
52
50
|
# fetch the email for all given ids in RFC822 format
|
53
51
|
# @param ids [Array<Integer>] list of message ids
|
54
52
|
# @return [Array<Net::IMAP::FetchData>] the net/imap messages for the given ids
|
55
|
-
def messages_for_ids(
|
56
|
-
return [] if
|
53
|
+
def messages_for_ids(uids)
|
54
|
+
return [] if uids.empty?
|
57
55
|
|
58
|
-
@imap.
|
56
|
+
@imap.uid_fetch(uids, "RFC822")
|
59
57
|
end
|
60
58
|
end
|
61
59
|
end
|
data/lib/mail_room/version.rb
CHANGED
data/mail_room.gemspec
CHANGED
@@ -22,12 +22,13 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.add_development_dependency "mocha"
|
23
23
|
gem.add_development_dependency "bourne"
|
24
24
|
gem.add_development_dependency "simplecov"
|
25
|
+
gem.add_development_dependency "fakeredis"
|
25
26
|
|
26
27
|
# for testing delivery methods
|
27
28
|
gem.add_development_dependency "faraday"
|
28
29
|
gem.add_development_dependency "mail"
|
29
30
|
gem.add_development_dependency "letter_opener"
|
30
|
-
gem.add_development_dependency "redis"
|
31
|
+
gem.add_development_dependency "redis-namespace"
|
31
32
|
gem.add_development_dependency "pg"
|
32
33
|
gem.add_development_dependency "charlock_holmes"
|
33
34
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'mail_room/arbitration/redis'
|
3
|
+
|
4
|
+
describe MailRoom::Arbitration::Redis do
|
5
|
+
let(:mailbox) {
|
6
|
+
MailRoom::Mailbox.new(
|
7
|
+
arbitration_options: {
|
8
|
+
namespace: "mail_room"
|
9
|
+
}
|
10
|
+
)
|
11
|
+
}
|
12
|
+
let(:options) { described_class::Options.new(mailbox) }
|
13
|
+
subject { described_class.new(options) }
|
14
|
+
|
15
|
+
# Private, but we don't care.
|
16
|
+
let(:redis) { subject.send(:redis) }
|
17
|
+
|
18
|
+
describe '#deliver?' do
|
19
|
+
context "when called the first time" do
|
20
|
+
it "returns true" do
|
21
|
+
expect(subject.deliver?(123)).to be_truthy
|
22
|
+
end
|
23
|
+
|
24
|
+
it "increments the delivered flag" do
|
25
|
+
subject.deliver?(123)
|
26
|
+
|
27
|
+
expect(redis.get("delivered:123")).to eq("1")
|
28
|
+
end
|
29
|
+
|
30
|
+
it "sets an expiration on the delivered flag" do
|
31
|
+
subject.deliver?(123)
|
32
|
+
|
33
|
+
expect(redis.ttl("delivered:123")).to be > 0
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when called the second time" do
|
38
|
+
before do
|
39
|
+
subject.deliver?(123)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "returns false" do
|
43
|
+
expect(subject.deliver?(123)).to be_falsey
|
44
|
+
end
|
45
|
+
|
46
|
+
it "increments the delivered flag" do
|
47
|
+
subject.deliver?(123)
|
48
|
+
|
49
|
+
expect(redis.get("delivered:123")).to eq("2")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "when called for another uid" do
|
54
|
+
before do
|
55
|
+
subject.deliver?(123)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns true" do
|
59
|
+
expect(subject.deliver?(234)).to be_truthy
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -6,31 +6,52 @@ describe MailRoom::MailboxHandler do
|
|
6
6
|
let(:mailbox) {MailRoom::Mailbox.new}
|
7
7
|
|
8
8
|
it 'fetches and delivers all new messages from ids' do
|
9
|
-
imap.stubs(:
|
10
|
-
|
9
|
+
imap.stubs(:uid_search).returns([1,2])
|
10
|
+
message1 = stub(:attr => {'RFC822' => 'message1'})
|
11
|
+
message2 = stub(:attr => {'RFC822' => 'message2'})
|
12
|
+
imap.stubs(:uid_fetch).returns([message1, message2])
|
11
13
|
mailbox.stubs(:deliver)
|
12
14
|
|
13
15
|
handler = MailRoom::MailboxHandler.new(mailbox, imap)
|
14
16
|
handler.process
|
15
17
|
|
16
|
-
imap.should have_received(:
|
17
|
-
imap.should have_received(:
|
18
|
-
mailbox.should have_received(:deliver).with(
|
19
|
-
mailbox.should have_received(:deliver).with(
|
18
|
+
imap.should have_received(:uid_search).with('UNSEEN')
|
19
|
+
imap.should have_received(:uid_fetch).with([1,2], 'RFC822')
|
20
|
+
mailbox.should have_received(:deliver).with(message1)
|
21
|
+
mailbox.should have_received(:deliver).with(message2)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "fetches and delivers all new messages from ids that haven't been processed yet" do
|
25
|
+
imap.stubs(:uid_search).returns([1,2])
|
26
|
+
message1 = stub(:attr => {'RFC822' => 'message1'})
|
27
|
+
message2 = stub(:attr => {'RFC822' => 'message2'})
|
28
|
+
imap.stubs(:uid_fetch).returns([message2])
|
29
|
+
mailbox.stubs(:deliver)
|
30
|
+
mailbox.stubs(:deliver?).with(1).returns(false)
|
31
|
+
mailbox.stubs(:deliver?).with(2).returns(true)
|
32
|
+
|
33
|
+
handler = MailRoom::MailboxHandler.new(mailbox, imap)
|
34
|
+
handler.process
|
35
|
+
|
36
|
+
imap.should have_received(:uid_search).with('UNSEEN')
|
37
|
+
imap.should have_received(:uid_fetch).with([2], 'RFC822')
|
38
|
+
|
39
|
+
mailbox.should have_received(:deliver).with(message1).never
|
40
|
+
mailbox.should have_received(:deliver).with(message2)
|
20
41
|
end
|
21
42
|
|
22
43
|
it 'returns no messages if there are no ids' do
|
23
|
-
imap.stubs(:
|
24
|
-
imap.stubs(:
|
44
|
+
imap.stubs(:uid_search).returns([])
|
45
|
+
imap.stubs(:uid_fetch)
|
25
46
|
mailbox.search_command = 'NEW'
|
26
47
|
mailbox.stubs(:deliver)
|
27
48
|
|
28
49
|
handler = MailRoom::MailboxHandler.new(mailbox, imap)
|
29
50
|
handler.process
|
30
51
|
|
31
|
-
imap.should have_received(:
|
32
|
-
imap.should have_received(:
|
52
|
+
imap.should have_received(:uid_search).with('NEW')
|
53
|
+
imap.should have_received(:uid_fetch).never
|
33
54
|
mailbox.should have_received(:deliver).never
|
34
55
|
end
|
35
56
|
end
|
36
|
-
end
|
57
|
+
end
|
data/spec/lib/mailbox_spec.rb
CHANGED
@@ -2,11 +2,39 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe MailRoom::Mailbox do
|
4
4
|
describe "#deliver" do
|
5
|
+
context "with arbitration_method of noop" do
|
6
|
+
it 'arbitrates with a Noop instance' do
|
7
|
+
mailbox = MailRoom::Mailbox.new({:arbitration_method => 'noop'})
|
8
|
+
noop = stub(:deliver?)
|
9
|
+
MailRoom::Arbitration['noop'].stubs(:new => noop)
|
10
|
+
|
11
|
+
uid = 123
|
12
|
+
|
13
|
+
mailbox.deliver?(uid)
|
14
|
+
|
15
|
+
noop.should have_received(:deliver?).with(uid)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "with arbitration_method of redis" do
|
20
|
+
it 'arbitrates with a Redis instance' do
|
21
|
+
mailbox = MailRoom::Mailbox.new({:arbitration_method => 'redis'})
|
22
|
+
redis = stub(:deliver?)
|
23
|
+
MailRoom::Arbitration['redis'].stubs(:new => redis)
|
24
|
+
|
25
|
+
uid = 123
|
26
|
+
|
27
|
+
mailbox.deliver?(uid)
|
28
|
+
|
29
|
+
redis.should have_received(:deliver?).with(uid)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
5
33
|
context "with delivery_method of noop" do
|
6
34
|
it 'delivers with a Noop instance' do
|
7
35
|
mailbox = MailRoom::Mailbox.new({:delivery_method => 'noop'})
|
8
36
|
noop = stub(:deliver)
|
9
|
-
MailRoom::Delivery
|
37
|
+
MailRoom::Delivery['noop'].stubs(:new => noop)
|
10
38
|
|
11
39
|
mailbox.deliver(stub(:attr => {'RFC822' => 'a message'}))
|
12
40
|
|
@@ -18,7 +46,7 @@ describe MailRoom::Mailbox do
|
|
18
46
|
it 'delivers with a Logger instance' do
|
19
47
|
mailbox = MailRoom::Mailbox.new({:delivery_method => 'logger'})
|
20
48
|
logger = stub(:deliver)
|
21
|
-
MailRoom::Delivery
|
49
|
+
MailRoom::Delivery['logger'].stubs(:new => logger)
|
22
50
|
|
23
51
|
mailbox.deliver(stub(:attr => {'RFC822' => 'a message'}))
|
24
52
|
|
@@ -30,7 +58,7 @@ describe MailRoom::Mailbox do
|
|
30
58
|
it 'delivers with a Postback instance' do
|
31
59
|
mailbox = MailRoom::Mailbox.new({:delivery_method => 'postback'})
|
32
60
|
postback = stub(:deliver)
|
33
|
-
MailRoom::Delivery
|
61
|
+
MailRoom::Delivery['postback'].stubs(:new => postback)
|
34
62
|
|
35
63
|
mailbox.deliver(stub(:attr => {'RFC822' => 'a message'}))
|
36
64
|
|
@@ -42,7 +70,7 @@ describe MailRoom::Mailbox do
|
|
42
70
|
it 'delivers with a LetterOpener instance' do
|
43
71
|
mailbox = MailRoom::Mailbox.new({:delivery_method => 'letter_opener'})
|
44
72
|
letter_opener = stub(:deliver)
|
45
|
-
MailRoom::Delivery
|
73
|
+
MailRoom::Delivery['letter_opener'].stubs(:new => letter_opener)
|
46
74
|
|
47
75
|
mailbox.deliver(stub(:attr => {'RFC822' => 'a message'}))
|
48
76
|
|
@@ -54,7 +82,7 @@ describe MailRoom::Mailbox do
|
|
54
82
|
it "doesn't deliver the message" do
|
55
83
|
mailbox = MailRoom::Mailbox.new({:delivery_method => 'noop'})
|
56
84
|
noop = stub(:deliver)
|
57
|
-
MailRoom::Delivery
|
85
|
+
MailRoom::Delivery['noop'].stubs(:new => noop)
|
58
86
|
|
59
87
|
mailbox.deliver(stub(:attr => {'FLAGS' => [:Seen, :Recent]}))
|
60
88
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mail_room
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Pitale
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09
|
11
|
+
date: 2015-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: fakeredis
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: faraday
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -123,7 +137,7 @@ dependencies:
|
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '0'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
|
-
name: redis
|
140
|
+
name: redis-namespace
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
143
|
- - ">="
|
@@ -183,9 +197,13 @@ files:
|
|
183
197
|
- Rakefile
|
184
198
|
- bin/mail_room
|
185
199
|
- lib/mail_room.rb
|
200
|
+
- lib/mail_room/arbitration.rb
|
201
|
+
- lib/mail_room/arbitration/noop.rb
|
202
|
+
- lib/mail_room/arbitration/redis.rb
|
186
203
|
- lib/mail_room/cli.rb
|
187
204
|
- lib/mail_room/configuration.rb
|
188
205
|
- lib/mail_room/coordinator.rb
|
206
|
+
- lib/mail_room/delivery.rb
|
189
207
|
- lib/mail_room/delivery/letter_opener.rb
|
190
208
|
- lib/mail_room/delivery/logger.rb
|
191
209
|
- lib/mail_room/delivery/noop.rb
|
@@ -198,6 +216,7 @@ files:
|
|
198
216
|
- lib/mail_room/version.rb
|
199
217
|
- mail_room.gemspec
|
200
218
|
- spec/fixtures/test_config.yml
|
219
|
+
- spec/lib/arbitration/redis_spec.rb
|
201
220
|
- spec/lib/cli_spec.rb
|
202
221
|
- spec/lib/configuration_spec.rb
|
203
222
|
- spec/lib/coordinator_spec.rb
|
@@ -235,6 +254,7 @@ summary: mail_room will proxy email (gmail) from IMAP to a callback URL, logger,
|
|
235
254
|
letter_opener
|
236
255
|
test_files:
|
237
256
|
- spec/fixtures/test_config.yml
|
257
|
+
- spec/lib/arbitration/redis_spec.rb
|
238
258
|
- spec/lib/cli_spec.rb
|
239
259
|
- spec/lib/configuration_spec.rb
|
240
260
|
- spec/lib/coordinator_spec.rb
|