bumbleworks 0.0.61 → 0.0.62

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.
@@ -1,7 +1,11 @@
1
+ require "bumbleworks/workitem_entity_storage"
2
+
1
3
  module Bumbleworks
2
4
  class Process
3
5
  class EntityConflict < StandardError; end
4
6
 
7
+ include WorkitemEntityStorage
8
+
5
9
  attr_reader :id
6
10
 
7
11
  class << self
@@ -37,18 +41,16 @@ module Bumbleworks
37
41
  wfid == other.wfid
38
42
  end
39
43
 
40
- def entity_fields
41
- return {} if workitems.empty?
42
- if workitems.map(&:entity_fields).uniq.length == 1
43
- workitems.first.entity_fields
44
+ def entity_workitem
45
+ @entity_workitem ||= if workitems.map(&:entity_fields).uniq.length <= 1
46
+ workitems.first
44
47
  else
45
48
  raise EntityConflict
46
49
  end
47
50
  end
48
51
 
49
- def entity
50
- return nil if entity_fields.empty?
51
- workitems.first.entity
52
+ def entity_storage_workitem
53
+ super(entity_workitem)
52
54
  end
53
55
 
54
56
  def expressions
@@ -1,3 +1,3 @@
1
1
  module Bumbleworks
2
- VERSION = "0.0.61"
2
+ VERSION = "0.0.62"
3
3
  end
@@ -45,6 +45,11 @@ module Bumbleworks
45
45
  }
46
46
  end
47
47
 
48
+ def entity_name
49
+ fields = entity_fields(:titleize => true)
50
+ "#{fields[:type]} #{fields[:identifier]}"
51
+ end
52
+
48
53
  private
49
54
 
50
55
  def entity_id
@@ -2,10 +2,18 @@ module Bumbleworks
2
2
  module WorkitemEntityStorage
3
3
  extend Forwardable
4
4
 
5
- delegate [:entity, :has_entity?, :has_entity_fields?, :entity_fields] => :entity_storage_workitem
5
+ delegate [:entity, :has_entity?, :has_entity_fields?, :entity_fields, :entity_name] => :entity_storage_workitem
6
6
 
7
- def entity_storage_workitem
8
- @entity_storage_workitem ||= Bumbleworks::Workitem.new(workitem)
7
+ def entity_storage_workitem(the_workitem = workitem)
8
+ @entity_storage_workitem ||= wrapped_workitem(the_workitem)
9
+ end
10
+
11
+ def wrapped_workitem(the_workitem)
12
+ if the_workitem.is_a? Bumbleworks::Workitem
13
+ the_workitem
14
+ else
15
+ Bumbleworks::Workitem.new(the_workitem)
16
+ end
9
17
  end
10
18
  end
11
19
  end
@@ -7,6 +7,11 @@ describe Bumbleworks::ErrorHandler do
7
7
  end
8
8
  end
9
9
 
10
+ it_behaves_like "an entity holder" do
11
+ let(:holder) { described_class.new(workitem) }
12
+ let(:storage_workitem) { Bumbleworks::Workitem.new(workitem) }
13
+ end
14
+
10
15
  describe '#on_error' do
11
16
  it 'raises a SubclassResponsiblity exception' do
12
17
  expect{subject.on_error}.to raise_error Bumbleworks::ErrorHandler::SubclassResponsibility
@@ -1,6 +1,12 @@
1
1
  describe Bumbleworks::ErrorLogger do
2
2
  subject {described_class.new(workitem)}
3
3
  let(:workitem) {double(:wf_name => 'armadillo', :error => 'something is amiss in dillo land', :wfid => 'zabme123', :fields => {})}
4
+
5
+ it_behaves_like "an entity holder" do
6
+ let(:holder) { described_class.new(workitem) }
7
+ let(:storage_workitem) { Bumbleworks::Workitem.new(workitem) }
8
+ end
9
+
4
10
  it 'calls registered logger and logs error information' do
