bumbleworks 0.0.92 → 0.0.93

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0df99684fff68087775bfb18c85a3f7694ec3b48
4
- data.tar.gz: c68565a77f17645225e9a2bd0db42aeb2662deef
3
+ metadata.gz: 3f902dbdee4b72458152553662a223f201f63f0c
4
+ data.tar.gz: f8f5690483301d7e49cd40f2c3105d95ad54cf8f
5
5
  SHA512:
6
- metadata.gz: 5c343ac5331a98abc82b0f8215ffd7eee6064273a05f89d49eaa40a5130d032b21ef7c8cd72494da24e09c1790e1dac6f77b4a12eca54a9d8d0547d4fd19a169
7
- data.tar.gz: 2d03b80893c9812932f43e67c322ac64f554bb6efd0c093d37659bcd6a71a613915ad5065ca58514b8a3ae848cc5e1fc10849ab1e17f3044525b47593f20afed
6
+ metadata.gz: dc5843ef1b0b19af4e4c56acef982dfb59b198415f2b20c2551181bf872688ee0a5c65fbfd3a444f961baf47daec5756c4fdcdd36271e532da6b353ace5023a1
7
+ data.tar.gz: e7a9d498569fe88c6c1d7c298d425959628530a5c26d38270f52acc68d3a33c1eabe50a0cf88db0759b2a361e3cfc60d0e0cd85b084aafde524577916098f4e7
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Bumbleworks
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/bumbleworks.svg)](http://badge.fury.io/rb/bumbleworks) [![Build Status](https://travis-ci.org/bumbleworks/bumbleworks.svg)](https://travis-ci.org/bumbleworks/bumbleworks) [![Code Climate](https://codeclimate.com/github/bumbleworks/bumbleworks/badges/gpa.svg)](https://codeclimate.com/github/bumbleworks/bumbleworks) [![Dependency Status](https://gemnasium.com/bumbleworks/bumbleworks.svg)](https://gemnasium.com/bumbleworks/bumbleworks) [![Inline docs](http://inch-ci.org/github/bumbleworks/bumbleworks.svg?branch=master)](http://inch-ci.org/github/bumbleworks/bumbleworks)
4
+
3
5
  **NOTE**: This product is still pre-release, and implementation is *not* in sync with documentation yet - hence the pre-release version. We'll follow [the Semantic Versioning Specification (Semver)](http://semver.org/), so you can assume anything at 0.x.x still has an unstable API. But we *are* actively developing this.
4
6
 
5
7
  Bumbleworks is a gem that adds a workflow engine (via [ruote](http://github.com/jmettraux/ruote)) to your Ruby application, and adds tools for task authorization and locking. It also establishes conventions for easily loading process definitions and registering participant classes based on configurable file locations.
@@ -1,5 +1,7 @@
1
1
  module Bumbleworks
2
2
  module Entity
3
+ class ProcessNotRegistered < StandardError; end
4
+
3
5
  def self.included(klass)
4
6
  unless Bumbleworks.entity_classes.include? klass
5
7
  Bumbleworks.entity_classes << klass
@@ -68,7 +70,9 @@ module Bumbleworks
68
70
  end
69
71
 
70
72
  def attribute_for_process_name(name)
71
- self.class.processes[name][:attribute]
73
+ process_config = self.class.processes[name]
74
+ raise ProcessNotRegistered.new(name) unless process_config
75
+ process_config && process_config[:attribute]
72
76
  end
73
77
 
74
78
  def tasks(nickname = nil)
@@ -2,8 +2,16 @@ module Bumbleworks
2
2
  class StorageParticipant < ::Ruote::StorageParticipant
3
3
  def on_workitem
4
4
  return_value = super
5
- Bumbleworks::Task.new(self[workitem.sid]).on_dispatch
5
+ trigger_on_dispatch
6
6
  return return_value
7
7
  end
8
+
9
+ def trigger_on_dispatch
10
+ Bumbleworks::Task.new(current_workitem).on_dispatch
11
+ end
12
+
13
+ def current_workitem
14
+ self[workitem.sid]
15
+ end
8
16
  end
9
17
  end
@@ -124,7 +124,9 @@ module Bumbleworks
124
124
 
125
125
  # proceed workitem (saving changes to fields)
126
126
  def complete(metadata = {}, options = {})
127
- raise NotCompletable.new(not_completable_error_message) unless completable?
127
+ unless completable? || options.fetch(:force, false)
128
+ raise NotCompletable.new(not_completable_error_message)
129
+ end
128
130
  with_hooks(:update, metadata, options) do
129
131
  with_hooks(:complete, metadata, options) do
130
132
  proceed_workitem
@@ -1,3 +1,3 @@
1
1
  module Bumbleworks
2
- VERSION = "0.0.92"
2
+ VERSION = "0.0.93"
3
3
  end
@@ -31,7 +31,7 @@ class Bumbleworks::Worker < Ruote::Worker
31
31
  def active_worker_states
32
32
  info.inject({}) { |hsh, info|
33
33
  id, state = info.id, info.state
34
- unless info.state.nil? || info.in_stopped_state?
34
+ unless info.in_stopped_state?
35
35
  hsh[id] = state
36
36
  end
37
37
  hsh
@@ -60,10 +60,23 @@ class Bumbleworks::Worker < Ruote::Worker
60
60
  end
61
61
  end
62
62
 
63
+ def toggle_worker_state_enabled(switch)
64
+ unless [true, false].include?(switch)
65
+ raise ArgumentError, "Must call with true or false"
66
+ end
67
+ Bumbleworks.dashboard.context['worker_state_enabled'] = switch
68
+ end
69
+
70
+ def worker_state_enabled?
71
+ !!Bumbleworks.dashboard.context['worker_state_enabled']
72
+ end
73
+
63
74
  def with_worker_state_enabled
64
- Bumbleworks.dashboard.context['worker_state_enabled'] = true
75
+ was_already_enabled = worker_state_enabled?
76
+ toggle_worker_state_enabled(true) unless was_already_enabled
65
77
  yield
66
- Bumbleworks.dashboard.context['worker_state_enabled'] = false
78
+ ensure
79
+ toggle_worker_state_enabled(false) unless was_already_enabled
67
80
  end
68
81
 
69
82
  def control_document
@@ -212,7 +212,7 @@ describe Bumbleworks::Entity do
212
212
  entity = entity_class.new
213
213
  expect {
214
214
  entity.attribute_for_process_name(:the_punisher)
215
- }.to raise_error
215
+ }.to raise_error(Bumbleworks::Entity::ProcessNotRegistered, "the_punisher")
216
216
  end
217
217
  end
218
218
 
@@ -0,0 +1,39 @@
1
+ describe Bumbleworks::StorageParticipant do
2
+ let(:workitem) {
3
+ double(:sid => :storage_id, :to_h => {
4
+ 'fei' => { 'wfid' => :the_workflow_id }
5
+ })
6
+ }
7
+ subject { described_class.new(Bumbleworks.dashboard.context) }
8
+
9
+ describe "#on_workitem" do
10
+ it "stores workitem and triggers on dispatch" do
11
+ expect(subject).to receive(:trigger_on_dispatch)
12
+ expect {
13
+ subject._on_workitem(workitem)
14
+ }.to change {
15
+ Bumbleworks.dashboard.context.storage.get_many("workitems").count
16
+ }.by(1)
17
+ end
18
+ end
19
+
20
+ describe "#trigger_on_dispatch" do
21
+ it "calls on_dispatch on a new Bumbleworks Task" do
22
+ allow(subject).to receive(:current_workitem).and_return(workitem)
23
+ new_task = double(Bumbleworks::Task)
24
+ expect(Bumbleworks::Task).to receive(:new).
25
+ with(workitem).
26
+ and_return(new_task)
27
+ expect(new_task).to receive(:on_dispatch)
28
+ subject.trigger_on_dispatch
29
+ end
30
+ end
31
+
32
+ describe "#current_workitem" do
33
+ it "reloads the workitem from the storage" do
34
+ allow(subject).to receive(:workitem).and_return(workitem)
35
+ allow(subject).to receive(:[]).with(:storage_id).and_return(:the_workitem)
36
+ expect(subject.current_workitem).to eq(:the_workitem)
37
+ end
38
+ end
39
+ end
@@ -155,7 +155,7 @@ describe Bumbleworks::ProcessDefinition do
155
155
  })
156
156
  expect {
157
157
  described_class.create_all_from_directory!(definitions_path)
158
- }.to raise_error
158
+ }.to raise_error(described_class::Invalid)
159
159
  expect(Bumbleworks.dashboard.variables['test_process']).to be_nil
