bumbleworks 0.0.60 → 0.0.61

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,38 +6,79 @@ module Bumbleworks
6
6
 
7
7
  class << self
8
8
  def all
9
- Bumbleworks.dashboard.process_wfids.map do |wfid|
9
+ ids.map do |wfid|
10
10
  new(wfid)
11
11
  end
12
12
  end
13
+
14
+ def ids
15
+ Bumbleworks.dashboard.process_wfids
16
+ end
17
+
18
+ def count
19
+ ids.count
20
+ end
13
21
  end
14
22
 
15
23
  def initialize(wfid)
16
24
  @id = wfid
17
25
  end
18
26
 
27
+ def reload
28
+ (instance_variables - [:@id]).each do |memo|
29
+ instance_variable_set(memo, nil)
30
+ end
31
+ self
32
+ end
33
+
19
34
  alias_method :wfid, :id
20
35
 
21
36
  def ==(other)
22
37
  wfid == other.wfid
23
38
  end
24
39
 
25
- def entity
26
- return nil unless process_status
27
- workitems = leaves.map(&:applied_workitem).map { |wi| Bumbleworks::Workitem.new(wi) }
40
+ def entity_fields
41
+ return {} if workitems.empty?
28
42
  if workitems.map(&:entity_fields).uniq.length == 1
29
- workitems.first.entity if workitems.first.has_entity?
43
+ workitems.first.entity_fields
30
44
  else
31
45
  raise EntityConflict
32
46
  end
33
47
  end
34
48
 
49
+ def entity
50
+ return nil if entity_fields.empty?
51
+ workitems.first.entity
52
+ end
53
+
54
+ def expressions
55
+ @expressions ||= begin
56
+ context = Bumbleworks.dashboard.context
57
+ raw_expressions = context.storage.get_many('expressions', [wfid])
58
+ raw_expressions.collect { |e|
59
+ ::Ruote::Exp::FlowExpression.from_h(context, e)
60
+ }.sort_by { |e|
61
+ e.fei.expid
62
+ }
63
+ end
64
+ end
65
+
66
+ def leaves
67
+ @leaves ||= expressions.inject([]) { |a, exp|
68
+ a.select { |e| ! exp.ancestor?(e.fei) } + [ exp ]
69
+ }
70
+ end
71
+
72
+ def workitems
73
+ @workitems ||= leaves.map(&:applied_workitem).map { |wi| Bumbleworks::Workitem.new(wi) }
74
+ end
75
+
35
76
  def tasks
36
- Bumbleworks::Task.for_process(wfid)
77
+ @tasks ||= Bumbleworks::Task.for_process(wfid)
37
78
  end
38
79
 
39
80
  def trackers
