bumbleworks 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
data/lib/bumbleworks.rb CHANGED
@@ -7,6 +7,7 @@ require "bumbleworks/task"
7
7
  require "bumbleworks/participant_registration"
8
8
  require "bumbleworks/ruote"
9
9
  require "bumbleworks/hash_storage"
10
+ require "bumbleworks/simple_logger"
10
11
 
11
12
  module Bumbleworks
12
13
  class UnsupportedMode < StandardError; end
@@ -73,6 +73,16 @@ module Bumbleworks
73
73
  #
74
74
  define_setting :storage
75
75
 
76
+ # Bumbleworks will attempt to log a variety of events (tasks becoming
77
+ # available, being claimed/released/completed, etc), and to do so it uses
78
+ # the logger registered in configuration. If no logger has been registered,
79
+ # Bumbleworks will use its SimpleLogger, which just adds the entries to an
80
+ # array. See the SimpleLogger for hints on implementing your own logger;
81
+ # notably, you can also use an instance Ruby's built-in Logger class.
82
+ #
83
+ # default: Bumbleworks::SimpleLogger
84
+ define_setting :logger
85
+
76
86
  def initialize
77
87
  @storage_adapters = []
78
88
  end
@@ -134,6 +144,10 @@ module Bumbleworks
134
144
  @storage_adapters
135
145
  end
136
146
 
147
+ def logger
148
+ @logger ||= Bumbleworks::SimpleLogger
149
+ end
150
+
137
151
  # Clears all memoize variables and configuration settings
138
152
  #
139
153
  def clear!
@@ -0,0 +1,23 @@
1
+ module Bumbleworks
2
+ class SimpleLogger
3
+ class << self
4
+ def entries
5
+ @entries ||= []
6
+ end
7
+
8
+ def add(level, entry)
9
+ entries << { :level => level, :entry => entry }
10
+ end
11
+
12
+ def clear!
13
+ @entries = []
14
+ end
15
+
16
+ [:debug, :info, :warn, :error, :fatal].each do |level|
17
+ define_method level.to_sym do |entry|
18
+ add level, entry
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -113,6 +113,7 @@ module Bumbleworks
113
113
  def update(metadata = {})
114
114
  before_update(metadata)
115
115
  update_workitem
116
+ log(:update, metadata)
116
117
  after_update(metadata)
117
118
  end
118
119
 
@@ -121,6 +122,7 @@ module Bumbleworks
121
122
  before_update(metadata)
122
123
  before_complete(metadata)
123
124
  proceed_workitem
125
+ log(:complete, metadata)
124
126
  after_complete(metadata)
125
127
  after_update(metadata)
126
128
  end
@@ -133,6 +135,7 @@ module Bumbleworks
133
135
  # Claim task and assign token to claimant
134
136
  def claim(token)
135
137
  set_claimant(token)
138
+ log(:claim)
136
139
  end
137
140
 
138
141
  # true if task is claimed
@@ -142,9 +145,20 @@ module Bumbleworks
142
145
 
143
146
  # release claim on task.
144
147
  def release
148
+ log(:release)
145
149
  set_claimant(nil)
146
150
  end
147
151
 
152
+ def log(action, metadata = {})
153
+ Bumbleworks.logger.info({
154
+ :actor => params['claimant'],
155
+ :action => action,
156
+ :object_type => 'Task',
157
+ :object_id => id,
158
+ :metadata => metadata.merge(fields)
159
+ })
160
+ end
161
+
148
162
  private
149
163
 
150
164
  def storage_participant
@@ -165,7 +179,7 @@ module Bumbleworks
165
179
  end
166
180
 
167
181
  params['claimant'] = token
168
- save
182
+ update_workitem
169
183
  end
170
184
  end
171
185
  end
@@ -1,3 +1,3 @@
1
1
  module Bumbleworks
2
- VERSION = "0.0.12"
2
+ VERSION = "0.0.13"
3
3
  end
@@ -129,6 +129,17 @@ describe Bumbleworks::Configuration do
129
129
  end
130
130
  end
131
131
 
132
+ describe '#logger' do
133
+ it 'returns the registered logger' do
134
+ configuration.logger = :a_logger
135
+ configuration.logger.should == :a_logger
136
+ end
137
+
138
+ it 'returns the default simple logger if no logger registered' do
139
+ configuration.logger.should == Bumbleworks::SimpleLogger
140
+ end
141
+ end
142
+
132
143
  describe "#storage" do
133
144
  it 'can set storage directly' do
134
145
  storage = double("Storage")
@@ -0,0 +1,51 @@
1
+ describe Bumbleworks::SimpleLogger do
2
+ before :each do
3
+ Bumbleworks::SimpleLogger.clear!
4
+ end
5
+
6
+ [:info, :debug, :fatal, :warn, :error].each do |level|
7
+ describe ".#{level}" do
8
+ it "adds given object to the log with '#{level}' level" do
9
+ described_class.should_receive(:add).
10
+ with(level, :something => :happened)
11
+ described_class.send(level.to_sym, :something => :happened)
12
+ end
13
+ end
14
+ end
15
+
16
+ describe '.add' do
17
+ it 'adds given object to the log at given level' do
18
+ described_class.add(:info, :super_serious_occurrence)
19
+ described_class.add(:debug, :weird_thing)
20
+ described_class.entries.should == [
21
+ { :level => :info, :entry => :super_serious_occurrence },
22
+ { :level => :debug, :entry => :weird_thing }
23
+ ]
24
+ end
25
+ end
26
+
27
+ describe '.entries' do
28
+ it 'returns entries at all levels when given no filter' do
29
+ described_class.info 'thing'
30
+ described_class.debug 'other thing'
31
+ described_class.info 'third thing'
32
+ described_class.fatal 'final thing'
33
+ described_class.entries.should == [
34
+ { :level => :info, :entry => 'thing' },
35
+ { :level => :debug, :entry => 'other thing' },
36
+ { :level => :info, :entry => 'third thing' },
37
+ { :level => :fatal, :entry => 'final thing' }
38
+ ]
39
+ end
40
+ end
41
+
42
+ describe '.clear!' do
43
+ it 'deletes all entries' do
44
+ described_class.entries.should be_empty
45
+ described_class.info 'thing'
46
+ described_class.entries.should_not be_empty
47
+ described_class.clear!
48
+ described_class.entries.should be_empty
49
+ end
50
+ end
51
+ end
@@ -68,11 +68,6 @@ describe Bumbleworks::Task do
68
68
  end
69
69
 
70
70
  describe '#task_module' do
71
- # def task_module
72
- # return nil unless nickname
73
- # klass_name = Bumbleworks::Support.camelize(nickname)
74
- # klass = Bumbleworks::Support.constantize("Bumbleworks::Tasks::#{klass_name}")
75
- # end
76
71
  it 'returns nil if no nickname' do
77
72
  task = described_class.new(workflow_item)
78
73
  task.stub(:nickname).and_return(nil)
@@ -245,49 +240,65 @@ describe Bumbleworks::Task do
245
240
  end
246
241
 
247
242
  context 'claiming things' do
248
- subject{described_class.new(workflow_item)}
249
243
  before :each do
250
- subject.stub(:save)
251
- workflow_item.params['claimant'] = nil
252
- subject.claim('boss')
244
+ Bumbleworks.define_process 'planting_a_noodle' do
245
+ noodle_gardener :task => 'plant_noodle_seed'
246
+ end
247
+ Bumbleworks.launch!('planting_a_noodle')
248
+ Bumbleworks.dashboard.wait_for(:noodle_gardener)
249
+ @task = described_class.for_role('noodle_gardener').first
250
+ @task.claim('boss')
253
251
  end
254
252
 
255
253
  describe '#claim' do
256
254
  it 'sets token on "claimant" param' do
257
- workflow_item.params['claimant'].should == 'boss'
255
+ @task.params['claimant'].should == 'boss'
258
256
  end
259
257
 
260
258
  it 'raises an error if already claimed by someone else' do
261
- expect{subject.claim('peon')}.to raise_error described_class::AlreadyClaimed
259
+ expect{@task.claim('peon')}.to raise_error described_class::AlreadyClaimed
262
260
  end
263
261
 
264
262
  it 'does not raise an error if attempting to claim by same token' do
265
- expect{subject.claim('boss')}.not_to raise_error described_class::AlreadyClaimed
263
+ expect{@task.claim('boss')}.not_to raise_error described_class::AlreadyClaimed
264
+ end
265
+
266
+ it 'logs event' do
267
+ log_entry = Bumbleworks.logger.entries.last[:entry]
268
+ log_entry[:action].should == :claim
269
+ log_entry[:actor].should == 'boss'
266
270
  end
267
271
  end
268
272
 
269
273
  describe '#claimant' do
270
274
  it 'returns token of who has claim' do
271
- subject.claimant.should == 'boss'
275
+ @task.claimant.should == 'boss'
272
276
  end
273
277
  end
274
278
 
275
279
  describe '#claimed?' do
276
280
  it 'returns true if claimed' do
277
- subject.claimed?.should be_true
281
+ @task.claimed?.should be_true
278
282
  end
279
283
 
280
284
  it 'false otherwise' do
281
- workflow_item.params['claimant'] = nil
282
- subject.claimed?.should be_false
285
+ @task.params['claimant'] = nil
286
+ @task.claimed?.should be_false
283
287
  end
284
288
  end
285
289
 
286
290
  describe '#release' do
287
291
  it "release claim on workitem" do
288
- subject.should be_claimed
289
- subject.release
290
- subject.should_not be_claimed
292
+ @task.should be_claimed
293
+ @task.release
294
+ @task.should_not be_claimed
295
+ end
296
+
297
+ it 'logs event' do
298
+ @task.release
299
+ log_entry = Bumbleworks.logger.entries.last[:entry]
300
+ log_entry[:action].should == :release
301
+ log_entry[:actor].should == 'boss'
291
302
  end
292
303
  end
293
304
  end
@@ -315,11 +326,28 @@ describe Bumbleworks::Task do
315
326
 
316
327
  it 'calls before_update and after_update callbacks' do
317
328
  task = described_class.new(workflow_item)
329
+ task.stub(:log)
318
330
  task.should_receive(:before_update).with(:argue_mints).ordered
319
331
  task.should_receive(:update_workitem).ordered
320
332
  task.should_receive(:after_update).with(:argue_mints).ordered
321
333
  task.update(:argue_mints)
322
334
  end
335
+
336
+ it 'logs event' do
337
+ event = Bumbleworks.dashboard.wait_for :dog_mouth
338
+ task = described_class.for_role('dog_mouth').first
339
+ task.params['claimant'] = :some_user
340
+ task.update(:extra_data => :fancy)
341
+ Bumbleworks.logger.entries.last.should == {
342
+ :level => :info, :entry => {
343
+ :actor => :some_user,
344
+ :action => :update,
345
+ :object_type => 'Task',
346
+ :object_id => task.id,
347
+ :metadata => { :extra_data => :fancy }.merge(task.fields)
348
+ }
349
+ }
350
+ end
323
351
  end
324
352
 
325
353
  describe '#complete' do
@@ -338,6 +366,7 @@ describe Bumbleworks::Task do
338
366
 
339
367
  it 'calls update and complete callbacks' do
340
368
  task = described_class.new(workflow_item)
369
+ task.stub(:log)
341
370
  task.should_receive(:before_update).with(:argue_mints).ordered
342
371
  task.should_receive(:before_complete).with(:argue_mints).ordered
343
372
  task.should_receive(:proceed_workitem).ordered
@@ -345,6 +374,22 @@ describe Bumbleworks::Task do
345
374
  task.should_receive(:after_update).with(:argue_mints).ordered
346
375
  task.complete(:argue_mints)
347
376
  end
377
+
378
+ it 'logs event' do
379
+ event = Bumbleworks.dashboard.wait_for :dog_mouth
380
+ task = described_class.for_role('dog_mouth').first
381
+ task.params['claimant'] = :some_user
382
+ task.complete(:extra_data => :fancy)
383
+ Bumbleworks.logger.entries.last.should == {
384
+ :level => :info, :entry => {
385
+ :actor => :some_user,
386
+ :action => :complete,
387
+ :object_type => 'Task',
388
+ :object_id => task.id,
389
+ :metadata => { :extra_data => :fancy }.merge(task.fields)
390
+ }
391
+ }
392
+ end
348
393
  end
349
394
 
350
395
  describe '#has_entity_fields?' do
@@ -150,4 +150,11 @@ describe Bumbleworks do
150
150
  }.to raise_error(Bumbleworks::InvalidEntity)
151
151
  end
152
152
  end
153
+
154
+ describe '.logger' do
155
+ it 'delegates to configuration.logger' do
156
+ described_class.configuration.stub(:logger).and_return(:a_logger)
157
+ described_class.logger.should == :a_logger
158
+ end
159
+ end
153
160
  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.12
4
+ version: 0.0.13
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: 2013-06-28 00:00:00.000000000 Z
15
+ date: 2013-06-29 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: ruote
@@ -172,6 +172,7 @@ files:
172
172
  - lib/bumbleworks/process_definition.rb
173
173
  - lib/bumbleworks/rake_tasks.rb
174
174
  - lib/bumbleworks/ruote.rb
175
+ - lib/bumbleworks/simple_logger.rb
175
176
  - lib/bumbleworks/storage_adapter.rb
176
177
  - lib/bumbleworks/support.rb
177
178
  - lib/bumbleworks/task.rb
@@ -200,6 +201,7 @@ files:
200
201
  - spec/lib/bumbleworks/participant_registration_spec.rb
201
202
  - spec/lib/bumbleworks/process_definition_spec.rb
202
203
  - spec/lib/bumbleworks/ruote_spec.rb
204
+ - spec/lib/bumbleworks/simple_logger_spec.rb
203
205
  - spec/lib/bumbleworks/storage_adapter_spec.rb
204
206
  - spec/lib/bumbleworks/support_spec.rb
205
207
  - spec/lib/bumbleworks/task_spec.rb
@@ -254,6 +256,7 @@ test_files:
254
256
  - spec/lib/bumbleworks/participant_registration_spec.rb
255
257
  - spec/lib/bumbleworks/process_definition_spec.rb
256
258
  - spec/lib/bumbleworks/ruote_spec.rb
259
+ - spec/lib/bumbleworks/simple_logger_spec.rb
257
260
  - spec/lib/bumbleworks/storage_adapter_spec.rb
258
261
  - spec/lib/bumbleworks/support_spec.rb
259
262
  - spec/lib/bumbleworks/task_spec.rb