maildir 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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