40
- Bumbleworks.dashboard.get_trackers.select { |tid, attrs|
81
+ @trackers ||= Bumbleworks.dashboard.get_trackers.select { |tid, attrs|
41
82
  attrs['msg']['fei'] && attrs['msg']['fei']['wfid'] == id
42
83
  }.map { |tid, original_hash|
43
84
  Bumbleworks::Tracker.new(tid, original_hash)
@@ -45,7 +86,7 @@ module Bumbleworks
45
86
  end
46
87
 
47
88
  def all_subscribed_tags
48
- trackers.inject({ :global => [] }) do |memo, t|
89
+ @all_subscribed_tags ||= trackers.inject({ :global => [] }) do |memo, t|
49
90
  if t.global?
50
91
  memo[:global].concat t.tags
51
92
  else
@@ -72,7 +113,7 @@ module Bumbleworks
72
113
  end
73
114
 
74
115
  def process_status
75
- Bumbleworks.dashboard.process(id)
116
+ @process_status ||= Bumbleworks.dashboard.process(id)
76
117
  end
77
118
 
78
119
  def method_missing(method, *args)
@@ -1,3 +1,3 @@
1
1
  module Bumbleworks
2
- VERSION = "0.0.60"
2
+ VERSION = "0.0.61"
3
3
  end
@@ -1,9 +1,15 @@
1
1
  module Bumbleworks
2
2
  class Workitem
3
+ attr_reader :raw_workitem
4
+
3
5
  def initialize(raw_workitem)
4
6
  @raw_workitem = raw_workitem
5
7
  end
6
8
 
9
+ def ==(other)
10
+ raw_workitem == other.raw_workitem
11
+ end
12
+
7
13
  def entity(options = {})
8
14
  @entity = nil if options[:reload] == true
9
15
  @entity ||= if has_entity_fields?
@@ -25,13 +25,30 @@ describe Bumbleworks::Process do
25
25
  end
26
26
  end
27
27
 
28
- describe '.all' do
29
- it 'returns instances for all process wfids' do
30
- bp1 = Bumbleworks.launch!('going_to_the_dance')
31
- bp2 = Bumbleworks.launch!('going_to_the_dance')
32
- bp3 = Bumbleworks.launch!('straightening_the_rocks')
28
+ context 'aggregate methods' do
29
+ before(:each) do
30
+ @bp1 = Bumbleworks.launch!('going_to_the_dance')
31
+ @bp2 = Bumbleworks.launch!('going_to_the_dance')
32
+ @bp3 = Bumbleworks.launch!('straightening_the_rocks')
33
33
  wait_until { Bumbleworks.dashboard.process_wfids.count == 3 }
34
- described_class.all.should =~ [bp1, bp2, bp3]
34
+ end
35
+
36
+ describe '.all' do
37
+ it 'returns instances for all process wfids' do
38
+ described_class.all.should =~ [@bp1, @bp2, @bp3]
39
+ end
40
+ end
41
+
42
+ describe '.ids' do
43
+ it 'returns all process wfids' do
44
+ described_class.ids.should =~ [@bp1.wfid, @bp2.wfid, @bp3.wfid]
45
+ end
46
+ end
47
+
48
+ describe '.count' do
49
+ it 'returns number of processes' do
50
+ described_class.count.should == 3
51
+ end
35
52
  end
36
53
  end
37
54
 
@@ -49,6 +66,61 @@ describe Bumbleworks::Process do
49
66
  end
50
67
  end
51
68
 
69
+ describe '#workitems' do
70
+ it 'returns task query filtered for this process' do
71
+ bp = described_class.new('chumpy')
72
+ l1 = double(:applied_workitem => 'aw1')
73
+ l2 = double(:applied_workitem => 'aw2')
74
+ l3 = double(:applied_workitem => 'aw3')
75
+ bp.stub(:leaves => [l1, l2, l3])
76
+ bp.workitems.should == [
77
+ Bumbleworks::Workitem.new('aw1'),
78
+ Bumbleworks::Workitem.new('aw2'),
79
+ Bumbleworks::Workitem.new('aw3')
80
+ ]
81
+ end
82
+ end
83
+
84
+ describe '#entity_fields' do
85
+ it 'returns empty hash if process not ready yet' do
86
+ bp = described_class.new('nothing')
87
+ bp.entity_fields.should == {}
88
+ end
89
+
90
+ it 'returns empty hash if no entity' do
91
+ bp = Bumbleworks.launch!('going_to_the_dance')
92
+ wait_until { bp.reload.trackers.count > 0 }
93
+ bp.entity_fields.should == {}
94
+ end
95
+
96
+ it 'returns entity_fields provided at launch' do
97
+ rainbow_loom = RainbowLoom.new('1234')
98
+ bp = Bumbleworks.launch!('going_to_the_dance', :entity => rainbow_loom)
99
+ wait_until { bp.reload.trackers.count > 0 }
100
+ bp.entity_fields.should == { :type => 'RainbowLoom', :identifier => '1234'}
101
+ end
102
+
103
+ it 'raises exception if multiple workitems have conflicting entity info' do
104
+ Bumbleworks.define_process 'conflict_this' do
105
+ concurrence do
106
+ sequence do
107
+ set 'entity_id' => 'swoo'
108
+ just_wait
109
+ end
110
+ sequence do
111
+ set 'entity_id' => 'fwee'
112
+ just_wait
113
+ end
114
+ end
115
+ end
116
+ bp = Bumbleworks.launch!('conflict_this', :entity => RainbowLoom.new('1234'))
117
+ Bumbleworks.dashboard.wait_for(:just_wait)
118
+ expect {
119
+ bp.entity_fields
120
+ }.to raise_error(Bumbleworks::Process::EntityConflict)
121
+ end
122
+ end
123
+
52
124
  describe '#tasks' do
53
125
  it 'returns task query filtered for this process' do
54
126
  bp = described_class.new('chumpy')
@@ -61,7 +133,7 @@ describe Bumbleworks::Process do
61
133
  it 'lists all trackers this process is waiting on' do
62
134
  bp1 = Bumbleworks.launch!('going_to_the_dance')
63
135
  bp2 = Bumbleworks.launch!('straightening_the_rocks')
64
- wait_until { bp1.trackers.count == 3 && bp2.trackers.count == 2 }
136
+ wait_until { bp1.reload.trackers.count == 3 && bp2.reload.trackers.count == 2 }
65
137
  bp1.trackers.map { |t| t.process }.should == [bp1, bp1, bp1]
66
138
  bp2.trackers.map { |t| t.process }.should == [bp2, bp2]
67
139
  bp1.trackers.map { |t| t.action }.should == ['left_tag', 'left_tag', 'dispatch']
@@ -75,14 +147,14 @@ describe Bumbleworks::Process do
75
147
  it 'lists all tags this process is waiting on' do
76
148
  bp1 = Bumbleworks.launch!('going_to_the_dance')
77
149
  bp2 = Bumbleworks.launch!('straightening_the_rocks')
78
- wait_until { bp1.trackers.count == 3 && bp2.trackers.count == 2 }
150
+ wait_until { bp1.reload.trackers.count == 3 && bp2.reload.trackers.count == 2 }
79
151
  bp1.all_subscribed_tags.should == { :global => ['an_invitation'], bp1.wfid => ['a_friend'] }
80
152
  bp2.all_subscribed_tags.should == { :global => ['rock_caliper_delivery', 'speedos'] }
81
153
  end
82
154
 
83
155
  it 'sets global tags to empty array by default' do
84
156
  bp = Bumbleworks.launch!('i_wait_for_nobody')
85
- wait_until { bp.tasks.count == 1 }
157
+ wait_until { bp.reload.tasks.count == 1 }
86
158
  bp.all_subscribed_tags.should == { :global => [] }
87
159
  end
88
160
  end
@@ -91,14 +163,14 @@ describe Bumbleworks::Process do
91
163
  it 'lists all events (global tags) this process is waiting on' do
92
164
  bp1 = Bumbleworks.launch!('going_to_the_dance')
93
165
  bp2 = Bumbleworks.launch!('straightening_the_rocks')
94
- wait_until { bp1.trackers.count == 3 && bp2.trackers.count == 2 }
166
+ wait_until { bp1.reload.trackers.count == 3 && bp2.reload.trackers.count == 2 }
95
167
  bp1.subscribed_events.should == ['an_invitation']
96
168
  bp2.subscribed_events.should == ['rock_caliper_delivery', 'speedos']
97
169
  end
98
170
 
99
171
  it 'returns empty array if no global tags' do
100
172
  bp = Bumbleworks.launch!('i_wait_for_nobody')
101
- wait_until { bp.tasks.count == 1 }
173
+ wait_until { bp.reload.tasks.count == 1 }
102
174
  bp.subscribed_events.should == []
103
175
  end
104
176
  end
@@ -148,43 +220,26 @@ describe Bumbleworks::Process do
148
220
  end
149
221
 
150
222
  describe '#entity' do
151
- it 'returns nil if process not ready yet' do
223
+ it 'returns nil if entity_fields is empty' do
152
224
  bp = described_class.new('nothing')
225
+ bp.stub(:entity_fields => {})
153
226
  bp.entity.should be_nil
154
227
  end
155
228
 
156
229
  it 'returns entity provided at launch' do
157
230
  rainbow_loom = RainbowLoom.new('1234')
158
231
  bp = Bumbleworks.launch!('going_to_the_dance', :entity => rainbow_loom)
159
- wait_until { bp.trackers.count > 0 }
232
+ wait_until { bp.reload.trackers.count > 0 }
160
233
  bp.entity.should == rainbow_loom
161
234
  end
162
235
 
163
- it 'raises exception if multiple workitems have conflicting entity info' do
164
- Bumbleworks.define_process 'conflict_this' do
165
- concurrence do
166
- sequence do
167
- set 'entity_id' => 'swoo'
168
- just_wait
169
- end
170
- sequence do
171
- set 'entity_id' => 'fwee'
172
- just_wait
173
- end
174
- end
175
- end
176
- bp = Bumbleworks.launch!('conflict_this', :entity => RainbowLoom.new('1234'))
177
- Bumbleworks.dashboard.wait_for(:just_wait)
236
+ it 'bubbles EntityConflict from entity_fields' do
237
+ bp = described_class.new('whatever')
238
+ bp.stub(:entity_fields).and_raise(Bumbleworks::Process::EntityConflict)
178
239
  expect {
179
240
  bp.entity
180
241
  }.to raise_error(Bumbleworks::Process::EntityConflict)
181
242
  end
182
-
183
- it 'returns nil if no entity' do
184
- bp = Bumbleworks.launch!('going_to_the_dance')
185
- wait_until { bp.trackers.count > 0 }
186
- bp.entity.should be_nil
187
- end
188
243
  end
189
244
 
190
245
  describe '#process_status' do
@@ -4,6 +4,14 @@ describe Bumbleworks::Workitem do
4
4
  let(:ruote_workitem) { Ruote::Workitem.new('fields' => {'entity_id' => '123', 'entity_type' => 'RainbowLoom'} ) }
5
5
  let(:workitem) { Bumbleworks::Workitem.new(ruote_workitem)}
6
6
 
7
+ describe '#==' do
8
+ it 'returns true if other object has same raw workitem' do
9
+ bw1 = described_class.new('in_da_sky')
10
+ bw2 = described_class.new('in_da_sky')
11
+ bw1.should == bw2
12
+ end
13
+ end
14
+
7
15
  describe '#has_entity_fields?' do
8
16
  it 'returns true if workitem fields include entity fields' do
9
17
  workitem.should have_entity_fields
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.60
4
+ version: 0.0.61
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-31 00:00:00.000000000 Z
15
+ date: 2014-02-07 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: ruote
@@ -262,7 +262,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
262
262
  version: '0'
263
263
  segments:
264
264
  - 0
265
- hash: -2713110478033153610
265
+ hash: 1220168955592203945
266
266
  required_rubygems_version: !ruby/object:Gem::Requirement
267
267
  none: false
268
268
  requirements:
@@ -271,7 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
271
271
  version: '0'
272
272
  segments:
273
273
  - 0
274
- hash: -2713110478033153610
274
+ hash: 1220168955592203945
275
275
  requirements: []
276
276
  rubyforge_project:
277
277
  rubygems_version: 1.8.23