adrian 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,10 +5,11 @@ module Adrian
5
5
  attr_reader :running
6
6
 
7
7
  def initialize(options = {})
8
- @failure_handler = FailureHandler.new
9
- @stop_when_done = !!options[:stop_when_done]
10
- @sleep = options[:sleep] || 0.5
11
- @options = options
8
+ @failure_handler = FailureHandler.new
9
+ @stop_when_done = !!options[:stop_when_done]
10
+ @stop_when_signalled = options.fetch(:stop_when_signalled, true)
11
+ @sleep = options[:sleep] || 0.5
12
+ @options = options
12
13
  end
13
14
 
14
15
  def on_failure(*exceptions)
@@ -20,6 +21,7 @@ module Adrian
20
21
  end
21
22
 
22
23
  def start(queue, worker_class)
24
+ trap_stop_signals if @stop_when_signalled
23
25
  @running = true
24
26
 
25
27
  while @running do
@@ -39,6 +41,11 @@ module Adrian
39
41
  @running = false
40
42
  end
41
43
 
44
+ def trap_stop_signals
45
+ Signal.trap('TERM') { stop }
46
+ Signal.trap('INT') { stop }
47
+ end
48
+
42
49
  def delegate_work(item, worker_class)
43
50
  worker = worker_class.new(item)
44
51
  worker.report_to(self)
@@ -1,3 +1,3 @@
1
1
  module Adrian
2
- VERSION = '1.0.1'
2
+ VERSION = '1.1.0'
3
3
  end
@@ -3,37 +3,53 @@ require_relative 'test_helper'
3
3
  describe Adrian::Dispatcher do
4
4
  before do
5
5
  $done_items = []
6
- @q = Adrian::ArrayQueue.new
6
+ @q = Adrian::ArrayQueue.new
7
7
  @dispatcher = Adrian::Dispatcher.new(:stop_when_done => true)
8
+ @worker = TestWorker
9
+ end
10
+
11
+ class TestWorker
12
+
13
+ def initialize(item)
14
+ @item = item
15
+ @done_items = []
16
+ end
17
+
18
+ def perform
19
+ $done_items << [@boss, @item.value]
20
+ end
21
+
22
+ def report_to(boss)
23
+ @boss = boss
24
+ end
25
+
8
26
  end
9
27
 
10
28
  describe "work delegation" do
11
29
  it "should instantiate an instance of the worker for each item and ask it to perform" do
12
- worker = Class.new do
13
- def initialize(item)
14
- @item = item
15
- end
16
-
17
- def perform
18
- $done_items << [@boss, @item.value]
19
- end
20
-
21
- def report_to(boss)
22
- @boss = boss
23
- end
24
- end
25
-
26
30
  @q.push(1)
27
31
  @q.push(2)
28
32
  @q.push(3)
29
33
 
30
- @dispatcher.start(@q, worker)
34
+ @dispatcher.start(@q, @worker)
31
35
 
32
36
  $done_items.must_equal([[@dispatcher, 1], [@dispatcher, 2], [@dispatcher, 3]])
33
37
  end
34
38
  end
35
39
 
36
40
  describe "work evaluation" do
41
+
42
+ it "stops when receiving a termination signal" do
43
+ @dispatcher = Adrian::Dispatcher.new(:stop_when_done => false)
44
+ dispatch_thread = Thread.new { @dispatcher.start(@q, @worker) }
45
+ sleep(0.1)
46
+ assert_equal true, @dispatcher.running
47
+
48
+ Process.kill('TERM', Process.pid)
49
+ assert_equal false, @dispatcher.running
50
+ dispatch_thread.exit
51
+ end
52
+
37
53
  it "should use the failure handler to handle the result" do
38
54
  @dispatcher.on_failure(RuntimeError) do |item, worker, exception|
39
55
  @q.push(item)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adrian
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: