remailer 0.3.8 → 0.4.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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.8
1
+ 0.4.0
@@ -31,10 +31,16 @@ class Remailer::Interpreter
31
31
  # Returns the states that are defined as a has with their associated
32
32
  # options. The default keys are :initialized and :terminated.
33
33
  def self.states
34
- @states ||= {
35
- :initialized => { },
36
- :terminated => { }
37
- }
34
+ @states ||=
35
+ case (superclass.respond_to?(:states))
36
+ when true
37
+ superclass.states.dup
38
+ else
39
+ {
40
+ :initialized => { },
41
+ :terminated => { }
42
+ }
43
+ end
38
44
  end
39
45
 
40
46
  # Returns true if a given state is defined, false otherwise.
@@ -64,7 +70,7 @@ class Remailer::Interpreter
64
70
  # Fixnum defines a minimum size to process, useful for packed binary
65
71
  # streams, and a Regexp defines a pattern that must match before the parser
66
72
  # is engaged.
67
- def self.parser_for_spec(spec, &block)
73
+ def self.create_parser_for_spec(spec, &block)
68
74
  case (spec)
69
75
  when nil
70
76
  block
@@ -91,7 +97,7 @@ class Remailer::Interpreter
91
97
  # Defines a parser for this interpreter. The supplied block is executed in
92
98
  # the context of a parser instance.
93
99
  def self.parse(spec = nil, &block)
94
- @parser = parser_for_spec(spec, &block)
100
+ @parser = create_parser_for_spec(spec, &block)
95
101
  end
96
102
 
97
103
  # Assigns the default interpreter.
@@ -107,17 +113,35 @@ class Remailer::Interpreter
107
113
 
108
114
  # Returns the parser used when no state-specific parser has been defined.
109
115
  def self.default_parser
110
- @parser ||= lambda { |s| _s = s.dup; s.replace(''); _s }
116
+ @parser ||=
117
+ case (superclass.respond_to?(:default_parser))
118
+ when true
119
+ superclass.default_parser
120
+ else
121
+ lambda { |s| _s = s.dup; s.replace(''); _s }
122
+ end
111
123
  end
112
124
 
113
125
  # Returns the current default_interpreter.
114
126
  def self.default_interpreter
115
- @default
127
+ @default ||=
128
+ case (superclass.respond_to?(:default_interpreter))
129
+ when true
130
+ superclass.default_interpreter
131
+ else
132
+ nil
133
+ end
116
134
  end
117
135
 
118
136
  # Returns the defined error handler
119
137
  def self.on_error_handler
120
- @on_error
138
+ @on_error ||=
139
+ case (superclass.respond_to?(:on_error_handler))
140
+ when true
141
+ superclass.on_error_handler
142
+ else
143
+ nil
144
+ end
121
145
  end
122
146
 
123
147
  # == Instance Methods =====================================================
@@ -191,17 +215,39 @@ class Remailer::Interpreter
191
215
  # interpretation should be defined by declaring a state with an interpret
192
216
  # block defined.
193
217
  def interpret(*args)
194
- object = args.first
218
+ object = args[0]
195
219
  config = self.class.states[@state]
196
- callbacks = (config and config[:interpret])
220
+ interpreters = (config and config[:interpret])
197
221
 
198
- if (callbacks)
199
- matched, proc = callbacks.find do |on, proc|
200
- object == on
222
+ if (interpreters)
223
+ match_result = nil
224
+
225
+ matched, proc = interpreters.find do |response, proc|
226
+ case (response)
227
+ when Regexp
228
+ match_result = response.match(object)
229
+ else
230
+ response === object
231
+ end
201
232
  end
202
-
233
+
203
234
  if (matched)
204
- args.shift
235
+ case (matched)
236
+ when Regexp
237
+ match_result = match_result.to_a
238
+
239
+ if (match_result.length > 1)
240
+ match_string = match_result.shift
241
+ args[0, 1] = match_result
242
+ else
243
+ args[0].sub!(match_result[0], '')
244
+ end
245
+ when String
246
+ args[0].sub!(matched, '')
247
+ else
248
+ args.shift
249
+ end
250
+
205
251
  instance_exec(*args, &proc)
206
252
 
207
253
  return true
data/remailer.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{remailer}
8
- s.version = "0.3.8"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Scott Tadman"]
@@ -40,6 +40,26 @@ class LineInterpreter < Remailer::Interpreter
40
40
  end
41
41
  end
42
42
 
43
+ class LineInterpreterSubclass < LineInterpreter
44
+ parse(/^.*?\0/) do |data|
45
+ data.sub(/\0$/, '')
46
+ end
47
+ end
48
+
49
+ class RegexpInterpreter < Remailer::Interpreter
50
+ attr_reader :received
51
+
52
+ state :initialized do
53
+ interpret(/^HELO\s+/) do |line|
54
+ @received = [ :helo, line ]
55
+ end
56
+
57
+ interpret(/^MAIL FROM:<([^>]+)>/) do |line|
58
+ @received = [ :mail_from, line ]
59
+ end
60
+ end
61
+ end
62
+
43
63
  class ExampleInterpreter < Remailer::Interpreter
44
64
  include TestTriggerHelper
45
65
 
@@ -91,6 +111,12 @@ class RemailerInterpreterTest < Test::Unit::TestCase
91
111
  interpreter = Remailer::Interpreter.new
92
112
 
93
113
  assert_equal :initialized, interpreter.state
114
+
115
+ buffer = 'a'
116
+
117
+ interpreter.parse(buffer)
118
+
119
+ assert_equal '', buffer
94
120
  end
95
121
 
96
122
  def test_delegate
@@ -188,6 +214,46 @@ class RemailerInterpreterTest < Test::Unit::TestCase
188
214
  assert_equal 'INCOMPLETE LINE', interpreter.lines[-1]
189
215
  assert_equal '', line
190
216
  end
217
+
218
+ def test_interpreter_subclass
219
+ interpreter = LineInterpreterSubclass.new
220
+
221
+ assert_equal [ ], interpreter.lines
222
+
223
+ line = "TEST"
224
+
225
+ interpreter.process(line)
226
+
227
+ assert_equal nil, interpreter.lines[-1]
228
+ assert_equal "TEST", line
229
+
230
+ line << "\0"
231
+
232
+ interpreter.process(line)
233
+
234
+ assert_equal "TEST", interpreter.lines[-1]
235
+ assert_equal "", line
236
+ end
237
+
238
+ def test_regexp_interpreter
239
+ interpreter = RegexpInterpreter.new
240
+
241
+ assert_equal nil, interpreter.received
242
+
243
+ line = "HELO example.com"
244
+
245
+ interpreter.process(line)
246
+ assert_equal '', line
247
+
248
+ assert_equal [ :helo, 'example.com' ], interpreter.received
249
+
250
+ line = "MAIL FROM:<example@example.com>"
251
+
252
+ interpreter.process(line)
253
+ assert_equal '', line
254
+
255
+ assert_equal [ :mail_from, 'example@example.com' ], interpreter.received
256
+ end
191
257
 
192
258
  def test_default_handler_for_interpreter
193
259
  interpreter = ExampleInterpreter.new
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 3
8
- - 8
9
- version: 0.3.8
7
+ - 4
8
+ - 0
9
+ version: 0.4.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Scott Tadman