bumbleworks 0.0.63 → 0.0.64

Sign up to get free protection for your applications and to get access to all the features.
@@ -32,9 +32,9 @@ module Bumbleworks
32
32
  end
33
33
  end
34
34
 
35
- def method_missing(method, *args)
35
+ def method_missing(method, *args, &block)
36
36
  if Finder.new.respond_to?(method)
37
- return Finder.new([], self).send(method, *args)
37
+ return Finder.new([], self).send(method, *args, &block)
38
38
  end
39
39
  super
40
40
  end
@@ -76,11 +76,10 @@ module Bumbleworks
76
76
  end
77
77
 
78
78
  def for_entity(entity)
79
- @queries << proc { |wi|
80
- (wi['fields'][:entity_type] || wi['fields']['entity_type']) == entity.class.name &&
81
- (wi['fields'][:entity_id] || wi['fields']['entity_id']) == entity.identifier
82
- }
83
- self
79
+ with_fields({
80
+ :entity_type => entity.class.name,
81
+ :entity_id => entity.identifier
82
+ })
84
83
  end
85
84
 
86
85
  def for_processes(processes)
@@ -95,57 +94,57 @@ module Bumbleworks
95
94
  for_processes([process])
96
95
  end
97
96
 
98
- def all
99
- return [] if @wfids == []
100
- workitems = Bumbleworks.dashboard.context.storage.get_many('workitems', @wfids).select { |wi|
101
- @queries.all? { |q| q.call(wi) }
102
- }.collect { |wi|
103
- ::Ruote::Workitem.new(wi)
104
- }
105
- from_workitems(workitems)
106
- end
107
-
108
97
  def completable(true_or_false = true)
109
98
  @task_filters << proc { |task| task.completable? == true_or_false }
110
99
  self
111
100
  end
112
101
 
113
- def each(&block)
114
- all.each(&block)
115
- end
116
-
117
- def empty?
118
- all.empty?
119
- end
120
-
121
102
  def next_available(options = {})
122
103
  options[:timeout] ||= Bumbleworks.timeout
123
104
 
124
105
  start_time = Time.now
125
- while first.nil?
106
+ while (first_task = first).nil?
126
107
  if (Time.now - start_time) > options[:timeout]
127
108
  raise @task_class::AvailabilityTimeout, "No tasks found matching criteria in time"
128
109
  end
129
110
  sleep 0.1
130
111
  end
131
- first
112
+ first_task
113
+ end
114
+
115
+ def each
116
+ return to_enum(:each) unless block_given?
117
+ return if @wfids == []
118
+ workitems = Bumbleworks.dashboard.context.storage.get_many('workitems', @wfids).each { |wi|
119
+ if task = filtered_task_from_raw_workitem(wi)
120
+ yield task
121
+ end
122
+ }
123
+ end
124
+
125
+ def all
126
+ to_a
127
+ end
128
+
129
+ def empty?
130
+ !any?
132
131
  end
133
132
 
134
133
  private
135
134
 
136
- def filter_tasks(tasks)
137
- @task_filters.empty? ? tasks :
138
- tasks.select { |task|
139
- @task_filters.all? { |f| f.call(task) }
140
- }
135
+ def filtered_task_from_raw_workitem(workitem)
136
+ if @queries.all? { |q| q.call(workitem) }
137
+ task = from_workitem(::Ruote::Workitem.new(workitem))
138
+ task if check_filters(task)
139
+ end
141
140
  end
142
141
 
143
- def from_workitems(workitems)
144
- tasks = workitems.map { |wi|
145
- @task_class.new(wi)
146
- }.compact
142
+ def check_filters(task)
143
+ @task_filters.all? { |f| f.call(task) }
144
+ end
147
145
 
148
- filter_tasks(tasks)
146
+ def from_workitem(workitem)
147
+ task = @task_class.new(workitem)
149
148
  end
150
149
  end
151
150
  end
@@ -1,3 +1,3 @@
1
1
  module Bumbleworks
2
- VERSION = "0.0.63"
2
+ VERSION = "0.0.64"
3
3
  end
