dramatis 0.0.1

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.
Files changed (120) hide show
  1. data/History.txt +7 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +119 -0
  4. data/README.txt +57 -0
  5. data/Rakefile +4 -0
  6. data/config/hoe.rb +70 -0
  7. data/config/requirements.rb +17 -0
  8. data/examples/README.txt +20 -0
  9. data/examples/auction.rb +90 -0
  10. data/examples/bank/bank.rb +7 -0
  11. data/examples/bank/bank_test.rb +7 -0
  12. data/examples/exception.rb +40 -0
  13. data/examples/fib/conservative.rb +50 -0
  14. data/examples/fib/future.rb +5 -0
  15. data/examples/fib/original.rb +33 -0
  16. data/examples/fib/threads.rb +51 -0
  17. data/examples/im/distributed/chat/client.rb +49 -0
  18. data/examples/im/distributed/chat/screen/fox.rb +92 -0
  19. data/examples/im/distributed/chat/screen.rb +11 -0
  20. data/examples/im/distributed/chat/server.rb +72 -0
  21. data/examples/im/distributed/chat.rb +5 -0
  22. data/examples/im/distributed/client.rb +9 -0
  23. data/examples/im/distributed/run.rb +18 -0
  24. data/examples/im/distributed/server.rb +11 -0
  25. data/examples/im/single/chat/client.rb +50 -0
  26. data/examples/im/single/chat/screen/fox.rb +96 -0
  27. data/examples/im/single/chat/screen/wxs.rb +63 -0
  28. data/examples/im/single/chat/screen.rb +11 -0
  29. data/examples/im/single/chat/server.rb +72 -0
  30. data/examples/im/single/chat.rb +5 -0
  31. data/examples/im/single/fox.rb +18 -0
  32. data/examples/im/single/wxchat.rb +19 -0
  33. data/examples/pingpong/actor.rb +33 -0
  34. data/examples/pingpong/actor_rec.rb +34 -0
  35. data/examples/pingpong/pingpong.txt +315 -0
  36. data/examples/pingpong/scala.rb +41 -0
  37. data/examples/pingpong/serial.rb +26 -0
  38. data/examples/pretty.txt +108 -0
  39. data/examples/telephone/.irbrc +2 -0
  40. data/examples/telephone/3esl.txt +21877 -0
  41. data/examples/telephone/fifth/kid.rb +36 -0
  42. data/examples/telephone/fifth/run.rb +26 -0
  43. data/examples/telephone/first/kid.rb +31 -0
  44. data/examples/telephone/first/run.rb +20 -0
  45. data/examples/telephone/fourth/kid.rb +31 -0
  46. data/examples/telephone/fourth/run.rb +26 -0
  47. data/examples/telephone/mangler.rb +53 -0
  48. data/examples/telephone/second/kid.rb +26 -0
  49. data/examples/telephone/second/run.rb +20 -0
  50. data/examples/telephone/seventh/kid.rb +40 -0
  51. data/examples/telephone/seventh/run.rb +35 -0
  52. data/examples/telephone/seventh/test.rb +28 -0
  53. data/examples/telephone/seventh/test2.rb +10 -0
  54. data/examples/telephone/sixth/kid.rb +39 -0
  55. data/examples/telephone/sixth/run.rb +26 -0
  56. data/examples/telephone/third/kid.rb +31 -0
  57. data/examples/telephone/third/run.rb +21 -0
  58. data/lib/dramatis/actor/interface.rb +118 -0
  59. data/lib/dramatis/actor/name/interface.rb +128 -0
  60. data/lib/dramatis/actor/name.rb +44 -0
  61. data/lib/dramatis/actor.rb +96 -0
  62. data/lib/dramatis/deadlock.rb +123 -0
  63. data/lib/dramatis/error/uncaught.rb +19 -0
  64. data/lib/dramatis/error.rb +125 -0
  65. data/lib/dramatis/future/interface.rb +45 -0
  66. data/lib/dramatis/future.rb +32 -0
  67. data/lib/dramatis/runtime/actor/main.rb +3 -0
  68. data/lib/dramatis/runtime/actor.rb +294 -0
  69. data/lib/dramatis/runtime/gate.rb +244 -0
  70. data/lib/dramatis/runtime/scheduler.rb +374 -0
  71. data/lib/dramatis/runtime/task.rb +390 -0
  72. data/lib/dramatis/runtime/thread_pool.rb +149 -0
  73. data/lib/dramatis/runtime/timer.rb +5 -0
  74. data/lib/dramatis/runtime.rb +129 -0
  75. data/lib/dramatis/shoes/runtime.rb +7 -0
  76. data/lib/dramatis/shoes.rb +14 -0
  77. data/lib/dramatis/version.rb +8 -0
  78. data/lib/dramatis.rb +73 -0
  79. data/log/debug.log +0 -0
  80. data/script/destroy +14 -0
  81. data/script/generate +14 -0
  82. data/script/txt2html +74 -0
  83. data/setup.rb +1585 -0
  84. data/spec/dramatis/actor/become_spec.rb +17 -0
  85. data/spec/dramatis/actor/future_spec.rb +189 -0
  86. data/spec/dramatis/actor/name_spec.rb +141 -0
  87. data/spec/dramatis/actor/task_spec.rb +75 -0
  88. data/spec/dramatis/actor_spec.rb +492 -0
  89. data/spec/dramatis/dramatis_spec.rb +23 -0
  90. data/spec/dramatis/exc_spec.rb +78 -0
  91. data/spec/dramatis/runtime/gate_spec.rb +57 -0
  92. data/spec/dramatis/runtime/thread_pool.rb +30 -0
  93. data/spec/dramatis/shoes_spec.rb +11 -0
  94. data/spec/dramatis/simple_spec.rb +32 -0
  95. data/spec/exp_spec.rb +21 -0
  96. data/spec/simple2_spec.rb +36 -0
  97. data/spec/simple_spec.rb +30 -0
  98. data/spec/spec.opts +0 -0
  99. data/spec/spec_helper.rb +26 -0
  100. data/spec/thread_spec.rb +13 -0
  101. data/tasks/deployment.rake +34 -0
  102. data/tasks/environment.rake +7 -0
  103. data/tasks/rspec.rake +21 -0
  104. data/tasks/website.rake +17 -0
  105. data/test/jruby_lm.rb +13 -0
  106. data/test/test.rb +19 -0
  107. data/test/test10.rb +43 -0
  108. data/test/test11.rb +45 -0
  109. data/test/test12.rb +60 -0
  110. data/test/test13.rb +71 -0
  111. data/test/test2.rb +12 -0
  112. data/test/test3.rb +10 -0
  113. data/test/test4.rb +29 -0
  114. data/test/test5.rb +8 -0
  115. data/test/test6.rb +32 -0
  116. data/test/test7.rb +48 -0
  117. data/test/test8.rb +133 -0
  118. data/test/test9.rb +105 -0
  119. data/test/test_exc.rb +22 -0
  120. metadata +180 -0
