mailbox 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -3,3 +3,5 @@ rdoc/*
3
3
  **/*.swp
4
4
  mailbox.iws
5
5
  .rakeTasks
6
+ TAGS
7
+ run_tags.rb
@@ -1,4 +1,5 @@
1
1
  ---
2
- :minor: 1
3
2
  :major: 0
4
- :patch: 6
3
+ :minor: 1
4
+ :patch: 7
5
+ :build:
@@ -75,10 +75,14 @@ module Mailbox
75
75
  # will be a +mailslot+. If <tt>:channel</tt> is provided
76
76
  # the next method will become a subscriber on the channel.
77
77
  # Channel based +mailslot+ methods are also made private
78
- # to discourage direct invocation
78
+ # to discourage direct invocation. <tt>:exception</tt>
79
+ # can be provided as the symbol for a method to handle
80
+ # any exceptions that occur in your +mailslot+. This
81
+ # method will be passed the exception that was raised
79
82
  def mailslot(params={})
80
83
  @next_channel_name = params[:channel]
81
84
  @replyable = params[:replyable]
85
+ @exception = params[:exception]
82
86
  @mailslot = true
83
87
  end
84
88
 
@@ -104,8 +108,16 @@ module Mailbox
104
108
  alias_method :"__#{method_name}__", method_name
105
109
  @is_adding_mailbox_to_method = true
106
110
 
111
+ exception_method, @exception = @exception, nil
107
112
  define_method( method_name, lambda do |*args|
108
- __fiber__.execute { self.send(:"__#{method_name}__", *args ) }
113
+ __fiber__.execute do
114
+ begin
115
+ self.send(:"__#{method_name}__", *args )
116
+ rescue Exception => ex
117
+ raise if exception_method.nil?
118
+ self.send(:"#{exception_method}", ex)
119
+ end
120
+ end
109
121
  end )
110
122
 
111
123
  @is_adding_mailbox_to_method = false
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mailbox}
8
- s.version = "0.1.6"
8
+ s.version = "0.1.7"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Joel Friedman", "Patrick Farley"]
12
- s.date = %q{2010-01-05}
12
+ s.date = %q{2010-02-26}
13
13
  s.description = %q{Mailbox is a JRuby module that simplifies concurrency and is backed by JVM threads.}
14
14
  s.email = %q{asher.friedman@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -20,7 +20,34 @@ class MailboxTest < Test::Unit::TestCase
20
20
 
21
21
  assert( latch.await( 1, Latches::TimeUnit::SECONDS ), "Timed out" )
22
22
  assert_not_equal JThread.current_thread.name, thread_info[:name]
23
+ end
24
+
25
+ def test_can_set_mailslot_to_callback_on_exception
26
+ klass = Class.new do
27
+ include Mailbox
28
+
29
+ attr_accessor :ex
30
+
31
+ def initialize(latch)
32
+ @latch = latch
33
+ end
34
+
35
+ mailslot :exception => :handle_exception
36
+ def test_method
37
+ raise "test exception"
38
+ end
39
+
40
+ def handle_exception(ex)
41
+ @ex = ex
42
+ @latch.count_down
43
+ end
44
+ end
23
45
 
46
+ latch = Latches::CountDownLatch.new( 1 )
47
+ clazz = klass.new(latch)
48
+ clazz.test_method
49
+ assert( latch.await( 1, Latches::TimeUnit::SECONDS ), "Timed out" )
50
+ assert_equal "test exception", clazz.ex.message
24
51
  end
25
52
 
26
53
  def test_default_is_run_asynchronously
@@ -46,7 +73,6 @@ class MailboxTest < Test::Unit::TestCase
46
73
  ensure
47
74
  Mailbox.synchronous = false;
48
75
  end
49
-
50
76
  end
51
77
 
52
78
  def test_should_support_channels
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Friedman
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2010-01-05 00:00:00 -06:00
13
+ date: 2010-02-26 00:00:00 -06:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency