bumbleworks 0.0.29 → 0.0.30

Sign up to get free protection for your applications and to get access to all the features.
data/lib/bumbleworks.rb CHANGED
@@ -121,19 +121,19 @@ module Bumbleworks
121
121
  # sending it, so it can be properly stored in workitem fields (and
122
122
  # re-instantiated later).
123
123
  #
124
- def launch!(process_definition_name, options = {})
125
- extract_entity_from_options!(options)
126
- Bumbleworks::Ruote.launch(process_definition_name, options)
124
+ def launch!(process_definition_name, *args)
125
+ extract_entity_from_fields!(args.first || {})
126
+ Bumbleworks::Ruote.launch(process_definition_name, *args)
127
127
  end
128
128
 
129
129
  private
130
130
 
131
- def extract_entity_from_options!(options)
131
+ def extract_entity_from_fields!(fields)
132
132
  begin
133
- if entity = options.delete(:entity)
134
- options[:entity_id] = entity.respond_to?(:identifier) ? entity.identifier : entity.id
135
- options[:entity_type] = entity.class.name
136
- raise InvalidEntity, "Entity#id must be non-null" unless options[:entity_id]
133
+ if entity = fields.delete(:entity)
134
+ fields[:entity_id] = entity.respond_to?(:identifier) ? entity.identifier : entity.id
135
+ fields[:entity_type] = entity.class.name
136
+ raise InvalidEntity, "Entity#id must be non-null" unless fields[:entity_id]
137
137
  end
138
138
  rescue NoMethodError => e
139
139
  raise InvalidEntity, "Entity must respond to #id and #class.name"
@@ -1,5 +1,7 @@
1
1
  require "ruote"
2
2
 
3
+ Dir[File.join(File.dirname(__FILE__), 'ruote', 'exp', '*.rb')].each { |f| require f }
4
+
3
5
  module Bumbleworks
4
6
  class Ruote
5
7
  class CancelTimeout < StandardError; end
@@ -41,6 +43,7 @@ module Bumbleworks
41
43
  end
42
44
 
43
45
  def launch(name, *args)
46
+ set_catchall_if_needed
44
47
  dashboard.launch(dashboard.variables[name], *args)
45
48
  end
46
49
 
@@ -0,0 +1,17 @@
1
+ require 'ruote/exp/flow_expression'
2
+
3
+ module Ruote::Exp
4
+ class BroadcastEventExpression < FlowExpression
5
+ names :broadcast_event
6
+
7
+ def consider_tag
8
+ update_tree
9
+ h.updated_tree[1]['tag'] = attribute_text.to_s
10
+ super
11
+ end
12
+
13
+ def apply
14
+ reply_to_parent(h.applied_workitem)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ require 'ruote/exp/flow_expression'
2
+ require 'ruote/exp/fe_await'
3
+
4
+ module Ruote::Exp
5
+ class WaitForEventExpression < AwaitExpression
6
+ names :wait_for_event
7
+
8
+ def apply
9
+ update_tree
10
+ h.updated_tree[1]['global'] = true
11
+ h.updated_tree[1]['left_tag'] = attribute_text.to_s
12
+ h.updated_tree[1]['merge'] = 'drop'
13
+ super
14
+ end
15
+
16
+ def reply(workitem)
17
+ update_tree
18
+ if translated_where = attribute(:where, nil, :escape => true)
19
+ if translated_where.to_s == 'entities_match'
20
+ translated_where = '${f:entity_id} == ${f:receiver.entity_id} && ${f:entity_type} == ${f:receiver.entity_type}'
21
+ else
22
+ translated_where.gsub!('${event:', '${f:')
23
+ translated_where.gsub!('${this:', '${f:receiver.')
24
+ end
25
+ h.updated_tree[1]['where'] = translated_where
26
+ end
27
+ workitem['fields']['receiver'] = h.applied_workitem['fields']
28
+ super
29
+ end
30
+ end
31
+ end
@@ -1,3 +1,3 @@
1
1
  module Bumbleworks
2
- VERSION = "0.0.29"
2
+ VERSION = "0.0.30"
3
3
  end
@@ -0,0 +1,24 @@
1
+ describe Ruote::Exp::BroadcastEventExpression do
2
+ before :each do
3
+ Bumbleworks.reset!
4
+ Bumbleworks.storage = {}
5
+ Bumbleworks.start_worker!
6
+ Bumbleworks.dashboard.add_service('tracer', @tracer = Tracer.new)
7
+ end
8
+
9
+ it 'uses attribute text as tag' do
10
+ Bumbleworks.define_process 'waiter' do
11
+ await :left_tag => :the_event, :global => true
12
+ echo 'amazing'
13
+ end
14
+
15
+ Bumbleworks.define_process 'sender' do
16
+ broadcast_event :the_event
17
+ end
18
+
19
+ waiter = Bumbleworks.launch!('waiter')
20
+ sender = Bumbleworks.launch!('sender')
21
+ Bumbleworks.dashboard.wait_for(waiter)
22
+ @tracer.should == ['amazing']
23
+ end
24
+ end
@@ -0,0 +1,79 @@
1
+ describe Ruote::Exp::WaitForEventExpression do
2
+ before :each do
3
+ Bumbleworks.reset!
4
+ Bumbleworks.storage = {}
5
+ Bumbleworks.start_worker!
6
+ Bumbleworks.dashboard.add_service('tracer', @tracer = Tracer.new)
7
+ end
8
+
9
+ it 'waits for event' do
10
+ Bumbleworks.define_process 'waiter' do
11
+ concurrence :wait_for => 2 do
12
+ sequence do
13
+ wait_for_event :nothing_ever_happens_to_me
14
+ echo 'nothing'
15
+ end
16
+ sequence do
17
+ wait_for_event :yay_it_happened
18
+ echo 'yay'
19
+ end
20
+ sequence do
21
+ wait_for_event /^yay/
22
+ noop
23
+ echo 'yay2'
24
+ end
25
+ end
26
+ end
27
+
28
+ Bumbleworks.define_process 'sender' do
29
+ echo 'get ready', :tag => 'not yet'
30
+ echo 'oh my gosh almost there'
31
+ echo 'hello', :tag => 'yay_it_happened'
32
+ end
33
+
34
+ waiter = Bumbleworks.launch!('waiter')
35
+ sender = Bumbleworks.launch!('sender')
36
+ Bumbleworks.dashboard.wait_for(waiter)
37
+ @tracer.should == ['get ready', 'oh my gosh almost there', 'hello', 'yay', 'yay2']
38
+ end
39
+
40
+ it 'checks where clause' do
41
+ Bumbleworks.define_process 'waiter' do
42
+ wait_for_event :the_event, :where => '${this:special} == ${event:special}'
43
+ echo 'specials! ${f:special}'
44
+ end
45
+
46
+ Bumbleworks.define_process 'sender' do
47
+ noop :tag => 'the_event'
48
+ end
49
+
50
+ waiter1 = Bumbleworks.launch!('waiter', 'special' => 1)
51
+ waiter2 = Bumbleworks.launch!('waiter', 'special' => 2)
52
+ waiter3 = Bumbleworks.launch!('waiter', 'special' => 3)
53
+ sender1 = Bumbleworks.launch!('sender', 'not_special' => 1)
54
+ sender2 = Bumbleworks.launch!('sender', 'special' => 3)
55
+
56
+ Bumbleworks.dashboard.wait_for(waiter3)
57
+ @tracer.should == ['specials! 3']
58
+ end
59
+
60
+ it 'checks entity match' do
61
+ Bumbleworks.define_process 'waiter' do
62
+ wait_for_event :the_event, :where => :entities_match
63
+ echo 'entities! ${f:entity_type},${f:entity_id}'
64
+ end
65
+
66
+ Bumbleworks.define_process 'sender' do
67
+ noop :tag => 'the_event'
68
+ end
69
+
70
+ waiter1 = Bumbleworks.launch!('waiter', 'entity_type' => 'Pigeon', 'entity_id' => 1)
71
+ waiter2 = Bumbleworks.launch!('waiter', 'entity_type' => 'Rhubarb', 'entity_id' => 2)
72
+ waiter3 = Bumbleworks.launch!('waiter', 'entity_type' => 'Rhubarb', 'entity_id' => 1)
73
+ sender1 = Bumbleworks.launch!('sender', 'entity_type' => 'Pigeon', 'entity_id' => 2)
74
+ sender2 = Bumbleworks.launch!('sender', 'entity_type' => 'Rhubarb', 'entity_id' => 1)
75
+
76
+ Bumbleworks.dashboard.wait_for(waiter3)
77
+ @tracer.should == ['entities! Rhubarb,1']
78
+ end
79
+ end
@@ -1,11 +1,11 @@
1
1
  describe Bumbleworks::Ruote do
