mailbox 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,27 +1,36 @@
1
1
  require "rubygems"
2
2
  require "rake/testtask"
3
+ require "rake/rdoctask"
3
4
  require "jeweler"
4
5
 
5
6
  task :default => :test
6
7
 
7
8
  Rake::TestTask.new do |t|
8
- t.libs << "test"
9
- t.test_files = FileList['test/**/*_test.rb']
10
- t.verbose = true
9
+ t.libs << "test"
10
+ t.test_files = FileList['test/**/*_test.rb']
11
+ t.verbose = true
11
12
  end
12
13
 
13
14
  Jeweler::Tasks.new do |gemspec|
14
- gemspec.name = "mailbox"
15
- gemspec.summary = "Mailbox is a JRuby module that simplifies concurrency and is backed by JVM threads."
16
- gemspec.description = gemspec.summary
17
- gemspec.email = "asher.friedman@gmail.com"
18
- gemspec.homepage = "http://joelash.github.com/mailbox"
19
- gemspec.authors = ["Joel Friedman", "Patrick Farley"]
20
-
21
- gemspec.rubyforge_project = "mailbox"
15
+ gemspec.name = "mailbox"
16
+ gemspec.summary = "Mailbox is a JRuby module that simplifies concurrency and is backed by JVM threads."
17
+ gemspec.description = gemspec.summary
18
+ gemspec.email = "asher.friedman@gmail.com"
19
+ gemspec.homepage = "http://joelash.github.com/mailbox"
20
+ gemspec.authors = ["Joel Friedman", "Patrick Farley"]
21
+
22
+ gemspec.add_dependency "jretlang"
23
+
24
+ gemspec.rubyforge_project = "mailbox"
22
25
  end
23
26
 
24
27
  Jeweler::RubyforgeTasks.new do |rubyforge|
25
- rubyforge.doc_task = "rdoc"
28
+ rubyforge.doc_task = "rdoc"
29
+ end
30
+
31
+ Rake::RDocTask.new do |rdoc|
32
+ rdoc.main = "README"
33
+ rdoc.rdoc_files.include("README", "lib/**/*.rb")
34
+ rdoc.rdoc_dir = "rdoc"
26
35
  end
27
36
 
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :minor: 1
3
3
  :major: 0
4
- :patch: 0
4
+ :patch: 1
data/lib/mailbox.rb CHANGED
@@ -1,78 +1,94 @@
1
1
  require 'rubygems'
2
2
  require 'jretlang'
3
3
 
4
+ # Author:: Joel Friedman and Patrick Farley
5
+
6
+ # This module is used to simplify the using concurrency
7
+ # in your application. Using JVM threads as the backing
8
+ # a function can set to become an asynchronous function
9
+ # to be used in a actor-model method. Or a function
10
+ # can be set to be the backing of a named channel
11
+ # (jretlang channels are used here).
4
12
  module Mailbox
5
13
 
14
+ # Register your jretlang channel as a named channel
15
+ def register_channel(channel_name, channel)
16
+ channel_registry = self.class.__channel_registry__
17
+ channel_registry.each_pair { |key, value| __subscribe__(channel, key) if value == channel_name }
18
+ end
19
+
20
+ private
21
+
6
22
  def self.included(base)
7
- base.extend(Mailbox::ClassMethods)
8
- end
9
-
10
- def register_channel(channel_name, channel)
11
- channel_registry = self.class.__channel_registry__
12
- channel_registry.each_pair { |key, value| __subscribe__(channel, key) if value == channel_name }
13
- end
14
-
15
- def __subscribe__(channel, method)
16
- channel.subscribe_on_fiber(__fiber__) { |*args| self.send(method, *args) }
17
- end
23
+ base.extend(Mailbox::ClassMethods)
24
+ end
25
+
26
+ def __subscribe__(channel, method)
27
+ channel.subscribe_on_fiber(__fiber__) { |*args| self.send(method, *args) }
28
+ end
18
29
 
19
30
  def __started_fiber__
20
- fiber = JRL::Fiber.new
21
- fiber.start
22
- fiber
31
+ fiber = JRL::Fiber.new
32
+ fiber.start
33
+ fiber
23
34
  end