160
160
  expect(Bumbleworks.dashboard.variables['keep_me']).to eq('top_secret_cat_pics')
161
161
  end
@@ -422,7 +422,7 @@ describe Bumbleworks::Process do
422
422
  allow(bp).to receive_messages(:process_status => double('process status'))
423
423
  expect {
424
424
  bp.kerplunk!(:oh_no)
425
- }.to raise_error
425
+ }.to raise_error(NoMethodError)
426
426
  end
427
427
  end
428
428
  end
@@ -25,13 +25,13 @@ describe Bumbleworks::StorageAdapter do
25
25
 
26
26
  describe '.storage_class' do
27
27
  it 'is a subclass responsibility' do
28
- expect { described_class.storage_class }.to raise_error
28
+ expect { described_class.storage_class }.to raise_error(StandardError, "Subclass responsibility")
29
29
  end
30
30
  end
31
31
 
32
32
  describe '.driver' do
33
33
  it 'is a subclass responsibility' do
34
- expect { described_class.driver }.to raise_error
34
+ expect { described_class.driver }.to raise_error(StandardError, "Subclass responsibility")
35
35
  end
36
36
  end
37
37
 
@@ -1,8 +1,10 @@
1
1
  describe Bumbleworks::Task do
2
+ subject { described_class.new(workflow_item) }
3
+
2
4
  let(:workflow_item) {
3
5
  Ruote::Workitem.new({
4
6
  'fields' => {
5
- 'params' => {'task' => 'go_to_work'},
7
+ 'params' => {'task' => 'go_to_work', 'claimant' => 'employee'},
6
8
  'dispatched_at' => 'some time ago'
7
9
  }
8
10
  })
@@ -19,7 +21,6 @@ describe Bumbleworks::Task do
19
21
  end
20
22
 
21
23
  it_behaves_like "comparable" do
22
- subject { described_class.new(workflow_item) }
23
24
  let(:other) { described_class.new(workflow_item) }
24
25
  before(:each) do
25
26
  allow(workflow_item).to receive(:sid).and_return('blah-123-blah')
@@ -61,14 +62,13 @@ describe Bumbleworks::Task do
61
62
 
62
63
  describe '#dispatched_at' do
63
64
  it 'returns dispatched_at timestamp from workitem' do
64
- task = described_class.new(workflow_item)
65
- expect(task.dispatched_at).to eq 'some time ago'
65
+ expect(subject.dispatched_at).to eq 'some time ago'
66
66
  end
67
67
  end
68
68
 
69
69
  describe '#completable?' do
70
70
  it 'defaults to true on base task' do
71
- expect(described_class.new(workflow_item)).to be_completable
71
+ expect(subject).to be_completable
72
72
  end
73
73
  end
74
74
 
@@ -99,12 +99,11 @@ describe Bumbleworks::Task do
99
99
 
100
100
  describe '#reload' do
101
101
  it 'reloads the workitem from the storage participant' do
102
- task = described_class.new(workflow_item)
103
- allow(task).to receive(:sid).and_return(:the_sid)
102
+ allow(subject).to receive(:sid).and_return(:the_sid)
104
103
  expect(Bumbleworks.dashboard.storage_participant).to receive(
105
104
  :[]).with(:the_sid).and_return(:amazing_workitem)
106
- task.reload
107
- expect(task.instance_variable_get(:@workitem)).to eq(:amazing_workitem)
105
+ subject.reload
106
+ expect(subject.instance_variable_get(:@workitem)).to eq(:amazing_workitem)
108
107
  end
109
108
  end
110
109
 
@@ -113,89 +112,84 @@ describe Bumbleworks::Task do
113
112
  it "calls #{phase} hooks on task and all observers" do
114
113
  observer1, observer2 = double('observer1'), double('observer2')
115
114
  Bumbleworks.observers = [observer1, observer2]
116
- task = described_class.new(workflow_item)
117
- expect(task).to receive(:"#{phase}_snoogle").with(:chachunga, :faloop)
115
+ expect(subject).to receive(:"#{phase}_snoogle").with(:chachunga, :faloop)
118
116
  expect(observer1).to receive(:"#{phase}_snoogle").with(:chachunga, :faloop)
119
117
  expect(observer2).to receive(:"#{phase}_snoogle").with(:chachunga, :faloop)
120
- task.send(:"call_#{phase}_hooks", :snoogle, :chachunga, :faloop)
118
+ subject.send(:"call_#{phase}_hooks", :snoogle, :chachunga, :faloop)
121
119
  end
122
120
  end
123
121
  end
124
122
 
125
- describe '#on_dispatch' do
126
- before :each do
127
- Bumbleworks.define_process 'planting_a_noodle' do
128
- concurrence do
129
- horse_feeder :task => 'give_the_horse_a_bon_bon'
130
- end
131
- end
132
- end
133
-
134
- it 'is called when task is dispatched' do
135
- expect_any_instance_of(described_class).to receive(:on_dispatch)
136
- Bumbleworks.launch!('planting_a_noodle')
137
- Bumbleworks.dashboard.wait_for(:horse_feeder)
123
+ describe "#log" do
124
+ it "creates a log entry with information from the task" do
125
+ allow(subject).to receive(:id).and_return(:the_id)
126
+ expect(Bumbleworks.logger).to receive(:info).with({
127
+ :actor => "employee",
128
+ :action => :did_a_thing,
129
+ :target_type => "Task",
130
+ :target_id => :the_id,
131
+ :metadata => {
132
+ :extra_stuff => "nothing special",
133
+ :current_fields => {
134
+ "params" => { "task" => "go_to_work", "claimant" => "employee" },
135
+ "dispatched_at" => "some time ago"
136
+ }
137
+ }
138
+ })
139
+ subject.log(:did_a_thing, :extra_stuff => "nothing special")
138
140
  end
141
+ end
139
142
 
143
+ describe '#on_dispatch' do
140
144
  it 'logs dispatch' do
141
- Bumbleworks.launch!('planting_a_noodle')
142
- Bumbleworks.dashboard.wait_for(:horse_feeder)
143
- task = described_class.for_role('horse_feeder').first
144
- log_entry = Bumbleworks.logger.entries.last[:entry]
145
- expect(log_entry[:action]).to eq(:dispatch)
146
- expect(log_entry[:target_type]).to eq('Task')
147
- expect(log_entry[:target_id]).to eq(task.id)
145
+ expect(subject).to receive(:log).with(:dispatch)
146
+ subject.on_dispatch
148
147
  end
149
148
 
150
149
  it 'calls after hooks' do
151
- task = described_class.new(workflow_item)
152
- allow(task).to receive(:log)
153
- expect(task).to receive(:call_after_hooks).with(:dispatch)
154
- task.on_dispatch
150
+ allow(subject).to receive(:log)
151
+ expect(subject).to receive(:call_after_hooks).with(:dispatch)
152
+ subject.on_dispatch
155
153
  end
156
154
  end
157
155
 
158
156
  describe '#extend_module' do
159
157
  it 'extends with base module and task module' do
160
- task = described_class.new(workflow_item)
161
- expect(task).to receive(:task_module).and_return(:task_module_double)
162
- expect(task).to receive(:extend).with(Bumbleworks::Task::Base).ordered
163
- expect(task).to receive(:extend).with(:task_module_double).ordered
164
- task.extend_module
158
+ expect(subject).to receive(:task_module).and_return(:task_module_double)
159
+ expect(subject).to receive(:extend).with(Bumbleworks::Task::Base).ordered
160
+ expect(subject).to receive(:extend).with(:task_module_double).ordered
161
+ subject.extend_module
165
162
  end
166
163
 
167
164
  it 'extends only with base module if no nickname' do
168
- task = described_class.new(workflow_item)
169
- allow(task).to receive(:nickname).and_return(nil)
170
- expect(task).to receive(:extend).with(Bumbleworks::Task::Base)
171
- task.extend_module
165
+ allow(subject).to receive(:nickname).and_return(nil)
166
+ expect(subject).to receive(:extend).with(Bumbleworks::Task::Base)
167
+ subject.extend_module
172
168
  end
173
169
 
174
170
  it 'extends only with base module if task module does not exist' do
175
- task = described_class.new(workflow_item)
176
- expect(task).to receive(:extend).with(Bumbleworks::Task::Base)
177
- task.extend_module
171
+ expect(subject).to receive(:extend).with(Bumbleworks::Task::Base)
172
+ subject.extend_module
178
173
  end
179
174
  end
180
175
 
181
176
  describe '#task_module' do
182
177
  it 'returns nil if no nickname' do
183
- task = described_class.new(workflow_item)
184
- allow(task).to receive(:nickname).and_return(nil)
185
- expect(task.task_module).to be_nil
178
+ allow(subject).to receive(:nickname).and_return(nil)
179
+ expect(subject.task_module).to be_nil
186
180
  end
187
181
 
188
182
  it 'returns constantized task nickname with "Task" appended' do
189
- task = described_class.new(workflow_item)
183
+ subject
190
184
  allow(Bumbleworks::Support).to receive(:constantize).with("GoToWorkTask").and_return(:the_task_module)
191
- expect(task.task_module).to eq(:the_task_module)
185
+ expect(subject.task_module).to eq(:the_task_module)
192
186
  end
193
187
  end
194
188
 
195
189
  describe '#id' do
196
190
  it 'returns the sid from the workitem' do
197
191
  allow(workflow_item).to receive(:sid).and_return(:an_exciting_id)
198
- expect(described_class.new(workflow_item).id).to eq(:an_exciting_id)
192
+ expect(subject.id).to eq(:an_exciting_id)
199
193
  end
200
194
  end
201
195
 
@@ -620,7 +614,6 @@ describe Bumbleworks::Task do
620
614
  end
621
615
 
622
616
  describe '#[], #[]=' do
623
- subject{described_class.new(workflow_item)}
624
617
  it 'sets values on workitem fields' do
625
618
  subject['hive'] = 'bees at work'
626
619
  expect(workflow_item.fields['hive']).to eq('bees at work')
@@ -634,14 +627,13 @@ describe Bumbleworks::Task do
634
627
 
635
628
  describe '#nickname' do
636
629
  it 'returns the "task" param' do
637
- expect(described_class.new(workflow_item).nickname).to eq('go_to_work')
630
+ expect(subject.nickname).to eq('go_to_work')
638
631
  end
639
632
 
640
633
  it 'is immutable; cannot be changed by modifying the param' do
641
- task = described_class.new(workflow_item)
642
- expect(task.nickname).to eq('go_to_work')
643
- task.params['task'] = 'what_is_wrong_with_you?'
644
- expect(task.nickname).to eq('go_to_work')
634
+ expect(subject.nickname).to eq('go_to_work')
635
+ subject.params['task'] = 'what_is_wrong_with_you?'
636
+ expect(subject.nickname).to eq('go_to_work')
645
637
  end
646
638
  end
647
639
 
@@ -779,27 +771,25 @@ describe Bumbleworks::Task do
779
771
  end
780
772
 
781
773
  it 'calls before_claim and after_claim callbacks' do
782
- task = described_class.new(workflow_item)
783
- allow(task).to receive(:log)
784
- expect(task).to receive(:before_claim).with(:doctor_claim).ordered
785
- expect(task).to receive(:set_claimant).ordered
786
- expect(task).to receive(:after_claim).with(:doctor_claim).ordered
787
- task.claim(:doctor_claim)
774
+ allow(subject).to receive(:log)
775
+ expect(subject).to receive(:before_claim).with(:doctor_claim).ordered
776
+ expect(subject).to receive(:set_claimant).ordered
777
+ expect(subject).to receive(:after_claim).with(:doctor_claim).ordered
778
+ subject.claim(:doctor_claim)
788
779
  end
789
780
 
790
781
  it 'skips callbacks if requested' do
791
- task = described_class.new(workflow_item)
792
- allow(task).to receive(:log)
793
- expect(task).to receive(:before_claim).never
794
- expect(task).to receive(:set_claimant)
795
- expect(task).to receive(:after_claim).never
796
- task.claim(:doctor_claim, :skip_callbacks => true)
782
+ allow(subject).to receive(:log)
783
+ expect(subject).to receive(:before_claim).never
784
+ expect(subject).to receive(:set_claimant)
785
+ expect(subject).to receive(:after_claim).never
786
+ subject.claim(:doctor_claim, :skip_callbacks => true)
797
787
  end
798
788
 
799
789
  it 'logs event' do
800
- log_entry = Bumbleworks.logger.entries.last[:entry]
801
- expect(log_entry[:action]).to eq(:claim)
802
- expect(log_entry[:actor]).to eq('boss')
790
+ @task.release
791
+ expect(@task).to receive(:log).with(:claim)
792
+ @task.claim(:whatever)
803
793
  end
804
794
  end
805
795
 
@@ -853,10 +843,8 @@ describe Bumbleworks::Task do
853
843
  end
854
844
 
855
845
  it 'logs event' do
846
+ expect(@task).to receive(:log).with(:release)
856
847
  @task.release
857
- log_entry = Bumbleworks.logger.entries.last[:entry]
858
- expect(log_entry[:action]).to eq(:release)
859
- expect(log_entry[:actor]).to eq('boss')
860
848
  end
861
849
  end
862
850
  end
@@ -883,21 +871,19 @@ describe Bumbleworks::Task do
883
871
  end
884
872
 
885
873
  it 'calls with hooks' do
886
- task = described_class.new(workflow_item)
887
- allow(task).to receive(:log)
888
- expect(task).to receive(:call_before_hooks).with(:update, :argue_mints).ordered
889
- expect(task).to receive(:update_workitem).ordered
890
- expect(task).to receive(:call_after_hooks).with(:update, :argue_mints).ordered
891
- task.update(:argue_mints)
874
+ allow(subject).to receive(:log)
875
+ expect(subject).to receive(:call_before_hooks).with(:update, :argue_mints).ordered
876
+ expect(subject).to receive(:update_workitem).ordered
877
+ expect(subject).to receive(:call_after_hooks).with(:update, :argue_mints).ordered
878
+ subject.update(:argue_mints)
892
879
  end
893
880
 
894
881
  it 'skips callbacks if requested' do
895
- task = described_class.new(workflow_item)
896
- allow(task).to receive(:log)
897
- expect(task).to receive(:call_before_hooks).never
898
- expect(task).to receive(:update_workitem)
899
- expect(task).to receive(:call_after_hooks).never
900
- task.update({:actual => :params}, {:skip_callbacks => true})
882
+ allow(subject).to receive(:log)
883
+ expect(subject).to receive(:call_before_hooks).never
884
+ expect(subject).to receive(:update_workitem)
885
+ expect(subject).to receive(:call_after_hooks).never
886
+ subject.update({:actual => :params}, {:skip_callbacks => true})
901
887
  end
902
888
 
903
889
  it 'reloads after updating workitem' do
@@ -913,19 +899,8 @@ describe Bumbleworks::Task do
913
899
  event = Bumbleworks.dashboard.wait_for :dog_mouth
914
900
  task = described_class.for_role('dog_mouth').first
915
901
  task.params['claimant'] = :some_user
902
+ expect(task).to receive(:log).with(:update, :extra_data => :fancy)
916
903
  task.update(:extra_data => :fancy)
917
- expect(Bumbleworks.logger.entries.last).to eq({
918
- :level => :info, :entry => {
919
- :actor => "some_user", # claimant is a string after #reload
920
- :action => :update,
921
- :target_type => 'Task',
922
- :target_id => task.id,
923
- :metadata => {
924
- :extra_data => :fancy,
925
- :current_fields => task.fields
926
- }
927
- }
928
- })
929
904
  end
930
905
  end
931
906
 
@@ -959,43 +934,38 @@ describe Bumbleworks::Task do
959
934
  expect(described_class.for_role('dog_mouth')).not_to be_empty
960
935
  end
961
936
 
937
+ it 'allows completion for non-completable tasks if given force option' do
938
+ event = Bumbleworks.dashboard.wait_for :dog_mouth
939
+ task = described_class.for_role('dog_mouth').first
940
+ allow(task).to receive(:completable?).and_return(false)
941
+ expect(task).to receive(:proceed_workitem)
942
+ task.complete({:actual => :params}, {:force => true})
943
+ end
944
+
962
945
  it 'calls update and complete callbacks' do
963
- task = described_class.new(workflow_item)
964
- allow(task).to receive(:log)
965
- expect(task).to receive(:call_before_hooks).with(:update, :argue_mints).ordered
966
- expect(task).to receive(:call_before_hooks).with(:complete, :argue_mints).ordered
967
- expect(task).to receive(:proceed_workitem).ordered
968
- expect(task).to receive(:call_after_hooks).with(:complete, :argue_mints).ordered
969
- expect(task).to receive(:call_after_hooks).with(:update, :argue_mints).ordered
970
- task.complete(:argue_mints)
946
+ allow(subject).to receive(:log)
947
+ expect(subject).to receive(:call_before_hooks).with(:update, :argue_mints).ordered
948
+ expect(subject).to receive(:call_before_hooks).with(:complete, :argue_mints).ordered
949
+ expect(subject).to receive(:proceed_workitem).ordered
950
+ expect(subject).to receive(:call_after_hooks).with(:complete, :argue_mints).ordered
951
+ expect(subject).to receive(:call_after_hooks).with(:update, :argue_mints).ordered
952
+ subject.complete(:argue_mints)
971
953
  end
972
954
 
973
955
  it 'skips callbacks if requested' do
974
- task = described_class.new(workflow_item)
975
- allow(task).to receive(:log)
976
- expect(task).to receive(:call_before_hooks).never
977
- expect(task).to receive(:proceed_workitem)
978
- expect(task).to receive(:call_after_hooks).never
979
- task.complete({:actual => :params}, {:skip_callbacks => true})
956
+ allow(subject).to receive(:log)
957
+ expect(subject).to receive(:call_before_hooks).never
958
+ expect(subject).to receive(:proceed_workitem)
959
+ expect(subject).to receive(:call_after_hooks).never
960
+ subject.complete({:actual => :params}, {:skip_callbacks => true})
980
961
  end
981
962
 
982
963
  it 'logs event' do
983
964
  event = Bumbleworks.dashboard.wait_for :dog_mouth
984
965
  task = described_class.for_role('dog_mouth').first
985
966
  task.params['claimant'] = :some_user
967
+ expect(task).to receive(:log).with(:complete, :extra_data => :fancy)
986
968
  task.complete(:extra_data => :fancy)
987
- expect(Bumbleworks.logger.entries.last).to eq({
988
- :level => :info, :entry => {
989
- :actor => :some_user,
990
- :action => :complete,
991
- :target_type => 'Task',
992
- :target_id => task.id,
993
- :metadata => {
994
- :extra_data => :fancy,
995
- :current_fields => task.fields
996
- }
997
- }
998
- })
999
969
  end
1000
970
  end
1001
971
  end
@@ -1080,7 +1050,7 @@ describe Bumbleworks::Task do
1080
1050
  it 'falls back to method missing if no finder method' do
1081
1051
  expect {
1082
1052
  described_class.kerplunk!(:oh_no)
1083
- }.to raise_error
1053
+ }.to raise_error(NoMethodError)
1084
1054
  end
