em-scenario 0.0.2 → 0.0.3

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 (3) hide show
  1. data/README.md +109 -2
  2. data/lib/scenario.rb +57 -5
  3. metadata +8 -8
data/README.md CHANGED
@@ -10,16 +10,123 @@ Ruby 1.9.2 is used, it may work with ruby 1.8.x
10
10
  Tools
11
11
  -----
12
12
 
13
- The specs provide nice example of usage.
14
-
15
13
  ### Quorum
16
14
 
17
15
  Do something when n actions are done.
18
16
 
17
+ ```ruby
18
+ EM.run do
19
+ quorum(5) do |nextStep|
20
+ 5.times do |i|
21
+ EM.add_timer(Random.rand(0.1)) do
22
+ nextStep.call
23
+ end
24
+ end
25
+ end.finally do
26
+ assert true
27
+ EM.stop
28
+ end
29
+ end
30
+
31
+ ```
32
+
33
+ ### AdNauseum
34
+
35
+ ```ruby
36
+ EM.run do
37
+ cpt = 0
38
+ adnauseum do |nextStep|
39
+ EM.add_timer(Random.rand(0.1)) do
40
+ cpt += 1
41
+ nextStep.call
42
+ end
43
+ end.until do
44
+ cpt > 5
45
+ end.finally do
46
+ assert true
47
+ EM.stop
48
+ end
49
+ end
50
+ ```
51
+
19
52
  ### AbInitio
20
53
 
21
54
  Act sequentialy, from the start.
22
55
 
56
+ ```ruby
57
+ EM.run do
58
+ txt = ""
59
+ abinitio do |sequence|
60
+ sequence.then do |nextStep|
61
+ EM.add_timer(Random.rand(0.1)) do
62
+ txt = "Hello "
63
+ nextStep.call
64
+ end
65
+ end.then do |nextStep|
66
+ EM.add_timer(Random.rand(0.1)) do
67
+ txt += "World"
68
+ nextStep.call
69
+ end
70
+ end.then do |nextStep|
71
+ EM.add_timer(Random.rand(0.1)) do
72
+ txt.upcase!
73
+ nextStep.call
74
+ end
75
+ end
76
+ end.finally do
77
+ assert "HELLO WORLD" == txt
78
+ EM.stop
79
+ end
80
+ end
81
+ ```
82
+
23
83
  ### AdLib
24
84
 
25
85
  Repeat an action, seqentillay.
86
+
87
+ ```ruby
88
+ EM.run do
89
+ stack = []
90
+ adlib(5) do |nextStep, i|
91
+ stack << i
92
+ EM.add_timer(Random.rand(0.1)) do
93
+ nextStep.call
94
+ end
95
+ end.finally do
96
+ assert true
97
+ assert [0,1,2,3,4] == stack
98
+ EM.stop
99
+ end
100
+ end
101
+ ```
102
+
103
+ ### QuantumSatis
104
+
105
+ Not so many parallel actions
106
+
107
+ ```ruby
108
+ EM.run do
109
+ stack = []
110
+ quantumsatis(5, 2) do |nextStep, i, workers|
111
+ assert workers <= 2
112
+ EM.add_timer(Random.rand(0.1)) do
113
+ stack << i
114
+ nextStep.call
115
+ end
116
+ end.finally do
117
+ assert (0..4).to_a == stack.sort
118
+ EM.stop
119
+ end
120
+ end
121
+ ```
122
+
123
+ Todo
124
+ ----
125
+
126
+ * Chain all commands
127
+ * Alias in plain old english
128
+
129
+ Licence
130
+ -------
131
+
132
+ Released under the LGPL license.
data/lib/scenario.rb CHANGED
@@ -4,6 +4,10 @@ module EventMachine
4
4
  # @see http://en.wikipedia.org/wiki/List_of_Latin_phrases
5
5
  module Scenario
6
6
 
7
+ class Scenario
8
+
9
+ end
10
+
7
11
  # from the start
8
12
  class AbInitio
9
13
  include EM::Deferrable
@@ -45,7 +49,7 @@ module EventMachine
45
49
  end
46
50
 
47
51
  #Trigger when a quota of actions is done
48
- class Quorum
52
+ class Quorum < Scenario
49
53
  include EM::Deferrable
50
54
 
51
55
  def initialize times, &block
@@ -61,13 +65,56 @@ module EventMachine
61
65
 
62
66
  protected
63
67
  def nextStep
64
- if @times == 0
65
- self.succeed
68
+ @times -= 1
69
+ self.succeed(self) if @times == 0
70
+ end
71
+ end
72
+
73
+ # As much as enough.
74
+ # You wont lots of parralel workers, but not too much.
75
+ class QuantumSatis
76
+ include EM::Deferrable
77
+
78
+ def initialize times, throttle=nil, &block
79
+ @opened = 0
80
+ @finished = 0
81
+ @worker = 0
82
+ @times = times
83
+ @throttle = throttle
84
+ @loop = block
85
+ @debug = false
86
+ end
87
+
88
+ def finally &block
89
+ self.callback &block
90
+ if @throttle
91
+ @throttle.times{ call }
66
92
  else
67
- @times -= 1
68
- @loop.call( Proc.new {nextStep} )
93
+ @times.times{ call }
69
94
  end
70
95
  end
96
+
97
+ protected
98
+ def call
99
+ @worker += 1
100
+ @loop.call Proc.new{nextStep}, @opened, @worker
101
+ @opened += 1
102
+ if @debug
103
+ puts "worker: #{@worker} opened: #{@opened} finished: #{@finished}"
104
+ end
105
+ end
106
+
107
+ def nextStep
108
+ puts "ending" if @debug
109
+ @finished += 1
110
+ @worker -= 1
111
+ if @finished == @times
112
+ self.succeed
113
+ else
114
+ call if @opened < @times
115
+ end
116
+ end
117
+
71
118
  end
72
119
 
73
120
  # Repeat sequentially an action
@@ -96,6 +143,7 @@ module EventMachine
96
143
  end
97
144
  end
98
145
 
146
+ # Until sick. Act again and again, until criteria
99
147
  class AdNauseum
100
148
  include EM::Deferrable
101
149
 
@@ -141,3 +189,7 @@ end
141
189
  def adnauseum(&block)
142
190
  EventMachine::Scenario::AdNauseum.new &block
143
191
  end
192
+
193
+ def quantumsatis(times, throttle=nil, &block)
194
+ EventMachine::Scenario::QuantumSatis.new times, throttle, &block
195
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-scenario
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-06 00:00:00.000000000 Z
12
+ date: 2011-09-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
16
- requirement: &2152000200 !ruby/object:Gem::Requirement
16
+ requirement: &2152103240 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - =
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.0.0.beta3
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152000200
24
+ version_requirements: *2152103240
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: minitest
27
- requirement: &2151999100 !ruby/object:Gem::Requirement
27
+ requirement: &2152099300 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '2.0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2151999100
35
+ version_requirements: *2152099300
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &2151998320 !ruby/object:Gem::Requirement
38
+ requirement: &2152093220 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2151998320
46
+ version_requirements: *2152093220
47
47
  description: Handling simpler story with event machine's callback
48
48
  email: mathieu@garambrogne.net
49
49
  executables: []