maildir 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,7 +6,7 @@ A ruby library for reading and writing messages in the maildir format.
6
6
 
7
7
  See http://cr.yp.to/proto/maildir.html and http://en.wikipedia.org/wiki/Maildir
8
8
 
9
- "Two words: no locks." -- Daniel J. Berstein
9
+ "Two words: no locks." -- Daniel J. Bernstein
10
10
 
11
11
  The maildir format allows multiple processes to read and write arbitrary messages without file locks.
12
12
 
@@ -14,6 +14,9 @@ New messages are initially written to a "tmp" directory with an automatically-ge
14
14
 
15
15
  While the maildir format was created for email, it works well for arbitrary data. This library can read & write email messages or arbitrary data. See Pluggable serializers for more.
16
16
 
17
+ {<img src="https://secure.travis-ci.org/ktheory/maildir.png" />}[http://travis-ci.org/ktheory/maildir]
18
+
19
+
17
20
  == Install
18
21
 
19
22
  gem install maildir
@@ -50,6 +53,12 @@ Add some flags to the message to indicate state. See "What can I put in info" at
50
53
  message.remove_flag("F") # unflag the message
51
54
  message.add_flag("T") # Mark the message as "trashed"
52
55
 
56
+ List :cur messages based on flags.
57
+
58
+ maildir.list(:cur, :flags => 'F') # => lists all messages with flag 'F
59
+ maildir.list(:cur, :flags => 'FS') # => lists all messages with flag 'F' and 'S'; Flags must be specified in acending ASCII order ('FS' and not 'SF')
60
+ maildir.list(:cur, :flags => '') # => lists all messages without any flags
61
+
53
62
  Get a key to uniquely identify the message
54
63
 
55
64
  key = message.key
@@ -76,6 +76,14 @@ class Maildir
76
76
  end
77
77
 
78
78
  # Returns an arry of messages from :new or :cur directory, sorted by key.
79
+ # If options[:flags] is specified and directory is :cur, returns messages with flags specified
80
+ #
81
+ # E.g.
82
+ # maildir.list(:cur, :flags => 'F') # => lists all messages with flag 'F'
83
+ # maildir.list(:cur, :flags => 'FS') # => lists all messages with flag 'F' and 'S'; Flags must be specified in acending ASCII order ('FS' and not 'SF')
84
+ # maildir.list(:cur, :flags => '') # => lists all messages without any flags
85
+ # This option does not work for :new directory
86
+ #
79
87
  # If options[:limit] is specified, returns only so many keys.
80
88
  #
81
89
  # E.g.
@@ -86,7 +94,10 @@ class Maildir
86
94
  raise ArgumentError, "dir must be :new, :cur, or :tmp"
87
95
  end
88
96
 
89
- keys = get_dir_listing(dir)
97
+ # Set flags to filter messages
98
+ # Silently ignored if dir is :new
99
+ flags = (dir.to_sym == :cur) ? options[:flags] : nil
100
+ keys = get_dir_listing(dir, :flags => flags)
90
101
 
91
102
  # Sort the keys (chronological order)
92
103
  # TODO: make sorting configurable
@@ -127,8 +138,10 @@ class Maildir
127
138
 
128
139
  protected
129
140
  # Returns an array of keys in dir
130
- def get_dir_listing(dir)
131
- search_path = File.join(self.path, dir.to_s, '*')
141
+ def get_dir_listing(dir, options={})
142
+ filter = "*"
143
+ filter = "#{filter}:2,#{options[:flags]}" if options[:flags]
144
+ search_path = File.join(self.path, dir.to_s, filter)
132
145
  keys = Dir.glob(search_path)
133
146
  # Remove the maildir's path from the keys
134
147
  keys.each do |key|
@@ -119,7 +119,7 @@ class Maildir::Message
119
119
 
120
120
  # Returns an array of single letter flags applied to the message
121
121
  def flags
122
- @info.sub(INFO,'').split(//)
122
+ @info.to_s.sub(INFO,'').split(//)
123
123
  end
124
124
 
125
125
  # Sets the flags on a message.
@@ -10,7 +10,9 @@ class Maildir
10
10
  class Base
11
11
  # Reads the file at path. Returns the contents of path.
12
12
  def load(path)
13
- File.read(path)
13
+ File.open(path,'rb') do |f|
14
+ f.read
15
+ end
14
16
  end
15
17
 
16
18
  # Writes data to path. Returns number of bytes written.
@@ -37,7 +37,7 @@ class Maildir::UniqueName
37
37
  # The middle part contains the microsecond, the process id, and a
38
38
  # per-process incrementing counter
39
39
  def middle
40
- "M#{microsecond}P#{process_id}Q#{delivery_count}"
40
+ "M#{'%06d' % microsecond}P#{process_id}Q#{delivery_count}"
41
41
  end
42
42
 
43
43
  # The right part is the hostname
@@ -1,3 +1,3 @@
1
1
  class Maildir
2
- VERSION = '2.0.0'
2
+ VERSION = '2.1.0'
3
3
  end
@@ -53,12 +53,51 @@ class TestMaildir < Test::Unit::TestCase
53
53
  messages = temp_maildir.list(:new)
54
54
  assert_equal messages, [@message]
55
55
  end
56
-
57
- should "list a cur message" do
58
- @message = temp_maildir.add("")
59
- @message.process
60
- messages = temp_maildir.list(:cur)
61
- assert_equal messages, [@message]
56
+
57
+ context "cur message" do
58
+ should "list a cur message" do
59
+ @message = temp_maildir.add("")
60
+ @message.process
61
+ messages = temp_maildir.list(:cur)
62
+ assert_equal messages, [@message]
63
+ end
64
+
65
+ should "list and filter cur messages based on flags" do
66
+ @message = temp_maildir.add("")
67
+ @message.process
68
+
69
+ @flagged_message = temp_maildir.add("")
70
+ @flagged_message.process
71
+ @flagged_message.add_flag('F')
72
+
73
+ messages = temp_maildir.list(:cur, :flags => 'F')
74
+ assert_equal messages, [@flagged_message]
75
+ end
76
+
77
+ should "list and filter cur messages based on multiple flags" do
78
+ @message = temp_maildir.add("")
79
+ @message.process
80
+
81
+ @flagged_message = temp_maildir.add("")
82
+ @flagged_message.process
83
+ @flagged_message.add_flag('F')
84
+ @flagged_message.add_flag('S')
85
+
86
+ messages = temp_maildir.list(:cur, :flags => 'FS')
87
+ assert_equal messages, [@flagged_message]
88
+ end
89
+
90
+ should "list and filter cur messages without any flags" do
91
+ @message = temp_maildir.add("")
92
+ @message.process
93
+
94
+ @flagged_message = temp_maildir.add("")
95
+ @flagged_message.process
96
+ @flagged_message.add_flag('F')
97
+
98
+ messages = temp_maildir.list(:cur, :flags => '')
99
+ assert_equal messages, [@message]
100
+ end
62
101
  end
63
102
  end
64
103
 
@@ -80,6 +80,10 @@ class TestMessage < Test::Unit::TestCase
80
80
  should "have the correct data" do
81
81
  assert_equal @data, @message.data
82
82
  end
83
+
84
+ should "have empty flags" do
85
+ assert_equal [], @message.flags
86
+ end
83
87
  end
84
88
 
85
89
  context "A processed message" do
@@ -30,6 +30,16 @@ class TestUniqueName < Test::Unit::TestCase
30
30
  @new_name.send(:instance_variable_set, :@now, @now)
31
31
  assert_not_equal @name, @new_name.to_s
32
32
  end
33
+
34
+ should "be chronological" do
35
+ @name1 = Maildir::UniqueName.new
36
+ @name1.send(:instance_variable_set, :@now, Time.at(0.000009))
37
+
38
+ @name2 = Maildir::UniqueName.new
39
+ @name2.send(:instance_variable_set, :@now, Time.at(0.100000))
40
+
41
+ assert_operator @name2.to_s, :>, @name1.to_s
42
+ end
33
43
 
34
44
  end
35
45
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maildir
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-09 00:00:00.000000000Z
12
+ date: 2012-09-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &70101941878220 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70101941878220
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: shoulda
27
- requirement: &70101941877660 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: '0'
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *70101941877660
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: mail
38
- requirement: &70101941877140 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: '0'
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70101941877140
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: json
49
- requirement: &70101941876660 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '0'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70101941876660
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: fakefs
60
- requirement: &70101941876060 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,7 +85,12 @@ dependencies:
65
85
  version: 0.3.2
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70101941876060
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: 0.3.2
69
94
  description: A ruby library for reading and writing arbitrary messages in DJB's maildir
70
95
  format
71
96
  email: aaron@ktheory.com
@@ -111,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
136
  version: 1.3.5
112
137
  requirements: []
113
138
  rubyforge_project:
114
- rubygems_version: 1.8.7
139
+ rubygems_version: 1.8.23
115
140
  signing_key:
116
141
  specification_version: 3
117
142
  summary: Read & write messages in the maildir format