remailer 0.5.2 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 709e0bf509c227f3e6b529520bc82af7a02c9a43
4
+ data.tar.gz: d2e193e4690ae8d71004c1e0c4fdda782e5d786c
5
+ SHA512:
6
+ metadata.gz: 2ec11c9db71e13589670c3841824ccba7b47c27d2e1ee464885313a0364bd40fd4ad575b06d36ce0710b866caa18287b2858ada691ede63dc18dcc840e4b8030
7
+ data.tar.gz: f8a2688508db19e4c5804edfc11633db29ae9d4c21ec3ab0b1e7379aee1a64bf58abc1edf8290715f401e221697b974e0f0504d9adb569c7175e8e2a36f4615b
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ before_install: gem install bundler
3
+ rvm:
4
+ - 1.9.3-p551
5
+ - 2.0.0-p598
6
+ - 2.1.5
7
+ - 2.2.0
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org/'
2
+
3
+ gem 'eventmachine'
4
+
5
+ group :development do
6
+ gem 'minitest'
7
+ gem 'jeweler'
8
+ end
@@ -1,8 +1,8 @@
1
- = remailer
1
+ # remailer
2
2
 
3
3
  Client/Server Mail Networking Library for SMTP and IMAP
4
4
 
5
- == Overview
5
+ ## Overview
6
6
 
7
7
  This is an EventMachine Connection implementation of a high-performance
8
8
  asynchronous SMTP client. Although EventMachine ships with a built-in SMTP
@@ -10,7 +10,7 @@ client, that version is limited to sending a single email per client,
10
10
  and since establishing a client can be the majority of the time required
11
11
  to send email, this limits throughput considerably.
12
12
 
13
- == Use
13
+ ## Use
14
14
 
15
15
  The Remailer system consists of the Remailer::Connection class which works
16
16
  within the EventMachine environment. To use it, create a client and then
@@ -21,7 +21,7 @@ make one or more requests to send email messages.
21
21
  # messages to STDERR.
22
22
  client = Remailer::SMTP::Client.open(
23
23
  'smtp.google.com',
24
- :debug => STDERR
24
+ debug: STDERR
25
25
  )
26
26
 
27
27
  # Send a single email message through the client at the earliest
@@ -51,7 +51,7 @@ example is given here where the information is simply dumped on STDOUT:
51
51
 