2
2
  before :each do
3
3
  Bumbleworks.reset!
4
+ Bumbleworks.storage = {}
4
5
  end
5
6
 
6
7
  describe ".cancel_all_processes!" do
7
8
  before :each do
8
- Bumbleworks.storage = {}
9
9
  Bumbleworks::Ruote.register_participants
10
10
  Bumbleworks.start_worker!
11
11
  end
@@ -43,7 +43,6 @@ describe Bumbleworks::Ruote do
43
43
 
44
44
  describe ".kill_all_processes!" do
45
45
  before :each do
46
- Bumbleworks.storage = {}
47
46
  Bumbleworks::Ruote.register_participants
48
47
  Bumbleworks.start_worker!
49
48
  end
@@ -83,24 +82,20 @@ describe Bumbleworks::Ruote do
83
82
  end
84
83
 
85
84
  it 'creates a new dashboard' do
86
- Bumbleworks.storage = {}
87
85
  described_class.dashboard.should be_an_instance_of(Ruote::Dashboard)
88
86
  end
89
87
 
90
88
  it 'does not start a worker by default' do
91
- Bumbleworks.storage = {}
92
89
  described_class.dashboard.worker.should be_nil
93
90
  end
94
91
 
95
92
  it 'starts a worker if :start_worker option is true' do
96
- Bumbleworks.storage = {}
97
93
  described_class.dashboard(:start_worker => true).worker.should_not be_nil
98
94
  end
99
95
  end
100
96
 
101
97
  describe '.start_worker!' do
102
98
  it 'adds new worker to dashboard and returns worker' do
103
- Bumbleworks.storage = {}
104
99
  described_class.dashboard.worker.should be_nil
105
100
  new_worker = described_class.start_worker!
106
101
  new_worker.should be_an_instance_of(Ruote::Worker)
@@ -108,7 +103,6 @@ describe Bumbleworks::Ruote do
108
103
  end
109
104
 
110
105
  it 'joins current thread if :join option is true' do
111
- Bumbleworks.storage = {}
112
106
  ::Ruote::Dashboard.stub(:new).and_return(dash_double = double('dash', :worker => nil))
113
107
  dash_double.should_receive(:noisy=).with(false)
114
108
  dash_double.should_receive(:join)
@@ -116,7 +110,6 @@ describe Bumbleworks::Ruote do
116
110
  end
117
111
 
118
112
  it 'returns if :join option not true' do
119
- Bumbleworks.storage = {}
120
113
  ::Ruote::Dashboard.stub(:new).and_return(dash_double = double('dash', :worker => nil))
121
114
  dash_double.should_receive(:noisy=).with(false)
122
115
  dash_double.should_receive(:join).never