1085
1055
  end
1086
1056
 
@@ -1122,64 +1092,55 @@ describe Bumbleworks::Task do
1122
1092
 
1123
1093
  describe '#humanize' do
1124
1094
  it "returns humanized version of task name when no entity" do
1125
- task = described_class.new(workflow_item)
1126
- expect(task.humanize).to eq('Go to work')
1095
+ expect(subject.humanize).to eq('Go to work')
1127
1096
  end
1128
1097
 
1129
1098
  it "returns humanized version of task name with entity" do
1130
- task = described_class.new(workflow_item)
1131
- task[:entity_id] = '45'
1132
- task[:entity_type] = 'RhubarbSandwich'
1133
- expect(task.humanize).to eq('Go to work: Rhubarb sandwich 45')
1099
+ subject[:entity_id] = '45'
1100
+ subject[:entity_type] = 'RhubarbSandwich'
1101
+ expect(subject.humanize).to eq('Go to work: Rhubarb sandwich 45')
1134
1102
  end
1135
1103
 
1136
1104
  it "returns humanized version of task name without entity if requested" do
1137
- task = described_class.new(workflow_item)
1138
- task[:entity_id] = '45'
1139
- task[:entity_type] = 'RhubarbSandwich'
1140
- expect(task.humanize(:entity => false)).to eq('Go to work')
1105
+ subject[:entity_id] = '45'
1106
+ subject[:entity_type] = 'RhubarbSandwich'
1107
+ expect(subject.humanize(:entity => false)).to eq('Go to work')
1141
1108
  end
1142
1109
  end
1143
1110
 
1144
1111
  describe '#to_s' do
1145
1112
  it "is aliased to #titleize" do
1146
- task = described_class.new(workflow_item)
1147
- allow(task).to receive(:titleize).with(:the_args).and_return(:see_i_told_you_so)
1148
- expect(task.to_s(:the_args)).to eq(:see_i_told_you_so)
1113
+ allow(subject).to receive(:titleize).with(:the_args).and_return(:see_i_told_you_so)
1114
+ expect(subject.to_s(:the_args)).to eq(:see_i_told_you_so)
1149
1115
  end
1150
1116
  end
1151
1117
 
1152
1118
  describe '#titleize' do
1153
1119
  it "returns titleized version of task name when no entity" do
1154
- task = described_class.new(workflow_item)
1155
- expect(task.titleize).to eq('Go To Work')
1120
+ expect(subject.titleize).to eq('Go To Work')
1156
1121
  end
1157
1122
 
1158
1123
  it "returns titleized version of task name with entity" do
1159
- task = described_class.new(workflow_item)
1160
- task[:entity_id] = '45'
1161
- task[:entity_type] = 'RhubarbSandwich'
1162
- expect(task.titleize).to eq('Go To Work: Rhubarb Sandwich 45')
1124
+ subject[:entity_id] = '45'
1125
+ subject[:entity_type] = 'RhubarbSandwich'
1126
+ expect(subject.titleize).to eq('Go To Work: Rhubarb Sandwich 45')
1163
1127
  end
1164
1128
 
1165
1129
  it "returns titleized version of task name without entity if requested" do
1166
- task = described_class.new(workflow_item)
1167
- task[:entity_id] = '45'
1168
- task[:entity_type] = 'RhubarbSandwich'
1169
- expect(task.titleize(:entity => false)).to eq('Go To Work')
1130
+ subject[:entity_id] = '45'
1131
+ subject[:entity_type] = 'RhubarbSandwich'
1132
+ expect(subject.titleize(:entity => false)).to eq('Go To Work')
1170
1133
  end
1171
1134
  end
1172
1135
 
1173
1136
  describe '#temporary_storage' do
1174
1137
  it 'returns an empty hash by default' do
1175
- task = described_class.new(workflow_item)
1176
- expect(task.temporary_storage).to eq({})
1138
+ expect(subject.temporary_storage).to eq({})
1177
1139
  end
1178
1140
 
1179
1141
  it 'persists stored values' do
1180
- task = described_class.new(workflow_item)
1181
- task.temporary_storage[:foo] = :bar
1182
- expect(task.temporary_storage[:foo]).to eq(:bar)
1142
+ subject.temporary_storage[:foo] = :bar
1143
+ expect(subject.temporary_storage[:foo]).to eq(:bar)
1183
1144
  end
1184
1145
  end
1185
1146
 
@@ -202,6 +202,11 @@ describe Bumbleworks::Worker::Info do
202
202
  allow(subject).to receive(:updated_at).and_return(frozen_time - 3)
203
203
  expect(subject).not_to be_updated_since(frozen_time - 2)
204
204
  end
205
+
206
+ it "returns true if updated_at same as given time" do
207
+ allow(subject).to receive(:updated_at).and_return(frozen_time - 3)
208
+ expect(subject).to be_updated_since(frozen_time - 3)
209
+ end
205
210
  end
206
211
 
207
212
  describe "#updated_recently?" do
@@ -73,6 +73,25 @@ describe Bumbleworks::Worker do
73
73
  described_class.refresh_worker_info
74
74
  }.not_to raise_error
75
75
  end
76
+
77
+ it 'return worker state enabled setting to off' do
78
+ expect(described_class.worker_state_enabled?).to eq(false)
79
+ described_class.refresh_worker_info
80
+ expect(described_class.worker_state_enabled?).to eq(false)
81
+ end
82
+
83
+ context "when worker state enabled setting is already on" do
84
+ after(:each) do
85
+ described_class.toggle_worker_state_enabled(false)
86
+ end
87
+
88
+ it 'leaves setting on' do
89
+ described_class.toggle_worker_state_enabled(true)
90
+ expect(described_class.worker_state_enabled?).to eq(true)
91
+ described_class.refresh_worker_info
92
+ expect(described_class.worker_state_enabled?).to eq(true)
93
+ end
94
+ end
76
95
  end
77
96
 
78
97
  describe '.change_worker_state' do
@@ -106,6 +125,41 @@ describe Bumbleworks::Worker do
106
125
  described_class.change_worker_state('paused')
107
126
  }.not_to raise_error
108
127
  end
128
+
129
+ it 'return worker state enabled setting to off' do
130
+ expect(described_class.worker_state_enabled?).to eq(false)
131
+ described_class.change_worker_state('paused')
132
+ expect(described_class.worker_state_enabled?).to eq(false)
133
+ end
134
+
135
+ context "when worker state enabled setting is already on" do
136
+ after(:each) do
137
+ described_class.toggle_worker_state_enabled(false)
138
+ end
139
+
140
+ it 'leaves setting on' do
141
+ described_class.toggle_worker_state_enabled(true)
142
+ expect(described_class.worker_state_enabled?).to eq(true)
143
+ described_class.change_worker_state('paused')
144
+ expect(described_class.worker_state_enabled?).to eq(true)
145
+ end
146
+ end
147
+ end
148
+ end
149
+
150
+ describe ".toggle_worker_state_enabled" do
151
+ it "turns on or off worker_state_enabled setting" do
152
+ expect(described_class.worker_state_enabled?).to eq(false)
153
+ described_class.toggle_worker_state_enabled(true)
154
+ expect(described_class.worker_state_enabled?).to eq(true)
155
+ described_class.toggle_worker_state_enabled(false)
156
+ expect(described_class.worker_state_enabled?).to eq(false)
157
+ end
158
+
159
+ it "raises exception if given non-Boolean argument" do
160
+ expect {
161
+ described_class.toggle_worker_state_enabled(:horse)
162
+ }.to raise_error(ArgumentError)
109
163
  end
110
164
  end
111
165
 
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.92
4
+ version: 0.0.93
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maher Hawash
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-05-06 00:00:00.000000000 Z
14
+ date: 2015-09-23 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: ruote
@@ -219,11 +219,12 @@ files:
219
219
  - spec/lib/bumbleworks/error_logger_spec.rb
220
220
  - spec/lib/bumbleworks/expression_spec.rb
221
221
  - spec/lib/bumbleworks/hash_storage_spec.rb
222
- - spec/lib/bumbleworks/participant/base_spec.rb
223
- - spec/lib/bumbleworks/participant/entity_interactor_spec.rb
224
- - spec/lib/bumbleworks/participant/error_dispatcher_spec.rb
225
- - spec/lib/bumbleworks/participant/local_participant_spec.rb
226
222
  - spec/lib/bumbleworks/participant_registration_spec.rb
223
+ - spec/lib/bumbleworks/participants/base_spec.rb
224
+ - spec/lib/bumbleworks/participants/entity_interactor_spec.rb
225
+ - spec/lib/bumbleworks/participants/error_dispatcher_spec.rb
226
+ - spec/lib/bumbleworks/participants/local_participant_spec.rb
227
+ - spec/lib/bumbleworks/participants/storage_participant_spec.rb
227
228
  - spec/lib/bumbleworks/process/error_record_spec.rb
228
229
  - spec/lib/bumbleworks/process_definition_spec.rb
229
230
  - spec/lib/bumbleworks/process_spec.rb
@@ -308,11 +309,12 @@ test_files:
308
309
  - spec/lib/bumbleworks/error_logger_spec.rb
309
310
  - spec/lib/bumbleworks/expression_spec.rb
310
311
  - spec/lib/bumbleworks/hash_storage_spec.rb
311
- - spec/lib/bumbleworks/participant/base_spec.rb
312
- - spec/lib/bumbleworks/participant/entity_interactor_spec.rb
313
- - spec/lib/bumbleworks/participant/error_dispatcher_spec.rb
314
- - spec/lib/bumbleworks/participant/local_participant_spec.rb
315
312
  - spec/lib/bumbleworks/participant_registration_spec.rb
313
+ - spec/lib/bumbleworks/participants/base_spec.rb
314
+ - spec/lib/bumbleworks/participants/entity_interactor_spec.rb
315
+ - spec/lib/bumbleworks/participants/error_dispatcher_spec.rb
316
+ - spec/lib/bumbleworks/participants/local_participant_spec.rb
317
+ - spec/lib/bumbleworks/participants/storage_participant_spec.rb
316
318
  - spec/lib/bumbleworks/process/error_record_spec.rb
317
319
  - spec/lib/bumbleworks/process_definition_spec.rb
318
320
  - spec/lib/bumbleworks/process_spec.rb