24
35
 
25
36
  def __fiber__
26
- @fiber ||= __started_fiber__
37
+ @fiber ||= __started_fiber__
27
38
  end
28
39
 
29
- module ClassMethods
40
+ module ClassMethods
41
+
42
+ attr_accessor :__channel_registry__
30
43
 
31
- attr_accessor :__channel_registry__
44
+ # Notifies Mailbox that the next method added
45
+ # will be a 'mailslot'. If :channel is provided
46
+ # then it'll become a subscriber on that channel
47
+ def mailslot(params={})
48
+ @next_channel_name = params[:channel]
49
+ @mailslot = true
50
+ end
32
51
 
33
- def mailslot(params={})
34
- @next_channel_name = params[:channel]
35
- @mailslot = true
36
- end
52
+ private
37
53
 
38
- def method_added(method_name, &block)
39
- return if @adding_mailbox_to_method == method_name
54
+ def method_added(method_name, &block)
55
+ return if @adding_mailbox_to_method == method_name
40
56
 
41
- unless @mailslot == true
42
- private method_name
43
- return
44
- end
57
+ unless @mailslot == true
58
+ private method_name
59
+ return
60
+ end
45
61
 
46
- @mailslot = false
62
+ @mailslot = false
47
63
 
48
- if @next_channel_name.nil?
49
- __setup_on_fiber__(method_name)
50
- else
51
- __setup_on_channel__(method_name)
52
- end
64
+ if @next_channel_name.nil?
65
+ __setup_on_fiber__(method_name)
66
+ else
67
+ __setup_on_channel__(method_name)
68
+ end
53
69
 
54
- end
70
+ end
55
71
 
56
- def __setup_on_fiber__(method_name)
57
- alias_method :"__#{method_name}__", method_name
72
+ def __setup_on_fiber__(method_name)
73
+ alias_method :"__#{method_name}__", method_name
58
74
 
59
- @adding_mailbox_to_method = method_name
75
+ @adding_mailbox_to_method = method_name
60
76
 
61
- define_method( method_name, lambda do |*args|
62
- __fiber__.execute { self.send(:"__#{method_name}__", *args ) }
63
- end )
77
+ define_method( method_name, lambda do |*args|
78
+ __fiber__.execute { self.send(:"__#{method_name}__", *args ) }
79
+ end )
64
80
 
65
- @adding_mailbox_to_method = nil
66
- end
81
+ @adding_mailbox_to_method = nil
82
+ end
67
83
 
68
- def __setup_on_channel__(method_name)
69
- private method_name
70
- @__channel_registry__ ||= {}
71
- __channel_registry__[method_name] = @next_channel_name
72
- @next_channel_name = nil
73
- end
84
+ def __setup_on_channel__(method_name)
85
+ private method_name
86
+ @__channel_registry__ ||= {}
87
+ __channel_registry__[method_name] = @next_channel_name
88
+ @next_channel_name = nil
89
+ end
90
+
91
+ end
74
92
 
75
- end
76
-
77
93
  end
78
94
 
