bumbleworks 0.0.21 → 0.0.22

Sign up to get free protection for your applications and to get access to all the features.
data/lib/bumbleworks.rb CHANGED
@@ -9,6 +9,7 @@ require "bumbleworks/ruote"
9
9
  require "bumbleworks/hash_storage"
10
10
  require "bumbleworks/simple_logger"
11
11
  require "bumbleworks/storage_participant"
12
+ require "bumbleworks/local_participant"
12
13
 
13
14
  module Bumbleworks
14
15
  class UnsupportedMode < StandardError; end
@@ -0,0 +1,9 @@
1
+ require "ruote/part/local_participant"
2
+ require "bumbleworks/workitem_entity_storage"
3
+
4
+ module Bumbleworks
5
+ module LocalParticipant
6
+ include ::Ruote::LocalParticipant
7
+ include WorkitemEntityStorage
8
+ end
9
+ end
@@ -1,10 +1,12 @@
1
1
  require "bumbleworks/tasks/base"
2
+ require "bumbleworks/workitem_entity_storage"
2
3
 
3
4
  module Bumbleworks
4
5
  class Task
6
+ include WorkitemEntityStorage
7
+
5
8
  class AlreadyClaimed < StandardError; end
6
9
  class MissingWorkitem < StandardError; end
7
- class EntityNotFound < StandardError; end
8
10
  class NotCompletable < StandardError; end
9
11
 
10
12
  extend Forwardable
@@ -80,25 +82,6 @@ module Bumbleworks
80
82
  self
81
83
  end
82
84
 
83
- def entity
84
- if has_entity_fields?
85
- klass = Bumbleworks::Support.constantize(fields['entity_type'])
86
- entity = klass.first_by_identifier(fields['entity_id'])
87
- end
88
- raise EntityNotFound unless entity
89
- entity
90
- end
91
-
92
- def has_entity?
93
- !entity.nil?
94
- rescue EntityNotFound
95
- false
96
- end
97
-
98
- def has_entity_fields?
99
- fields['entity_id'] && fields['entity_type']
100
- end
101
-
102
85
  # alias for fields[] (fields delegated to workitem)
103
86
  def [](key)
104
87
  fields[key]
@@ -135,7 +118,7 @@ module Bumbleworks
135
118
 
136
119
  # proceed workitem (saving changes to fields)
137
120
  def complete(metadata = {})
138
- raise NotCompletable unless completable?
121
+ raise NotCompletable.new(not_completable_error_message) unless completable?
139
122
  before_update(metadata)
140
123
  before_complete(metadata)
141
124
  proceed_workitem
@@ -188,6 +171,10 @@ module Bumbleworks
188
171
 
189
172
  private
190
173
 
174
+ def workitem
175
+ @workitem
176
+ end
177
+
191
178
  def storage_participant
192
179
  self.class.storage_participant
193
180
  end
@@ -19,6 +19,10 @@ module Bumbleworks
19
19
  def completable?
20
20
  true
21
21
  end
22
+
23
+ def not_completable_error_message
24
+ "This task is not currently completable."
25
+ end
22
26
  end
23
27
  end
24
28
  end
@@ -1,3 +1,3 @@
1
1
  module Bumbleworks
2
- VERSION = "0.0.21"
2
+ VERSION = "0.0.22"
3
3
  end
@@ -0,0 +1,24 @@
1
+ module Bumbleworks
2
+ module WorkitemEntityStorage
3
+ class EntityNotFound < StandardError; end
4
+
5
+ def entity
6
+ if has_entity_fields?
7
+ klass = Bumbleworks::Support.constantize(workitem.fields['entity_type'])
8
+ entity = klass.first_by_identifier(workitem.fields['entity_id'])
9
+ end
10
+ raise EntityNotFound unless entity
11
+ entity
12
+ end
13
+
14
+ def has_entity?
15
+ !entity.nil?
16
+ rescue EntityNotFound
17
+ false
18
+ end
19
+
20
+ def has_entity_fields?
21
+ workitem.fields['entity_id'] && workitem.fields['entity_type']
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ describe Bumbleworks::LocalParticipant do
2
+ it 'includes Ruote::LocalParticipant' do
3
+ described_class.included_modules.should include(Ruote::LocalParticipant)
4
+ end
5
+
6
+ it 'includes WorkitemEntityStorage' do
7
+ described_class.included_modules.should include(Bumbleworks::WorkitemEntityStorage)
8
+ end
9
+ end
@@ -8,6 +8,18 @@ describe Bumbleworks::Task do
8
8
  Bumbleworks.start_worker!
9
9
  end
10
10
 
11
+ it 'includes WorkitemEntityStorage' do
12
+ described_class.included_modules.should include(Bumbleworks::WorkitemEntityStorage)
13
+ end
14
+
15
+ describe '#not_completable_error_message' do
16
+ it 'defaults to generic message' do
17
+ task = described_class.new(workflow_item)
18
+ task.not_completable_error_message.should ==
19
+ "This task is not currently completable."
20
+ end
21
+ end
22
+
11
23
  describe '.autoload_all' do
