sortah 0.5.2 → 0.6.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.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ ##11/04/11
2
+
3
+ ### IMPROVEMENTS
4
+
5
+ - if you specify "type :maildir" in the sortah rc file, then sortah will
6
+ automatically scaffold your destinations into maildir directories (eg, it'll
7
+ `mkdir -p #{maildir}/#{dest}/{cur,new,tmp}` your destinations), and it will
8
+ automatically write any new mail into the `/new` subdirectory of your
9
+ destination.
10
+
11
+ - Rather than dumping error-causing emails into the vast oblivion, sortah now
12
+ puts them in the directory specified by the `#error_dest` method
13
+
14
+ ### ADDITIONS
15
+
16
+ - added `#error_dest` to the main sortah file
17
+
1
18
  ##11/02/11
2
19
 
3
20
  ### BUG FIXES
data/bin/sortah CHANGED
@@ -18,13 +18,38 @@ email = Mail.new(ARGF.read)
18
18
  puts "Loading sortah rc" if opts[:verbose]
19
19
  load File.expand_path(opts[:rc])
20
20
 
21
- dest = sortah.sort(email).full_destination
21
+ if sortah.type == :maildir
22
+ puts "detected maildir format, building maildir directories." if opts[:verbose]
23
+ maildir = sortah.maildir
24
+ puts "creating: #{maildir}/#{dest}/{tmp,cur,new}" if opts[:verbose]
25
+ unless opts[:"dry-run"]
26
+ sortah.destinations.values.each do |dest|
27
+ puts dest
28
+
29
+ system "mkdir -p #{maildir}/#{dest}/tmp"
30
+ system "mkdir -p #{maildir}/#{dest}/cur"
31
+ system "mkdir -p #{maildir}/#{dest}/new"
32
+ end
33
+ end
34
+ end
35
+
36
+
37
+ begin
38
+ dest = sortah.sort(email).full_destination
39
+ rescue
40
+ STDERR.puts "DELIVERY ERROR: #{$!.message}"
41
+ dest = sortah.full_error_destination
42
+ end
22
43
  puts "writing email to: #{dest}" if opts[:"dry-run"] || opts[:verbose]
23
44
 
45
+ if sortah.type == :maildir
46
+ puts "adjusting destination to maildir style" if opts[:verbose]
47
+ dest = dest + "new"
48
+ end
49
+
24
50
  exit 0 if opts[:"dry-run"]
25
51
 
26
52
  #no need to check for dry-run here, we would have exited otherwise
27
- system "mkdir -p #{dest}"
28
53
  File.open("#{dest}/#{Digest::SHA1.hexdigest(email.to_s)}.eml", 'w') do |f|
29
54
  f << email.to_s
30
55
  end
@@ -12,7 +12,7 @@ module Sortah
12
12
  self
13
13
  end
14
14
 
15
- attr_reader :destinations, :lenses, :routers, :maildir
15
+ attr_reader :destinations, :lenses, :routers, :maildir, :error_dest, :type
16
16
 
17
17
  def metadata(key)
18
18
  @result.metadata(key)
@@ -26,6 +26,10 @@ module Sortah
26
26
  maildir + destination.to_s
27
27
  end
28
28
 
29
+ def full_error_destination
30
+ maildir + error_dest.to_s
31
+ end
32
+
29
33
  private
30
34
 
31
35
  def clear_state!
@@ -40,7 +44,9 @@ module Sortah
40
44
  @destinations = context.destinations
41
45
  @lenses = context.lenses
42
46
  @routers = context.routers
47
+ @error_dest = context.error_dest
43
48
  @maildir = context.maildir
49
+ @type = context.type
44
50
  end
45
51
  end
46
52
  end
data/lib/sortah/parser.rb CHANGED
@@ -41,6 +41,18 @@ module Sortah
41
41
  @maildir
42
42
  end
43
43
 
44
+ #double-duty getter/setter
45
+ def error_dest(dest = nil)
46
+ @error_dest = dest if dest
47
+ @error_dest
48
+ end
49
+
50
+ #double-duty getter/setter
51
+ def type(type = nil)
52
+ @type = type if type
53
+ @type
54
+ end
55
+
44
56
  ## language elements
45
57
  def destination(name, args)
46
58
  @destinations << Destination.new(name, args)
@@ -1,3 +1,3 @@
1
1
  module Sortah
2
- VERSION = "0.5.2"
2
+ VERSION = "0.6.0"
3
3
  end
data/spec/bin_spec.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  def run_with(arg, email = "")
2
2
  #uses the sortah defn in spec/fixtures/rc
3
3
  cmd =<<-CMD
4
- bundle exec bin/sortah #{arg} --rc "spec/fixtures/rc" <<-EMAIL
4
+ bundle exec bin/sortah #{arg} --rc "spec/fixtures/rc" 2>/dev/null <<-EMAIL
5
5
  #{email}
6
6
  EMAIL
7
7
  CMD
@@ -29,6 +29,19 @@ describe "the sortah executable" do
29
29
  NOPE. CHUCK TESTA