data/mailbox.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mailbox}
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
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{2009-10-13}
12
+ s.date = %q{2009-10-18}
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 = [
@@ -38,8 +38,11 @@ Gem::Specification.new do |s|
38
38
  s.specification_version = 3
39
39
 
40
40
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
41
+ s.add_runtime_dependency(%q<jretlang>, [">= 0"])
41
42
  else
43
+ s.add_dependency(%q<jretlang>, [">= 0"])
42
44
  end
43
45
  else
46
+ s.add_dependency(%q<jretlang>, [">= 0"])
44
47
  end
45
48
  end
data/test/mailbox_test.rb CHANGED
@@ -4,71 +4,70 @@ require 'test/unit'
4
4
  require File.dirname(__FILE__) + "/../lib/mailbox"
5
5
 
6
6
  module Latches
7
- include_package 'java.util.concurrent'
7
+ include_package 'java.util.concurrent'
8
8
  end
9
9
 
10
10
  class MailboxTest < Test::Unit::TestCase
11
11
 
12
- def test_mailslot_causes_execution_on_separate_thread
13
-
14
- klass = Class.new do
15
- include Mailbox
16
-
17
- mailslot
18
- def test_method(latch, thread_ids)
19
- thread_ids << Thread.current.object_id
20
- latch.count_down
21
- end
22
- end
23
-
24
- thread_ids = []
25
- latch = Latches::CountDownLatch.new( 1 )
26
- klass.new.test_method(latch, thread_ids)
27
-
28
- assert( latch.await( 1, Latches::TimeUnit::SECONDS ), "Timed out" )
29
- assert_not_equal Thread.current.object_id, thread_ids.first
30
-
31
- end
32
-
33
- def test_non_mailslot_methods_become_private
34
-
35
- klass = Class.new do
36
- include Mailbox
37
-
38
- def bar
39
- end
40
- end
41
-
42
- exception = assert_raise NoMethodError do
43
- klass.new.bar
44
- end
45
-
46
- assert_match /private method `bar'/, exception.message
47
- end
48
-
49
- def test_should_supports_channels
50
-
51
- klass = Class.new do
52
- include Mailbox
53
-
54
- def initialize(channel)
55
- register_channel :test_channel, channel
56
- end
57
-
58
- mailslot :channel => :test_channel
59
- def test_method(latch)
60
- latch.count_down
61
- end
62
- end
63
-
64
- thread_ids = []
65
- latch = Latches::CountDownLatch.new 1
66
- a_channel = JRL::Channel.new
67
-
68
- klass.new(a_channel)
12
+ def test_mailslot_causes_execution_on_separate_thread
13
+
14
+ klass = Class.new do
15
+ include Mailbox
16
+
17
+ mailslot
18
+ def test_method(latch, thread_ids)
19
+ thread_ids << Thread.current.object_id
20
+ latch.count_down
21
+ end
22
+ end
23
+
24
+ thread_ids = []
25
+ latch = Latches::CountDownLatch.new( 1 )
26
+ klass.new.test_method(latch, thread_ids)
27
+
28
+ assert( latch.await( 1, Latches::TimeUnit::SECONDS ), "Timed out" )
29
+ assert_not_equal Thread.current.object_id, thread_ids.first
30
+
31
+ end
32
+
33
+ def test_non_mailslot_methods_become_private
34
+
35
+ klass = Class.new do
36
+ include Mailbox
37
+
38
+ def bar
39
+ end
40
+ end
41
+
42
+ exception = assert_raise NoMethodError do
43
+ klass.new.bar
44
+ end
45
+
46
+ assert_match /private method `bar'/, exception.message
47
+ end
48
+
49
+ def test_should_supports_channels
50
+
51
+ klass = Class.new do
52
+ include Mailbox
53
+
54
+ def initialize(channel)
55
+ register_channel :test_channel, channel
56
+ end
57
+
58
+ mailslot :channel => :test_channel
59
+ def test_method(latch)
60
+ latch.count_down
61
+ end
62
+ end
63
+
64
+ latch = Latches::CountDownLatch.new 1
65
+ a_channel = JRL::Channel.new
66
+
67
+ klass.new(a_channel)
69
68
  a_channel.publish latch
70
-
71
- assert latch.await( 1, Latches::TimeUnit::SECONDS ), "Timed out"
69
+
70
+ assert latch.await( 1, Latches::TimeUnit::SECONDS ), "Timed out"
72
71
 
73
72
  end
74
73
 
metadata CHANGED
@@ -49,15 +49,24 @@ requirements: []
49
49
  authors:
50
50
  - Joel Friedman
51
51
  - Patrick Farley
52
- date: 2009-10-13 05:00:00 +00:00
52
+ date: 2009-10-18 05:00:00 +00:00
53
53
  platform: ruby
54
54
  test_files:
55
55
  - test/mailbox_test.rb
56
56
  version: !ruby/object:Gem::Version
57
- version: 0.1.0
57
+ version: 0.1.1
58
58
  require_paths:
59
59
  - lib
60
- dependencies: []
61
-
60
+ dependencies:
61
+ - !ruby/object:Gem::Dependency
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - '>='
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ version:
68
+ type: :runtime
69
+ version_requirement:
70
+ name: jretlang
62
71
  bindir: bin
63
72
  has_rdoc: true