Project: Revactor
Revision: 127
Author: tarcieri
Date: 16 Apr 2008 02:24:45
Changes:Change filter loading semantics to use Tuples to group initialization parameters, eliminate usage of Enumerable#reduce, and ensure all specs pass again
Files:modified: /trunk/spec/actor_spec.rb (
try)
modified: /trunk/spec/line_filter_spec.rb (
try)
modified: /trunk/spec/packet_filter_spec.rb (
try)
modified: /trunk/lib/revactor/tcp.rb (
try)
modified: /trunk/CHANGES (
try)
modified: /trunk/lib/revactor/http_client.rb (
try)
deleted: /trunk/spec/delegator_spec.rb
modified: /trunk/lib/revactor/filters/line.rb (
try)
modified: /trunk/lib/revactor/filters/packet.rb (
try)
modified: /trunk/spec/tcp_spec.rb (
try)
Diff:
| ... | ...@@ -4,7 +4,7 @@ |
| 4 | 4 | # See file LICENSE for details |
| 5 | 5 | #++ |
| 6 | 6 | |
| 7 | | require File.dirname(__FILE__) + '/../lib/revactor/actor' |
| 7 | require File.dirname(__FILE__) + '/../lib/revactor' |
| 8 | 8 | |
| 9 | 9 | describe Actor do |
| 10 | 10 | describe "creation" do |
| ... | ...@@ -156,4 +156,4 @@ |
| 156 | 156 | Actor.sleep 0 |
| 157 | 157 | actor.dead?.should be_true |
| 158 | 158 | end |
| 159 | | end |
| 160 | 159 | \ No newline at end of file |
| 160 | end |
| ... | ...@@ -31,6 +31,6 @@ |
| 31 | 31 | chunks[2] = msg2.slice(1, msg2.size - 1) |
| 32 | 32 | chunks[3] = msg2.slice(msg2.size, 1) << msg3 |
| 33 | 33 | |
| 34 | | chunks.reduce([]) { |a, chunk| a + @filter.decode(chunk) }.should == %w{foobar baz quux} |
| 34 | chunks.inject([]) { |a, chunk| a + @filter.decode(chunk) }.should == %w{foobar baz quux} |
| 35 | 35 | end |
| 36 | 36 | end |
| ... | ...@@ -48,7 +48,7 @@ |
| 48 | 48 | chunks[2] = packet2.slice(1, packet2.size - 1) |
| 49 | 49 | chunks[3] = packet2.slice(packet2.size, 1) << packet3 |
| 50 | 50 | |
| 51 | | chunks.reduce([]) { |a, chunk| a + filter.decode(chunk) }.should == [msg1, msg2, msg3] |
| 51 | chunks.inject([]) { |a, chunk| a + filter.decode(chunk) }.should == [msg1, msg2, msg3] |
| 52 | 52 | end |
| 53 | 53 | |
| 54 | 54 | it "raises an exception for overlength frames" do |
| ... | ...@@ -88,7 +88,7 @@ |
| 88 | 88 | |
| 89 | 89 | super.instance_eval { |
| 90 | 90 | @active, @controller = options[:active], options[:controller] |
| 91 | | @filterset = initialize_filter(*options[:filter]) |
| 91 | @filterset = [*initialize_filter(options[:filter])] |
| 92 | 92 | self |
| 93 | 93 | } |
| 94 | 94 | end |
| ... | ...@@ -99,7 +99,7 @@ |
| 99 | 99 | |
| 100 | 100 | @active ||= options[:active] || false |
| 101 | 101 | @controller ||= options[:controller] || Actor.current |
| 102 | | @filterset ||= initialize_filter(*options[:filter]) |
| 102 | @filterset ||= [*initialize_filter(options[:filter])] |
| 103 | 103 | |
| 104 | 104 | @receiver = @controller |
| 105 | 105 | @read_buffer = Rev::Buffer.new |
| ... | ...@@ -237,26 +237,26 @@ |
| 237 | 237 | # Filter setup |
| 238 | 238 | # |
| 239 | 239 | |
| 240 | | # Initialize filter change |
| 241 | | def initialize_filter(*filterset) |
| 242 | | return filterset if filterset.empty? |
| 243 | | |
| 244 | | filterset.map do |filter| |
| 245 | | case filter |
| 246 | | when Array |
| 247 | | name = filter.shift |
| 248 | | case name |
| 249 | | when Class |
| 250 | | name.new(*filter) |
| 251 | | when Symbol |
| 252 | | symbol_to_filter(name).new(*filter) |
| 253 | | else raise ArgumentError, "unrecognized filter type: #{name.class}" |
| 254 | | end |
| 240 | # Initialize filters |
| 241 | def initialize_filter(filter) |
| 242 | case filter |
| 243 | when NilClass |
| 244 | [] |
| 245 | when Tuple |
| 246 | name, *args = filter |
| 247 | case name |
| 255 | 248 | when Class |
| 256 | | filter.new |
| 249 | name.new(*args) |
| 257 | 250 | when Symbol |
| 258 | | symbol_to_filter(filter).new |
| 251 | symbol_to_filter(name).new(*args) |
| 252 | else raise ArgumentError, "unrecognized filter type: #{name.class}" |
| 259 | 253 | end |
| 254 | when Array |
| 255 | filter.map { |f| initialize_filter f } |
| 256 | when Class |
| 257 | filter.new |
| 258 | when Symbol |
| 259 | symbol_to_filter(filter).new |
| 260 | 260 | end |
| 261 | 261 | end |
| 262 | 262 | |
| ... | ...@@ -271,8 +271,8 @@ |
| 271 | 271 | |
| 272 | 272 | # Decode data through the filter chain |
| 273 | 273 | def decode(data) |
| 274 | | @filterset.reduce([data]) do |a, filter| |
| 275 | | a.reduce([]) do |a2, d| |
| 274 | @filterset.inject([data]) do |a, filter| |
| 275 | a.inject([]) do |a2, d| |
| 276 | 276 | a2 + filter.decode(d) |
| 277 | 277 | end |
| 278 | 278 | end |
| ... | ...@@ -280,7 +280,7 @@ |
| 280 | 280 | |
| 281 | 281 | # Encode data through the filter chain |
| 282 | 282 | def encode(message) |
| 283 | | @filterset.reverse.reduce(message) { |m, filter| filter.encode(*m) } |
| 283 | @filterset.reverse.inject(message) { |m, filter| filter.encode(*m) } |
| 284 | 284 | end |
| 285 | 285 | |
| 286 | 286 | # |
| ... | ...@@ -1,3 +1,7 @@ |
| 1 | 0.1.5: |
| 2 | |
| 3 | * Change Revactor::Filter setup to express initialize args as Tuples |
| 4 | |
| 1 | 5 | 0.1.4: |
| 2 | 6 | |
| 3 | 7 | * Fix bungled 0.1.3 release :( |
| ... | ...@@ -235,7 +235,9 @@ |
| 235 | 235 | @chunked_encoding = response_header.chunked_encoding? |
| 236 | 236 | |
| 237 | 237 | # Convert header fields hash from LIKE_THIS to like-this |
| 238 | | @headers = response_header.reduce({}) { |h, (k, v)| h[k.split('_').map(&:downcase).join('-')] = v; h } |
| 238 | @headers = response_header.inject({}) do |h, (k, v)| |
| 239 | h[k.split('_').map(&:downcase).join('-')] = v; h |
| 240 | end |
| 239 | 241 | |
| 240 | 242 | # Extract Transfer-Encoding if available |
| 241 | 243 | @transfer_encoding = @headers.delete('transfer-encoding') |
| ... | ...@@ -344,4 +346,4 @@ |
| 344 | 346 | @client.close |
| 345 | 347 | end |
| 346 | 348 | end |
| 347 | | end |
| 348 | 349 | \ No newline at end of file |
| 350 | end |
| ... | ...@@ -1,46 +0,0 @@ |
| 1 | | #-- |
| 2 | | # Copyright (C)2007 Tony Arcieri |
| 3 | | # You can redistribute this under the terms of the Ruby license |
| 4 | | # See file LICENSE for details |
| 5 | | #++ |
| 6 | | |
| 7 | | require File.dirname(__FILE__) + '/../lib/revactor' |
| 8 | | |
| 9 | | describe Actor::Delegator do |
| 10 | | before :each do |
| 11 | | @obj = mock(:obj) |
| 12 | | @delegator = Actor::Delegator.new(@obj) |
| 13 | | end |
| 14 | | |
| 15 | | it "delegates calls to the given object" do |
| 16 | | @obj.should_receive(:foo).with(1) |
| 17 | | @obj.should_receive(:bar).with(2) |
| 18 | | @obj.should_receive(:baz).with(3) |
| 19 | | |
| 20 | | @delegator.foo(1) |
| 21 | | @delegator.bar(2) |
| 22 | | @delegator.baz(3) |
| 23 | | end |
| 24 | | |
| 25 | | it "returns the value from calls to the delegate object" do |
| 26 | | input_value = 42 |
| 27 | | output_value = 420 |
| 28 | | |
| 29 | | @obj.should_receive(:spiffy).with(input_value).and_return(input_value * 10) |
| 30 | | @delegator.spiffy(input_value).should == output_value |
| 31 | | end |
| 32 | | |
| 33 | | it "captures exceptions in the delegate and raises them for the caller" do |
| 34 | | ex = "crash!" |
| 35 | | |
| 36 | | @obj.should_receive(:crashy_method).and_raise(ex) |
| 37 | | proc { @delegator.crashy_method }.should raise_error(ex) |
| 38 | | end |
| 39 | | |
| 40 | | it "passes blocks along to the delegate" do |
| 41 | | prc = proc { "yay" } |
| 42 | | |
| 43 | | @obj.should_receive(:blocky).with(&prc) |
| 44 | | @delegator.blocky(&prc) |
| 45 | | end |
| 46 | | end |
| 47 | 0 | \ No newline at end of file |
| ... | ...@@ -45,9 +45,9 @@ |
| 45 | 45 | |
| 46 | 46 | # Encode lines using the current delimiter |
| 47 | 47 | def encode(*data) |
| 48 | | data.reduce("") { |str, d| str << d << @delimiter } |
| 48 | data.inject("") { |str, d| str << d << @delimiter } |
| 49 | 49 | end |
| 50 | 50 | end |
| 51 | 51 | end |
| 52 | 52 | end |
| 53 | | |
| 54 | 53 | \ No newline at end of file |
| 54 | |
| ... | ...@@ -49,7 +49,7 @@ |
| 49 | 49 | |
| 50 | 50 | # Send a packet with a specified size prefix |
| 51 | 51 | def encode(*data) |
| 52 | | data.reduce('') do |s, d| |
| 52 | data.inject('') do |s, d| |
| 53 | 53 | raise ArgumentError, 'packet too long for prefix length' if d.size >= 256 ** @prefix_size |
| 54 | 54 | s << [d.size].pack(@prefix_size == 2 ? 'n' : 'N') << d |
| 55 | 55 | end |
| ... | ...@@ -4,7 +4,7 @@ |
| 4 | 4 | # See file LICENSE for details |
| 5 | 5 | #++ |
| 6 | 6 | |
| 7 | | require File.dirname(__FILE__) + '/../lib/revactor/tcp' |
| 7 | require File.dirname(__FILE__) + '/../lib/revactor' |
| 8 | 8 | |
| 9 | 9 | TEST_HOST = '127.0.0.1' |
| 10 | 10 | |
| ... | ...@@ -61,4 +61,4 @@ |
| 61 | 61 | |
| 62 | 62 | s1.close |
| 63 | 63 | end |
| 64 | | end |
| 65 | 64 | \ No newline at end of file |
| 65 | end |
To list