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'
}

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


41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/maildir/message.rb', line 41

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.



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

def dir
  @dir
end

#infoObject

Returns the value of attribute info.



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

def info
  @info
end

#unique_nameObject (readonly)

Returns the value of attribute unique_name.



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

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

DEPRECATED: Get the serializer.

See Also:



22
23
24
# File 'lib/maildir/message.rb', line 22

def self.serializer
  Maildir.serializer
end

.serializer=(serializer) ⇒ Object

DEPRECATED: Set the serializer.



28
29
30
# File 'lib/maildir/message.rb', line 28

def self.serializer=(serializer)
  Maildir.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.



58
59
60
61
62
63
# File 'lib/maildir/message.rb', line 58

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.



133
134
135
# File 'lib/maildir/message.rb', line 133

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. Returns 1 if the file was destroyed, false if the file was missings.



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

def destroy
  freeze
  guard { File.delete(path) }
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



121
122
123
# File 'lib/maildir/message.rb', line 121

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

#flags=(*flags) ⇒ Object

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



127
128
129
# File 'lib/maildir/message.rb', line 127

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

#inspectObject

Friendly inspect method



66
67
68
# File 'lib/maildir/message.rb', line 66

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



91
92
93
# File 'lib/maildir/message.rb', line 91

def process
  rename(:cur, INFO)
end

#remove_flag(flags) ⇒ Object

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

flags

String or Array



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

def remove_flag(flags)
  return self.flags if flags.blank?
  self.flags = self.flags.reject { |f| f =~ /[#{Array(flags).join}]/i }
end

#serializerObject

Helper to get serializer.



71
72
73
# File 'lib/maildir/message.rb', line 71

def serializer
  @maildir.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



80
81
82
83
84
85
86
87
# File 'lib/maildir/message.rb', line 80

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