@@ -124,7 +117,6 @@ describe Bumbleworks::Ruote do
124
117
  end
125
118
 
126
119
  it 'sets dashboard to noisy if :verbose option true' do
127
- Bumbleworks.storage = {}
128
120
  ::Ruote::Dashboard.stub(:new).and_return(dash_double = double('dash', :worker => nil))
129
121
  dash_double.should_receive(:noisy=).with(true)
130
122
  described_class.start_worker!(:verbose => true)
@@ -139,7 +131,6 @@ describe Bumbleworks::Ruote do
139
131
  catchall 'NewCatchall'
140
132
  }
141
133
 
142
- Bumbleworks.storage = {}
143
134
  described_class.dashboard.participant_list.should be_empty
144
135
  described_class.register_participants &registration_block
145
136
  described_class.dashboard.participant_list.should have(4).items
@@ -152,7 +143,6 @@ describe Bumbleworks::Ruote do
152
143
  catchall
153
144
  }
154
145
 
155
- Bumbleworks.storage = {}
156
146
  described_class.dashboard.participant_list.should be_empty
157
147
  described_class.register_participants &registration_block
158
148
  described_class.dashboard.participant_list.should have(2).items
@@ -160,7 +150,6 @@ describe Bumbleworks::Ruote do
160
150
  end
161
151
 
162
152
  it 'adds catchall participant if block is nil' do
163
- Bumbleworks.storage = {}
164
153
  described_class.dashboard.participant_list.should be_empty
165
154
  described_class.register_participants &nil
166
155
  described_class.dashboard.participant_list.should have(1).item
@@ -170,6 +159,7 @@ describe Bumbleworks::Ruote do
170
159
 
171
160
  describe '.storage' do
172
161
  it 'raise error when storage is not defined' do
162
+ Bumbleworks.storage = nil
173
163
  expect { described_class.send(:storage) }.to raise_error Bumbleworks::UndefinedSetting
174
164
  end
175
165
 
@@ -180,4 +170,22 @@ describe Bumbleworks::Ruote do
180
170
  described_class.send(:storage)
181
171
  end
182
172
  end
173
+
174
+ describe '.launch' do
175
+ before :each do
176
+ @pdef = Bumbleworks.define_process 'foo' do; end
177
+ end
178
+
179
+ it 'tells dashboard to launch process' do
180
+ described_class.dashboard.should_receive(:launch).with(@pdef.tree, 'variable' => 'neat')
181
+ described_class.launch('foo', 'variable' => 'neat')
182
+ end
183
+
184
+ it 'sets catchall if needed' do
185
+ described_class.dashboard.participant_list.should be_empty
186
+ described_class.launch('foo')
187
+ described_class.dashboard.participant_list.should have(1).item
188
+ described_class.dashboard.participant_list.first.classname.should == 'Bumbleworks::StorageParticipant'
189
+ end
190
+ end
183
191
  end
@@ -403,7 +403,7 @@ describe Bumbleworks::Task do
403
403
  end
404
404
 
405
405
  it 'does not raise an error if attempting to claim by same token' do
406
- expect{@task.claim('boss')}.not_to raise_error described_class::AlreadyClaimed
406
+ expect{@task.claim('boss')}.not_to raise_error
407
407
  end
408
408
 
409
409
  it 'calls before_claim and after_claim callbacks' do
@@ -142,9 +142,14 @@ describe Bumbleworks do
142
142
  Bumbleworks.launch!(:amazing_process, :hugs => :love)
143
143
  end
144
144
 
145
+ it 'sends all args along' do
146
+ Bumbleworks::Ruote.should_receive(:launch).with(:amazing_process, { :hugs => :love }, { :whiny => :yup }, :peahen)
147
+ Bumbleworks.launch!(:amazing_process, { :hugs => :love }, { :whiny => :yup }, :peahen)
148
+ end
149
+
145
150
  it 'expands entity params when entity object provided' do