12
24
  it 'autoloads all task modules in directory' do
13
25
  Bumbleworks.root = File.join(fixtures_path, 'apps', 'with_default_directories')
@@ -460,6 +472,7 @@ describe Bumbleworks::Task do
460
472
  event = Bumbleworks.dashboard.wait_for :dog_mouth
461
473
  task = described_class.for_role('dog_mouth').first
462
474
  task.stub(:completable?).and_return(false)
475
+ task.stub(:not_completable_error_message).and_return('hogwash!')
463
476
  task.should_receive(:before_update).never
464
477
  task.should_receive(:before_complete).never
465
478
  task.should_receive(:proceed_workitem).never
@@ -467,7 +480,7 @@ describe Bumbleworks::Task do
467
480
  task.should_receive(:after_update).never
468
481
  expect {
469
482
  task.complete
470
- }.to raise_error(Bumbleworks::Task::NotCompletable)
483
+ }.to raise_error(Bumbleworks::Task::NotCompletable, "hogwash!")
471
484
  described_class.for_role('dog_mouth').should_not be_empty
472
485
  end
473
486
 
@@ -501,70 +514,5 @@ describe Bumbleworks::Task do
501
514
  }
502
515
  end
503
516
  end
504
-
505
- describe '#has_entity_fields?' do
506
- it 'returns true if workitem fields include entity fields' do
507
- task = described_class.new(workflow_item)
508
- task['entity_id'] = '1'
509
- task['entity_type'] = 'SomeEntity'
510
- task.should have_entity_fields
511
- end
512
-
513
- it 'returns false if workitem fields do not include entity fields' do
514
- task = described_class.new(workflow_item)
515
- task.should_not have_entity_fields
516
- end
517
- end
518
-
519
- describe '#has_entity?' do
520
- it 'returns true if entity is not nil' do
521
- task = described_class.new(workflow_item)
522
- task.stub(:entity).and_return(:a_real_boy_not_a_puppet)
523
- task.has_entity?.should be_true
524
- end
525
-
526
- it 'returns false if EntityNotFound' do
527
- task = described_class.new(workflow_item)
528
- task.stub(:entity).and_raise(Bumbleworks::Task::EntityNotFound)
529
- task.has_entity?.should be_false
530
- end
531
- end
532
-
533
- describe '#entity' do
534
- class LovelyEntity
535
- def self.first_by_identifier(identifier)
536
- return nil unless identifier
537
- "Object #{identifier}"
538
- end
539
- end
540
-
541
- let(:entitied_workflow_item) {
542
- Ruote::Workitem.new('fields' => {
543
- 'entity_id' => '15',
544
- 'entity_type' => 'LovelyEntity',
545
- 'params' => {'task' => 'go_to_work'}
546
- })
547
- }
548
-
549
- it 'attempts to instantiate business entity from _id and _type fields' do
550
- task = described_class.new(entitied_workflow_item)
551
- task.entity.should == 'Object 15'
552
- end
553
-
554
- it 'throw exception if entity fields not present' do
555
- task = described_class.new(workflow_item)
556
- expect {
557
- task.entity
558
- }.to raise_error Bumbleworks::Task::EntityNotFound
559
- end
560
-
561
- it 'throw exception if entity returns nil' do
562
- task = described_class.new(entitied_workflow_item)
563
- task['entity_id'] = nil
564
- expect {
565
- task.entity
566
- }.to raise_error Bumbleworks::Task::EntityNotFound
567
- end
568
- end
569
517
  end
570
518
  end
