]> git.cworth.org Git - sup/blob - lib/sup/person.rb
moved evertying to devel
[sup] / lib / sup / person.rb
1 module Redwood
2
3 class Person
4   @@email_map = {}
5
6   attr_accessor :name, :email
7
8   def initialize name, email
9     raise ArgumentError, "email can't be nil" unless email
10     @name = 
11       if name
12         name.gsub(/^\s+|\s+$/, "").gsub(/\s+/, " ")
13       else
14         nil
15       end
16     @email = email.gsub(/^\s+|\s+$/, "").gsub(/\s+/, " ").downcase
17     @@email_map[@email] = self
18   end
19
20   def == o; o && o.email == email; end
21   alias :eql? :==
22
23   def hash
24     [name, email].hash
25   end
26
27   def shortname
28     case @name
29     when /\S+, (\S+)/
30       $1
31     when /(\S+) \S+/
32       $1
33     when nil
34       @email #[0 ... 10]
35     else
36       @name #[0 ... 10]
37     end
38   end
39
40   def longname
41     if @name && @email
42       "#@name <#@email>"
43     else
44       @email
45     end
46   end
47
48   def mediumname
49     if @name
50       name
51     else
52       @email
53     end
54   end
55
56   def full_address
57     if @name && @email
58       if @name =~ /"/
59         "#{@name.inspect} <#@email>"
60       else
61         "#@name <#@email>"
62       end
63     else
64       @email
65     end
66   end
67
68   def sort_by_me
69     case @name
70     when /^(\S+), \S+/
71       $1
72     when /^\S+ \S+ (\S+)/
73       $1
74     when /^\S+ (\S+)/
75       $1
76     when nil
77       @email
78     else
79       @name
80     end.downcase
81   end
82
83   def self.for_several s
84     return [] if s.nil?
85
86     begin
87       s.split_on_commas.map { |ss| self.for ss }
88     rescue StandardError => e
89       raise "#{e.message}: for #{s.inspect}"
90     end
91   end
92
93   def self.for s
94     return nil if s.nil?
95     name, email =
96       case s
97       when /["'](.*?)["'] <(.*?)>/, /([^,]+) <(.*?)>/
98         a, b = $1, $2
99         [a.gsub('\"', '"'), b]
100       when /<((\S+?)@\S+?)>/
101         [$2, $1]
102       when /((\S+?)@\S+)/
103         [$2, $1]
104       else
105         [nil, s]
106       end
107
108     if name && (p = @@email_map[email])
109       ## all else being equal, prefer longer names, unless the prior name
110       ## doesn't contain any capitalization
111       p.name = name if (p.name.nil? || p.name.length < name.length) unless
112         p.name =~ /[A-Z]/ || (AccountManager.instantiated? && AccountManager.is_account?(p))
113       p 
114     else
115       Person.new name, email
116     end
117   end
118 end
119
120 end