celluloid 0.0.3 → 0.1.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/Rakefile DELETED
@@ -1,51 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
- require 'rake'
11
-
12
- require 'jeweler'
13
- Jeweler::Tasks.new do |gem|
14
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
- gem.name = "celluloid"
16
- gem.homepage = "http://github.com/tarcieri/celluloid"
17
- gem.license = "MIT"
18
- gem.summary = "Ruby concurrency made easy! Or at least, easier..."
19
- gem.description = "Celluloid is a concurrent object framework inspired by the Actor Model"
20
- gem.email = "tony@medioh.com"
21
- gem.authors = ["Tony Arcieri"]
22
-
23
- # Include your dependencies below. Runtime dependencies are required when using your gem,
24
- # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
25
- # gem.add_runtime_dependency 'jabber4r', '> 0.1'
26
- # gem.add_development_dependency 'rspec', '> 1.2.3'
27
- end
28
- Jeweler::RubygemsDotOrgTasks.new
29
-
30
- require 'rspec/core'
31
- require 'rspec/core/rake_task'
32
- RSpec::Core::RakeTask.new(:spec) do |spec|
33
- spec.pattern = FileList['spec/**/*_spec.rb']
34
- end
35
-
36
- RSpec::Core::RakeTask.new(:rcov) do |spec|
37
- spec.pattern = 'spec/**/*_spec.rb'
38
- spec.rcov = true
39
- end
40
-
41
- task :default => :spec
42
-
43
- require 'rake/rdoctask'
44
- Rake::RDocTask.new do |rdoc|
45
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
46
-
47
- rdoc.rdoc_dir = 'rdoc'
48
- rdoc.title = "celluloid #{version}"
49
- rdoc.rdoc_files.include('README*')
50
- rdoc.rdoc_files.include('lib/**/*.rb')
51
- end
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.0.3
@@ -1,85 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{celluloid}
8
- s.version = "0.0.3"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Tony Arcieri"]
12
- s.date = %q{2011-05-11}
13
- s.description = %q{Celluloid is a concurrent object framework inspired by the Actor Model}
14
- s.email = %q{tony@medioh.com}
15
- s.extra_rdoc_files = [
16
- "LICENSE.txt",
17
- "README.md"
18
- ]
19
- s.files = [
20
- ".autotest",
21
- ".document",
22
- ".rspec",
23
- "CHANGES.md",
24
- "Gemfile",
25
- "Gemfile.lock",
26
- "LICENSE.txt",
27
- "README.md",
28
- "Rakefile",
29
- "VERSION",
30
- "celluloid.gemspec",
31
- "lib/celluloid.rb",
32
- "lib/celluloid/actor.rb",
33
- "lib/celluloid/actor_proxy.rb",
34
- "lib/celluloid/calls.rb",
35
- "lib/celluloid/core_ext.rb",
36
- "lib/celluloid/events.rb",
37
- "lib/celluloid/future.rb",
38
- "lib/celluloid/linking.rb",
39
- "lib/celluloid/mailbox.rb",
40
- "lib/celluloid/registry.rb",
41
- "lib/celluloid/responses.rb",
42
- "lib/celluloid/supervisor.rb",
43
- "lib/celluloid/waker.rb",
44
- "spec/actor_spec.rb",
45
- "spec/future_spec.rb",
46
- "spec/mailbox_spec.rb",
47
- "spec/registry_spec.rb",
48
- "spec/spec_helper.rb",
49
- "spec/supervisor_spec.rb",
50
- "spec/waker_spec.rb"
51
- ]
52
- s.homepage = %q{http://github.com/tarcieri/celluloid}
53
- s.licenses = ["MIT"]
54
- s.require_paths = ["lib"]
55
- s.rubygems_version = %q{1.6.2}
56
- s.summary = %q{Ruby concurrency made easy! Or at least, easier...}
57
- s.test_files = [
58
- "spec/actor_spec.rb",
59
- "spec/future_spec.rb",
60
- "spec/mailbox_spec.rb",
61
- "spec/registry_spec.rb",
62
- "spec/spec_helper.rb",
63
- "spec/supervisor_spec.rb",
64
- "spec/waker_spec.rb"
65
- ]
66
-
67
- if s.respond_to? :specification_version then
68
- s.specification_version = 3
69
-
70
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
71
- s.add_development_dependency(%q<rspec>, [">= 2.3.0"])
72
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
73
- s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
74
- else
75
- s.add_dependency(%q<rspec>, [">= 2.3.0"])
76
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
77
- s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
78
- end
79
- else
80
- s.add_dependency(%q<rspec>, [">= 2.3.0"])
81
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
82
- s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
83
- end
84
- end
85
-
@@ -1,41 +0,0 @@
1
- module Celluloid
2
- class WakerError < StandardError; end # You can't wake the dead
3
-
4
- # Wakes up sleepy threads so that they can check their mailbox
5
- # Works like a ConditionVariable, except it's implemented as an IO object so
6
- # that it can be multiplexed alongside other IO objects.
7
- class Waker
8
- PAYLOAD = "\0" # the payload doesn't matter. each byte is a signal
9
- def initialize
10
- @receiver, @sender = IO.pipe
11
- end
12
-
13
- # Wakes up the thread that is waiting for this Waker
14
- def signal
15
- @sender << PAYLOAD
16
- nil
17
- rescue IOError, Errno::EPIPE, Errno::EBADF
18
- raise WakerError, "waker is already dead"
19
- end
20
-
21
- # Wait for another thread to signal this Waker
22
- def wait
23
- byte = @receiver.read(1)
24
- raise WakerError, "can't wait on a dead waker" unless byte == PAYLOAD
25
- rescue IOError
26
- raise WakerError, "can't wait on a dead waker"
27
- end
28
-
29
- # Return the IO object which will be readable when this Waker is signaled
30
- def io
31
- @receiver
32
- end
33
-
34
- # Clean up the IO objects associated with this waker
35
- def cleanup
36
- @receiver.close rescue nil
37
- @sender.close rescue nil
38
- nil
39
- end
40
- end
41
- end
@@ -1,141 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Celluloid::Actor do
4
- before do
5
- class MyActor
6
- include Celluloid::Actor
7
- attr_reader :name
8
-
9
- def initialize(name)
10
- @name = name
11
- end
12
-
13
- def change_name(new_name)
14
- @name = new_name
15
- end
16
-
17
- def greet
18
- "Hi, I'm #{@name}"
19
- end
20
-
21
- class Crash < StandardError; end
22
- def crash
23
- raise Crash, "the spec purposely crashed me :("
24
- end
25
-
26
- def crash_with_abort(reason)
27
- abort Crash.new(reason)
28
- end
29
- end
30
- end
31
-
32
- it "handles synchronous calls" do
33
- actor = MyActor.spawn "Troy McClure"
34
- actor.greet.should == "Hi, I'm Troy McClure"
35
- end
36
-
37
- it "raises NoMethodError when a nonexistent method is called" do
38
- actor = MyActor.spawn "Billy Bob Thornton"
39
-
40
- proc do
41
- actor.the_method_that_wasnt_there
42
- end.should raise_exception(NoMethodError)
43
- end
44
-
45
- it "reraises exceptions which occur during synchronous calls in the caller" do
46
- actor = MyActor.spawn "James Dean" # is this in bad taste?
47
-
48
- proc do
49
- actor.crash
50
- end.should raise_exception(MyActor::Crash)
51
- end
52
-
53
- it "raises exceptions in the caller when abort is called, but keeps running" do
54
- actor = MyActor.spawn "Al Pacino"
55
-
56
- proc do
57
- actor.crash_with_abort MyActor::Crash.new("You die motherfucker!")
58
- end.should raise_exception(MyActor::Crash)
59
-
60
- actor.should be_alive
61
- end
62
-
63
- it "raises DeadActorError if methods are synchronously called on a dead actor" do
64
- actor = MyActor.spawn "James Dean"
65
- actor.crash rescue nil
66
-
67
- proc do
68
- actor.greet
69
- end.should raise_exception(Celluloid::DeadActorError)
70
- end
71
-
72
- it "handles asynchronous calls" do
73
- actor = MyActor.spawn "Troy McClure"
74
- actor.change_name! "Charlie Sheen"
75
- actor.greet.should == "Hi, I'm Charlie Sheen"
76
- end
77
-
78
- it "knows when it's running as an actor" do
79
- obj = MyActor.new "I'm an object"
80
- obj.actor?.should be_false
81
-
82
- actor = MyActor.spawn "Troy McClure"
83
- actor.actor?.should be_true
84
- end
85
-
86
- it "inspects properly" do
87
- actor = MyActor.spawn "Troy McClure"
88
- actor.inspect.should match(/Celluloid::Actor\(MyActor/)
89
- actor.inspect.should include('@name="Troy McClure"')
90
- actor.inspect.should_not include("@celluloid")
91
- end
92
-
93
- context :linking do
94
- before :each do
95
- @kevin = MyActor.spawn "Kevin Bacon" # Some six degrees action here
96
- @charlie = MyActor.spawn "Charlie Sheen"
97
- end
98
-
99
- it "links to other actors" do
100
- @kevin.link @charlie
101
- @kevin.linked_to?(@charlie).should be_true
102
- @charlie.linked_to?(@kevin).should be_true
103
- end
104
-
105
- it "unlinks from other actors" do
106
- @kevin.link @charlie
107
- @kevin.unlink @charlie
108
-
109
- @kevin.linked_to?(@charlie).should be_false
110
- @charlie.linked_to?(@kevin).should be_false
111
- end
112
-
113
- it "traps exit messages from other actors" do
114
- class Boss # like a boss
115
- include Celluloid::Actor
116
- trap_exit :lambaste_subordinate
117
-
118
- def initialize(name)
119
- @name = name
120
- @subordinate_lambasted = false
121
- end
122
-
123
- def subordinate_lambasted?; @subordinate_lambasted; end
124
-
125
- def lambaste_subordinate(actor, reason)
126
- @subordinate_lambasted = true
127
- end
128
- end
129
-
130
- chuck = Boss.spawn "Chuck Lorre"
131
- chuck.link @charlie
132
-
133
- proc do
134
- @charlie.crash
135
- end.should raise_exception(MyActor::Crash)
136
-
137
- sleep 0.1 # hax to prevent a race between exit handling and the next call
138
- chuck.should be_subordinate_lambasted
139
- end
140
- end
141
- end
@@ -1,20 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Celluloid::Future do
4
- it "creates future objects that can be retrieved later" do
5
- future = Celluloid::Future() { 40 + 2 }
6
- future.value.should == 42
7
- end
8
-
9
- it "passes arguments to future blocks" do
10
- future = Celluloid::Future(40) { |n| n + 2 }
11
- future.value.should == 42
12
- end
13
-
14
- it "reraises exceptions that occur when the value is retrieved" do
15
- class ExampleError < StandardError; end
16
-
17
- future = Celluloid::Future() { raise ExampleError, "oh noes crash!" }
18
- proc { future.value }.should raise_exception(ExampleError)
19
- end
20
- end
@@ -1,50 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class TestEvent < Celluloid::SystemEvent; end
4
-
5
- describe Celluloid::Mailbox do
6
- before :each do
7
- @mailbox = Celluloid::Mailbox.new
8
- end
9
-
10
- it "receives messages" do
11
- message = :ohai
12
-
13
- @mailbox << message
14
- @mailbox.receive.should == message
15
- end
16
-
17
- it "raises system events when received" do
18
- @mailbox.system_event TestEvent.new("example")
19
-
20
- proc do
21
- @mailbox.receive
22
- end.should raise_exception(TestEvent)
23
- end
24
-
25
- it "prioritizes system events over other messages" do
26
- @mailbox << :dummy1
27
- @mailbox << :dummy2
28
- @mailbox.system_event TestEvent.new("example")
29
-
30
- proc do
31
- @mailbox.receive
32
- end.should raise_exception(TestEvent)
33
- end
34
-
35
- it "selectively receives messages with a block" do
36
- class Foo; end
37
- class Bar; end
38
- class Baz; end
39
-
40
- foo, bar, baz = Foo.new, Bar.new, Baz.new
41
-
42
- @mailbox << baz
43
- @mailbox << foo
44
- @mailbox << bar
45
-
46
- @mailbox.receive { |msg| msg.is_a? Foo }.should == foo
47
- @mailbox.receive { |msg| msg.is_a? Bar }.should == bar
48
- @mailbox.receive.should == baz
49
- end
50
- end
@@ -1,22 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Celluloid::Registry do
4
- class Marilyn
5
- include Celluloid::Actor
6
-
7
- def sing_for(person)
8
- "o/~ Happy birthday, #{person}"
9
- end
10
- end
11
-
12
- it "registers Actors" do
13
- Celluloid::Actor[:marilyn] = Marilyn.spawn
14
- Celluloid::Actor[:marilyn].sing_for("Mr. President").should == "o/~ Happy birthday, Mr. President"
15
- end
16
-
17
- it "refuses to register non-Actors" do
18
- proc do
19
- Celluloid::Actor[:impostor] = Object.new
20
- end.should raise_error(ArgumentError)
21
- end
22
- end
@@ -1,9 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
- $LOAD_PATH.unshift File.dirname(__FILE__)
3
-
4
- require 'rspec'
5
- require 'celluloid'
6
-
7
- # Requires supporting files with custom matchers and macros, etc,
8
- # in ./support/ and its subdirectories.
9
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
@@ -1,94 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Celluloid::Supervisor do
4
- before do
5
- class SubordinateDead < StandardError; end
6
-
7
- class Subordinate
8
- include Celluloid::Actor
9
- attr_reader :state
10
-
11
- def initialize(state)
12
- @state = state
13
- end
14
-
15
- def crack_the_whip
16
- case @state
17
- when :idle
18
- @state = :working
19
- else raise SubordinateDead, "the spec purposely crashed me :("
20
- end
21
- end
22
- end
23
- end
24
-
25
- it "restarts actors when they die" do
26
- supervisor = Celluloid::Supervisor.supervise(Subordinate, :idle)
27
- subordinate = supervisor.actor
28
- subordinate.state.should == :idle
29
-
30
- subordinate.crack_the_whip
31
- subordinate.state.should == :working
32
-
33
- proc do
34
- subordinate.crack_the_whip
35
- end.should raise_exception(SubordinateDead)
36
- sleep 0.1 # hax to prevent race :(
37
- subordinate.should_not be_alive
38
-
39
- new_subordinate = supervisor.actor
40
- new_subordinate.should_not == subordinate
41
- new_subordinate.state.should == :idle
42
- end
43
-
44
- it "registers actors and reregisters them when they die" do
45
- supervisor = Celluloid::Supervisor.supervise_as(:subordinate, Subordinate, :idle)
46
- subordinate = Celluloid::Actor[:subordinate]
47
- subordinate.state.should == :idle
48
-
49
- subordinate.crack_the_whip
50
- subordinate.state.should == :working
51
-
52
- proc do
53
- subordinate.crack_the_whip
54
- end.should raise_exception(SubordinateDead)
55
- sleep 0.1 # hax to prevent race :(
56
- subordinate.should_not be_alive
57
-
58
- new_subordinate = Celluloid::Actor[:subordinate]
59
- new_subordinate.should_not == subordinate
60
- new_subordinate.state.should == :idle
61
- end
62
-
63
- it "creates supervisors via Actor.supervise" do
64
- supervisor = Subordinate.supervise(:working)
65
- subordinate = supervisor.actor
66
- subordinate.state.should == :working
67
-
68
- proc do
69
- subordinate.crack_the_whip
70
- end.should raise_exception(SubordinateDead)
71
- sleep 0.1 # hax to prevent race :(
72
- subordinate.should_not be_alive
73
-
74
- new_subordinate = supervisor.actor
75
- new_subordinate.should_not == subordinate
76
- new_subordinate.state.should == :working
77
- end
78
-
79
- it "creates supervisors and registers actors via Actor.supervise_as" do
80
- supervisor = Subordinate.supervise_as(:subordinate, :working)
81
- subordinate = Celluloid::Actor[:subordinate]
82
- subordinate.state.should == :working
83
-
84
- proc do
85
- subordinate.crack_the_whip
86
- end.should raise_exception(SubordinateDead)
87
- sleep 0.1 # hax to prevent race :(
88
- subordinate.should_not be_alive
89
-
90
- new_subordinate = supervisor.actor
91
- new_subordinate.should_not == subordinate
92
- new_subordinate.state.should == :working
93
- end
94
- end