@@ -0,0 +1,17 @@
1
+ describe "become" do
2
+
3
+ after do
4
+ begin
5
+ Dramatis::Runtime.current.quiesce
6
+ Dramatis::Runtime.current.exceptions.length.should equal( 0 )
7
+ Thread.list.length.should equal( 1 )
8
+ ensure
9
+ Dramatis::Runtime.reset
10
+ end
11
+ end
12
+
13
+ it "should forward messages on become"
14
+
15
+ it "should do something with the patterns on become"
16
+
17
+ end
@@ -0,0 +1,189 @@
1
+ require File.join( File.dirname(__FILE__), "..", "..", '/spec_helper.rb' )
2
+
3
+ require 'dramatis/actor'
4
+ require 'dramatis/future'
5
+
6
+ # NB: don't use the module name here: rspec wants to include described
7
+ # modules ... and making the result into an actor, well, needless to say,
8
+ # it's not a good idea
9
+
10
+ describe "Dramatis::Actor" do
11
+
12
+ include Dramatis
13
+
14
+ include DramatisSpecHelper
15
+
16
+ after(:each) { runtime_check }
17
+
18
+ it "should allow future names to be created" do
19
+
20
+ object = Object.new
21
+ actor = Dramatis::Actor.new object
22
+
23
+ future_name = future( actor )
24
+
25
+ end
26
+
27
+ it "should return a future when used" do
28
+
29
+ object = mock Object.new
30
+ object.should_receive(:foo).with(:bar).and_return(:foobar)
31
+ actor = Dramatis::Actor.new object
32
+
33
+ future_name = future( actor )
34
+
35
+ x = future_name.foo :bar
36
+
37
+ x.should be_kind_of( Dramatis::Future )
38
+
39
+ end
40
+
41
+ it "should evalute to the right value when used" do
42
+
43
+ object = mock Object.new
44
+ object.should_receive(:foo).with(:bar).and_return(:foobar)
45
+ actor = Dramatis::Actor.new object
46
+
47
+ future_name = future( actor )
48
+
49
+ x = future_name.foo :bar
50
+
51
+ x.should be_kind_of( Dramatis::Future )
52
+ x.to_sym.should equal( :foobar )
53
+
54
+ end
55
+
56
+ it "should raise as appropriate" do
57
+
58
+ object = Object.new
59
+ actor = Dramatis::Actor.new object
60
+
61
+ future_name = future( actor )
62
+
63
+ x = future_name.bar :bar
64
+
65
+ x.should be_kind_of( Dramatis::Future )
66
+
67
+ lambda { x.to_sym }.should raise_error( NoMethodError )
68
+
69
+ end
70
+
71
+ it "should act like an object ... to the extent possible" do
72
+
73
+ object = mock Object.new
74
+ object.should_receive(:foo).with(:bar).and_return(12345)
75
+ actor = Dramatis::Actor.new object
76
+
77
+ future_name = future( actor )
78
+
79
+ x = future_name.foo :bar
80
+
81
+ x.should be_kind_of( Dramatis::Future )
82
+ ( x + 0 ).should == 12345
83
+ ( 0 + x ).should == 12345
84
+
85
+ end
86
+
87
+ it "should have a value interface" do
88
+ object = mock Object.new
89
+ object.should_receive(:foo).with(:bar).and_return(12345)
90
+ actor = Dramatis::Actor.new object
91
+
92
+ future_name = future( actor )
93
+
94
+ x = future_name.foo :bar
95
+
96
+ x.should be_kind_of( Dramatis::Future )
97
+
98
+ x = interface( x ).value
99
+
100
+ x.should be_kind_of( Fixnum )
101
+
102
+ x.should == 12345
103
+
104
+ end
105
+
106
+ it "should have a ready? interface" do
107
+ aClass = Class.new do
108
+ include Dramatis::Actor
109
+ def initialize
110
+ actor.always :ready?, true
111
+ @state = nil
112
+ @future = nil
113
+ end
114
+ def caller callee
115
+ @future = future( callee ).callee
116
+ end
117
+ def ready?
118
+ interface( @future ).ready?
119
+ end
120
+ def value
121
+ interface( @future ).value
122
+ end
123
+ end
124
+
125
+ bClass = Class.new do
126
+ include Dramatis::Actor
127
+ attr_reader :state
128
+ def initialize
129
+ actor.refuse :callee
130
+ end
131
+ def allow
132
+ actor.default :callee
133
+ end
134
+ def callee
135
+ :foobar
136
+ end
137
+ end
138
+
139
+ a = aClass.new
140
+ b = bClass.new
141
+
142
+ a.caller b
143
+
144
+ a.ready?.should be_false
145
+
146
+ b.allow
147
+
148
+ Dramatis::Runtime.current.quiesce
149
+
150
+ a.ready?.should be_true
151
+
152
+ a.value.should equal( :foobar )
153
+
154
+ end
155
+
156
+ it "should evalute to the right value when used with a delay" do
157
+
158
+ aClass = Class.new do
159
+ include Dramatis::Actor
160
+ def inititialize
161
+ actor.always :state
162
+ @state = nil
163
+ @future = nil
164
+ end
165
+ def caller callee
166
+ @future = future( callee ).callee
167
+ end
168
+ end
169
+
170
+ bClass = Class.new do
171
+ include Dramatis::Actor
172
+ attr_reader :state
173
+ def initialize
174
+ actor.refuse :callee
175
+ end
176
+ def allow
177
+ actor.default :callee
178
+ end
179
+ def callee
180
+ :foobar
181
+ end
182
+ end
183
+
184
+ a = aClass.new
185
+ b = bClass.new
186
+
187
+ end
188
+
189
+ end
@@ -0,0 +1,141 @@
1
+ require File.join( File.dirname(__FILE__), "..", "..", '/spec_helper.rb' )
2
+
3
+ require 'dramatis/runtime'
4
+ require 'dramatis'
5
+ require 'dramatis/actor/name'
6
+
7
+ describe Dramatis do
8
+
9
+ include Dramatis
10
+
11
+ include DramatisSpecHelper
12
+
13
+ after(:each) { runtime_check }
14
+
15
+ it "should return NoMethodError as appropriate" do
16
+ actor = Dramatis::Actor.new Object.new
17
+ lambda { actor.foo }.should raise_error( NoMethodError )
18
+ end
19
+
20
+ it "should recreate errors rather just forward them(?)"
21
+
22
+ it "should block other methods during a continuation"
23
+
24
+ it "should be creatable unbound" do
25
+ Dramatis::Actor.new
26
+ end
27
+
28
+ it "should allow messages to unbound" do
29
+ lambda { Dramatis::Actor.new.foo }.
30
+ should raise_error( Dramatis::Deadlock )
31
+ end
32
+
33
+ it "should be creatable bound" do
34
+ name = Dramatis::Actor.new Object.new
35
+ name.should be_kind_of( Dramatis::Actor::Name )
36
+ end
37
+
38
+ it "should allow and execute messages to bound names" do
39
+ object = mock Object.new
40
+ object.should_receive(:foo).with(:bar).and_return(:foobar)
41
+ name = Dramatis::Actor.new object
42
+ result = name.foo :bar
43
+ result.should equal( :foobar )
44
+ end
45
+
46
+ it "should deliver messages with nil continuations" do
47
+ object = mock(Object.new)
48
+ object.should_receive(:foo).with(:bar)
49
+ name = Dramatis::Actor.new object
50
+ interface( name ).continue(nil).foo( :bar )
51
+ end
52
+
53
+ it "should have a nice short method for casts" do
54
+ object = mock(Object.new)
55
+ object.should_receive(:foo).with(:bar)
56
+ name = Dramatis::Actor.new object
57
+ release( name ).foo( :bar )
58
+ end
59
+
60
+ it "should suport cast from the object interface"
61
+
62
+ it "shouldn't be possible to bind twice" do
63
+ name = Dramatis::Actor.new
64
+ interface( name ).bind Object.new
65
+ lambda { interface( name ).bind Object.new }.should raise_error( Dramatis::Error::Bind )
66
+ end
67
+
68
+ it "should allow and execute block continuations" do
69
+
70
+ actor = Object.new
71
+ name = Dramatis::Actor.new actor
72
+ actor.should_receive(:foo).with(:bar).and_return(:foobar)
73
+
74
+ result = nil
75
+ retval = ( interface( name ).continue { |value| result = value } ).foo :bar
76
+ retval.should be_nil
77
+ result.should be_nil
78
+ result.should be_nil # to perhaps highlight a threading problem
79
+
80
+ Dramatis::Runtime.current.quiesce
81
+
82
+ result.should equal( :foobar )
83
+
84
+ end
85
+
86
+ it "should execute messages to unbound names once bound" do
87
+
88
+ name = Dramatis::Actor.new
89
+
90
+ object = mock(Object.new)
91
+ object.should_receive(:foo).with(:bar).and_return(:foobar)
92
+
93
+ result = nil
94
+
95
+ retval = ( interface( name ).continue { |value| result = value } ).foo :bar
96
+
97
+ retval.should be_nil
98
+ result.should be_nil
99
+
100
+ Dramatis::Runtime.current.quiesce
101
+
102
+ result.should be_nil
103
+
104
+ interface( name ).bind object
105
+
106
+ Dramatis::Runtime.current.quiesce
107
+
108
+ result.should equal( :foobar )
109
+
110
+ end
111
+
112
+ it "rpc binds should return an actor name" do
113
+ name = Dramatis::Actor.new
114
+ retval = Dramatis.interface( name ).bind Hash.new
115
+ retval.should be_kind_of( Dramatis::Actor::Name )
116
+ end
117
+
118
+ it "should be possible to bind with a non-rpc continuation" do
119
+ name = Dramatis::Actor.new
120
+ result = nil
121
+ name = interface( name ).continue { |v| result = v }
122
+ retval = interface( name ).bind Object.new
123
+ retval.should equal( nil )
124
+ result.should equal( nil )
125
+ Dramatis::Runtime.current.quiesce
126
+ result.should_not be_nil
127
+ end
128
+
129
+ it "should provide a url, if asked" do
130
+ actor = Dramatis::Actor.new Object.new
131
+ url = interface( actor ).url
132
+ url.should match( %r[http://] )
133
+ end
134
+
135
+ it "unbound names should queue messages and deliver them in order"
136
+
137
+ it "messages should be delivered out of order sometimes"
138
+
139
+ it "flushing should guarantee message order"
140
+
141
+ end
@@ -0,0 +1,75 @@
1
+ require File.join( File.dirname(__FILE__), "..", "..", '/spec_helper.rb' )
2
+
3
+ require 'dramatis/runtime/task'
4
+ require 'dramatis/actor'
5
+
6
+ describe Dramatis::Runtime::Task do
7
+
8
+ include Dramatis
9
+
10
+ include DramatisSpecHelper
11
+
12
+ after(:each) { runtime_check }
13
+
14
+ it "should return errors to calling actor even when non-rpc (non-main)" do
15
+ callerClass = Class.new do
16
+ include Dramatis::Actor
17
+ def initalize
18
+ @exception = nil
19
+ end
20
+ def caller callee
21
+ release( callee ).callee
22
+ end
23
+ def dramatis_exception e
24
+ @exception = e
25
+ end
26
+ def exception
27
+ raise @exception if @exception
28
+ end
29
+ end
30
+
31
+ caller = callerClass.new
32
+ callee = Dramatis::Actor.new Object.new
33
+
34
+ caller.caller callee
35
+
36
+ Dramatis::Runtime.current.quiesce
37
+
38
+ lambda { caller.exception }.should raise_error( NoMethodError )
39
+ end
40
+
41
+ it "should do something reasonable when the caller is main" do
42
+ callee = Dramatis::Actor.new Object.new
43
+ lambda { callee.callee }.should raise_error( NoMethodError )
44
+ release( callee ).callee
45
+ Dramatis::Runtime.current.warnings = false
46
+ lambda { Dramatis::Runtime.current.quiesce }.should raise_error( Dramatis::Error::Uncaught )
47
+ Dramatis::Runtime.current.warnings = true
48
+ Dramatis::Runtime.current.exceptions.length.should equal( 1 )
49
+ Dramatis::Runtime.current.clear_exceptions
50
+ end
51
+
52
+ it "should default to global when no dramatis_exception defined" do
53
+ callerClass = Class.new do
54
+ include Dramatis::Actor
55
+ def caller callee
56
+ release( callee ).callee
57
+ end
58
+ end
59
+
60
+ caller = callerClass.new
61
+ callee = Dramatis::Actor.new Object.new
62
+
63
+ Dramatis::Runtime.current.warnings = false
64
+ caller.caller callee
65
+ lambda { Dramatis::Runtime.current.quiesce }.should raise_error( Dramatis::Error::Uncaught )
66
+ Dramatis::Runtime.current.warnings = true
67
+
68
+ lambda { raise Dramatis::Runtime.current.exceptions[0] }.should raise_error( NoMethodError )
69
+ Dramatis::Runtime.current.clear_exceptions
70
+
71
+ end
72
+
73
+ it "should call dramatis_exception on main if that works(?)"
74
+
75
+ end