GitHub Sale: sign up for any paid plan this week and pay nothing until January 1, 2009!  [ hide ]

public
Description: DataMapper Adapters
Homepage: http://www.yehudakatz.com
Clone URL: git://github.com/wycats/dm-adapters.git
halorgium (author)
Thu Oct 09 20:00:15 -0700 2008
commit  51351505c0ad64074768baa63e5231315aa59b13
tree    26d53b099c9fab7ed2ea370925758e46ba1015b0
parent  900d5b90e3a4691a394921b9a09c92c6042ba3f6
dm-adapters / imap / types.rb
100644 87 lines (73 sloc) 2.364 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
module DataMapper
  module Adapters
    
    module Imap
      class ImapType < DataMapper::Type
        class << self
          attr_reader :query_details
          def imap_query(name)
            @query_details = name
          end
          
          attr_reader :envelope_name
          def envelope(name)
            self.field "ENVELOPE"
            @envelope_name = name
          end
          
          def envelope?
            !!@envelope_name
          end
        end
      end
 
      class Uid < ImapType
        primitive String
        field "UID"
        imap_query(:eql => ["UID"], :like => ["UID"])
      end
 
      class Body < ImapType
        primitive String
        field "RFC822.TEXT"
        imap_query(:eql => ["BODY"], :like => ["BODY"])
      end
 
      class InternalDate < ImapType
        primitive DateTime
        field "INTERNALDATE"
        imap_query(:lt => ["BEFORE"], :eql => ["ON"], :gt => ["SINCE"])
      end
 
      class EnvelopeDate < ImapType
        primitive DateTime
        envelope :date
        imap_query(:lt => ["SENTBEFORE"], :eql => ["SENTON"], :gt => ["SENTSINCE"])
      end
 
      class Size < ImapType
        primitive Integer
        field "RFC822.SIZE"
        imap_query(:lt => ["SMALLER"], :gt => ["LARGER"])
      end
 
      class Header < ImapType
        primitive String
        field "BODY.PEEK[HEADER]"
        imap_query(:eql => ["HEADER"])
      end
 
      {:from => ["FROM"], :sender => ["HEADER", "Sender"],
       :to => ["TO"], :reply_to => ["HEADER", "Reply-To"],
       :cc => ["CC"], :bcc => ["BCC"]}.each do |kind, imap_query|
          self.class_eval <<-HERE
class #{Inflection.camelize(kind.to_s)} < ImapType
primitive Object
envelope :#{kind}
imap_query(:eql => #{imap_query.inspect}, :like => #{imap_query.inspect})
end
HERE
      end
 
      {:subject => ["SUBJECT"], :in_reply_to => ["HEADER", "In-Reply-To"],
       :message_id => ["HEADER", "Message-ID"]}.each do |kind, imap_query|
          self.class_eval <<-HERE
class #{Inflection.camelize(kind.to_s)} < ImapType
primitive String
envelope :#{kind}
imap_query(:eql => #{imap_query.inspect}, :like => #{imap_query.inspect})
end
HERE
      end
 
    end
 
  end
end