bumbleworks 0.0.54 → 0.0.55

Sign up to get free protection for your applications and to get access to all the features.
data/lib/bumbleworks.rb CHANGED
@@ -12,6 +12,7 @@ require "bumbleworks/error_handler"
12
12
  require "bumbleworks/entity"
13
13
  require "bumbleworks/participant"
14
14
  require "bumbleworks/workitem"
15
+ require "bumbleworks/tracker"
15
16
 
16
17
  # default implementations
17
18
  require "bumbleworks/simple_logger"
@@ -18,7 +18,7 @@ module Bumbleworks
18
18
  return nil unless process_status
19
19
  workitems = leaves.map(&:applied_workitem).map { |wi| Bumbleworks::Workitem.new(wi) }
20
20
  if workitems.map(&:entity_fields).uniq.length == 1
21
- workitems.first.entity
21
+ workitems.first.entity if workitems.first.has_entity?
22
22
  else
23
23
  raise EntityConflict
24
24
  end
@@ -29,17 +29,19 @@ module Bumbleworks
29
29
  end
30
30
 
31
31
  def trackers
32
- Bumbleworks.dashboard.get_trackers.values.select { |attrs|
32
+ Bumbleworks.dashboard.get_trackers.select { |tid, attrs|
33
33
  attrs['msg']['fei'] && attrs['msg']['fei']['wfid'] == id
34
+ }.map { |tid, original_hash|
35
+ Bumbleworks::Tracker.new(tid, original_hash)
34
36
  }
35
37
  end
36
38
 
37
39
  def all_subscribed_tags
38
- events = trackers.inject({}) do |memo, t|
39
- if t['wfid'].nil?
40
- (memo[:global] ||= []).concat t['conditions']['tag']
40
+ trackers.inject({ :global => [] }) do |memo, t|
41
+ if t.global?
42
+ memo[:global].concat t.tags
41
43
  else
42
- (memo[t['wfid']] ||= []).concat t['conditions']['tag']
44
+ (memo[t.wfid] ||= []).concat t.tags
43
45
  end
44
46
  memo
45
47
  end
@@ -0,0 +1,53 @@
1
+ module Bumbleworks
2
+ class Tracker
3
+ attr_reader :id, :original_hash
4
+
5
+ def initialize(id, original_hash = nil)
6
+ @id = id
7
+ @original_hash = original_hash || Bumbleworks.dashboard.get_trackers[id]
8
+ end
9
+
10
+ def wfid
11
+ wfid = fei ? fei['wfid'] : @original_hash['wfid']
12
+ end
13
+
14
+ def process
15
+ if wfid_from_hash = wfid
16
+ Bumbleworks::Process.new(wfid_from_hash)
17
+ end
18
+ end
19
+
20
+ def global?
21
+ @original_hash['wfid'].nil?
22
+ end
23
+
24
+ def conditions
25
+ @original_hash['conditions'] || {}
26
+ end
27
+
28
+ def tags
29
+ [conditions['tag']].flatten.compact
30
+ end
31
+
32
+ def action
33
+ @original_hash['action']
34
+ end
35
+
36
+ def waiting_expression
37
+ return nil unless fei
38
+ process.expressions.detect { |e| e.fei.expid == fei['expid'] }.tree
39
+ end
40
+
41
+ def where_clause
42
+ we = waiting_expression
43
+ return nil unless we
44
+ we[1]['where']
45
+ end
46
+
47
+ private
48
+
49
+ def fei
50
+ @original_hash['msg']['fei']
51
+ end
52
+ end
53
+ end
@@ -1,3 +1,3 @@
1
1
  module Bumbleworks
2
- VERSION = "0.0.54"
2
+ VERSION = "0.0.55"
3
3
  end
@@ -0,0 +1,85 @@
1
+ def fake_trackers
2
+ {
3
+ "on_error" => {
4
+ "wfid" => nil,
5
+ "action" => "error_intercepted",
6
+ "id" => "on_error",
7
+ "conditions" => nil,
8
+ "msg" => {
9
+ "action" => "launch",
10
+ "wfid" => "replace",
11
+ "tree" => [ "define", {}, [["error_dispatcher",{},[]]] ],
12
+ "workitem" => "replace",
13
+ "variables" => "compile"
14
+ }
15
+ },
16
+ "global_tracker" => {
17
+ "wfid" => nil,
18
+ "action" => "left_tag",
19
+ "id" => "global_tracker",
20
+ "conditions" => { "tag" => [ "the_event" ] },
21
+ "msg" => {
22
+ "action" => "reply",
23
+ "fei" => {
24
+ "engine_id" => "engine",
25
+ "wfid" => "my_wfid",
26
+ "subid" => "dc6cff8c33746836353224d7b3d10b4b",
27
+ "expid" => "0_0_0"
28
+ },
29
+ "workitem" => "replace",
30
+ "flavour" => "await"
31
+ }
32
+ },
33
+ "local_tracker" => {
34
+ "wfid" => "my_wfid",
35
+ "action" => "left_tag",
36
+ "id" => "local_tracker",
37
+ "conditions" => { "tag" => [ "local_event" ] },
38
+ "msg" => {
39
+ "action" => "reply",
40
+ "fei" => {
41
+ "engine_id" => "engine",
42
+ "wfid" => "my_wfid",
43
+ "subid" => "8cb9de101dbc38e3f375a277d025c170",
44
+ "expid" => "0_0_1"
45
+ },
46
+ "workitem" => "replace",
47
+ "flavour" => "await"
48
+ }
49
+ },
50
+ "local_error_intercept" => {
51
+ "wfid" => "my_wfid",
52
+ "action" => "error_intercepted",
53
+ "id" => "local_error_intercept",
54
+ "conditions" => { "message" => [ "/bad/" ] },
55
+ "msg" => {
56
+ "action" => "reply",
57
+ "fei" => {
58
+ "engine_id" => "engine",
59
+ "wfid" => "my_wfid",
60
+ "subid" => "e4bb9b945b829019b9f1fcd266fb5bd8",
61
+ "expid" => "0_0_2"
62
+ },
63
+ "workitem" => "replace",
64
+ "flavour" => "await"
65
+ }
66
+ },
67
+ "participant_tracker" => {
68
+ "wfid" => "my_wfid",
69
+ "action" => "dispatch",
70
+ "id" => "participant_tracker",
71
+ "conditions" => { "participant_name" => [ "goose", "bunnies" ] },
72
+ "msg" => {
73
+ "action" => "reply",
74
+ "fei" => {
75
+ "engine_id" => "engine",
76
+ "wfid" => "my_wfid",
77
+ "subid" => "6ddfe62d9aa2a25d8928de987c24caf1",
78
+ "expid" => "0_0_3"
79
+ },
80
+ "workitem" => "replace",
81
+ "flavour" => "await"
82
+ }
83
+ }
84
+ }
85
+ end
@@ -11,6 +11,7 @@ describe Bumbleworks::Process do
11
11
  concurrence do
12
12
  wait_for_event :an_invitation
13
13
  await :left_tag => 'a_friend'
14
+ await :participant => 'some_darling_cat'
14
15
  end
15
16
  end
16
17
  Bumbleworks.define_process 'straightening_the_rocks' do
@@ -19,6 +20,9 @@ describe Bumbleworks::Process do
19
20
  wait_for_event :speedos
20
21
  end
21
22
  end
23
+ Bumbleworks.define_process 'i_wait_for_nobody' do
24
+ tough_guy :task => 'blow_this_thing_wide_open'
25
+ end
22
26
  end
23
27
 
24
28
  describe '.new' do
@@ -47,13 +51,13 @@ describe Bumbleworks::Process do
47
51
  it 'lists all trackers this process is waiting on' do
48
52
  bp1 = Bumbleworks.launch!('going_to_the_dance')
49
53
  bp2 = Bumbleworks.launch!('straightening_the_rocks')
50
- wait_until { bp1.trackers.count == 2 && bp2.trackers.count == 2 }
51
- bp1.trackers.map { |t| t['msg']['fei']['wfid'] }.should == [bp1.wfid, bp1.wfid]
52
- bp2.trackers.map { |t| t['msg']['fei']['wfid'] }.should == [bp2.wfid, bp2.wfid]
53
- bp1.trackers.map { |t| t['action'] }.should == ['left_tag', 'left_tag']
54
- bp2.trackers.map { |t| t['action'] }.should == ['left_tag', 'left_tag']
55
- bp1.trackers.map { |t| t['conditions']['tag'] }.should == [['an_invitation'], ['a_friend']]
56
- bp2.trackers.map { |t| t['conditions']['tag'] }.should == [['rock_caliper_delivery'], ['speedos']]
54
+ wait_until { bp1.trackers.count == 3 && bp2.trackers.count == 2 }
55
+ bp1.trackers.map { |t| t.process }.should == [bp1, bp1, bp1]
56
+ bp2.trackers.map { |t| t.process }.should == [bp2, bp2]
57
+ bp1.trackers.map { |t| t.action }.should == ['left_tag', 'left_tag', 'dispatch']
58
+ bp2.trackers.map { |t| t.action }.should == ['left_tag', 'left_tag']
59
+ bp1.trackers.map { |t| t.conditions['tag'] }.should == [['an_invitation'], ['a_friend'], nil]
60
+ bp2.trackers.map { |t| t.conditions['tag'] }.should == [['rock_caliper_delivery'], ['speedos']]
57
61
  end
58
62
  end
59
63
 
@@ -61,20 +65,32 @@ describe Bumbleworks::Process do
61
65
  it 'lists all tags this process is waiting on' do
62
66
  bp1 = Bumbleworks.launch!('going_to_the_dance')
63
67
  bp2 = Bumbleworks.launch!('straightening_the_rocks')
64
- wait_until { bp1.trackers.count == 2 && bp2.trackers.count == 2 }
68
+ wait_until { bp1.trackers.count == 3 && bp2.trackers.count == 2 }
65
69
  bp1.all_subscribed_tags.should == { :global => ['an_invitation'], bp1.wfid => ['a_friend'] }
66
70
  bp2.all_subscribed_tags.should == { :global => ['rock_caliper_delivery', 'speedos'] }
67
71
  end
72
+
73
+ it 'sets global tags to empty array by default' do
74
+ bp = Bumbleworks.launch!('i_wait_for_nobody')
75
+ wait_until { bp.tasks.count == 1 }
76
+ bp.all_subscribed_tags.should == { :global => [] }
77
+ end
68
78
  end
69
79
 
70
80
  describe '#subscribed_events' do
71
81
  it 'lists all events (global tags) this process is waiting on' do
72
82
  bp1 = Bumbleworks.launch!('going_to_the_dance')
73
83
  bp2 = Bumbleworks.launch!('straightening_the_rocks')
74
- wait_until { bp1.trackers.count == 2 && bp2.trackers.count == 2 }
84
+ wait_until { bp1.trackers.count == 3 && bp2.trackers.count == 2 }
75
85
  bp1.subscribed_events.should == ['an_invitation']
76
86
  bp2.subscribed_events.should == ['rock_caliper_delivery', 'speedos']
77
87
  end
88
+
89
+ it 'returns empty array if no global tags' do
90
+ bp = Bumbleworks.launch!('i_wait_for_nobody')
91
+ wait_until { bp.tasks.count == 1 }
92
+ bp.subscribed_events.should == []
93
+ end
78
94
  end
79
95
 
80
96
  describe '#is_waiting_for?' do
@@ -156,6 +172,7 @@ describe Bumbleworks::Process do
156
172
 
157
173
  it 'returns nil if no entity' do
158
174
  bp = Bumbleworks.launch!('going_to_the_dance')
175
+ wait_until { bp.trackers.count > 0 }
159
176
  bp.entity.should be_nil
160
177
  end
161
178
  end
@@ -0,0 +1,137 @@
1
+ require File.expand_path(File.join(fixtures_path, 'entities', 'rainbow_loom'))
2
+ require File.expand_path(File.join(fixtures_path, 'trackers'))
3
+
4
+ describe Bumbleworks::Tracker do
5
+ before(:each) do
6
+ Bumbleworks.reset!
7
+ Bumbleworks.storage = {}
8
+ Bumbleworks.dashboard.stub(:get_trackers => fake_trackers)
9
+ end
10
+
11
+ describe '.new' do
12
+ it 'sets tracker id and fetches original_hash from dashboard' do
13
+ tr = described_class.new('global_tracker')
14
+ tr.id.should == 'global_tracker'
15
+ tr.original_hash.should == fake_trackers['global_tracker']
16
+ end
17
+
18
+ it 'sets tracker id and original_hash if directly provided' do
19
+ tr = described_class.new('global_tracker', 'snarfles')
20
+ tr.id.should == 'global_tracker'
21
+ tr.original_hash.should == 'snarfles'
22
+ end
23
+ end
24
+
25
+ describe '#wfid' do
26
+ it 'returns wfid from original hash' do
27
+ described_class.new('local_tracker').wfid.should == 'my_wfid'
28
+ end
29
+
30
+ it 'returns wfid from flow expression for global trackers' do
31
+ described_class.new('global_tracker').wfid.should == 'my_wfid'
32
+ end
33
+
34
+ it 'returns nil if no wfid' do
35
+ described_class.new('on_error').wfid.should be_nil
36
+ end
37
+ end
38
+
39
+ describe '#process' do
40
+ it 'returns process for wfid stored in msg' do
41
+ tr = described_class.new('global_tracker')
42
+ tr.process.should == Bumbleworks::Process.new('my_wfid')
43
+ end
44
+
45
+ it 'returns nil if no wfid' do
46
+ tr = described_class.new('on_error')
47
+ tr.process.should be_nil
48
+ end
49
+ end
50
+
51
+ describe '#global?' do
52
+ it 'returns true if not listening to events on a specific wfid' do
53
+ described_class.new('on_error').global?.should be_true
54
+ described_class.new('global_tracker').global?.should be_true
55
+ end
56
+
57
+ it 'returns false if listening to events on a specific wfid' do
58
+ described_class.new('local_tracker').global?.should be_false
59
+ end
60
+ end
61
+
62
+ describe '#conditions' do
63
+ it 'returns conditions that this tracker is watching' do
64
+ described_class.new('global_tracker').conditions.should == { "tag" => [ "the_event" ] }
65
+ described_class.new('local_tracker').conditions.should == { "tag" => [ "local_event" ] }
66
+ described_class.new('local_error_intercept').conditions.should == { "message" => [ "/bad/" ] }
67
+ described_class.new('participant_tracker').conditions.should == { "participant_name" => [ "goose","bunnies" ] }
68
+ end
69
+
70
+ it 'returns empty hash when no conditions' do
71
+ described_class.new('on_error').conditions.should == {}
72
+ end
73
+ end
74
+
75
+ describe '#tags' do
76
+ it 'returns array of tags' do
77
+ described_class.new('global_tracker').tags.should == [ "the_event" ]
78
+ described_class.new('local_tracker').tags.should == [ "local_event" ]
79
+ end
80
+
81
+ it 'returns empty array if no tags' do
82
+ described_class.new('local_error_intercept').tags.should == []
83
+ described_class.new('participant_tracker').tags.should == []
84
+ end
85
+ end
86
+
87
+ describe '#action' do
88
+ it 'returns action being awaited' do
89
+ described_class.new('global_tracker').action.should == 'left_tag'
90
+ described_class.new('local_error_intercept').action.should == 'error_intercepted'
91
+ described_class.new('participant_tracker').action.should == 'dispatch'
92
+ end
93
+ end
94
+
95
+ describe '#waiting_expression' do
96
+ it 'returns nil when no expression is waiting' do
97
+ described_class.new('on_error').waiting_expression.should be_nil
98
+ end
99
+
100
+ it 'returns expression awaiting reply' do
101
+ process = Bumbleworks::Process.new('my_wfid')
102
+ expression1 = double(:fei => double(:expid => '0_0_0'), :tree => :a_global_expression)
103
+ expression2 = double(:fei => double(:expid => '0_0_1'), :tree => :a_local_expression)
104
+ process.stub(:expressions => [expression1, expression2])
105
+
106
+ tracker1 = described_class.new('global_tracker')
107
+ tracker1.stub(:process => process)
108
+ tracker1.waiting_expression.should == :a_global_expression
109
+
110
+ tracker2 = described_class.new('local_tracker')
111
+ tracker2.stub(:process => process)
112
+ tracker2.waiting_expression.should == :a_local_expression
113
+ end
114
+ end
115
+
116
+ describe '#where_clause' do
117
+ it 'returns where clause from waiting expression' do
118
+ tracker = described_class.new('global_tracker')
119
+ tracker.stub(:waiting_expression => [
120
+ 'wait_for_event', { "where" => "some_stuff_matches" }, []
121
+ ])
122
+ tracker.where_clause.should == 'some_stuff_matches'
123
+ end
124
+
125
+ it 'returns nil when waiting_expression does not include where clause' do
126
+ tracker = described_class.new('global_tracker')
127
+ tracker.stub(:waiting_expression => [
128
+ 'wait_for_event', {}, []
129
+ ])
130
+ tracker.where_clause.should be_nil
131
+ end
132
+
133
+ it 'returns nil when no waiting_expression' do
134
+ described_class.new('on_error').where_clause.should be_nil
135
+ end
136
+ end
137
+ 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.54
4
+ version: 0.0.55
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: 2014-01-11 00:00:00.000000000 Z
15
+ date: 2014-01-14 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: ruote
@@ -190,6 +190,7 @@ files:
190
190
  - lib/bumbleworks/task.rb
191
191
  - lib/bumbleworks/task/base.rb
192
192
  - lib/bumbleworks/task/finder.rb
193
+ - lib/bumbleworks/tracker.rb
193
194
  - lib/bumbleworks/tree_builder.rb
194
195
  - lib/bumbleworks/version.rb
195
196
  - lib/bumbleworks/workitem.rb
@@ -211,6 +212,7 @@ files:
211
212
  - spec/fixtures/definitions/nested_folder/test_nested_process.rb
212
213
  - spec/fixtures/definitions/test_process.rb
213
214
  - spec/fixtures/entities/rainbow_loom.rb
215
+ - spec/fixtures/trackers.rb
214
216
  - spec/integration/entity_spec.rb
215
217
  - spec/integration/example_configurations_spec.rb
216
218
  - spec/integration/history_storage_spec.rb
@@ -235,6 +237,7 @@ files:
235
237
  - spec/lib/bumbleworks/support_spec.rb
236
238
  - spec/lib/bumbleworks/task/finder_spec.rb
237
239
  - spec/lib/bumbleworks/task_spec.rb
240
+ - spec/lib/bumbleworks/tracker_spec.rb
238
241
  - spec/lib/bumbleworks/tree_builder_spec.rb
239
242
  - spec/lib/bumbleworks/workitem_entity_storage_spec.rb
240
243
  - spec/lib/bumbleworks/workitem_spec.rb
@@ -258,7 +261,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
258
261
  version: '0'
259
262
  segments:
260
263
  - 0
261
- hash: 4188325697829611705
264
+ hash: 2137363993883985375
262
265
  required_rubygems_version: !ruby/object:Gem::Requirement
263
266
  none: false
264
267
  requirements:
@@ -267,7 +270,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
267
270
  version: '0'
268
271
  segments:
269
272
  - 0
270
- hash: 4188325697829611705
273
+ hash: 2137363993883985375
271
274
  requirements: []
272
275
  rubyforge_project:
273
276
  rubygems_version: 1.8.23
@@ -291,6 +294,7 @@ test_files:
291
294
  - spec/fixtures/definitions/nested_folder/test_nested_process.rb
292
295
  - spec/fixtures/definitions/test_process.rb
293
296
  - spec/fixtures/entities/rainbow_loom.rb
297
+ - spec/fixtures/trackers.rb
294
298
  - spec/integration/entity_spec.rb
295
299
  - spec/integration/example_configurations_spec.rb
296
300
  - spec/integration/history_storage_spec.rb
@@ -315,6 +319,7 @@ test_files:
315
319
  - spec/lib/bumbleworks/support_spec.rb
316
320
  - spec/lib/bumbleworks/task/finder_spec.rb
317
321
  - spec/lib/bumbleworks/task_spec.rb
322
+ - spec/lib/bumbleworks/tracker_spec.rb
318
323
  - spec/lib/bumbleworks/tree_builder_spec.rb
319
324
  - spec/lib/bumbleworks/workitem_entity_storage_spec.rb
320
325
  - spec/lib/bumbleworks/workitem_spec.rb