Class: Maildir::Message

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/maildir/message.rb

Constant Summary collapse

COLON =

COLON seperates the unique name from the info

':'
INFO =

The default info, to which flags are appended

"2,"
FLAG_NAMES =
{
  :passed => 'P',
  :replied => 'R',
  :seen => 'S',
  :trashed => 'T',
  :draft => 'D',
  :flagged => 'F'
}
@@serializer =

The serializer processes data before it is written to disk and after reading from disk. Default serializer

Maildir::Serializer::Base.new

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(maildir, key = nil) ⇒ Message

Create a new, unwritten message or instantiate an existing message. If key is nil, create a new message:

Message.new(maildir) # => a new, unwritten message

If key is not nil, instantiate a message object for the message at key.

Message.new(maildir, key) # => an existing message


44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/maildir/message.rb', line 44

def initialize(maildir, key=nil)
  @maildir = maildir
  if key.nil?
    @dir = :tmp
    @unique_name = Maildir::UniqueName.create
  else
    parse_key(key)
  end

  unless Maildir::SUBDIRS.include? dir
    raise ArgumentError, "State must be in #{Maildir::SUBDIRS.inspect}"
  end
end

Instance Attribute Details

#dirObject (readonly)

Returns the value of attribute dir.



35
36
37
# File 'lib/maildir/message.rb', line 35

def dir
  @dir
end

#infoObject

Returns the value of attribute info.



35
36
37
# File 'lib/maildir/message.rb', line 35

def info
  @info
end

#unique_nameObject (readonly)

Returns the value of attribute unique_name.



35
36
37
# File 'lib/maildir/message.rb', line 35

def unique_name
  @unique_name
end

Class Method Details

.create(maildir, data) ⇒ Object

Create a new message in maildir with data. The message is first written to the tmp dir, then moved to new. This is a shortcut for:

message = Maildir::Message.new(maildir)
message.write(data)


14
15
16
17
18
# File 'lib/maildir/message.rb', line 14

def self.create(maildir, data)
  message = self.new(maildir)
  message.write(data)
  message
end

.serializerObject

Get the serializer



26
27
28
# File 'lib/maildir/message.rb', line 26

def self.serializer
  @@serializer
end

.serializer=(serializer) ⇒ Object

Set the serializer



31
32
33
# File 'lib/maildir/message.rb', line 31

def self.serializer=(serializer)
  @@serializer = serializer
end

Instance Method Details

#<=>(message) ⇒ Object

Compares messages by their paths. If message is a different class, return nil. Otherwise, return 1, 0, or -1.



61
62
63
64
65
66
# File 'lib/maildir/message.rb', line 61

def <=>(message)
  # Return nil if comparing different classes
  return nil unless self.class === message

  self.path <=> message.path
end

#add_flag(flag) ⇒ Object

Adds a flag to a message. Returns the message’s key if successful, false otherwise.



136
137
138
# File 'lib/maildir/message.rb', line 136

def add_flag(flag)
  self.flags = (flags << flag.upcase)
end

#atimeObject

Returns the message’s atime, or false if the file doesn’t exist.



174
175
176
# File 'lib/maildir/message.rb', line 174

def atime
  guard { File.atime(path) }
end

#dataObject

Returns the message’s data from disk. If the path doesn’t exist, freeze’s the object and raises Errno:ENOENT



163
164
165
# File 'lib/maildir/message.rb', line 163

def data
  guard(true) { serializer.load(path) }
end

#destroyObject

Deletes the message path and freezes the message object



184
185
186
187
# File 'lib/maildir/message.rb', line 184

def destroy
  guard { File.delete(path) }
  freeze
end

#filenameObject

Returns the filename of the message



147
148
149
# File 'lib/maildir/message.rb', line 147

def filename
  [unique_name, info].compact.join(COLON)
end

#flagsObject

Returns an array of single letter flags applied to the message



124
125
126
# File 'lib/maildir/message.rb', line 124

def flags
  @info.sub(INFO,'').split('')
end

#flags=(*flags) ⇒ Object

Sets the flags on a message. Returns the message’s key if successful, false otherwise.



130
131
132
# File 'lib/maildir/message.rb', line 130

def flags=(*flags)
  self.info = INFO + sort_flags(flags.flatten.join(''))
end

#inspectObject

Friendly inspect method



69
70
71
# File 'lib/maildir/message.rb', line 69

def inspect
  "#<#{self.class} key=#{key} maildir=#{@maildir.inspect}>"
end

#keyObject

Returns the key to identify the message



152
153
154
# File 'lib/maildir/message.rb', line 152

def key
  File.join(dir.to_s, filename)
end

#mtimeObject

Returns the message’s mtime, or false if the file doesn’t exist.



179
180
181
# File 'lib/maildir/message.rb', line 179

def mtime
  guard { File.mtime(path) }
end

#pathObject

Returns the full path to the message



157
158
159
# File 'lib/maildir/message.rb', line 157

def path
  File.join(@maildir.path, key)
end

#processObject

Move a message from new to cur, add info. Returns the message’s key



94
95
96
# File 'lib/maildir/message.rb', line 94

def process
  rename(:cur, INFO)
end

#remove_flag(flag) ⇒ Object

Removes a flag from a message. Returns the message’s key if successful, false otherwise.



142
143
144
# File 'lib/maildir/message.rb', line 142

def remove_flag(flag)
  self.flags = flags.delete_if{|f| f == flag.upcase}
end

#serializerObject

Returns the class’ serializer



74
75
76
# File 'lib/maildir/message.rb', line 74

def serializer
  @@serializer
end

#utime(atime, mtime) ⇒ Object

Updates the modification and access time. Returns 1 if successful, false otherwise.



169
170
171
# File 'lib/maildir/message.rb', line 169

def utime(atime, mtime)
  guard { File.utime(atime, mtime, path) }
end

#write(data) ⇒ Object

Writes data to disk. Can only be called on messages instantiated without a key (which haven’t been written to disk). After successfully writing to disk, rename the message to the new dir

Returns the message’s key



83
84
85
86
87
88
89
90
# File 'lib/maildir/message.rb', line 83

def write(data)
  raise "Can only write to messages in tmp" unless :tmp == @dir

  # Write out contents to tmp
  serializer.dump(data, path)

  rename(:new)
end