52
52
  client = Remailer::SMTP::Client.open(
53
53
  'smtp.google.com',
54
- :debug => lambda { |type, message|
54
+ debug: lambda { |type, message|
55
55
  puts "#{type}> #{message.inspect}"
56
56
  }
57
57
  )
@@ -90,18 +90,18 @@ server. Success is defined as 250, errors vary:
90
90
 
91
91
  A status code of nil is sent if the server timed out or the connection failed.
92
92
 
93
- == Tests
93
+ ## Tests
94
94
 
95
95
  In order to run tests, copy `test/config.example.rb` to `test/config.rb` and
96
96
  adjust as required. For obvious reasons, passwords to SMTP test accounts are
97
97
  not included in the source code of this library.
98
98
 
99
- == Status
99
+ ## Status
100
100
 
101
101
  This software is currently experimental and is not recommended for production
102
102
  use. Many of the internals may change significantly before a proper beta
103
103
  release is made.
104
104
 
105
- == Copyright
105
+ ## Copyright
106
106
 
107
- Copyright (c) 2010-2012 Scott Tadman, The Working Group
107
+ Copyright (c) 2010-2015 Scott Tadman, The Working Group
data/Rakefile CHANGED
@@ -1,8 +1,13 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
 
4
+ require 'bundler/setup'
5
+
6
+ Bundler.require
7
+
4
8
  begin
5
9
  require 'jeweler'
10
+
6
11
  Jeweler::Tasks.new do |gem|
7
12
  gem.name = "remailer"
8
13
  gem.summary = %Q{Reactor-Ready SMTP Mailer}
@@ -10,20 +15,20 @@ begin
10
15
  gem.email = "scott@twg.ca"
11
16
  gem.homepage = "http://github.com/twg/remailer"
12
17
  gem.authors = [ "Scott Tadman" ]
13
- gem.add_runtime_dependency 'eventmachine'
14
18
  end
19
+
15
20
  Jeweler::GemcutterTasks.new
21
+
16
22
  rescue LoadError
17
23
  puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
18
24
  end
19
25
 
20
26
  require 'rake/testtask'
27
+
21
28
  Rake::TestTask.new(:test) do |test|
22
29
  test.libs << 'lib' << 'test'
23
30
  test.pattern = 'test/**/*_test.rb'
24
31
  test.verbose = true
25
32
  end
26
33
 
27
- task :test => :check_dependencies
28
-
29
34
  task :default => :test
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.2
1
+ 0.6.0
@@ -245,6 +245,8 @@ class Remailer::AbstractConnection < EventMachine::Connection
245
245
 
246
246
  rescue Object => e
247
247
  STDERR.puts("[#{e.class}] #{e}")
248
+
249
+ raise e
248
250
  end
249
251
 
250
252
  def post_init
@@ -399,11 +401,6 @@ class Remailer::AbstractConnection < EventMachine::Connection
399
401
 
400
402
  reset_timeout!
401
403
  end
402
-
403
- # Switches to use the SOCKS5 interpreter for all subsequent communication
404
- def use_socks5_interpreter!
405
- @interpreter = Remailer::SOCKS5::Client::Interpreter.new(:delegate => self)
406
- end
407
404
 
408
405
  # -- Callbacks and Notifications ------------------------------------------
409
406
 
@@ -192,7 +192,7 @@ class Remailer::IMAP::Client < Remailer::AbstractConnection
192
192
  protected
193
193
  # Switches to use the IMAP interpreter for all subsequent communication
194
194
  def use_imap_interpreter!
195
- @interpreter = Interpreter.new(:delegate => self)
195
+ @interpreter = Interpreter.new(delegate: self)
196
196
  end
197
197
 
198
198
  def next_tag
@@ -212,8 +212,8 @@ class Remailer::Interpreter
212
212
  yield(parsed) if (block_given?)
213
213
 
214
214
  interpret(*parsed)
215
-
216
- break if (s.empty?)
215
+
216
+ break if (s.empty? or self.finished?)
217
217
  end
218
218
  end
219
219
 
@@ -290,6 +290,12 @@ class Remailer::Interpreter
290
290
  def will_interpret?(proc, args)
291
291
  true
292
292
  end
293
+
294
+ # Should return true if this interpreter no longer wants any data, false
295
+ # otherwise. Subclasses should implement their own behavior here.
296
+ def finished?
297
+ false
298
+ end
293
299
 
294
300
  # Returns true if an error has been generated, false otherwise. The error
295
301
  # content can be retrived by calling error.
@@ -69,6 +69,11 @@ class Remailer::SMTP::Client < Remailer::AbstractConnection
69
69
  end
70
70
  end
71
71
 
72
+ # Switches to use the SOCKS5 interpreter for all subsequent communication
73
+ def use_socks5_interpreter!
74
+ @interpreter = Remailer::SOCKS5::Client::Interpreter.new(delegate: self)
75
+ end
76
+
72
77
  # Closes the connection after all of the queued messages have been sent.
73
78
  def close_when_complete!
74
79
  @options[:close] = true
@@ -83,10 +88,10 @@ class Remailer::SMTP::Client < Remailer::AbstractConnection
83
88
  end
84
89
 
85
90
  message = {
86
- :from => from,
87
- :to => to,
88
- :data => data,
89
- :callback => block
91
+ from: from,
92
+ to: to,
93
+ data: data,
94
+ callback: block
90
95
  }
91
96
 
92
97
  @messages << message
@@ -108,10 +113,10 @@ class Remailer::SMTP::Client < Remailer::AbstractConnection
108
113
  end
109
114
 
110
115
  message = {
111
- :from => from,
112
- :to => to,
113
- :test => true,
114
- :callback => block
116
+ from: from,
117
+ to: to,
118
+ test: true,
119
+ callback: block
115
120
  }
116
121
 
117
122
  @messages << message
@@ -146,23 +151,6 @@ class Remailer::SMTP::Client < Remailer::AbstractConnection
146
151
  def unbound?
147
152
  !!@unbound
148
153
  end
149
-
150
- # This implements the EventMachine::Connection#receive_data method that
151
- # is called each time new data is received from the socket.
152
- def receive_data(data)
153
- reset_timeout!
154
-
155
- @buffer ||= ''
156
- @buffer << data
157
-
158
- if (interpreter = @interpreter)
159
- interpreter.process(@buffer) do |reply|
160
- debug_notification(:receive, "[#{interpreter.label}] #{reply.inspect}")
161
- end
162
- else
163
- error_notification(:out_of_band, "Receiving data before a protocol has been established.")
164
- end
165
- end
166
154
 
167
155
  # Returns the current state of the active interpreter, or nil if no state
168
156
  # is assigned.
@@ -227,7 +215,7 @@ class Remailer::SMTP::Client < Remailer::AbstractConnection
227
215
 
228
216
  # Switches to use the SMTP interpreter for all subsequent communication
229
217
  def use_smtp_interpreter!
230
- @interpreter = Interpreter.new(:delegate => self)
218
+ @interpreter = Interpreter.new(delegate: self)
231
219
  end
232
220
 
233
221
  # Callback receiver for when the proxy connection has been completed.
@@ -69,7 +69,7 @@ class Remailer::SMTP::Server < EventMachine::Protocols::LineAndTextProtocol
69
69
  def post_init
70
70
  super
71
71
 
72
- @interpreter = Interpreter.new(:delegate => self)
72
+ @interpreter = Interpreter.new(delegate: self)
73
73
 
74
74
  if (@on_connect)
75
75
  @on_connect.call(@remote_ip)
@@ -103,8 +103,8 @@ class Remailer::SMTP::Server::Interpreter < Remailer::Interpreter
103
103
  elsif (delegate.tls?)
104
104
  delegate.send_line("220 TLS ready to start")
105
105
  delegate.start_tls(
106
- :private_key_file => Remailer::SMTP::Server.private_key_path,
107
- :cert_chain_file => Remailer::SMTP::Server.ssl_cert_path
106
+ private_key_file: Remailer::SMTP::Server.private_key_path,
107
+ cert_chain_file: Remailer::SMTP::Server.ssl_cert_path
108
108
  )
109
109
 
110
110
  @tls_started = true
@@ -5,14 +5,14 @@ class Remailer::SOCKS5::Client::Interpreter < Remailer::Interpreter
5
5
  SOCKS5_VERSION = 5
6
6
 
7
7
  SOCKS5_METHOD = {
8
- :no_auth => 0,
9
- :gssapi => 1,
10
- :username_password => 2
8
+ no_auth: 0,
9
+ gssapi: 1,
10
+ username_password: 2
11
11
  }.freeze
12
12
 
13
13
  SOCKS5_COMMAND = {
14
- :connect => 1,
15
- :bind => 2
14
+ connect: 1,
15
+ bind: 2
16
16
  }.freeze
17
17
 
18
18
  SOCKS5_REPLY = {
@@ -28,9 +28,9 @@ class Remailer::SOCKS5::Client::Interpreter < Remailer::Interpreter
28
28
  }.freeze
29
29
 
30
30
  SOCKS5_ADDRESS_TYPE = {
31
- :ipv4 => 1,
32
- :domainname => 3,
33
- :ipv6 => 4
31
+ ipv4: 1,
32
+ domainname: 3,
33
+ ipv6: 4
34
34
  }.freeze
35
35
 
36
36
  # == State Mapping ========================================================
@@ -114,9 +114,9 @@ class Remailer::SOCKS5::Client::Interpreter < Remailer::Interpreter
114
114
  [
115
115
  reply,
116
116
  {
117
- :address => address,
118
- :port => port,
119
- :address_type => address_type
117
+ address: address,
118
+ port: port,
119
+ address_type: address_type
120
120
  }
121
121
  ]
122
122
  end
@@ -128,6 +128,7 @@ class Remailer::SOCKS5::Client::Interpreter < Remailer::Interpreter
128
128
 
129
129
  default do |reply|
130
130
  @reply = reply
131
+
131
132
  enter_state(:failed)
132
133
  end
133
134
  end
@@ -189,4 +190,8 @@ class Remailer::SOCKS5::Client::Interpreter < Remailer::Interpreter
189
190
  def label
190
191
  'SOCKS5'
191
192
  end
193
+
194
+ def finished?
195
+ self.state == :connected
196
+ end
192
197
  end
@@ -2,22 +2,26 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
+ # stub: remailer 0.6.0 ruby lib
5
6
 
6
7
  Gem::Specification.new do |s|
7
8
  s.name = "remailer"
8
- s.version = "0.5.2"
9
+ s.version = "0.6.0"
9
10
 
10
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib"]
11
13
  s.authors = ["Scott Tadman"]
12
- s.date = "2012-11-30"
14
+ s.date = "2015-01-22"
13
15
  s.description = "EventMachine SMTP Mail User Agent"
14
16
  s.email = "scott@twg.ca"
15
17
  s.extra_rdoc_files = [
16
- "README.rdoc"
18
+ "README.md"
17
19
  ]
18
20
  s.files = [
19
21
  ".document",
20
- "README.rdoc",
22
+ ".travis.yml",
23
+ "Gemfile",
24
+ "README.md",
21
25
  "Rakefile",
22
26
  "VERSION",
23
27
  "lib/remailer.rb",
@@ -42,6 +46,7 @@ Gem::Specification.new do |s|
42
46
  "lib/remailer/socks5/client/interpreter.rb",
43
47
  "lib/remailer/support.rb",
44
48
  "remailer.gemspec",
49
+ "test/bin/exercise",
45
50
  "test/config.example.rb",
46
51
  "test/helper.rb",
47
52
  "test/unit/remailer_imap_client_interpreter_test.rb",
@@ -55,20 +60,25 @@ Gem::Specification.new do |s|
55
60
  "test/unit/remailer_test.rb"
56
61
  ]
57
62
  s.homepage = "http://github.com/twg/remailer"
58
- s.require_paths = ["lib"]
59
- s.rubygems_version = "1.8.24"
63
+ s.rubygems_version = "2.2.2"
60
64
  s.summary = "Reactor-Ready SMTP Mailer"
61
65
 
62
66
  if s.respond_to? :specification_version then
63
- s.specification_version = 3
67
+ s.specification_version = 4
64
68
 
65
69
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
66
70
  s.add_runtime_dependency(%q<eventmachine>, [">= 0"])
71
+ s.add_development_dependency(%q<minitest>, [">= 0"])
72
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
67
73
  else
68
74
  s.add_dependency(%q<eventmachine>, [">= 0"])
75
+ s.add_dependency(%q<minitest>, [">= 0"])
76
+ s.add_dependency(%q<jeweler>, [">= 0"])
69
77
  end
70
78
  else
71
79
  s.add_dependency(%q<eventmachine>, [">= 0"])
80
+ s.add_dependency(%q<minitest>, [">= 0"])
81
+ s.add_dependency(%q<jeweler>, [">= 0"])
72
82
  end
73
83
  end
74
84
 
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'eventmachine'
4
+ require 'optparse'
5
+ require 'securerandom'
6
+
7
+ $LOAD_PATH << File.expand_path('../../lib', File.dirname(__FILE__))
8
+
9
+ require 'remailer'
10
+
11
+ # == Support Methods ========================================================
12
+
13
+ class Exerciser
14
+ attr_reader :report
15
+
16
+ def initialize(options)
17
+ @options = options
18
+ @pending = [ ]
19
+ @report = { }
20
+ end
21
+
22
+ def test(server)
23
+ results = @report[server] = {
24
+ success: 0,
25
+ timeout: 0,
26
+ error: 0
27
+ }
28
+
29
+ @options[:count].times do
30
+ uuid = SecureRandom.uuid
31
+
32
+ @pending << uuid
33
+
34
+ connection_options = {
35
+ close: true,
36
+ proxy: {
37
+ host: @options[:proxy_host],
38
+ port: @options[:proxy_port]
39
+ },
40
+ connect: lambda do |success, host|
41
+ results[success ? :success : :error] += 1
42
+ @pending.delete(uuid)
43
+ end
44
+ }
45
+
46
+ if (@options[:verbose])
47
+ connection_options[:debug] = STDOUT
48
+ end
49
+
50
+ Remailer::SMTP::Client.open(server, connection_options)
51
+ end
52
+ end
53
+
54
+ def done?
55
+ @pending.empty?
56
+ end
57
+ end
58
+
59
+ # == Main ===================================================================
60
+
61
+ options = {
62
+ count: 1,
63
+ concurrency: 1,
64
+ proxy_host: 'localhost',
65
+ proxy_port: 1080
66
+ }
67
+
68
+ opts = OptionParser.new do |parser|
69
+ parser.banner = "Usage: exerciser [options] server [server [...]]"
70
+ parser.on('-n', '--count=n') do |n|
71
+ options[:count] = n.to_i
72
+ end
73
+ parser.on('-c', '--concurrency=n') do |n|
74
+ options[:concurrency] = n.to_i
75
+ end
76
+ parser.on('-X', '--proxy=s') do |s|
77
+ server, port = s.split(/:/)
78
+
79
+ options[:proxy_host] = server
80
+
81
+ if (port)
82
+ options[:proxy_port] = port.to_i
83
+ end
84
+ end
85
+ parser.on('-v', '--verbose') do
86
+ options[:verbose] = true
87
+ end
88
+ end
89
+
90
+ servers = opts.parse(*ARGV)
91
+
92
+ unless (servers.any?)
93
+ puts opts
94
+ exit(0)
95
+ end
96
+
97
+ EventMachine.run do
98
+ exerciser = Exerciser.new(options)
99
+
100
+ servers.each do |server|
101
+ exerciser.test(server)
102
+ end
103
+
104
+ EventMachine.add_periodic_timer(0.1) do
105
+ if (exerciser.done?)
106
+ puts '%-40s %-6s %-6s' % [ 'Server', 'Success', 'Fail' ]
107
+ puts '-' * 58
108
+ exerciser.report.each do |server, results|
109
+ puts '%-40s %6d %6d' % [ server, results[:success], results[:error] ]
110
+ end
111
+
112
+ EventMachine.stop_event_loop
113
+ end
114
+ end
115
+ end
@@ -1,14 +1,14 @@
1
1
  TestConfig.smtp_server = {
2
- :host => "smtp.example.com",
3
- :identifier => "smtp.example.com"
2
+ host: "smtp.example.com",
3
+ identifier: "smtp.example.com"
4
4
  }
5
5
 
6
6
  TestConfig.public_smtp_server = {
7
- :host => "smtp.gmail.com",
8
- :identifier => "mx.google.com",
9
- :username => "--your--username--gmail.com",
10
- :password => "--your--password--",
11
- :port => 587
7
+ host: "smtp.gmail.com",
8
+ identifier: "mx.google.com",
9
+ username: "--your--username--gmail.com",
10
+ password: "--your--password--",
11
+ port: 587
12
12
  }
13
13
 
14
14
  TestConfig.proxy_server = "proxy.example.com"
@@ -1,5 +1,7 @@
1
1
  require 'rubygems'
2
- require 'test/unit'
2
+
3
+ gem 'minitest'
4
+ require 'minitest/autorun'
3
5
 
4
6
  $LOAD_PATH.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
5
7
  $LOAD_PATH.unshift(File.dirname(__FILE__))
@@ -14,8 +16,6 @@ rescue => e
14
16
  raise "EventMachine gem could not be loaded: #{e.class}: #{e}"
15
17
  end
16
18
 
17
- puts $LOAD_PATH.inspect
18
-
19
19
  require 'remailer'
20
20
 
21
21
  class Proc
@@ -51,7 +51,7 @@ module TestTriggerHelper
51
51
  end
52
52
  end
53
53
 
54
- class Test::Unit::TestCase
54
+ class MiniTest::Test
55
55
  def engine
56
56
  exception = nil
57
57
 
@@ -1,6 +1,6 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
- class RemailerIMAPClientInterpreterTest < Test::Unit::TestCase
3
+ class RemailerIMAPClientInterpreterTest < MiniTest::Test
4
4
  def test_split_list_definition
5
5
  assert_mapping(
6
6
  '(\HasChildren \HasNoChildren) "/" "[Gmail]/All Mail"' =>
@@ -1,6 +1,6 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
- class RemailerIMAPClientTest < Test::Unit::TestCase
3
+ class RemailerIMAPClientTest < MiniTest::Test
4
4
  def setup
5
5
  STDERR.sync = true
6
6
  end
@@ -11,8 +11,8 @@ class RemailerIMAPClientTest < Test::Unit::TestCase
11
11
 
12
12
  client = Remailer::IMAP::Client.open(
13
13
  TestConfig.imap_server[:host],
14
- :debug => STDERR,
15
- :connect => lambda { |success, host| connected_host = host }
14
+ debug: STDERR,
15
+ connect: lambda { |success, host| connected_host = host }
16
16
  )
17
17
 
18
18
  assert client
@@ -1,6 +1,6 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
- class RemailerInterpreterStateTest < Test::Unit::TestCase
3
+ class RemailerInterpreterStateTest < MiniTest::Test
4
4
  def test_defaults
5
5
  options = { }
6
6
 
@@ -15,9 +15,9 @@ class RemailerInterpreterStateTest < Test::Unit::TestCase
15
15
  proxy = Remailer::Interpreter::StateProxy.new(options)
16
16
 
17
17
  expected = {
18
- :enter => [ lambda { } ],
19
- :default => [ lambda { } ],
20
- :leave => [ lambda { } ]
18
+ enter: [ lambda { } ],
19
+ default: [ lambda { } ],
20
+ leave: [ lambda { } ]
21
21
  }.freeze
22
22
 
23
23
  proxy.enter(&expected[:enter][0])
@@ -31,9 +31,9 @@ class RemailerInterpreterStateTest < Test::Unit::TestCase
31
31
  options = { }
32
32
 
33
33
  expected = {
34
- :enter => [ lambda { } ],
35
- :terminate => [ lambda { } ],
36
- :leave => [ lambda { } ]
34
+ enter: [ lambda { } ],
35
+ terminate: [ lambda { } ],
36
+ leave: [ lambda { } ]
37
37
  }.freeze
38
38
 
39
39
  Remailer::Interpreter::StateProxy.new(options) do
@@ -49,10 +49,10 @@ class RemailerInterpreterStateTest < Test::Unit::TestCase
49
49
  options = { }
50
50
 
51
51
  expected = {
52
- :enter => [ lambda { } ],
53
- :interpret => [ [ 10, lambda { } ], [ 1, lambda { } ] ],
54
- :default => [ lambda { } ],
55
- :leave => [ lambda { } ]
52
+ enter: [ lambda { } ],
53
+ interpret: [ [ 10, lambda { } ], [ 1, lambda { } ] ],
54
+ default: [ lambda { } ],
55
+ leave: [ lambda { } ]
56
56
  }.freeze
57
57
 
58
58
  Remailer::Interpreter::StateProxy.new(options) do
@@ -80,7 +80,7 @@ class RemailerInterpreterStateTest < Test::Unit::TestCase
80
80
 
81
81
  proxy.leave(&proc[1])
82
82
 
83
- assert_equal({ :enter => [ proc[0] ] }, options_a)
84
- assert_equal({ :leave => [ proc[1] ] }, options_b)
83
+ assert_equal({ enter: [ proc[0] ] }, options_a)
84
+ assert_equal({ leave: [ proc[1] ] }, options_b)
85
85
  end
86
86
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
3
  class ExampleDelegate
4
4
  include TestTriggerHelper
@@ -105,7 +105,7 @@ class InterpreterWithAccessor < Remailer::Interpreter
105
105
  attr_accessor :example
106
106
  end
107
107
 
108
- class RemailerInterpreterTest < Test::Unit::TestCase
108
+ class RemailerInterpreterTest < MiniTest::Test
109
109
  def test_default_state
110
110
  assert_equal [ :initialized, :terminated ], Remailer::Interpreter.states_defined.collect { |s| s.to_s }.sort.collect { |s| s.to_sym }
111
111
  assert_equal true, Remailer::Interpreter.state_defined?(:initialized)
@@ -128,7 +128,7 @@ class RemailerInterpreterTest < Test::Unit::TestCase
128
128
 
129
129
  assert delegate.triggered
130
130
 
131
- interpreter = Remailer::Interpreter.new(:delegate => delegate)
131
+ interpreter = Remailer::Interpreter.new(delegate: delegate)
132
132
 
133
133
  assert_equal nil, delegate.attribute
134
134
  assert_equal false, delegate.triggered[:method_no_args]
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
3
  class SMTPDelegate
4
4
  attr_accessor :options, :protocol, :active_message
@@ -62,7 +62,7 @@ class SMTPDelegate
62
62
  end
63
63
  end
64
64
 
65
- class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
65
+ class RemailerSMTPClientInterpreterTest < MiniTest::Test
66
66
  def test_split_reply
67
67
  assert_mapping(
68
68
  '250 OK' => [ 250, 'OK' ],
@@ -127,12 +127,12 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
127
127
  end
128
128
 
129
129
  def test_delegate_options
130
- delegate = SMTPDelegate.new(:use_tls => true)
130
+ delegate = SMTPDelegate.new(use_tls: true)
131
131
 
132
132
  assert_equal true, delegate.use_tls?
133
133
  assert_equal false, delegate.requires_authentication?
134
134
 
135
- delegate = SMTPDelegate.new(:username => 'test@example.com', :password => 'tester')
135
+ delegate = SMTPDelegate.new(username: 'test@example.com', password: 'tester')
136
136
 
137
137
  assert_equal false, delegate.use_tls?
138
138
  assert_equal true, delegate.requires_authentication?
@@ -140,7 +140,7 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
140
140
 
141
141
  def test_standard_smtp_connection
142
142
  delegate = SMTPDelegate.new
143
- interpreter = Remailer::SMTP::Client::Interpreter.new(:delegate => delegate)
143
+ interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
144
144
 
145
145
  assert_equal :initialized, interpreter.state
146
146
 
@@ -163,7 +163,7 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
163
163
 
164
164
  def test_standard_smtp_connection_send_email
165
165
  delegate = SMTPDelegate.new
166
- interpreter = Remailer::SMTP::Client::Interpreter.new(:delegate => delegate)
166
+ interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
167
167
 
168
168
  assert_equal :initialized, interpreter.state
169
169
 
@@ -184,9 +184,9 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
184
184
  assert_equal true, delegate.closed?
185
185
 
186
186
  delegate.active_message = {
187
- :from => 'from@example.com',
188
- :to => 'to@example.com',
189
- :data => "Subject: Test Message\r\n\r\nThis is a message!\r\n"
187
+ from: 'from@example.com',
188
+ to: 'to@example.com',
189
+ data: "Subject: Test Message\r\n\r\nThis is a message!\r\n"
190
190
  }
191
191
 
192
192
  interpreter.enter_state(:send)
@@ -218,7 +218,7 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
218
218
 
219
219
  def test_standard_esmtp_connection
220
220
  delegate = SMTPDelegate.new
221
- interpreter = Remailer::SMTP::Client::Interpreter.new(:delegate => delegate)
221
+ interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
222
222
 
223
223
  assert_equal :initialized, interpreter.state
224
224
 
@@ -254,8 +254,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
254
254
  end
255
255
 
256
256
  def test_multi_line_hello_response
257
- delegate = SMTPDelegate.new(:use_tls => true)
258
- interpreter = Remailer::SMTP::Client::Interpreter.new(:delegate => delegate)
257
+ delegate = SMTPDelegate.new(use_tls: true)
258
+ interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
259
259
 
260
260
  assert_equal :initialized, interpreter.state
261
261
  assert_equal :smtp, delegate.protocol
@@ -276,8 +276,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
276
276
  end
277
277
 
278
278
  def test_tls_connection_with_support
279
- delegate = SMTPDelegate.new(:use_tls => true)
280
- interpreter = Remailer::SMTP::Client::Interpreter.new(:delegate => delegate)
279
+ delegate = SMTPDelegate.new(use_tls: true)
280
+ interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
281
281
 
282
282
  assert_equal true, delegate.use_tls?
283
283
  assert_equal :initialized, interpreter.state
@@ -307,8 +307,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
307
307
  end
308
308
 
309
309
  def test_tls_connection_without_support
310
- delegate = SMTPDelegate.new(:use_tls => true)
311
- interpreter = Remailer::SMTP::Client::Interpreter.new(:delegate => delegate)
310
+ delegate = SMTPDelegate.new(use_tls: true)
311
+ interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
312
312
 
313
313
  interpreter.process("220 mail.example.com ESMTP Exim 4.63\r\n")
314
314
  assert_equal 'EHLO localhost.local', delegate.read
@@ -322,8 +322,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
322
322
  end
323
323
 
324
324
  def test_basic_smtp_plaintext_auth_accepted
325
- delegate = SMTPDelegate.new(:username => 'tester@example.com', :password => 'tester')
326
- interpreter = Remailer::SMTP::Client::Interpreter.new(:delegate => delegate)
325
+ delegate = SMTPDelegate.new(username: 'tester@example.com', password: 'tester')
326
+ interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
327
327
 
328
328
  assert delegate.requires_authentication?
329
329
 
@@ -348,8 +348,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
348
348
  end
349
349
 
350
350
  def test_basic_esmtp_plaintext_auth_accepted
351
- delegate = SMTPDelegate.new(:username => 'tester@example.com', :password => 'tester')
352
- interpreter = Remailer::SMTP::Client::Interpreter.new(:delegate => delegate)
351
+ delegate = SMTPDelegate.new(username: 'tester@example.com', password: 'tester')
352
+ interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
353
353
 
354
354
  interpreter.process("220 mail.example.com ESMTP Exim 4.63\r\n")
355
355
  assert_equal 'EHLO localhost.local', delegate.read
@@ -368,8 +368,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
368
368
  end
369
369
 
370
370
  def test_basic_esmtp_plaintext_auth_rejected
371
- delegate = SMTPDelegate.new(:username => 'tester@example.com', :password => 'tester')
372
- interpreter = Remailer::SMTP::Client::Interpreter.new(:delegate => delegate)
371
+ delegate = SMTPDelegate.new(username: 'tester@example.com', password: 'tester')
372
+ interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
373
373
 
374
374
  interpreter.process("220 mx.google.com ESMTP\r\n")
375
375
  assert_equal 'EHLO localhost.local', delegate.read
@@ -396,8 +396,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
396
396
  end
397
397
 
398
398
  def test_unexpected_response
399
- delegate = SMTPDelegate.new(:username => 'tester@example.com', :password => 'tester')
400
- interpreter = Remailer::SMTP::Client::Interpreter.new(:delegate => delegate)
399
+ delegate = SMTPDelegate.new(username: 'tester@example.com', password: 'tester')
400
+ interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
401
401
 
402
402
  interpreter.process("530 Go away\r\n")
403
403
 
@@ -1,6 +1,6 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
- class RemailerSMTPClientTest < Test::Unit::TestCase
3
+ class RemailerSMTPClientTest < MiniTest::Test
4
4
  def test_connect
5
5
  engine do
6
6
  debug = { }
@@ -8,8 +8,8 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
8
8
 
9
9
  connection = Remailer::SMTP::Client.open(
10
10
  TestConfig.smtp_server[:host],
11
- :debug => STDERR,
12
- :connect => lambda { |success, host| connected_host = host }
11
+ debug: STDERR,
12
+ connect: lambda { |success, host| connected_host = host }
13
13
  )
14
14
 
15
15
  after_complete_trigger = false
@@ -45,13 +45,13 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
45
45
 
46
46
  connection = Remailer::SMTP::Client.open(
47
47
  'example.com',
48
- :debug => STDERR,
49
- :error => lambda { |code, message|
48
+ debug: STDERR,
49
+ error: lambda { |code, message|
50
50
  error_received = [ code, message ]
51
51
  },
52
- :on_connect => lambda { on_connect = true },
53
- :on_error => lambda { on_error = true },
54
- :timeout => 1
52
+ on_connect: lambda { on_connect = true },
53
+ on_error: lambda { on_error = true },
54
+ timeout: 1
55
55
  )
56
56
 
57
57
  assert_eventually(3) do
@@ -72,11 +72,11 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
72
72
 
73
73
  connection = Remailer::SMTP::Client.open(
74
74
  'invalid-example-domain--x.com',
75
- :debug => STDERR,
76
- :error => lambda { |code, message|
75
+ debug: STDERR,
76
+ error: lambda { |code, message|
77
77
  error_received = [ code, message ]
78
78
  },
79
- :timeout => 1
79
+ timeout: 1
80
80
  )
81
81
 
82
82
  assert_eventually(3) do
@@ -93,10 +93,10 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
93
93
 
94
94
  connection = Remailer::SMTP::Client.open(
95
95
  TestConfig.public_smtp_server[:host],
96
- :port => TestConfig.public_smtp_server[:port] || Remailer::SMTP::Client::SMTP_PORT,
97
- :debug => STDERR,
98
- :username => TestConfig.public_smtp_server[:username],
99
- :password => TestConfig.public_smtp_server[:password]
96
+ port: TestConfig.public_smtp_server[:port] || Remailer::SMTP::Client::SMTP_PORT,
97
+ debug: STDERR,
98
+ username: TestConfig.public_smtp_server[:username],
99
+ password: TestConfig.public_smtp_server[:password]
100
100
  )
101
101
 
102
102
  after_complete_trigger = false
@@ -129,10 +129,10 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
129
129
 
130
130
  connection = Remailer::SMTP::Client.open(
131
131
  TestConfig.smtp_server[:host],
132
- :debug => STDERR,
133
- :proxy => {
134
- :proto => :socks5,
135
- :host => TestConfig.proxy_server
132
+ debug: STDERR,
133
+ proxy: {
134
+ proto: :socks5,
135
+ host: TestConfig.proxy_server
136
136
  }
137
137
  )
138
138
 
@@ -164,7 +164,7 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
164
164
  engine do
165
165
  connection = Remailer::SMTP::Client.open(
166
166
  TestConfig.smtp_server[:host],
167
- :debug => STDERR
167
+ debug: STDERR
168
168
  )
169
169
 
170
170
  assert_equal :initialized, connection.state
@@ -197,7 +197,7 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
197
197
  engine do
198
198
  connection = Remailer::SMTP::Client.open(
199
199
  TestConfig.smtp_server[:host],
200
- :debug => STDERR
200
+ debug: STDERR
201
201
  )
202
202
 
203
203
  assert_equal :initialized, connection.state
@@ -222,7 +222,7 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
222
222
  engine do
223
223
  connection = Remailer::SMTP::Client.open(
224
224
  TestConfig.smtp_server[:host],
225
- :debug => STDERR
225
+ debug: STDERR
226
226
  )
227
227
 
228
228
  assert_equal :initialized, connection.state
@@ -250,7 +250,7 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
250
250
  engine do
251
251
  connection = Remailer::SMTP::Client.open(
252
252
  TestConfig.smtp_server[:host],
253
- :debug => STDERR
253
+ debug: STDERR
254
254
  )
255
255
 
256
256
  assert_equal :initialized, connection.state
@@ -1,6 +1,6 @@
1
- require File.expand_path('../helper', File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
- class RemailerSMTPServerTest < Test::Unit::TestCase
3
+ class RemailerSMTPServerTest < MiniTest::Test
4
4
  def test_bind
5
5
  engine do
6
6
  server_port = 8025
@@ -20,7 +20,7 @@ class RemailerSMTPServerTest < Test::Unit::TestCase
20
20
  server = Remailer::SMTP::Server.bind(
21
21
  nil,
22
22
  server_port,
23
- :on_connect => lambda { |_remote_ip| remote_ip = _remote_ip }
23
+ on_connect: lambda { |_remote_ip| remote_ip = _remote_ip }
24
24
  )
25
25
 
26
26
  assert server
@@ -29,9 +29,9 @@ class RemailerSMTPServerTest < Test::Unit::TestCase
29
29
 
30
30
  client = Remailer::SMTP::Client.open(
31
31
  'localhost',
32
- :port => server_port,
33
- :debug => STDERR,
34
- :connect => lambda { |success, host| connected_host = host }
32
+ port: server_port,
33
+ debug: STDERR,
34
+ connect: lambda { |success, host| connected_host = host }
35
35
  )
36
36
 
37
37
  assert_eventually(30) do
@@ -52,7 +52,7 @@ class RemailerSMTPServerTest < Test::Unit::TestCase
52
52
  server = Remailer::SMTP::Server.bind(
53
53
  nil,
54
54
  server_port,
55
- :on_transaction => lambda { |_transaction| transaction = _transaction }
55
+ on_transaction: lambda { |_transaction| transaction = _transaction }
56
56
  )
57
57
 
58
58
  assert server
@@ -61,8 +61,8 @@ class RemailerSMTPServerTest < Test::Unit::TestCase
61
61
 
62
62
  client = Remailer::SMTP::Client.open(
63
63
  'localhost',
64
- :port => server_port,
65
- :debug => STDERR
64
+ port: server_port,
65
+ debug: STDERR
66
66
  )
67
67
 
68
68
  sender = 'sender@example.com'.freeze
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
3
  class SOCKS5Delegate
4
4
  attr_reader :options
@@ -52,15 +52,15 @@ class SOCKS5Delegate
52
52
  end
53
53
  end
54
54
 
55
- class RemailerSOCKS5ClientInterpreterTest < Test::Unit::TestCase
55
+ class RemailerSOCKS5ClientInterpreterTest < MiniTest::Test
56
56
  def test_defaults
57
57
  delegate = SOCKS5Delegate.new(
58
- :proxy => {
59
- :host => 'example.net'
58
+ proxy: {
59
+ host: 'example.net'
60
60
  }
61
61
  )
62
62
 
63
- interpreter = Remailer::SOCKS5::Client::Interpreter.new(:delegate => delegate)
63
+ interpreter = Remailer::SOCKS5::Client::Interpreter.new(delegate: delegate)
64
64
 
65
65
  assert_equal :initialized, interpreter.state
66
66
  assert_equal false, delegate.closed?
@@ -68,13 +68,13 @@ class RemailerSOCKS5ClientInterpreterTest < Test::Unit::TestCase
68
68
 
69
69
  def test_simple_connection
70
70
  delegate = SOCKS5Delegate.new(
71
- :host => '1.2.3.4',
72
- :port => 4321,
73
- :proxy => {
74
- :host => 'example.net'
71
+ host: '1.2.3.4',
72
+ port: 4321,
73
+ proxy: {
74
+ host: 'example.net'
75
75
  }
76
76
  )
77
- interpreter = Remailer::SOCKS5::Client::Interpreter.new(:delegate => delegate)
77
+ interpreter = Remailer::SOCKS5::Client::Interpreter.new(delegate: delegate)
78
78
 
79
79
  assert_equal :initialized, interpreter.state
80
80
  assert_equal false, delegate.closed?
@@ -121,4 +121,64 @@ class RemailerSOCKS5ClientInterpreterTest < Test::Unit::TestCase
121
121
 
122
122
  assert_equal :connected, interpreter.state
123
123
  end
124
+
125
+ def test_combined_socks5_smtp
126
+ delegate = SOCKS5Delegate.new(
127
+ host: '1.2.3.4',
128
+ port: 4321,
129
+ proxy: {
130
+ host: 'example.net'
131
+ }
132
+ )
133
+ interpreter = Remailer::SOCKS5::Client::Interpreter.new(delegate: delegate)
134
+
135
+ assert_equal :initialized, interpreter.state
136
+ assert_equal false, delegate.closed?
137
+
138
+ sent = delegate.read
139
+
140
+ assert_equal 2, sent.length
141
+
142
+ assert_equal [ Remailer::SOCKS5::Client::Interpreter::SOCKS5_VERSION, 0 ], sent.unpack('CC')
143
+
144
+ reply = [
145
+ Remailer::SOCKS5::Client::Interpreter::SOCKS5_VERSION,
146
+ Remailer::SOCKS5::Client::Interpreter::SOCKS5_METHOD[:no_auth]
147
+ ].pack('CC')
148
+
149
+ interpreter.process(reply)
150
+
151
+ assert_equal false, interpreter.error?
152
+ assert_equal :connect_through_proxy, interpreter.state
153
+ assert_equal '', reply
154
+
155
+ sent = delegate.read
156
+
157
+ assert sent, "No data received"
158
+ assert_equal 10, sent.length
159
+
160
+ assert_equal [
161
+ Remailer::SOCKS5::Client::Interpreter::SOCKS5_VERSION,
162
+ Remailer::SOCKS5::Client::Interpreter::SOCKS5_COMMAND[:connect],
163
+ 0,
164
+ Remailer::SOCKS5::Client::Interpreter::SOCKS5_ADDRESS_TYPE[:ipv4],
165
+ [ 1, 2, 3, 4 ].pack('CCCC'),
166
+ 4321
167
+ ], sent.unpack('CCCCA4n')
168
+
169
+ buffer = [
170
+ Remailer::SOCKS5::Client::Interpreter::SOCKS5_VERSION,
171
+ 0, # No error
172
+ 0,
173
+ Remailer::SOCKS5::Client::Interpreter::SOCKS5_ADDRESS_TYPE[:ipv4],
174
+ [ 1, 2, 3, 4 ].pack('CCCC'),
175
+ 4321
176
+ ].pack('CCCCA4n') + '421 Welcome to an ESTMP Server'
177
+
178
+ interpreter.process(buffer)
179
+
180
+ assert_equal '421 Welcome to an ESTMP Server', buffer
181
+
182
+ assert_equal :connected, interpreter.state
183
+ end
124
184
  end
@@ -1,6 +1,6 @@
1
- require File.expand_path(File.join(*%w[ .. helper ]), File.dirname(__FILE__))
1
+ require_relative '../helper'
2
2
 
3
- class RemailerTest < Test::Unit::TestCase
3
+ class RemailerTest < MiniTest::Test
4
4
  def test_module_loaded
5
5
  assert Remailer
6
6
  end
metadata CHANGED
@@ -1,30 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: remailer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
5
- prerelease:
4
+ version: 0.6.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Scott Tadman
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-11-30 00:00:00.000000000 Z
11
+ date: 2015-01-22 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: eventmachine
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: jeweler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
28
53
  - !ruby/object:Gem::Version
29
54
  version: '0'
30
55
  description: EventMachine SMTP Mail User Agent
@@ -32,10 +57,12 @@ email: scott@twg.ca
32
57
  executables: []
33
58
  extensions: []
34
59
  extra_rdoc_files:
35
- - README.rdoc
60
+ - README.md
36
61
  files:
37
- - .document
38
- - README.rdoc
62
+ - ".document"
63
+ - ".travis.yml"
64
+ - Gemfile
65
+ - README.md
39
66
  - Rakefile
40
67
  - VERSION
41
68
  - lib/remailer.rb
@@ -60,6 +87,7 @@ files:
60
87
  - lib/remailer/socks5/client/interpreter.rb
61
88
  - lib/remailer/support.rb
62
89
  - remailer.gemspec
90
+ - test/bin/exercise
63
91
  - test/config.example.rb
64
92
  - test/helper.rb
65
93
  - test/unit/remailer_imap_client_interpreter_test.rb
@@ -73,26 +101,25 @@ files:
73
101
  - test/unit/remailer_test.rb
74
102
  homepage: http://github.com/twg/remailer
75
103
  licenses: []
104
+ metadata: {}
76
105
  post_install_message:
77
106
  rdoc_options: []
78
107
  require_paths:
79
108
  - lib
80
109
  required_ruby_version: !ruby/object:Gem::Requirement
81
- none: false
82
110
  requirements:
83
- - - ! '>='
111
+ - - ">="
84
112
  - !ruby/object:Gem::Version
85
113
  version: '0'
86
114
  required_rubygems_version: !ruby/object:Gem::Requirement
87
- none: false
88
115
  requirements:
89
- - - ! '>='
116
+ - - ">="
90
117
  - !ruby/object:Gem::Version
91
118
  version: '0'
92
119
  requirements: []
93
120
  rubyforge_project:
94
- rubygems_version: 1.8.24
121
+ rubygems_version: 2.2.2
95
122
  signing_key:
96
- specification_version: 3
123
+ specification_version: 4
97
124
  summary: Reactor-Ready SMTP Mailer
98
125
  test_files: []