5
11
  Bumbleworks.logger.should_receive(:error).with({
6
12
  :actor => 'armadillo',
@@ -1,9 +1,20 @@
1
1
  describe Bumbleworks::LocalParticipant do
2
+ let(:fake_local_participant) {
3
+ Class.new {
4
+ include Bumbleworks::LocalParticipant
5
+ attr_reader :workitem
6
+ def initialize(workitem)
7
+ @workitem = workitem
8
+ end
9
+ }
10
+ }
11
+
2
12
  it 'includes Ruote::LocalParticipant' do
3
13
  described_class.included_modules.should include(Ruote::LocalParticipant)
4
14
  end
5
15
 
6
- it 'includes WorkitemEntityStorage' do
7
- described_class.included_modules.should include(Bumbleworks::WorkitemEntityStorage)
16
+ it_behaves_like "an entity holder" do
17
+ let(:holder) { fake_local_participant.new(:a_workitem) }
18
+ let(:storage_workitem) { Bumbleworks::Workitem.new(:a_workitem) }
8
19
  end
9
20
  end
@@ -67,7 +67,7 @@ describe Bumbleworks::Process do
67
67
  end
68
68
 
69
69
  describe '#workitems' do
70
- it 'returns task query filtered for this process' do
70
+ it 'returns array of applied workitems from each leaf' do
71
71
  bp = described_class.new('chumpy')
72
72
  l1 = double(:applied_workitem => 'aw1')
73
73
  l2 = double(:applied_workitem => 'aw2')
@@ -81,23 +81,36 @@ describe Bumbleworks::Process do
81
81
  end
82
82
  end
83
83
 
84
- describe '#entity_fields' do
85
- it 'returns empty hash if process not ready yet' do
84
+ it_behaves_like "an entity holder" do
85
+ let(:entity_workitem) { Bumbleworks::Workitem.new(:fake_workitem) }
86
+ let(:holder) {
87
+ holder = described_class.new('nothing')
88
+ holder.stub(:entity_workitem => entity_workitem)
89
+ holder
90
+ }
91
+ let(:storage_workitem) { entity_workitem }
92
+ end
93
+
94
+ describe '#entity_workitem' do
95
+ it 'returns first workitem from workitems array, if no entity fields conflict' do
86
96
  bp = described_class.new('nothing')
87
- bp.entity_fields.should == {}
97
+ w1 = double(:entity_fields => :some_fields)
98
+ w2 = double(:entity_fields => :some_fields)
99
+ bp.stub(:workitems => [w1, w2])
100
+ bp.entity_workitem.should == w1
88
101
  end
89
102
 
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 == {}
103
+ it 'returns nil if no process' do
104
+ bp = described_class.new('nothing')
105
+ bp.entity_workitem.should be_nil
94
106
  end
95
107
 
96
- it 'returns entity_fields provided at launch' do
108
+ it 'returns workitem with entity reference from process launch' do
97
109
  rainbow_loom = RainbowLoom.new('1234')
98
110
  bp = Bumbleworks.launch!('going_to_the_dance', :entity => rainbow_loom)
99
111
  wait_until { bp.reload.trackers.count > 0 }
100
- bp.entity_fields.should == { :type => 'RainbowLoom', :identifier => '1234'}
112
+ ew = bp.entity_workitem
113
+ ew.entity.should == rainbow_loom
101
114
  end
102
115
 
103
116
  it 'raises exception if multiple workitems have conflicting entity info' do
@@ -116,7 +129,17 @@ describe Bumbleworks::Process do
116
129
  bp = Bumbleworks.launch!('conflict_this', :entity => RainbowLoom.new('1234'))
117
130
  Bumbleworks.dashboard.wait_for(:just_wait)
118
131
  expect {
119
- bp.entity_fields
132
+ bp.entity_workitem
133
+ }.to raise_error(Bumbleworks::Process::EntityConflict)
134
+ end
135
+ end
136
+
137
+ describe '#entity' do
138
+ it 'bubbles EntityConflict from entity_workitem' do
139
+ bp = described_class.new('whatever')
140
+ bp.stub(:entity_workitem).and_raise(Bumbleworks::Process::EntityConflict)
141
+ expect {
142
+ bp.entity
120
143
  }.to raise_error(Bumbleworks::Process::EntityConflict)
121
144
  end
122
145
  end
@@ -219,29 +242,6 @@ describe Bumbleworks::Process do
219
242
  end
220
243
  end
221
244
 
222
- describe '#entity' do
223
- it 'returns nil if entity_fields is empty' do
224
- bp = described_class.new('nothing')
225
- bp.stub(:entity_fields => {})
226
- bp.entity.should be_nil
227
- end
228
-
229
- it 'returns entity provided at launch' do
230
- rainbow_loom = RainbowLoom.new('1234')
231
- bp = Bumbleworks.launch!('going_to_the_dance', :entity => rainbow_loom)
232
- wait_until { bp.reload.trackers.count > 0 }
233
- bp.entity.should == rainbow_loom
234
- end
235
-
236
- it 'bubbles EntityConflict from entity_fields' do
237
- bp = described_class.new('whatever')
238
- bp.stub(:entity_fields).and_raise(Bumbleworks::Process::EntityConflict)
239
- expect {
240
- bp.entity
241
- }.to raise_error(Bumbleworks::Process::EntityConflict)
242
- end
243
- end
244
-
245
245
  describe '#process_status' do
246
246
  it 'returns a process_status instance for the wfid' do
247
247
  bp = described_class.new('frogheads')
@@ -8,15 +8,9 @@ describe Bumbleworks::Task do
8
8
  Bumbleworks.start_worker!
9
9
  end
10
10
 
11
- describe 'entity storage' do
12
- it 'includes WorkitemEntityStorage' do
13
- described_class.included_modules.should include(Bumbleworks::WorkitemEntityStorage)
14
- end
15
-
16
- it 'has a workitem method that returns workitem' do
17
- task = described_class.new(workflow_item)
18
- task.workitem.should == workflow_item
19
- end
11
+ it_behaves_like "an entity holder" do
12
+ let(:holder) { described_class.new(workflow_item) }
13
+ let(:storage_workitem) { Bumbleworks::Workitem.new(workflow_item) }
20
14
  end
21
15
 
22
16
  describe '#not_completable_error_message' do
@@ -1,32 +1,34 @@
1
1
  require "bumbleworks/workitem_entity_storage"
2
2
 
3
3
  describe Bumbleworks::WorkitemEntityStorage do
4
- class FakeEntityHolder
5
- include Bumbleworks::WorkitemEntityStorage
6
- attr_reader :workitem
7
- def initialize(workitem)
8
- @workitem = workitem
9
- end
10
- end
4
+ let(:fake_entity_holder) {
5
+ Class.new {
6
+ include Bumbleworks::WorkitemEntityStorage
7
+ attr_reader :workitem
8
+ def initialize(workitem)
9
+ @workitem = workitem
10
+ end
11
+ }
12
+ }
11
13
 
12
14
  describe '#entity_storage_workitem' do
13
15
  it 'returns new Bumbleworks::Workitem instance with workitem' do
14
16
  Bumbleworks::Workitem.stub(:new).with(:a_workitem).and_return(:the_workitem)
15
- feh = FakeEntityHolder.new(:a_workitem)
17
+ feh = fake_entity_holder.new(:a_workitem)
16
18
  feh.entity_storage_workitem.should == :the_workitem
17
19
  end
18
20
 
19
21
  it 'is memoized' do
20
- feh = FakeEntityHolder.new(:a_workitem)
22
+ feh = fake_entity_holder.new(:a_workitem)
21
23
  esw = feh.entity_storage_workitem
22
24
  feh.entity_storage_workitem.should be esw
23
25
  end
24
26
  end
25
27
 
26
- [:has_entity_fields?, :has_entity?, :entity, :entity_fields].each do |method|
28
+ [:has_entity_fields?, :has_entity?, :entity, :entity_fields, :entity_name].each do |method|
27
29
  describe "##{method}" do
28
30
  it 'delegates to entity storage workitem' do
29
- feh = FakeEntityHolder.new(:a_workitem)
31
+ feh = fake_entity_holder.new(:a_workitem)
30
32
  feh.entity_storage_workitem.stub(method).with(1, 2, 3).and_return(:yay_for_bikes)
31
33
  feh.send(method, 1, 2, 3).should == :yay_for_bikes
32
34
  end
@@ -93,4 +93,10 @@ describe Bumbleworks::Workitem do
93
93
  workitem.entity_fields(:titleize => true).should == { :type => 'Rainbow Loom', :identifier => '123' }
94
94
  end
95
95
  end
96
+
97
+ describe "#entity_name" do
98
+ it 'returns entity fields in displayable string' do
99
+ workitem.entity_name.should == 'Rainbow Loom 123'
100
+ end
101
+ end
96
102
  end
@@ -0,0 +1,16 @@
1
+ shared_examples "an entity holder" do
2
+ [:has_entity_fields?, :has_entity?, :entity, :entity_fields, :entity_name].each do |method|
3
+ describe "##{method}" do
4
+ it 'delegates to entity storage workitem' do
5
+ holder.entity_storage_workitem.stub(method).with(1, 2, 3).and_return(:yay_for_bikes)
6
+ holder.send(method, 1, 2, 3).should == :yay_for_bikes
7
+ end
8
+ end
9
+ end
10
+
11
+ describe "#entity_storage_workitem" do
12
+ it 'returns the expected workitem' do
13
+ holder.entity_storage_workitem.should == storage_workitem
14
+ end
15
+ end
16
+ 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.61
4
+ version: 0.0.62
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-02-07 00:00:00.000000000 Z
15
+ date: 2014-02-10 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: ruote
@@ -246,6 +246,7 @@ files:
246
246
  - spec/spec_helper.rb
247
247
  - spec/support/path_helpers.rb
248
248
  - spec/support/process_testing_helpers.rb
249
+ - spec/support/shared_examples.rb
249
250
  - spec/support/tracer.rb
250
251
  homepage: ''
251
252
  licenses:
@@ -262,7 +263,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
262
263
  version: '0'
263
264
  segments:
264
265
  - 0
265
- hash: 1220168955592203945
266
+ hash: -1400629937644699968
266
267
  required_rubygems_version: !ruby/object:Gem::Requirement
267
268
  none: false
268
269
  requirements:
@@ -271,7 +272,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
271
272
  version: '0'
272
273
  segments:
273
274
  - 0
274
- hash: 1220168955592203945
275
+ hash: -1400629937644699968
275
276
  requirements: []
276
277
  rubyforge_project:
277
278
  rubygems_version: 1.8.23
@@ -329,4 +330,5 @@ test_files:
329
330
  - spec/spec_helper.rb
330
331
  - spec/support/path_helpers.rb
331
332
  - spec/support/process_testing_helpers.rb
333
+ - spec/support/shared_examples.rb
332
334
  - spec/support/tracer.rb