maildir 0.6.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -73,7 +73,7 @@ By default, message data are written and read from disk as a string. It's often
73
73
 
74
74
  The following serializers are included:
75
75
 
76
- * Maildir::Serializer::Base (the default)
76
+ * Maildir::Serializer::Base (default)
77
77
  * Maildir::Serializer::Mail
78
78
  * Maildir::Serializer::Marshal
79
79
  * Maildir::Serializer::JSON
@@ -85,6 +85,13 @@ Maildir::Serializer::Base simply reads and writes strings to disk.
85
85
  message = maildir.add("Hello World!") # writes "Hello World!" to disk
86
86
  message.data # => "Hello World!"
87
87
 
88
+ As of version 0.7, the Maildir::Serializer::Base can write IO streams as well as strings. For example:
89
+
90
+ message.add(STDIN)
91
+
92
+ This will use Ruby 1.9's more efficient IO.copy_stream method if available,
93
+ and degrade gracefully in Ruby 1.8.
94
+
88
95
  The Mail serializer takes a ruby Mail object (http://github.com/mikel/mail) and writes RFC2822 email messages.
89
96
 
90
97
  require 'maildir/serializer/mail'
@@ -109,6 +116,7 @@ It's trivial to create a custom serializer. Implement the following two methods:
109
116
  == Contributors
110
117
 
111
118
  Niklas E. Cathor (http://github.com/nilclass) added subdir & courierimapkeywords support
119
+ Ali Polatel (http://github.com/alip) for suggesting IO.copy_stream
112
120
 
113
121
  == Copyright
114
122
 
data/Rakefile CHANGED
@@ -7,25 +7,6 @@ end
7
7
 
8
8
  task :default => :test
9
9
 
10
- begin
11
- require 'jeweler'
12
- Jeweler::Tasks.new do |gemspec|
13
- gemspec.name = "maildir"
14
- gemspec.summary = "Read & write messages in the maildir format"
15
- gemspec.description = "A ruby library for reading and writing arbitrary messages in DJB's maildir format"
16
- gemspec.email = "aaron@ktheory.com"
17
- gemspec.homepage = "http://github.com/ktheory/maildir"
18
- gemspec.authors = ["Aaron Suggs", "Niklas E. Cathor"]
19
- gemspec.add_development_dependency "shoulda", ">= 0"
20
- gemspec.add_development_dependency "mail", ">= 0"
21
- gemspec.add_development_dependency "json", ">= 0"
22
- gemspec.add_development_dependency "ktheory-fakefs", ">= 0"
23
- end
24
- Jeweler::GemcutterTasks.new
25
- rescue LoadError
26
- puts "Jeweler not available. Install it with: sudo gem install jeweler"
27
- end
28
-
29
10
  desc "Run benchmarks"
30
11
  task :bench do
31
12
  load File.join(File.dirname(__FILE__), "benchmarks", "runner")
@@ -34,4 +15,4 @@ end
34
15
  desc "Remove trailing whitespace"
35
16
  task :whitespace do
36
17
  sh %{find . -name '*.rb' -exec sed -i '' 's/ *$//g' {} \\;}
37
- end
18
+ end
@@ -13,7 +13,23 @@ module Maildir::Serializer
13
13
  end
14
14
 
15
15
  # Writes data to path. Returns number of bytes written.
16
+ # If data acts like an IO object (i.e., data responds to the read method),
17
+ # we call data.read or the more efficient IO.copy_stream available in
18
+ # ruby 1.9.1.
16
19
  def dump(data, path)
20
+ if data.respond_to?(:read)
21
+ if IO.respond_to?(:copy_stream)
22
+ IO.copy_stream(data, path)
23
+ else
24
+ write(data.read, path)
25
+ end
26
+ else
27
+ write(data, path)
28
+ end
29
+ end
30
+
31
+ protected
32
+ def write(data, path)
17
33
  File.open(path, "w") {|file| file.write(data)}
18
34
  end
19
35
  end
@@ -1,13 +1,21 @@
1
- require 'json'
1
+ # Prefer yajl JSON library
2
+ begin
3
+ require 'yajl/json_gem'
4
+ rescue LoadError
5
+ require 'json'
6
+ end
7
+
2
8
  # Serialize messages as JSON
3
- class Maildir::Serializer::JSON < Maildir::Serializer::Base
4
- # Read data from path and parse it as JSON.
5
- def load(path)
6
- ::JSON.load(super(path))
7
- end
9
+ module Maildir::Serializer
10
+ class JSON < Base
11
+ # Read data from path and parse it as JSON.
12
+ def load(path)
13
+ ::JSON.load(super(path))
14
+ end
8
15
 
9
- # Dump data as JSON and writes it to path.
10
- def dump(data, path)
11
- super(data.to_json, path)
16
+ # Dump data as JSON and writes it to path.
17
+ def dump(data, path)
18
+ super(data.to_json, path)
19
+ end
12
20
  end
13
21
  end
@@ -45,19 +45,6 @@ class Maildir::UniqueName
45
45
  Socket.gethostname
46
46
  end
47
47
 
48
- def secure_random(bytes=8)
49
- # File.read("/dev/urandom", bytes).unpack("H*")[0]
50
- raise "Not implemented"
51
- end
52
-
53
- def inode
54
- raise "Not implemented"
55
- end
56
-
57
- def device_number
58
- raise "Not implemented"
59
- end
60
-
61
48
  def microsecond
62
49
  @now.usec.to_s
63
50
  end
@@ -0,0 +1,3 @@
1
+ class Maildir
2
+ VERSION = '1.0.0'
3
+ end
@@ -1,7 +1,12 @@
1
1
  require 'test_helper'
2
2
  class TestSerializers < Test::Unit::TestCase
3
3
 
4
+
4
5
  serializers = [
6
+ # Test the base serializer with a string
7
+ [Maildir::Serializer::Base, lambda {|data| data}],
8
+ # Test base serializer with IO object
9
+ [Maildir::Serializer::Base, lambda {|data| s = StringIO.new(data); s.rewind; s}],
5
10
  [Maildir::Serializer::Mail, lambda {|data| Mail.new(data).to_s}],
6
11
  [Maildir::Serializer::Marshal, lambda {|data| Marshal.dump(data)}],
7
12
  [Maildir::Serializer::JSON, lambda {|data| JSON.dump(data)}],
@@ -9,15 +14,20 @@ class TestSerializers < Test::Unit::TestCase
9
14
  ]
10
15
 
11
16
  serializers.each do |klass, dumper|
12
- context "A message serialized with #{klass}" do
17
+ # NB: dumper.object_id makes test names unique
18
+ context "A message serialized with #{klass} (#{dumper.object_id})" do
13
19
  setup do
14
20
  FakeFS::FileSystem.clear
15
21
  @data = case klass.new
16
22
  when Maildir::Serializer::Mail
17
23
  Mail.new
18
- else
24
+ when Maildir::Serializer::Marshal, Maildir::Serializer::JSON, Maildir::Serializer::YAML
19
25
  # Test a few common types
20
26
  [1, nil, {"foo" => true}]
27
+ when Maildir::Serializer::Base
28
+ "Hello World!"
29
+ else
30
+ raise "Unknown class #{klass.inspect}"
21
31
  end
22
32
 
23
33
  # Set the message serializer
@@ -30,7 +40,10 @@ class TestSerializers < Test::Unit::TestCase
30
40
  end
31
41
 
32
42
  should "have serialized data on disk" do
33
- assert_equal dumper.call(@data), File.read(@message.path)
43
+ expected_data = dumper.call(@data)
44
+ # Read the expected_data if @data is an IO object
45
+ expected_data = expected_data.read if expected_data.respond_to?(:read)
46
+ assert_equal expected_data, File.read(@message.path)
34
47
  end
35
48
  end
36
49
  end
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maildir
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ hash: 23
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
5
11
  platform: ruby
6
12
  authors:
7
13
  - Aaron Suggs
@@ -10,66 +16,88 @@ autorequire:
10
16
  bindir: bin
11
17
  cert_chain: []
12
18
 
13
- date: 2010-01-28 00:00:00 -05:00
19
+ date: 2010-12-19 00:00:00 -05:00
14
20
  default_executable:
15
21
  dependencies:
16
22
  - !ruby/object:Gem::Dependency
17
- name: shoulda
23
+ name: rake
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ hash: 3
31
+ segments:
32
+ - 0
33
+ version: "0"
18
34
  type: :development
19
- version_requirement:
20
- version_requirements: !ruby/object:Gem::Requirement
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: shoulda
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
21
41
  requirements:
22
42
  - - ">="
23
43
  - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
24
47
  version: "0"
25
- version:
48
+ type: :development
49
+ version_requirements: *id002
26
50
  - !ruby/object:Gem::Dependency
27
51
  name: mail
28
- type: :development
29
- version_requirement:
30
- version_requirements: !ruby/object:Gem::Requirement
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
31
55
  requirements:
32
56
  - - ">="
33
57
  - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
34
61
  version: "0"
35
- version:
62
+ type: :development
63
+ version_requirements: *id003
36
64
  - !ruby/object:Gem::Dependency
37
65
  name: json
38
- type: :development
39
- version_requirement:
40
- version_requirements: !ruby/object:Gem::Requirement
66
+ prerelease: false
67
+ requirement: &id004 !ruby/object:Gem::Requirement
68
+ none: false
41
69
  requirements:
42
70
  - - ">="
43
71
  - !ruby/object:Gem::Version
72
+ hash: 3
73
+ segments:
74
+ - 0
44
75
  version: "0"
45
- version:
76
+ type: :development
77
+ version_requirements: *id004
46
78
  - !ruby/object:Gem::Dependency
47
79
  name: ktheory-fakefs
48
- type: :development
49
- version_requirement:
50
- version_requirements: !ruby/object:Gem::Requirement
80
+ prerelease: false
81
+ requirement: &id005 !ruby/object:Gem::Requirement
82
+ none: false
51
83
  requirements:
52
84
  - - ">="
53
85
  - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
54
89
  version: "0"
55
- version:
90
+ type: :development
91
+ version_requirements: *id005
56
92
  description: A ruby library for reading and writing arbitrary messages in DJB's maildir format
57
93
  email: aaron@ktheory.com
58
94
  executables: []
59
95
 
60
96
  extensions: []
61
97
 
62
- extra_rdoc_files:
63
- - LICENSE
64
- - README.rdoc
98
+ extra_rdoc_files: []
99
+
65
100
  files:
66
- - .gitignore
67
- - LICENSE
68
- - README.rdoc
69
- - Rakefile
70
- - VERSION
71
- - benchmarks/runner
72
- - lib/maildir.rb
73
101
  - lib/maildir/keywords.rb
74
102
  - lib/maildir/message.rb
75
103
  - lib/maildir/serializer/base.rb
@@ -79,7 +107,11 @@ files:
79
107
  - lib/maildir/serializer/yaml.rb
80
108
  - lib/maildir/subdirs.rb
81
109
  - lib/maildir/unique_name.rb
82
- - maildir.gemspec
110
+ - lib/maildir/version.rb
111
+ - lib/maildir.rb
112
+ - LICENSE
113
+ - README.rdoc
114
+ - Rakefile
83
115
  - test/test_helper.rb
84
116
  - test/test_keywords.rb
85
117
  - test/test_maildir.rb
@@ -97,21 +129,29 @@ rdoc_options:
97
129
  require_paths:
98
130
  - lib
99
131
  required_ruby_version: !ruby/object:Gem::Requirement
132
+ none: false
100
133
  requirements:
101
134
  - - ">="
102
135
  - !ruby/object:Gem::Version
136
+ hash: 3
137
+ segments:
138
+ - 0
103
139
  version: "0"
104
- version:
105
140
  required_rubygems_version: !ruby/object:Gem::Requirement
141
+ none: false
106
142
  requirements:
107
143
  - - ">="
108
144
  - !ruby/object:Gem::Version
109
- version: "0"
110
- version:
145
+ hash: 17
146
+ segments:
147
+ - 1
148
+ - 3
149
+ - 5
150
+ version: 1.3.5
111
151
  requirements: []
112
152
 
113
153
  rubyforge_project:
114
- rubygems_version: 1.3.5
154
+ rubygems_version: 1.3.7
115
155
  signing_key:
116
156
  specification_version: 3
117
157
  summary: Read & write messages in the maildir format
data/.gitignore DELETED
@@ -1,3 +0,0 @@
1
- pkg/*
2
- benchmarks/scratch.rb
3
- .DS_Store
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.6.0
@@ -1,30 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
- require 'maildir'
4
- require 'benchmark'
5
-
6
- maildir_path = ENV['MAILDIR'] || "./tmp"
7
- maildir = Maildir.new(maildir_path)
8
-
9
- n = 300
10
- message = "Write #{n} messages:"
11
- tms = Benchmark.bmbm(message.size) do |x|
12
- x.report(message) { n.times { maildir.add("") } }
13
- end
14
-
15
- puts "#{n/tms.first.real} messages per second"
16
-
17
-
18
- message = "List new:"
19
- tms = Benchmark.bm(message.size) do |x|
20
- x.report(message) { n.times { maildir.list_keys(:new)} }
21
- end
22
-
23
- # require 'ruby-prof'
24
- # result = RubyProf.profile do
25
- # n.times { maildir.list_keys(:new) }
26
- # end
27
- #
28
- # # Print a graph profile to text
29
- # printer = RubyProf::GraphPrinter.new(result)
30
- # printer.print(STDOUT, 0)
@@ -1,82 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{maildir}
8
- s.version = "0.6.0"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Aaron Suggs", "Niklas E. Cathor"]
12
- s.date = %q{2010-01-28}
13
- s.description = %q{A ruby library for reading and writing arbitrary messages in DJB's maildir format}
14
- s.email = %q{aaron@ktheory.com}
15
- s.extra_rdoc_files = [
16
- "LICENSE",
17
- "README.rdoc"
18
- ]
19
- s.files = [
20
- ".gitignore",
21
- "LICENSE",
22
- "README.rdoc",
23
- "Rakefile",
24
- "VERSION",
25
- "benchmarks/runner",
26
- "lib/maildir.rb",
27
- "lib/maildir/keywords.rb",
28
- "lib/maildir/message.rb",
29
- "lib/maildir/serializer/base.rb",
30
- "lib/maildir/serializer/json.rb",
31
- "lib/maildir/serializer/mail.rb",
32
- "lib/maildir/serializer/marshal.rb",
33
- "lib/maildir/serializer/yaml.rb",
34
- "lib/maildir/subdirs.rb",
35
- "lib/maildir/unique_name.rb",
36
- "maildir.gemspec",
37
- "test/test_helper.rb",
38
- "test/test_keywords.rb",
39
- "test/test_maildir.rb",
40
- "test/test_message.rb",
41
- "test/test_serializers.rb",
42
- "test/test_subdirs.rb",
43
- "test/test_unique_name.rb"
44
- ]
45
- s.homepage = %q{http://github.com/ktheory/maildir}
46
- s.rdoc_options = ["--charset=UTF-8"]
47
- s.require_paths = ["lib"]
48
- s.rubygems_version = %q{1.3.5}
49
- s.summary = %q{Read & write messages in the maildir format}
50
- s.test_files = [
51
- "test/test_helper.rb",
52
- "test/test_keywords.rb",
53
- "test/test_maildir.rb",
54
- "test/test_message.rb",
55
- "test/test_serializers.rb",
56
- "test/test_subdirs.rb",
57
- "test/test_unique_name.rb"
58
- ]
59
-
60
- if s.respond_to? :specification_version then
61
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
62
- s.specification_version = 3
63
-
64
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
65
- s.add_development_dependency(%q<shoulda>, [">= 0"])
66
- s.add_development_dependency(%q<mail>, [">= 0"])
67
- s.add_development_dependency(%q<json>, [">= 0"])
68
- s.add_development_dependency(%q<ktheory-fakefs>, [">= 0"])
69
- else
70
- s.add_dependency(%q<shoulda>, [">= 0"])
71
- s.add_dependency(%q<mail>, [">= 0"])
72
- s.add_dependency(%q<json>, [">= 0"])
73
- s.add_dependency(%q<ktheory-fakefs>, [">= 0"])
74
- end
75
- else
76
- s.add_dependency(%q<shoulda>, [">= 0"])
77
- s.add_dependency(%q<mail>, [">= 0"])
78
- s.add_dependency(%q<json>, [">= 0"])
79
- s.add_dependency(%q<ktheory-fakefs>, [">= 0"])
80
- end
81
- end
82
-