@@ -408,6 +408,43 @@ describe Bumbleworks::Task do
408
408
  end
409
409
  end
410
410
 
411
+ context 'iterators' do
412
+ before :each do
413
+ Bumbleworks.define_process 'life_on_tha_street' do
414
+ concurrence do
415
+ oscar :task => 'grouch_it_up'
416
+ elmo :task => 'sing_a_tune'
417
+ elmo :task => 'steal_booze'
418
+ snuffy :task => 'eat_cabbage'
419
+ end
420
+ end
421
+ Bumbleworks.launch!('life_on_tha_street')
422
+ Bumbleworks.dashboard.wait_for(:snuffy)
423
+ end
424
+
425
+ describe '.each' do
426
+ it 'executes for each found task' do
427
+ list = []
428
+ described_class.each { |t| list << t.nickname }
429
+ list.should =~ ['grouch_it_up', 'sing_a_tune', 'steal_booze', 'eat_cabbage']
430
+ end
431
+ end
432
+
433
+ describe '.map' do
434
+ it 'maps result of yielding block with each task' do
435
+ list = described_class.map { |t| t.nickname }
436
+ list.should =~ ['grouch_it_up', 'sing_a_tune', 'steal_booze', 'eat_cabbage']
437
+ end
438
+ end
439
+
440
+ context 'with queries' do
441
+ it 'checks filters' do
442
+ list = described_class.for_role('elmo').map { |t| t.nickname }
443
+ list.should =~ ['sing_a_tune', 'steal_booze']
444
+ end
445
+ end
446
+ end
447
+
411
448
  describe '.all' do
412
449
  before :each do
413
450
  Bumbleworks.define_process 'dog-lifecycle' do
@@ -506,7 +543,7 @@ describe Bumbleworks::Task do
506
543
  end
507
544
 
508
545
  describe '.with_fields' do
509
- it 'returns all tasks with given fields' do
546
+ before(:each) do
510
547
  Bumbleworks.define_process 'divergination' do
511
548
  concurrence do
512
549
  sequence do
@@ -524,12 +561,24 @@ describe Bumbleworks::Task do
524
561
  end
525
562
  Bumbleworks.launch!('divergination', :grumbles => true)
526
563
  Bumbleworks.dashboard.wait_for(:loofer)
564
+ end
565
+
566
+ it 'returns all tasks with given field' do
527
567
  described_class.with_fields(:grumbles => true).count.should == 3
528
568
  described_class.with_fields(:bumby => 'fancy').count.should == 1
529
569
  described_class.with_fields(:bumby => 'not_fancy').count.should == 2
530
- described_class.with_fields(:grumbles => false, :bumby => 'not_fancy').should be_empty
531
570
  described_class.with_fields(:what => 'ever').should be_empty
532
571
  end
572
+
573
+ it 'looks up multiple fields at once' do
574
+ described_class.with_fields(:grumbles => true, :bumby => 'not_fancy').count.should == 2
575
+ described_class.with_fields(:grumbles => false, :bumby => 'not_fancy').should be_empty
576
+ end
577
+
578
+ it 'can be chained' do
579
+ described_class.with_fields(:grumbles => true).with_fields(:bumby => 'fancy').count.should == 1
580
+ described_class.with_fields(:grumbles => false).with_fields(:bumby => 'not_fancy').should be_empty
581
+ end
533
582
  end
534
583
 
535
584
  describe '.for_entity' do
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.63
4
+ version: 0.0.64
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-10 00:00:00.000000000 Z
15
+ date: 2014-02-11 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: ruote
@@ -263,7 +263,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
263
263
  version: '0'
264
264
  segments:
265
265
  - 0
266
- hash: 4057710288026265450
266
+ hash: 2850289231226753878
267
267
  required_rubygems_version: !ruby/object:Gem::Requirement
268
268
  none: false
269
269
  requirements:
@@ -272,7 +272,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
272
272
  version: '0'
273
273
  segments:
274
274
  - 0
275
- hash: 4057710288026265450
275
+ hash: 2850289231226753878
276
276
  requirements: []
277
277
  rubyforge_project:
278
278
  rubygems_version: 1.8.23