]> git.cworth.org Git - sup/blobdiff - lib/sup/account.rb
Merge branch 'xapian-updates'
[sup] / lib / sup / account.rb
index c486e87fffa8a85c906d0da152c88c2274fccdca..eed2794d5f8562647a52f18686f2f635963d5799 100644 (file)
@@ -1,12 +1,14 @@
 module Redwood
 
 class Account < Person
-  attr_accessor :sendmail, :sig_file
+  attr_accessor :sendmail, :signature
 
   def initialize h
+    raise ArgumentError, "no name for account" unless h[:name]
+    raise ArgumentError, "no email for account" unless h[:email]
     super h[:name], h[:email]
     @sendmail = h[:sendmail]
-    @sig_file = h[:sig_file] or raise h.inspect
+    @signature = h[:signature]
   end
 end
 
@@ -17,37 +19,53 @@ class AccountManager
 
   def initialize accounts
     @email_map = {}
-    @alternate_map = {}
     @accounts = {}
+    @regexen = {}
     @default_account = nil
 
-    accounts.each { |k, v| add_account v, k == :default }
-
-    self.class.i_am_the_instance self
+    add_account accounts[:default], true
+    accounts.each { |k, v| add_account v, false unless k == :default }
   end
 
   def user_accounts; @accounts.keys; end
-  def user_emails; (@email_map.keys + @alternate_map.keys).uniq.select { |e| String === e }; end
+  def user_emails; @email_map.keys.select { |e| String === e }; end
 
+  ## must be called first with the default account. fills in missing
+  ## values from the default account.
   def add_account hash, default=false
-    email = hash[:email]
+    raise ArgumentError, "no email specified for account" unless hash[:email]
+    unless default
+      [:name, :sendmail, :signature].each { |k| hash[k] ||= @default_account.send(k) }
+    end
+    hash[:alternates] ||= []
 
-    next if @email_map.member? email
     a = Account.new hash
     @accounts[a] = true
-    @email_map[email] = a
-    hash[:alternates].each { |aa| @alternate_map[aa] = a }
+
     if default
       raise ArgumentError, "multiple default accounts" if @default_account
-      @default_account = a 
+      @default_account = a
     end
+
+    ([hash[:email]] + hash[:alternates]).each do |email|
+      next if @email_map.member? email
+      @email_map[email] = a
+    end
+
+    hash[:regexen].each do |re|
+      @regexen[Regexp.new(re)] = a
+    end if hash[:regexen]
   end
 
-  def is_account? p; @accounts.member? p; end
+  def is_account? p; is_account_email? p.email end
+  def is_account_email? email; !account_for(email).nil? end
   def account_for email
-    @email_map[email] || @alternate_map[email] || @alternate_map.argfind { |k, v| k === email && v }
+    if(a = @email_map[email])
+      a
+    else
+      @regexen.argfind { |re, a| re =~ email && a }
+    end
   end
-  def is_account_email? email; !account_for(email).nil?; end
 end
 
 end