30
30
  TXT
31
31
  end
32
+
33
+ @failing_email = Mail.new do
34
+ to 'fail@example.com'
35
+ from 'fail@nope.com'
36
+ subject "Taximerdizin'"
37
+ body <<-TXT
38
+ OJAI VALLEY TAXIDERMY
39
+
40
+ BET YOU THOUGHT THIS EMAIL WAS REAL
41
+
42
+ NOPE. CHUCK TESTA
43
+ TXT
44
+ end
32
45
  end
33
46
 
34
47
  before :each do
@@ -48,7 +61,18 @@ describe "the sortah executable" do
48
61
  end
49
62
 
50
63
  it "should print to STDOUT the location it intends to write the file" do
51
- run_with('--dry-run', @email.to_s)[:result].should =~ %r|writing email to: /tmp/\.mail/foo/|
64
+ run_with('--dry-run', @email.to_s)[:result].
65
+ should =~ %r|writing email to: /tmp/\.mail/foo/|
66
+ end
67
+
68
+ it "should write to the destination specified by #error_dest when an exception is raised during sorting" do
69
+ run_with('--dry-run', @failing_email.to_s)[:result].
70
+ should =~ %r|writing email to: /tmp/\.mail/errors/|
71
+ end
72
+
73
+ it "should try to create maildir directories if the maildir type is maildir" do
74
+ run_with('--dry-run --verbose', @failing_email.to_s)[:result].
75
+ should =~ %r|detected maildir format, building maildir directories.|
52
76
  end
53
77
  end
54
78
  end
data/spec/fixtures/rc CHANGED
@@ -1,8 +1,11 @@
1
1
  sortah do
2
2
  maildir '/tmp/.mail/'
3
+ error_dest 'errors/'
4
+ type :maildir
3
5
  destination :foo, 'foo/'
4
6
 
5
7
  router do
8
+ raise RuntimeException if email.from && email.from.any? { |e| e =~ /fail/ }
6
9
  send_to :foo
7
10
  end
8
11
  end
data/spec/parser_spec.rb CHANGED
@@ -15,7 +15,6 @@ describe Sortah::Parser do
15
15
  sortah.should_not be_nil
16
16
  end
17
17
 
18
-
19
18
  it "should parse defined 'simple' destinations" do
20
19
  expect {
21
20
  sortah do
@@ -198,6 +197,35 @@ describe Sortah::Parser do
198
197
  end
199
198
 
200
199
  context "when dealing in general with sortah, " do
200
+ it "should parse a 'type' clause" do
201
+ expect {
202
+ sortah do
203
+ type :maildir
204
+ end
205
+ }.should_not raise_error
206
+ end
207
+
208
+ it "should provide an inspection method to determine the maildir type" do
209
+ sortah do
210
+ type :maildir
211
+ end
212
+ sortah.type.should == :maildir
213
+ end
214
+
215
+ it "should parse an 'error_dest' clause" do
216
+ expect {
217
+ sortah do
218
+ error_dest 'errors/'
219
+ end
220
+ }.should_not raise_error
221
+ end
222
+
223
+ it "error_dest should provide access via a #error_dest method" do
224
+ sortah do
225
+ error_dest 'errors/'
226
+ end
227
+ sortah.error_dest.should == "errors/"
228
+ end
201
229
 
202
230
  it "should maintain one state across multiple sortah blocks" do
203
231
  expect {
@@ -2,20 +2,17 @@ require 'spec_helper'
2
2
 
3
3
  describe Sortah::Handler do
4
4
  context "when building the handler" do
5
- before :all do
6
- end
7
-
8
5
  it "should ask for the parsed content" do
9
6
  context = mock(:context)
10
7
  context.should_receive(:destinations).and_return(instance_of(Sortah::Destinations))
11
8
  context.should_receive(:lenses).and_return(instance_of(Sortah::Lenses))
12
9
  context.should_receive(:routers).and_return(instance_of(Sortah::Routers))
13
10
  context.should_receive(:maildir).and_return(instance_of(String))
11
+ context.should_receive(:error_dest).and_return(instance_of(String))
12
+ context.should_receive(:type).and_return(instance_of(Symbol))
14
13
 
15
14
  Sortah::Handler.build_from(context)
16
15
  end
17
16
  end
18
-
19
-
20
17
  end
21
18
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sortah
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.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-11-03 00:00:00.000000000Z
12
+ date: 2011-11-07 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mail
16
- requirement: &2161518260 !ruby/object:Gem::Requirement
16
+ requirement: &2161248620 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2161518260
24
+ version_requirements: *2161248620
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: trollop
27
- requirement: &2161517580 !ruby/object:Gem::Requirement
27
+ requirement: &2161247740 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2161517580
35
+ version_requirements: *2161247740
36
36
  description: ! "\n Sortah provides a simple, declarative internal DSL for sorting
37
37
  \n your email. It provides an executable which may serve as an external\n mail
38
38
  delivery agent for such programs as `getmail`. Finally, since\n your sorting