remailer 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.
@@ -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: []