@@ -0,0 +1,76 @@
1
+ require "bumbleworks/workitem_entity_storage"
2
+
3
+ describe Bumbleworks::WorkitemEntityStorage do
4
+ class FakeEntityHolder
5
+ include Bumbleworks::WorkitemEntityStorage
6
+ def initialize(fields = {})
7
+ @fields = fields
8
+ end
9
+
10
+ def workitem
11
+ OpenStruct.new(:fields => @fields)
12
+ end
13
+ end
14
+
15
+ describe '#has_entity_fields?' do
16
+ it 'returns true if workitem fields include entity fields' do
17
+ feh = FakeEntityHolder.new('entity_id' => '1', 'entity_type' => 'SomeEntity')
18
+ feh.should have_entity_fields
19
+ end
20
+
21
+ it 'returns false if workitem fields do not include entity fields' do
22
+ feh = FakeEntityHolder.new
23
+ feh.should_not have_entity_fields
24
+ end
25
+ end
26
+
27
+ describe '#has_entity?' do
28
+ it 'returns true if entity is not nil' do
29
+ feh = FakeEntityHolder.new
30
+ feh.stub(:entity).and_return(:a_real_boy_not_a_puppet)
31
+ feh.has_entity?.should be_true
32
+ end
33
+
34
+ it 'returns false if EntityNotFound' do
35
+ feh = FakeEntityHolder.new
36
+ feh.stub(:entity).and_raise(Bumbleworks::WorkitemEntityStorage::EntityNotFound)
37
+ feh.has_entity?.should be_false
38
+ end
39
+ end
40
+
41
+ describe '#entity' do
42
+ class LovelyEntity
43
+ def self.first_by_identifier(identifier)
44
+ return nil unless identifier
45
+ "Object #{identifier}"
46
+ end
47
+ end
48
+
49
+ let(:entitied_workflow_item) {
50
+ Ruote::Workitem.new('fields' => {
51
+ 'entity_id' => '15',
52
+ 'entity_type' => 'LovelyEntity',
53
+ 'params' => {'task' => 'go_to_work'}
54
+ })
55
+ }
56
+
57
+ it 'attempts to instantiate business entity from _id and _type fields' do
58
+ feh = FakeEntityHolder.new('entity_id' => '15', 'entity_type' => 'LovelyEntity')
59
+ feh.entity.should == 'Object 15'
60
+ end
61
+
62
+ it 'throw exception if entity fields not present' do
63
+ feh = FakeEntityHolder.new
64
+ expect {
65
+ feh.entity
66
+ }.to raise_error Bumbleworks::WorkitemEntityStorage::EntityNotFound
67
+ end
68
+
69
+ it 'throw exception if entity returns nil' do
70
+ feh = FakeEntityHolder.new('entity_id' => nil, 'entity_type' => 'LovelyEntity')
71
+ expect {
72
+ feh.entity
73
+ }.to raise_error Bumbleworks::WorkitemEntityStorage::EntityNotFound
74
+ end
75
+ end
76
+ 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.21
4
+ version: 0.0.22
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -168,6 +168,7 @@ files:
168
168
  - lib/bumbleworks.rb
169
169
  - lib/bumbleworks/configuration.rb
170
170
  - lib/bumbleworks/hash_storage.rb
171
+ - lib/bumbleworks/local_participant.rb
171
172
  - lib/bumbleworks/participant_registration.rb
172
173
  - lib/bumbleworks/process_definition.rb
173
174
  - lib/bumbleworks/rake_tasks.rb
@@ -180,6 +181,7 @@ files:
180
181
  - lib/bumbleworks/tasks/base.rb
181
182
  - lib/bumbleworks/tree_builder.rb
182
183
  - lib/bumbleworks/version.rb
184
+ - lib/bumbleworks/workitem_entity_storage.rb
183
185
  - lib/tasks/bumbleworks.rake
184
186
  - spec/fixtures/apps/with_default_directories/config_initializer.rb
185
187
  - spec/fixtures/apps/with_default_directories/full_initializer.rb
@@ -199,6 +201,7 @@ files:
199
201
  - spec/integration/configuration_spec.rb
200
202
  - spec/integration/sample_application_spec.rb
201
203
  - spec/lib/bumbleworks/configuration_spec.rb
204
+ - spec/lib/bumbleworks/local_participant_spec.rb
202
205
  - spec/lib/bumbleworks/participant_registration_spec.rb
203
206
  - spec/lib/bumbleworks/process_definition_spec.rb
204
207
  - spec/lib/bumbleworks/ruote_spec.rb
@@ -207,6 +210,7 @@ files:
207
210
  - spec/lib/bumbleworks/support_spec.rb
208
211
  - spec/lib/bumbleworks/task_spec.rb
209
212
  - spec/lib/bumbleworks/tree_builder_spec.rb
213
+ - spec/lib/bumbleworks/workitem_entity_storage_spec.rb
210
214
  - spec/lib/bumbleworks_spec.rb
211
215
  - spec/spec_helper.rb
212
216
  - spec/support/path_helpers.rb
@@ -254,6 +258,7 @@ test_files:
254
258
  - spec/integration/configuration_spec.rb
255
259
  - spec/integration/sample_application_spec.rb
256
260
  - spec/lib/bumbleworks/configuration_spec.rb
261
+ - spec/lib/bumbleworks/local_participant_spec.rb
257
262
  - spec/lib/bumbleworks/participant_registration_spec.rb
258
263
  - spec/lib/bumbleworks/process_definition_spec.rb
259
264
  - spec/lib/bumbleworks/ruote_spec.rb
@@ -262,6 +267,7 @@ test_files:
262
267
  - spec/lib/bumbleworks/support_spec.rb
263
268
  - spec/lib/bumbleworks/task_spec.rb
264
269
  - spec/lib/bumbleworks/tree_builder_spec.rb
270
+ - spec/lib/bumbleworks/workitem_entity_storage_spec.rb
265
271
  - spec/lib/bumbleworks_spec.rb
266
272
  - spec/spec_helper.rb
267
273
  - spec/support/path_helpers.rb