146
- Bumbleworks::Ruote.should_receive(:launch).with(:amazing_process, :entity_id => :wiley_e_coyote, :entity_type => 'LovelyEntity')
147
- Bumbleworks.launch!(:amazing_process, :entity => LovelyEntity.new(:wiley_e_coyote))
151
+ Bumbleworks::Ruote.should_receive(:launch).with(:amazing_process, { :entity_id => :wiley_e_coyote, :entity_type => 'LovelyEntity' }, :et_cetera)
152
+ Bumbleworks.launch!(:amazing_process, { :entity => LovelyEntity.new(:wiley_e_coyote) }, :et_cetera)
148
153
  end
149
154
 
150
155
  it 'uses "identifier" method instead of id, if entity has one' do
@@ -0,0 +1,14 @@
1
+ class Tracer
2
+ def initialize
3
+ @trace = []
4
+ end
5
+
6
+ def << s
7
+ s.strip! if s.is_a?(String)
8
+ @trace << s
9
+ end
10
+
11
+ def == other
12
+ @trace == other
13
+ end
14
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bumbleworks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.29
4
+ version: 0.0.30
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2013-07-24 00:00:00.000000000 Z
15
+ date: 2013-08-09 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: ruote
@@ -173,6 +173,8 @@ files:
173
173
  - lib/bumbleworks/process_definition.rb
174
174
  - lib/bumbleworks/rake_tasks.rb
175
175
  - lib/bumbleworks/ruote.rb
176
+ - lib/bumbleworks/ruote/exp/broadcast_event_expression.rb
177
+ - lib/bumbleworks/ruote/exp/wait_for_event_expression.rb
176
178
  - lib/bumbleworks/simple_logger.rb
177
179
  - lib/bumbleworks/storage_adapter.rb
178
180
  - lib/bumbleworks/storage_participant.rb
@@ -205,6 +207,8 @@ files:
205
207
  - spec/lib/bumbleworks/local_participant_spec.rb
206
208
  - spec/lib/bumbleworks/participant_registration_spec.rb
207
209
  - spec/lib/bumbleworks/process_definition_spec.rb
210
+ - spec/lib/bumbleworks/ruote/exp/broadcast_event_expression_spec.rb
211
+ - spec/lib/bumbleworks/ruote/exp/wait_for_event_expression_spec.rb
208
212
  - spec/lib/bumbleworks/ruote_spec.rb
209
213
  - spec/lib/bumbleworks/simple_logger_spec.rb
210
214
  - spec/lib/bumbleworks/storage_adapter_spec.rb
@@ -215,6 +219,7 @@ files:
215
219
  - spec/lib/bumbleworks_spec.rb
216
220
  - spec/spec_helper.rb
217
221
  - spec/support/path_helpers.rb
222
+ - spec/support/tracer.rb
218
223
  homepage: ''
219
224
  licenses:
220
225
  - MIT
@@ -262,6 +267,8 @@ test_files:
262
267
  - spec/lib/bumbleworks/local_participant_spec.rb
263
268
  - spec/lib/bumbleworks/participant_registration_spec.rb
264
269
  - spec/lib/bumbleworks/process_definition_spec.rb
270
+ - spec/lib/bumbleworks/ruote/exp/broadcast_event_expression_spec.rb
271
+ - spec/lib/bumbleworks/ruote/exp/wait_for_event_expression_spec.rb
265
272
  - spec/lib/bumbleworks/ruote_spec.rb
266
273
  - spec/lib/bumbleworks/simple_logger_spec.rb
267
274
  - spec/lib/bumbleworks/storage_adapter_spec.rb
@@ -272,4 +279,5 @@ test_files:
272
279
  - spec/lib/bumbleworks_spec.rb
273
280
  - spec/spec_helper.rb
274
281
  - spec/support/path_helpers.rb
282
+ - spec/support/tracer.rb
275
283
  has_rdoc: