uron 1.0.0 → 1.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0591180df0f68252415b03b5a89b7d05126f8916
4
- data.tar.gz: c71803232c8244075cdad60c3b888ff06bbd1ad6
3
+ metadata.gz: 7c3fd3a3d7da61594f5acf17e0543a8b022cdb28
4
+ data.tar.gz: f311b5bf137a009b20917816698a3fd2b645cd22
5
5
  SHA512:
6
- metadata.gz: 443387254be0ecaf8dca82886036822369b5c266b9ea642bdb3098cafc32b3afaf33db3f2878a7cddee814eb339816c98e24ab81039d5112ea9ac6b2444bdcf2
7
- data.tar.gz: 1ce8c88b1106bf918c36e2050dddd20195f94054111f50783d9ba42a5db791032143e86b606ea92a6c4e8cfd6cd5047c756001adb0c11deb0df2683a7d37f5a7
6
+ metadata.gz: 656a133a04b2eb9b333034e581ff4ebfb7a9347fd28ba724527faf750c619c23cecc384c58ea3ab449c919549bc7e84b5caf7da79af0df4d1822931b76139434
7
+ data.tar.gz: 300f29edaa9d2a25c9901e9002ac197eb374ca2992b37e1e69152c1714997df40ceea339b5cbcb15086c421ea0f18efe96af60b4f3b755875f70f227a565ad20
@@ -1,6 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1.1
3
+ - 2.3.1
4
+ - 2.2.5
5
+ - 2.1.10
4
6
  - 2.0.0
5
7
  - 1.9.3
