summaryrefslogtreecommitdiff
path: root/fake-service/lib/smail/contacts_observer.rb
diff options
context:
space:
mode:
authorOla Bini <ola.bini@gmail.com>2014-07-31 19:35:40 -0300
committerOla Bini <ola.bini@gmail.com>2014-07-31 19:35:40 -0300
commite54e5ee931b3991cbb5e427e7e5d27b3f6c75e6e (patch)
tree1e0da33d22874c0ea5576818fe45958611ebda29 /fake-service/lib/smail/contacts_observer.rb
parent04cf441c5ae18400c6b4865b0b37a71718dc9d46 (diff)
Add fake-service
Diffstat (limited to 'fake-service/lib/smail/contacts_observer.rb')
-rw-r--r--fake-service/lib/smail/contacts_observer.rb54
1 files changed, 54 insertions, 0 deletions
diff --git a/fake-service/lib/smail/contacts_observer.rb b/fake-service/lib/smail/contacts_observer.rb
new file mode 100644
index 00000000..04c1670b
--- /dev/null
+++ b/fake-service/lib/smail/contacts_observer.rb
@@ -0,0 +1,54 @@
+module Smail
+ class ContactsObserver
+ def initialize(contacts)
+ @contacts = contacts
+ end
+
+ def extract_addresses(*addrs)
+ addrs.flatten.compact
+ end
+
+ def all_receivers(mail, &block)
+ extract_addresses(mail.to, mail.cc, mail.bcc).each(&block)
+ end
+
+ def all_senders(mail, &block)
+ extract_addresses(mail.from).each(&block)
+ end
+
+ def new_receivers(before, after, &block)
+ (extract_addresses(after.to, after.cc, after.bcc) - extract_addresses(before.to, before.cc, before.bcc)).each(&block)
+ end
+
+ def new_senders(before, after, &block)
+ (extract_addresses(after.from) - extract_addresses(before.from)).each(&block)
+ end
+
+ def timestamp_from(mail)
+ mail.headers[:date]
+ end
+
+ def mail_added(mail)
+ timestamp = timestamp_from(mail)
+ all_receivers(mail) do |rcv|
+ @contacts.new_mail_to(rcv, timestamp)
+ end
+ all_senders(mail) do |s|
+ @contacts.new_mail_from(s, timestamp)
+ end
+ end
+
+ def mail_removed(mail)
+ end
+
+ def mail_updated(before, after)
+ timestamp = timestamp_from(after)
+ new_receivers(before, after) do |rcv|
+ @contacts.new_mail_to(rcv, timestamp)
+ end
+ new_senders(before, after) do |s|
+ @contacts.new_mail_from(s, timestamp)
+ end
+ end
+ end
+end