6
8
  - 1.8.7
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  [![Build Status](https://img.shields.io/travis/unak/uron.svg)](https://travis-ci.org/unak/uron)
2
-
2
+ [![Version ](https://img.shields.io/gem/v/uron.svg)](https://rubygems.org/gems/uron)
3
3
  uron
4
4
  ====
5
5
 
@@ -72,6 +72,7 @@ If a block is passed, call the block.
72
72
  Examples:
73
73
 
74
74
  header :subject => /\A[mailing-list:/, :delivery => "mailing-list"
75
+
75
76
  This means that if the subject of the mail starts with `[mailing-list:`,
76
77
  delivery the mail to `mailing-list` directory (it's relative from your
77
78
  Maildir.)
@@ -79,8 +80,18 @@ Maildir.)
79
80
  header :subject => /\A[mailing-list:/ do
80
81
  delivery "mailing-list"
81
82
  end
83
+
82
84
  Same as above.
83
85
 
86
+ If you want to check multiple headers, simple put them as:
87
+
88
+ header :subject => /\A[mailing-list:/,
89
+ :from => /\Amailing-list-owner\b/,
90
+ :delivery => "mailing-list"
91
+
92
+ When `subject` and `from` are both matched, the mail will be delivered to `mailling-list` directory.
93
+
94
+
84
95
  ### Delivery Commands
85
96
 
86
97
  #### `delivery`
@@ -126,7 +137,7 @@ Takes one String parameter and outout it to the log file.
126
137
  License
127
138
  -------
128
139
 
129
- Copyright (c) 2012 NAKAMURA Usaku usa@garbagecollect.jp
140
+ Copyright (c) 2012,2014 NAKAMURA Usaku usa@garbagecollect.jp
130
141
 
131
142
  Redistribution and use in source and binary forms, with or without
132
143
  modification, are permitted provided that the following conditions are met:
@@ -34,6 +34,8 @@ require "socket"
34
34
  #= uron - a mail delivery agent
35
35
  #
36
36
  class Uron
37
+ VERSION = "1.2.0"
38
+
37
39
  ConfigError = Class.new(RuntimeError)
38
40
 
39
41
  # execute uron
@@ -59,7 +61,7 @@ class Uron
59
61
  # _rc_ is a String of the configuration file.
60
62
  # _io_ is a IO of the mail.
61
63
  def initialize(rc)
62
- self.class.class_eval do
64
+ self.class.class_exec do
63
65
  remove_const :Maildir if defined?(Maildir)
64
66
  remove_const :Log if defined?(Log)
65
67
  end
@@ -84,19 +86,38 @@ class Uron
84
86
  logging " Subject: #{@mail.headers[:subject].first[0, 69]}" if @mail.headers.include?(:subject)
85
87
 
86
88
  catch(:tag) do
87
- @ruleset.each do |sym, conds, block|
88
- if @mail.headers[sym]
89
- conds = [conds] unless conds.is_a?(Array)
90
- conds.each do |cond|
91
- @mail.headers[sym].each do |header|
92
- begin
93
- block.call(@mail) && throw(:tag) if cond =~ header
94
- rescue
95
- logging $!
96
- raise $!
89
+ @ruleset.each do |args, block|
90
+ matched = false
91
+ args.each_pair do |sym, conds|
92
+ unless @mail.headers[sym]
93
+ matched = false
94
+ break
95
+ end
96
+
97
+ conds = Array(conds)
98
+ found = false
99
+ @mail.headers[sym].each do |header|
100
+ conds.each do |cond|
101
+ if cond =~ header
102
+ found = true
103
+ break
97
104
  end
98
105
  end
99
106
  end
107
+
108
+ if found
109
+ matched = true
110
+ else
111
+ matched = false
112
+ break
113
+ end
114
+ end
115
+
116
+ begin
117
+ block.call(@mail) && throw(:tag) if matched
118
+ rescue
119
+ logging $!
120
+ raise $!
100
121
  end
101
122
  end
102
123
 
@@ -141,7 +162,7 @@ class Uron
141
162
  block = proc{ delivery deliv } if deliv
142
163
  block = proc{ transfer *trans } if trans
143
164
  block = proc{ invoke(*invok) == 0 } if invok
144
- @ruleset.push([h.keys.first, h.values.flatten(1), block])
165
+ @ruleset.push([h, block])
145
166
  end
146
167
 
147
168
  # deliver the mail to a directory
@@ -177,6 +177,32 @@ header :to => /\\Ausa3@/, :invoke => ["#{ruby}", "-e", "exit /^To:.*usa3@/ =~ AR
177
177
  assert_match /\AFrom [^\n]+\r?\n\z/, File.read(@logfile)
178
178
  end
179
179
  tmprc.unlink
180
+ File.unlink(@logfile) if File.exist?(@logfile)
181
+
182
+ tmprc = make_rc <<-END_OF_RC
183
+ Log = "#{@logfile}"
184
+ header :from => /\\Ausa\\b/, :to => /\\Ausa\\b/ do
185
+ delivery ".mine"
186
+ end
187
+ header :from => /\\Ausa\\b/ do
188
+ delivery ".others"
189
+ end
190
+ END_OF_RC
191
+ assert_nothing_raised do
192
+ io = StringIO.new("From: usa@example.com\r\nTo: usa@example.com\r\n\r\n")
193
+ assert_equal 0, Uron.run(tmprc.path, io)
194
+ mail = Dir.glob(File.join(@maildir, "new", "*")).find{|e| /\A[^\.]/ =~ e}
195
+ assert_nil mail
196
+ assert_match /\AFrom [^\n]+\r?\n\s+Folder: .mine/, File.read(@logfile)
197
+ File.unlink(@logfile) if File.exist?(@logfile)
198
+
199
+ io = StringIO.new("From: usa@example.com\r\nTo: hoge@example.com\r\n\r\n")
200
+ assert_equal 0, Uron.run(tmprc.path, io)
201
+ mail = Dir.glob(File.join(@maildir, "new", "*")).find{|e| /\A[^\.]/ =~ e}
202
+ assert_nil mail
203
+ assert_match /\AFrom [^\n]+\r?\n\s+Folder: .others/, File.read(@logfile)
204
+ end
205
+ tmprc.unlink
180
206
  end
181
207
 
182
208
  def test_delivery
@@ -1,8 +1,10 @@
1
1
  # coding: utf-8
2
2
  # -*- Ruby -*-
3
+ require File.expand_path("bin/uron")
4
+
3
5
  Gem::Specification.new do |spec|
4
6
  spec.name = "uron"
5
- spec.version = "1.0.0"
7
+ spec.version = Uron::VERSION
6
8
  spec.authors = ["U.Nakamura"]
7
9
  spec.email = ["usa@garbagecollect.jp"]
8
10
  spec.description = %q{uron is a mail delivery agent}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uron
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - U.Nakamura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-17 00:00:00.000000000 Z
11
+ date: 2016-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -89,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
89
  version: '0'
90
90
  requirements: []
91
91
  rubyforge_project:
92
- rubygems_version: 2.2.2
92
+ rubygems_version: 2.4.5.1
93
93
  signing_key:
94
94
  specification_version: 4
95
95
  summary: uron is a mail delivery agent